1 /*
2 LoaderGenerator - tool for generated xml, sql and doml file needed for Octopus.
3 Copyright (C) 2003 Together
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
8 This library is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 Lesser General Public License for more details.
12 You should have received a copy of the GNU Lesser General Public
13 License along with this library; if not, write to the Free Software
14 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15 */
16 package org.webdocwf.util.loader.generator;
17
18 import javax.xml.parsers.DocumentBuilder;
19 import javax.xml.parsers.DocumentBuilderFactory;
20 import javax.xml.parsers.FactoryConfigurationError;
21 import javax.xml.parsers.ParserConfigurationException;
22
23 import org.w3c.dom.Document;
24
25 import org.w3c.dom.Element;
26
27 import java.io.*;
28 import java.sql.*;
29
30 import java.util.StringTokenizer;
31 import org.webdocwf.util.loader.*;
32
33 import java.net.*;
34
35 import org.webdocwf.util.loader.logging.Logger;
36 import org.webdocwf.util.loader.logging.StandardLogger;
37 import org.webdocwf.util.loader.wizard.AddClassPath;
38
39 /***
40 * CreateIncludeFiles class creates Xml(ImportDefinition.xml) and Sql( CreateTables.sql,
41 * CreateIntegrity.sql, CreateOisAdminData.sql, CreatePrimary.sql and CreateIndex.sql) files,
42 * if the input data is database.
43 * @author Radoslav Dutina
44 * @version 1.0
45 */
46 public class CreateIncludeFiles {
47
48 private Document document;
49 private Document documentDoml;
50 private Element rootDoml = null;
51 private Element childRoot1 = null;
52 private Element childRoot2 = null;
53 private Logger logger;
54 private InputParameters generatorParameters;
55
56
57 /***
58 * Construct object CreateIncludeFiles with associated parameter.
59 * @param generatorParameters represents the references to InputParameter object.
60 * @throws LoaderException
61 */
62 public CreateIncludeFiles(InputParameters generatorParameters) throws LoaderException {
63
64 try {
65 setLogger();
66 this.logger.write("normal","CreateIncludeFiles is started. Generating sql and xml files is started.");
67 createIncludeFiles(generatorParameters);
68 this.logger.write("normal","CreateIncludeFiles is finished. Generating sql and xml files is finished.");
69 } catch (Exception e) {
70 throw new LoaderException("Exception:Error while create include files.", e);
71 } catch (FactoryConfigurationError e) {
72 throw new LoaderException("FactoryConfigurationError:Error while create include files.", e);
73 }
74 }
75
76
77 /***
78 * This method will generate all xml and sql files
79 * @param generatorParameters
80 * @throws LoaderException
81 * @throws FactoryConfigurationError
82 */
83 private void createIncludeFiles(InputParameters generatorParameters) throws LoaderException, FactoryConfigurationError {
84
85 this.logger.write("normal", "\tcreateIncludeFiles method is started.");
86 if (generatorParameters.getSourceDriverName().equalsIgnoreCase("freetds")) {
87 // if (this.logger != null) {
88
89 // }
90 //BufferOctopusClass.getInstance().writeToBuffer("Eroor : Freetds driver can't be used as source driver.");
91 LoaderException le = new LoaderException("Exception:", (Throwable) new Exception("Freetds driver can't be used as source driver."));
92 this.logger.write("full", "Eroor : Freetds driver can't be used as source driver."+le.getStackTraceAsString());
93 throw le;
94 }
95
96
97 //Create an importDefinition.xml file, for csv tables
98 if (generatorParameters.getSourceType().equalsIgnoreCase("csv") || generatorParameters.getSourceType().equalsIgnoreCase("access") || generatorParameters.getSourceType().equalsIgnoreCase("xml")) {
99
100 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
101 DocumentBuilderFactory factoryDoml = DocumentBuilderFactory.newInstance();
102 try {
103 DocumentBuilder builder = factory.newDocumentBuilder();
104 document = builder.newDocument(); // Create from whole cloth
105 //for creating the doml file
106 DocumentBuilder builderDoml = factoryDoml.newDocumentBuilder();
107 documentDoml = builderDoml.newDocument(); // Create from whole cloth
108
109 Element rootDoml = (Element) documentDoml.createElement("doml");
110 documentDoml.appendChild(rootDoml);
111
112 Element childRoot1 = (Element) documentDoml.createElement("database");
113 rootDoml.appendChild(childRoot1);
114 childRoot1.setAttribute("database", generatorParameters.getTargetType());
115
116 Element root = (Element) document.createElement("definitionInclude");
117 document.appendChild(root);
118 if (generatorParameters.getSourceType().equalsIgnoreCase("csv") || generatorParameters.getSourceType().equalsIgnoreCase("xml")) {
119 String pathToSource = generatorParameters.getSourceDataBase();
120 int endNameDB = pathToSource.indexOf(";");
121 if (endNameDB != -1)
122 pathToSource = pathToSource.substring(0, endNameDB);
123
124 File file = new File(pathToSource);
125 String[] listFiles = file.list();
126 if (listFiles == null && listFiles.length == 0) {
127 String msg = "Path to source database is wrong, or database is empty!";
128 //if (this.logger != null) {
129
130 //}
131 LoaderException le = new LoaderException("Exception:", new Exception(msg));
132 this.logger.write("full", "Path to source database is wrong, or database is empty!"+le.getStackTraceAsString());
133 throw le;
134 }
135 int x = 0;
136 for (int i = 0; i < listFiles.length; i++) {
137 String tableName = listFiles[i].substring(0, listFiles[i].lastIndexOf("."));
138 if (!tableName.endsWith("csvext")) {
139 //includeTable
140 boolean doJob = false;
141 if (generatorParameters.getIncludeTableList().size() == 0) {
142 doJob = true;
143 } else {
144 for (int j = 0; j < generatorParameters.getIncludeTableList().size(); j++) {
145 if (tableName.equalsIgnoreCase(generatorParameters.getIncludeTableList().get(j).toString())) {
146 doJob = true;
147 break;
148 }
149 }
150 }
151 if (doJob) {
152 //System.out.println("Working...." + tableName);
153 //BufferOctopusClass.getInstance().writeToBuffer("Working...." + tableName);
154 //if (this.logger != null) {
155 this.logger.write("normal", "Working...." + tableName);
156 //}
157 CsvTableDesignReader csvTableDesignReader = new CsvTableDesignReader(tableName, generatorParameters);
158 WriteImportDefinition writeImportDefinition = new WriteImportDefinition(document, root, csvTableDesignReader.getImportDefinition(), generatorParameters);
159 WriteSqlFiles writeSql = new WriteSqlFiles(tableName, x, csvTableDesignReader.getImportDefinition(), null, generatorParameters);
160 x++;
161 }
162
163 }
164 }
165 if (x < 1) {
166 String msg = "There is no tables in specified source database. Check input parameters.";
167 //if (this.logger != null) {
168
169 //}
170 LoaderException le = new LoaderException("Exception:", new Exception(msg));
171 this.logger.write("full", "There is no tables in specified source database. Check input parameters."+le.getStackTraceAsString());
172 throw le;
173 }
174 } else { //access,excel database
175 JdbcParameters sourceJdbc = new JdbcParameters("source", generatorParameters);
176 try {
177 Connection conn = null;
178 URL url = null;
179 String app = "";
180 String path = AddClassPath.getClassPathString();
181 if (path != null) {
182 StringTokenizer st = new StringTokenizer(path, ";");
183 int count = 0;
184 while (st.hasMoreTokens()) {
185 GeneratorClassLoader.addURL(new File(st.nextElement().toString()).toURL());
186 }
187 Class.forName(sourceJdbc.getJdbcParameters("JdbcDriver"));
188 } else {
189 Class.forName(sourceJdbc.getJdbcParameters("JdbcDriver"));
190 }
191 conn = DriverManager.getConnection(sourceJdbc.getJdbcParameters("Connection.Url"), sourceJdbc.getJdbcParameters("User"), sourceJdbc.getJdbcParameters("Password"));
192
193 Statement stmt = conn.createStatement();
194 String[] accessType = { "TABLE" };
195 String accessDbName = generatorParameters.getSourceDataBase();
196 ResultSet rs = conn.getMetaData().getTables(accessDbName, null, "%", accessType);
197
198 int i = 0;
199 while (rs.next()) {
200 String tableName = rs.getString(3);
201 //includeTable
202 boolean doJob = false;
203 if (generatorParameters.getIncludeTableList().size() == 0) {
204 doJob = true;
205 } else {
206 for (int j = 0; j < generatorParameters.getIncludeTableList().size(); j++) {
207 if (tableName.equalsIgnoreCase(generatorParameters.getIncludeTableList().get(j).toString())) {
208 doJob = true;
209 break;
210 }
211 }
212 }
213 if (doJob) {
214 //System.out.println("Working...." + tableName);
215 //BufferOctopusClass.getInstance().writeToBuffer("Working...." + tableName);
216 //if (this.logger != null) {
217 this.logger.write("normal", "Working...." + tableName);
218 //}
219 CsvTableDesignReader csvTableDesignReader = new CsvTableDesignReader(tableName, generatorParameters);
220
221 WriteImportDefinition writeImportDefinition = new WriteImportDefinition(document, root, csvTableDesignReader.getImportDefinition(), generatorParameters);
222 WriteSqlFiles writeSql = new WriteSqlFiles(tableName, i, csvTableDesignReader.getImportDefinition(), null, generatorParameters);
223 i++;
224 }
225 }
226 if (i < 1) {
227 String msg = "There is no tables in specified source database. Check input parameters.";
228 //if (this.logger != null) {
229
230 //}
231 LoaderException le = new LoaderException("Exception:", new Exception(msg));
232 this.logger.write("full", "Exception:There is no tables in specified source database. Check input parameters."+le.getStackTraceAsString());
233 throw le;
234 }
235 rs.close();
236 } catch (ClassNotFoundException ce) {
237 String msg = "Can't find driver class : ";
238 //if (this.logger != null) {
239
240 //}
241 LoaderException le = new LoaderException(msg + "\n" + ce.getMessage(), (Throwable) ce);
242 this.logger.write("full", "Exception:Can't find driver class!" + "\n" + le.getStackTraceAsString());
243 throw le;
244 } catch (Exception e) {
245 String msg = "Error while trying connect to database ( maybe password or username is wrong ? ) :";
246 //if (this.logger != null) {
247
248 //}
249 LoaderException le = new LoaderException(msg + "\n" + e.getMessage(), (Throwable) e);
250 this.logger.write("full", "Exception:" + msg + "\n" + le.getStackTraceAsString());
251 throw le;
252 }
253 }
254 WriteXmlFile writeXmlFile;
255 if (generatorParameters.getGenerateXml().equalsIgnoreCase("true"))
256 writeXmlFile = new WriteXmlFile(document, generatorParameters);
257
258 } catch (ParserConfigurationException pce) {
259 // Parser with specified options can't be built
260 String msg = "Exception in CreateIncludeFiles class:Parser with specified options can't be built";
261 //if (this.logger != null) {
262
263 //}
264 LoaderException le = new LoaderException(msg + "\n" + pce, (Throwable) pce);
265 this.logger.write("full", "Exception in CreateIncludeFiles class:Parser with specified options can't be built." + "\n" + le.getStackTraceAsString());
266 throw le;
267 }
268 //System.out.println("\ndone...\n\n");
269 this.logger.write("normal", "\ndone...\n\n");
270 //BufferOctopusClass.getInstance().writeToBuffer("\ndone...\n\n");
271 }
272 //Create an importDefinition.xml file
273 else {
274 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
275 DocumentBuilderFactory factoryDoml = DocumentBuilderFactory.newInstance();
276 try {
277 // Create Importdefinition file, initializing the Document object and creatint the root
278 // element.
279 DocumentBuilder builder = factory.newDocumentBuilder();
280 document = builder.newDocument(); // Create from whole cloth
281 Element root = (Element) document.createElement("definitionInclude");
282 document.appendChild(root);
283
284 // Creating the doml file, initializing the Document object and creating the root,
285 // childRoot1 and childRoot2 elements.
286 DocumentBuilder builderDoml = factoryDoml.newDocumentBuilder();
287 documentDoml = builderDoml.newDocument(); // Create from whole cloth
288 if ((generatorParameters.getGenerateDoml().equalsIgnoreCase("true"))) {
289 rootDoml = (Element) documentDoml.createElement("doml");
290 documentDoml.appendChild(rootDoml);
291 childRoot1 = (Element) documentDoml.createElement("database");
292 rootDoml.appendChild(childRoot1);
293 childRoot1.setAttribute("database", generatorParameters.getTargetType());
294 //Element childRoot2=null;
295 StringTokenizer newPackage = new StringTokenizer(generatorParameters.getPackageName(), ".");
296 Element tmp = childRoot1;
297 String name = "";
298 String packageName = "";
299 int count = 0;
300 while (newPackage.hasMoreTokens()) {
301 childRoot2 = (Element) documentDoml.createElement("package");
302 tmp.appendChild(childRoot2);
303 packageName = newPackage.nextToken();
304 childRoot2.setAttribute("id", name + packageName);
305 tmp = childRoot2;
306 if (count == 0)
307 name = packageName + ".";
308 else
309 name = name + packageName + ".";
310 count++;
311 }
312 }
313
314 //Creating Sql file
315 JdbcParameters sourceJdbc = new JdbcParameters("source", generatorParameters);
316 Connection conn = null;
317 try {
318 URL url = null;
319 String app = "";
320 String path = AddClassPath.getClassPathString();
321 if (path != null) {
322 StringTokenizer st = new StringTokenizer(path, ";");
323 int count = 0;
324 while (st.hasMoreTokens()) {
325 GeneratorClassLoader.addURL(new File(st.nextElement().toString()).toURL());
326 }
327 Class.forName(sourceJdbc.getJdbcParameters("JdbcDriver"));
328 } else {
329 Class.forName(sourceJdbc.getJdbcParameters("JdbcDriver"));
330 }
331 conn = DriverManager.getConnection(sourceJdbc.getJdbcParameters("Connection.Url"), sourceJdbc.getJdbcParameters("User"), sourceJdbc.getJdbcParameters("Password"));
332
333 } catch (ClassNotFoundException ce) {
334 String msg = "Can't find driver class : ";
335 //if (this.logger != null) {
336
337 //}
338 LoaderException le = new LoaderException(msg + "\n" + ce.getMessage(), (Throwable) ce);
339 this.logger.write("full", "Exception:Can't find driver class!" + "\n" + le.getStackTraceAsString());
340 throw le;
341 } catch (Exception e) {
342 e.printStackTrace();
343 String msg = "Error while trying connect to database ( maybe password, username or database url is wrong ? ) :";
344 //if (this.logger != null) {
345
346 //}
347 LoaderException le = new LoaderException(msg + "\n" + e.getMessage(), (Throwable) e);
348 this.logger.write("full", "Exception:" + msg + "\n" + le.getStackTraceAsString());
349 throw le;
350 }
351 String[] types = { "TABLE" };
352 String catalogName = null;
353 int index = generatorParameters.getSourceDataBase().indexOf("DatabaseName=");
354 int index1 = generatorParameters.getSourceDataBase().lastIndexOf(";");
355 if (index > 0) {
356 if (index1 > index) {
357 catalogName = generatorParameters.getSourceDataBase().substring(index + 13, generatorParameters.getSourceDataBase().lastIndexOf(";"));
358 } else {
359 catalogName = generatorParameters.getSourceDataBase().substring(index + 13);
360 }
361 } else {
362 int index2 = generatorParameters.getSourceDataBase().lastIndexOf("//");
363 int index3 = generatorParameters.getSourceDataBase().lastIndexOf("/");
364 if (index2 > index3)
365 catalogName = generatorParameters.getSourceDataBase().substring(generatorParameters.getSourceDataBase().lastIndexOf("//") + 1);
366 else
367 catalogName = generatorParameters.getSourceDataBase().substring(generatorParameters.getSourceDataBase().lastIndexOf("/") + 1);
368 }
369
370 if(generatorParameters.getSourceType() != null &&
371 (generatorParameters.getSourceType().equals("Hsqldb") ||
372 generatorParameters.getSourceType().equals("HypersonicSQL")) ||
373 generatorParameters.getSourceType().equals("DB2")
374 ) {
375 catalogName = null;
376 }
377 ResultSet rs = conn.getMetaData().getTables(catalogName, null, "%", types);
378
379 int i = 0;
380 while (rs.next()) {
381 String tableName = rs.getObject(3).toString();
382 boolean doJob = false;
383 //includeTable
384 if (generatorParameters.getIncludeTableList().size() == 0) {
385 doJob = true;
386 } else {
387 for (int j = 0; j < generatorParameters.getIncludeTableList().size(); j++) {
388 if (tableName.equalsIgnoreCase(generatorParameters.getIncludeTableList().get(j).toString())) {
389 doJob = true;
390 break;
391 }
392 }
393 }
394 //excludeTable
395 String[] list = generatorParameters.getExcludedTables();
396 if (doJob) {
397 for (int j = 0; j < list.length; j++) {
398 if (tableName.equalsIgnoreCase(list[j])) {
399 doJob = false;
400 break;
401 }
402 }
403 }
404 if (generatorParameters.getValueMode().equalsIgnoreCase("Update")) {
405 //This method is not supported!
406 } else { //copy table mode
407 if (doJob) {
408 int counterOfConstraints = 0;
409 //System.out.println("Working...." + tableName);
410 //BufferOctopusClass.getInstance().writeToBuffer("Working...." + tableName);
411 //if (this.logger != null) {
412 this.logger.write("normal", "Working...." + tableName);
413 //}
414 TableRelationshipsReader tableRelationshipsReader = new TableRelationshipsReader(conn, tableName, catalogName, generatorParameters, counterOfConstraints);
415 TableDesignReader tableDesignReader = new TableDesignReader(tableName, conn, catalogName, generatorParameters);
416 if (generatorParameters.isGenerateSql()) {
417 WriteSqlFiles writeSql = new WriteSqlFiles(tableName, i, tableDesignReader.getImportDefinition(), tableRelationshipsReader.getRelationshipsAttributes(), generatorParameters);
418 }
419
420 try {
421 WriteImportDefinition writeImportDefinition;
422 if (generatorParameters.getGenerateXml().equalsIgnoreCase("true"))
423 writeImportDefinition = new WriteImportDefinition(document, root, tableDesignReader.getImportDefinition(), generatorParameters);
424 if ((generatorParameters.getGenerateDoml().equalsIgnoreCase("true"))) {
425 GenerateDoml generateDoml;
426 generateDoml = new GenerateDoml(documentDoml, rootDoml, childRoot1, childRoot2, tableName, tableDesignReader.getImportDefinition(), tableRelationshipsReader.getRelationshipsAttributes(), generatorParameters);
427 }
428
429 } catch (Exception pce) {
430
431 LoaderException le = new LoaderException(pce.getMessage(), (Throwable) pce);
432 this.logger.write("full", "Exception:"+le.getStackTraceAsString());
433 throw le;
434 }
435 i++;
436 } else {
437 //System.out.println("\tTable " + tableName + " is excluded from the process.");
438 //BufferOctopusClass.getInstance().writeToBuffer("\tTable " + tableName + " is excluded from the process.");
439 //if (this.logger != null) {
440 this.logger.write("normal", "Table " + tableName + " is excluded from the process.");
441 //}
442 }
443 } //end of Copy tableMode
444 }
445 if (i < 1) {
446 String msg = "There is no tables in specified source database (" + catalogName + "). Check input parameters.";
447 //if (this.logger != null) {
448
449 //}
450 LoaderException le = new LoaderException("Exception:", new Exception(msg));
451 this.logger.write("full", "Exception:There is no tables in specified source database (" + catalogName + ")");
452 throw le;
453 }
454
455 //System.out.println("\ndone...\n\n");
456 //BufferOctopusClass.getInstance().writeToBuffer("\ndone...\n\n");
457 //if (this.logger != null) {
458 this.logger.write("normal", "\ndone...\n\n");
459 //}
460 WriteXmlFile writeXmlFile;
461 if (generatorParameters.getGenerateXml().equalsIgnoreCase("true"))
462 writeXmlFile = new WriteXmlFile(document, generatorParameters);
463
464 if (generatorParameters.getGenerateDoml().equalsIgnoreCase("true")) {
465 WriteDomlFile writeDomlFile;
466 writeDomlFile = new WriteDomlFile(documentDoml, generatorParameters);
467 }
468 conn.close();
469
470 } catch (Exception e) {
471 String msg = "Exception in class CreateIncludeFiles:";
472 //if (this.logger != null) {
473
474 //}
475 LoaderException le = new LoaderException(msg + "\n" + e.getMessage(), (Throwable) e);
476 this.logger.write("full", "Exception in class CreateIncludeFiles:" + le.getStackTraceAsString());
477 throw le;
478 }
479 }
480 this.logger.write("normal", "\tcreateIncludeFiles method is finished.");
481 }
482
483 /***
484 * This method will set logger object
485 * @param logger
486 */
487 private void setLogger() {
488 this.logger = StandardLogger.getCentralLogger();
489 }
490 }
This page was automatically generated by Maven