Annotation of FM2SQL/Convert.java, revision 1.67
1.51 rogo 1: /*
2: * Convert.java -- Converter class - Filemaker to SQL Converter
1.52 rogo 3: * Copyright (C) 2003 Robert Gordesch (rogo@mpiwg-berlin.mpg.de)
1.51 rogo 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:
1.1 rogo 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;
1.60 rogo 22: import java.io.InputStream;
1.1 rogo 23: import java.io.InputStreamReader;
24: import java.io.OutputStreamWriter;
25: import java.io.PrintStream;
26: import java.io.UnsupportedEncodingException;
1.60 rogo 27: import java.net.URL;
1.57 rogo 28: import java.sql.PreparedStatement;
29: import java.sql.SQLException;
30: import java.sql.Statement;
31: import java.sql.Types;
1.66 rogo 32: import java.text.ParseException;
1.57 rogo 33: import java.util.ArrayList;
34: import java.util.Iterator;
35: import java.util.List;
1.65 rogo 36: import java.util.Properties;
1.57 rogo 37: import java.util.StringTokenizer;
38: import java.util.TreeSet;
39: import java.util.Vector;
1.1 rogo 40:
41: import com.exploringxml.xml.Node;
42: import com.exploringxml.xml.Xparse;
43:
1.34 rogo 44: class Convert
1.1 rogo 45: {
1.34 rogo 46: static DBBean bean = new DBBean();
47: static DBBean beanDest = new DBBean();
1.1 rogo 48:
1.34 rogo 49: static String user = "", passwd = "e1nste1n";
50: static String userDest = "postgres", passwdDest = "rogo";
51: static boolean batchRun = false;
1.1 rogo 52: static Vector databases = new Vector();
1.30 rogo 53: final static int numHits = 5000;
54: final static int numIntervalls = 2;
1.1 rogo 55: public static void main(String args[])
56: {
1.34 rogo 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: }*/
1.1 rogo 66: FileOutputStream file = null;
1.34 rogo 67: if (args.length != 1)
1.1 rogo 68: {
1.34 rogo 69: System.out.println("Usage: java Convert <xml config file>");
70: System.exit(-1);
1.1 rogo 71: }
72: try
73: {
74: file = new FileOutputStream("./log.txt");
75: } catch (FileNotFoundException e1)
76: {
77: e1.printStackTrace();
1.34 rogo 78: }
79: PrintStream stream = new PrintStream(file);
1.65 rogo 80: // System.setOut(stream);
1.60 rogo 81: //System.setErr(stream);
82:
1.34 rogo 83: readXMLFile(args[0]);
1.60 rogo 84: if (!(new File(args[0]).exists()))
85: System.exit(0);
86:
1.34 rogo 87: System.out.println("Finished!");
1.1 rogo 88: //convert("jdbc:fmpro:http://141.14.237.74:8050","jdbc:postgresql://erebos/test",null,null);
89: }
1.55 rogo 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
1.1 rogo 91: {
1.34 rogo 92: bean = source;
93: beanDest = destination;
1.55 rogo 94: convert(null, null, names, layouts, selects, creates, ids, mode, delimiter);
95: if (true)
96: return;
1.34 rogo 97: StringBuffer command = null;
1.1 rogo 98: try
99: {
100: bean.setConnection(source.url);
1.34 rogo 101: if (names == null)
102: names = bean.getTableNames();
1.1 rogo 103: //Collections.sort(names);
1.34 rogo 104: int tbIndex = 1;
105:
106: for (tbIndex = 0; tbIndex < names.size(); ++tbIndex)
1.1 rogo 107: {
108: Vector[] result = null;
1.34 rogo 109: try
1.1 rogo 110: {
1.34 rogo 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);
1.1 rogo 127: //result = bean.getQueryData(query, null, 0);
1.34 rogo 128: bean.getConnection();
129: bean.makeQuery(query, 0);
130: } catch (Exception e)
1.1 rogo 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();
1.34 rogo 142: // Collections.sort(tables);
143: System.out.println("converting table " + names.get(tbIndex) + " " + tables.indexOf(convertText((String) names.get(tbIndex)))); // "//beanDest.getTypeNames());
1.1 rogo 144: tables = beanDest.getTableNames();
145: // System.out.println(beanDest.getTableNames(beanDest.getCatalogs().get(2).toString()));
146: stm = beanDest.getConnection().createStatement();
147: // System.exit(0);
1.34 rogo 148: if (mode == Convert.DataBase.CONVERT_MODE)
1.1 rogo 149: {
1.34 rogo 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)
1.1 rogo 156: {
1.34 rogo 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)
1.1 rogo 163: {
1.34 rogo 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());
1.1 rogo 197:
1.34 rogo 198: }
1.1 rogo 199: }
1.34 rogo 200: Vector row = null;
201: command = new StringBuffer();
1.1 rogo 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 ( ");
1.3 rogo 208:
1.34 rogo 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)
1.55 rogo 222: obj = formatFileMakerArray((List) obj, "\n");
1.34 rogo 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:
1.1 rogo 247: }
1.34 rogo 248: // dialog.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
249: //FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
1.1 rogo 250:
1.34 rogo 251: // dialog.setVisible(false);
1.1 rogo 252: }
1.55 rogo 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: }
1.38 rogo 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: */
1.34 rogo 276: public static void update(String source, String destination, Vector names, Vector layouts, Vector selects, Vector creates, Vector ids, int mode) throws Exception
1.12 rogo 277: {
278: FM2SQL.ProgressDialog dialog = null;
279: if (FM2SQL.fmInstance != null)
280: {
1.55 rogo 281: dialog = new FM2SQL.ProgressDialog(FM2SQL.fmInstance, bean);
1.12 rogo 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;
1.55 rogo 306:
1.12 rogo 307: // System.out.println("Start at "+names.indexOf("archimedes_facsimiles"));
308: for (tbIndex = 0; tbIndex < names.size(); ++tbIndex)
309: {
310: Vector[] result = null;
1.45 rogo 311: String destTableName = "";
1.12 rogo 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: }
1.45 rogo 338: // determine destTableName from createStatement or from source table name
1.55 rogo 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());
1.45 rogo 349:
1.12 rogo 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);
1.34 rogo 362:
1.12 rogo 363: if (dialog != null)
1.36 rogo 364: dialog.title.setText("Updating table data ...");
1.12 rogo 365:
366: int j = -1;
1.34 rogo 367:
1.12 rogo 368: Vector row = null;
369: command = new StringBuffer();
370:
371: command.append("UPDATE ");
372: command.append(beanDest.getQC());
1.45 rogo 373: command.append(destTableName);
374: //command.append(convertText((String) names.get(tbIndex)));
1.12 rogo 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)
1.34 rogo 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()) + " = ?");
1.12 rogo 383: PreparedStatement pstm = beanDest.getConnection().prepareStatement(command.toString());
1.34 rogo 384: System.out.println(command + " " + tbIndex);
385: int rowCount = bean.getRowCount(query);
386: int idIndex = bean.getColumnNames().indexOf(ids.get(tbIndex));
1.12 rogo 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: }
1.34 rogo 428: pstm.setString(row.size() + 1, row.get(idIndex).toString());
429: //System.out.println(pstm.toString());
430: // System.exit(0);
1.12 rogo 431: pstm.execute();
432: //stm.executeUpdate(command.toString());
1.34 rogo 433: if (dialog != null)
434: dialog.progress.setValue((int) (((double) (j + 1) / (double) rowCount) * 100.0));
1.12 rogo 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);
1.18 rogo 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: }
1.12 rogo 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: }
1.18 rogo 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: }
1.12 rogo 463:
464: }
1.34 rogo 465: /**
1.38 rogo 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
1.55 rogo 468:
1.38 rogo 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
1.55 rogo 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
1.1 rogo 481: {
1.34 rogo 482:
483: FM2SQL.ProgressDialog dialog = null;
484:
485: if (FM2SQL.fmInstance != null)
486: {
1.55 rogo 487: dialog = new FM2SQL.ProgressDialog(FM2SQL.fmInstance, bean);
1.34 rogo 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 = "";
1.38 rogo 499: String destTableName = "";
1.55 rogo 500: String[] fieldNames = null;
1.34 rogo 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;
1.1 rogo 510: try
511: {
1.55 rogo 512: if (source != null)
513: bean.setConnection(source);
1.34 rogo 514: else
1.55 rogo 515: bean.setConnection(bean.url);
516:
1.34 rogo 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)
1.1 rogo 524: {
525: Vector[] result = null;
1.34 rogo 526: try
1.1 rogo 527: {
1.34 rogo 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);
1.21 rogo 540:
1.34 rogo 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;
1.1 rogo 560: }
1.55 rogo 561: if (destination != null)
562: beanDest.setConnection(destination);
1.34 rogo 563: else
1.55 rogo 564: beanDest.setConnection(beanDest.url);
1.1 rogo 565: Statement stm = beanDest.getConnection().createStatement();
566:
567: Vector tables = beanDest.getTableNames();
1.34 rogo 568: // Collections.sort(tables);
1.1 rogo 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);
1.55 rogo 574:
575: // determine destTableName from createStatement or from source table name
1.65 rogo 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)
1.1 rogo 580: {
1.38 rogo 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(""))
1.34 rogo 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)
1.1 rogo 597: {
1.34 rogo 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: }
1.55 rogo 602: */
1.38 rogo 603: if ((tables.indexOf(destTableName) < 0)) //&& tables.indexOf(names.get(tbIndex)) < 0 && tables.indexOf(convertText(names.get(tbIndex).toString())) < 0 )
1.1 rogo 604: {
1.55 rogo 605:
1.34 rogo 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
1.38 rogo 637: command = new StringBuffer().append(creates.get(tbIndex).toString().toLowerCase());
1.34 rogo 638: stm.executeUpdate(command.toString());
1.1 rogo 639:
1.34 rogo 640: }
1.1 rogo 641: }
1.55 rogo 642: if (dialog != null)
643: dialog.title.setText("Writing table data ...");
1.34 rogo 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());
1.38 rogo 652: command.append(destTableName); //convertText((String) names.get(tbIndex)));
1.34 rogo 653: command.append(beanDest.getQC());
1.55 rogo 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:
1.34 rogo 663: command.append(" values ( ");
664:
1.38 rogo 665: // add a question marks for every field
1.34 rogo 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();
1.38 rogo 676: // if id_field not do incremental conversion else do it all at once
1.34 rogo 677: if (!idField.equals(""))
678: {
679: long startTime = System.currentTimeMillis();
680: int counter = -1;
681: while (true)
682: {
683: ++counter;
1.55 rogo 684: if (counter == 0 && dialog != null)
1.34 rogo 685: dialog.title.setText("Check if data is available");
1.55 rogo 686: else if (dialog != null)
1.34 rogo 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)
1.55 rogo 704: tempQuery = query + " and " + tempID + ">='" + vec.get(k) + "' and " + tempID + "<='" + vec.get(k + deltaID) + "'";
1.34 rogo 705: else
1.55 rogo 706: tempQuery = query + " where " + tempID + ">='" + vec.get(k) + "' and " + tempID + "<='" + vec.get(k + deltaID) + "'";
1.34 rogo 707: System.out.println(tempQuery);
1.55 rogo 708: if (dialog != null)
709: dialog.title.setText("Reading table data ...");
1.34 rogo 710:
711: bean.makeQuery(tempQuery, deltaID);
1.55 rogo 712: if (dialog != null)
713: dialog.title.setText("Writing table data ...");
1.34 rogo 714:
1.55 rogo 715: command = writeDatainDestTable(dialog, command, k, pstm, rowCount, delimiter);
1.34 rogo 716: endIndex = k + deltaID;
717: }
718: System.out.println(endIndex);
1.38 rogo 719: //all data written ? if not write last chunk of data
1.34 rogo 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());
1.1 rogo 725:
1.34 rogo 726: if (query.indexOf("where") > 0)
1.55 rogo 727: tempQuery = query + " and " + tempID + ">='" + vec.get(endIndex) + "' and " + tempID + "<='" + vec.lastElement() + "'";
1.34 rogo 728: else
1.55 rogo 729: tempQuery = query + " where " + tempID + ">='" + vec.get(endIndex) + "' and " + tempID + "<='" + vec.lastElement() + "'";
1.34 rogo 730: System.out.println(tempQuery);
1.55 rogo 731: if (dialog != null)
732: dialog.title.setText("Reading table data ...");
1.34 rogo 733: bean.makeQuery(tempQuery, 0);
1.55 rogo 734: if (dialog != null)
735: dialog.title.setText("Writing table data ...");
736: command = writeDatainDestTable(dialog, command, endIndex, pstm, rowCount, delimiter);
1.34 rogo 737: }
1.38 rogo 738: // prepare new query for next chunk
1.34 rogo 739: if (query.indexOf("where") > 0)
1.55 rogo 740: tempQuery = query + " and " + tempID + ">'" + vec.lastElement() + "'";
1.34 rogo 741: else
1.55 rogo 742: tempQuery = query + " where " + tempID + ">'" + vec.lastElement() + "'";
1.34 rogo 743:
744: }
745: long endTime = System.currentTimeMillis();
746: System.out.println("Time for incremental convert elapsed " + (endTime - startTime));
747: } else
1.29 rogo 748: {
1.38 rogo 749: // read and write all in one big chunk
1.34 rogo 750: long startTime = System.currentTimeMillis();
1.55 rogo 751:
1.34 rogo 752: bean.makeQuery(query, 0);
1.55 rogo 753: command = writeDatainDestTable(dialog, command, j, pstm, rowCount, delimiter);
1.34 rogo 754: long endTime = System.currentTimeMillis();
755: System.out.println("Time for old convert elapsed " + (endTime - startTime));
1.29 rogo 756:
757: }
1.34 rogo 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();
1.33 rogo 775:
1.3 rogo 776: }
1.1 rogo 777: }
1.34 rogo 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: }
1.27 rogo 784: }
1.38 rogo 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: */
1.55 rogo 796: private static StringBuffer writeDatainDestTable(FM2SQL.ProgressDialog dialog, StringBuffer command, int j, PreparedStatement pstm, int rowCount, String delimiter) throws Exception, SQLException
1.27 rogo 797: {
798: Vector row;
1.34 rogo 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);
1.55 rogo 841:
842: if (obj instanceof ArrayList)
843: obj = formatFileMakerArray((List) obj, delimiter);
844:
1.34 rogo 845: String str = (obj == null) ? "NULL" : obj.toString();
1.55 rogo 846: if (obj instanceof Double)
847: {
848: pstm.setDouble(k + 1, ((Double) obj).doubleValue());
849: } else if (!str.equals("NULL"))
1.34 rogo 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
1.27 rogo 861: return command;
1.1 rogo 862: }
863:
1.38 rogo 864: /**
865: * removes special characters from the input string as well as .fp5
866: * @param newName String to change
867: * @return
868: */
1.34 rogo 869: public static String convertText(String newName)
1.1 rogo 870: {
871: StringBuffer alterMe = new StringBuffer(newName.trim().toLowerCase());
872: int length = alterMe.length();
873: int j = 0;
1.34 rogo 874: int index = alterMe.indexOf(".fp5");
875: if (index >= 0)
876: {
877: alterMe.delete(index, index + 4);
878: length = length - 4;
879: }
880:
1.1 rogo 881: while (j < length)
1.34 rogo 882: {
1.1 rogo 883: if (alterMe.charAt(j) == ' ')
884: {
885: alterMe.setCharAt(j, '_');
1.34 rogo 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) == ':')
1.1 rogo 923: {
1.34 rogo 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: }
1.1 rogo 933:
1.34 rogo 934: if (j < length - 1)
935: j = j + 1;
936: }
937: } else if (alterMe.charAt(j) == '-')
938: {
939: alterMe.setCharAt(j, '_');
1.16 rogo 940:
1.34 rogo 941: } else if (alterMe.charAt(j) == '?')
1.3 rogo 942: {
1.34 rogo 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, '_');
1.3 rogo 956: }
1.34 rogo 957:
958: ++j;
1.1 rogo 959: }
960: return alterMe.toString();
961: }
1.38 rogo 962: /**
963: * Converts > and < in an entity (> or <)
964: * @param newName
965: * @return
966: */
1.4 rogo 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: }
1.38 rogo 997: /**
998: * Masks the single quote character '-->\'
999: * @param newName
1000: * @return
1001: */
1.1 rogo 1002: public static String convertUml(String newName)
1.34 rogo 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: }
1.55 rogo 1111: /**
1112: * parses the input xml file for batch conversion
1113: * called from readXMLFile
1114: * * @param sb
1115: */
1.34 rogo 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();
1.42 rogo 1130: String delimiter = "|";
1.34 rogo 1131: int mode = -1;
1132:
1133: try
1.1 rogo 1134: {
1.34 rogo 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++)
1.1 rogo 1141: {
1.34 rogo 1142:
1.1 rogo 1143: DBBean database = new DBBean();
1.34 rogo 1144: tables = new Vector();
1145: layouts = new Vector();
1146: selects = new Vector();
1147: creates = new Vector();
1148: ids = new Vector();
1.1 rogo 1149: // parse dataBase
1.34 rogo 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 });
1.55 rogo 1155: Node delimiterNode = root.find("convert/source/database/delimiter", new int[] { 1, 1, i, 1, 1 });
1.59 rogo 1156: Node useNormanToUnicodeMapper = root.find("convert/source/database/usenormantounicodemapper", new int[] { 1, 1, i, 1, 1 });
1.65 rogo 1157:
1.34 rogo 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");
1.55 rogo 1166: if (delimiterNode != null)
1167: delimiter = delimiterNode.getCharacters();
1.65 rogo 1168: if (useNormanToUnicodeMapper != null)
1.59 rogo 1169: {
1170: database.setUseNormanToUnicodeMapper(Boolean.valueOf(useNormanToUnicodeMapper.getCharacters()).booleanValue());
1.65 rogo 1171: System.out.println("useMapper " + Boolean.valueOf(useNormanToUnicodeMapper.getCharacters().trim()).booleanValue());
1172: }
1173:
1.1 rogo 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());
1.34 rogo 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;
1.48 rogo 1193: else if (modeString.equals("delete"))
1194: mode = DataBase.DELETE_MODE;
1.62 rogo 1195: else if (modeString.equals("synchronize"))
1.65 rogo 1196: mode = DataBase.SYNCHRONIZE_MODE;
1.48 rogo 1197:
1.34 rogo 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: }
1.42 rogo 1246: DataBase dataBase = new DataBase(database, tables, layouts, selects, creates, ids, mode);
1247: dataBase.delimiter = delimiter;
1248: databases.add(dataBase);
1.34 rogo 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();)
1.1 rogo 1263: {
1264: DataBase db = (DataBase) iter.next();
1.62 rogo 1265: if (mode == DataBase.CONVERT_MODE || mode == DataBase.APPEND_MODE)
1.55 rogo 1266: convertBatch(db.bean, database, db.tables, db.layouts, db.selects, db.creates, db.ids, mode, db.delimiter);
1.65 rogo 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:
1.67 ! rogo 1276: synchronize(db.bean.url, database.url, db.tables, db.layouts, db.selects, db.creates, db.ids, mode, db.delimiter);
1.65 rogo 1277: }
1.1 rogo 1278: }
1.34 rogo 1279: // printContents(node3);
1280: // FM2SQL.fmInstance=new FM2SQL();
1281: } catch (Exception e)
1282: {
1.55 rogo 1283:
1.34 rogo 1284: e.printStackTrace();
1.65 rogo 1285:
1286: } finally
1287: {
1288: bean.closeAllConnections();
1289: beanDest.closeAllConnections();
1.34 rogo 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);
1.1 rogo 1308: }
1309:
1.34 rogo 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();
1.55 rogo 1327: String delimiter = "|";
1.34 rogo 1328: int mode = -1;
1329: try
1.1 rogo 1330: {
1.34 rogo 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++)
1.1 rogo 1337: {
1.34 rogo 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 });
1.55 rogo 1351: Node delimiterNode = root.find("convert/source/database/delimiter", new int[] { 1, 1, i, 1, 1 });
1.59 rogo 1352: Node useNormanToUnicodeMapper = root.find("convert/source/database/usenormantounicodemapper", new int[] { 1, 1, i, 1, 1 });
1.55 rogo 1353:
1.44 rogo 1354: if (delimiterNode != null)
1355: delimiter = delimiterNode.getCharacters();
1.65 rogo 1356: if (useNormanToUnicodeMapper != null)
1.59 rogo 1357: {
1358: database.setUseNormanToUnicodeMapper(Boolean.valueOf(useNormanToUnicodeMapper.getCharacters()).booleanValue());
1.65 rogo 1359: System.out.println("useMapper " + Boolean.valueOf(useNormanToUnicodeMapper.getCharacters().trim()).booleanValue());
1360: }
1.59 rogo 1361:
1.34 rogo 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;
1.48 rogo 1389: else if (modeString.equals("delete"))
1390: mode = DataBase.DELETE_MODE;
1391:
1.34 rogo 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: }
1.55 rogo 1441: DataBase dataBase = new DataBase(database, tables, layouts, selects, creates, ids, mode);
1442: dataBase.delimiter = delimiter;
1.43 rogo 1443: databases.add(dataBase);
1.1 rogo 1444: }
1.34 rogo 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();
1.1 rogo 1470: }
1.34 rogo 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)
1.1 rogo 1478: {
1.34 rogo 1479: Node node = (Node) tempNode.contents.v.elementAt(i);
1480: if (node.type.equals("element"))
1.1 rogo 1481: {
1.34 rogo 1482: if (node.name.equals("database"))
1483: length++;
1484: if (node.name.equals("table"))
1485: length++;
1.1 rogo 1486: }
1.34 rogo 1487:
1488: // System.out.println(((Node)tempNode.contents.v.elementAt(i)).attributes+" "+i);
1.1 rogo 1489: }
1.34 rogo 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)
1.1 rogo 1497: {
1.34 rogo 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);
1.1 rogo 1506: }
1.34 rogo 1507: }
1.38 rogo 1508: /**
1509: * reads the specified xml file
1510: * @param xmlFile
1511: */
1.34 rogo 1512: public static void readXMLFile(String xmlFile)
1.1 rogo 1513: {
1.34 rogo 1514: try
1515: {
1.60 rogo 1516: InputStream stream = null;
1.65 rogo 1517:
1518: if (xmlFile.indexOf("file://") >= 0 || xmlFile.indexOf("http://") >= 0)
1.60 rogo 1519: {
1.65 rogo 1520: URL url = new URL(xmlFile);
1.60 rogo 1521: stream = url.openStream();
1.65 rogo 1522: } else
1523: // read XML Metadata from a file
1524: stream = new FileInputStream(xmlFile);
1.60 rogo 1525: InputStreamReader isr = new InputStreamReader(stream, "UTF-8");
1.34 rogo 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: }
1.1 rogo 1540: }
1.64 rogo 1541: /**
1542: * Helper class for Conversion etc
1543: * Holds the some data
1544: * @author rogo
1545: *
1546: */
1.65 rogo 1547:
1548: public static class ConversionProperties
1.64 rogo 1549: {
1550: String destTableName;
1.65 rogo 1551: String[] fieldNames;
1552: public ConversionProperties()
1.64 rogo 1553: {
1554: }
1.65 rogo 1555: public ConversionProperties(String destTableName, String[] fieldNames)
1.64 rogo 1556: {
1557: this.destTableName = destTableName;
1.65 rogo 1558: this.fieldNames = fieldNames;
1559:
1.64 rogo 1560: }
1.65 rogo 1561:
1.64 rogo 1562: }
1.38 rogo 1563: /**
1564: * Helper class for XML-File parsing
1565: * Holds the parsed data
1566: * @author rogo
1567: *
1568: */
1.34 rogo 1569: public static class DataBase
1570: {
1571: DBBean bean;
1572: Vector creates;
1573: Vector selects;
1574: Vector layouts;
1575: Vector tables;
1576: Vector ids;
1.43 rogo 1577: String delimiter = "//";
1.59 rogo 1578: boolean useNormanToUnicodeMapper = false;
1.65 rogo 1579:
1.34 rogo 1580: final static int CONVERT_MODE = 1;
1581: final static int APPEND_MODE = 2;
1582: final static int UPDATE_MODE = 3;
1.40 rogo 1583: final static int DELETE_MODE = 4;
1.62 rogo 1584: final static int SYNCHRONIZE_MODE = 5;
1.65 rogo 1585:
1.34 rogo 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: }
1.38 rogo 1599: /**
1.42 rogo 1600: * writes the data contained in this object to the buffered writer
1.38 rogo 1601: * * @param buffr
1602: * @throws Exception
1603: */
1.34 rogo 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");
1.55 rogo 1611: buffr.write(" <delimiter>" + delimiter + "</delimiter>\n");
1.34 rogo 1612: String modeString = "";
1613: if (mode == CONVERT_MODE)
1614: modeString = "convert";
1615: else if (mode == APPEND_MODE)
1.5 rogo 1616: modeString = "append";
1.34 rogo 1617: else if (mode == UPDATE_MODE)
1618: modeString = "update";
1.48 rogo 1619: else if (mode == DELETE_MODE)
1.55 rogo 1620: modeString = "delete";
1.34 rogo 1621:
1622: buffr.write(" <mode>" + modeString + "</mode>\n");
1.59 rogo 1623: buffr.write(" <usenormantounicodemapper>" + useNormanToUnicodeMapper + "</usenormantounicodemapper>\n");
1.65 rogo 1624:
1.34 rogo 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: }
1.1 rogo 1647:
1.34 rogo 1648: }
1649: public static String convertToUTF8(Object command)
1.1 rogo 1650: {
1.34 rogo 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;
1.1 rogo 1661: }
1662: public static void writeConfig(String file, DataBase source, DataBase destination) throws Exception
1663: {
1.34 rogo 1664: if (!file.toLowerCase().endsWith(".xml"))
1665: file += ".xml";
1.1 rogo 1666: File f = new File(file);
1.34 rogo 1667:
1668: FileOutputStream fout = new FileOutputStream(f);
1669: OutputStreamWriter outsw = new OutputStreamWriter(fout, "UTF-8");
1.1 rogo 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();
1.34 rogo 1682: }
1.46 rogo 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: {
1.55 rogo 1688: dialog = new FM2SQL.ProgressDialog(FM2SQL.fmInstance, bean);
1.46 rogo 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;
1.47 rogo 1767: // tempo
1768: beanDest.setConnection(destination);
1.46 rogo 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();
1.47 rogo 1772:
1.46 rogo 1773: int endIndex = -1;
1774: String tempQuery = query;
1.47 rogo 1775: String destQuery = query.replaceAll(names.get(tbIndex).toString(), destTableName);
1.49 rogo 1776: String tempQueryDest = destQuery;
1777: // remove extra query parts destQuery.substring(0,destQuery.lastIndexOf(destTableName)+destTableName.length()+1);
1.47 rogo 1778: System.out.println("new Query " + tempQueryDest);
1.46 rogo 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();
1.47 rogo 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());
1.46 rogo 1803: /// @TODO complete delete task remove query show lines to be deleted let user choose if he wants that
1.47 rogo 1804: System.out.println("number of lines to be deleted " + linesToDelete.size());
1.46 rogo 1805: deltaID = (int) Math.round((double) myIds.size() / (double) numIntervalls);
1.47 rogo 1806: beanDest.setConnection(destination);
1.46 rogo 1807:
1.47 rogo 1808: Statement stm = beanDest.getConnection().createStatement();
1.46 rogo 1809:
1.47 rogo 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)
1.46 rogo 1837: {
1838:
1.48 rogo 1839: ++j;
1.47 rogo 1840: if (j == linesToDelete.size())
1841: break;
1842: //print rows
1843: pstm.setString(1, linesToDelete.get(j).toString());
1844: System.out.println(pstm.toString());
1.55 rogo 1845: pstm.execute();
1.46 rogo 1846: if (dialog != null)
1.47 rogo 1847: dialog.progress.setValue((int) (((double) (j + 1) / (double) rowCount) * 100.0));
1848: command = null;
1.46 rogo 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:
1.47 rogo 1856: } //to outer while
1857: } // to idfield if
1858: } // table loop
1859:
1860: } catch (Exception e)
1.55 rogo 1861: {
1862: System.out.println("Error while connecting to database " + e);
1.47 rogo 1863: if (dialog != null)
1864: {
1.55 rogo 1865: dialog.setVisible(false);
1.47 rogo 1866: dialog.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
1867: FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
1.55 rogo 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));
1.46 rogo 1880:
1.55 rogo 1881: dialog.setVisible(false);
1882: }
1883: } // to method
1.65 rogo 1884:
1.60 rogo 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
1.67 ! rogo 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
1.60 rogo 1901: {
1.62 rogo 1902: System.out.println(" bin in synchronize!!!");
1.60 rogo 1903: FM2SQL.ProgressDialog dialog = null;
1904: if (FM2SQL.fmInstance != null)
1905: {
1906: dialog = new FM2SQL.ProgressDialog(FM2SQL.fmInstance, bean);
1.61 rogo 1907: dialog.setTitle("Synchronize running ...");
1.60 rogo 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)
1.62 rogo 1948: if (!layout.equals(""))
1.60 rogo 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: }
1.65 rogo 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();
1.62 rogo 1964: }
1.60 rogo 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;
1.66 rogo 2004: TreeSet linesToDelete = null;
2005: PreparedStatement delPSt = null;
1.60 rogo 2006: while (true)
2007: {
2008: ++counter;
2009: if (counter == 0 && dialog != null)
2010: dialog.title.setText("Check if data is available");
2011: else if (dialog != null)
2012: dialog.title.setText("Check if more data is available");
2013: myIds = bean.getIDVector(ids.get(tbIndex).toString(), (String) names.get(tbIndex), tempQuery, numHits);
2014: myIdsDest = beanDest.getIDVector(convertText(idField), destTableName, tempQueryDest, numHits);
2015: if (myIds.isEmpty())
2016: break;
2017: vec = new Vector(myIds);
2018: vecDest = new Vector(myIdsDest);
2019: rowCount = vec.size();
2020: // Deletion will work this way
2021: Vector deleted = new Vector(vec);
1.67 ! rogo 2022:
! 2023: TreeSet linesToAppend = new TreeSet(vec);
! 2024: linesToAppend.addAll(vec);
1.66 rogo 2025: linesToDelete = new TreeSet(vecDest);
1.61 rogo 2026: // remove all lines that are already in dest database
2027: linesToAppend.removeAll(vecDest);
1.60 rogo 2028: // remove all lines that should not be deleted
2029: linesToDelete.removeAll(deleted);
1.67 ! rogo 2030: System.out.println("linesToAppend " + linesToAppend + " " + destTableName);
! 2031: System.out.println("linesToDelete " + linesToDelete + " " + destTableName);
1.66 rogo 2032: System.out.println("ID LIST SIZE " + Math.round((double) myIds.size() / (double) numIntervalls) + " " + myIds.size());
2033: deltaID = (int) Math.round((double) myIds.size() / (double) numIntervalls);
1.65 rogo 2034: ConversionProperties prop = getFieldNamesAndDestTableName(creates.get(tbIndex).toString(), query, names.get(tbIndex).toString());
2035: StringBuffer insCommand = createInsertCommand(prop.destTableName, prop.fieldNames);
1.67 ! rogo 2036: StringBuffer updCommand = createUpdateCommand(prop.destTableName, prop.fieldNames, tempIDdest);
! 2037: StringBuffer delCommand = createDeleteCommand(destTableName, tempIDdest);
1.65 rogo 2038: PreparedStatement insPst = beanDest.getConnection().prepareStatement(insCommand.toString());
2039: PreparedStatement updPst = beanDest.getConnection().prepareStatement(updCommand.toString());
1.67 ! rogo 2040: // delPSt = beanDest.getConnection().prepareStatement(delCommand.toString());
! 2041: // delPSt.setString(1,"b015892");
! 2042: // delPSt.execute();
! 2043: // if (true)
! 2044: // return;
1.66 rogo 2045: if (vec.size() <= numIntervalls)
1.65 rogo 2046: {
1.66 rogo 2047: endIndex = 0;
2048: deltaID = vec.size();
1.65 rogo 2049: }
1.66 rogo 2050: for (int k = 0; k < vec.size() - deltaID; k = k + deltaID)
2051: {
2052: System.out.println(vec.get(k) + " " + vec.get(k + deltaID) + " " + vec.lastElement());
2053: if (query.indexOf("where") > 0)
2054: tempQuery = query + " and " + tempID + ">='" + vec.get(k) + "' and " + tempID + "<='" + vec.get(k + deltaID) + "'";
2055: else
2056: tempQuery = query + " where " + tempID + ">='" + vec.get(k) + "' and " + tempID + "<='" + vec.get(k + deltaID) + "'";
2057: System.out.println(tempQuery);
2058: if (dialog != null)
2059: dialog.title.setText("Reading table data ...");
1.65 rogo 2060:
1.66 rogo 2061: // bean.makeQuery(tempQuery, deltaID);
2062: if (dialog != null)
2063: dialog.title.setText("Writing table data ...");
1.60 rogo 2064:
1.67 ! rogo 2065: // performSynchronize(idField, vec, tempQuery, linesToDelete, linesToAppend, insPst, updPst, delPSt, deltaID, delimiter);
1.66 rogo 2066: // System.out.println("ID LIST SIZE " + Math.round((double) myIds.size() / (double) numIntervalls) + " " + myIdsDest.size());
2067: endIndex = k + deltaID;
2068: }
2069: System.out.println(endIndex);
2070: //all data written ? if not write last chunk of data
2071: if (endIndex == vec.size() - 1)
2072: System.out.println("fits");
2073: else
1.60 rogo 2074: {
1.66 rogo 2075: System.out.println(" last intervall from " + vec.get(endIndex) + " " + vec.lastElement());
1.60 rogo 2076:
1.66 rogo 2077: if (query.indexOf("where") > 0)
2078: tempQuery = query + " and " + tempID + ">='" + vec.get(endIndex) + "' and " + tempID + "<='" + vec.lastElement() + "'";
2079: else
2080: tempQuery = query + " where " + tempID + ">='" + vec.get(endIndex) + "' and " + tempID + "<='" + vec.lastElement() + "'";
2081: System.out.println(tempQuery);
2082: if (dialog != null)
2083: dialog.title.setText("Reading table data ...");
1.67 ! rogo 2084: // bean.makeQuery(tempQuery, 0);
1.60 rogo 2085: if (dialog != null)
1.66 rogo 2086: dialog.title.setText("Writing table data ...");
1.67 ! rogo 2087: // performSynchronize(idField, vec, tempQuery, linesToDelete, linesToAppend, insPst, updPst, delPSt, deltaID, delimiter);
1.66 rogo 2088: // System.out.println("ID LIST SIZE " + Math.round((double) myIds.size() / (double) numIntervalls) + " " + myIdsDest.size());
1.60 rogo 2089: }
2090: // prepare new query for next chunk
2091: if (query.indexOf("where") > 0)
2092: tempQuery = query + " and " + tempID + ">'" + vec.lastElement() + "'";
2093: else
2094: tempQuery = query + " where " + tempID + ">'" + vec.lastElement() + "'";
1.66 rogo 2095:
2096: }
1.67 ! rogo 2097:
1.66 rogo 2098: for (Iterator iter = linesToDelete.iterator(); iter.hasNext();)
2099: {
2100: String id = (String) iter.next();
2101: delPSt.setString(1, id);
2102: delPSt.execute();
2103:
2104: }
2105:
2106: long endTime = System.currentTimeMillis();
2107: System.out.println("Time for incremental synchronize elapsed " + (endTime - startTime));
1.60 rogo 2108: } // to idfield if
2109: } // table loop
2110:
2111: } catch (Exception e)
2112: {
2113: System.out.println("Error while connecting to database " + e);
1.67 ! rogo 2114: e.printStackTrace();
1.60 rogo 2115: if (dialog != null)
2116: {
2117: dialog.setVisible(false);
2118: dialog.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
2119: FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
2120: }
2121: java.io.ByteArrayOutputStream b = new java.io.ByteArrayOutputStream();
2122: java.io.PrintStream stream = new java.io.PrintStream(b);
2123: stream.print(command + "\n\n");
2124: e.printStackTrace(stream);
2125: FM2SQL.showErrorDialog(b.toString(), "Error occured !");
2126:
2127: }
2128: if (dialog != null)
2129: {
2130: dialog.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
2131: FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
2132:
2133: dialog.setVisible(false);
2134: }
1.66 rogo 2135: }
2136: private static void performSynchronize(
2137: String idField,
2138: Vector vec,
2139: String tempQuery,
2140: TreeSet linesToDelete,
2141: TreeSet linesToAppend,
2142: PreparedStatement insPst,
2143: PreparedStatement updPst,
2144: PreparedStatement delPSt,
1.67 ! rogo 2145: int deltaID,
! 2146: String delimiter)
1.66 rogo 2147: throws SQLException, ParseException
2148: {
2149: Vector[] vectors = bean.getQueryData(tempQuery, deltaID);
2150: int idIndex = vectors[1].indexOf(idField);
2151: // todo arraylist code has to be added
2152: for (Iterator iter = vectors[0].iterator(); iter.hasNext();)
2153: {
2154: Vector line = (Vector) iter.next();
2155: Object lineIDIndex = line.get(idIndex);
1.67 ! rogo 2156: if (linesToAppend.contains(lineIDIndex))
! 2157: System.out.println("line " + linesToAppend.contains(line.get(idIndex)) + " " + lineIDIndex);
1.66 rogo 2158: if (linesToAppend.contains(lineIDIndex))
2159: {
2160: for (int l = 0; l < line.size(); ++l)
2161: {
2162: Object obj = line.get(l);
1.67 ! rogo 2163: if (obj instanceof ArrayList)
! 2164: obj = formatFileMakerArray((List) obj, delimiter);
1.66 rogo 2165: if (obj != null)
2166: insPst.setString(l + 1, obj.toString());
2167: else
2168: insPst.setNull(l + 1, Types.NULL);
2169: }
2170: insPst.execute();
2171:
2172: } else // update
2173: {
2174: for (int l = 0; l < line.size(); ++l)
2175: {
2176: Object obj = line.get(l);
1.67 ! rogo 2177: if (obj instanceof ArrayList)
! 2178: obj = formatFileMakerArray((List) obj, delimiter);
1.66 rogo 2179: if (obj != null)
2180: updPst.setString(l + 1, obj.toString());
2181: else
2182: updPst.setNull(l + 1, Types.NULL);
2183: }
2184: updPst.setString(line.size() + 1, line.get(idIndex).toString());
2185: updPst.execute();
2186:
2187: }
2188: }
2189:
1.60 rogo 2190: } // to method
2191:
1.56 rogo 2192: /**
2193: * Converts input String in norman encoding to unicode
2194: * @param inp
2195: * @return converted String
2196: */
1.65 rogo 2197: static public String normanToUnicode(String inp)
2198: {
1.56 rogo 2199: StringBuffer buf = new StringBuffer();
1.65 rogo 2200: for (int i = 0; i < inp.length(); i++)
2201: {
1.56 rogo 2202: char c = inp.charAt(i);
1.65 rogo 2203: // System.out.println("char "+c+" "+(int)c);
2204: switch (c)
2205: {
2206: case 1 :
2207: buf.append("\u00d0");
2208: break; // Eth
2209: case 2 :
2210: buf.append("\u00f0");
2211: break; // eth
2212: case 3 :
2213: buf.append("\u0141");
2214: break; // Lslash
2215: case 4 :
2216: buf.append("\u0142");
2217: break; // lslash
2218: case 5 :
2219: buf.append("\u0160");
2220: break; // S caron
2221: case 6 :
2222: buf.append("\u0161");
2223: break; // s caron
2224: case 7 :
2225: buf.append("\u00dd");
2226: break; // Y acute
2227: case 8 :
2228: buf.append("\u00fd");
2229: break; // y acute
2230: case 11 :
2231: buf.append("\u00de");
2232: break; // Thorn
2233: case 12 :
2234: buf.append("\u00fe");
2235: break; // thorn
2236: case 14 :
2237: buf.append("\u017d");
2238: break; // Z caron
2239: case 15 :
2240: buf.append("\u017e");
2241: break; // z caron
2242: case 17 :
2243: buf.append("\u0073");
2244: break; // asciitilde
2245: case 18 :
2246: buf.append("j\u0305");
2247: break; // j macron [does a single char exist?]
2248: case 19 :
2249: buf.append("^");
2250: break; // circumflex
2251: case 20 :
2252: buf.append("\u0303");
2253: break; // tilde
2254: case 21 :
2255: buf.append("\u00bd");
2256: break; // onehalf
2257: case 22 :
2258: buf.append("\u00bc");
2259: break; // onequarter
2260: case 23 :
2261: buf.append("\u00b9");
2262: break; // onesuperior
2263: case 24 :
2264: buf.append("\u00be");
2265: break; // threequarters
2266: case 25 :
2267: buf.append("\u00b3");
2268: break; // threesuperior
2269: case 26 :
2270: buf.append("\u00b2");
2271: break; // twosuperior
2272: case 27 :
2273: buf.append("\u00a6");
2274: break; // brokenbar
2275: case 28 :
2276: buf.append("-");
2277: break; // minus
2278: case 29 :
2279: buf.append("\u00d7");
2280: break; // multiply
2281: case 39 :
2282: buf.append("'");
2283: break; // quotesingle
2284: case 94 :
2285: buf.append("\u0302");
2286: break; // circumflex
2287: case 96 :
2288: buf.append("\u0300");
2289: break; // grave
2290: case 196 :
2291: buf.append("\u00c4");
2292: break; // A dieresis
2293: case 197 :
2294: buf.append("\u00c5");
2295: break; // A ring
2296: case 201 :
2297: buf.append("\u00c9");
2298: break; // E acute
2299: case 209 :
2300: buf.append("\u00d1");
2301: break; // N tilde
2302: case 214 :
2303: buf.append("\u00d6");
2304: break; // O dieresis
2305: case 220 :
2306: buf.append("\u00dc");
2307: break; // U dieresis
2308: case 225 :
2309: buf.append("\u00e1");
2310: break; // a acute
2311: case 224 :
2312: buf.append("\u00e0");
2313: break; // a grave
2314: case 226 :
2315: buf.append("\u00e2");
2316: break; // a circumflex
2317: case 228 :
2318: buf.append("\u00e4");
2319: break; // a dieresis
2320: case 227 :
2321: buf.append("\u00e3");
2322: break; // a tilde
2323: case 229 :
2324: buf.append("\u0101");
2325: break; // a macron
2326: case 231 :
2327: buf.append("\u00e7");
2328: break; // c cedilla
2329: case 233 :
2330: buf.append("\u00e9");
2331: break; // e acute
2332: case 232 :
2333: buf.append("\u00e8");
2334: break; // e grave
2335: case 234 :
2336: buf.append("\u00ea");
2337: break; // e circumflex
2338: case 235 :
2339: buf.append("\u00eb");
2340: break; // e dieresis
2341: case 237 :
2342: buf.append("\u00ed");
2343: break; // i acute
2344: case 236 :
2345: buf.append("\u00ec");
2346: break; // i grave
2347: case 238 :
2348: buf.append("\u00ee");
2349: break; // i circumflex
2350: case 239 :
2351: buf.append("\u00ef");
2352: break; // i dieresis
2353: case 241 :
2354: buf.append("\u00f1");
2355: break; // n tilde
2356: case 243 :
2357: buf.append("\u00f3");
2358: break; // o acute
2359: case 242 :
2360: buf.append("\u00f2");
2361: break; // o grave
2362: case 244 :
2363: buf.append("\u00f4");
2364: break; // o circumflex
2365: case 246 :
2366: buf.append("\u00f6");
2367: break; // o dieresis
2368: case 245 :
2369: buf.append("\u00f5");
2370: break; // o tilde
2371: case 250 :
2372: buf.append("\u00fa");
2373: break; // u acute
2374: case 249 :
2375: buf.append("\u00f9");
2376: break; // u grave
2377: case 251 :
2378: buf.append("\u00fb");
2379: break; // u circumflex
2380: case 252 :
2381: buf.append("\u00fc");
2382: break; // u dieresis
2383: case 8224 :
2384: buf.append("\u1e6d");
2385: break; // t underdot
2386: case 176 :
2387: buf.append("\u00b0");
2388: break; // degree
2389: case 162 :
2390: buf.append("\u1ebd");
2391: break; // e tilde
2392: case 163 :
2393: buf.append("\u00a3");
2394: break; // sterling
2395: case 167 :
2396: buf.append("\u00a7");
2397: break; // section
2398: case 182 :
2399: buf.append("\u00b6");
2400: break; // paragraph
2401: case 223 :
2402: buf.append("\u015b");
2403: break; // s acute
2404: case 174 :
2405: buf.append("\u1e5b");
2406: break; // r underdot
2407: case 169 :
2408: buf.append("\u1e45");
2409: break; // n overdot
2410: case 353 :
2411: buf.append("\u1e45");
2412: break; // n overdot
2413: case 180 :
2414: buf.append("\u0301");
2415: break; // acute
2416: case 168 :
2417: buf.append("\u0308");
2418: break; // dieresis
2419: case 8800 :
2420: buf.append("\u1e6d");
2421: break; // t underdot
2422: case 198 :
2423: buf.append("\u00c6");
2424: break; // AE
2425: case 216 :
2426: buf.append("\u014d");
2427: break; // o macron
2428: case 8734 :
2429: buf.append("\u0129");
2430: break; // i tilde
2431: case 177 :
2432: buf.append("\u00b1");
2433: break; // plusminus
2434: case 165 :
2435: buf.append("\u012b");
2436: break; // i macron
2437: case 181 :
2438: buf.append("\u1e43");
2439: break; // m underdot
2440: case 8706 :
2441: buf.append("\u1e0d");
2442: break; // d underdot
2443: case 240 :
2444: buf.append("\u1e0d");
2445: break; // d underdot
2446:
2447: case 8721 :
2448: buf.append("\u1e63");
2449: break; // s underdot
2450: case 960 :
2451: buf.append("\u017a");
2452: break; // z acute
2453: case 8747 :
2454: buf.append("\u1e45");
2455: break; // n overdot
2456: case 937 :
2457: buf.append("\u0169");
2458: break; // u tilde
2459: case 230 :
2460: buf.append("\u00e6");
2461: break; // ae
2462: case 248 :
2463: buf.append("\u00f8");
2464: break; // oslash
2465: case 191 :
2466: buf.append("\u0304\u0306");
2467: break; // macron breve
2468: case 172 :
2469: buf.append("\u1e37");
2470: break; //
2471: case 8730 :
2472: buf.append("j\u0305");
2473: break; // j macron [does a single char exist?]
2474: case 402 :
2475: buf.append("\u0103");
2476: break; // a breve
2477: case 8776 :
2478: buf.append("\u016d");
2479: break; // u breve
2480: case 187 :
2481: buf.append("\u1e42");
2482: break; // M underdot
2483: case 8230 :
2484: buf.append("\u2026");
2485: break; // ellipsis
2486: case 192 :
2487: buf.append("\u00c0");
2488: break; // A grave
2489: case 195 :
2490: buf.append("\u00c3");
2491: break; // A tilde
2492: case 213 :
2493: buf.append("\u00d5");
2494: break; // O tilde
2495: case 338 :
2496: buf.append("m\u0306");
2497: break; // m breve
2498: case 339 :
2499: buf.append("\u0153");
2500: break; // oe
2501: case 8211 :
2502: buf.append("\u2013");
2503: break; // endash
2504: case 8212 :
2505: buf.append("\u2014");
2506: break; // emdash
2507: case 8220 :
2508: buf.append("\u201c");
2509: break; // quotedblleft
2510: case 8221 :
2511: buf.append("\u201d");
2512: break; // quotedblright
2513: case 8216 :
2514: buf.append("\u2018");
2515: break; // quoteleft
2516: case 8217 :
2517: buf.append("\u2019");
2518: break; // quoteright
2519: case 247 :
2520: buf.append("\u1e37");
2521: break; // l underring [actually underdot]
2522: case 9674 :
2523: buf.append("\u1e41");
2524: break; // m overdot
2525: case 255 :
2526: buf.append("n\u0306");
2527: break; // n breve
2528: case 376 :
2529: buf.append("\u00d7");
2530: break; // multiply
2531: case 8364 :
2532: buf.append("\u1e5b");
2533: break; // r underring [actually underdot]
2534: case 8249 :
2535: buf.append("\u1e44");
2536: break; // N overdot
2537: case 8250 :
2538: buf.append("\u1e62");
2539: break; // S underdot
2540: case 64257 :
2541: buf.append("\u1e24");
2542: break; // H underdot
2543: case 64258 :
2544: buf.append("\u1e0c");
2545: break; // D underdot
2546: case 8225 :
2547: buf.append("\u2021");
2548: break; // daggerdbl
2549: case 8218 :
2550: buf.append("\u1e36");
2551: break; // L underdot
2552: case 8222 :
2553: buf.append("\u0113");
2554: break; // e macron
2555: case 194 :
2556: buf.append("\u1e5f");
2557: break; // r underbar
2558: case 202 :
2559: buf.append("r\u0324");
2560: break; // r underdieresis
2561: case 193 :
2562: buf.append("\u012a");
2563: break; // I macron
2564: case 8486 :
2565: case 203 :
2566: buf.append("\u016b");
2567: break; // u macron
2568: case 200 :
2569: buf.append("\u1e6c");
2570: break; // T underdot
2571: case 205 :
2572: buf.append("\u1e64");
2573: break; // S acute
2574: case 206 :
2575: buf.append("\u2020");
2576: break; // dagger
2577: case 207 :
2578: buf.append("\u0115");
2579: break; // e breve
2580: case 204 :
2581: buf.append("\u014f");
2582: break; // o breve
2583: case 211 :
2584: buf.append("\u0100");
2585: break; // A macron
2586: case 212 :
2587: buf.append("\u1e46");
2588: break; // N underdot
2589: case 210 :
2590: buf.append("\u1e3b");
2591: break; // l underbar
2592: case 218 :
2593: buf.append("\u016a");
2594: break; // U macron
2595: case 219 :
2596: buf.append("\u0179");
2597: break; // Z acute
2598: case 217 :
2599: buf.append("\u1e5a");
2600: break; // R underdot
2601: case 305 :
2602: buf.append("\u0131");
2603: break; // dotlessi
2604: case 710 :
2605: buf.append("\u1e47");
2606: break; // n underdot
2607: case 732 :
2608: buf.append("\u1e49");
2609: break; // n underbar
2610: case 175 :
2611: buf.append("\u0304");
2612: break; // macron
2613: case 728 :
2614: buf.append("\u0306");
2615: break; // breve
2616: case 729 :
2617: case 215 :
2618: buf.append("\u1e25");
2619: break; // h underdot
2620: case 730 :
2621: buf.append("\u012d");
2622: break; // i breve
2623: case 184 :
2624: buf.append("\u0327");
2625: break; // cedilla
2626: case 733 :
2627: buf.append("\u030b");
2628: break; // hungarumlaut
2629: case 731 :
2630: buf.append("\u0328");
2631: break; // ogonek
2632: case 711 :
2633: buf.append("\u030c");
2634: break; // caron
2635: case 199 :
2636: buf.append("\u012b\u0303");
2637: break; // imacron tilde
2638: case 8226 :
2639: buf.append("\u1e5d");
2640: break; // runderdot macron
2641: case 8482 :
2642: buf.append("\u016b\0306");
2643: break; // umacron breve
2644: case 8804 :
2645: buf.append("\u0101\u0301");
2646: break; // amacron acute
2647: case 8805 :
2648: buf.append("\u016b\u0301");
2649: break; // umacron acute
2650: case 8719 :
2651: buf.append("\u0113\u0301");
2652: break; // emacron acute
2653: case 170 :
2654: buf.append("\u0113\u0300");
2655: break; // emacron breve
2656: case 186 :
2657: buf.append("\u014d\u0300");
2658: break; // omacron breve
2659: case 161 :
2660: buf.append("\u0101\u0306");
2661: break; // amacron breve
2662: case 8710 :
2663: buf.append("\u0101\u0303");
2664: break; // amacron tilde
2665: case 171 :
2666: buf.append("\u012b\u0301");
2667: break; // imacron acute
2668: case 8260 :
2669: buf.append("\u1e00");
2670: break; // runderdotmacron acute
2671: case 183 :
2672: buf.append("\u1e5b\u0301");
2673: break; // runderdot acute
2674: case 8240 :
2675: buf.append("\u012b\u0306");
2676: break; // imacron breve
2677: case 63743 :
2678: buf.append("\u016b\u0303");
2679: break; // umacron tilde
2680: default :
2681: buf.append(c);
2682: if ((int) c > 127)
2683: System.out.println("char " + c + " " + (int) c);
2684: break;
1.57 rogo 2685: }
2686: }
2687: return buf.toString();
2688: }
2689:
1.65 rogo 2690: static public String normanToUnicodeOld(String inp)
2691: {
1.57 rogo 2692: StringBuffer buf = new StringBuffer();
1.65 rogo 2693: for (int i = 0; i < inp.length(); i++)
2694: {
1.57 rogo 2695: char c = inp.charAt(i);
1.65 rogo 2696: switch (c)
2697: {
2698: case 1 :
2699: buf.append("\u00d0");
2700: break; // Eth
2701: case 2 :
2702: buf.append("\u00f0");
2703: break; // eth
2704: case 3 :
2705: buf.append("\u0141");
2706: break; // Lslash
2707: case 4 :
2708: buf.append("\u0142");
2709: break; // lslash
2710: case 5 :
2711: buf.append("\u0160");
2712: break; // S caron
2713: case 6 :
2714: buf.append("\u0161");
2715: break; // s caron
2716: case 7 :
2717: buf.append("\u00dd");
2718: break; // Y acute
2719: case 8 :
2720: buf.append("\u00fd");
2721: break; // y acute
2722: case 11 :
2723: buf.append("\u00de");
2724: break; // Thorn
2725: case 12 :
2726: buf.append("\u00fe");
2727: break; // thorn
2728: case 14 :
2729: buf.append("\u017d");
2730: break; // Z caron
2731: case 15 :
2732: buf.append("\u017e");
2733: break; // z caron
2734: case 17 :
2735: buf.append("\u0073");
2736: break; // asciitilde
2737: case 18 :
2738: buf.append("j\u0305");
2739: break; // j macron [does a single char exist?]
2740: case 19 :
2741: buf.append("^");
2742: break; // circumflex
2743: case 20 :
2744: buf.append("\u0303");
2745: break; // tilde
2746: case 21 :
2747: buf.append("\u00bd");
2748: break; // onehalf
2749: case 22 :
2750: buf.append("\u00bc");
2751: break; // onequarter
2752: case 23 :
2753: buf.append("\u00b9");
2754: break; // onesuperior
2755: case 24 :
2756: buf.append("\u00be");
2757: break; // threequarters
2758: case 25 :
2759: buf.append("\u00b3");
2760: break; // threesuperior
2761: case 26 :
2762: buf.append("\u00b2");
2763: break; // twosuperior
2764: case 27 :
2765: buf.append("\u00a6");
2766: break; // brokenbar
2767: case 28 :
2768: buf.append("-");
2769: break; // minus
2770: case 29 :
2771: buf.append("\u00d7");
2772: break; // multiply
2773: case 39 :
2774: buf.append("'");
2775: break; // quotesingle
2776: case 94 :
2777: buf.append("\u0302");
2778: break; // circumflex
2779: case 96 :
2780: buf.append("\u0300");
2781: break; // grave
2782: case 128 :
2783: buf.append("\u00c4");
2784: break; // A dieresis
2785: case 129 :
2786: buf.append("\u00c5");
2787: break; // A ring
2788: case 131 :
2789: buf.append("\u00c9");
2790: break; // E acute
2791: case 132 :
2792: buf.append("\u00d1");
2793: break; // N tilde
2794: case 133 :
2795: buf.append("\u00d6");
2796: break; // O dieresis
2797: case 134 :
2798: buf.append("\u00dc");
2799: break; // U dieresis
2800: case 135 :
2801: buf.append("\u00e1");
2802: break; // a acute
2803: case 136 :
2804: buf.append("\u00e0");
2805: break; // a grave
2806: case 137 :
2807: buf.append("\u00e2");
2808: break; // a circumflex
2809: case 138 :
2810: buf.append("\u00e4");
2811: break; // a dieresis
2812: case 139 :
2813: buf.append("\u00e3");
2814: break; // a tilde
2815: case 140 :
2816: buf.append("\u0101");
2817: break; // a macron
2818: case 141 :
2819: buf.append("\u00e7");
2820: break; // c cedilla
2821: case 142 :
2822: buf.append("\u00e9");
2823: break; // e acute
2824: case 143 :
2825: buf.append("\u00e8");
2826: break; // e grave
2827: case 144 :
2828: buf.append("\u00ea");
2829: break; // e circumflex
2830: case 145 :
2831: buf.append("\u00eb");
2832: break; // e dieresis
2833: case 146 :
2834: buf.append("\u00ed");
2835: break; // i acute
2836: case 147 :
2837: buf.append("\u00ec");
2838: break; // i grave
2839: case 148 :
2840: buf.append("\u00ee");
2841: break; // i circumflex
2842: case 149 :
2843: buf.append("\u00ef");
2844: break; // i dieresis
2845: case 150 :
2846: buf.append("\u00f1");
2847: break; // n tilde
2848: case 151 :
2849: buf.append("\u00f3");
2850: break; // o acute
2851: case 152 :
2852: buf.append("\u00f2");
2853: break; // o grave
2854: case 153 :
2855: buf.append("\u00f4");
2856: break; // o circumflex
2857: case 154 :
2858: buf.append("\u00f6");
2859: break; // o dieresis
2860: case 155 :
2861: buf.append("\u00f5");
2862: break; // o tilde
2863: case 156 :
2864: buf.append("\u00fa");
2865: break; // u acute
2866: case 157 :
2867: buf.append("\u00f9");
2868: break; // u grave
2869: case 158 :
2870: buf.append("\u00fb");
2871: break; // u circumflex
2872: case 159 :
2873: buf.append("\u00fc");
2874: break; // u dieresis
2875: case 160 :
2876: buf.append("\u1e6d");
2877: break; // t underdot
2878: case 161 :
2879: buf.append("\u00b0");
2880: break; // degree
2881: case 162 :
2882: buf.append("\u1ebd");
2883: break; // e tilde
2884: case 163 :
2885: buf.append("\u00a3");
2886: break; // sterling
2887: case 164 :
2888: buf.append("\u00a7");
2889: break; // section
2890: case 166 :
2891: buf.append("\u00b6");
2892: break; // paragraph
2893: case 167 :
2894: buf.append("\u015b");
2895: break; // s acute
2896: case 168 :
2897: buf.append("\u1e5b");
2898: break; // r underdot
2899: case 169 :
2900: buf.append("\u1e67");
2901: break; // s caron
2902: case 171 :
2903: buf.append("\u0301");
2904: break; // acute
2905: case 172 :
2906: buf.append("\u0308");
2907: break; // dieresis
2908: case 173 :
2909: buf.append("\u1e6d");
2910: break; // t underdot
2911: case 174 :
2912: buf.append("\u00c6");
2913: break; // AE
2914: case 175 :
2915: buf.append("\u014d");
2916: break; // o macron
2917: case 176 :
2918: buf.append("\u0129");
2919: break; // i tilde
2920: case 177 :
2921: buf.append("\u00b1");
2922: break; // plusminus
2923: case 180 :
2924: buf.append("\u012b");
2925: break; // i macron
2926: case 181 :
2927: buf.append("\u1e43");
2928: break; // m underdot
2929: case 182 :
2930: buf.append("\u1e0d");
2931: break; // d underdot
2932: case 183 :
2933: buf.append("\u1e63");
2934: break; // s underdot
2935: case 185 :
2936: buf.append("\u017a");
2937: break; // z acute
2938: case 186 :
2939: buf.append("\u1e45");
2940: break; // n overdot
2941: case 189 :
2942: buf.append("\u0169");
2943: break; // u tilde
2944: case 190 :
2945: buf.append("\u00e6");
2946: break; // ae
2947: case 191 :
2948: buf.append("\u00f8");
2949: break; // oslash
2950: case 192 :
2951: buf.append("\u0304\u0306");
2952: break; // macron breve
2953: case 194 :
2954: buf.append("\u1e37");
2955: break; //
2956: case 195 :
2957: buf.append("j\u0305");
2958: break; // j macron [does a single char exist?]
2959: case 196 :
2960: buf.append("\u0103");
2961: break; // a breve
2962: case 197 :
2963: buf.append("\u016d");
2964: break; // u breve
2965: case 200 :
2966: buf.append("\u1e42");
2967: break; // M underdot
2968: case 201 :
2969: buf.append("\u2026");
2970: break; // ellipsis
2971: case 203 :
2972: buf.append("\u00c0");
2973: break; // A grave
2974: case 204 :
2975: buf.append("\u00c3");
2976: break; // A tilde
2977: case 205 :
2978: buf.append("\u00d5");
2979: break; // O tilde
2980: case 206 :
2981: buf.append("m\u0306");
2982: break; // m breve
2983: case 207 :
2984: buf.append("\u0153");
2985: break; // oe
2986: case 208 :
2987: buf.append("\u2013");
2988: break; // endash
2989: case 209 :
2990: buf.append("\u2014");
2991: break; // emdash
2992: case 210 :
2993: buf.append("\u201c");
2994: break; // quotedblleft
2995: case 211 :
2996: buf.append("\u201d");
2997: break; // quotedblright
2998: case 212 :
2999: buf.append("\u2018");
3000: break; // quoteleft
3001: case 213 :
3002: buf.append("\u2019");
3003: break; // quoteright
3004: case 214 :
3005: buf.append("\u1e37");
3006: break; // l underring [actually underdot]
3007: case 215 :
3008: buf.append("\u1e41");
3009: break; // m overdot
3010: case 216 :
3011: buf.append("n\u0306");
3012: break; // n breve
3013: case 217 :
3014: buf.append("\u00d7");
3015: break; // multiply
3016: case 219 :
3017: buf.append("\u1e5b");
3018: break; // r underring [actually underdot]
3019: case 220 :
3020: buf.append("\u1e44");
3021: break; // N overdot
3022: case 221 :
3023: buf.append("\u1e62");
3024: break; // S underdot
3025: case 222 :
3026: buf.append("\u1e24");
3027: break; // H underdot
3028: case 223 :
3029: buf.append("\u1e0c");
3030: break; // D underdot
3031: case 224 :
3032: buf.append("\u2021");
3033: break; // daggerdbl
3034: case 226 :
3035: buf.append("\u1e36");
3036: break; // L underdot
3037: case 227 :
3038: buf.append("\u0113");
3039: break; // e macron
3040: case 229 :
3041: buf.append("\u1e5f");
3042: break; // r underbar
3043: case 230 :
3044: buf.append("r\u0324");
3045: break; // r underdieresis
3046: case 231 :
3047: buf.append("\u012a");
3048: break; // I macron
3049: case 232 :
3050: buf.append("\u016b");
3051: break; // u macron
3052: case 233 :
3053: buf.append("\u01e6c");
3054: break; // T underdot
3055: case 234 :
3056: buf.append("\u1e64");
3057: break; // S acute
3058: case 235 :
3059: buf.append("\u2020");
3060: break; // dagger
3061: case 236 :
3062: buf.append("\u0115");
3063: break; // e breve
3064: case 237 :
3065: buf.append("\u014f");
3066: break; // o breve
3067: case 238 :
3068: buf.append("\u0100");
3069: break; // A macron
3070: case 239 :
3071: buf.append("\u1e46");
3072: break; // N underdot
3073: case 241 :
3074: buf.append("\u1e3b");
3075: break; // l underbar
3076: case 242 :
3077: buf.append("\u016a");
3078: break; // U macron
3079: case 243 :
3080: buf.append("\u0179");
3081: break; // Z acute
3082: case 244 :
3083: buf.append("\u1e5a");
3084: break; // R underdot
3085: case 245 :
3086: buf.append("\u0131");
3087: break; // dotlessi
3088: case 246 :
3089: buf.append("\u1e47");
3090: break; // n underdot
3091: case 247 :
3092: buf.append("\u1e49");
3093: break; // n underbar
3094: case 248 :
3095: buf.append("\u0304");
3096: break; // macron
3097: case 249 :
3098: buf.append("\u0306");
3099: break; // breve
3100: case 250 :
3101: buf.append("\u1e25");
3102: break; // h underdot
3103: case 251 :
3104: buf.append("\u012d");
3105: break; // i breve
3106: case 252 :
3107: buf.append("\u0327");
3108: break; // cedilla
3109: case 253 :
3110: buf.append("\u030b");
3111: break; // hungarumlaut
3112: case 254 :
3113: buf.append("\u0328");
3114: break; // ogonek
3115: case 255 :
3116: buf.append("\u030c");
3117: break; // caron
3118: case 130 :
3119: buf.append("\u012b\u0303");
3120: break; // imacron tilde
3121: case 165 :
3122: buf.append("\u1e5d");
3123: break; // runderdot macron
3124: case 170 :
3125: buf.append("\u016b\0306");
3126: break; // umacron breve
3127: case 178 :
3128: buf.append("\u0101\u0301");
3129: break; // amacron acute
3130: case 179 :
3131: buf.append("\u016b\u0301");
3132: break; // umacron acute
3133: case 184 :
3134: buf.append("\u0113\u0301");
3135: break; // emacron acute
3136: case 187 :
3137: buf.append("\u0113\u0300");
3138: break; // emacron breve
3139: case 188 :
3140: buf.append("\u014d\u0300");
3141: break; // omacron breve
3142: case 193 :
3143: buf.append("\u0101\u0306");
3144: break; // amacron breve
3145: case 198 :
3146: buf.append("\u0101\u0303");
3147: break; // amacron tilde
3148: case 199 :
3149: buf.append("\u012b\u0301");
3150: break; // imacron acute
3151: case 218 :
3152: buf.append("\u1e00");
3153: break; // runderdotmacron acute
3154: case 225 :
3155: buf.append("\u1e5b\u0301");
3156: break; // runderdot acute
3157: case 228 :
3158: buf.append("\u012b\u0306");
3159: break; // imacron breve
3160: case 240 :
3161: buf.append("\u016b\u0303");
3162: break; // umacron tilde
3163: default :
3164: buf.append(c);
3165: break;
1.56 rogo 3166: }
3167: }
3168: return buf.toString();
3169: }
1.65 rogo 3170: static public String normanToUnicodeNew(String inp)
3171: {
1.58 rogo 3172: StringBuffer buf = new StringBuffer();
1.65 rogo 3173: for (int i = 0; i < inp.length(); i++)
3174: {
1.58 rogo 3175: char c = inp.charAt(i);
1.65 rogo 3176: switch (c)
3177: {
3178: case 1 :
3179: buf.append("\u00d0");
3180: break; // Eth
3181: case 2 :
3182: buf.append("\u00f0");
3183: break; // eth
3184: case 3 :
3185: buf.append("\u0141");
3186: break; // Lslash
3187: case 4 :
3188: buf.append("\u0142");
3189: break; // lslash
3190: case 5 :
3191: buf.append("\u0160");
3192: break; // S caron
3193: case 6 :
3194: buf.append("\u0161");
3195: break; // s caron
3196: case 7 :
3197: buf.append("\u00dd");
3198: break; // Y acute
3199: case 8 :
3200: buf.append("\u00fd");
3201: break; // y acute
3202: case 11 :
3203: buf.append("\u00de");
3204: break; // Thorn
3205: case 12 :
3206: buf.append("\u00fe");
3207: break; // thorn
3208: case 14 :
3209: buf.append("\u017d");
3210: break; // Z caron
3211: case 15 :
3212: buf.append("\u017e");
3213: break; // z caron
3214: case 17 :
3215: buf.append("\u0073");
3216: break; // asciitilde
3217: case 18 :
3218: buf.append("j\u0305");
3219: break; // j macron [does a single char exist?]
3220: case 19 :
3221: buf.append("^");
3222: break; // circumflex
3223: case 20 :
3224: buf.append("\u0303");
3225: break; // tilde
3226: case 21 :
3227: buf.append("\u00bd");
3228: break; // onehalf
3229: case 22 :
3230: buf.append("\u00bc");
3231: break; // onequarter
3232: case 23 :
3233: buf.append("\u00b9");
3234: break; // onesuperior
3235: case 24 :
3236: buf.append("\u00be");
3237: break; // threequarters
3238: case 25 :
3239: buf.append("\u00b3");
3240: break; // threesuperior
3241: case 26 :
3242: buf.append("\u00b2");
3243: break; // twosuperior
3244: case 27 :
3245: buf.append("\u00a6");
3246: break; // brokenbar
3247: case 28 :
3248: buf.append("-");
3249: break; // minus
3250: case 29 :
3251: buf.append("\u00d7");
3252: break; // multiply
3253: case 39 :
3254: buf.append("'");
3255: break; // quotesingle
3256: case 94 :
3257: buf.append("\u0302");
3258: break; // circumflex
3259: case 96 :
3260: buf.append("\u0300");
3261: break; // grave
3262: case 196 :
3263: buf.append("\u00c4");
3264: break; // A dieresis
3265: case 197 :
3266: buf.append("\u00c5");
3267: break; // A ring
3268: case 201 :
3269: buf.append("\u00c9");
3270: break; // E acute
3271: case 209 :
3272: buf.append("\u00d1");
3273: break; // N tilde
3274: case 214 :
3275: buf.append("\u00d6");
3276: break; // O dieresis
3277: case 220 :
3278: buf.append("\u00dc");
3279: break; // U dieresis
3280: case 225 :
3281: buf.append("\u00e1");
3282: break; // a acute
3283: case 224 :
3284: buf.append("\u00e0");
3285: break; // a grave
3286: case 226 :
3287: buf.append("\u00e2");
3288: break; // a circumflex
3289: case 228 :
3290: buf.append("\u00e4");
3291: break; // a dieresis
3292: case 227 :
3293: buf.append("\u00e3");
3294: break; // a tilde
3295: case 229 :
3296: buf.append("\u0101");
3297: break; // a macron
3298: case 231 :
3299: buf.append("\u00e7");
3300: break; // c cedilla
3301: case 233 :
3302: buf.append("\u00e9");
3303: break; // e acute
3304: case 232 :
3305: buf.append("\u00e8");
3306: break; // e grave
3307: case 234 :
3308: buf.append("\u00ea");
3309: break; // e circumflex
3310: case 235 :
3311: buf.append("\u00eb");
3312: break; // e dieresis
3313: case 237 :
3314: buf.append("\u00ed");
3315: break; // i acute
3316: case 236 :
3317: buf.append("\u00ec");
3318: break; // i grave
3319: case 238 :
3320: buf.append("\u00ee");
3321: break; // i circumflex
3322: case 239 :
3323: buf.append("\u00ef");
3324: break; // i dieresis
3325: case 241 :
3326: buf.append("\u00f1");
3327: break; // n tilde
3328: case 243 :
3329: buf.append("\u00f3");
3330: break; // o acute
3331: case 242 :
3332: buf.append("\u00f2");
3333: break; // o grave
3334: case 244 :
3335: buf.append("\u00f4");
3336: break; // o circumflex
3337: case 246 :
3338: buf.append("\u00f6");
3339: break; // o dieresis
3340: case 245 :
3341: buf.append("\u00f5");
3342: break; // o tilde
3343: case 250 :
3344: buf.append("\u00fa");
3345: break; // u acute
3346: case 249 :
3347: buf.append("\u00f9");
3348: break; // u grave
3349: case 251 :
3350: buf.append("\u00fb");
3351: break; // u circumflex
3352: case 252 :
3353: buf.append("\u00fc");
3354: break; // u dieresis
3355: case 8224 :
3356: buf.append("\u1e6d");
3357: break; // t underdot
3358: case 176 :
3359: buf.append("\u00b0");
3360: break; // degree
3361: case 162 :
3362: buf.append("\u1ebd");
3363: break; // e tilde
3364: case 163 :
3365: buf.append("\u00a3");
3366: break; // sterling
3367: case 167 :
3368: buf.append("\u00a7");
3369: break; // section
3370: case 182 :
3371: buf.append("\u00b6");
3372: break; // paragraph
3373: case 223 :
3374: buf.append("\u015b");
3375: break; // s acute
3376: case 174 :
3377: buf.append("\u1e5b");
3378: break; // r underdot
3379: case 169 :
3380: buf.append("\u1e45");
3381: break; // n overdot
3382: case 180 :
3383: buf.append("\u0301");
3384: break; // acute
3385: case 168 :
3386: buf.append("\u0308");
3387: break; // dieresis
3388: case 8800 :
3389: buf.append("\u1e6d");
3390: break; // t underdot
3391: case 198 :
3392: buf.append("\u00c6");
3393: break; // AE
3394: case 216 :
3395: buf.append("\u014d");
3396: break; // o macron
3397: case 8734 :
3398: buf.append("\u0129");
3399: break; // i tilde
3400: case 177 :
3401: buf.append("\u00b1");
3402: break; // plusminus
3403: case 165 :
3404: buf.append("\u012b");
3405: break; // i macron
3406: case 181 :
3407: buf.append("\u1e43");
3408: break; // m underdot
3409: case 8706 :
3410: buf.append("\u1e0d");
3411: break; // d underdot
3412: case 8721 :
3413: buf.append("\u1e63");
3414: break; // s underdot
3415: case 960 :
3416: buf.append("\u017a");
3417: break; // z acute
3418: case 8747 :
3419: buf.append("\u1e45");
3420: break; // n overdot
3421: case 937 :
3422: buf.append("\u0169");
3423: break; // u tilde
3424: case 230 :
3425: buf.append("\u00e6");
3426: break; // ae
3427: case 248 :
3428: buf.append("\u00f8");
3429: break; // oslash
3430: case 191 :
3431: buf.append("\u0304\u0306");
3432: break; // macron breve
3433: case 172 :
3434: buf.append("\u1e37");
3435: break; //
3436: case 8730 :
3437: buf.append("j\u0305");
3438: break; // j macron [does a single char exist?]
3439: case 402 :
3440: buf.append("\u0103");
3441: break; // a breve
3442: case 8776 :
3443: buf.append("\u016d");
3444: break; // u breve
3445: case 187 :
3446: buf.append("\u1e42");
3447: break; // M underdot
3448: case 8230 :
3449: buf.append("\u2026");
3450: break; // ellipsis
3451: case 192 :
3452: buf.append("\u00c0");
3453: break; // A grave
3454: case 195 :
3455: buf.append("\u00c3");
3456: break; // A tilde
3457: case 213 :
3458: buf.append("\u00d5");
3459: break; // O tilde
3460: case 338 :
3461: buf.append("m\u0306");
3462: break; // m breve
3463: case 339 :
3464: buf.append("\u0153");
3465: break; // oe
3466: case 8211 :
3467: buf.append("\u2013");
3468: break; // endash
3469: case 8212 :
3470: buf.append("\u2014");
3471: break; // emdash
3472: case 8220 :
3473: buf.append("\u201c");
3474: break; // quotedblleft
3475: case 8221 :
3476: buf.append("\u201d");
3477: break; // quotedblright
3478: case 8216 :
3479: buf.append("\u2018");
3480: break; // quoteleft
3481: case 8217 :
3482: buf.append("\u2019");
3483: break; // quoteright
3484: case 247 :
3485: buf.append("\u1e37");
3486: break; // l underring [actually underdot]
3487: case 9674 :
3488: buf.append("\u1e41");
3489: break; // m overdot
3490: case 255 :
3491: buf.append("n\u0306");
3492: break; // n breve
3493: case 376 :
3494: buf.append("\u00d7");
3495: break; // multiply
3496: case 8364 :
3497: buf.append("\u1e5b");
3498: break; // r underring [actually underdot]
3499: case 8249 :
3500: buf.append("\u1e44");
3501: break; // N overdot
3502: case 8250 :
3503: buf.append("\u1e62");
3504: break; // S underdot
3505: case 64257 :
3506: buf.append("\u1e24");
3507: break; // H underdot
3508: case 64258 :
3509: buf.append("\u1e0c");
3510: break; // D underdot
3511: case 8225 :
3512: buf.append("\u2021");
3513: break; // daggerdbl
3514: case 8218 :
3515: buf.append("\u1e36");
3516: break; // L underdot
3517: case 8222 :
3518: buf.append("\u0113");
3519: break; // e macron
3520: case 194 :
3521: buf.append("\u1e5f");
3522: break; // r underbar
3523: case 202 :
3524: buf.append("r\u0324");
3525: break; // r underdieresis
3526: case 193 :
3527: buf.append("\u012a");
3528: break; // I macron
3529: case 203 :
3530: buf.append("\u016b");
3531: break; // u macron
3532: case 200 :
3533: buf.append("\u1e6c");
3534: break; // T underdot
3535: case 205 :
3536: buf.append("\u1e64");
3537: break; // S acute
3538: case 206 :
3539: buf.append("\u2020");
3540: break; // dagger
3541: case 207 :
3542: buf.append("\u0115");
3543: break; // e breve
3544: case 204 :
3545: buf.append("\u014f");
3546: break; // o breve
3547: case 211 :
3548: buf.append("\u0100");
3549: break; // A macron
3550: case 212 :
3551: buf.append("\u1e46");
3552: break; // N underdot
3553: case 210 :
3554: buf.append("\u1e3b");
3555: break; // l underbar
3556: case 218 :
3557: buf.append("\u016a");
3558: break; // U macron
3559: case 219 :
3560: buf.append("\u0179");
3561: break; // Z acute
3562: case 217 :
3563: buf.append("\u1e5a");
3564: break; // R underdot
3565: case 305 :
3566: buf.append("\u0131");
3567: break; // dotlessi
3568: case 710 :
3569: buf.append("\u1e47");
3570: break; // n underdot
3571: case 732 :
3572: buf.append("\u1e49");
3573: break; // n underbar
3574: case 175 :
3575: buf.append("\u0304");
3576: break; // macron
3577: case 728 :
3578: buf.append("\u0306");
3579: break; // breve
3580: case 729 :
3581: buf.append("\u1e25");
3582: break; // h underdot
3583: case 730 :
3584: buf.append("\u012d");
3585: break; // i breve
3586: case 184 :
3587: buf.append("\u0327");
3588: break; // cedilla
3589: case 733 :
3590: buf.append("\u030b");
3591: break; // hungarumlaut
3592: case 731 :
3593: buf.append("\u0328");
3594: break; // ogonek
3595: case 711 :
3596: buf.append("\u030c");
3597: break; // caron
3598: case 199 :
3599: buf.append("\u012b\u0303");
3600: break; // imacron tilde
3601: case 8226 :
3602: buf.append("\u1e5d");
3603: break; // runderdot macron
3604: case 8482 :
3605: buf.append("\u016b\0306");
3606: break; // umacron breve
3607: case 8804 :
3608: buf.append("\u0101\u0301");
3609: break; // amacron acute
3610: case 8805 :
3611: buf.append("\u016b\u0301");
3612: break; // umacron acute
3613: case 8719 :
3614: buf.append("\u0113\u0301");
3615: break; // emacron acute
3616: case 170 :
3617: buf.append("\u0113\u0300");
3618: break; // emacron breve
3619: case 186 :
3620: buf.append("\u014d\u0300");
3621: break; // omacron breve
3622: case 161 :
3623: buf.append("\u0101\u0306");
3624: break; // amacron breve
3625: case 8710 :
3626: buf.append("\u0101\u0303");
3627: break; // amacron tilde
3628: case 171 :
3629: buf.append("\u012b\u0301");
3630: break; // imacron acute
3631: case 8260 :
3632: buf.append("\u1e00");
3633: break; // runderdotmacron acute
3634: case 183 :
3635: buf.append("\u1e5b\u0301");
3636: break; // runderdot acute
3637: case 8240 :
3638: buf.append("\u012b\u0306");
3639: break; // imacron breve
3640: case 63743 :
3641: buf.append("\u016b\u0303");
3642: break; // umacron tilde
3643: default :
3644: buf.append(c);
3645: break;
1.58 rogo 3646: }
3647: }
3648: return buf.toString();
3649: }
1.65 rogo 3650: public static ConversionProperties getFieldNamesAndDestTableName(String create, String query, String tableName)
1.64 rogo 3651: {
3652: String[] fieldNames = null;
3653: String destTableName = null;
3654: // determine destTableName from createStatement or from source table name
3655: if (!create.equals(""))
3656: {
3657: int fromIndex = create.toLowerCase().indexOf("table") + 5;
3658: int toIndex = create.indexOf("(");
3659: int endIndex = create.indexOf(")", toIndex);
3660:
3661: destTableName = create.substring(fromIndex, toIndex).replaceAll(beanDest.getQC(), "").trim();
3662: System.out.println("destTable " + destTableName);
3663: // retrieve field_names from select statement
3664: // TODO problem with different fieldNames in create statement will overwrite them
3665: if (query.indexOf("*") < 0)
3666: {
3667: int selectEndIndex = query.indexOf("from");
3668: StringTokenizer tokenizer = new StringTokenizer(query.substring(6, selectEndIndex), ",");
3669: int numFields = tokenizer.countTokens();
3670: fieldNames = new String[numFields];
3671: int fieldIndex = 0;
3672: while (tokenizer.hasMoreTokens())
3673: {
3674: String fieldName = tokenizer.nextToken().trim();
3675: fieldNames[fieldIndex] = convertText(fieldName);
3676: System.out.println(fieldNames[fieldIndex]);
3677: fieldIndex++;
3678: }
1.58 rogo 3679:
1.64 rogo 3680: } else
3681: {
3682: // use create statement for field names
3683: StringTokenizer tokenizer = new StringTokenizer(create.substring(toIndex + 1, endIndex), ",");
3684: int numFields = tokenizer.countTokens();
3685: fieldNames = new String[numFields];
3686: int fieldIndex = 0;
3687: while (tokenizer.hasMoreTokens())
3688: {
3689: String fieldName = tokenizer.nextToken().trim();
3690: int index = fieldName.lastIndexOf(" ");
3691: fieldNames[fieldIndex] = fieldName.substring(0, index);
3692: System.out.println(fieldNames[fieldIndex]);
3693: fieldIndex++;
3694: }
3695: }
3696: } else
3697: {
3698: destTableName = convertText(tableName);
1.58 rogo 3699:
1.64 rogo 3700: // retrieve field_names from select statement
3701: if (query.indexOf("*") < 0)
3702: {
3703: int selectEndIndex = query.indexOf("from");
3704: StringTokenizer tokenizer = new StringTokenizer(query.substring(6, selectEndIndex), ",");
3705: int numFields = tokenizer.countTokens();
3706: fieldNames = new String[numFields];
3707: int fieldIndex = 0;
3708: while (tokenizer.hasMoreTokens())
3709: {
3710: String fieldName = tokenizer.nextToken().trim();
3711: fieldNames[fieldIndex] = convertText(fieldName);
1.65 rogo 3712: // System.out.println("field "+ fieldNames[fieldIndex]);
1.64 rogo 3713: fieldIndex++;
3714: }
3715:
3716: } else
3717: {
3718: Vector fieldNamesVec = bean.getColumnNames();
3719: fieldNames = new String[fieldNamesVec.size()];
3720: int fieldIndex = -1;
3721: for (Iterator iter = fieldNamesVec.iterator(); iter.hasNext();)
3722: {
3723: String element = (String) iter.next();
3724: fieldNames[++fieldIndex] = bean.getQC() + convertText(element) + bean.getQC();
1.65 rogo 3725: // System.out.println("field " + fieldNames[fieldIndex]);
1.64 rogo 3726: }
3727: }
3728: }
1.65 rogo 3729: return new ConversionProperties(destTableName, fieldNames);
3730: }
3731: /**
3732: * creates an insert into statement for the specified table and given
3733: * field names
3734: * @param destTableName
3735: * @param fieldNames
3736: * @return
3737: */
3738: public static StringBuffer createInsertCommand(String destTableName, String[] fieldNames)
3739: {
3740: StringBuffer command = new StringBuffer();
3741: command.append("INSERT INTO ");
3742: command.append(beanDest.getQC());
3743: command.append(destTableName); //convertText((String) names.get(tbIndex)));
3744: command.append(beanDest.getQC());
3745: command.append(" (");
3746: for (int i = 0; i < fieldNames.length; i++)
3747: {
3748: command.append(fieldNames[i]);
3749: if (i < fieldNames.length - 1)
3750: command.append(",");
3751: }
3752: command.append(") ");
3753:
3754: command.append(" values ( ");
3755: // add a question marks for every field
3756: for (int i = 0; i < bean.getColumnNames().size() - 1; ++i)
3757: command.append("?,");
3758: command.append("?)");
3759: return command;
3760: }
3761: public static StringBuffer createUpdateCommand(String destTableName, String[] fieldNames, String id)
3762: {
3763: StringBuffer command = new StringBuffer();
3764:
3765: command.append("UPDATE ");
3766: command.append(beanDest.getQC());
3767: command.append(destTableName);
3768: //command.append(convertText((String) names.get(tbIndex)));
3769: command.append(beanDest.getQC());
3770: command.append(" SET ");
3771:
3772: int size = bean.getColumnNames().size();
3773: for (int i = 0; i < size - 1; ++i)
3774: command.append(fieldNames[i] + " = ? ,");
3775: command.append(fieldNames[size - 1] + " = ? ");
3776: command.append("WHERE " + id + " = ?");
3777: return command;
3778: }
3779: public static StringBuffer createDeleteCommand(String destTableName, String idField)
3780: {
3781: StringBuffer command = new StringBuffer();
3782:
3783: command.append("DELETE FROM");
3784: command.append(beanDest.getQC());
3785: command.append(destTableName);
3786: //command.append(convertText((String) names.get(tbIndex)));
3787: command.append(beanDest.getQC());
3788: command.append("WHERE " + idField + " = ?");
1.66 rogo 3789: return command;
1.64 rogo 3790: }
1.55 rogo 3791: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>