1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package cz.zcu.mre.sparkle.gui.query;
21
22 import cz.zcu.mre.sparkle.Messages;
23 import cz.zcu.mre.sparkle.data.DataAgent;
24 import cz.zcu.mre.sparkle.data.Storage;
25 import cz.zcu.mre.sparkle.gui.mainForm.MainForm;
26 import cz.zcu.mre.sparkle.gui.query.queryTypes.insert.InsertQueryFormPane;
27 import cz.zcu.mre.sparkle.gui.query.queryTypes.ask.AskQueryFormPane;
28 import cz.zcu.mre.sparkle.gui.query.queryTypes.construct.ConstructQueryFormPane;
29 import cz.zcu.mre.sparkle.gui.query.queryTypes.delete.DeleteInsertQueryFormPane;
30 import cz.zcu.mre.sparkle.gui.query.queryTypes.delete.DeleteQueryFormPane;
31 import cz.zcu.mre.sparkle.gui.query.queryTypes.describe.DescribeQueryFormPane;
32 import cz.zcu.mre.sparkle.gui.query.queryTypes.select.SelectQueryFormPane;
33 import cz.zcu.mre.sparkle.tools.Saveable;
34 import cz.zcu.mre.sparkle.tools.sparqlParser.QueryParser;
35 import org.antlr.v4.runtime.misc.ParseCancellationException;
36 import org.antlr.v4.runtime.tree.ParseTree;
37 import org.w3c.dom.Document;
38 import org.w3c.dom.Element;
39 import org.w3c.dom.NodeList;
40 import javax.xml.parsers.DocumentBuilder;
41 import javax.xml.parsers.DocumentBuilderFactory;
42 import javax.xml.parsers.ParserConfigurationException;
43 import javax.xml.transform.Transformer;
44 import javax.xml.transform.TransformerException;
45 import javax.xml.transform.TransformerFactory;
46 import javax.xml.transform.dom.DOMResult;
47 import javax.xml.transform.stream.StreamSource;
48 import java.io.File;
49 import java.io.IOException;
50 import static cz.zcu.mre.sparkle.tools.Definitions.QUERY_FILE_EXTENSION;
51 import static cz.zcu.mre.sparkle.tools.Definitions.QUERY_FILE_EXTENSION_DELIMITER;
52
53
54
55
56
57
58
59
60 class QueryFormPaneLoad {
61
62 public static QueryFormPane<?> load(
63 final MainForm mainForm, final DataAgent dataAgent, final Storage localStorage,
64 final String queryString)
65 throws ParserConfigurationException, TransformerException, Saveable.LoadException,
66 ParseCancellationException {
67
68 return doLoad(mainForm, dataAgent, localStorage, QueryParser.getParsedTree(queryString));
69
70 }
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88 public static QueryFormPane<?> load(
89 final MainForm mainForm, final DataAgent dataAgent, final Storage localStorage,
90 final File file)
91 throws ParserConfigurationException, TransformerException, Saveable.LoadException,
92 ParseCancellationException, IOException {
93
94
95 int extensionPos = file.getName().lastIndexOf(QUERY_FILE_EXTENSION_DELIMITER) + 1;
96 if (file.getName().substring(extensionPos).equals(QUERY_FILE_EXTENSION)) {
97
98 return doLoad(mainForm, dataAgent, localStorage, getDOM(file));
99 } else {
100
101 return doLoad(mainForm, dataAgent, localStorage, QueryParser.getParsedTree(file));
102 }
103 }
104
105
106
107
108
109
110
111
112
113
114
115 private static Document getDOM(File file) throws TransformerException, ParserConfigurationException {
116 final TransformerFactory transformerFactory = TransformerFactory.newInstance();
117 final Transformer transformer = transformerFactory.newTransformer();
118
119 final DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
120 final DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
121 final Document doc = docBuilder.newDocument();
122
123 final DOMResult result = new DOMResult(doc);
124 final StreamSource source = new StreamSource(file);
125
126 transformer.transform(source, result);
127
128 return doc;
129 }
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144 private static QueryFormPane<?> doLoad(
145 final MainForm mainForm, final DataAgent dataAgent, final Storage localStorage,
146 final Object context) throws Saveable.LoadException, TransformerException, ParserConfigurationException {
147
148 if (context instanceof Document) {
149 Document doc = (Document) context;
150 final NodeList nodeList = doc.getElementsByTagName(QueryFormPane.XML_ELEMENT_NAME);
151
152 if (nodeList.getLength() > 0) {
153 final Element root = (Element) nodeList.item(0);
154 final String type = root.getAttribute(QueryFormPane.XML_QUERY_TYPE);
155
156 QueryFormPane.setObtainedColor(root.getAttribute(QueryFormPane.XML_TAB_COLOR));
157
158 final QueryFormPane<?> pane = getQueryPane(mainForm, dataAgent, localStorage, root, type);
159
160 if (pane == null) {
161 throw new Saveable.LoadException(root, QueryFormPane.XML_QUERY_TYPE);
162 }
163
164 return pane;
165 }
166
167 } else if (context instanceof ParseTree) {
168
169 ParseTree treeContext = (ParseTree) context;
170 String queryType = QueryParser.getDocType(treeContext);
171 if (queryType != null) {
172 QueryFormPane.setObtainedColor("");
173 return getQueryPane(mainForm, dataAgent, localStorage, treeContext, queryType);
174 } else {
175 throw new ParseCancellationException(Messages.getString("UNKNOWN_QUERY"));
176 }
177 }
178 return null;
179 }
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196 private static QueryFormPane<?> getQueryPane(final MainForm mainForm, final DataAgent dataAgent,
197 final Storage localStorage, final Object root, final String paneType)
198 throws ParserConfigurationException, TransformerException, Saveable.LoadException {
199
200 final QueryFormPane<?> pane;
201 if (paneType.equalsIgnoreCase(SelectQueryFormPane.XML_QUERY_TYPE_VALUE)) {
202 pane = new SelectQueryFormPane(mainForm, dataAgent, localStorage, root, paneType);
203
204 } else if (paneType.equalsIgnoreCase(AskQueryFormPane.XML_QUERY_TYPE_VALUE)) {
205 pane = new AskQueryFormPane(mainForm, dataAgent, localStorage, root, paneType);
206
207 } else if (paneType.equalsIgnoreCase(ConstructQueryFormPane.XML_QUERY_TYPE_VALUE)) {
208 pane = new ConstructQueryFormPane(mainForm, dataAgent, localStorage, root, paneType);
209
210 } else if (paneType.equalsIgnoreCase(DescribeQueryFormPane.XML_QUERY_TYPE_VALUE)) {
211 pane = new DescribeQueryFormPane(mainForm, dataAgent, localStorage, root, paneType);
212
213 } else if (paneType.equalsIgnoreCase(DeleteQueryFormPane.XML_QUERY_TYPE_VALUE)) {
214 pane = new DeleteQueryFormPane(mainForm, dataAgent, localStorage, root, paneType);
215
216 } else if (paneType.equalsIgnoreCase(InsertQueryFormPane.XML_QUERY_TYPE_VALUE)) {
217 pane = new InsertQueryFormPane(mainForm, dataAgent, localStorage, root, paneType);
218
219 } else if (paneType.equalsIgnoreCase(DeleteInsertQueryFormPane.XML_QUERY_TYPE_VALUE)) {
220 pane = new DeleteInsertQueryFormPane(mainForm, dataAgent, localStorage, root, paneType);
221
222 } else {
223 return null;
224 }
225 return pane;
226 }
227 }