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 (&gt; or &lt;)
        !           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>