]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.modeling/src/org/simantics/modeling/template2d/DiagramTemplates.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.modeling / src / org / simantics / modeling / template2d / DiagramTemplates.java
diff --git a/bundles/org.simantics.modeling/src/org/simantics/modeling/template2d/DiagramTemplates.java b/bundles/org.simantics.modeling/src/org/simantics/modeling/template2d/DiagramTemplates.java
new file mode 100644 (file)
index 0000000..8c4b0b8
--- /dev/null
@@ -0,0 +1,148 @@
+package org.simantics.modeling.template2d;\r
+\r
+import java.io.File;\r
+import java.io.IOException;\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+\r
+import org.eclipse.core.runtime.IProgressMonitor;\r
+import org.eclipse.core.runtime.SubMonitor;\r
+import org.simantics.databoard.binding.Binding;\r
+import org.simantics.databoard.container.DataContainer;\r
+import org.simantics.databoard.container.DataContainers;\r
+import org.simantics.databoard.container.DataFormatException;\r
+import org.simantics.databoard.container.FormatHandler;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.Session;\r
+import org.simantics.db.WriteGraph;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.layer0.adapter.impl.DefaultPasteImportAdvisor;\r
+import org.simantics.graph.db.TGStatusMonitor;\r
+import org.simantics.graph.db.TransferableGraphs;\r
+import org.simantics.graph.representation.TransferableGraph1;\r
+\r
+/**\r
+ * Headless utility facade for diagram template I/O.\r
+ * \r
+ * @author Tuukka Lehtonen\r
+ */\r
+public class DiagramTemplates {\r
+\r
+    /**\r
+     * @param monitor\r
+     * @param session the database session to use for importing\r
+     * @param templateFile\r
+     *            the template file to import\r
+     * @param targetContainer\r
+     *            the database container resource to make the imported template\r
+     *            a part of\r
+     * @return the root resource describing imported template\r
+     * @throws IOException\r
+     * @throws DatabaseException\r
+     */\r
+    public static Resource importTemplate(\r
+            IProgressMonitor monitor,\r
+            final Session session,\r
+            File templateFile,\r
+            Resource targetContainer)\r
+                    throws IOException, DatabaseException\r
+    {\r
+        final SubMonitor mon = SubMonitor.convert(monitor, "Importing diagram template", 100);\r
+        final DefaultPasteImportAdvisor advisor = new DefaultPasteImportAdvisor(targetContainer);\r
+        FormatHandler<Resource> handler = new DiagramTemplateFormatHandler() {\r
+            @Override\r
+            public Resource process(DataContainer container) throws Exception {\r
+                TransferableGraphs.importGraph1WithMonitor(\r
+                        session,\r
+                        (TransferableGraph1)container.content.getValue(),\r
+                        advisor,\r
+                        new TGMonitor(mon));\r
+                return advisor.getRoot();\r
+            }\r
+        };\r
+        return importTemplate(templateFile, targetContainer, handler);\r
+    }\r
+\r
+    /**\r
+     * @param monitor\r
+     * @param graph\r
+     *            database transaction handle to use for importing\r
+     * @param templateFile\r
+     *            the template file to import\r
+     * @param targetContainer\r
+     *            the database container resource to make the imported template\r
+     *            a part of\r
+     * @return the root resource describing imported template\r
+     * @throws IOException\r
+     * @throws DatabaseException\r
+     */\r
+    public static Resource importTemplate(\r
+            IProgressMonitor monitor,\r
+            final WriteGraph graph,\r
+            File templateFile,\r
+            Resource targetContainer)\r
+                    throws IOException, DatabaseException\r
+    {\r
+        final SubMonitor mon = SubMonitor.convert(monitor, "Importing diagram template", 100);\r
+        final DefaultPasteImportAdvisor advisor = new DefaultPasteImportAdvisor(targetContainer);\r
+        FormatHandler<Resource> handler = new DiagramTemplateFormatHandler() {\r
+            @Override\r
+            public Resource process(DataContainer container) throws Exception {\r
+                TransferableGraphs.importGraph1(graph,\r
+                        (TransferableGraph1) container.content.getValue(),\r
+                        advisor,\r
+                        new TGMonitor(mon));\r
+                return advisor.getRoot();\r
+            }\r
+        };\r
+        return importTemplate(templateFile, targetContainer, handler);\r
+    }\r
+\r
+    private static Resource importTemplate(\r
+            File modelFile,\r
+            Resource target,\r
+            FormatHandler<Resource> handler)\r
+                    throws IOException, DatabaseException\r
+    {\r
+        try {\r
+            Map<String, FormatHandler<Resource>> handlers = new HashMap<>(2);\r
+            handlers.put(DiagramTemplateConstants.DRAWING_TEMPLATE_FORMAT_V1, handler);\r
+            handlers.put(DiagramTemplateConstants.DRAWING_TEMPLATE_FORMAT_V2, handler);\r
+            return DataContainers.readFile(modelFile, handlers);\r
+        } catch (DataFormatException e) {\r
+            throw new IOException(e);\r
+        } catch (Exception e) {\r
+            if (e instanceof RuntimeException)\r
+                throw (RuntimeException)e;\r
+            else\r
+                throw new IOException(e);\r
+        }\r
+    }\r
+\r
+    private abstract static class DiagramTemplateFormatHandler implements FormatHandler<Resource> {\r
+        @Override\r
+        public Binding getBinding() {\r
+            return TransferableGraph1.BINDING;\r
+        }\r
+    }\r
+\r
+    private static class TGMonitor implements TGStatusMonitor {\r
+        private final SubMonitor mon;\r
+        private int last = 0;\r
+        public TGMonitor(SubMonitor mon) {\r
+            this.mon = mon;\r
+        }\r
+        @Override\r
+        public void status(int percentage) {\r
+            if (percentage > last) {\r
+                mon.worked(percentage - last);\r
+                last = percentage;\r
+            }\r
+        }\r
+        @Override\r
+        public boolean isCanceled() {\r
+            return mon.isCanceled();\r
+        }\r
+    }\r
+\r
+}\r