]> gerrit.simantics Code Review - simantics/interop.git/blob - org.simantics.xml.sax.base/src/org/simantics/xml/sax/base/AbstractImporter.java
Make it possible to customise element parsers before imports
[simantics/interop.git] / org.simantics.xml.sax.base / src / org / simantics / xml / sax / base / AbstractImporter.java
1 package org.simantics.xml.sax.base;\r
2 \r
3 import java.io.File;\r
4 \r
5 import org.simantics.db.Resource;\r
6 import org.simantics.db.Session;\r
7 import org.simantics.db.WriteGraph;\r
8 import org.simantics.db.common.request.DelayedWriteRequest;\r
9 import org.simantics.db.common.request.WriteRequest;\r
10 import org.simantics.db.exception.DatabaseException;\r
11 import org.simantics.db.layer0.util.Layer0Utils;\r
12 import org.simantics.db.service.XSupport;\r
13 import org.simantics.message.ILogger;\r
14 import org.simantics.message.MessageService;\r
15 \r
16 \r
17 public abstract class AbstractImporter {\r
18 \r
19         \r
20         private Session session;\r
21         private File file;\r
22         private ILogger logger;\r
23         private XMLParser parser;\r
24         \r
25         private static final boolean USE_DELAYED = true;\r
26         \r
27         public AbstractImporter(Session session, File file)  {\r
28                 this.session = session;\r
29                 this.file = file;\r
30         }\r
31         \r
32         public AbstractImporter(Session session, File file, XMLParser parser)  {\r
33                 this.session = session;\r
34                 this.file = file;\r
35                 this.parser = parser;\r
36         }\r
37         public Resource doImport() throws DatabaseException {\r
38                 return doImport(MessageService.getDefault());   \r
39         }\r
40         \r
41         public Resource doImport(ILogger logger) throws DatabaseException {\r
42                 this.logger = logger;\r
43                 if (USE_DELAYED) {\r
44                         ImportDelayedRequest req = new ImportDelayedRequest();\r
45                         session.syncRequest(req);\r
46                         Resource dr = req.getResult();\r
47                         XSupport xs = session.getService(XSupport.class);\r
48                         Resource result = xs.convertDelayedResourceToResource(dr);\r
49                         return result;\r
50                 } else {\r
51                         ImportRequest req = new ImportRequest();\r
52                         session.syncRequest(req);\r
53                         return req.getResult();\r
54                 }\r
55         }\r
56         \r
57         public File getFile() {\r
58                 return file;\r
59         }\r
60         \r
61         public void configure(XMLParser parser){};\r
62         \r
63         \r
64         private class ImportRequest extends WriteRequest {\r
65                 private Resource result;\r
66                 public ImportRequest() {\r
67                         super();\r
68                 }\r
69 \r
70                 @Override\r
71                 public void perform(WriteGraph graph) throws DatabaseException {\r
72                         Layer0Utils.addCommentMetadata(graph, "Import file " + file.getName());\r
73                         graph.markUndoPoint();\r
74                         result = doImport(graph);\r
75                 }\r
76                 \r
77                 public Resource getResult() {\r
78                         return result;\r
79                 }\r
80         }\r
81         \r
82         private class ImportDelayedRequest extends DelayedWriteRequest {\r
83                 private Resource result;\r
84                 public ImportDelayedRequest() {\r
85                         super();\r
86                 }\r
87 \r
88                 @Override\r
89                 public void perform(WriteGraph graph) throws DatabaseException {\r
90                         result = doImport(graph);\r
91                 }\r
92                 \r
93                 public Resource getResult() {\r
94                         return result;\r
95                 }\r
96         }\r
97         \r
98         private Resource doImport(WriteGraph graph) throws DatabaseException {\r
99                 Layer0Utils.setDependenciesIndexingDisabled(graph, true);\r
100                 try {\r
101                         \r
102                         if (parser == null) {\r
103                                 parser = new XMLParser();\r
104                                 parser.setGraph(graph);\r
105                                 configure(parser);\r
106                         } else {\r
107                                 parser.setGraph(graph);\r
108                         }\r
109                         \r
110                         parser.parse(file, logger);\r
111                         System.out.println(file.getAbsolutePath() + " imported");\r
112                         Resource root = parser.getRoot();\r
113                         if (root == null) {\r
114                                 throw new DatabaseException(file.getAbsolutePath() + " import failed. File is corrupted, or is not given type");\r
115                         }\r
116                         return root;\r
117                 } catch (DatabaseException e) {\r
118                         throw e;\r
119                 } catch (Exception e) {\r
120                         throw new DatabaseException(e);\r
121                 } \r
122         }\r
123         \r
124         public XMLElementParser getParser(String elementId) {\r
125                 return parser.getParser(elementId);\r
126         }\r
127 \r
128         public void setParser(String elementId, XMLElementParser p) {\r
129                 parser.setParser(elementId, p);\r
130         }\r
131 \r
132 }\r