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