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