]> gerrit.simantics Code Review - simantics/platform.git/blob - 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
1 package org.simantics.modeling.template2d;\r
2 \r
3 import java.io.File;\r
4 import java.io.IOException;\r
5 import java.util.HashMap;\r
6 import java.util.Map;\r
7 \r
8 import org.eclipse.core.runtime.IProgressMonitor;\r
9 import org.eclipse.core.runtime.SubMonitor;\r
10 import org.simantics.databoard.binding.Binding;\r
11 import org.simantics.databoard.container.DataContainer;\r
12 import org.simantics.databoard.container.DataContainers;\r
13 import org.simantics.databoard.container.DataFormatException;\r
14 import org.simantics.databoard.container.FormatHandler;\r
15 import org.simantics.db.Resource;\r
16 import org.simantics.db.Session;\r
17 import org.simantics.db.WriteGraph;\r
18 import org.simantics.db.exception.DatabaseException;\r
19 import org.simantics.db.layer0.adapter.impl.DefaultPasteImportAdvisor;\r
20 import org.simantics.graph.db.TGStatusMonitor;\r
21 import org.simantics.graph.db.TransferableGraphs;\r
22 import org.simantics.graph.representation.TransferableGraph1;\r
23 \r
24 /**\r
25  * Headless utility facade for diagram template I/O.\r
26  * \r
27  * @author Tuukka Lehtonen\r
28  */\r
29 public class DiagramTemplates {\r
30 \r
31     /**\r
32      * @param monitor\r
33      * @param session the database session to use for importing\r
34      * @param templateFile\r
35      *            the template file to import\r
36      * @param targetContainer\r
37      *            the database container resource to make the imported template\r
38      *            a part of\r
39      * @return the root resource describing imported template\r
40      * @throws IOException\r
41      * @throws DatabaseException\r
42      */\r
43     public static Resource importTemplate(\r
44             IProgressMonitor monitor,\r
45             final Session session,\r
46             File templateFile,\r
47             Resource targetContainer)\r
48                     throws IOException, DatabaseException\r
49     {\r
50         final SubMonitor mon = SubMonitor.convert(monitor, "Importing diagram template", 100);\r
51         final DefaultPasteImportAdvisor advisor = new DefaultPasteImportAdvisor(targetContainer);\r
52         FormatHandler<Resource> handler = new DiagramTemplateFormatHandler() {\r
53             @Override\r
54             public Resource process(DataContainer container) throws Exception {\r
55                 TransferableGraphs.importGraph1WithMonitor(\r
56                         session,\r
57                         (TransferableGraph1)container.content.getValue(),\r
58                         advisor,\r
59                         new TGMonitor(mon));\r
60                 return advisor.getRoot();\r
61             }\r
62         };\r
63         return importTemplate(templateFile, targetContainer, handler);\r
64     }\r
65 \r
66     /**\r
67      * @param monitor\r
68      * @param graph\r
69      *            database transaction handle to use for importing\r
70      * @param templateFile\r
71      *            the template file to import\r
72      * @param targetContainer\r
73      *            the database container resource to make the imported template\r
74      *            a part of\r
75      * @return the root resource describing imported template\r
76      * @throws IOException\r
77      * @throws DatabaseException\r
78      */\r
79     public static Resource importTemplate(\r
80             IProgressMonitor monitor,\r
81             final WriteGraph graph,\r
82             File templateFile,\r
83             Resource targetContainer)\r
84                     throws IOException, DatabaseException\r
85     {\r
86         final SubMonitor mon = SubMonitor.convert(monitor, "Importing diagram template", 100);\r
87         final DefaultPasteImportAdvisor advisor = new DefaultPasteImportAdvisor(targetContainer);\r
88         FormatHandler<Resource> handler = new DiagramTemplateFormatHandler() {\r
89             @Override\r
90             public Resource process(DataContainer container) throws Exception {\r
91                 TransferableGraphs.importGraph1(graph,\r
92                         (TransferableGraph1) container.content.getValue(),\r
93                         advisor,\r
94                         new TGMonitor(mon));\r
95                 return advisor.getRoot();\r
96             }\r
97         };\r
98         return importTemplate(templateFile, targetContainer, handler);\r
99     }\r
100 \r
101     private static Resource importTemplate(\r
102             File modelFile,\r
103             Resource target,\r
104             FormatHandler<Resource> handler)\r
105                     throws IOException, DatabaseException\r
106     {\r
107         try {\r
108             Map<String, FormatHandler<Resource>> handlers = new HashMap<>(2);\r
109             handlers.put(DiagramTemplateConstants.DRAWING_TEMPLATE_FORMAT_V1, handler);\r
110             handlers.put(DiagramTemplateConstants.DRAWING_TEMPLATE_FORMAT_V2, handler);\r
111             return DataContainers.readFile(modelFile, handlers);\r
112         } catch (DataFormatException e) {\r
113             throw new IOException(e);\r
114         } catch (Exception e) {\r
115             if (e instanceof RuntimeException)\r
116                 throw (RuntimeException)e;\r
117             else\r
118                 throw new IOException(e);\r
119         }\r
120     }\r
121 \r
122     private abstract static class DiagramTemplateFormatHandler implements FormatHandler<Resource> {\r
123         @Override\r
124         public Binding getBinding() {\r
125             return TransferableGraph1.BINDING;\r
126         }\r
127     }\r
128 \r
129     private static class TGMonitor implements TGStatusMonitor {\r
130         private final SubMonitor mon;\r
131         private int last = 0;\r
132         public TGMonitor(SubMonitor mon) {\r
133             this.mon = mon;\r
134         }\r
135         @Override\r
136         public void status(int percentage) {\r
137             if (percentage > last) {\r
138                 mon.worked(percentage - last);\r
139                 last = percentage;\r
140             }\r
141         }\r
142         @Override\r
143         public boolean isCanceled() {\r
144             return mon.isCanceled();\r
145         }\r
146     }\r
147 \r
148 }\r