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