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, db.delimiter);
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, String delimiter) 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, 0);
2014: myIdsDest = beanDest.getIDVector(convertText(idField), destTableName, tempQueryDest, 0);
2015: //System.out.println("status of remove "+myIds.remove("b015892"));
2016: if (myIds.isEmpty())
2017: break;
2018: vec = new Vector(myIds);
2019: vecDest = new Vector(myIdsDest);
2020: rowCount = vec.size();
2021: // Deletion will work this way
2022: Vector deleted = new Vector(vec);
2023:
2024: TreeSet linesToAppend = new TreeSet(vec);
2025: linesToAppend.addAll(vec);
2026: linesToDelete = new TreeSet(vecDest);
2027: // remove all lines that are already in dest database
2028: linesToAppend.removeAll(vecDest);
2029: // remove all lines that should not be deleted
2030: linesToDelete.removeAll(deleted);
2031: System.out.println("linesToAppend " + linesToAppend + " " + destTableName);
2032: System.out.println("linesToDelete " + linesToDelete + " " + destTableName);
2033: System.out.println("ID LIST SIZE " + Math.round((double) myIds.size() / (double) numIntervalls) + " " + myIds.size());
2034: deltaID = (int) Math.round((double) myIds.size() / (double) numIntervalls);
2035: ConversionProperties prop = getFieldNamesAndDestTableName(creates.get(tbIndex).toString(), query, names.get(tbIndex).toString());
2036: StringBuffer insCommand = createInsertCommand(prop.destTableName, prop.fieldNames);
2037: StringBuffer updCommand = createUpdateCommand(prop.destTableName, prop.fieldNames, tempIDdest);
2038: StringBuffer delCommand = createDeleteCommand(destTableName, tempIDdest);
2039: PreparedStatement insPst = beanDest.getConnection().prepareStatement(insCommand.toString());
2040: PreparedStatement updPst = beanDest.getConnection().prepareStatement(updCommand.toString());
2041: delPSt = beanDest.getConnection().prepareStatement(delCommand.toString());
2042: // delPSt.setString(1,"b015892");
2043: // delPSt.execute();
2044: // if (true)
2045: // return;
2046: if (vec.size() <= numIntervalls)
2047: {
2048: endIndex = 0;
2049: deltaID = vec.size();
2050: }
2051: for (int k = 0; k < vec.size() - deltaID; k = k + deltaID)
2052: {
2053: System.out.println(vec.get(k) + " " + vec.get(k + deltaID) + " " + vec.lastElement());
2054: if (query.indexOf("where") > 0)
2055: tempQuery = query + " and " + tempID + ">='" + vec.get(k) + "' and " + tempID + "<='" + vec.get(k + deltaID) + "'";
2056: else
2057: tempQuery = query + " where " + tempID + ">='" + vec.get(k) + "' and " + tempID + "<='" + vec.get(k + deltaID) + "'";
2058: System.out.println(tempQuery);
2059: if (dialog != null)
2060: dialog.title.setText("Reading table data ...");
2061:
2062: // bean.makeQuery(tempQuery, deltaID);
2063: if (dialog != null)
2064: dialog.title.setText("Writing table data ...");
2065:
2066: performSynchronize(idField, vec, tempQuery, linesToDelete, linesToAppend, insPst, updPst, delPSt, deltaID, delimiter);
2067: // System.out.println("ID LIST SIZE " + Math.round((double) myIds.size() / (double) numIntervalls) + " " + myIdsDest.size());
2068: endIndex = k + deltaID;
2069: }
2070: System.out.println(endIndex);
2071: //all data written ? if not write last chunk of data
2072: if (endIndex == vec.size() - 1)
2073: System.out.println("fits");
2074: else
2075: {
2076: System.out.println(" last intervall from " + vec.get(endIndex) + " " + vec.lastElement());
2077:
2078: if (query.indexOf("where") > 0)
2079: tempQuery = query + " and " + tempID + ">='" + vec.get(endIndex) + "' and " + tempID + "<='" + vec.lastElement() + "'";
2080: else
2081: tempQuery = query + " where " + tempID + ">='" + vec.get(endIndex) + "' and " + tempID + "<='" + vec.lastElement() + "'";
2082: System.out.println(tempQuery);
2083: if (dialog != null)
2084: dialog.title.setText("Reading table data ...");
2085: // bean.makeQuery(tempQuery, 0);
2086: if (dialog != null)
2087: dialog.title.setText("Writing table data ...");
2088: performSynchronize(idField, vec, tempQuery, linesToDelete, linesToAppend, insPst, updPst, delPSt, deltaID, delimiter);
2089: // System.out.println("ID LIST SIZE " + Math.round((double) myIds.size() / (double) numIntervalls) + " " + myIdsDest.size());
2090: }
2091: // prepare new query for next chunk
2092: if (query.indexOf("where") > 0)
2093: tempQuery = query + " and " + tempID + ">'" + vec.lastElement() + "'";
2094: else
2095: tempQuery = query + " where " + tempID + ">'" + vec.lastElement() + "'";
2096:
2097: }
2098:
2099: for (Iterator iter = linesToDelete.iterator(); iter.hasNext();)
2100: {
2101: String id = (String) iter.next();
2102: delPSt.setString(1, id);
2103: delPSt.execute();
2104:
2105: }
2106:
2107: long endTime = System.currentTimeMillis();
2108: System.out.println("Time for incremental synchronize elapsed " + (endTime - startTime));
2109: } // to idfield if
2110: } // table loop
2111:
2112: } catch (Exception e)
2113: {
2114: System.out.println("Error while connecting to database " + e);
2115: e.printStackTrace();
2116: if (dialog != null)
2117: {
2118: dialog.setVisible(false);
2119: dialog.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
2120: FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
2121: }
2122: java.io.ByteArrayOutputStream b = new java.io.ByteArrayOutputStream();
2123: java.io.PrintStream stream = new java.io.PrintStream(b);
2124: stream.print(command + "\n\n");
2125: e.printStackTrace(stream);
2126: FM2SQL.showErrorDialog(b.toString(), "Error occured !");
2127:
2128: }
2129: if (dialog != null)
2130: {
2131: dialog.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
2132: FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
2133:
2134: dialog.setVisible(false);
2135: }
2136: }
2137: private static void performSynchronize(
2138: String idField,
2139: Vector vec,
2140: String tempQuery,
2141: TreeSet linesToDelete,
2142: TreeSet linesToAppend,
2143: PreparedStatement insPst,
2144: PreparedStatement updPst,
2145: PreparedStatement delPSt,
2146: int deltaID,
2147: String delimiter)
2148: throws SQLException, ParseException
2149: {
2150: Vector[] vectors = bean.getQueryData(tempQuery, deltaID);
2151: int idIndex = vectors[1].indexOf(idField);
2152: // todo arraylist code has to be added
2153: for (Iterator iter = vectors[0].iterator(); iter.hasNext();)
2154: {
2155: Vector line = (Vector) iter.next();
2156: Object lineIDIndex = line.get(idIndex);
2157: if (linesToAppend.contains(lineIDIndex))
2158: System.out.println("line " + linesToAppend.contains(line.get(idIndex)) + " " + lineIDIndex);
2159: if (linesToAppend.contains(lineIDIndex))
2160: {
2161: for (int l = 0; l < line.size(); ++l)
2162: {
2163: Object obj = line.get(l);
2164: if (obj instanceof ArrayList)
2165: obj = formatFileMakerArray((List) obj, delimiter);
2166: if (obj != null)
2167: insPst.setString(l + 1, obj.toString());
2168: else
2169: insPst.setNull(l + 1, Types.NULL);
2170: }
2171: insPst.execute();
2172:
2173: } else // update
2174: {
2175: for (int l = 0; l < line.size(); ++l)
2176: {
2177: Object obj = line.get(l);
2178: if (obj instanceof ArrayList)
2179: obj = formatFileMakerArray((List) obj, delimiter);
2180: if (obj != null)
2181: updPst.setString(l + 1, obj.toString());
2182: else
2183: updPst.setNull(l + 1, Types.NULL);
2184: }
2185: updPst.setString(line.size() + 1, line.get(idIndex).toString());
2186: updPst.execute();
2187:
2188: }
2189: }
2190:
2191: } // to method
2192:
2193: /**
2194: * Converts input String in norman encoding to unicode
2195: * @param inp
2196: * @return converted String
2197: */
2198: static public String normanToUnicode(String inp)
2199: {
2200: StringBuffer buf = new StringBuffer();
2201: for (int i = 0; i < inp.length(); i++)
2202: {
2203: char c = inp.charAt(i);
2204: // System.out.println("char "+c+" "+(int)c);
2205: switch (c)
2206: {
2207: case 1 :
2208: buf.append("\u00d0");
2209: break; // Eth
2210: case 2 :
2211: buf.append("\u00f0");
2212: break; // eth
2213: case 3 :
2214: buf.append("\u0141");
2215: break; // Lslash
2216: case 4 :
2217: buf.append("\u0142");
2218: break; // lslash
2219: case 5 :
2220: buf.append("\u0160");
2221: break; // S caron
2222: case 6 :
2223: buf.append("\u0161");
2224: break; // s caron
2225: case 7 :
2226: buf.append("\u00dd");
2227: break; // Y acute
2228: case 8 :
2229: buf.append("\u00fd");
2230: break; // y acute
2231: case 11 :
2232: buf.append("\u00de");
2233: break; // Thorn
2234: case 12 :
2235: buf.append("\u00fe");
2236: break; // thorn
2237: case 14 :
2238: buf.append("\u017d");
2239: break; // Z caron
2240: case 15 :
2241: buf.append("\u017e");
2242: break; // z caron
2243: case 17 :
2244: buf.append("\u0073");
2245: break; // asciitilde
2246: case 18 :
2247: buf.append("j\u0305");
2248: break; // j macron [does a single char exist?]
2249: case 19 :
2250: buf.append("^");
2251: break; // circumflex
2252: case 20 :
2253: buf.append("\u0303");
2254: break; // tilde
2255: case 21 :
2256: buf.append("\u00bd");
2257: break; // onehalf
2258: case 22 :
2259: buf.append("\u00bc");
2260: break; // onequarter
2261: case 23 :
2262: buf.append("\u00b9");
2263: break; // onesuperior
2264: case 24 :
2265: buf.append("\u00be");
2266: break; // threequarters
2267: case 25 :
2268: buf.append("\u00b3");
2269: break; // threesuperior
2270: case 26 :
2271: buf.append("\u00b2");
2272: break; // twosuperior
2273: case 27 :
2274: buf.append("\u00a6");
2275: break; // brokenbar
2276: case 28 :
2277: buf.append("-");
2278: break; // minus
2279: case 29 :
2280: buf.append("\u00d7");
2281: break; // multiply
2282: case 39 :
2283: buf.append("'");
2284: break; // quotesingle
2285: case 94 :
2286: buf.append("\u0302");
2287: break; // circumflex
2288: case 96 :
2289: buf.append("\u0300");
2290: break; // grave
2291: case 196 :
2292: buf.append("\u00c4");
2293: break; // A dieresis
2294: case 197 :
2295: buf.append("\u00c5");
2296: break; // A ring
2297: case 201 :
2298: buf.append("\u00c9");
2299: break; // E acute
2300: case 209 :
2301: buf.append("\u00d1");
2302: break; // N tilde
2303: case 214 :
2304: buf.append("\u00d6");
2305: break; // O dieresis
2306: case 220 :
2307: buf.append("\u00dc");
2308: break; // U dieresis
2309: case 225 :
2310: buf.append("\u00e1");
2311: break; // a acute
2312: case 224 :
2313: buf.append("\u00e0");
2314: break; // a grave
2315: case 226 :
2316: buf.append("\u00e2");
2317: break; // a circumflex
2318: case 228 :
2319: buf.append("\u00e4");
2320: break; // a dieresis
2321: case 227 :
2322: buf.append("\u00e3");
2323: break; // a tilde
2324: case 229 :
2325: buf.append("\u0101");
2326: break; // a macron
2327: case 231 :
2328: buf.append("\u00e7");
2329: break; // c cedilla
2330: case 233 :
2331: buf.append("\u00e9");
2332: break; // e acute
2333: case 232 :
2334: buf.append("\u00e8");
2335: break; // e grave
2336: case 234 :
2337: buf.append("\u00ea");
2338: break; // e circumflex
2339: case 235 :
2340: buf.append("\u00eb");
2341: break; // e dieresis
2342: case 237 :
2343: buf.append("\u00ed");
2344: break; // i acute
2345: case 236 :
2346: buf.append("\u00ec");
2347: break; // i grave
2348: case 238 :
2349: buf.append("\u00ee");
2350: break; // i circumflex
2351: case 239 :
2352: buf.append("\u00ef");
2353: break; // i dieresis
2354: case 241 :
2355: buf.append("\u00f1");
2356: break; // n tilde
2357: case 243 :
2358: buf.append("\u00f3");
2359: break; // o acute
2360: case 242 :
2361: buf.append("\u00f2");
2362: break; // o grave
2363: case 244 :
2364: buf.append("\u00f4");
2365: break; // o circumflex
2366: case 246 :
2367: buf.append("\u00f6");
2368: break; // o dieresis
2369: case 245 :
2370: buf.append("\u00f5");
2371: break; // o tilde
2372: case 250 :
2373: buf.append("\u00fa");
2374: break; // u acute
2375: case 249 :
2376: buf.append("\u00f9");
2377: break; // u grave
2378: case 251 :
2379: buf.append("\u00fb");
2380: break; // u circumflex
2381: case 252 :
2382: buf.append("\u00fc");
2383: break; // u dieresis
2384: case 8224 :
2385: buf.append("\u1e6d");
2386: break; // t underdot
2387: case 176 :
2388: buf.append("\u00b0");
2389: break; // degree
2390: case 162 :
2391: buf.append("\u1ebd");
2392: break; // e tilde
2393: case 163 :
2394: buf.append("\u00a3");
2395: break; // sterling
2396: case 167 :
2397: buf.append("\u00a7");
2398: break; // section
2399: case 182 :
2400: buf.append("\u00b6");
2401: break; // paragraph
2402: case 223 :
2403: buf.append("\u015b");
2404: break; // s acute
2405: case 174 :
2406: buf.append("\u1e5b");
2407: break; // r underdot
2408: case 169 :
2409: buf.append("\u1e45");
2410: break; // n overdot
2411: case 353 :
2412: buf.append("\u1e45");
2413: break; // n overdot
2414: case 180 :
2415: buf.append("\u0301");
2416: break; // acute
2417: case 168 :
2418: buf.append("\u0308");
2419: break; // dieresis
2420: case 8800 :
2421: buf.append("\u1e6d");
2422: break; // t underdot
2423: case 198 :
2424: buf.append("\u00c6");
2425: break; // AE
2426: case 216 :
2427: buf.append("\u014d");
2428: break; // o macron
2429: case 8734 :
2430: buf.append("\u0129");
2431: break; // i tilde
2432: case 177 :
2433: buf.append("\u00b1");
2434: break; // plusminus
2435: case 165 :
2436: buf.append("\u012b");
2437: break; // i macron
2438: case 181 :
2439: buf.append("\u1e43");
2440: break; // m underdot
2441: case 8706 :
2442: buf.append("\u1e0d");
2443: break; // d underdot
2444: case 240 :
2445: buf.append("\u1e0d");
2446: break; // d underdot
2447:
2448: case 8721 :
2449: buf.append("\u1e63");
2450: break; // s underdot
2451: case 960 :
2452: buf.append("\u017a");
2453: break; // z acute
2454: case 8747 :
2455: buf.append("\u1e45");
2456: break; // n overdot
2457: case 937 :
2458: buf.append("\u0169");
2459: break; // u tilde
2460: case 230 :
2461: buf.append("\u00e6");
2462: break; // ae
2463: case 248 :
2464: buf.append("\u00f8");
2465: break; // oslash
2466: case 191 :
2467: buf.append("\u0304\u0306");
2468: break; // macron breve
2469: case 172 :
2470: buf.append("\u1e37");
2471: break; //
2472: case 8730 :
2473: buf.append("j\u0305");
2474: break; // j macron [does a single char exist?]
2475: case 402 :
2476: buf.append("\u0103");
2477: break; // a breve
2478: case 8776 :
2479: buf.append("\u016d");
2480: break; // u breve
2481: case 187 :
2482: buf.append("\u1e42");
2483: break; // M underdot
2484: case 8230 :
2485: buf.append("\u2026");
2486: break; // ellipsis
2487: case 192 :
2488: buf.append("\u00c0");
2489: break; // A grave
2490: case 195 :
2491: buf.append("\u00c3");
2492: break; // A tilde
2493: case 213 :
2494: buf.append("\u00d5");
2495: break; // O tilde
2496: case 338 :
2497: buf.append("m\u0306");
2498: break; // m breve
2499: case 339 :
2500: buf.append("\u0153");
2501: break; // oe
2502: case 8211 :
2503: buf.append("\u2013");
2504: break; // endash
2505: case 8212 :
2506: buf.append("\u2014");
2507: break; // emdash
2508: case 8220 :
2509: buf.append("\u201c");
2510: break; // quotedblleft
2511: case 8221 :
2512: buf.append("\u201d");
2513: break; // quotedblright
2514: case 8216 :
2515: buf.append("\u2018");
2516: break; // quoteleft
2517: case 8217 :
2518: buf.append("\u2019");
2519: break; // quoteright
2520: case 247 :
2521: buf.append("\u1e37");
2522: break; // l underring [actually underdot]
2523: case 9674 :
2524: buf.append("\u1e41");
2525: break; // m overdot
2526: case 255 :
2527: buf.append("n\u0306");
2528: break; // n breve
2529: case 376 :
2530: buf.append("\u00d7");
2531: break; // multiply
2532: case 8364 :
2533: buf.append("\u1e5b");
2534: break; // r underring [actually underdot]
2535: case 8249 :
2536: buf.append("\u1e44");
2537: break; // N overdot
2538: case 8250 :
2539: buf.append("\u1e62");
2540: break; // S underdot
2541: case 64257 :
2542: buf.append("\u1e24");
2543: break; // H underdot
2544: case 64258 :
2545: buf.append("\u1e0c");
2546: break; // D underdot
2547: case 8225 :
2548: buf.append("\u2021");
2549: break; // daggerdbl
2550: case 8218 :
2551: buf.append("\u1e36");
2552: break; // L underdot
2553: case 8222 :
2554: buf.append("\u0113");
2555: break; // e macron
2556: case 194 :
2557: buf.append("\u1e5f");
2558: break; // r underbar
2559: case 202 :
2560: buf.append("r\u0324");
2561: break; // r underdieresis
2562: case 193 :
2563: buf.append("\u012a");
2564: break; // I macron
2565: case 8486 :
2566: case 203 :
2567: buf.append("\u016b");
2568: break; // u macron
2569: case 200 :
2570: buf.append("\u1e6c");
2571: break; // T underdot
2572: case 205 :
2573: buf.append("\u1e64");
2574: break; // S acute
2575: case 206 :
2576: buf.append("\u2020");
2577: break; // dagger
2578: case 207 :
2579: buf.append("\u0115");
2580: break; // e breve
2581: case 204 :
2582: buf.append("\u014f");
2583: break; // o breve
2584: case 211 :
2585: buf.append("\u0100");
2586: break; // A macron
2587: case 212 :
2588: buf.append("\u1e46");
2589: break; // N underdot
2590: case 210 :
2591: buf.append("\u1e3b");
2592: break; // l underbar
2593: case 218 :
2594: buf.append("\u016a");
2595: break; // U macron
2596: case 219 :
2597: buf.append("\u0179");
2598: break; // Z acute
2599: case 217 :
2600: buf.append("\u1e5a");
2601: break; // R underdot
2602: case 305 :
2603: buf.append("\u0131");
2604: break; // dotlessi
2605: case 710 :
2606: buf.append("\u1e47");
2607: break; // n underdot
2608: case 732 :
2609: buf.append("\u1e49");
2610: break; // n underbar
2611: case 175 :
2612: buf.append("\u0304");
2613: break; // macron
2614: case 728 :
2615: buf.append("\u0306");
2616: break; // breve
2617: case 729 :
2618: case 215 :
2619: buf.append("\u1e25");
2620: break; // h underdot
2621: case 730 :
2622: buf.append("\u012d");
2623: break; // i breve
2624: case 184 :
2625: buf.append("\u0327");
2626: break; // cedilla
2627: case 733 :
2628: buf.append("\u030b");
2629: break; // hungarumlaut
2630: case 731 :
2631: buf.append("\u0328");
2632: break; // ogonek
2633: case 711 :
2634: buf.append("\u030c");
2635: break; // caron
2636: case 199 :
2637: buf.append("\u012b\u0303");
2638: break; // imacron tilde
2639: case 8226 :
2640: buf.append("\u1e5d");
2641: break; // runderdot macron
2642: case 8482 :
2643: buf.append("\u016b\0306");
2644: break; // umacron breve
2645: case 8804 :
2646: buf.append("\u0101\u0301");
2647: break; // amacron acute
2648: case 8805 :
2649: buf.append("\u016b\u0301");
2650: break; // umacron acute
2651: case 8719 :
2652: buf.append("\u0113\u0301");
2653: break; // emacron acute
2654: case 170 :
2655: buf.append("\u0113\u0300");
2656: break; // emacron breve
2657: case 186 :
2658: buf.append("\u014d\u0300");
2659: break; // omacron breve
2660: case 161 :
2661: buf.append("\u0101\u0306");
2662: break; // amacron breve
2663: case 8710 :
2664: buf.append("\u0101\u0303");
2665: break; // amacron tilde
2666: case 171 :
2667: buf.append("\u012b\u0301");
2668: break; // imacron acute
2669: case 8260 :
2670: buf.append("\u1e00");
2671: break; // runderdotmacron acute
2672: case 183 :
2673: buf.append("\u1e5b\u0301");
2674: break; // runderdot acute
2675: case 8240 :
2676: buf.append("\u012b\u0306");
2677: break; // imacron breve
2678: case 63743 :
2679: buf.append("\u016b\u0303");
2680: break; // umacron tilde
2681: default :
2682: buf.append(c);
2683: if ((int) c > 127)
2684: System.out.println("char " + c + " " + (int) c);
2685: break;
2686: }
2687: }
2688: return buf.toString();
2689: }
2690:
2691: static public String normanToUnicodeOld(String inp)
2692: {
2693: StringBuffer buf = new StringBuffer();
2694: for (int i = 0; i < inp.length(); i++)
2695: {
2696: char c = inp.charAt(i);
2697: switch (c)
2698: {
2699: case 1 :
2700: buf.append("\u00d0");
2701: break; // Eth
2702: case 2 :
2703: buf.append("\u00f0");
2704: break; // eth
2705: case 3 :
2706: buf.append("\u0141");
2707: break; // Lslash
2708: case 4 :
2709: buf.append("\u0142");
2710: break; // lslash
2711: case 5 :
2712: buf.append("\u0160");
2713: break; // S caron
2714: case 6 :
2715: buf.append("\u0161");
2716: break; // s caron
2717: case 7 :
2718: buf.append("\u00dd");
2719: break; // Y acute
2720: case 8 :
2721: buf.append("\u00fd");
2722: break; // y acute
2723: case 11 :
2724: buf.append("\u00de");
2725: break; // Thorn
2726: case 12 :
2727: buf.append("\u00fe");
2728: break; // thorn
2729: case 14 :
2730: buf.append("\u017d");
2731: break; // Z caron
2732: case 15 :
2733: buf.append("\u017e");
2734: break; // z caron
2735: case 17 :
2736: buf.append("\u0073");
2737: break; // asciitilde
2738: case 18 :
2739: buf.append("j\u0305");
2740: break; // j macron [does a single char exist?]
2741: case 19 :
2742: buf.append("^");
2743: break; // circumflex
2744: case 20 :
2745: buf.append("\u0303");
2746: break; // tilde
2747: case 21 :
2748: buf.append("\u00bd");
2749: break; // onehalf
2750: case 22 :
2751: buf.append("\u00bc");
2752: break; // onequarter
2753: case 23 :
2754: buf.append("\u00b9");
2755: break; // onesuperior
2756: case 24 :
2757: buf.append("\u00be");
2758: break; // threequarters
2759: case 25 :
2760: buf.append("\u00b3");
2761: break; // threesuperior
2762: case 26 :
2763: buf.append("\u00b2");
2764: break; // twosuperior
2765: case 27 :
2766: buf.append("\u00a6");
2767: break; // brokenbar
2768: case 28 :
2769: buf.append("-");
2770: break; // minus
2771: case 29 :
2772: buf.append("\u00d7");
2773: break; // multiply
2774: case 39 :
2775: buf.append("'");
2776: break; // quotesingle
2777: case 94 :
2778: buf.append("\u0302");
2779: break; // circumflex
2780: case 96 :
2781: buf.append("\u0300");
2782: break; // grave
2783: case 128 :
2784: buf.append("\u00c4");
2785: break; // A dieresis
2786: case 129 :
2787: buf.append("\u00c5");
2788: break; // A ring
2789: case 131 :
2790: buf.append("\u00c9");
2791: break; // E acute
2792: case 132 :
2793: buf.append("\u00d1");
2794: break; // N tilde
2795: case 133 :
2796: buf.append("\u00d6");
2797: break; // O dieresis
2798: case 134 :
2799: buf.append("\u00dc");
2800: break; // U dieresis
2801: case 135 :
2802: buf.append("\u00e1");
2803: break; // a acute
2804: case 136 :
2805: buf.append("\u00e0");
2806: break; // a grave
2807: case 137 :
2808: buf.append("\u00e2");
2809: break; // a circumflex
2810: case 138 :
2811: buf.append("\u00e4");
2812: break; // a dieresis
2813: case 139 :
2814: buf.append("\u00e3");
2815: break; // a tilde
2816: case 140 :
2817: buf.append("\u0101");
2818: break; // a macron
2819: case 141 :
2820: buf.append("\u00e7");
2821: break; // c cedilla
2822: case 142 :
2823: buf.append("\u00e9");
2824: break; // e acute
2825: case 143 :
2826: buf.append("\u00e8");
2827: break; // e grave
2828: case 144 :
2829: buf.append("\u00ea");
2830: break; // e circumflex
2831: case 145 :
2832: buf.append("\u00eb");
2833: break; // e dieresis
2834: case 146 :
2835: buf.append("\u00ed");
2836: break; // i acute
2837: case 147 :
2838: buf.append("\u00ec");
2839: break; // i grave
2840: case 148 :
2841: buf.append("\u00ee");
2842: break; // i circumflex
2843: case 149 :
2844: buf.append("\u00ef");
2845: break; // i dieresis
2846: case 150 :
2847: buf.append("\u00f1");
2848: break; // n tilde
2849: case 151 :
2850: buf.append("\u00f3");
2851: break; // o acute
2852: case 152 :
2853: buf.append("\u00f2");
2854: break; // o grave
2855: case 153 :
2856: buf.append("\u00f4");
2857: break; // o circumflex
2858: case 154 :
2859: buf.append("\u00f6");
2860: break; // o dieresis
2861: case 155 :
2862: buf.append("\u00f5");
2863: break; // o tilde
2864: case 156 :
2865: buf.append("\u00fa");
2866: break; // u acute
2867: case 157 :
2868: buf.append("\u00f9");
2869: break; // u grave
2870: case 158 :
2871: buf.append("\u00fb");
2872: break; // u circumflex
2873: case 159 :
2874: buf.append("\u00fc");
2875: break; // u dieresis
2876: case 160 :
2877: buf.append("\u1e6d");
2878: break; // t underdot
2879: case 161 :
2880: buf.append("\u00b0");
2881: break; // degree
2882: case 162 :
2883: buf.append("\u1ebd");
2884: break; // e tilde
2885: case 163 :
2886: buf.append("\u00a3");
2887: break; // sterling
2888: case 164 :
2889: buf.append("\u00a7");
2890: break; // section
2891: case 166 :
2892: buf.append("\u00b6");
2893: break; // paragraph
2894: case 167 :
2895: buf.append("\u015b");
2896: break; // s acute
2897: case 168 :
2898: buf.append("\u1e5b");
2899: break; // r underdot
2900: case 169 :
2901: buf.append("\u1e67");
2902: break; // s caron
2903: case 171 :
2904: buf.append("\u0301");
2905: break; // acute
2906: case 172 :
2907: buf.append("\u0308");
2908: break; // dieresis
2909: case 173 :
2910: buf.append("\u1e6d");
2911: break; // t underdot
2912: case 174 :
2913: buf.append("\u00c6");
2914: break; // AE
2915: case 175 :
2916: buf.append("\u014d");
2917: break; // o macron
2918: case 176 :
2919: buf.append("\u0129");
2920: break; // i tilde
2921: case 177 :
2922: buf.append("\u00b1");
2923: break; // plusminus
2924: case 180 :
2925: buf.append("\u012b");
2926: break; // i macron
2927: case 181 :
2928: buf.append("\u1e43");
2929: break; // m underdot
2930: case 182 :
2931: buf.append("\u1e0d");
2932: break; // d underdot
2933: case 183 :
2934: buf.append("\u1e63");
2935: break; // s underdot
2936: case 185 :
2937: buf.append("\u017a");
2938: break; // z acute
2939: case 186 :
2940: buf.append("\u1e45");
2941: break; // n overdot
2942: case 189 :
2943: buf.append("\u0169");
2944: break; // u tilde
2945: case 190 :
2946: buf.append("\u00e6");
2947: break; // ae
2948: case 191 :
2949: buf.append("\u00f8");
2950: break; // oslash
2951: case 192 :
2952: buf.append("\u0304\u0306");
2953: break; // macron breve
2954: case 194 :
2955: buf.append("\u1e37");
2956: break; //
2957: case 195 :
2958: buf.append("j\u0305");
2959: break; // j macron [does a single char exist?]
2960: case 196 :
2961: buf.append("\u0103");
2962: break; // a breve
2963: case 197 :
2964: buf.append("\u016d");
2965: break; // u breve
2966: case 200 :
2967: buf.append("\u1e42");
2968: break; // M underdot
2969: case 201 :
2970: buf.append("\u2026");
2971: break; // ellipsis
2972: case 203 :
2973: buf.append("\u00c0");
2974: break; // A grave
2975: case 204 :
2976: buf.append("\u00c3");
2977: break; // A tilde
2978: case 205 :
2979: buf.append("\u00d5");
2980: break; // O tilde
2981: case 206 :
2982: buf.append("m\u0306");
2983: break; // m breve
2984: case 207 :
2985: buf.append("\u0153");
2986: break; // oe
2987: case 208 :
2988: buf.append("\u2013");
2989: break; // endash
2990: case 209 :
2991: buf.append("\u2014");
2992: break; // emdash
2993: case 210 :
2994: buf.append("\u201c");
2995: break; // quotedblleft
2996: case 211 :
2997: buf.append("\u201d");
2998: break; // quotedblright
2999: case 212 :
3000: buf.append("\u2018");
3001: break; // quoteleft
3002: case 213 :
3003: buf.append("\u2019");
3004: break; // quoteright
3005: case 214 :
3006: buf.append("\u1e37");
3007: break; // l underring [actually underdot]
3008: case 215 :
3009: buf.append("\u1e41");
3010: break; // m overdot
3011: case 216 :
3012: buf.append("n\u0306");
3013: break; // n breve
3014: case 217 :
3015: buf.append("\u00d7");
3016: break; // multiply
3017: case 219 :
3018: buf.append("\u1e5b");
3019: break; // r underring [actually underdot]
3020: case 220 :
3021: buf.append("\u1e44");
3022: break; // N overdot
3023: case 221 :
3024: buf.append("\u1e62");
3025: break; // S underdot
3026: case 222 :
3027: buf.append("\u1e24");
3028: break; // H underdot
3029: case 223 :
3030: buf.append("\u1e0c");
3031: break; // D underdot
3032: case 224 :
3033: buf.append("\u2021");
3034: break; // daggerdbl
3035: case 226 :
3036: buf.append("\u1e36");
3037: break; // L underdot
3038: case 227 :
3039: buf.append("\u0113");
3040: break; // e macron
3041: case 229 :
3042: buf.append("\u1e5f");
3043: break; // r underbar
3044: case 230 :
3045: buf.append("r\u0324");
3046: break; // r underdieresis
3047: case 231 :
3048: buf.append("\u012a");
3049: break; // I macron
3050: case 232 :
3051: buf.append("\u016b");
3052: break; // u macron
3053: case 233 :
3054: buf.append("\u01e6c");
3055: break; // T underdot
3056: case 234 :
3057: buf.append("\u1e64");
3058: break; // S acute
3059: case 235 :
3060: buf.append("\u2020");
3061: break; // dagger
3062: case 236 :
3063: buf.append("\u0115");
3064: break; // e breve
3065: case 237 :
3066: buf.append("\u014f");
3067: break; // o breve
3068: case 238 :
3069: buf.append("\u0100");
3070: break; // A macron
3071: case 239 :
3072: buf.append("\u1e46");
3073: break; // N underdot
3074: case 241 :
3075: buf.append("\u1e3b");
3076: break; // l underbar
3077: case 242 :
3078: buf.append("\u016a");
3079: break; // U macron
3080: case 243 :
3081: buf.append("\u0179");
3082: break; // Z acute
3083: case 244 :
3084: buf.append("\u1e5a");
3085: break; // R underdot
3086: case 245 :
3087: buf.append("\u0131");
3088: break; // dotlessi
3089: case 246 :
3090: buf.append("\u1e47");
3091: break; // n underdot
3092: case 247 :
3093: buf.append("\u1e49");
3094: break; // n underbar
3095: case 248 :
3096: buf.append("\u0304");
3097: break; // macron
3098: case 249 :
3099: buf.append("\u0306");
3100: break; // breve
3101: case 250 :
3102: buf.append("\u1e25");
3103: break; // h underdot
3104: case 251 :
3105: buf.append("\u012d");
3106: break; // i breve
3107: case 252 :
3108: buf.append("\u0327");
3109: break; // cedilla
3110: case 253 :
3111: buf.append("\u030b");
3112: break; // hungarumlaut
3113: case 254 :
3114: buf.append("\u0328");
3115: break; // ogonek
3116: case 255 :
3117: buf.append("\u030c");
3118: break; // caron
3119: case 130 :
3120: buf.append("\u012b\u0303");
3121: break; // imacron tilde
3122: case 165 :
3123: buf.append("\u1e5d");
3124: break; // runderdot macron
3125: case 170 :
3126: buf.append("\u016b\0306");
3127: break; // umacron breve
3128: case 178 :
3129: buf.append("\u0101\u0301");
3130: break; // amacron acute
3131: case 179 :
3132: buf.append("\u016b\u0301");
3133: break; // umacron acute
3134: case 184 :
3135: buf.append("\u0113\u0301");
3136: break; // emacron acute
3137: case 187 :
3138: buf.append("\u0113\u0300");
3139: break; // emacron breve
3140: case 188 :
3141: buf.append("\u014d\u0300");
3142: break; // omacron breve
3143: case 193 :
3144: buf.append("\u0101\u0306");
3145: break; // amacron breve
3146: case 198 :
3147: buf.append("\u0101\u0303");
3148: break; // amacron tilde
3149: case 199 :
3150: buf.append("\u012b\u0301");
3151: break; // imacron acute
3152: case 218 :
3153: buf.append("\u1e00");
3154: break; // runderdotmacron acute
3155: case 225 :
3156: buf.append("\u1e5b\u0301");
3157: break; // runderdot acute
3158: case 228 :
3159: buf.append("\u012b\u0306");
3160: break; // imacron breve
3161: case 240 :
3162: buf.append("\u016b\u0303");
3163: break; // umacron tilde
3164: default :
3165: buf.append(c);
3166: break;
3167: }
3168: }
3169: return buf.toString();
3170: }
3171: static public String normanToUnicodeNew(String inp)
3172: {
3173: StringBuffer buf = new StringBuffer();
3174: for (int i = 0; i < inp.length(); i++)
3175: {
3176: char c = inp.charAt(i);
3177: switch (c)
3178: {
3179: case 1 :
3180: buf.append("\u00d0");
3181: break; // Eth
3182: case 2 :
3183: buf.append("\u00f0");
3184: break; // eth
3185: case 3 :
3186: buf.append("\u0141");
3187: break; // Lslash
3188: case 4 :
3189: buf.append("\u0142");
3190: break; // lslash
3191: case 5 :
3192: buf.append("\u0160");
3193: break; // S caron
3194: case 6 :
3195: buf.append("\u0161");
3196: break; // s caron
3197: case 7 :
3198: buf.append("\u00dd");
3199: break; // Y acute
3200: case 8 :
3201: buf.append("\u00fd");
3202: break; // y acute
3203: case 11 :
3204: buf.append("\u00de");
3205: break; // Thorn
3206: case 12 :
3207: buf.append("\u00fe");
3208: break; // thorn
3209: case 14 :
3210: buf.append("\u017d");
3211: break; // Z caron
3212: case 15 :
3213: buf.append("\u017e");
3214: break; // z caron
3215: case 17 :
3216: buf.append("\u0073");
3217: break; // asciitilde
3218: case 18 :
3219: buf.append("j\u0305");
3220: break; // j macron [does a single char exist?]
3221: case 19 :
3222: buf.append("^");
3223: break; // circumflex
3224: case 20 :
3225: buf.append("\u0303");
3226: break; // tilde
3227: case 21 :
3228: buf.append("\u00bd");
3229: break; // onehalf
3230: case 22 :
3231: buf.append("\u00bc");
3232: break; // onequarter
3233: case 23 :
3234: buf.append("\u00b9");
3235: break; // onesuperior
3236: case 24 :
3237: buf.append("\u00be");
3238: break; // threequarters
3239: case 25 :
3240: buf.append("\u00b3");
3241: break; // threesuperior
3242: case 26 :
3243: buf.append("\u00b2");
3244: break; // twosuperior
3245: case 27 :
3246: buf.append("\u00a6");
3247: break; // brokenbar
3248: case 28 :
3249: buf.append("-");
3250: break; // minus
3251: case 29 :
3252: buf.append("\u00d7");
3253: break; // multiply
3254: case 39 :
3255: buf.append("'");
3256: break; // quotesingle
3257: case 94 :
3258: buf.append("\u0302");
3259: break; // circumflex
3260: case 96 :
3261: buf.append("\u0300");
3262: break; // grave
3263: case 196 :
3264: buf.append("\u00c4");
3265: break; // A dieresis
3266: case 197 :
3267: buf.append("\u00c5");
3268: break; // A ring
3269: case 201 :
3270: buf.append("\u00c9");
3271: break; // E acute
3272: case 209 :
3273: buf.append("\u00d1");
3274: break; // N tilde
3275: case 214 :
3276: buf.append("\u00d6");
3277: break; // O dieresis
3278: case 220 :
3279: buf.append("\u00dc");
3280: break; // U dieresis
3281: case 225 :
3282: buf.append("\u00e1");
3283: break; // a acute
3284: case 224 :
3285: buf.append("\u00e0");
3286: break; // a grave
3287: case 226 :
3288: buf.append("\u00e2");
3289: break; // a circumflex
3290: case 228 :
3291: buf.append("\u00e4");
3292: break; // a dieresis
3293: case 227 :
3294: buf.append("\u00e3");
3295: break; // a tilde
3296: case 229 :
3297: buf.append("\u0101");
3298: break; // a macron
3299: case 231 :
3300: buf.append("\u00e7");
3301: break; // c cedilla
3302: case 233 :
3303: buf.append("\u00e9");
3304: break; // e acute
3305: case 232 :
3306: buf.append("\u00e8");
3307: break; // e grave
3308: case 234 :
3309: buf.append("\u00ea");
3310: break; // e circumflex
3311: case 235 :
3312: buf.append("\u00eb");
3313: break; // e dieresis
3314: case 237 :
3315: buf.append("\u00ed");
3316: break; // i acute
3317: case 236 :
3318: buf.append("\u00ec");
3319: break; // i grave
3320: case 238 :
3321: buf.append("\u00ee");
3322: break; // i circumflex
3323: case 239 :
3324: buf.append("\u00ef");
3325: break; // i dieresis
3326: case 241 :
3327: buf.append("\u00f1");
3328: break; // n tilde
3329: case 243 :
3330: buf.append("\u00f3");
3331: break; // o acute
3332: case 242 :
3333: buf.append("\u00f2");
3334: break; // o grave
3335: case 244 :
3336: buf.append("\u00f4");
3337: break; // o circumflex
3338: case 246 :
3339: buf.append("\u00f6");
3340: break; // o dieresis
3341: case 245 :
3342: buf.append("\u00f5");
3343: break; // o tilde
3344: case 250 :
3345: buf.append("\u00fa");
3346: break; // u acute
3347: case 249 :
3348: buf.append("\u00f9");
3349: break; // u grave
3350: case 251 :
3351: buf.append("\u00fb");
3352: break; // u circumflex
3353: case 252 :
3354: buf.append("\u00fc");
3355: break; // u dieresis
3356: case 8224 :
3357: buf.append("\u1e6d");
3358: break; // t underdot
3359: case 176 :
3360: buf.append("\u00b0");
3361: break; // degree
3362: case 162 :
3363: buf.append("\u1ebd");
3364: break; // e tilde
3365: case 163 :
3366: buf.append("\u00a3");
3367: break; // sterling
3368: case 167 :
3369: buf.append("\u00a7");
3370: break; // section
3371: case 182 :
3372: buf.append("\u00b6");
3373: break; // paragraph
3374: case 223 :
3375: buf.append("\u015b");
3376: break; // s acute
3377: case 174 :
3378: buf.append("\u1e5b");
3379: break; // r underdot
3380: case 169 :
3381: buf.append("\u1e45");
3382: break; // n overdot
3383: case 180 :
3384: buf.append("\u0301");
3385: break; // acute
3386: case 168 :
3387: buf.append("\u0308");
3388: break; // dieresis
3389: case 8800 :
3390: buf.append("\u1e6d");
3391: break; // t underdot
3392: case 198 :
3393: buf.append("\u00c6");
3394: break; // AE
3395: case 216 :
3396: buf.append("\u014d");
3397: break; // o macron
3398: case 8734 :
3399: buf.append("\u0129");
3400: break; // i tilde
3401: case 177 :
3402: buf.append("\u00b1");
3403: break; // plusminus
3404: case 165 :
3405: buf.append("\u012b");
3406: break; // i macron
3407: case 181 :
3408: buf.append("\u1e43");
3409: break; // m underdot
3410: case 8706 :
3411: buf.append("\u1e0d");
3412: break; // d underdot
3413: case 8721 :
3414: buf.append("\u1e63");
3415: break; // s underdot
3416: case 960 :
3417: buf.append("\u017a");
3418: break; // z acute
3419: case 8747 :
3420: buf.append("\u1e45");
3421: break; // n overdot
3422: case 937 :
3423: buf.append("\u0169");
3424: break; // u tilde
3425: case 230 :
3426: buf.append("\u00e6");
3427: break; // ae
3428: case 248 :
3429: buf.append("\u00f8");
3430: break; // oslash
3431: case 191 :
3432: buf.append("\u0304\u0306");
3433: break; // macron breve
3434: case 172 :
3435: buf.append("\u1e37");
3436: break; //
3437: case 8730 :
3438: buf.append("j\u0305");
3439: break; // j macron [does a single char exist?]
3440: case 402 :
3441: buf.append("\u0103");
3442: break; // a breve
3443: case 8776 :
3444: buf.append("\u016d");
3445: break; // u breve
3446: case 187 :
3447: buf.append("\u1e42");
3448: break; // M underdot
3449: case 8230 :
3450: buf.append("\u2026");
3451: break; // ellipsis
3452: case 192 :
3453: buf.append("\u00c0");
3454: break; // A grave
3455: case 195 :
3456: buf.append("\u00c3");
3457: break; // A tilde
3458: case 213 :
3459: buf.append("\u00d5");
3460: break; // O tilde
3461: case 338 :
3462: buf.append("m\u0306");
3463: break; // m breve
3464: case 339 :
3465: buf.append("\u0153");
3466: break; // oe
3467: case 8211 :
3468: buf.append("\u2013");
3469: break; // endash
3470: case 8212 :
3471: buf.append("\u2014");
3472: break; // emdash
3473: case 8220 :
3474: buf.append("\u201c");
3475: break; // quotedblleft
3476: case 8221 :
3477: buf.append("\u201d");
3478: break; // quotedblright
3479: case 8216 :
3480: buf.append("\u2018");
3481: break; // quoteleft
3482: case 8217 :
3483: buf.append("\u2019");
3484: break; // quoteright
3485: case 247 :
3486: buf.append("\u1e37");
3487: break; // l underring [actually underdot]
3488: case 9674 :
3489: buf.append("\u1e41");
3490: break; // m overdot
3491: case 255 :
3492: buf.append("n\u0306");
3493: break; // n breve
3494: case 376 :
3495: buf.append("\u00d7");
3496: break; // multiply
3497: case 8364 :
3498: buf.append("\u1e5b");
3499: break; // r underring [actually underdot]
3500: case 8249 :
3501: buf.append("\u1e44");
3502: break; // N overdot
3503: case 8250 :
3504: buf.append("\u1e62");
3505: break; // S underdot
3506: case 64257 :
3507: buf.append("\u1e24");
3508: break; // H underdot
3509: case 64258 :
3510: buf.append("\u1e0c");
3511: break; // D underdot
3512: case 8225 :
3513: buf.append("\u2021");
3514: break; // daggerdbl
3515: case 8218 :
3516: buf.append("\u1e36");
3517: break; // L underdot
3518: case 8222 :
3519: buf.append("\u0113");
3520: break; // e macron
3521: case 194 :
3522: buf.append("\u1e5f");
3523: break; // r underbar
3524: case 202 :
3525: buf.append("r\u0324");
3526: break; // r underdieresis
3527: case 193 :
3528: buf.append("\u012a");
3529: break; // I macron
3530: case 203 :
3531: buf.append("\u016b");
3532: break; // u macron
3533: case 200 :
3534: buf.append("\u1e6c");
3535: break; // T underdot
3536: case 205 :
3537: buf.append("\u1e64");
3538: break; // S acute
3539: case 206 :
3540: buf.append("\u2020");
3541: break; // dagger
3542: case 207 :
3543: buf.append("\u0115");
3544: break; // e breve
3545: case 204 :
3546: buf.append("\u014f");
3547: break; // o breve
3548: case 211 :
3549: buf.append("\u0100");
3550: break; // A macron
3551: case 212 :
3552: buf.append("\u1e46");
3553: break; // N underdot
3554: case 210 :
3555: buf.append("\u1e3b");
3556: break; // l underbar
3557: case 218 :
3558: buf.append("\u016a");
3559: break; // U macron
3560: case 219 :
3561: buf.append("\u0179");
3562: break; // Z acute
3563: case 217 :
3564: buf.append("\u1e5a");
3565: break; // R underdot
3566: case 305 :
3567: buf.append("\u0131");
3568: break; // dotlessi
3569: case 710 :
3570: buf.append("\u1e47");
3571: break; // n underdot
3572: case 732 :
3573: buf.append("\u1e49");
3574: break; // n underbar
3575: case 175 :
3576: buf.append("\u0304");
3577: break; // macron
3578: case 728 :
3579: buf.append("\u0306");
3580: break; // breve
3581: case 729 :
3582: buf.append("\u1e25");
3583: break; // h underdot
3584: case 730 :
3585: buf.append("\u012d");
3586: break; // i breve
3587: case 184 :
3588: buf.append("\u0327");
3589: break; // cedilla
3590: case 733 :
3591: buf.append("\u030b");
3592: break; // hungarumlaut
3593: case 731 :
3594: buf.append("\u0328");
3595: break; // ogonek
3596: case 711 :
3597: buf.append("\u030c");
3598: break; // caron
3599: case 199 :
3600: buf.append("\u012b\u0303");
3601: break; // imacron tilde
3602: case 8226 :
3603: buf.append("\u1e5d");
3604: break; // runderdot macron
3605: case 8482 :
3606: buf.append("\u016b\0306");
3607: break; // umacron breve
3608: case 8804 :
3609: buf.append("\u0101\u0301");
3610: break; // amacron acute
3611: case 8805 :
3612: buf.append("\u016b\u0301");
3613: break; // umacron acute
3614: case 8719 :
3615: buf.append("\u0113\u0301");
3616: break; // emacron acute
3617: case 170 :
3618: buf.append("\u0113\u0300");
3619: break; // emacron breve
3620: case 186 :
3621: buf.append("\u014d\u0300");
3622: break; // omacron breve
3623: case 161 :
3624: buf.append("\u0101\u0306");
3625: break; // amacron breve
3626: case 8710 :
3627: buf.append("\u0101\u0303");
3628: break; // amacron tilde
3629: case 171 :
3630: buf.append("\u012b\u0301");
3631: break; // imacron acute
3632: case 8260 :
3633: buf.append("\u1e00");
3634: break; // runderdotmacron acute
3635: case 183 :
3636: buf.append("\u1e5b\u0301");
3637: break; // runderdot acute
3638: case 8240 :
3639: buf.append("\u012b\u0306");
3640: break; // imacron breve
3641: case 63743 :
3642: buf.append("\u016b\u0303");
3643: break; // umacron tilde
3644: default :
3645: buf.append(c);
3646: break;
3647: }
3648: }
3649: return buf.toString();
3650: }
3651: public static ConversionProperties getFieldNamesAndDestTableName(String create, String query, String tableName)
3652: {
3653: String[] fieldNames = null;
3654: String destTableName = null;
3655: // determine destTableName from createStatement or from source table name
3656: if (!create.equals(""))
3657: {
3658: int fromIndex = create.toLowerCase().indexOf("table") + 5;
3659: int toIndex = create.indexOf("(");
3660: int endIndex = create.indexOf(")", toIndex);
3661:
3662: destTableName = create.substring(fromIndex, toIndex).replaceAll(beanDest.getQC(), "").trim();
3663: System.out.println("destTable " + destTableName);
3664: // retrieve field_names from select statement
3665: // TODO problem with different fieldNames in create statement will overwrite them
3666: if (query.indexOf("*") < 0)
3667: {
3668: int selectEndIndex = query.indexOf("from");
3669: StringTokenizer tokenizer = new StringTokenizer(query.substring(6, selectEndIndex), ",");
3670: int numFields = tokenizer.countTokens();
3671: fieldNames = new String[numFields];
3672: int fieldIndex = 0;
3673: while (tokenizer.hasMoreTokens())
3674: {
3675: String fieldName = tokenizer.nextToken().trim();
3676: fieldNames[fieldIndex] = convertText(fieldName);
3677: System.out.println(fieldNames[fieldIndex]);
3678: fieldIndex++;
3679: }
3680:
3681: } else
3682: {
3683: // use create statement for field names
3684: StringTokenizer tokenizer = new StringTokenizer(create.substring(toIndex + 1, endIndex), ",");
3685: int numFields = tokenizer.countTokens();
3686: fieldNames = new String[numFields];
3687: int fieldIndex = 0;
3688: while (tokenizer.hasMoreTokens())
3689: {
3690: String fieldName = tokenizer.nextToken().trim();
3691: int index = fieldName.lastIndexOf(" ");
3692: fieldNames[fieldIndex] = fieldName.substring(0, index);
3693: System.out.println(fieldNames[fieldIndex]);
3694: fieldIndex++;
3695: }
3696: }
3697: } else
3698: {
3699: destTableName = convertText(tableName);
3700:
3701: // retrieve field_names from select statement
3702: if (query.indexOf("*") < 0)
3703: {
3704: int selectEndIndex = query.indexOf("from");
3705: StringTokenizer tokenizer = new StringTokenizer(query.substring(6, selectEndIndex), ",");
3706: int numFields = tokenizer.countTokens();
3707: fieldNames = new String[numFields];
3708: int fieldIndex = 0;
3709: while (tokenizer.hasMoreTokens())
3710: {
3711: String fieldName = tokenizer.nextToken().trim();
3712: fieldNames[fieldIndex] = convertText(fieldName);
3713: // System.out.println("field "+ fieldNames[fieldIndex]);
3714: fieldIndex++;
3715: }
3716:
3717: } else
3718: {
3719: Vector fieldNamesVec = bean.getColumnNames();
3720: fieldNames = new String[fieldNamesVec.size()];
3721: int fieldIndex = -1;
3722: for (Iterator iter = fieldNamesVec.iterator(); iter.hasNext();)
3723: {
3724: String element = (String) iter.next();
3725: fieldNames[++fieldIndex] = bean.getQC() + convertText(element) + bean.getQC();
3726: // System.out.println("field " + fieldNames[fieldIndex]);
3727: }
3728: }
3729: }
3730: return new ConversionProperties(destTableName, fieldNames);
3731: }
3732: /**
3733: * creates an insert into statement for the specified table and given
3734: * field names
3735: * @param destTableName
3736: * @param fieldNames
3737: * @return
3738: */
3739: public static StringBuffer createInsertCommand(String destTableName, String[] fieldNames)
3740: {
3741: StringBuffer command = new StringBuffer();
3742: command.append("INSERT INTO ");
3743: command.append(beanDest.getQC());
3744: command.append(destTableName); //convertText((String) names.get(tbIndex)));
3745: command.append(beanDest.getQC());
3746: command.append(" (");
3747: for (int i = 0; i < fieldNames.length; i++)
3748: {
3749: command.append(fieldNames[i]);
3750: if (i < fieldNames.length - 1)
3751: command.append(",");
3752: }
3753: command.append(") ");
3754:
3755: command.append(" values ( ");
3756: // add a question marks for every field
3757: for (int i = 0; i < bean.getColumnNames().size() - 1; ++i)
3758: command.append("?,");
3759: command.append("?)");
3760: return command;
3761: }
3762: public static StringBuffer createUpdateCommand(String destTableName, String[] fieldNames, String id)
3763: {
3764: StringBuffer command = new StringBuffer();
3765:
3766: command.append("UPDATE ");
3767: command.append(beanDest.getQC());
3768: command.append(destTableName);
3769: //command.append(convertText((String) names.get(tbIndex)));
3770: command.append(beanDest.getQC());
3771: command.append(" SET ");
3772:
3773: int size = bean.getColumnNames().size();
3774: for (int i = 0; i < size - 1; ++i)
3775: command.append(fieldNames[i] + " = ? ,");
3776: command.append(fieldNames[size - 1] + " = ? ");
3777: command.append("WHERE " + id + " = ?");
3778: return command;
3779: }
3780: public static StringBuffer createDeleteCommand(String destTableName, String idField)
3781: {
3782: StringBuffer command = new StringBuffer();
3783:
3784: command.append("DELETE FROM");
3785: command.append(beanDest.getQC());
3786: command.append(destTableName);
3787: //command.append(convertText((String) names.get(tbIndex)));
3788: command.append(beanDest.getQC());
3789: command.append("WHERE " + idField + " = ?");
3790: return command;
3791: }
3792: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>