1 package org.simantics.modeling.template2d;
\r
4 import java.io.IOException;
\r
5 import java.util.HashMap;
\r
6 import java.util.Map;
\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
25 * Headless utility facade for diagram template I/O.
\r
27 * @author Tuukka Lehtonen
\r
29 public class DiagramTemplates {
\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
39 * @return the root resource describing imported template
\r
40 * @throws IOException
\r
41 * @throws DatabaseException
\r
43 public static Resource importTemplate(
\r
44 IProgressMonitor monitor,
\r
45 final Session session,
\r
47 Resource targetContainer)
\r
48 throws IOException, DatabaseException
\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
54 public Resource process(DataContainer container) throws Exception {
\r
55 TransferableGraphs.importGraph1WithMonitor(
\r
57 (TransferableGraph1)container.content.getValue(),
\r
59 new TGMonitor(mon));
\r
60 return advisor.getRoot();
\r
63 return importTemplate(templateFile, targetContainer, handler);
\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
75 * @return the root resource describing imported template
\r
76 * @throws IOException
\r
77 * @throws DatabaseException
\r
79 public static Resource importTemplate(
\r
80 IProgressMonitor monitor,
\r
81 final WriteGraph graph,
\r
83 Resource targetContainer)
\r
84 throws IOException, DatabaseException
\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
90 public Resource process(DataContainer container) throws Exception {
\r
91 TransferableGraphs.importGraph1(graph,
\r
92 (TransferableGraph1) container.content.getValue(),
\r
94 new TGMonitor(mon));
\r
95 return advisor.getRoot();
\r
98 return importTemplate(templateFile, targetContainer, handler);
\r
101 private static Resource importTemplate(
\r
104 FormatHandler<Resource> handler)
\r
105 throws IOException, DatabaseException
\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
118 throw new IOException(e);
\r
122 private abstract static class DiagramTemplateFormatHandler implements FormatHandler<Resource> {
\r
124 public Binding getBinding() {
\r
125 return TransferableGraph1.BINDING;
\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
136 public void status(int percentage) {
\r
137 if (percentage > last) {
\r
138 mon.worked(percentage - last);
\r
143 public boolean isCanceled() {
\r
144 return mon.isCanceled();
\r