1: /*
2: * Convert.java -- Converter class - Filemaker to SQL Converter Copyright (C)
3: * 2003 Robert Gordesch (rogo@mpiwg-berlin.mpg.de) This program is free
4: * software; you can redistribute it and/or modify it under the terms of the GNU
5: * General Public License as published by the Free Software Foundation; either
6: * version 2 of the License, or (at your option) any later version. Please read
7: * license.txt for the full details. A copy of the GPL may be found at
8: * http://www.gnu.org/copyleft/lgpl.html You should have received a copy of the
9: * GNU General Public License along with this program; if not, write to the Free
10: * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
11: * USA Created on 15.09.2003 by rogo
12: */
13:
14: import java.awt.Cursor;
15: import java.io.BufferedReader;
16: import java.io.BufferedWriter;
17: import java.io.File;
18: import java.io.FileInputStream;
19: import java.io.FileNotFoundException;
20: import java.io.FileOutputStream;
21: import java.io.InputStream;
22: import java.io.InputStreamReader;
23: import java.io.OutputStreamWriter;
24: import java.io.PrintStream;
25: import java.io.UnsupportedEncodingException;
26: import java.net.URL;
27: import java.sql.PreparedStatement;
28: import java.sql.ResultSet;
29: import java.sql.SQLException;
30: import java.sql.Statement;
31: import java.sql.Types;
32: import java.text.ParseException;
33: import java.util.ArrayList;
34: import java.util.Hashtable;
35: import java.util.Iterator;
36: import java.util.List;
37: import java.util.StringTokenizer;
38: import java.util.TreeSet;
39: import java.util.Vector;
40:
41: import javax.swing.JDialog;
42: import javax.swing.JLabel;
43: import javax.swing.JPanel;
44:
45: import com.exploringxml.xml.Node;
46: import com.exploringxml.xml.Xparse;
47:
48: class Convert
49: {
50: /**
51: * Helper class for index creation
52: *
53: * @author rogo
54: *
55: */
56: public static class IndexList extends Vector
57: {
58: public String toString()
59: {
60: StringBuffer buff = new StringBuffer(1000);
61: int count = 0;
62: for (Iterator iter = this.iterator(); iter.hasNext();)
63: {
64: String element = (String) iter.next();
65: if (count < elementCount - 1)
66: {
67: buff.append(element).append(", ");
68: count++;
69: }
70: else
71: buff.append(element);
72:
73: }
74:
75: return buff.toString();
76: }
77: }
78:
79: static DBBean bean = new DBBean();
80:
81: static DBBean beanDest = new DBBean();
82:
83: static String user = "", passwd = "e1nste1n";
84:
85: static String userDest = "postgres", passwdDest = "rogo";
86:
87: static boolean batchRun = false;
88:
89: static Vector databases = new Vector();
90:
91: final static int numHits = 5000;
92:
93: final static int numIntervalls = 4;
94:
95: static boolean debug = false;
96:
97: public static void main(String args[])
98: {
99: /*
100: * try { //byte[] b = "ö".getBytes("UTF-8"); //
101: * System.out.println("QueryString " +b[0]+" "+b[1]+(new
102: * String(b).getBytes()[0])+" "+new String(b).getBytes()[1]);
103: * //System.out.println(new String(b,"UTF-8")); } catch
104: * (UnsupportedEncodingException e) { e.printStackTrace(); }
105: */
106: FileOutputStream file = null;
107: if (args.length != 1)
108: {
109: System.out.println("Usage: java Convert <xml config file>");
110: System.exit(-1);
111: }
112: try
113: {
114: file = new FileOutputStream("./log.txt");
115: }
116: catch (FileNotFoundException e1)
117: {
118: e1.printStackTrace();
119: }
120: PrintStream stream = new PrintStream(file, false);
121: if (!debug)
122: {
123: System.setOut(stream);
124: System.setErr(stream);
125: }
126: readXMLFile(args[0]);
127: if (!(new File(args[0]).exists()))
128: System.exit(0);
129:
130: System.out.println("Finished!");
131: //convert("jdbc:fmpro:http://141.14.237.74:8050","jdbc:postgresql://erebos/test",null,null);
132: }
133:
134: public static void convertBatch(DBBean source, DBBean destination, Vector names, Vector layouts, Vector selects, Vector creates, Vector ids, int mode, String delimiter) throws Exception
135: {
136: bean = source;
137: beanDest = destination;
138: convert(null, null, names, layouts, selects, creates, ids, mode, delimiter);
139: if (true)
140: return;
141: StringBuffer command = null;
142: try
143: {
144: bean.setConnection(source.url);
145: if (names == null)
146: names = bean.getTableNames();
147: //Collections.sort(names);
148: int tbIndex = 1;
149:
150: for (tbIndex = 0; tbIndex < names.size(); ++tbIndex)
151: {
152: Vector[] result = null;
153: try
154: {
155: String query = "select * from " + bean.getQC() + names.get(tbIndex).toString() + bean.getQC();
156: String layout = (layouts.isEmpty()) ? "" : layouts.get(tbIndex).toString();
157: query = (selects != null) ? selects.get(tbIndex).toString() : query;
158: //if vectors[1].get(i) != null)
159: if (!layout.equals(""))
160: {
161: System.out.println("before " + query + " table" + names.get(tbIndex));
162: layout = " layout " + bean.getQC() + layout + bean.getQC();
163: String name = names.get(tbIndex).toString();
164: StringBuffer queryLayout = new StringBuffer(query);
165: queryLayout.insert(queryLayout.indexOf(name) + name.length() + 1, " " + layout);
166: query = queryLayout.toString();
167: System.out.println("added layout " + query);
168:
169: }
170: System.out.println(" performing query " + query);
171: //result = bean.getQueryData(query, null, 0);
172: bean.getConnection();
173: bean.makeQuery(query, 0);
174: }
175: catch (Exception e)
176: {
177: System.out.println(e.getMessage());
178: e.printStackTrace();
179: continue;
180: }
181: //beanDest.setConnection("jdbc:postgresql://erebos/test3");
182: beanDest.setConnection(destination.url);
183:
184: Statement stm = beanDest.getConnection().createStatement();
185:
186: Vector tables = beanDest.getTableNames();
187: // Collections.sort(tables);
188: System.out.println("converting table " + names.get(tbIndex) + " " + tables.indexOf(convertText((String) names.get(tbIndex)))); // "//beanDest.getTypeNames());
189: tables = beanDest.getTableNames();
190: // System.out.println(beanDest.getTableNames(beanDest.getCatalogs().get(2).toString()));
191: stm = beanDest.getConnection().createStatement();
192: // System.exit(0);
193: if (mode == Convert.DataBase.CONVERT_MODE)
194: {
195: if (tables.indexOf(names.get(tbIndex)) >= 0)
196: {
197: stm.executeUpdate("drop table " + beanDest.getQC() + names.get(tbIndex) + beanDest.getQC());
198: tables.remove((String) names.get(tbIndex));
199: System.out.println("dropped table " + names.get(tbIndex));
200: }
201: else if (tables.indexOf(convertText(names.get(tbIndex).toString())) >= 0)
202: {
203: stm.executeUpdate("drop table " + beanDest.getQC() + convertText((String) names.get(tbIndex)) + beanDest.getQC());
204: tables.remove(convertText((String) names.get(tbIndex)));
205: System.out.println("dropped table " + names.get(tbIndex));
206: }
207:
208: if (tables.indexOf(names.get(tbIndex)) < 0 && tables.indexOf(convertText(names.get(tbIndex).toString())) < 0)
209: {
210: if (creates.get(tbIndex).equals("") || creates.get(tbIndex).toString().toLowerCase().indexOf("create") < 0)
211: {
212: System.out.println("Warning empty or invalid create statement - creating one for you\n");
213:
214: command = new StringBuffer(50);
215: command.append("CREATE TABLE ");
216: command.append(beanDest.getQC());
217: command.append(convertText((String) names.get(tbIndex)));
218: command.append(beanDest.getQC());
219: command.append("(");
220: String type = null;
221: Vector columnNames = bean.getColumnNames();
222: for (int i = 0; i < columnNames.size() - 1; ++i)
223: {
224: type = bean.metaData.getColumnTypeName(i + 1);
225: // System.out.println(i+" "+result[1].get(i)+"
226: // "+type);
227: type = (type.equals("NUMBER")) ? "INT4" : type;
228: type = (type.equals("CONTAINER")) ? "TEXT" : type;
229:
230: command.append(beanDest.getQC() + convertText((String) columnNames.get(i)) + beanDest.getQC() + " " + type + ", ");
231: }
232: type = bean.metaData.getColumnTypeName(columnNames.size());
233: type = (type.equals("NUMBER")) ? "INT4" : type;
234: type = (type.equals("CONTAINER")) ? "TEXT" : type;
235: command.append(beanDest.getQC() + convertText((String) columnNames.get(columnNames.size() - 1)) + beanDest.getQC() + " " + type);
236: command.append(" )");
237: }
238: else
239: command = new StringBuffer().append(creates.get(tbIndex).toString());
240:
241: System.out.println(command);
242: // System.exit(0);
243: //command.append(DBBean.getQC());
244: stm.executeUpdate(command.toString());
245:
246: }
247: }
248: Vector row = null;
249: command = new StringBuffer();
250:
251: command.append("INSERT INTO ");
252: command.append(beanDest.getQC());
253: command.append(convertText((String) names.get(tbIndex)));
254: command.append(beanDest.getQC());
255: command.append(" values ( ");
256:
257: for (int i = 0; i < bean.getColumnNames().size() - 1; ++i)
258: command.append("?,");
259: command.append("?)");
260: PreparedStatement pstm = beanDest.getConnection().prepareStatement(command.toString());
261: System.out.println(command);
262: while ((row = bean.getNextRow()) != null)
263: {
264: //print rows
265: Object obj = null;
266: for (int k = 0; k < row.size(); ++k)
267: {
268: obj = row.get(k);
269: if (obj instanceof ArrayList)
270: obj = formatFileMakerArray((List) obj, "\n");
271: String str = (obj == null) ? "NULL" : obj.toString();
272: if (!str.equals("NULL"))
273: pstm.setString(k + 1, str);
274: else
275: pstm.setNull(k + 1, Types.NULL);
276: }
277: pstm.execute();
278:
279: } // to for loop
280:
281: }
282: }
283: catch (Exception e)
284: {
285: System.out.println("Error while connecting to database " + e);
286: //dialog.setVisible(false);
287: //dialog.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
288: //FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
289: java.io.ByteArrayOutputStream b = new java.io.ByteArrayOutputStream();
290: java.io.PrintStream stream = new java.io.PrintStream(b);
291: stream.print(command + "\n\n");
292: e.printStackTrace(stream);
293: System.err.println(b);
294: //FM2SQL.showErrorDialog(b.toString(), "Error occured !");
295:
296: }
297: // dialog.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
298: //FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
299:
300: // dialog.setVisible(false);
301: }
302:
303: public static String formatFileMakerArray(List list, String delimiter)
304: {
305: StringBuffer formattedString = new StringBuffer();
306: for (int i = 0; i < list.size(); ++i)
307: {
308: formattedString.append(list.get(i).toString());
309: if (i < list.size() - 1)
310: formattedString.append(delimiter);
311: }
312: return formattedString.toString();
313: }
314:
315: /**
316: * Method for SQL UPDATE
317: *
318: * @param source
319: * @param destination
320: * @param names
321: * @param layouts
322: * @param selects
323: * @param creates
324: * @param ids
325: * @param mode
326: * @throws Exception
327: */
328: public static void update(String source, String destination, Vector names, Vector layouts, Vector selects, Vector creates, Vector ids, int mode) throws Exception
329: {
330:
331: FM2SQL.ProgressDialog dialog = null;
332: if (FM2SQL.fmInstance != null)
333: {
334: dialog = new FM2SQL.ProgressDialog(FM2SQL.fmInstance, bean);
335: dialog.setTitle("Conversion running ...");
336: dialog.title.setText("Getting table data ...");
337: dialog.setLocation(FM2SQL.fmInstance.getLocationOnScreen().x + (FM2SQL.fmInstance.getWidth() - 400) / 2, FM2SQL.fmInstance.getLocationOnScreen().y + (FM2SQL.fmInstance.getHeight() - 250) / 2);
338: dialog.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
339: FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
340: dialog.thread = Thread.currentThread();
341: }
342: // setting user and passwd
343: bean.setUserAndPasswd(user, passwd);
344: // setting user and passwd
345: beanDest.setUserAndPasswd(userDest, passwdDest);
346: if (dialog != null)
347: dialog.setSize(400, 250);
348: StringBuffer command = null;
349: String query = null;
350: try
351: {
352: //bean.setConnection("jdbc:fmpro:http://141.14.237.74:8050");
353: //bean.setConnection("jdbc:postgresql://erebos/test","postgres","rogo");
354: bean.setConnection(source);
355: if (names == null)
356: names = bean.getTableNames();
357: // Collections.sort(names);
358: int tbIndex = 1;
359:
360: // System.out.println("Start at
361: // "+names.indexOf("archimedes_facsimiles"));
362: for (tbIndex = 0; tbIndex < names.size(); ++tbIndex)
363: {
364: Vector[] result = null;
365: String destTableName = "";
366: try
367: {
368: query = "select * from " + bean.getQC() + names.get(tbIndex).toString() + bean.getQC();
369: String layout = (layouts.isEmpty()) ? "" : layouts.get(tbIndex).toString();
370: query = (selects != null) ? selects.get(tbIndex).toString() : query;
371: //if vectors[1].get(i) != null)
372: if (layout != "")
373: {
374: layout = " layout " + bean.getQC() + layout + bean.getQC();
375: String name = names.get(tbIndex).toString();
376: StringBuffer queryLayout = new StringBuffer(query);
377: queryLayout.insert(queryLayout.indexOf(name) + name.length() + 1, " " + layout);
378: query = queryLayout.toString();
379: System.out.println("added layout " + query);
380:
381: }
382: if (dialog != null)
383: {
384: dialog.title.setText("Getting table data ...");
385: dialog.table.setText(names.get(tbIndex).toString());
386: dialog.status.setText("Table " + (tbIndex + 1) + " of " + names.size());
387: dialog.show();
388: }
389: bean.getConnection();
390: bean.makeQuery(query, 0);
391:
392: }
393: catch (Exception e)
394: {
395: continue;
396: }
397: // determine destTableName from createStatement or from source
398: // table name
399: if (!creates.get(tbIndex).equals(""))
400: {
401: String create = creates.get(tbIndex).toString().toLowerCase();
402: int fromIndex = create.indexOf("table") + 5;
403: int toIndex = create.indexOf("(");
404: destTableName = create.substring(fromIndex, toIndex).replaceAll(beanDest.getQC(), "").trim();
405: System.out.println("destTable " + destTableName);
406:
407: }
408: else
409: destTableName = convertText(names.get(tbIndex).toString());
410:
411: //beanDest.setConnection("jdbc:postgresql://erebos/test3");
412: beanDest.setConnection(destination);
413:
414: Statement stm = beanDest.getConnection().createStatement();
415:
416: Vector tables = beanDest.getTableNames();
417: // Collections.sort(tables);
418: System.out.println(names.get(tbIndex) + " " + tables.indexOf(convertText((String) names.get(tbIndex)))); // "//beanDest.getTypeNames());
419: tables = beanDest.getTableNames();
420: // System.out.println(beanDest.getTableNames(beanDest.getCatalogs().get(2).toString()));
421: stm = beanDest.getConnection().createStatement();
422: // System.exit(0);
423:
424: if (dialog != null)
425: dialog.title.setText("Updating table data ...");
426:
427: int j = -1;
428:
429: Vector row = null;
430: command = new StringBuffer();
431:
432: command.append("UPDATE ");
433: command.append(beanDest.getQC());
434: command.append(destTableName);
435: //command.append(convertText((String) names.get(tbIndex)));
436: command.append(beanDest.getQC());
437: command.append(" SET ");
438:
439: int size = bean.getColumnNames().size();
440: for (int i = 0; i < size - 1; ++i)
441: command.append(beanDest.getQC() + convertText((String) bean.getColumnNames().get(i)) + beanDest.getQC() + " = ? ,");
442: command.append(convertText((String) bean.getColumnNames().get(size - 1)) + " = ? ");
443: command.append("WHERE " + convertText(ids.get(tbIndex).toString()) + " = ?");
444: PreparedStatement pstm = beanDest.getConnection().prepareStatement(command.toString());
445: System.out.println(command + " " + tbIndex);
446: int rowCount = bean.getRowCount(query);
447: int idIndex = bean.getColumnNames().indexOf(ids.get(tbIndex));
448: while ((row = bean.getNextRow()) != null)
449: {
450: j++;
451: //print rows
452: Object obj = null;
453: /*
454: * for(int k=0;k <row.size()-1;++k) { obj = row.get(k);
455: * //System.out.println("row "+obj+" "+k); if(obj!=null&&!(obj
456: * instanceof ArrayList))
457: * command.append("'"+convertUml(obj.toString())+"',"); else
458: * if(obj!=null&& obj instanceof ArrayList)
459: * command.append("'"+convertUml(((ArrayList)obj).get(0).toString())+"',");
460: * else command.append("NULL,"); } obj = row.get(row.size() - 1); if
461: * (obj != null && !(obj instanceof ArrayList))
462: * command.append("'"+convertUml(obj.toString())+"')"); else
463: * if(obj!=null&& obj instanceof ArrayList)
464: * command.append("'"+convertUml(((ArrayList)obj).get(0).toString())+"')");
465: * //command.append(obj.toString()+")"); else command.append("NULL)");
466: */
467: //command.append("'"+row.get(row.size()-1)+"')");
468: //command.append(" )");
469: // for(int k=0;k<row.size();++k)
470: // System.out.println();
471: // System.out.println(command+" "+j+" "+row.size()+" "+
472: // ((Vector)result2[0].get(j)).size());
473: // System.out.println(command);
474: for (int k = 0; k < row.size(); ++k)
475: {
476: obj = row.get(k);
477: if (obj instanceof ArrayList)
478: obj = ((List) obj).get(0);
479: String str = (obj == null) ? "NULL" : obj.toString();
480: if (!str.equals("NULL"))
481: pstm.setString(k + 1, str);
482: else
483: pstm.setNull(k + 1, Types.NULL);
484: }
485: pstm.setString(row.size() + 1, row.get(idIndex).toString());
486: //System.out.println(pstm.toString());
487: // System.exit(0);
488: pstm.execute();
489: //stm.executeUpdate(command.toString());
490: if (dialog != null)
491: dialog.progress.setValue((int) (((double) (j + 1) / (double) rowCount) * 100.0));
492: // System.out.println(
493: // (int)(((double)(j+1)/(double)result[0].size())*100.0)+"
494: // "+result[0].size()+" "+j);
495: command = null;
496: } // to for loop
497:
498: }
499: }
500: catch (Exception e)
501: {
502: System.out.println("Error while connecting to database " + e);
503: if (dialog != null)
504: {
505: dialog.setVisible(false);
506: dialog.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
507: FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
508: }
509: java.io.ByteArrayOutputStream b = new java.io.ByteArrayOutputStream();
510: java.io.PrintStream stream = new java.io.PrintStream(b);
511: stream.print(command + "\n\n");
512: e.printStackTrace(stream);
513: FM2SQL.showErrorDialog(b.toString(), "Error occured !");
514:
515: }
516: if (dialog != null)
517: {
518: dialog.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
519: FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
520:
521: dialog.setVisible(false);
522: }
523:
524: }
525:
526: /**
527: * transfers the specified array of tables to the destination database and
528: * creates the table if it does not exist if it exists and mode is not append
529: * the table is dropped
530: *
531: * @param source
532: * @param destination
533: * @param names
534: * @param layouts
535: * @param selects
536: * @param creates
537: * @param ids
538: * @param mode
539: * @throws Exception
540: */
541:
542: public static void convert(String source, String destination, Vector names, Vector layouts, Vector selects, Vector creates, Vector ids, int mode, String delimiter) throws Exception
543: {
544:
545: FM2SQL.ProgressDialog dialog = null;
546:
547: if (FM2SQL.fmInstance != null)
548: {
549: dialog = new FM2SQL.ProgressDialog(FM2SQL.fmInstance, bean);
550: dialog.setTitle("Conversion running ...");
551: dialog.title.setText("Getting table data ...");
552: dialog.setLocation(FM2SQL.fmInstance.getLocationOnScreen().x + (FM2SQL.fmInstance.getWidth() - 400) / 2, FM2SQL.fmInstance.getLocationOnScreen().y + (FM2SQL.fmInstance.getHeight() - 250) / 2);
553: dialog.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
554: FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
555: dialog.thread = Thread.currentThread();
556: dialog.setSize(400, 250);
557: }
558: java.util.TreeSet myIds = new TreeSet();
559: int deltaID = 1;
560: String idField = "";
561: String destTableName = "";
562: String[] fieldNames = null;
563: if (source != null && destination != null)
564: {
565: // setting user and passwd
566: bean.setUserAndPasswd(user, passwd);
567: // setting user and passwd
568: beanDest.setUserAndPasswd(userDest, passwdDest);
569: }
570: StringBuffer command = null;
571: String query = null;
572: try
573: {
574: if (source != null)
575: bean.setConnection(source);
576: else
577: bean.setConnection(bean.url);
578:
579: if (names == null)
580: names = bean.getTableNames();
581: // Collections.sort(names);
582: int tbIndex = 1;
583:
584: // System.out.println("Start at
585: // "+names.indexOf("archimedes_facsimiles"));
586: for (tbIndex = 0; tbIndex < names.size(); ++tbIndex)
587: {
588: Vector[] result = null;
589: try
590: {
591: query = "select * from " + bean.getQC() + names.get(tbIndex).toString() + bean.getQC();
592: String layout = (layouts.isEmpty()) ? "" : layouts.get(tbIndex).toString();
593: query = (selects != null) ? selects.get(tbIndex).toString() : query;
594: //if vectors[1].get(i) != null)
595: if (layout != "")
596: {
597: layout = " layout " + bean.getQC() + layout + bean.getQC();
598: String name = names.get(tbIndex).toString();
599: StringBuffer queryLayout = new StringBuffer(query);
600: queryLayout.insert(queryLayout.indexOf(name) + name.length() + 1, " " + layout);
601: query = queryLayout.toString();
602: System.out.println("added layout " + query);
603:
604: }
605: // if ( layout!= "")
606: // query += " layout " + bean.getQC() + layout +
607: // bean.getQC();
608: if (dialog != null)
609: {
610: dialog.title.setText("Reading table data ...");
611: dialog.table.setText(names.get(tbIndex).toString());
612: dialog.status.setText("Table " + (tbIndex + 1) + " of " + names.size());
613: dialog.show();
614: }
615: //result = bean.getQueryData(query, dialog, 0);
616: bean.getConnection();
617: bean.makeQuery(query, 50);
618: idField = ids.get(tbIndex).toString();
619:
620: }
621: catch (Exception e)
622: {
623: System.out.println(e);
624: continue;
625: }
626: if (destination != null)
627: beanDest.setConnection(destination);
628: else
629: beanDest.setConnection(beanDest.url);
630: Statement stm = beanDest.getConnection().createStatement();
631:
632: Vector tables = beanDest.getTableNames();
633: // Collections.sort(tables);
634: System.out.println(names.get(tbIndex) + " " + tables.indexOf(convertText((String) names.get(tbIndex)))); // "//beanDest.getTypeNames());
635: tables = beanDest.getTableNames();
636: // System.out.println(beanDest.getTableNames(beanDest.getCatalogs().get(2).toString()));
637: stm = beanDest.getConnection().createStatement();
638: // System.exit(0);
639:
640: // determine destTableName from createStatement or from source
641: // table name
642: ConversionProperties prop = getFieldNamesAndDestTableName(creates.get(tbIndex).toString(), query, names.get(tbIndex).toString());
643: destTableName = prop.destTableName;
644: fieldNames = prop.fieldNames;
645: if (mode == Convert.DataBase.CONVERT_MODE)
646: {
647:
648: if (tables.indexOf(destTableName) >= 0)
649: {
650: stm.executeUpdate("drop table " + beanDest.getQC() + destTableName + beanDest.getQC());
651: tables.remove(destTableName);
652: System.out.println("dropped table" + destTableName);
653:
654: }
655: /*
656: * if(destTableName.equals("")) if (tables.indexOf(names.get(tbIndex)) >=
657: * 0) { stm.executeUpdate("drop table " + beanDest.getQC() +
658: * names.get(tbIndex) + beanDest.getQC()); tables.remove((String)
659: * names.get(tbIndex)); System.out.println("dropped table" +
660: * names.get(tbIndex)); } else if
661: * (tables.indexOf(convertText(names.get(tbIndex).toString())) >= 0) {
662: * stm.executeUpdate("drop table " + beanDest.getQC() +
663: * convertText((String) names.get(tbIndex)) + beanDest.getQC());
664: * tables.remove(convertText((String) names.get(tbIndex)));
665: * System.out.println("dropped table" + names.get(tbIndex)); }
666: */
667: if ((tables.indexOf(destTableName) < 0)) //&&
668: // tables.indexOf(names.get(tbIndex))
669: // < 0 &&
670: // tables.indexOf(convertText(names.get(tbIndex).toString()))
671: // < 0 )
672: {
673:
674: if (creates.get(tbIndex).equals("") || creates.get(tbIndex).toString().toLowerCase().indexOf("create") < 0)
675: {
676: System.out.println("Warning empty or invalid create statement - creating one for you\n");
677:
678: command = new StringBuffer(50);
679: command.append("CREATE TABLE ");
680: command.append(beanDest.getQC());
681: command.append(convertText((String) names.get(tbIndex)));
682: command.append(beanDest.getQC());
683: command.append("(");
684: String type = null;
685: Vector columnNames = bean.getColumnNames();
686: for (int i = 0; i < columnNames.size() - 1; ++i)
687: {
688: type = bean.metaData.getColumnTypeName(i + 1);
689: // System.out.println(i+" "+result[1].get(i)+"
690: // "+type);
691: type = (type.equals("NUMBER")) ? "INT4" : type;
692: type = (type.equals("CONTAINER")) ? "TEXT" : type;
693:
694: command.append(beanDest.getQC() + convertText((String) columnNames.get(i)) + beanDest.getQC() + " " + type + ", ");
695: }
696: type = bean.metaData.getColumnTypeName(columnNames.size());
697: type = (type.equals("NUMBER")) ? "INT4" : type;
698: type = (type.equals("CONTAINER")) ? "TEXT" : type;
699: command.append(beanDest.getQC() + convertText((String) columnNames.get(columnNames.size() - 1)) + beanDest.getQC() + " " + type);
700: command.append(" )");
701:
702: // System.out.println(command);
703: // System.exit(0);
704: //command.append(DBBean.getQC());
705: }
706: else
707: command = new StringBuffer().append(creates.get(tbIndex).toString().toLowerCase());
708: stm.executeUpdate(command.toString());
709:
710: }
711: }
712: if (dialog != null)
713: dialog.title.setText("Writing table data ...");
714:
715: // prepare the insert statement
716: int j = -1;
717: Vector row = null;
718: command = new StringBuffer();
719:
720: command.append("INSERT INTO ");
721: command.append(beanDest.getQC());
722: command.append(destTableName); //convertText((String)
723: // names.get(tbIndex)));
724: command.append(beanDest.getQC());
725: command.append(" (");
726: for (int i = 0; i < fieldNames.length; i++)
727: {
728: command.append(fieldNames[i]);
729: if (i < fieldNames.length - 1)
730: command.append(",");
731: }
732: command.append(") ");
733:
734: command.append(" values ( ");
735:
736: // add a question marks for every field
737: for (int i = 0; i < bean.getColumnNames().size() - 1; ++i)
738: command.append("?,");
739: command.append("?)");
740: PreparedStatement pstm = beanDest.getConnection().prepareStatement(command.toString());
741: System.out.println(command);
742: int rowCount = (idField != "") ? myIds.size() : bean.getRowCount(query);
743: Vector vec = new Vector(myIds);
744: int endIndex = -1;
745: String tempQuery = query;
746: String tempID = bean.getQC() + idField + bean.getQC();
747: // if id_field not do incremental conversion else do it all at
748: // once
749: if (!idField.equals(""))
750: {
751: long startTime = System.currentTimeMillis();
752: int counter = -1;
753: while (true)
754: {
755: ++counter;
756: if (counter == 0 && dialog != null)
757: dialog.title.setText("Check if data is available");
758: else if (dialog != null)
759: dialog.title.setText("Check if more data is available");
760: myIds = bean.getIDVector(ids.get(tbIndex).toString(), (String) names.get(tbIndex), tempQuery, numHits);
761: if (myIds.isEmpty())
762: break;
763: vec = new Vector(myIds);
764: rowCount = vec.size();
765: System.out.println("ID LIST SIZE " + Math.round((double) myIds.size() / (double) numIntervalls) + " " + myIds.size());
766: deltaID = (int) Math.round((double) myIds.size() / (double) numIntervalls);
767: if (vec.size() <= numIntervalls)
768: {
769: endIndex = 0;
770: deltaID = vec.size();
771: }
772: for (int k = 0; k < vec.size() - deltaID; k = k + deltaID)
773: {
774: System.out.println(vec.get(k) + " " + vec.get(k + deltaID) + " " + vec.lastElement());
775: if (query.indexOf("where") > 0)
776: tempQuery = query + " and " + tempID + ">='" + vec.get(k) + "' and " + tempID + "<='" + vec.get(k + deltaID) + "'";
777: else
778: tempQuery = query + " where " + tempID + ">='" + vec.get(k) + "' and " + tempID + "<='" + vec.get(k + deltaID) + "'";
779: System.out.println(tempQuery);
780: if (dialog != null)
781: dialog.title.setText("Reading table data ...");
782:
783: bean.makeQuery(tempQuery, deltaID);
784: if (dialog != null)
785: dialog.title.setText("Writing table data ...");
786:
787: command = writeDatainDestTable(dialog, command, k, pstm, rowCount, delimiter);
788: endIndex = k + deltaID;
789: }
790: System.out.println(endIndex);
791: //all data written ? if not write last chunk of data
792: if (endIndex == vec.size() - 1)
793: System.out.println("fits");
794: else
795: {
796: System.out.println(" last intervall from " + vec.get(endIndex) + " " + vec.lastElement());
797:
798: if (query.indexOf("where") > 0)
799: tempQuery = query + " and " + tempID + ">='" + vec.get(endIndex) + "' and " + tempID + "<='" + vec.lastElement() + "'";
800: else
801: tempQuery = query + " where " + tempID + ">='" + vec.get(endIndex) + "' and " + tempID + "<='" + vec.lastElement() + "'";
802: System.out.println(tempQuery);
803: if (dialog != null)
804: dialog.title.setText("Reading table data ...");
805: bean.makeQuery(tempQuery, 0);
806: if (dialog != null)
807: dialog.title.setText("Writing table data ...");
808: command = writeDatainDestTable(dialog, command, endIndex, pstm, rowCount, delimiter);
809: }
810: // prepare new query for next chunk
811: if (query.indexOf("where") > 0)
812: tempQuery = query + " and " + tempID + ">'" + vec.lastElement() + "'";
813: else
814: tempQuery = query + " where " + tempID + ">'" + vec.lastElement() + "'";
815:
816: }
817: long endTime = System.currentTimeMillis();
818: System.out.println("Time for incremental convert elapsed " + (endTime - startTime));
819: }
820: else
821: {
822: // read and write all in one big chunk
823: long startTime = System.currentTimeMillis();
824:
825: bean.makeQuery(query, 0);
826: command = writeDatainDestTable(dialog, command, j, pstm, rowCount, delimiter);
827: long endTime = System.currentTimeMillis();
828: System.out.println("Time for old convert elapsed " + (endTime - startTime));
829:
830: }
831: }
832: }
833: catch (Exception e)
834: {
835: System.out.println("Error while connecting to database " + e);
836: if (dialog != null)
837: {
838: dialog.setVisible(false);
839: dialog.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
840: FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
841: java.io.ByteArrayOutputStream b = new java.io.ByteArrayOutputStream();
842: java.io.PrintStream stream = new java.io.PrintStream(b);
843: stream.print(command + "\n\n");
844: e.printStackTrace(stream);
845: FM2SQL.showErrorDialog(b.toString(), "Error occured !");
846: }
847: else
848: {
849: e.printStackTrace();
850:
851: }
852: }
853: if (dialog != null)
854: {
855: dialog.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
856: FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
857: dialog.setVisible(false);
858: }
859: }
860:
861: /**
862: * Writes data to the destination table
863: *
864: * @param dialog
865: * progress dialog
866: * @param command
867: * @param j
868: * data index for progress bar
869: * @param pstm
870: * prepared statement
871: * @param rowCount
872: * number of datasets
873: * @return command
874: * @throws Exception
875: * @throws SQLException
876: */
877: private static StringBuffer writeDatainDestTable(FM2SQL.ProgressDialog dialog, StringBuffer command, int j, PreparedStatement pstm, int rowCount, String delimiter) throws Exception, SQLException
878: {
879: Vector row;
880: while ((row = bean.getNextRow()) != null)
881: {
882: j++;
883: // row = (Vector) result[0].get(j);
884: /*
885: * command = new StringBuffer();
886: *
887: * command.append("INSERT INTO "); command.append(beanDest.getQC());
888: * command.append(convertText((String) names.get(tbIndex)));
889: * command.append(beanDest.getQC()); command.append(" values ( ");
890: */
891: //print rows
892: Object obj = null;
893: /*
894: * for(int k=0;k <row.size()-1;++k) { obj = row.get(k);
895: * //System.out.println("row "+obj+" "+k); if(obj!=null&&!(obj instanceof
896: * ArrayList)) command.append("'"+convertUml(obj.toString())+"',"); else
897: * if(obj!=null&& obj instanceof ArrayList)
898: * command.append("'"+convertUml(((ArrayList)obj).get(0).toString())+"',");
899: * else command.append("NULL,"); } obj = row.get(row.size() - 1); if (obj !=
900: * null && !(obj instanceof ArrayList))
901: * command.append("'"+convertUml(obj.toString())+"')"); else
902: * if(obj!=null&& obj instanceof ArrayList)
903: * command.append("'"+convertUml(((ArrayList)obj).get(0).toString())+"')");
904: * //command.append(obj.toString()+")"); else command.append("NULL)");
905: */
906: //command.append("'"+row.get(row.size()-1)+"')");
907: //command.append(" )");
908: // for(int k=0;k<row.size();++k)
909: // System.out.println();
910: // System.out.println(command+" "+j+" "+row.size()+" "+
911: // ((Vector)result2[0].get(j)).size());
912: // System.out.println(command);
913: for (int k = 0; k < row.size(); ++k)
914: {
915: obj = row.get(k);
916:
917: if (obj instanceof ArrayList)
918: obj = formatFileMakerArray((List) obj, delimiter);
919:
920: String str = (obj == null) ? "NULL" : obj.toString();
921: if (obj instanceof Double)
922: {
923: pstm.setDouble(k + 1, ((Double) obj).doubleValue());
924: }
925: else if (!str.equals("NULL"))
926: pstm.setString(k + 1, str);
927: else
928: pstm.setNull(k + 1, Types.NULL);
929: }
930: pstm.execute();
931: //stm.executeUpdate(command.toString());
932: if (dialog != null)
933: dialog.progress.setValue((int) (((double) (j + 1) / (double) rowCount) * 100.0));
934: // System.out.println(
935: // (int)(((double)(j+1)/(double)result[0].size())*100.0)+"
936: // "+result[0].size()+" "+j);
937: command = null;
938: } // to while loop
939: return command;
940: }
941:
942: /**
943: * removes special characters from the input string as well as .fp5
944: *
945: * @param newName
946: * String to change
947: * @return
948: */
949: public static String convertText(String newName)
950: {
951: StringBuffer alterMe = new StringBuffer(newName.trim().toLowerCase());
952: int length = alterMe.length();
953: int j = 0;
954: int index = alterMe.indexOf(".fp5");
955: if (index >= 0)
956: {
957: alterMe.delete(index, index + 4);
958: length = length - 4;
959: }
960:
961: while (j < length)
962: {
963: if (alterMe.charAt(j) == ' ')
964: {
965: alterMe.setCharAt(j, '_');
966: // if(j<length-1) j=j+1;
967: }
968: else if (alterMe.charAt(j) == '_')
969: {
970:
971: if (alterMe.charAt(j + 1) == '_')
972: alterMe.deleteCharAt(j);
973: length = length - 1;
974: // if(j<length-1) j=j+1;
975: }
976: else if (alterMe.charAt(j) == 'ä')
977: {
978: alterMe.setCharAt(j, 'a');
979: alterMe.insert(j + 1, "e");
980: length = length + 1;
981: if (j < length - 1)
982: j = j + 1;
983: }
984: else if (alterMe.charAt(j) == 'ö')
985: {
986: alterMe.setCharAt(j, 'o');
987: alterMe.insert(j + 1, "e");
988: length = length + 1;
989: if (j < length - 1)
990: j = j + 1;
991: }
992: else if (alterMe.charAt(j) == 'ü')
993: {
994: alterMe.setCharAt(j, 'u');
995: alterMe.insert(j + 1, "e");
996: length = length + 1;
997: if (j < length - 1)
998: j = j + 1;
999: }
1000: else if (alterMe.charAt(j) == 'ß')
1001: {
1002: alterMe.setCharAt(j, 's');
1003: alterMe.insert(j + 1, "s");
1004: length = length + 1;
1005: if (j < length - 1)
1006: j = j + 1;
1007: }
1008: else if (alterMe.charAt(j) == ':')
1009: {
1010: if (j < length - 1)
1011: {
1012: if (alterMe.charAt(j + 1) == ':')
1013: {
1014: alterMe.setCharAt(j, '_');
1015: alterMe.delete(j + 1, j + 2);
1016: length = length - 1;
1017:
1018: }
1019:
1020: if (j < length - 1)
1021: j = j + 1;
1022: }
1023: }
1024: else if (alterMe.charAt(j) == '-')
1025: {
1026: alterMe.setCharAt(j, '_');
1027:
1028: }
1029: else if (alterMe.charAt(j) == '?')
1030: {
1031: // changed ? to _ because of update statement
1032: alterMe.setCharAt(j, '_');
1033: // length = length + 1;
1034: // j=j+1;
1035: System.out.println(alterMe);
1036: }
1037: else if (alterMe.charAt(j) == '.')
1038: {
1039: if (j == length - 1)
1040: {
1041: alterMe.delete(j, j);
1042: length--;
1043: }
1044: else
1045: alterMe.setCharAt(j, '_');
1046: }
1047:
1048: ++j;
1049: }
1050: return alterMe.toString();
1051: }
1052:
1053: /**
1054: * Converts > and < in an entity (> or <)
1055: *
1056: * @param newName
1057: * @return
1058: */
1059: public static String convertToEntities(String newName)
1060: {
1061: StringBuffer alterMe = new StringBuffer(newName.trim());
1062: int length = alterMe.length();
1063: int j = 0;
1064:
1065: while (j < length)
1066: {
1067:
1068: if (alterMe.charAt(j) == '>')
1069: {
1070: alterMe.setCharAt(j, '&');
1071: alterMe.insert(j + 1, "gt;");
1072: length = length + 2;
1073: if (j < length - 1)
1074: j = j + 1;
1075:
1076: }
1077: else if (alterMe.charAt(j) == '<')
1078: {
1079: alterMe.setCharAt(j, '&');
1080: alterMe.insert(j + 1, "lt;");
1081: length = length + 2;
1082: if (j < length - 1)
1083: j = j + 1;
1084:
1085: }
1086: ++j;
1087: }
1088: return alterMe.toString();
1089: }
1090:
1091: /**
1092: * Masks the single quote character '-->\'
1093: *
1094: * @param newName
1095: * @return
1096: */
1097: public static String convertUml(String newName)
1098: {
1099: StringBuffer alterMe = new StringBuffer(newName.trim());
1100: int length = alterMe.length();
1101: int j = 0;
1102:
1103: while (j < length)
1104: {
1105:
1106: if (alterMe.charAt(j) == '\'')
1107: {
1108: alterMe.setCharAt(j, '\\');
1109: alterMe.insert(j + 1, "'");
1110: length = length + 1;
1111: if (j < length - 1)
1112: j = j + 1;
1113: }
1114: /*
1115: * else if (alterMe.charAt(j) == '"') { alterMe.setCharAt(j, '\\');
1116: * alterMe.insert(j + 1, "\""); length = length + 1; if(j <length-1)
1117: * j=j+1; } else if (alterMe.charAt(j) == '>') { alterMe.setCharAt(j,
1118: * '\\'); alterMe.insert(j + 1, ">"); length = length + 1; if(j <length-1)
1119: * j=j+1; } else if (alterMe.charAt(j) == ' <') { alterMe.setCharAt(j,
1120: * '\\'); alterMe.insert(j + 1, " <"); length = length + 1; if(j
1121: * <length-1) j=j+1; } else if (alterMe.charAt(j) == '?') {
1122: * alterMe.setCharAt(j, '\\'); alterMe.insert(j + 1, "?"); length = length +
1123: * 1; if(j <length-1) j=j+1; } else if (alterMe.charAt(j) == '&') {
1124: * alterMe.setCharAt(j, '\\'); alterMe.insert(j + 1, "&"); length = length +
1125: * 1; if(j <length-1) j=j+1; } else if (alterMe.charAt(j) == '=') {
1126: * alterMe.setCharAt(j, '\\'); alterMe.insert(j + 1, "="); length = length +
1127: * 1; if(j <length-1) j=j+1; } else if (alterMe.charAt(j) == ',') {
1128: * alterMe.setCharAt(j, '\\'); alterMe.insert(j + 1, ","); length = length +
1129: * 1; if(j <length-1) j=j+1; } else if (alterMe.charAt(j) == '.') {
1130: * alterMe.setCharAt(j, '\\'); alterMe.insert(j + 1, "."); length = length +
1131: * 1; if(j <length-1) j=j+1; } else if (alterMe.charAt(j) == '[') {
1132: * alterMe.setCharAt(j, '\\'); alterMe.insert(j + 1, "."); length = length +
1133: * 1; if(j <length-1) j=j+1; } else if (alterMe.charAt(j) == ']') {
1134: * alterMe.setCharAt(j, '\\'); alterMe.insert(j + 1, "."); length = length +
1135: * 1; if(j <length-1) j=j+1; } else if (alterMe.charAt(j) == '%') {
1136: * alterMe.setCharAt(j, '\\'); alterMe.insert(j + 1, "%"); length = length +
1137: * 1; if(j <length-1) j=j+1; }
1138: */
1139: ++j;
1140: }
1141: return alterMe.toString();
1142: }
1143:
1144: /**
1145: * parses the input xml file for batch conversion called from readXMLFile *
1146: *
1147: * @param sb
1148: */
1149: public static void parseXMLConfig(StringBuffer sb)
1150: {
1151: boolean finished = false;
1152: // parse string and build document tree
1153: Xparse parser = new Xparse();
1154: parser.changeEntities = true;
1155: Node root = parser.parse(sb.toString());
1156: // printContents(root);
1157: Vector databases = new Vector();
1158: Vector tables = new Vector();
1159: Vector layouts = new Vector();
1160: Vector selects = new Vector();
1161: Vector creates = new Vector();
1162: Vector ids = new Vector();
1163: Vector indexListVec = new Vector();
1164: String delimiter = "|";
1165: int mode = -1;
1166:
1167: try
1168: {
1169: Node tempNode = root.find("convert/source", new int[]
1170: {1, 1});
1171: if (tempNode == null)
1172: throw new Error("parse error source tag missing");
1173: System.out.println(tempNode.name);
1174: int length = countNodes(tempNode);
1175: for (int i = 1; i <= length; i++)
1176: {
1177:
1178: DBBean database = new DBBean();
1179: tables = new Vector();
1180: layouts = new Vector();
1181: selects = new Vector();
1182: creates = new Vector();
1183: ids = new Vector();
1184: indexListVec = new Vector();
1185: // parse dataBase
1186: Node node = root.find("convert/source/database/url", new int[]
1187: {1, 1, i, 1});
1188: Node node1 = root.find("convert/source/database/user", new int[]
1189: {1, 1, i, 1, 1});
1190: Node node2 = root.find("convert/source/database/password", new int[]
1191: {1, 1, i, 1, 1});
1192: Node node3 = root.find("convert/source/database", new int[]
1193: {1, 1, i});
1194: Node nodeMode = root.find("convert/source/database/mode", new int[]
1195: {1, 1, i, 1, 1});
1196: Node delimiterNode = root.find("convert/source/database/delimiter", new int[]
1197: {1, 1, i, 1, 1});
1198: Node useNormanToUnicodeMapper = root.find("convert/source/database/usenormantounicodemapper", new int[]
1199: {1, 1, i, 1, 1});
1200:
1201: if (node3 == null)
1202: throw new Error("parse error database tag missing");
1203: if (node == null)
1204: throw new Error("parse error url tag missing");
1205: if (node1 == null)
1206: throw new Error("parse error user tag missing");
1207: if (node2 == null)
1208: throw new Error("parse error password tag missing");
1209: if (delimiterNode != null)
1210: delimiter = delimiterNode.getCharacters();
1211: if (useNormanToUnicodeMapper != null)
1212: {
1213: database.setUseNormanToUnicodeMapper(Boolean.valueOf(useNormanToUnicodeMapper.getCharacters()).booleanValue());
1214: System.out.println("useMapper " + Boolean.valueOf(useNormanToUnicodeMapper.getCharacters().trim()).booleanValue());
1215: }
1216:
1217: String url = node.getCharacters();
1218: String user = node1.getCharacters();
1219: String password = node2.getCharacters();
1220: database.setURL(url.trim());
1221: database.setUserAndPasswd(user.trim(), password.trim());
1222: System.out.println(node.name + " " + node.getCharacters());
1223: System.out.println(node1.name + " " + node1.getCharacters());
1224: System.out.println(node2.name + " " + node2.getCharacters());
1225: String modeString = "";
1226: if (nodeMode == null)
1227: modeString = "convert";
1228: else
1229: modeString = nodeMode.getCharacters();
1230: if (modeString.equals("convert"))
1231: mode = DataBase.CONVERT_MODE;
1232: else if (modeString.equals("append"))
1233: mode = DataBase.APPEND_MODE;
1234: else if (modeString.equals("update"))
1235: mode = DataBase.UPDATE_MODE;
1236: else if (modeString.equals("delete"))
1237: mode = DataBase.DELETE_MODE;
1238: else if (modeString.equals("synchronize"))
1239: mode = DataBase.SYNCHRONIZE_MODE;
1240:
1241: // if(node3!=null)
1242: // System.out.println(node3.name);
1243:
1244: int length2 = countNodes(node3);
1245:
1246: System.out.println("number of tables " + length2);
1247:
1248: for (int j = 1; j <= length2; ++j)
1249: {
1250: Node node4 = root.find("convert/source/database/table", new int[]
1251: {1, 1, i, j});
1252: Node node5 = root.find("convert/source/database/table/select", new int[]
1253: {1, 1, i, j, 1});
1254: Node node6 = root.find("convert/source/database/table/create", new int[]
1255: {1, 1, i, j, 1});
1256: if (node4 != null)
1257: System.out.println(node4.name + " " + node4.attributes.get("layout").equals(""));
1258: if (node5 != null)
1259: System.out.println(node5.name + " " + node5.getCharacters());
1260: if (node6 != null)
1261: System.out.println(node6.name + " " + node6.getCharacters());
1262: if (node4 == null)
1263: throw new Error("parse error table tag missing");
1264: // if(node5==null) throw new Error("parse error select tag
1265: // missing");
1266: // if(node6==null) throw new Error("parse error create tag
1267: // missing");
1268: String name = (String) node4.attributes.get("name");
1269: String layout = (String) node4.attributes.get("layout");
1270: String id = (String) node4.attributes.get("id");
1271: String indexList = (String) node4.attributes.get("indexList");
1272:
1273: System.out.println("id was " + id);
1274: if (name == null)
1275: throw new Error("parse error required table tag attribute name missing");
1276: if (layout == null)
1277: layout = "";
1278: if (id == null)
1279: id = "";
1280: if (indexList == null)
1281: indexList = "";
1282: if (name.equals(""))
1283: throw new Error("parse error table tag attribute must not be empty");
1284: tables.add(name);
1285: layouts.add(layout);
1286:
1287: ids.add(id);
1288: indexListVec.add(indexList);
1289: String query = (node5 == null) ? "" : node5.getCharacters();
1290: if (query.equals(""))
1291: System.err.println("Warning empty select tag or select tag missing !!");
1292: query = (query.equals("")) ? "select * from " + database.getQC() + name + database.getQC() : query;
1293: selects.add(query);
1294: if (node6 != null)
1295: creates.add(node6.getCharacters().trim());
1296: else
1297: creates.add("");
1298:
1299: }
1300: DataBase dataBase = new DataBase(database, tables, layouts, selects, creates, ids, mode);
1301: dataBase.delimiter = delimiter;
1302: dataBase.buildIndexTable(indexListVec);
1303: databases.add(dataBase);
1304: }
1305: DBBean database = new DBBean();
1306: // parse dataBase
1307: Node node = root.find("convert/destination/database/url", new int[]
1308: {1, 1, 1, 1});
1309: Node node1 = root.find("convert/destination/database/user", new int[]
1310: {1, 1, 1, 1, 1});
1311: Node node2 = root.find("convert/destination/database/password", new int[]
1312: {1, 1, 1, 1, 1});
1313: String url = node.getCharacters();
1314: String user = node1.getCharacters();
1315: String password = node2.getCharacters();
1316: System.out.println(url);
1317: database.setURL(url.trim());
1318: database.setUserAndPasswd(user.trim(), password.trim());
1319: //databases.add(database);
1320: for (Iterator iter = databases.iterator(); iter.hasNext();)
1321: {
1322: DataBase db = (DataBase) iter.next();
1323: if (mode == DataBase.CONVERT_MODE || mode == DataBase.APPEND_MODE)
1324: convertBatch(db.bean, database, db.tables, db.layouts, db.selects, db.creates, db.ids, mode, db.delimiter);
1325: else if (mode == DataBase.UPDATE_MODE)
1326: {
1327: Convert.user = db.bean.user;
1328: Convert.passwd = db.bean.passwd;
1329: userDest = database.user;
1330: passwdDest = database.passwd;
1331:
1332: update(db.bean.url, database.url, db.tables, db.layouts, db.selects, db.creates, db.ids, mode);
1333: }
1334: else if (mode == DataBase.SYNCHRONIZE_MODE)
1335: {
1336: Convert.user = db.bean.user;
1337: Convert.passwd = db.bean.passwd;
1338: userDest = database.user;
1339: passwdDest = database.passwd;
1340:
1341: synchronize(db.bean.url, database.url, db.tables, db.layouts, db.selects, db.creates, db.ids, mode, db.delimiter, new Vector(db.htIndex.values()));
1342: }
1343: }
1344: // printContents(node3);
1345: // FM2SQL.fmInstance=new FM2SQL();
1346: }
1347: catch (Exception e)
1348: {
1349:
1350: e.printStackTrace();
1351:
1352: } finally
1353: {
1354: bean.closeAllConnections();
1355: beanDest.closeAllConnections();
1356: }
1357: }
1358:
1359: public static Vector getXMLConfig(String xmlFile)
1360: {
1361: StringBuffer sb = null;
1362: try
1363: {
1364: // read XML Metadata from a file
1365: FileInputStream fi = new FileInputStream(xmlFile);
1366: InputStreamReader isr = new InputStreamReader(fi, "UTF-8");
1367: BufferedReader buffr = new BufferedReader(isr);
1368: sb = new StringBuffer();
1369: int c = 0;
1370: while ((c = buffr.read()) != -1)
1371: {
1372: char ch = (char) c;
1373: sb.append(ch);
1374: // System.out.print((char)c);
1375: }
1376:
1377: }
1378: catch (Exception e)
1379: {
1380: e.printStackTrace();
1381: }
1382:
1383: boolean finished = false;
1384: // parse string and build document tree
1385: Xparse parser = new Xparse();
1386: parser.changeEntities = true;
1387: Node root = parser.parse(sb.toString());
1388: // printContents(root);
1389: Vector databases = new Vector();
1390: Vector tables = new Vector();
1391: Vector layouts = new Vector();
1392: Vector selects = new Vector();
1393: Vector creates = new Vector();
1394: Vector ids = new Vector();
1395: String delimiter = "|";
1396: int mode = -1;
1397: try
1398: {
1399: Node tempNode = root.find("convert/source", new int[]
1400: {1, 1});
1401: if (tempNode == null)
1402: throw new Error("parse error source tag missing");
1403: System.out.println(tempNode.name);
1404: int length = countNodes(tempNode);
1405: for (int i = 1; i <= length; i++)
1406: {
1407:
1408: DBBean database = new DBBean();
1409: tables = new Vector();
1410: layouts = new Vector();
1411: selects = new Vector();
1412: creates = new Vector();
1413: ids = new Vector();
1414: // parse dataBase
1415: Node node = root.find("convert/source/database/url", new int[]
1416: {1, 1, i, 1});
1417: Node node1 = root.find("convert/source/database/user", new int[]
1418: {1, 1, i, 1, 1});
1419: Node node2 = root.find("convert/source/database/password", new int[]
1420: {1, 1, i, 1, 1});
1421: Node node3 = root.find("convert/source/database", new int[]
1422: {1, 1, i});
1423: Node nodeMode = root.find("convert/source/database/mode", new int[]
1424: {1, 1, i, 1, 1});
1425: Node delimiterNode = root.find("convert/source/database/delimiter", new int[]
1426: {1, 1, i, 1, 1});
1427: Node useNormanToUnicodeMapper = root.find("convert/source/database/usenormantounicodemapper", new int[]
1428: {1, 1, i, 1, 1});
1429:
1430: if (delimiterNode != null)
1431: delimiter = delimiterNode.getCharacters();
1432: if (useNormanToUnicodeMapper != null)
1433: {
1434: database.setUseNormanToUnicodeMapper(Boolean.valueOf(useNormanToUnicodeMapper.getCharacters()).booleanValue());
1435: System.out.println("useMapper " + Boolean.valueOf(useNormanToUnicodeMapper.getCharacters().trim()).booleanValue());
1436: }
1437:
1438: if (node3 == null)
1439: throw new Error("parse error database tag missing");
1440: if (node == null)
1441: throw new Error("parse error url tag missing");
1442: if (node1 == null)
1443: throw new Error("parse error user tag missing");
1444: if (node2 == null)
1445: throw new Error("parse error password tag missing");
1446: String url = node.getCharacters();
1447: String user = node1.getCharacters();
1448: String password = node2.getCharacters();
1449: database.setURL(url.trim());
1450: database.setUserAndPasswd(user.trim(), password.trim());
1451: System.out.println(node.name + " " + node.getCharacters());
1452: System.out.println(node1.name + " " + node1.getCharacters());
1453: System.out.println(node2.name + " " + node2.getCharacters());
1454: String modeString = "";
1455: if (nodeMode == null)
1456: modeString = "convert";
1457: else
1458: modeString = nodeMode.getCharacters();
1459: if (modeString.equals("convert"))
1460: mode = DataBase.CONVERT_MODE;
1461: else if (modeString.equals("append"))
1462: mode = DataBase.APPEND_MODE;
1463: else if (modeString.equals("update"))
1464: mode = DataBase.UPDATE_MODE;
1465: else if (modeString.equals("delete"))
1466: mode = DataBase.DELETE_MODE;
1467:
1468: else if (modeString.equals("synchronize"))
1469: mode = DataBase.SYNCHRONIZE_MODE;
1470: // if(node3!=null)
1471: // System.out.println(node3.name);
1472:
1473: int length2 = countNodes(node3);
1474:
1475: System.out.println("number of tables " + length2);
1476:
1477: for (int j = 1; j <= length2; ++j)
1478: {
1479: Node node4 = root.find("convert/source/database/table", new int[]
1480: {1, 1, i, j});
1481: Node node5 = root.find("convert/source/database/table/select", new int[]
1482: {1, 1, i, j, 1});
1483: Node node6 = root.find("convert/source/database/table/create", new int[]
1484: {1, 1, i, j, 1});
1485: if (node4 != null)
1486: System.out.println(node4.name + " " + node4.attributes.get("layout").equals(""));
1487: if (node5 != null)
1488: System.out.println(node5.name + " " + node5.getCharacters());
1489: if (node6 != null)
1490: System.out.println(node6.name + " " + node6.getCharacters());
1491: if (node4 == null)
1492: throw new Error("parse error table tag missing");
1493: // if(node5==null) throw new Error("parse error select tag
1494: // missing");
1495: // if(node6==null) throw new Error("parse error create tag
1496: // missing");
1497: String name = (String) node4.attributes.get("name");
1498: String layout = (String) node4.attributes.get("layout");
1499: String id = (String) node4.attributes.get("id");
1500: System.out.println("id was " + id);
1501:
1502: if (name == null)
1503: throw new Error("parse error required table tag attribute name missing");
1504: if (layout == null)
1505: layout = "";
1506: if (id == null)
1507: id = "";
1508: if (name.equals(""))
1509: throw new Error("parse error table tag attribute must not be empty");
1510: tables.add(name);
1511: layouts.add(layout);
1512: ids.add(id);
1513: String query = (node5 == null) ? "" : node5.getCharacters();
1514: if (query.equals(""))
1515: System.err.println("Warning empty select tag or select tag missing !!");
1516: query = (query.equals("")) ? "select * from " + database.getQC() + name + database.getQC() : query;
1517: selects.add(query);
1518: if (node6 != null)
1519: creates.add(node6.getCharacters().trim());
1520: else
1521: creates.add("");
1522:
1523: }
1524: DataBase dataBase = new DataBase(database, tables, layouts, selects, creates, ids, mode);
1525: dataBase.delimiter = delimiter;
1526: databases.add(dataBase);
1527: }
1528: DBBean database = new DBBean();
1529: // parse dataBase
1530: Node node = root.find("convert/destination/database/url", new int[]
1531: {1, 1, 1, 1});
1532: Node node1 = root.find("convert/destination/database/user", new int[]
1533: {1, 1, 1, 1, 1});
1534: Node node2 = root.find("convert/destination/database/password", new int[]
1535: {1, 1, 1, 1, 1});
1536: String url = node.getCharacters();
1537: String user = node1.getCharacters();
1538: String password = node2.getCharacters();
1539: System.out.println(url);
1540: database.setURL(url.trim());
1541: database.setUserAndPasswd(user.trim(), password.trim());
1542: databases.add(new DataBase(database, null, null, null, null, null, 0));
1543: //databases.add(database);
1544: /*
1545: * for (Iterator iter = databases.iterator(); iter.hasNext();) { DataBase
1546: * db = (DataBase) iter.next();
1547: * convertBatch(db.bean,database,db.tables,db.layouts,db.selects,db.creates); }
1548: */
1549: // printContents(node3);
1550: // FM2SQL.fmInstance=new FM2SQL();
1551: }
1552: catch (Exception e)
1553: {
1554: // TODO Auto-generated catch block
1555: e.printStackTrace();
1556: }
1557: return databases;
1558: }
1559:
1560: private static int countNodes(Node tempNode)
1561: {
1562: int length = 0;
1563: for (int i = 0; i < tempNode.contents.v.size(); ++i)
1564: {
1565: Node node = (Node) tempNode.contents.v.elementAt(i);
1566: if (node.type.equals("element"))
1567: {
1568: if (node.name.equals("database"))
1569: length++;
1570: if (node.name.equals("table"))
1571: length++;
1572: }
1573:
1574: // System.out.println(((Node)tempNode.contents.v.elementAt(i)).attributes+"
1575: // "+i);
1576: }
1577: return length;
1578: }
1579:
1580: private static void printContents(Node root)
1581: {
1582:
1583: Vector contents = (root.index == null) ? root.contents.v : root.index.v;
1584: for (int i = 0; i < contents.size(); ++i)
1585: {
1586: Node n = (Node) contents.elementAt(i);
1587: if (n.type.equals("element"))
1588: {
1589: System.out.println("tag " + n.name);
1590: System.out.println(n.getCharacters());
1591: //contents=n.contents.v i=0;
1592: }
1593: // System.out.println(n.type);
1594: }
1595: }
1596:
1597: /**
1598: * reads the specified xml file
1599: *
1600: * @param xmlFile
1601: */
1602: public static void readXMLFile(String xmlFile)
1603: {
1604: try
1605: {
1606: InputStream stream = null;
1607:
1608: if (xmlFile.indexOf("file://") >= 0 || xmlFile.indexOf("http://") >= 0)
1609: {
1610: URL url = new URL(xmlFile);
1611: stream = url.openStream();
1612: }
1613: else
1614: // read XML Metadata from a file
1615: stream = new FileInputStream(xmlFile);
1616: InputStreamReader isr = new InputStreamReader(stream, "UTF-8");
1617: BufferedReader buffr = new BufferedReader(isr);
1618: StringBuffer sb = new StringBuffer();
1619: int c = 0;
1620: while ((c = buffr.read()) != -1)
1621: {
1622: char ch = (char) c;
1623: sb.append(ch);
1624: // System.out.print((char)c);
1625: }
1626: parseXMLConfig(sb);
1627: }
1628: catch (Exception e)
1629: {
1630: e.printStackTrace();
1631: }
1632: }
1633:
1634: /**
1635: * Helper class for Conversion etc Holds the some data
1636: *
1637: * @author rogo
1638: *
1639: */
1640:
1641: public static class ConversionProperties
1642: {
1643: String destTableName;
1644:
1645: String[] fieldNames;
1646:
1647: public ConversionProperties()
1648: {
1649: }
1650:
1651: public ConversionProperties(String destTableName, String[] fieldNames)
1652: {
1653: this.destTableName = destTableName;
1654: this.fieldNames = fieldNames;
1655:
1656: }
1657:
1658: }
1659:
1660: /**
1661: * Helper class for XML-File parsing Holds the parsed data
1662: *
1663: * @author rogo
1664: *
1665: */
1666: public static class DataBase
1667: {
1668: DBBean bean;
1669:
1670: Vector creates;
1671:
1672: Vector selects;
1673:
1674: Vector layouts;
1675:
1676: Vector tables;
1677:
1678: Vector ids;
1679:
1680: String delimiter = "//";
1681:
1682: /**
1683: * maps table name to index fields
1684: */
1685: Hashtable htIndex = new Hashtable();
1686:
1687: boolean useNormanToUnicodeMapper = false;
1688:
1689: final static int CONVERT_MODE = 1;
1690:
1691: final static int APPEND_MODE = 2;
1692:
1693: final static int UPDATE_MODE = 3;
1694:
1695: final static int DELETE_MODE = 4;
1696:
1697: final static int SYNCHRONIZE_MODE = 5;
1698:
1699: int mode = -1;
1700:
1701: public DataBase(DBBean bean, Vector tables, Vector layouts, Vector selects, Vector creates, Vector ids, int mode)
1702: {
1703: this.bean = bean;
1704: this.tables = tables;
1705: this.layouts = layouts;
1706: this.selects = selects;
1707: this.creates = creates;
1708: this.ids = ids;
1709: this.mode = mode;
1710: this.bean.setIDVector(ids);
1711: }
1712:
1713: /**
1714: * @param indexListVec
1715: */
1716: public void buildIndexTable(Vector indexListVec)
1717: {
1718: for (int i = 0; i < tables.size(); i++)
1719: {
1720: fillIndexList((String) tables.get(i), (String) indexListVec.get(i));
1721: }
1722: }
1723:
1724: /**
1725: * writes the data contained in this object to the buffered writer *
1726: *
1727: * @param buffr
1728: * @throws Exception
1729: */
1730: public void exportToXML(BufferedWriter buffr) throws Exception
1731: {
1732: // ids=bean.getIDVector();
1733: buffr.write(" <database>\n");
1734: buffr.write(" <url>" + bean.url + "</url>\n");
1735: buffr.write(" <user>" + bean.user + "</user>\n");
1736: buffr.write(" <password>" + bean.passwd + "</password>\n");
1737: buffr.write(" <delimiter>" + delimiter + "</delimiter>\n");
1738: String modeString = "";
1739: if (mode == CONVERT_MODE)
1740: modeString = "convert";
1741: else if (mode == APPEND_MODE)
1742: modeString = "append";
1743: else if (mode == UPDATE_MODE)
1744: modeString = "update";
1745: else if (mode == DELETE_MODE)
1746: modeString = "delete";
1747: else if (mode == SYNCHRONIZE_MODE)
1748: modeString = "synchronize";
1749:
1750: buffr.write(" <mode>" + modeString + "</mode>\n");
1751: buffr.write(" <usenormantounicodemapper>" + useNormanToUnicodeMapper + "</usenormantounicodemapper>\n");
1752:
1753: int index = 0;
1754: while (index < tables.size())
1755: {
1756: String table = (String) tables.get(index);
1757: String layout = (String) layouts.get(index);
1758: String select = (String) selects.get(index);
1759: String create = (String) creates.get(index);
1760: String id = (String) ids.get(index);
1761: IndexList indexList = (IndexList) htIndex.get(table);
1762: if (indexList == null)
1763: indexList = new IndexList();
1764: buffr.write(" <table name = \"" + table + "\" layout = \"" + layout + "\" id = \"" + id + "\" indexList =\"" + indexList + "\">\n");
1765: buffr.write(" <select>" + convertToEntities(select) + "</select>\n");
1766: if (!create.equals(""))
1767: buffr.write(" <create>" + create + " </create>\n");
1768: buffr.write(" </table>\n");
1769: index++;
1770: }
1771: buffr.write(" </database>\n");
1772: }
1773:
1774: public void fillIndexList(String table, String list)
1775: {
1776: IndexList indexList = new IndexList();
1777: StringTokenizer tokenizer = new StringTokenizer(list, ",");
1778: while (tokenizer.hasMoreTokens())
1779: {
1780: indexList.add(tokenizer.nextToken());
1781: }
1782: System.out.println(indexList);
1783:
1784: htIndex.put(table, indexList);
1785: }
1786:
1787: public String toString()
1788: {
1789: return bean.url + " " + tables;
1790: }
1791:
1792: }
1793:
1794: public static String convertToUTF8(Object command)
1795: {
1796: String str = null;
1797: try
1798: {
1799: str = new String(command.toString().getBytes("UTF-8"));
1800: }
1801: catch (UnsupportedEncodingException e)
1802: {
1803: // TODO Auto-generated catch block
1804: e.printStackTrace();
1805: }
1806: return str;
1807: }
1808:
1809: public static void writeConfig(String file, DataBase source, DataBase destination) throws Exception
1810: {
1811: if (!file.toLowerCase().endsWith(".xml"))
1812: file += ".xml";
1813: File f = new File(file);
1814:
1815: FileOutputStream fout = new FileOutputStream(f);
1816: OutputStreamWriter outsw = new OutputStreamWriter(fout, "UTF-8");
1817: BufferedWriter buffw = new BufferedWriter(outsw);
1818: buffw.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
1819: buffw.newLine();
1820: buffw.write("<convert>\n");
1821: buffw.write(" <source>\n");
1822: source.exportToXML(buffw);
1823: buffw.write(" </source>\n");
1824: buffw.write("\n <destination>\n");
1825: destination.exportToXML(buffw);
1826: buffw.write(" </destination>\n");
1827: buffw.write("</convert>\n");
1828: buffw.close();
1829: }
1830:
1831: public static void delete(String source, String destination, Vector names, Vector layouts, Vector selects, Vector creates, Vector ids, int mode) throws Exception
1832: {
1833: FM2SQL.ProgressDialog dialog = null;
1834: if (FM2SQL.fmInstance != null)
1835: {
1836: dialog = new FM2SQL.ProgressDialog(FM2SQL.fmInstance, bean);
1837: dialog.setTitle("Conversion running ...");
1838: dialog.title.setText("Getting table data ...");
1839: dialog.setLocation(FM2SQL.fmInstance.getLocationOnScreen().x + (FM2SQL.fmInstance.getWidth() - 400) / 2, FM2SQL.fmInstance.getLocationOnScreen().y + (FM2SQL.fmInstance.getHeight() - 250) / 2);
1840: dialog.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
1841: FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
1842: dialog.thread = Thread.currentThread();
1843: }
1844: // setting user and passwd
1845: bean.setUserAndPasswd(user, passwd);
1846: // setting user and passwd
1847: beanDest.setUserAndPasswd(userDest, passwdDest);
1848: if (dialog != null)
1849: dialog.setSize(400, 250);
1850: StringBuffer command = null;
1851: String query = null;
1852: try
1853: {
1854: //bean.setConnection("jdbc:fmpro:http://141.14.237.74:8050");
1855: //bean.setConnection("jdbc:postgresql://erebos/test","postgres","rogo");
1856: bean.setConnection(source);
1857: if (names == null)
1858: names = bean.getTableNames();
1859: // Collections.sort(names);
1860: int tbIndex = 1;
1861:
1862: // System.out.println("Start at
1863: // "+names.indexOf("archimedes_facsimiles"));
1864: for (tbIndex = 0; tbIndex < names.size(); ++tbIndex)
1865: {
1866: Vector[] result = null;
1867: java.util.TreeSet myIds = new TreeSet();
1868: java.util.TreeSet myIdsDest = new TreeSet();
1869: int deltaID = 1;
1870: String idField = "";
1871: String destTableName = "";
1872:
1873: try
1874: {
1875: query = "select * from " + bean.getQC() + names.get(tbIndex).toString() + bean.getQC();
1876: String layout = (layouts.isEmpty()) ? "" : layouts.get(tbIndex).toString();
1877: query = (selects != null) ? selects.get(tbIndex).toString() : query;
1878: //if vectors[1].get(i) != null)
1879: if (layout != "")
1880: {
1881: layout = " layout " + bean.getQC() + layout + bean.getQC();
1882: String name = names.get(tbIndex).toString();
1883: StringBuffer queryLayout = new StringBuffer(query);
1884: queryLayout.insert(queryLayout.indexOf(name) + name.length() + 1, " " + layout);
1885: query = queryLayout.toString();
1886: System.out.println("added layout " + query);
1887:
1888: }
1889: dialog.title.setText("Getting table data ...");
1890: dialog.table.setText(names.get(tbIndex).toString());
1891: dialog.status.setText("Table " + (tbIndex + 1) + " of " + names.size());
1892: dialog.show();
1893: bean.getConnection();
1894: bean.makeQuery(query, 50);
1895: idField = ids.get(tbIndex).toString();
1896:
1897: }
1898: catch (Exception e)
1899: {
1900: continue;
1901: }
1902: // determine destTableName from createStatement or from source
1903: // table name
1904: if (!creates.get(tbIndex).equals(""))
1905: {
1906: String create = creates.get(tbIndex).toString().toLowerCase();
1907: int fromIndex = create.indexOf("table") + 5;
1908: int toIndex = create.indexOf("(");
1909: destTableName = create.substring(fromIndex, toIndex).replaceAll(beanDest.getQC(), "").trim();
1910: System.out.println("destTable " + destTableName);
1911:
1912: }
1913: else
1914: destTableName = convertText(names.get(tbIndex).toString());
1915:
1916: // for id kram
1917: Vector vec = null;
1918: Vector vecDest = null;
1919: // tempo
1920: beanDest.setConnection(destination);
1921: int rowCount = (idField != "") ? myIds.size() : bean.getRowCount(query);
1922: String tempID = bean.getQC() + idField + bean.getQC();
1923: String tempIDdest = beanDest.getQC() + convertText(idField) + beanDest.getQC();
1924:
1925: int endIndex = -1;
1926: String tempQuery = query;
1927: String destQuery = query.replaceAll(names.get(tbIndex).toString(), destTableName);
1928: String tempQueryDest = destQuery;
1929: // remove extra query parts
1930: // destQuery.substring(0,destQuery.lastIndexOf(destTableName)+destTableName.length()+1);
1931: System.out.println("new Query " + tempQueryDest);
1932: if (!idField.equals(""))
1933: {
1934: long startTime = System.currentTimeMillis();
1935: int counter = -1;
1936: while (true)
1937: {
1938: ++counter;
1939: if (counter == 0 && dialog != null)
1940: dialog.title.setText("Check if data is available");
1941: else if (dialog != null)
1942: dialog.title.setText("Check if more data is available");
1943: myIds = bean.getIDVector(ids.get(tbIndex).toString(), (String) names.get(tbIndex), tempQuery, numHits);
1944: myIdsDest = beanDest.getIDVector(convertText(idField), destTableName, tempQueryDest, numHits);
1945: if (myIds.isEmpty())
1946: break;
1947: vec = new Vector(myIds);
1948: vecDest = new Vector(myIdsDest);
1949: rowCount = vec.size();
1950: // Deletion will work this way
1951: Vector deleted = new Vector(vec);
1952: Vector linesToDelete = new Vector(vecDest);
1953: // remove all lines that should not be deleted
1954: linesToDelete.removeAll(deleted);
1955: // System.out.println("ID LIST SIZE " +
1956: // Math.round((double) myIds.size() / (double)
1957: // numIntervalls) + " " + myIdsDest.size());
1958: /// @TODO complete delete task remove query show lines
1959: // to be deleted let user choose if he wants that
1960: System.out.println("number of lines to be deleted " + linesToDelete.size());
1961: deltaID = (int) Math.round((double) myIds.size() / (double) numIntervalls);
1962: beanDest.setConnection(destination);
1963:
1964: Statement stm = beanDest.getConnection().createStatement();
1965:
1966: Vector tables = beanDest.getTableNames();
1967: // Collections.sort(tables);
1968: System.out.println(names.get(tbIndex) + " " + tables.indexOf(convertText((String) names.get(tbIndex)))); // "//beanDest.getTypeNames());
1969: tables = beanDest.getTableNames();
1970: // System.out.println(beanDest.getTableNames(beanDest.getCatalogs().get(2).toString()));
1971: stm = beanDest.getConnection().createStatement();
1972:
1973: if (dialog != null)
1974: dialog.title.setText(" Deleting table data ...");
1975:
1976: int j = -1;
1977:
1978: Vector row = null;
1979: command = new StringBuffer();
1980:
1981: command.append("DELETE FROM");
1982: command.append(beanDest.getQC());
1983: command.append(destTableName);
1984: //command.append(convertText((String)
1985: // names.get(tbIndex)));
1986: command.append(beanDest.getQC());
1987: int size = bean.getColumnNames().size();
1988: command.append("WHERE " + convertText(ids.get(tbIndex).toString()) + " = ?");
1989: PreparedStatement pstm = beanDest.getConnection().prepareStatement(command.toString());
1990: System.out.println(command + " " + tbIndex);
1991: //int rowCount = bean.getRowCount(query);
1992: // int idIndex =
1993: // bean.getColumnNames().indexOf(ids.get(tbIndex));
1994: while (true)
1995: {
1996:
1997: ++j;
1998: if (j == linesToDelete.size())
1999: break;
2000: //print rows
2001: pstm.setString(1, linesToDelete.get(j).toString());
2002: System.out.println(pstm.toString());
2003: pstm.execute();
2004: if (dialog != null)
2005: dialog.progress.setValue((int) (((double) (j + 1) / (double) rowCount) * 100.0));
2006: command = null;
2007: }
2008: // prepare new query for next chunk
2009: if (query.indexOf("where") > 0)
2010: tempQuery = query + " and " + tempID + ">'" + vec.lastElement() + "'";
2011: else
2012: tempQuery = query + " where " + tempID + ">'" + vec.lastElement() + "'";
2013:
2014: } //to outer while
2015: } // to idfield if
2016: } // table loop
2017:
2018: }
2019: catch (Exception e)
2020: {
2021: System.out.println("Error while connecting to database " + e);
2022: if (dialog != null)
2023: {
2024: dialog.setVisible(false);
2025: dialog.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
2026: FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
2027: }
2028: java.io.ByteArrayOutputStream b = new java.io.ByteArrayOutputStream();
2029: java.io.PrintStream stream = new java.io.PrintStream(b);
2030: stream.print(command + "\n\n");
2031: e.printStackTrace(stream);
2032: FM2SQL.showErrorDialog(b.toString(), "Error occured !");
2033:
2034: }
2035: if (dialog != null)
2036: {
2037: dialog.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
2038: FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
2039:
2040: dialog.setVisible(false);
2041: }
2042: } // to method
2043:
2044: /**
2045: * synchronize method based on delete method code
2046: *
2047: * @param source
2048: * @param destination
2049: * @param names
2050: * @param layouts
2051: * @param selects
2052: * @param creates
2053: * @param ids
2054: * @param mode
2055: * @throws Exception
2056: */
2057: // TODO implement append,update and delete in one method
2058: // TODO using id based algorithm
2059: public static void synchronize(String source, String destination, Vector names, Vector layouts, Vector selects, Vector creates, Vector ids, int mode, String delimiter, Vector indexList)
2060: throws Exception
2061: {
2062: System.out.println(" bin in synchronize!!!");
2063: FM2SQL.ProgressDialog dialog = null;
2064: if (FM2SQL.fmInstance != null)
2065: {
2066: dialog = new FM2SQL.ProgressDialog(FM2SQL.fmInstance, bean);
2067: dialog.setTitle("Synchronize running ...");
2068: dialog.title.setText("Getting table data ...");
2069: dialog.setLocation(FM2SQL.fmInstance.getLocationOnScreen().x + (FM2SQL.fmInstance.getWidth() - 400) / 2, FM2SQL.fmInstance.getLocationOnScreen().y + (FM2SQL.fmInstance.getHeight() - 250) / 2);
2070: dialog.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
2071: FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
2072: dialog.thread = Thread.currentThread();
2073: }
2074: // setting user and passwd
2075: bean.setUserAndPasswd(user, passwd);
2076: // setting user and passwd
2077: beanDest.setUserAndPasswd(userDest, passwdDest);
2078: if (dialog != null)
2079: dialog.setSize(400, 250);
2080: StringBuffer command = null;
2081: String query = null;
2082: try
2083: {
2084: //bean.setConnection("jdbc:fmpro:http://141.14.237.74:8050");
2085: //bean.setConnection("jdbc:postgresql://erebos/test","postgres","rogo");
2086: bean.setConnection(source);
2087: if (names == null)
2088: names = bean.getTableNames();
2089: // Collections.sort(names);
2090: int tbIndex = 1;
2091:
2092: // System.out.println("Start at
2093: // "+names.indexOf("archimedes_facsimiles"));
2094: for (tbIndex = 0; tbIndex < names.size(); ++tbIndex)
2095: {
2096: Vector[] result = null;
2097: java.util.TreeSet myIds = new TreeSet();
2098: java.util.TreeSet myIdsDest = new TreeSet();
2099: int deltaID = 1;
2100: String idField = "";
2101: String destTableName = "";
2102:
2103: try
2104: {
2105: query = "select * from " + bean.getQC() + names.get(tbIndex).toString() + bean.getQC();
2106: String layout = (layouts.isEmpty()) ? "" : layouts.get(tbIndex).toString();
2107: query = (selects != null) ? selects.get(tbIndex).toString() : query;
2108: //if vectors[1].get(i) != null)
2109: if (!layout.equals(""))
2110: {
2111: layout = " layout " + bean.getQC() + layout + bean.getQC();
2112: String name = names.get(tbIndex).toString();
2113: StringBuffer queryLayout = new StringBuffer(query);
2114: queryLayout.insert(queryLayout.indexOf(name) + name.length() + 1, " " + layout);
2115: query = queryLayout.toString();
2116: System.out.println("added layout " + query);
2117:
2118: }
2119: if (dialog != null)
2120: {
2121: dialog.title.setText("Getting table data ...");
2122: dialog.table.setText(names.get(tbIndex).toString());
2123: dialog.status.setText("Table " + (tbIndex + 1) + " of " + names.size());
2124: dialog.show();
2125: }
2126: bean.getConnection();
2127: bean.makeQuery(query, 50);
2128: idField = ids.get(tbIndex).toString();
2129:
2130: }
2131: catch (Exception e)
2132: {
2133: continue;
2134: }
2135: // determine destTableName from createStatement or from source
2136: // table name
2137: if (!creates.get(tbIndex).equals(""))
2138: {
2139: String create = creates.get(tbIndex).toString().toLowerCase();
2140: int fromIndex = create.indexOf("table") + 5;
2141: int toIndex = create.indexOf("(");
2142: destTableName = create.substring(fromIndex, toIndex).replaceAll(beanDest.getQC(), "").trim();
2143: System.out.println("destTable " + destTableName);
2144:
2145: }
2146: else
2147: destTableName = convertText(names.get(tbIndex).toString());
2148:
2149: // for id kram
2150: Vector vec = null;
2151: Vector vecDest = null;
2152: // tempo
2153: beanDest.setConnection(destination);
2154: int rowCount = (idField != "") ? myIds.size() : bean.getRowCount(query);
2155: String tempID = bean.getQC() + idField + bean.getQC();
2156: String tempIDdest = beanDest.getQC() + convertText(idField) + beanDest.getQC();
2157:
2158: int endIndex = -1;
2159: String tempQuery = query;
2160: String destQuery = query.replaceAll(names.get(tbIndex).toString(), destTableName);
2161: destQuery = destQuery.replaceAll(bean.getQC(), beanDest.getQC());
2162: destQuery = removeLayoutPartFromQuery(destQuery, layouts.get(tbIndex).toString());
2163: // TODO remove layout part for destQuery
2164: String tempQueryDest = destQuery;
2165: // remove extra query parts
2166: // destQuery.substring(0,destQuery.lastIndexOf(destTableName)+destTableName.length()+1);
2167: System.out.println("new Query " + tempQueryDest);
2168: System.out.println("idfield " + idField + " " + ids.get(tbIndex).toString());
2169: if (!idField.equals(""))
2170: {
2171: long startTime = System.currentTimeMillis();
2172: int counter = -1;
2173: TreeSet linesToDelete = null;
2174: PreparedStatement delPSt = null;
2175: while (true)
2176: {
2177: ++counter;
2178: if (counter == 0 && dialog != null)
2179: dialog.title.setText("Check if data is available");
2180: else if (dialog != null)
2181: dialog.title.setText("Check if more data is available");
2182:
2183: myIds = bean.getIDVector(ids.get(tbIndex).toString(), (String) names.get(tbIndex), tempQuery, 0);
2184: myIdsDest = beanDest.getIDVector(convertText(idField), destTableName, tempQueryDest, 0);
2185: //System.out.println("status of remove
2186: // "+myIds.remove("b015892"));
2187: System.out.println("ids found for " + idField + " " + !myIds.isEmpty());
2188: if (myIds.isEmpty())
2189: break;
2190: vec = new Vector(myIds);
2191: vecDest = new Vector(myIdsDest);
2192: rowCount = vec.size();
2193: // Deletion will work this way
2194: Vector deleted = new Vector(vec);
2195:
2196: TreeSet linesToAppend = new TreeSet(vec);
2197: linesToAppend.addAll(vec);
2198: linesToDelete = new TreeSet(vecDest);
2199: // remove all lines that are already in dest database
2200: linesToAppend.removeAll(vecDest);
2201: // remove all lines that should not be deleted
2202: linesToDelete.removeAll(deleted);
2203: System.out.println("linesToAppend " + linesToAppend.size() + " " + destTableName);
2204: System.out.println("linesToDelete " + linesToDelete.size() + " " + destTableName);
2205: System.out.println("ID LIST SIZE " + Math.round((double) myIds.size() / (double) numIntervalls) + " " + myIds.size());
2206: deltaID = (int) Math.round((double) myIds.size() / (double) numIntervalls);
2207: ConversionProperties prop = getFieldNamesAndDestTableName(creates.get(tbIndex).toString(), query, names.get(tbIndex).toString());
2208: StringBuffer insCommand = createInsertCommand(prop.destTableName, prop.fieldNames);
2209: StringBuffer updCommand = createUpdateCommand(prop.destTableName, prop.fieldNames, tempIDdest);
2210: StringBuffer delCommand = createDeleteCommand(destTableName, tempIDdest);
2211: PreparedStatement insPst = beanDest.getConnection().prepareStatement(insCommand.toString());
2212: PreparedStatement updPst = beanDest.getConnection().prepareStatement(updCommand.toString());
2213: delPSt = beanDest.getConnection().prepareStatement(delCommand.toString());
2214: // delPSt.setString(1,"b015892");
2215: // delPSt.execute();
2216: // if (true)
2217: // return;
2218: if (vec.size() <= numIntervalls)
2219: {
2220: endIndex = 0;
2221: deltaID = vec.size();
2222: }
2223: for (int k = 0; k < vec.size() - deltaID; k = k + deltaID)
2224: {
2225: System.out.println(vec.get(k) + " " + vec.get(k + deltaID) + " " + vec.lastElement());
2226: if (query.indexOf("where") > 0)
2227: tempQuery = query + " and " + tempID + ">='" + vec.get(k) + "' and " + tempID + "<='" + vec.get(k + deltaID) + "'";
2228: else
2229: tempQuery = query + " where " + tempID + ">='" + vec.get(k) + "' and " + tempID + "<='" + vec.get(k + deltaID) + "'";
2230: System.out.println(tempQuery);
2231: if (dialog != null)
2232: dialog.title.setText("Reading table data ...");
2233:
2234: // bean.makeQuery(tempQuery, deltaID);
2235: if (dialog != null)
2236: dialog.title.setText("Writing table data ...");
2237:
2238: performSynchronize(idField, vec, tempQuery, linesToDelete, linesToAppend, insPst, updPst, delPSt, deltaID, delimiter, dialog);
2239: // System.out.println("ID LIST SIZE " +
2240: // Math.round((double) myIds.size() / (double)
2241: // numIntervalls) + " " + myIdsDest.size());
2242: endIndex = k + deltaID;
2243: }
2244: System.out.println(endIndex);
2245: //all data written ? if not write last chunk of data
2246: if (endIndex == vec.size() - 1)
2247: System.out.println("fits");
2248: else
2249: {
2250: System.out.println(" last intervall from " + vec.get(endIndex) + " " + vec.lastElement());
2251:
2252: if (query.indexOf("where") > 0)
2253: tempQuery = query + " and " + tempID + ">='" + vec.get(endIndex) + "' and " + tempID + "<='" + vec.lastElement() + "'";
2254: else
2255: tempQuery = query + " where " + tempID + ">='" + vec.get(endIndex) + "' and " + tempID + "<='" + vec.lastElement() + "'";
2256: System.out.println(tempQuery);
2257: if (dialog != null)
2258: dialog.title.setText("Reading table data ...");
2259: // bean.makeQuery(tempQuery, 0);
2260: if (dialog != null)
2261: dialog.title.setText("Writing table data ...");
2262: performSynchronize(idField, vec, tempQuery, linesToDelete, linesToAppend, insPst, updPst, delPSt, deltaID, delimiter, dialog);
2263: // System.out.println("ID LIST SIZE " +
2264: // Math.round((double) myIds.size() / (double)
2265: // numIntervalls) + " " + myIdsDest.size());
2266: }
2267: // prepare new query for next chunk
2268: if (query.indexOf("where") > 0)
2269: tempQuery = query + " and " + tempID + ">'" + vec.lastElement() + "'";
2270: else
2271: tempQuery = query + " where " + tempID + ">'" + vec.lastElement() + "'";
2272:
2273: }
2274: String tableName = names.get(tbIndex).toString();
2275: if (indexList.isEmpty())
2276: {
2277: IndexList idList = (IndexList) indexList.get(0);
2278: System.out.println("found list " + idList);
2279: Statement stm = beanDest.getConnection().createStatement();
2280: Vector destTables = beanDest.getTableNames();
2281: System.out.println("tempQueryDest" + tempQueryDest);
2282: beanDest.makeQuery(tempQueryDest, 0);
2283: for (Iterator iter = idList.iterator(); iter.hasNext();)
2284: {
2285: String indexField = (String) iter.next();
2286: indexField = convertText(indexField);
2287: String indexName = destTableName + "_" + indexField;
2288: if (destTables.contains(indexName))
2289: {
2290: stm.execute("DROP INDEX " + destTableName + "_" + indexField);
2291: // continue;
2292: }
2293: // stm.execute("DROP INDEX
2294: // "+destTableName+"_"+indexField);
2295:
2296: String type = beanDest.getColumnType(indexField).toLowerCase();
2297: // System.out.println(indexField+" "+type+"
2298: // "+(type.indexOf("text") >= 0 ||
2299: // type.indexOf("varchar") >= 0 || type.indexOf("char")
2300: // >= 0));
2301: if (type.indexOf("text") >= 0 || type.indexOf("varchar") >= 0 || type.indexOf("char") >= 0)
2302: {
2303: if (beanDest.url.indexOf("mysql") >= 0)
2304: {
2305: //System.out.println("CREATE INDEX " +
2306: // indexName + " ON " + destTableName + " (" +
2307: // indexField + "(10))");
2308: // TODO problem if index exist !!!
2309: stm.execute("CREATE INDEX " + indexName + " ON " + destTableName + " (" + indexField + "(10))");
2310: }
2311: else
2312: {
2313: stm.execute("CREATE INDEX " + indexName + " ON " + destTableName + " (lower( " + indexField + "))");
2314:
2315: }
2316:
2317: }
2318: else
2319: {
2320: stm.execute("CREATE INDEX " + destTableName + "_" + indexField + " ON " + destTableName + "(" + indexField + ")");
2321:
2322: }
2323:
2324: // stm.execute("DROP INDEX
2325: // "+destTableName+"_"+indexField);
2326:
2327: }
2328: }
2329: // CREATE UNIQUE INDEX title_idx ON films (title);
2330: for (Iterator iter = linesToDelete.iterator(); iter.hasNext();)
2331: {
2332: String id = (String) iter.next();
2333: delPSt.setString(1, id);
2334: delPSt.execute();
2335:
2336: }
2337:
2338: long endTime = System.currentTimeMillis();
2339: System.out.println("Time for incremental synchronize elapsed " + (endTime - startTime));
2340: } // to idfield if
2341: } // table loop
2342:
2343: }
2344: catch (Exception e)
2345: {
2346: System.out.println("Error while connecting to database " + e);
2347: e.printStackTrace();
2348: if (dialog != null)
2349: {
2350: dialog.setVisible(false);
2351: dialog.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
2352: FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
2353: }
2354: java.io.ByteArrayOutputStream b = new java.io.ByteArrayOutputStream();
2355: java.io.PrintStream stream = new java.io.PrintStream(b);
2356: stream.print(command + "\n\n");
2357: e.printStackTrace(stream);
2358: FM2SQL.showErrorDialog(b.toString(), "Error occured !");
2359:
2360: }
2361: if (dialog != null)
2362: {
2363: dialog.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
2364: FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
2365:
2366: dialog.setVisible(false);
2367: }
2368: }
2369:
2370: /**
2371: * @param destQuery
2372: * @param string
2373: * @return
2374: */
2375: private static String removeLayoutPartFromQuery(String destQuery, String layoutName)
2376: {
2377: String removeString = "layout " + beanDest.getQC() + layoutName + beanDest.getQC();
2378: destQuery = destQuery.replaceFirst(removeString, "");
2379: System.out.println("destQuery change to " + destQuery);
2380: return destQuery;
2381: }
2382:
2383: private static void performSynchronize(String idField, Vector vec, String tempQuery, TreeSet linesToDelete, TreeSet linesToAppend, PreparedStatement insPst, PreparedStatement updPst,
2384: PreparedStatement delPSt, int deltaID, String delimiter, FM2SQL.ProgressDialog dialog) throws SQLException, ParseException
2385: {
2386: if (dialog != null)
2387: {
2388: dialog.progress.setValue(0);
2389: dialog.title.setText("Retrieving new data");
2390: }
2391:
2392: Vector[] vectors = bean.getQueryData(tempQuery, deltaID);
2393: int count = 0, size = vectors[0].size();
2394: int idIndex = vectors[1].indexOf(idField);
2395: //System.out.println(idIndex + " " + vectors[1] + " " + idField);
2396: // todo arraylist code has to be added
2397: if (dialog != null)
2398: dialog.title.setText("Synchronize with new data");
2399:
2400: for (Iterator iter = vectors[0].iterator(); iter.hasNext();)
2401: {
2402: Vector line = (Vector) iter.next();
2403: Object lineIDIndex = line.get(idIndex);
2404: if (linesToAppend.contains(lineIDIndex))
2405: System.out.println("line " + linesToAppend.contains(line.get(idIndex)) + " " + lineIDIndex);
2406: if (linesToAppend.contains(lineIDIndex))
2407: {
2408: for (int l = 0; l < line.size(); ++l)
2409: {
2410: Object obj = line.get(l);
2411: if (obj instanceof ArrayList)
2412: obj = formatFileMakerArray((List) obj, delimiter);
2413: if (obj != null)
2414: insPst.setString(l + 1, obj.toString());
2415: else
2416: insPst.setNull(l + 1, Types.NULL);
2417: }
2418: insPst.execute();
2419:
2420: }
2421: else
2422: // update
2423: {
2424: for (int l = 0; l < line.size(); ++l)
2425: {
2426: Object obj = line.get(l);
2427: if (obj instanceof ArrayList)
2428: obj = formatFileMakerArray((List) obj, delimiter);
2429: if (obj != null)
2430: updPst.setString(l + 1, obj.toString());
2431: else
2432: updPst.setNull(l + 1, Types.NULL);
2433: }
2434: updPst.setString(line.size() + 1, line.get(idIndex).toString());
2435: //updPst.addBatch();
2436: //updPst.execute();
2437: }
2438: if (dialog != null)
2439: {
2440: int value = (int) Math.round(((double) count / (double) size) * 100.0);
2441: dialog.progress.setValue(value);
2442: count++;
2443: }
2444: }
2445: //updPst.executeBatch();
2446: } // to method
2447:
2448: /**
2449: * Converts input String in norman encoding to unicode
2450: *
2451: * @param inp
2452: * @return converted String
2453: */
2454: static public String normanToUnicode(String inp)
2455: {
2456: StringBuffer buf = new StringBuffer();
2457: for (int i = 0; i < inp.length(); i++)
2458: {
2459: char c = inp.charAt(i);
2460: // System.out.println("char "+c+" "+(int)c);
2461: switch (c)
2462: {
2463: case 1 :
2464: buf.append("\u00d0");
2465: break; // Eth
2466: case 2 :
2467: buf.append("\u00f0");
2468: break; // eth
2469: case 3 :
2470: buf.append("\u0141");
2471: break; // Lslash
2472: case 4 :
2473: buf.append("\u0142");
2474: break; // lslash
2475: case 5 :
2476: buf.append("\u0160");
2477: break; // S caron
2478: case 6 :
2479: buf.append("\u0161");
2480: break; // s caron
2481: case 7 :
2482: buf.append("\u00dd");
2483: break; // Y acute
2484: case 8 :
2485: buf.append("\u00fd");
2486: break; // y acute
2487: case 11 :
2488: buf.append("\u00de");
2489: break; // Thorn
2490: case 12 :
2491: buf.append("\u00fe");
2492: break; // thorn
2493: case 14 :
2494: buf.append("\u017d");
2495: break; // Z caron
2496: case 15 :
2497: buf.append("\u017e");
2498: break; // z caron
2499: case 17 :
2500: buf.append("\u0073");
2501: break; // asciitilde
2502: case 18 :
2503: buf.append("j\u0305");
2504: break; // j macron [does a single char exist?]
2505: case 19 :
2506: buf.append("^");
2507: break; // circumflex
2508: case 20 :
2509: buf.append("\u0303");
2510: break; // tilde
2511: case 21 :
2512: buf.append("\u00bd");
2513: break; // onehalf
2514: case 22 :
2515: buf.append("\u00bc");
2516: break; // onequarter
2517: case 23 :
2518: buf.append("\u00b9");
2519: break; // onesuperior
2520: case 24 :
2521: buf.append("\u00be");
2522: break; // threequarters
2523: case 25 :
2524: buf.append("\u00b3");
2525: break; // threesuperior
2526: case 26 :
2527: buf.append("\u00b2");
2528: break; // twosuperior
2529: case 27 :
2530: buf.append("\u00a6");
2531: break; // brokenbar
2532: case 28 :
2533: buf.append("-");
2534: break; // minus
2535: case 29 :
2536: buf.append("\u00d7");
2537: break; // multiply
2538: case 39 :
2539: buf.append("'");
2540: break; // quotesingle
2541: case 94 :
2542: buf.append("\u0302");
2543: break; // circumflex
2544: case 96 :
2545: buf.append("\u0300");
2546: break; // grave
2547: case 196 :
2548: buf.append("\u00c4");
2549: break; // A dieresis
2550: case 197 :
2551: buf.append("\u00c5");
2552: break; // A ring
2553: case 201 :
2554: buf.append("\u00c9");
2555: break; // E acute
2556: case 209 :
2557: buf.append("\u00d1");
2558: break; // N tilde
2559: case 214 :
2560: buf.append("\u00d6");
2561: break; // O dieresis
2562: case 220 :
2563: buf.append("\u00dc");
2564: break; // U dieresis
2565: case 225 :
2566: buf.append("\u00e1");
2567: break; // a acute
2568: case 224 :
2569: buf.append("\u00e0");
2570: break; // a grave
2571: case 226 :
2572: buf.append("\u00e2");
2573: break; // a circumflex
2574: case 228 :
2575: buf.append("\u00e4");
2576: break; // a dieresis
2577: case 227 :
2578: buf.append("\u00e3");
2579: break; // a tilde
2580: case 229 :
2581: buf.append("\u0101");
2582: break; // a macron
2583: case 231 :
2584: buf.append("\u00e7");
2585: break; // c cedilla
2586: case 233 :
2587: buf.append("\u00e9");
2588: break; // e acute
2589: case 232 :
2590: buf.append("\u00e8");
2591: break; // e grave
2592: case 234 :
2593: buf.append("\u00ea");
2594: break; // e circumflex
2595: case 235 :
2596: buf.append("\u00eb");
2597: break; // e dieresis
2598: case 237 :
2599: buf.append("\u00ed");
2600: break; // i acute
2601: case 236 :
2602: buf.append("\u00ec");
2603: break; // i grave
2604: case 238 :
2605: buf.append("\u00ee");
2606: break; // i circumflex
2607: case 239 :
2608: buf.append("\u00ef");
2609: break; // i dieresis
2610: case 241 :
2611: buf.append("\u00f1");
2612: break; // n tilde
2613: case 243 :
2614: buf.append("\u00f3");
2615: break; // o acute
2616: case 242 :
2617: buf.append("\u00f2");
2618: break; // o grave
2619: case 244 :
2620: buf.append("\u00f4");
2621: break; // o circumflex
2622: case 246 :
2623: buf.append("\u00f6");
2624: break; // o dieresis
2625: case 245 :
2626: buf.append("\u00f5");
2627: break; // o tilde
2628: case 250 :
2629: buf.append("\u00fa");
2630: break; // u acute
2631: case 249 :
2632: buf.append("\u00f9");
2633: break; // u grave
2634: case 251 :
2635: buf.append("\u00fb");
2636: break; // u circumflex
2637: case 252 :
2638: buf.append("\u00fc");
2639: break; // u dieresis
2640: case 8224 :
2641: buf.append("\u1e6d");
2642: break; // t underdot
2643: case 176 :
2644: buf.append("\u00b0");
2645: break; // degree
2646: case 162 :
2647: buf.append("\u1ebd");
2648: break; // e tilde
2649: case 163 :
2650: buf.append("\u00a3");
2651: break; // sterling
2652: case 167 :
2653: buf.append("\u00a7");
2654: break; // section
2655: case 182 :
2656: buf.append("\u00b6");
2657: break; // paragraph
2658: case 223 :
2659: buf.append("\u015b");
2660: break; // s acute
2661: case 174 :
2662: buf.append("\u1e5b");
2663: break; // r underdot
2664: case 169 :
2665: buf.append("\u1e45");
2666: break; // n overdot
2667: case 353 :
2668: buf.append("\u1e45");
2669: break; // n overdot
2670: case 180 :
2671: buf.append("\u0301");
2672: break; // acute
2673: case 168 :
2674: buf.append("\u0308");
2675: break; // dieresis
2676: case 8800 :
2677: buf.append("\u1e6d");
2678: break; // t underdot
2679: case 198 :
2680: buf.append("\u00c6");
2681: break; // AE
2682: case 216 :
2683: buf.append("\u014d");
2684: break; // o macron
2685: case 8734 :
2686: buf.append("\u0129");
2687: break; // i tilde
2688: case 177 :
2689: buf.append("\u00b1");
2690: break; // plusminus
2691: case 165 :
2692: buf.append("\u012b");
2693: break; // i macron
2694: case 181 :
2695: buf.append("\u1e43");
2696: break; // m underdot
2697: case 8706 :
2698: buf.append("\u1e0d");
2699: break; // d underdot
2700: case 240 :
2701: buf.append("\u1e0d");
2702: break; // d underdot
2703:
2704: case 8721 :
2705: buf.append("\u1e63");
2706: break; // s underdot
2707: case 960 :
2708: buf.append("\u017a");
2709: break; // z acute
2710: case 8747 :
2711: buf.append("\u1e45");
2712: break; // n overdot
2713: case 937 :
2714: buf.append("\u0169");
2715: break; // u tilde
2716: case 230 :
2717: buf.append("\u00e6");
2718: break; // ae
2719: case 248 :
2720: buf.append("\u00f8");
2721: break; // oslash
2722: case 191 :
2723: buf.append("\u0304\u0306");
2724: break; // macron breve
2725: case 172 :
2726: buf.append("\u1e37");
2727: break; //
2728: case 8730 :
2729: buf.append("j\u0305");
2730: break; // j macron [does a single char exist?]
2731: case 402 :
2732: buf.append("\u0103");
2733: break; // a breve
2734: case 8776 :
2735: buf.append("\u016d");
2736: break; // u breve
2737: case 187 :
2738: buf.append("\u1e42");
2739: break; // M underdot
2740: case 8230 :
2741: buf.append("\u2026");
2742: break; // ellipsis
2743: case 192 :
2744: buf.append("\u00c0");
2745: break; // A grave
2746: case 195 :
2747: buf.append("\u00c3");
2748: break; // A tilde
2749: case 213 :
2750: buf.append("\u00d5");
2751: break; // O tilde
2752: case 338 :
2753: buf.append("m\u0306");
2754: break; // m breve
2755: case 339 :
2756: buf.append("\u0153");
2757: break; // oe
2758: case 8211 :
2759: buf.append("\u2013");
2760: break; // endash
2761: case 8212 :
2762: buf.append("\u2014");
2763: break; // emdash
2764: case 8220 :
2765: buf.append("\u201c");
2766: break; // quotedblleft
2767: case 8221 :
2768: buf.append("\u201d");
2769: break; // quotedblright
2770: case 8216 :
2771: buf.append("\u2018");
2772: break; // quoteleft
2773: case 8217 :
2774: buf.append("\u2019");
2775: break; // quoteright
2776: case 247 :
2777: buf.append("\u1e37");
2778: break; // l underring [actually underdot]
2779: case 9674 :
2780: buf.append("\u1e41");
2781: break; // m overdot
2782: case 255 :
2783: buf.append("n\u0306");
2784: break; // n breve
2785: case 376 :
2786: buf.append("\u00d7");
2787: break; // multiply
2788: case 8364 :
2789: buf.append("\u1e5b");
2790: break; // r underring [actually underdot]
2791: case 8249 :
2792: buf.append("\u1e44");
2793: break; // N overdot
2794: case 8250 :
2795: buf.append("\u1e62");
2796: break; // S underdot
2797: case 64257 :
2798: buf.append("\u1e24");
2799: break; // H underdot
2800: case 64258 :
2801: buf.append("\u1e0c");
2802: break; // D underdot
2803: case 8225 :
2804: buf.append("\u2021");
2805: break; // daggerdbl
2806: case 8218 :
2807: buf.append("\u1e36");
2808: break; // L underdot
2809: case 8222 :
2810: buf.append("\u0113");
2811: break; // e macron
2812: case 194 :
2813: buf.append("\u1e5f");
2814: break; // r underbar
2815: case 202 :
2816: buf.append("r\u0324");
2817: break; // r underdieresis
2818: case 193 :
2819: buf.append("\u012a");
2820: break; // I macron
2821: case 8486 :
2822: case 203 :
2823: buf.append("\u016b");
2824: break; // u macron
2825: case 200 :
2826: buf.append("\u1e6c");
2827: break; // T underdot
2828: case 205 :
2829: buf.append("\u1e64");
2830: break; // S acute
2831: case 206 :
2832: buf.append("\u2020");
2833: break; // dagger
2834: case 207 :
2835: buf.append("\u0115");
2836: break; // e breve
2837: case 204 :
2838: buf.append("\u014f");
2839: break; // o breve
2840: case 211 :
2841: buf.append("\u0100");
2842: break; // A macron
2843: case 212 :
2844: buf.append("\u1e46");
2845: break; // N underdot
2846: case 210 :
2847: buf.append("\u1e3b");
2848: break; // l underbar
2849: case 218 :
2850: buf.append("\u016a");
2851: break; // U macron
2852: case 219 :
2853: buf.append("\u0179");
2854: break; // Z acute
2855: case 217 :
2856: buf.append("\u1e5a");
2857: break; // R underdot
2858: case 305 :
2859: buf.append("\u0131");
2860: break; // dotlessi
2861: case 710 :
2862: buf.append("\u1e47");
2863: break; // n underdot
2864: case 732 :
2865: buf.append("\u1e49");
2866: break; // n underbar
2867: case 175 :
2868: buf.append("\u0304");
2869: break; // macron
2870: case 728 :
2871: buf.append("\u0306");
2872: break; // breve
2873: case 729 :
2874: case 215 :
2875: buf.append("\u1e25");
2876: break; // h underdot
2877: case 730 :
2878: buf.append("\u012d");
2879: break; // i breve
2880: case 184 :
2881: buf.append("\u0327");
2882: break; // cedilla
2883: case 733 :
2884: buf.append("\u030b");
2885: break; // hungarumlaut
2886: case 731 :
2887: buf.append("\u0328");
2888: break; // ogonek
2889: case 711 :
2890: buf.append("\u030c");
2891: break; // caron
2892: case 199 :
2893: buf.append("\u012b\u0303");
2894: break; // imacron tilde
2895: case 8226 :
2896: buf.append("\u1e5d");
2897: break; // runderdot macron
2898: case 8482 :
2899: buf.append("\u016b\0306");
2900: break; // umacron breve
2901: case 8804 :
2902: buf.append("\u0101\u0301");
2903: break; // amacron acute
2904: case 8805 :
2905: buf.append("\u016b\u0301");
2906: break; // umacron acute
2907: case 8719 :
2908: buf.append("\u0113\u0301");
2909: break; // emacron acute
2910: case 170 :
2911: buf.append("\u0113\u0300");
2912: break; // emacron breve
2913: case 186 :
2914: buf.append("\u014d\u0300");
2915: break; // omacron breve
2916: case 161 :
2917: buf.append("\u0101\u0306");
2918: break; // amacron breve
2919: case 8710 :
2920: buf.append("\u0101\u0303");
2921: break; // amacron tilde
2922: case 171 :
2923: buf.append("\u012b\u0301");
2924: break; // imacron acute
2925: case 8260 :
2926: buf.append("\u1e00");
2927: break; // runderdotmacron acute
2928: case 183 :
2929: buf.append("\u1e5b\u0301");
2930: break; // runderdot acute
2931: case 8240 :
2932: buf.append("\u012b\u0306");
2933: break; // imacron breve
2934: case 63743 :
2935: buf.append("\u016b\u0303");
2936: break; // umacron tilde
2937: default :
2938: buf.append(c);
2939: if ((int) c > 127)
2940: System.out.println("char " + c + " " + (int) c);
2941: break;
2942: }
2943: }
2944: return buf.toString();
2945: }
2946:
2947: static public String normanToUnicodeOld(String inp)
2948: {
2949: StringBuffer buf = new StringBuffer();
2950: for (int i = 0; i < inp.length(); i++)
2951: {
2952: char c = inp.charAt(i);
2953: switch (c)
2954: {
2955: case 1 :
2956: buf.append("\u00d0");
2957: break; // Eth
2958: case 2 :
2959: buf.append("\u00f0");
2960: break; // eth
2961: case 3 :
2962: buf.append("\u0141");
2963: break; // Lslash
2964: case 4 :
2965: buf.append("\u0142");
2966: break; // lslash
2967: case 5 :
2968: buf.append("\u0160");
2969: break; // S caron
2970: case 6 :
2971: buf.append("\u0161");
2972: break; // s caron
2973: case 7 :
2974: buf.append("\u00dd");
2975: break; // Y acute
2976: case 8 :
2977: buf.append("\u00fd");
2978: break; // y acute
2979: case 11 :
2980: buf.append("\u00de");
2981: break; // Thorn
2982: case 12 :
2983: buf.append("\u00fe");
2984: break; // thorn
2985: case 14 :
2986: buf.append("\u017d");
2987: break; // Z caron
2988: case 15 :
2989: buf.append("\u017e");
2990: break; // z caron
2991: case 17 :
2992: buf.append("\u0073");
2993: break; // asciitilde
2994: case 18 :
2995: buf.append("j\u0305");
2996: break; // j macron [does a single char exist?]
2997: case 19 :
2998: buf.append("^");
2999: break; // circumflex
3000: case 20 :
3001: buf.append("\u0303");
3002: break; // tilde
3003: case 21 :
3004: buf.append("\u00bd");
3005: break; // onehalf
3006: case 22 :
3007: buf.append("\u00bc");
3008: break; // onequarter
3009: case 23 :
3010: buf.append("\u00b9");
3011: break; // onesuperior
3012: case 24 :
3013: buf.append("\u00be");
3014: break; // threequarters
3015: case 25 :
3016: buf.append("\u00b3");
3017: break; // threesuperior
3018: case 26 :
3019: buf.append("\u00b2");
3020: break; // twosuperior
3021: case 27 :
3022: buf.append("\u00a6");
3023: break; // brokenbar
3024: case 28 :
3025: buf.append("-");
3026: break; // minus
3027: case 29 :
3028: buf.append("\u00d7");
3029: break; // multiply
3030: case 39 :
3031: buf.append("'");
3032: break; // quotesingle
3033: case 94 :
3034: buf.append("\u0302");
3035: break; // circumflex
3036: case 96 :
3037: buf.append("\u0300");
3038: break; // grave
3039: case 128 :
3040: buf.append("\u00c4");
3041: break; // A dieresis
3042: case 129 :
3043: buf.append("\u00c5");
3044: break; // A ring
3045: case 131 :
3046: buf.append("\u00c9");
3047: break; // E acute
3048: case 132 :
3049: buf.append("\u00d1");
3050: break; // N tilde
3051: case 133 :
3052: buf.append("\u00d6");
3053: break; // O dieresis
3054: case 134 :
3055: buf.append("\u00dc");
3056: break; // U dieresis
3057: case 135 :
3058: buf.append("\u00e1");
3059: break; // a acute
3060: case 136 :
3061: buf.append("\u00e0");
3062: break; // a grave
3063: case 137 :
3064: buf.append("\u00e2");
3065: break; // a circumflex
3066: case 138 :
3067: buf.append("\u00e4");
3068: break; // a dieresis
3069: case 139 :
3070: buf.append("\u00e3");
3071: break; // a tilde
3072: case 140 :
3073: buf.append("\u0101");
3074: break; // a macron
3075: case 141 :
3076: buf.append("\u00e7");
3077: break; // c cedilla
3078: case 142 :
3079: buf.append("\u00e9");
3080: break; // e acute
3081: case 143 :
3082: buf.append("\u00e8");
3083: break; // e grave
3084: case 144 :
3085: buf.append("\u00ea");
3086: break; // e circumflex
3087: case 145 :
3088: buf.append("\u00eb");
3089: break; // e dieresis
3090: case 146 :
3091: buf.append("\u00ed");
3092: break; // i acute
3093: case 147 :
3094: buf.append("\u00ec");
3095: break; // i grave
3096: case 148 :
3097: buf.append("\u00ee");
3098: break; // i circumflex
3099: case 149 :
3100: buf.append("\u00ef");
3101: break; // i dieresis
3102: case 150 :
3103: buf.append("\u00f1");
3104: break; // n tilde
3105: case 151 :
3106: buf.append("\u00f3");
3107: break; // o acute
3108: case 152 :
3109: buf.append("\u00f2");
3110: break; // o grave
3111: case 153 :
3112: buf.append("\u00f4");
3113: break; // o circumflex
3114: case 154 :
3115: buf.append("\u00f6");
3116: break; // o dieresis
3117: case 155 :
3118: buf.append("\u00f5");
3119: break; // o tilde
3120: case 156 :
3121: buf.append("\u00fa");
3122: break; // u acute
3123: case 157 :
3124: buf.append("\u00f9");
3125: break; // u grave
3126: case 158 :
3127: buf.append("\u00fb");
3128: break; // u circumflex
3129: case 159 :
3130: buf.append("\u00fc");
3131: break; // u dieresis
3132: case 160 :
3133: buf.append("\u1e6d");
3134: break; // t underdot
3135: case 161 :
3136: buf.append("\u00b0");
3137: break; // degree
3138: case 162 :
3139: buf.append("\u1ebd");
3140: break; // e tilde
3141: case 163 :
3142: buf.append("\u00a3");
3143: break; // sterling
3144: case 164 :
3145: buf.append("\u00a7");
3146: break; // section
3147: case 166 :
3148: buf.append("\u00b6");
3149: break; // paragraph
3150: case 167 :
3151: buf.append("\u015b");
3152: break; // s acute
3153: case 168 :
3154: buf.append("\u1e5b");
3155: break; // r underdot
3156: case 169 :
3157: buf.append("\u1e67");
3158: break; // s caron
3159: case 171 :
3160: buf.append("\u0301");
3161: break; // acute
3162: case 172 :
3163: buf.append("\u0308");
3164: break; // dieresis
3165: case 173 :
3166: buf.append("\u1e6d");
3167: break; // t underdot
3168: case 174 :
3169: buf.append("\u00c6");
3170: break; // AE
3171: case 175 :
3172: buf.append("\u014d");
3173: break; // o macron
3174: case 176 :
3175: buf.append("\u0129");
3176: break; // i tilde
3177: case 177 :
3178: buf.append("\u00b1");
3179: break; // plusminus
3180: case 180 :
3181: buf.append("\u012b");
3182: break; // i macron
3183: case 181 :
3184: buf.append("\u1e43");
3185: break; // m underdot
3186: case 182 :
3187: buf.append("\u1e0d");
3188: break; // d underdot
3189: case 183 :
3190: buf.append("\u1e63");
3191: break; // s underdot
3192: case 185 :
3193: buf.append("\u017a");
3194: break; // z acute
3195: case 186 :
3196: buf.append("\u1e45");
3197: break; // n overdot
3198: case 189 :
3199: buf.append("\u0169");
3200: break; // u tilde
3201: case 190 :
3202: buf.append("\u00e6");
3203: break; // ae
3204: case 191 :
3205: buf.append("\u00f8");
3206: break; // oslash
3207: case 192 :
3208: buf.append("\u0304\u0306");
3209: break; // macron breve
3210: case 194 :
3211: buf.append("\u1e37");
3212: break; //
3213: case 195 :
3214: buf.append("j\u0305");
3215: break; // j macron [does a single char exist?]
3216: case 196 :
3217: buf.append("\u0103");
3218: break; // a breve
3219: case 197 :
3220: buf.append("\u016d");
3221: break; // u breve
3222: case 200 :
3223: buf.append("\u1e42");
3224: break; // M underdot
3225: case 201 :
3226: buf.append("\u2026");
3227: break; // ellipsis
3228: case 203 :
3229: buf.append("\u00c0");
3230: break; // A grave
3231: case 204 :
3232: buf.append("\u00c3");
3233: break; // A tilde
3234: case 205 :
3235: buf.append("\u00d5");
3236: break; // O tilde
3237: case 206 :
3238: buf.append("m\u0306");
3239: break; // m breve
3240: case 207 :
3241: buf.append("\u0153");
3242: break; // oe
3243: case 208 :
3244: buf.append("\u2013");
3245: break; // endash
3246: case 209 :
3247: buf.append("\u2014");
3248: break; // emdash
3249: case 210 :
3250: buf.append("\u201c");
3251: break; // quotedblleft
3252: case 211 :
3253: buf.append("\u201d");
3254: break; // quotedblright
3255: case 212 :
3256: buf.append("\u2018");
3257: break; // quoteleft
3258: case 213 :
3259: buf.append("\u2019");
3260: break; // quoteright
3261: case 214 :
3262: buf.append("\u1e37");
3263: break; // l underring [actually underdot]
3264: case 215 :
3265: buf.append("\u1e41");
3266: break; // m overdot
3267: case 216 :
3268: buf.append("n\u0306");
3269: break; // n breve
3270: case 217 :
3271: buf.append("\u00d7");
3272: break; // multiply
3273: case 219 :
3274: buf.append("\u1e5b");
3275: break; // r underring [actually underdot]
3276: case 220 :
3277: buf.append("\u1e44");
3278: break; // N overdot
3279: case 221 :
3280: buf.append("\u1e62");
3281: break; // S underdot
3282: case 222 :
3283: buf.append("\u1e24");
3284: break; // H underdot
3285: case 223 :
3286: buf.append("\u1e0c");
3287: break; // D underdot
3288: case 224 :
3289: buf.append("\u2021");
3290: break; // daggerdbl
3291: case 226 :
3292: buf.append("\u1e36");
3293: break; // L underdot
3294: case 227 :
3295: buf.append("\u0113");
3296: break; // e macron
3297: case 229 :
3298: buf.append("\u1e5f");
3299: break; // r underbar
3300: case 230 :
3301: buf.append("r\u0324");
3302: break; // r underdieresis
3303: case 231 :
3304: buf.append("\u012a");
3305: break; // I macron
3306: case 232 :
3307: buf.append("\u016b");
3308: break; // u macron
3309: case 233 :
3310: buf.append("\u01e6c");
3311: break; // T underdot
3312: case 234 :
3313: buf.append("\u1e64");
3314: break; // S acute
3315: case 235 :
3316: buf.append("\u2020");
3317: break; // dagger
3318: case 236 :
3319: buf.append("\u0115");
3320: break; // e breve
3321: case 237 :
3322: buf.append("\u014f");
3323: break; // o breve
3324: case 238 :
3325: buf.append("\u0100");
3326: break; // A macron
3327: case 239 :
3328: buf.append("\u1e46");
3329: break; // N underdot
3330: case 241 :
3331: buf.append("\u1e3b");
3332: break; // l underbar
3333: case 242 :
3334: buf.append("\u016a");
3335: break; // U macron
3336: case 243 :
3337: buf.append("\u0179");
3338: break; // Z acute
3339: case 244 :
3340: buf.append("\u1e5a");
3341: break; // R underdot
3342: case 245 :
3343: buf.append("\u0131");
3344: break; // dotlessi
3345: case 246 :
3346: buf.append("\u1e47");
3347: break; // n underdot
3348: case 247 :
3349: buf.append("\u1e49");
3350: break; // n underbar
3351: case 248 :
3352: buf.append("\u0304");
3353: break; // macron
3354: case 249 :
3355: buf.append("\u0306");
3356: break; // breve
3357: case 250 :
3358: buf.append("\u1e25");
3359: break; // h underdot
3360: case 251 :
3361: buf.append("\u012d");
3362: break; // i breve
3363: case 252 :
3364: buf.append("\u0327");
3365: break; // cedilla
3366: case 253 :
3367: buf.append("\u030b");
3368: break; // hungarumlaut
3369: case 254 :
3370: buf.append("\u0328");
3371: break; // ogonek
3372: case 255 :
3373: buf.append("\u030c");
3374: break; // caron
3375: case 130 :
3376: buf.append("\u012b\u0303");
3377: break; // imacron tilde
3378: case 165 :
3379: buf.append("\u1e5d");
3380: break; // runderdot macron
3381: case 170 :
3382: buf.append("\u016b\0306");
3383: break; // umacron breve
3384: case 178 :
3385: buf.append("\u0101\u0301");
3386: break; // amacron acute
3387: case 179 :
3388: buf.append("\u016b\u0301");
3389: break; // umacron acute
3390: case 184 :
3391: buf.append("\u0113\u0301");
3392: break; // emacron acute
3393: case 187 :
3394: buf.append("\u0113\u0300");
3395: break; // emacron breve
3396: case 188 :
3397: buf.append("\u014d\u0300");
3398: break; // omacron breve
3399: case 193 :
3400: buf.append("\u0101\u0306");
3401: break; // amacron breve
3402: case 198 :
3403: buf.append("\u0101\u0303");
3404: break; // amacron tilde
3405: case 199 :
3406: buf.append("\u012b\u0301");
3407: break; // imacron acute
3408: case 218 :
3409: buf.append("\u1e00");
3410: break; // runderdotmacron acute
3411: case 225 :
3412: buf.append("\u1e5b\u0301");
3413: break; // runderdot acute
3414: case 228 :
3415: buf.append("\u012b\u0306");
3416: break; // imacron breve
3417: case 240 :
3418: buf.append("\u016b\u0303");
3419: break; // umacron tilde
3420: default :
3421: buf.append(c);
3422: break;
3423: }
3424: }
3425: return buf.toString();
3426: }
3427:
3428: static public String normanToUnicodeNew(String inp)
3429: {
3430: StringBuffer buf = new StringBuffer();
3431: for (int i = 0; i < inp.length(); i++)
3432: {
3433: char c = inp.charAt(i);
3434: switch (c)
3435: {
3436: case 1 :
3437: buf.append("\u00d0");
3438: break; // Eth
3439: case 2 :
3440: buf.append("\u00f0");
3441: break; // eth
3442: case 3 :
3443: buf.append("\u0141");
3444: break; // Lslash
3445: case 4 :
3446: buf.append("\u0142");
3447: break; // lslash
3448: case 5 :
3449: buf.append("\u0160");
3450: break; // S caron
3451: case 6 :
3452: buf.append("\u0161");
3453: break; // s caron
3454: case 7 :
3455: buf.append("\u00dd");
3456: break; // Y acute
3457: case 8 :
3458: buf.append("\u00fd");
3459: break; // y acute
3460: case 11 :
3461: buf.append("\u00de");
3462: break; // Thorn
3463: case 12 :
3464: buf.append("\u00fe");
3465: break; // thorn
3466: case 14 :
3467: buf.append("\u017d");
3468: break; // Z caron
3469: case 15 :
3470: buf.append("\u017e");
3471: break; // z caron
3472: case 17 :
3473: buf.append("\u0073");
3474: break; // asciitilde
3475: case 18 :
3476: buf.append("j\u0305");
3477: break; // j macron [does a single char exist?]
3478: case 19 :
3479: buf.append("^");
3480: break; // circumflex
3481: case 20 :
3482: buf.append("\u0303");
3483: break; // tilde
3484: case 21 :
3485: buf.append("\u00bd");
3486: break; // onehalf
3487: case 22 :
3488: buf.append("\u00bc");
3489: break; // onequarter
3490: case 23 :
3491: buf.append("\u00b9");
3492: break; // onesuperior
3493: case 24 :
3494: buf.append("\u00be");
3495: break; // threequarters
3496: case 25 :
3497: buf.append("\u00b3");
3498: break; // threesuperior
3499: case 26 :
3500: buf.append("\u00b2");
3501: break; // twosuperior
3502: case 27 :
3503: buf.append("\u00a6");
3504: break; // brokenbar
3505: case 28 :
3506: buf.append("-");
3507: break; // minus
3508: case 29 :
3509: buf.append("\u00d7");
3510: break; // multiply
3511: case 39 :
3512: buf.append("'");
3513: break; // quotesingle
3514: case 94 :
3515: buf.append("\u0302");
3516: break; // circumflex
3517: case 96 :
3518: buf.append("\u0300");
3519: break; // grave
3520: case 196 :
3521: buf.append("\u00c4");
3522: break; // A dieresis
3523: case 197 :
3524: buf.append("\u00c5");
3525: break; // A ring
3526: case 201 :
3527: buf.append("\u00c9");
3528: break; // E acute
3529: case 209 :
3530: buf.append("\u00d1");
3531: break; // N tilde
3532: case 214 :
3533: buf.append("\u00d6");
3534: break; // O dieresis
3535: case 220 :
3536: buf.append("\u00dc");
3537: break; // U dieresis
3538: case 225 :
3539: buf.append("\u00e1");
3540: break; // a acute
3541: case 224 :
3542: buf.append("\u00e0");
3543: break; // a grave
3544: case 226 :
3545: buf.append("\u00e2");
3546: break; // a circumflex
3547: case 228 :
3548: buf.append("\u00e4");
3549: break; // a dieresis
3550: case 227 :
3551: buf.append("\u00e3");
3552: break; // a tilde
3553: case 229 :
3554: buf.append("\u0101");
3555: break; // a macron
3556: case 231 :
3557: buf.append("\u00e7");
3558: break; // c cedilla
3559: case 233 :
3560: buf.append("\u00e9");
3561: break; // e acute
3562: case 232 :
3563: buf.append("\u00e8");
3564: break; // e grave
3565: case 234 :
3566: buf.append("\u00ea");
3567: break; // e circumflex
3568: case 235 :
3569: buf.append("\u00eb");
3570: break; // e dieresis
3571: case 237 :
3572: buf.append("\u00ed");
3573: break; // i acute
3574: case 236 :
3575: buf.append("\u00ec");
3576: break; // i grave
3577: case 238 :
3578: buf.append("\u00ee");
3579: break; // i circumflex
3580: case 239 :
3581: buf.append("\u00ef");
3582: break; // i dieresis
3583: case 241 :
3584: buf.append("\u00f1");
3585: break; // n tilde
3586: case 243 :
3587: buf.append("\u00f3");
3588: break; // o acute
3589: case 242 :
3590: buf.append("\u00f2");
3591: break; // o grave
3592: case 244 :
3593: buf.append("\u00f4");
3594: break; // o circumflex
3595: case 246 :
3596: buf.append("\u00f6");
3597: break; // o dieresis
3598: case 245 :
3599: buf.append("\u00f5");
3600: break; // o tilde
3601: case 250 :
3602: buf.append("\u00fa");
3603: break; // u acute
3604: case 249 :
3605: buf.append("\u00f9");
3606: break; // u grave
3607: case 251 :
3608: buf.append("\u00fb");
3609: break; // u circumflex
3610: case 252 :
3611: buf.append("\u00fc");
3612: break; // u dieresis
3613: case 8224 :
3614: buf.append("\u1e6d");
3615: break; // t underdot
3616: case 176 :
3617: buf.append("\u00b0");
3618: break; // degree
3619: case 162 :
3620: buf.append("\u1ebd");
3621: break; // e tilde
3622: case 163 :
3623: buf.append("\u00a3");
3624: break; // sterling
3625: case 167 :
3626: buf.append("\u00a7");
3627: break; // section
3628: case 182 :
3629: buf.append("\u00b6");
3630: break; // paragraph
3631: case 223 :
3632: buf.append("\u015b");
3633: break; // s acute
3634: case 174 :
3635: buf.append("\u1e5b");
3636: break; // r underdot
3637: case 169 :
3638: buf.append("\u1e45");
3639: break; // n overdot
3640: case 180 :
3641: buf.append("\u0301");
3642: break; // acute
3643: case 168 :
3644: buf.append("\u0308");
3645: break; // dieresis
3646: case 8800 :
3647: buf.append("\u1e6d");
3648: break; // t underdot
3649: case 198 :
3650: buf.append("\u00c6");
3651: break; // AE
3652: case 216 :
3653: buf.append("\u014d");
3654: break; // o macron
3655: case 8734 :
3656: buf.append("\u0129");
3657: break; // i tilde
3658: case 177 :
3659: buf.append("\u00b1");
3660: break; // plusminus
3661: case 165 :
3662: buf.append("\u012b");
3663: break; // i macron
3664: case 181 :
3665: buf.append("\u1e43");
3666: break; // m underdot
3667: case 8706 :
3668: buf.append("\u1e0d");
3669: break; // d underdot
3670: case 8721 :
3671: buf.append("\u1e63");
3672: break; // s underdot
3673: case 960 :
3674: buf.append("\u017a");
3675: break; // z acute
3676: case 8747 :
3677: buf.append("\u1e45");
3678: break; // n overdot
3679: case 937 :
3680: buf.append("\u0169");
3681: break; // u tilde
3682: case 230 :
3683: buf.append("\u00e6");
3684: break; // ae
3685: case 248 :
3686: buf.append("\u00f8");
3687: break; // oslash
3688: case 191 :
3689: buf.append("\u0304\u0306");
3690: break; // macron breve
3691: case 172 :
3692: buf.append("\u1e37");
3693: break; //
3694: case 8730 :
3695: buf.append("j\u0305");
3696: break; // j macron [does a single char exist?]
3697: case 402 :
3698: buf.append("\u0103");
3699: break; // a breve
3700: case 8776 :
3701: buf.append("\u016d");
3702: break; // u breve
3703: case 187 :
3704: buf.append("\u1e42");
3705: break; // M underdot
3706: case 8230 :
3707: buf.append("\u2026");
3708: break; // ellipsis
3709: case 192 :
3710: buf.append("\u00c0");
3711: break; // A grave
3712: case 195 :
3713: buf.append("\u00c3");
3714: break; // A tilde
3715: case 213 :
3716: buf.append("\u00d5");
3717: break; // O tilde
3718: case 338 :
3719: buf.append("m\u0306");
3720: break; // m breve
3721: case 339 :
3722: buf.append("\u0153");
3723: break; // oe
3724: case 8211 :
3725: buf.append("\u2013");
3726: break; // endash
3727: case 8212 :
3728: buf.append("\u2014");
3729: break; // emdash
3730: case 8220 :
3731: buf.append("\u201c");
3732: break; // quotedblleft
3733: case 8221 :
3734: buf.append("\u201d");
3735: break; // quotedblright
3736: case 8216 :
3737: buf.append("\u2018");
3738: break; // quoteleft
3739: case 8217 :
3740: buf.append("\u2019");
3741: break; // quoteright
3742: case 247 :
3743: buf.append("\u1e37");
3744: break; // l underring [actually underdot]
3745: case 9674 :
3746: buf.append("\u1e41");
3747: break; // m overdot
3748: case 255 :
3749: buf.append("n\u0306");
3750: break; // n breve
3751: case 376 :
3752: buf.append("\u00d7");
3753: break; // multiply
3754: case 8364 :
3755: buf.append("\u1e5b");
3756: break; // r underring [actually underdot]
3757: case 8249 :
3758: buf.append("\u1e44");
3759: break; // N overdot
3760: case 8250 :
3761: buf.append("\u1e62");
3762: break; // S underdot
3763: case 64257 :
3764: buf.append("\u1e24");
3765: break; // H underdot
3766: case 64258 :
3767: buf.append("\u1e0c");
3768: break; // D underdot
3769: case 8225 :
3770: buf.append("\u2021");
3771: break; // daggerdbl
3772: case 8218 :
3773: buf.append("\u1e36");
3774: break; // L underdot
3775: case 8222 :
3776: buf.append("\u0113");
3777: break; // e macron
3778: case 194 :
3779: buf.append("\u1e5f");
3780: break; // r underbar
3781: case 202 :
3782: buf.append("r\u0324");
3783: break; // r underdieresis
3784: case 193 :
3785: buf.append("\u012a");
3786: break; // I macron
3787: case 203 :
3788: buf.append("\u016b");
3789: break; // u macron
3790: case 200 :
3791: buf.append("\u1e6c");
3792: break; // T underdot
3793: case 205 :
3794: buf.append("\u1e64");
3795: break; // S acute
3796: case 206 :
3797: buf.append("\u2020");
3798: break; // dagger
3799: case 207 :
3800: buf.append("\u0115");
3801: break; // e breve
3802: case 204 :
3803: buf.append("\u014f");
3804: break; // o breve
3805: case 211 :
3806: buf.append("\u0100");
3807: break; // A macron
3808: case 212 :
3809: buf.append("\u1e46");
3810: break; // N underdot
3811: case 210 :
3812: buf.append("\u1e3b");
3813: break; // l underbar
3814: case 218 :
3815: buf.append("\u016a");
3816: break; // U macron
3817: case 219 :
3818: buf.append("\u0179");
3819: break; // Z acute
3820: case 217 :
3821: buf.append("\u1e5a");
3822: break; // R underdot
3823: case 305 :
3824: buf.append("\u0131");
3825: break; // dotlessi
3826: case 710 :
3827: buf.append("\u1e47");
3828: break; // n underdot
3829: case 732 :
3830: buf.append("\u1e49");
3831: break; // n underbar
3832: case 175 :
3833: buf.append("\u0304");
3834: break; // macron
3835: case 728 :
3836: buf.append("\u0306");
3837: break; // breve
3838: case 729 :
3839: buf.append("\u1e25");
3840: break; // h underdot
3841: case 730 :
3842: buf.append("\u012d");
3843: break; // i breve
3844: case 184 :
3845: buf.append("\u0327");
3846: break; // cedilla
3847: case 733 :
3848: buf.append("\u030b");
3849: break; // hungarumlaut
3850: case 731 :
3851: buf.append("\u0328");
3852: break; // ogonek
3853: case 711 :
3854: buf.append("\u030c");
3855: break; // caron
3856: case 199 :
3857: buf.append("\u012b\u0303");
3858: break; // imacron tilde
3859: case 8226 :
3860: buf.append("\u1e5d");
3861: break; // runderdot macron
3862: case 8482 :
3863: buf.append("\u016b\0306");
3864: break; // umacron breve
3865: case 8804 :
3866: buf.append("\u0101\u0301");
3867: break; // amacron acute
3868: case 8805 :
3869: buf.append("\u016b\u0301");
3870: break; // umacron acute
3871: case 8719 :
3872: buf.append("\u0113\u0301");
3873: break; // emacron acute
3874: case 170 :
3875: buf.append("\u0113\u0300");
3876: break; // emacron breve
3877: case 186 :
3878: buf.append("\u014d\u0300");
3879: break; // omacron breve
3880: case 161 :
3881: buf.append("\u0101\u0306");
3882: break; // amacron breve
3883: case 8710 :
3884: buf.append("\u0101\u0303");
3885: break; // amacron tilde
3886: case 171 :
3887: buf.append("\u012b\u0301");
3888: break; // imacron acute
3889: case 8260 :
3890: buf.append("\u1e00");
3891: break; // runderdotmacron acute
3892: case 183 :
3893: buf.append("\u1e5b\u0301");
3894: break; // runderdot acute
3895: case 8240 :
3896: buf.append("\u012b\u0306");
3897: break; // imacron breve
3898: case 63743 :
3899: buf.append("\u016b\u0303");
3900: break; // umacron tilde
3901: default :
3902: buf.append(c);
3903: break;
3904: }
3905: }
3906: return buf.toString();
3907: }
3908:
3909: public static ConversionProperties getFieldNamesAndDestTableName(String create, String query, String tableName)
3910: {
3911: String[] fieldNames = null;
3912: String destTableName = null;
3913: // determine destTableName from createStatement or from source table
3914: // name
3915: if (!create.equals(""))
3916: {
3917: int fromIndex = create.toLowerCase().indexOf("table") + 5;
3918: int toIndex = create.indexOf("(");
3919: int endIndex = create.indexOf(")", toIndex);
3920:
3921: destTableName = create.substring(fromIndex, toIndex).replaceAll(beanDest.getQC(), "").trim();
3922: System.out.println("destTable " + destTableName);
3923: // retrieve field_names from select statement
3924: // TODO problem with different fieldNames in create statement will
3925: // overwrite them
3926: if (query.indexOf("*") < 0)
3927: {
3928: int selectEndIndex = query.indexOf("from");
3929: StringTokenizer tokenizer = new StringTokenizer(query.substring(6, selectEndIndex), ",");
3930: int numFields = tokenizer.countTokens();
3931: fieldNames = new String[numFields];
3932: int fieldIndex = 0;
3933: while (tokenizer.hasMoreTokens())
3934: {
3935: String fieldName = tokenizer.nextToken().trim();
3936: fieldNames[fieldIndex] = convertText(fieldName);
3937: System.out.println(fieldNames[fieldIndex]);
3938: fieldIndex++;
3939: }
3940:
3941: }
3942: else
3943: {
3944: // use create statement for field names
3945: StringTokenizer tokenizer = new StringTokenizer(create.substring(toIndex + 1, endIndex), ",");
3946: int numFields = tokenizer.countTokens();
3947: fieldNames = new String[numFields];
3948: int fieldIndex = 0;
3949: while (tokenizer.hasMoreTokens())
3950: {
3951: String fieldName = tokenizer.nextToken().trim();
3952: int index = fieldName.lastIndexOf(" ");
3953: fieldNames[fieldIndex] = fieldName.substring(0, index);
3954: System.out.println(fieldNames[fieldIndex]);
3955: fieldIndex++;
3956: }
3957: }
3958: }
3959: else
3960: {
3961: destTableName = convertText(tableName);
3962:
3963: // retrieve field_names from select statement
3964: if (query.indexOf("*") < 0)
3965: {
3966: int selectEndIndex = query.indexOf("from");
3967: StringTokenizer tokenizer = new StringTokenizer(query.substring(6, selectEndIndex), ",");
3968: int numFields = tokenizer.countTokens();
3969: fieldNames = new String[numFields];
3970: int fieldIndex = 0;
3971: while (tokenizer.hasMoreTokens())
3972: {
3973: String fieldName = tokenizer.nextToken().trim();
3974: fieldNames[fieldIndex] = beanDest.getQC() + convertText(fieldName) + beanDest.getQC();
3975: // System.out.println("field "+ fieldNames[fieldIndex]);
3976: fieldIndex++;
3977: }
3978:
3979: }
3980: else
3981: {
3982: Vector fieldNamesVec = bean.getColumnNames();
3983: fieldNames = new String[fieldNamesVec.size()];
3984: int fieldIndex = -1;
3985: for (Iterator iter = fieldNamesVec.iterator(); iter.hasNext();)
3986: {
3987: String element = (String) iter.next();
3988: fieldNames[++fieldIndex] = beanDest.getQC() + convertText(element) + beanDest.getQC();
3989: // System.out.println("field " + fieldNames[fieldIndex]);
3990: }
3991: }
3992: }
3993: return new ConversionProperties(destTableName, fieldNames);
3994: }
3995:
3996: /**
3997: * creates an insert into statement for the specified table and given field
3998: * names
3999: *
4000: * @param destTableName
4001: * @param fieldNames
4002: * @return
4003: */
4004: public static StringBuffer createInsertCommand(String destTableName, String[] fieldNames)
4005: {
4006: StringBuffer command = new StringBuffer();
4007: command.append("INSERT INTO ");
4008: command.append(beanDest.getQC());
4009: command.append(destTableName); //convertText((String)
4010: // names.get(tbIndex)));
4011: command.append(beanDest.getQC());
4012: command.append(" (");
4013: for (int i = 0; i < fieldNames.length; i++)
4014: {
4015: command.append(fieldNames[i]);
4016: if (i < fieldNames.length - 1)
4017: command.append(",");
4018: }
4019: command.append(") ");
4020:
4021: command.append(" values ( ");
4022: // add a question marks for every field
4023: for (int i = 0; i < bean.getColumnNames().size() - 1; ++i)
4024: command.append("?,");
4025: command.append("?)");
4026: return command;
4027: }
4028:
4029: public static StringBuffer createUpdateCommand(String destTableName, String[] fieldNames, String id)
4030: {
4031: StringBuffer command = new StringBuffer();
4032:
4033: command.append("UPDATE ");
4034: command.append(beanDest.getQC());
4035: command.append(destTableName);
4036: //command.append(convertText((String) names.get(tbIndex)));
4037: command.append(beanDest.getQC());
4038: command.append(" SET ");
4039:
4040: int size = bean.getColumnNames().size();
4041: for (int i = 0; i < size - 1; ++i)
4042: command.append(fieldNames[i] + " = ? ,");
4043: command.append(fieldNames[size - 1] + " = ? ");
4044: command.append("WHERE " + id + " = ?");
4045: return command;
4046: }
4047:
4048: public static StringBuffer createDeleteCommand(String destTableName, String idField)
4049: {
4050: StringBuffer command = new StringBuffer();
4051:
4052: command.append("DELETE FROM");
4053: command.append(beanDest.getQC());
4054: command.append(destTableName);
4055: //command.append(convertText((String) names.get(tbIndex)));
4056: command.append(beanDest.getQC());
4057: command.append("WHERE " + idField + " = ?");
4058: return command;
4059: }
4060:
4061: public void makeTest(String table, String idField, String tempQuery) throws Exception
4062: {
4063: int counter = 0;
4064:
4065: // ****** test code *****
4066:
4067: bean.getConnection();
4068: ResultSet resultSet = null;
4069: String lastResult = "P227634.11";//"P227625.79554";//"P227625.77391";//"P116034.970998";
4070: String myQuery = "select " + bean.getQC() + idField + bean.getQC() + ",serial " + " from " + bean.getQC() + table + bean.getQC();
4071: System.out.println("Query is now " + myQuery);
4072: JDialog statusDialog = new JDialog();
4073: statusDialog.setTitle("Status Information");
4074: JLabel status = new JLabel("actual DataSet : ");
4075: JLabel status2 = new JLabel(Integer.toString(++counter));
4076: JLabel status3 = new JLabel(lastResult);
4077:
4078: JPanel statusPanel = new JPanel();
4079: JPanel statusPanel2 = new JPanel();
4080: statusPanel.add(status);
4081: statusPanel.add(status2);
4082: statusPanel2.add(status3);
4083: statusDialog.getContentPane().add(statusPanel, "North");
4084: statusDialog.getContentPane().add(statusPanel2, "Center");
4085: statusDialog.setLocation(400, 500);
4086: statusDialog.setSize(300, 150);
4087: statusDialog.setVisible(true);
4088: while (true)
4089: {
4090: if (!statusDialog.isVisible())
4091: statusDialog.setVisible(true);
4092: tempQuery = myQuery + " where " + bean.getQC() + idField + bean.getQC() + ">'" + lastResult + "'";
4093: resultSet = bean.makeQuery(tempQuery, 1);
4094: if (resultSet == null)
4095: {
4096: System.out.println("lastResult was " + lastResult + " counter was " + counter);
4097: break;
4098: }
4099: else
4100: {
4101: resultSet.next();
4102: lastResult = resultSet.getString(1);
4103: counter++;
4104: status2.setText(Integer.toString(counter));
4105: status3.setText(lastResult + " " + resultSet.getString(2));
4106: if (counter % 100 == 0)
4107: {
4108: System.out.println("actual Result was " + lastResult + " counter was " + counter);
4109: // break;
4110: }
4111: }
4112: resultSet = null;
4113: }
4114: System.exit(0);
4115:
4116: //****** end Test ******
4117:
4118: }
4119: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>