Diff for /FM2SQL/Attic/Convert.java between versions 1.56 and 1.62

version 1.56, 2004/06/10 13:19:18 version 1.62, 2004/07/22 10:43:29
Line 12 Line 12
  * rogo     * rogo  
  */   */
   
 import java.util.*;  
 import java.sql.*;  
 import java.awt.Cursor;  import java.awt.Cursor;
 import java.io.BufferedReader;  import java.io.BufferedReader;
 import java.io.BufferedWriter;  import java.io.BufferedWriter;
Line 21  import java.io.File; Line 19  import java.io.File;
 import java.io.FileInputStream;  import java.io.FileInputStream;
 import java.io.FileNotFoundException;  import java.io.FileNotFoundException;
 import java.io.FileOutputStream;  import java.io.FileOutputStream;
   import java.io.InputStream;
 import java.io.InputStreamReader;  import java.io.InputStreamReader;
 import java.io.OutputStreamWriter;  import java.io.OutputStreamWriter;
 import java.io.PrintStream;  import java.io.PrintStream;
 import java.io.UnsupportedEncodingException;  import java.io.UnsupportedEncodingException;
   import java.net.URL;
   import java.sql.PreparedStatement;
   import java.sql.SQLException;
   import java.sql.Statement;
   import java.sql.Types;
   import java.util.ArrayList;
   import java.util.Iterator;
   import java.util.List;
   import java.util.StringTokenizer;
   import java.util.TreeSet;
   import java.util.Vector;
   
 import com.exploringxml.xml.Node;  import com.exploringxml.xml.Node;
 import com.exploringxml.xml.Xparse;  import com.exploringxml.xml.Xparse;
Line 57  class Convert Line 67  class Convert
       System.out.println("Usage: java Convert <xml config file>");        System.out.println("Usage: java Convert <xml config file>");
       System.exit(-1);        System.exit(-1);
     }      }
     if (!(new File(args[0]).exists()))  
       System.exit(0);  
     try      try
     {      {
       file = new FileOutputStream("./log.txt");        file = new FileOutputStream("./log.txt");
Line 67  class Convert Line 75  class Convert
       e1.printStackTrace();        e1.printStackTrace();
     }      }
     PrintStream stream = new PrintStream(file);      PrintStream stream = new PrintStream(file);
     System.setOut(stream);     // System.setOut(stream);
     System.setErr(stream);      //System.setErr(stream);
   
     readXMLFile(args[0]);      readXMLFile(args[0]);
       if (!(new File(args[0]).exists()))
         System.exit(0);
   
     System.out.println("Finished!");      System.out.println("Finished!");
     //convert("jdbc:fmpro:http://141.14.237.74:8050","jdbc:postgresql://erebos/test",null,null);      //convert("jdbc:fmpro:http://141.14.237.74:8050","jdbc:postgresql://erebos/test",null,null);
   }    }
Line 1210  class Convert Line 1222  class Convert
         Node node3 = root.find("convert/source/database", new int[] { 1, 1, i });          Node node3 = root.find("convert/source/database", new int[] { 1, 1, i });
         Node nodeMode = root.find("convert/source/database/mode", new int[] { 1, 1, i, 1, 1 });          Node nodeMode = root.find("convert/source/database/mode", new int[] { 1, 1, i, 1, 1 });
         Node delimiterNode = root.find("convert/source/database/delimiter", new int[] { 1, 1, i, 1, 1 });          Node delimiterNode = root.find("convert/source/database/delimiter", new int[] { 1, 1, i, 1, 1 });
           Node useNormanToUnicodeMapper = root.find("convert/source/database/usenormantounicodemapper", new int[] { 1, 1, i, 1, 1 });
       
         if (node3 == null)          if (node3 == null)
           throw new Error("parse error database tag missing");            throw new Error("parse error database tag missing");
         if (node == null)          if (node == null)
Line 1220  class Convert Line 1234  class Convert
           throw new Error("parse error password tag missing");            throw new Error("parse error password tag missing");
         if (delimiterNode != null)          if (delimiterNode != null)
           delimiter = delimiterNode.getCharacters();            delimiter = delimiterNode.getCharacters();
           if(useNormanToUnicodeMapper!=null)
           {
             database.setUseNormanToUnicodeMapper(Boolean.valueOf(useNormanToUnicodeMapper.getCharacters()).booleanValue());
             System.out.println("useMapper "+Boolean.valueOf(useNormanToUnicodeMapper.getCharacters().trim()).booleanValue());
           } 
      
         String url = node.getCharacters();          String url = node.getCharacters();
         String user = node1.getCharacters();          String user = node1.getCharacters();
         String password = node2.getCharacters();          String password = node2.getCharacters();
Line 1241  class Convert Line 1261  class Convert
           mode = DataBase.UPDATE_MODE;            mode = DataBase.UPDATE_MODE;
         else if (modeString.equals("delete"))          else if (modeString.equals("delete"))
           mode = DataBase.DELETE_MODE;            mode = DataBase.DELETE_MODE;
           else if (modeString.equals("synchronize"))
               mode = DataBase.SYNCHRONIZE_MODE;
   
         //   if(node3!=null)          //   if(node3!=null)
         // System.out.println(node3.name);          // System.out.println(node3.name);
Line 1309  class Convert Line 1331  class Convert
       for (Iterator iter = databases.iterator(); iter.hasNext();)        for (Iterator iter = databases.iterator(); iter.hasNext();)
       {        {
         DataBase db = (DataBase) iter.next();          DataBase db = (DataBase) iter.next();
         if (mode != DataBase.UPDATE_MODE)          if (mode == DataBase.CONVERT_MODE || mode == DataBase.APPEND_MODE)
           convertBatch(db.bean, database, db.tables, db.layouts, db.selects, db.creates, db.ids, mode, db.delimiter);            convertBatch(db.bean, database, db.tables, db.layouts, db.selects, db.creates, db.ids, mode, db.delimiter);
         else          else
           if (mode == DataBase.UPDATE_MODE)
           update(db.bean.url, database.url, db.tables, db.layouts, db.selects, db.creates, db.ids, mode);            update(db.bean.url, database.url, db.tables, db.layouts, db.selects, db.creates, db.ids, mode);
           else if(mode==DataBase.SYNCHRONIZE_MODE)
           {
             user =bean.user;
             passwd =bean.passwd;
             userDest =database.user;
             passwdDest =database.passwd;
   
             synchronize(db.bean.url, database.url, db.tables, db.layouts, db.selects, db.creates, db.ids, mode);
           } 
       }        }
       // printContents(node3);        // printContents(node3);
       //   FM2SQL.fmInstance=new FM2SQL();        //   FM2SQL.fmInstance=new FM2SQL();
Line 1383  class Convert Line 1414  class Convert
         Node node3 = root.find("convert/source/database", new int[] { 1, 1, i });          Node node3 = root.find("convert/source/database", new int[] { 1, 1, i });
         Node nodeMode = root.find("convert/source/database/mode", new int[] { 1, 1, i, 1, 1 });          Node nodeMode = root.find("convert/source/database/mode", new int[] { 1, 1, i, 1, 1 });
         Node delimiterNode = root.find("convert/source/database/delimiter", new int[] { 1, 1, i, 1, 1 });          Node delimiterNode = root.find("convert/source/database/delimiter", new int[] { 1, 1, i, 1, 1 });
           Node useNormanToUnicodeMapper = root.find("convert/source/database/usenormantounicodemapper", new int[] { 1, 1, i, 1, 1 });
   
         if (delimiterNode != null)          if (delimiterNode != null)
           delimiter = delimiterNode.getCharacters();            delimiter = delimiterNode.getCharacters();
           if(useNormanToUnicodeMapper!=null)
           {
             database.setUseNormanToUnicodeMapper(Boolean.valueOf(useNormanToUnicodeMapper.getCharacters()).booleanValue());
             System.out.println("useMapper "+Boolean.valueOf(useNormanToUnicodeMapper.getCharacters().trim()).booleanValue());
           } 
   
         if (node3 == null)          if (node3 == null)
           throw new Error("parse error database tag missing");            throw new Error("parse error database tag missing");
         if (node == null)          if (node == null)
Line 1540  class Convert Line 1578  class Convert
   {    {
     try      try
     {      {
         InputStream stream = null;
         
         if(xmlFile.indexOf("file://")>=0||xmlFile.indexOf("http://")>=0)
         {
           URL url=new URL(xmlFile);
           stream = url.openStream();
         }
         else 
       // read XML Metadata from a file        // read XML Metadata from a file
       FileInputStream fi = new FileInputStream(xmlFile);         stream = new FileInputStream(xmlFile);
       InputStreamReader isr = new InputStreamReader(fi, "UTF-8");        InputStreamReader isr = new InputStreamReader(stream, "UTF-8");
       BufferedReader buffr = new BufferedReader(isr);        BufferedReader buffr = new BufferedReader(isr);
       StringBuffer sb = new StringBuffer();        StringBuffer sb = new StringBuffer();
       int c = 0;        int c = 0;
Line 1574  class Convert Line 1620  class Convert
     Vector tables;      Vector tables;
     Vector ids;      Vector ids;
     String delimiter = "//";      String delimiter = "//";
       boolean useNormanToUnicodeMapper = false;
       
     final static int CONVERT_MODE = 1;      final static int CONVERT_MODE = 1;
     final static int APPEND_MODE = 2;      final static int APPEND_MODE = 2;
     final static int UPDATE_MODE = 3;      final static int UPDATE_MODE = 3;
     final static int DELETE_MODE = 4;      final static int DELETE_MODE = 4;
       final static int SYNCHRONIZE_MODE = 5;
   
     int mode = -1;      int mode = -1;
   
Line 1616  class Convert Line 1665  class Convert
         modeString = "delete";          modeString = "delete";
   
       buffr.write("      <mode>" + modeString + "</mode>\n");        buffr.write("      <mode>" + modeString + "</mode>\n");
         buffr.write("      <usenormantounicodemapper>" + useNormanToUnicodeMapper + "</usenormantounicodemapper>\n");
         
       int index = 0;        int index = 0;
       while (index < tables.size())        while (index < tables.size())
       {        {
Line 1876  class Convert Line 1927  class Convert
     }      }
   } // to method    } // to method
       
     
     /**
      * synchronize method based on delete method code
      * 
      * @param source
      * @param destination
      * @param names
      * @param layouts
      * @param selects
      * @param creates
      * @param ids
      * @param mode
      * @throws Exception
      */
     // TODO implement append,update and delete in one method
     // TODO using id based algorithm
     public static void synchronize(String source, String destination, Vector names, Vector layouts, Vector selects, Vector creates, Vector ids, int mode) throws Exception
     {
       System.out.println(" bin in synchronize!!!");
       FM2SQL.ProgressDialog dialog = null;
       if (FM2SQL.fmInstance != null)
       {
         dialog = new FM2SQL.ProgressDialog(FM2SQL.fmInstance, bean);
         dialog.setTitle("Synchronize running ...");
         dialog.title.setText("Getting table data ...");
         dialog.setLocation(FM2SQL.fmInstance.getLocationOnScreen().x + (FM2SQL.fmInstance.getWidth() - 400) / 2, FM2SQL.fmInstance.getLocationOnScreen().y + (FM2SQL.fmInstance.getHeight() - 250) / 2);
         dialog.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
         FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
         dialog.thread = Thread.currentThread();
       }
       // setting user and passwd 
       bean.setUserAndPasswd(user, passwd);
       // setting user and passwd 
       beanDest.setUserAndPasswd(userDest, passwdDest);
       if (dialog != null)
         dialog.setSize(400, 250);
       StringBuffer command = null;
       String query = null;
       try
       {
         //bean.setConnection("jdbc:fmpro:http://141.14.237.74:8050");    
         //bean.setConnection("jdbc:postgresql://erebos/test","postgres","rogo");
         bean.setConnection(source);
         if (names == null)
           names = bean.getTableNames();
         // Collections.sort(names);
         int tbIndex = 1;
   
         // System.out.println("Start at "+names.indexOf("archimedes_facsimiles"));
         for (tbIndex = 0; tbIndex < names.size(); ++tbIndex)
         {
           Vector[] result = null;
           java.util.TreeSet myIds = new TreeSet();
           java.util.TreeSet myIdsDest = new TreeSet();
           int deltaID = 1;
           String idField = "";
           String destTableName = "";
   
           try
           {
             query = "select * from " + bean.getQC() + names.get(tbIndex).toString() + bean.getQC();
             String layout = (layouts.isEmpty()) ? "" : layouts.get(tbIndex).toString();
             query = (selects != null) ? selects.get(tbIndex).toString() : query;
             //if  vectors[1].get(i) != null)
             if (!layout.equals(""))
             {
               layout = " layout " + bean.getQC() + layout + bean.getQC();
               String name = names.get(tbIndex).toString();
               StringBuffer queryLayout = new StringBuffer(query);
               queryLayout.insert(queryLayout.indexOf(name) + name.length() + 1, " " + layout);
               query = queryLayout.toString();
               System.out.println("added layout  " + query);
   
             }
             if(dialog!=null) {
             dialog.title.setText("Getting table data ...");
             dialog.table.setText(names.get(tbIndex).toString());
             dialog.status.setText("Table " + (tbIndex + 1) + " of " + names.size());
             dialog.show();
             }
             bean.getConnection();
             bean.makeQuery(query, 50);
             idField = ids.get(tbIndex).toString();
   
           } catch (Exception e)
           {
             continue;
           }
           // determine destTableName from createStatement or from source table name
           if (!creates.get(tbIndex).equals(""))
           {
             String create = creates.get(tbIndex).toString().toLowerCase();
             int fromIndex = create.indexOf("table") + 5;
             int toIndex = create.indexOf("(");
             destTableName = create.substring(fromIndex, toIndex).replaceAll(beanDest.getQC(), "").trim();
             System.out.println("destTable " + destTableName);
   
           } else
             destTableName = convertText(names.get(tbIndex).toString());
   
           // for id kram
           Vector vec = null;
           Vector vecDest = null;
           //      tempo
           beanDest.setConnection(destination);
           int rowCount = (idField != "") ? myIds.size() : bean.getRowCount(query);
           String tempID = bean.getQC() + idField + bean.getQC();
           String tempIDdest = beanDest.getQC() + convertText(idField) + beanDest.getQC();
   
           int endIndex = -1;
           String tempQuery = query;
           String destQuery = query.replaceAll(names.get(tbIndex).toString(), destTableName);
           String tempQueryDest = destQuery;
           // remove extra query parts destQuery.substring(0,destQuery.lastIndexOf(destTableName)+destTableName.length()+1);
           System.out.println("new Query " + tempQueryDest);
           if (!idField.equals(""))
           {
             long startTime = System.currentTimeMillis();
             int counter = -1;
             while (true)
             {
               ++counter;
               if (counter == 0 && dialog != null)
                 dialog.title.setText("Check if data  is available");
               else if (dialog != null)
                 dialog.title.setText("Check if more  data  is available");
               myIds = bean.getIDVector(ids.get(tbIndex).toString(), (String) names.get(tbIndex), tempQuery, numHits);
               myIdsDest = beanDest.getIDVector(convertText(idField), destTableName, tempQueryDest, numHits);
               if (myIds.isEmpty())
                 break;
               vec = new Vector(myIds);
               vecDest = new Vector(myIdsDest);
               rowCount = vec.size();
               // Deletion will work this way
               Vector deleted = new Vector(vec);
               Vector linesToDelete = new Vector(vecDest);
               
               Vector linesToAppend = new Vector(vec);
               // remove all lines that are already in dest database
               linesToAppend.removeAll(vecDest);
               // remove all lines that should not be deleted
               linesToDelete.removeAll(deleted);
               System.out.println("linesToAppend "+linesToAppend+" "+vecDest+" "+destTableName);
               System.exit(0);
               // System.out.println("ID LIST SIZE " + Math.round((double) myIds.size() / (double) numIntervalls) + " " + myIdsDest.size());
               /// @TODO complete delete task remove query show lines to be deleted let user choose if he wants that
               System.out.println("number of lines to  be deleted " + linesToDelete.size());
               deltaID = (int) Math.round((double) myIds.size() / (double) numIntervalls);
               beanDest.setConnection(destination);
   
               Statement stm = beanDest.getConnection().createStatement();
   
               Vector tables = beanDest.getTableNames();
               // Collections.sort(tables);
               System.out.println(names.get(tbIndex) + " " + tables.indexOf(convertText((String) names.get(tbIndex)))); // "//beanDest.getTypeNames()); 
               tables = beanDest.getTableNames();
               // System.out.println(beanDest.getTableNames(beanDest.getCatalogs().get(2).toString()));
               stm = beanDest.getConnection().createStatement();
   
               if (dialog != null)
                 dialog.title.setText(" Deleting table data ...");
   
               int j = -1;
   
               Vector row = null;
               command = new StringBuffer();
   
               command.append("DELETE FROM");
               command.append(beanDest.getQC());
               command.append(destTableName);
               //command.append(convertText((String) names.get(tbIndex)));
               command.append(beanDest.getQC());
               int size = bean.getColumnNames().size();
               command.append("WHERE " + convertText(ids.get(tbIndex).toString()) + " =  ?");
               PreparedStatement pstm = beanDest.getConnection().prepareStatement(command.toString());
               System.out.println(command + " " + tbIndex);
               //int rowCount = bean.getRowCount(query);
               //        int idIndex = bean.getColumnNames().indexOf(ids.get(tbIndex));
               while (true)
               {
   
                 ++j;
                 if (j == linesToDelete.size())
                   break;
                 //print rows
                 pstm.setString(1, linesToDelete.get(j).toString());
                 System.out.println(pstm.toString());
                 pstm.execute();
                 if (dialog != null)
                   dialog.progress.setValue((int) (((double) (j + 1) / (double) rowCount) * 100.0));
                 command = null;
               }
               // prepare new query for next chunk
               if (query.indexOf("where") > 0)
                 tempQuery = query + " and " + tempID + ">'" + vec.lastElement() + "'";
               else
                 tempQuery = query + " where " + tempID + ">'" + vec.lastElement() + "'";
   
             } //to outer while
           } // to idfield if  
         } // table loop
   
       } catch (Exception e)
       {
         System.out.println("Error while connecting to database " + e);
         if (dialog != null)
         {
           dialog.setVisible(false);
           dialog.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
           FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
         }
         java.io.ByteArrayOutputStream b = new java.io.ByteArrayOutputStream();
         java.io.PrintStream stream = new java.io.PrintStream(b);
         stream.print(command + "\n\n");
         e.printStackTrace(stream);
         FM2SQL.showErrorDialog(b.toString(), "Error occured !");
   
       }
       if (dialog != null)
       {
         dialog.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
         FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
   
         dialog.setVisible(false);
       }
     } // to method
     
   
    
   /**    /**
    * Converts input String in norman encoding to unicode      * Converts input String in norman encoding to unicode 
    * @param inp     * @param inp
Line 1885  class Convert Line 2165  class Convert
     StringBuffer buf = new StringBuffer();      StringBuffer buf = new StringBuffer();
     for (int i = 0; i < inp.length(); i++) {      for (int i = 0; i < inp.length(); i++) {
       char c = inp.charAt(i);        char c = inp.charAt(i);
        // System.out.println("char "+c+" "+(int)c);
         switch (c) {
         case 1: buf.append("\u00d0"); break; // Eth
         case 2: buf.append("\u00f0"); break; // eth
         case 3: buf.append("\u0141"); break; // Lslash
         case 4: buf.append("\u0142"); break; // lslash
         case 5: buf.append("\u0160"); break; // S caron
         case 6: buf.append("\u0161"); break; // s caron
         case 7: buf.append("\u00dd"); break; // Y acute
         case 8: buf.append("\u00fd"); break; // y acute
         case 11: buf.append("\u00de"); break; // Thorn
         case 12: buf.append("\u00fe"); break; // thorn
         case 14: buf.append("\u017d"); break; // Z caron
         case 15: buf.append("\u017e"); break; // z caron
         case 17: buf.append("\u0073"); break; // asciitilde
         case 18: buf.append("j\u0305"); break; // j macron [does a single char exist?]
         case 19: buf.append("^"); break; // circumflex
         case 20: buf.append("\u0303"); break; // tilde
         case 21: buf.append("\u00bd"); break; // onehalf
         case 22: buf.append("\u00bc"); break; // onequarter
         case 23: buf.append("\u00b9"); break; // onesuperior
         case 24: buf.append("\u00be"); break; // threequarters
         case 25: buf.append("\u00b3"); break; // threesuperior
         case 26: buf.append("\u00b2"); break; // twosuperior
         case 27: buf.append("\u00a6"); break; // brokenbar
         case 28: buf.append("-"); break; // minus
         case 29: buf.append("\u00d7"); break; // multiply
         case 39: buf.append("'"); break; // quotesingle
         case 94: buf.append("\u0302"); break; // circumflex
         case 96: buf.append("\u0300"); break; // grave
         case 196: buf.append("\u00c4"); break; // A dieresis
         case 197: buf.append("\u00c5"); break; // A ring
         case 201: buf.append("\u00c9"); break; // E acute
         case 209: buf.append("\u00d1"); break; // N tilde
         case 214: buf.append("\u00d6"); break; // O dieresis
         case 220: buf.append("\u00dc"); break; // U dieresis
         case 225: buf.append("\u00e1"); break; // a acute
         case 224: buf.append("\u00e0"); break; // a grave
         case 226: buf.append("\u00e2"); break; // a circumflex
         case 228: buf.append("\u00e4"); break; // a dieresis
         case 227: buf.append("\u00e3"); break; // a tilde
         case 229: buf.append("\u0101"); break; // a macron
         case 231: buf.append("\u00e7"); break; // c cedilla
         case 233: buf.append("\u00e9"); break; // e acute
         case 232: buf.append("\u00e8"); break; // e grave
         case 234: buf.append("\u00ea"); break; // e circumflex
         case 235: buf.append("\u00eb"); break; // e dieresis
         case 237: buf.append("\u00ed"); break; // i acute
         case 236: buf.append("\u00ec"); break; // i grave
         case 238: buf.append("\u00ee"); break; // i circumflex
         case 239: buf.append("\u00ef"); break; // i dieresis
         case 241: buf.append("\u00f1"); break; // n tilde
         case 243: buf.append("\u00f3"); break; // o acute
         case 242: buf.append("\u00f2"); break; // o grave
         case 244: buf.append("\u00f4"); break; // o circumflex
         case 246: buf.append("\u00f6"); break; // o dieresis
         case 245: buf.append("\u00f5"); break; // o tilde
         case 250: buf.append("\u00fa"); break; // u acute
         case 249: buf.append("\u00f9"); break; // u grave
         case 251: buf.append("\u00fb"); break; // u circumflex
         case 252: buf.append("\u00fc"); break; // u dieresis
         case 8224: buf.append("\u1e6d"); break; // t underdot
         case 176: buf.append("\u00b0"); break; // degree
         case 162: buf.append("\u1ebd"); break; // e tilde
         case 163: buf.append("\u00a3"); break; // sterling
         case 167: buf.append("\u00a7"); break; // section
         case 182: buf.append("\u00b6"); break; // paragraph
         case 223: buf.append("\u015b"); break; // s acute
         case 174: buf.append("\u1e5b"); break; // r underdot
         case 169: buf.append("\u1e45"); break; // n overdot
         case 353: buf.append("\u1e45"); break; // n overdot
         case 180: buf.append("\u0301"); break; // acute
         case 168: buf.append("\u0308"); break; // dieresis
         case 8800: buf.append("\u1e6d"); break; // t underdot
         case 198: buf.append("\u00c6"); break; // AE
         case 216: buf.append("\u014d"); break; // o macron
         case 8734: buf.append("\u0129"); break; // i tilde
         case 177: buf.append("\u00b1"); break; // plusminus
         case 165: buf.append("\u012b"); break; // i macron
         case 181: buf.append("\u1e43"); break; // m underdot
         case 8706: buf.append("\u1e0d"); break; // d underdot
         case 240: buf.append("\u1e0d"); break; // d underdot
   
         case 8721: buf.append("\u1e63"); break; // s underdot
         case 960: buf.append("\u017a"); break; // z acute
         case 8747: buf.append("\u1e45"); break; // n overdot
         case 937: buf.append("\u0169"); break; // u tilde
         case 230: buf.append("\u00e6"); break; // ae
         case 248: buf.append("\u00f8"); break; // oslash
         case 191: buf.append("\u0304\u0306"); break; // macron breve
         case 172: buf.append("\u1e37"); break; // 
         case 8730: buf.append("j\u0305"); break; // j macron [does a single char exist?]
         case 402: buf.append("\u0103"); break; // a breve
         case 8776: buf.append("\u016d"); break; // u breve
         case 187: buf.append("\u1e42"); break; // M underdot
         case 8230: buf.append("\u2026"); break; // ellipsis
         case 192: buf.append("\u00c0"); break; // A grave
         case 195: buf.append("\u00c3"); break; // A tilde
         case 213: buf.append("\u00d5"); break; // O tilde
         case 338: buf.append("m\u0306"); break; // m breve
         case 339: buf.append("\u0153"); break; // oe
         case 8211: buf.append("\u2013"); break; // endash
         case 8212: buf.append("\u2014"); break; // emdash
         case 8220: buf.append("\u201c"); break; // quotedblleft
         case 8221: buf.append("\u201d"); break; // quotedblright
         case 8216: buf.append("\u2018"); break; // quoteleft
         case 8217: buf.append("\u2019"); break; // quoteright
         case 247: buf.append("\u1e37"); break; // l underring [actually underdot]
         case 9674: buf.append("\u1e41"); break; // m overdot
         case 255: buf.append("n\u0306"); break; // n breve
         case 376: buf.append("\u00d7"); break; // multiply
         case 8364: buf.append("\u1e5b"); break; // r underring [actually underdot]
         case 8249: buf.append("\u1e44"); break; // N overdot
         case 8250: buf.append("\u1e62"); break; // S underdot
         case 64257: buf.append("\u1e24"); break; // H underdot
         case 64258: buf.append("\u1e0c"); break; // D underdot
         case 8225: buf.append("\u2021"); break; // daggerdbl
         case 8218: buf.append("\u1e36"); break; // L underdot
         case 8222: buf.append("\u0113"); break; // e macron
         case 194: buf.append("\u1e5f"); break; // r underbar
         case 202: buf.append("r\u0324"); break; // r underdieresis
         case 193: buf.append("\u012a"); break; // I macron
         case 8486:
         case 203: buf.append("\u016b"); break; // u macron
         case 200: buf.append("\u1e6c"); break; // T underdot
         case 205: buf.append("\u1e64"); break; // S acute
         case 206: buf.append("\u2020"); break; // dagger
         case 207: buf.append("\u0115"); break; // e breve
         case 204: buf.append("\u014f"); break; // o breve
         case 211: buf.append("\u0100"); break; // A macron
         case 212: buf.append("\u1e46"); break; // N underdot
         case 210: buf.append("\u1e3b"); break; // l underbar
         case 218: buf.append("\u016a"); break; // U macron
         case 219: buf.append("\u0179"); break; // Z acute
         case 217: buf.append("\u1e5a"); break; // R underdot
         case 305: buf.append("\u0131"); break; // dotlessi
         case 710: buf.append("\u1e47"); break; // n underdot
         case 732: buf.append("\u1e49"); break; // n underbar
         case 175: buf.append("\u0304"); break; // macron
         case 728: buf.append("\u0306"); break; // breve
         case 729:case 215: buf.append("\u1e25"); break; // h underdot
         case 730: buf.append("\u012d"); break; // i breve
         case 184: buf.append("\u0327"); break; // cedilla
         case 733: buf.append("\u030b"); break; // hungarumlaut
         case 731: buf.append("\u0328"); break; // ogonek
         case 711: buf.append("\u030c"); break; // caron
         case 199: buf.append("\u012b\u0303"); break; // imacron tilde
         case 8226: buf.append("\u1e5d"); break; // runderdot macron
         case 8482: buf.append("\u016b\0306"); break; // umacron breve
         case 8804: buf.append("\u0101\u0301"); break; // amacron acute
         case 8805: buf.append("\u016b\u0301"); break; // umacron acute
         case 8719: buf.append("\u0113\u0301"); break; // emacron acute
         case 170: buf.append("\u0113\u0300"); break; // emacron breve
         case 186: buf.append("\u014d\u0300"); break; // omacron breve
         case 161: buf.append("\u0101\u0306"); break; // amacron breve
         case 8710: buf.append("\u0101\u0303"); break; // amacron tilde
         case 171: buf.append("\u012b\u0301"); break; // imacron acute
         case 8260: buf.append("\u1e00"); break; // runderdotmacron acute
         case 183: buf.append("\u1e5b\u0301"); break; // runderdot acute
         case 8240: buf.append("\u012b\u0306"); break; // imacron breve
         case 63743: buf.append("\u016b\u0303"); break; // umacron tilde
         default: buf.append(c);    
          if((int)c>127)
          System.out.println("char "+c+" "+(int)c);
          break;
         }
       }
       return buf.toString();
     }
   
     static public String normanToUnicodeOld(String inp) {
       StringBuffer buf = new StringBuffer();
       for (int i = 0; i < inp.length(); i++) {
         char c = inp.charAt(i);
       switch (c) {        switch (c) {
       case 1: buf.append("\u00d0"); break; // Eth        case 1: buf.append("\u00d0"); break; // Eth
       case 2: buf.append("\u00f0"); break; // eth        case 2: buf.append("\u00f0"); break; // eth
Line 2046  class Convert Line 2500  class Convert
     }      }
     return buf.toString();      return buf.toString();
   }    }
     static public String normanToUnicodeNew(String inp) {
       StringBuffer buf = new StringBuffer();
       for (int i = 0; i < inp.length(); i++) {
         char c = inp.charAt(i);
         switch (c) {
           case 1: buf.append("\u00d0"); break; // Eth
           case 2: buf.append("\u00f0"); break; // eth
           case 3: buf.append("\u0141"); break; // Lslash
           case 4: buf.append("\u0142"); break; // lslash
           case 5: buf.append("\u0160"); break; // S caron
           case 6: buf.append("\u0161"); break; // s caron
           case 7: buf.append("\u00dd"); break; // Y acute
           case 8: buf.append("\u00fd"); break; // y acute
           case 11: buf.append("\u00de"); break; // Thorn
           case 12: buf.append("\u00fe"); break; // thorn
           case 14: buf.append("\u017d"); break; // Z caron
           case 15: buf.append("\u017e"); break; // z caron
           case 17: buf.append("\u0073"); break; // asciitilde
           case 18: buf.append("j\u0305"); break; // j macron [does a single char exist?]
           case 19: buf.append("^"); break; // circumflex
           case 20: buf.append("\u0303"); break; // tilde
           case 21: buf.append("\u00bd"); break; // onehalf
           case 22: buf.append("\u00bc"); break; // onequarter
           case 23: buf.append("\u00b9"); break; // onesuperior
           case 24: buf.append("\u00be"); break; // threequarters
           case 25: buf.append("\u00b3"); break; // threesuperior
           case 26: buf.append("\u00b2"); break; // twosuperior
           case 27: buf.append("\u00a6"); break; // brokenbar
           case 28: buf.append("-"); break; // minus
           case 29: buf.append("\u00d7"); break; // multiply
           case 39: buf.append("'"); break; // quotesingle
           case 94: buf.append("\u0302"); break; // circumflex
           case 96: buf.append("\u0300"); break; // grave
           case 196: buf.append("\u00c4"); break; // A dieresis
           case 197: buf.append("\u00c5"); break; // A ring
           case 201: buf.append("\u00c9"); break; // E acute
           case 209: buf.append("\u00d1"); break; // N tilde
           case 214: buf.append("\u00d6"); break; // O dieresis
           case 220: buf.append("\u00dc"); break; // U dieresis
           case 225: buf.append("\u00e1"); break; // a acute
           case 224: buf.append("\u00e0"); break; // a grave
           case 226: buf.append("\u00e2"); break; // a circumflex
           case 228: buf.append("\u00e4"); break; // a dieresis
           case 227: buf.append("\u00e3"); break; // a tilde
           case 229: buf.append("\u0101"); break; // a macron
           case 231: buf.append("\u00e7"); break; // c cedilla
           case 233: buf.append("\u00e9"); break; // e acute
           case 232: buf.append("\u00e8"); break; // e grave
           case 234: buf.append("\u00ea"); break; // e circumflex
           case 235: buf.append("\u00eb"); break; // e dieresis
           case 237: buf.append("\u00ed"); break; // i acute
           case 236: buf.append("\u00ec"); break; // i grave
           case 238: buf.append("\u00ee"); break; // i circumflex
           case 239: buf.append("\u00ef"); break; // i dieresis
           case 241: buf.append("\u00f1"); break; // n tilde
           case 243: buf.append("\u00f3"); break; // o acute
           case 242: buf.append("\u00f2"); break; // o grave
           case 244: buf.append("\u00f4"); break; // o circumflex
           case 246: buf.append("\u00f6"); break; // o dieresis
           case 245: buf.append("\u00f5"); break; // o tilde
           case 250: buf.append("\u00fa"); break; // u acute
           case 249: buf.append("\u00f9"); break; // u grave
           case 251: buf.append("\u00fb"); break; // u circumflex
           case 252: buf.append("\u00fc"); break; // u dieresis
           case 8224: buf.append("\u1e6d"); break; // t underdot
           case 176: buf.append("\u00b0"); break; // degree
           case 162: buf.append("\u1ebd"); break; // e tilde
           case 163: buf.append("\u00a3"); break; // sterling
           case 167: buf.append("\u00a7"); break; // section
           case 182: buf.append("\u00b6"); break; // paragraph
           case 223: buf.append("\u015b"); break; // s acute
           case 174: buf.append("\u1e5b"); break; // r underdot
           case 169: buf.append("\u1e45"); break; // n overdot
           case 180: buf.append("\u0301"); break; // acute
           case 168: buf.append("\u0308"); break; // dieresis
           case 8800: buf.append("\u1e6d"); break; // t underdot
           case 198: buf.append("\u00c6"); break; // AE
           case 216: buf.append("\u014d"); break; // o macron
           case 8734: buf.append("\u0129"); break; // i tilde
           case 177: buf.append("\u00b1"); break; // plusminus
           case 165: buf.append("\u012b"); break; // i macron
           case 181: buf.append("\u1e43"); break; // m underdot
           case 8706: buf.append("\u1e0d"); break; // d underdot
           case 8721: buf.append("\u1e63"); break; // s underdot
           case 960: buf.append("\u017a"); break; // z acute
           case 8747: buf.append("\u1e45"); break; // n overdot
           case 937: buf.append("\u0169"); break; // u tilde
           case 230: buf.append("\u00e6"); break; // ae
           case 248: buf.append("\u00f8"); break; // oslash
           case 191: buf.append("\u0304\u0306"); break; // macron breve
           case 172: buf.append("\u1e37"); break; // 
           case 8730: buf.append("j\u0305"); break; // j macron [does a single char exist?]
           case 402: buf.append("\u0103"); break; // a breve
           case 8776: buf.append("\u016d"); break; // u breve
           case 187: buf.append("\u1e42"); break; // M underdot
           case 8230: buf.append("\u2026"); break; // ellipsis
           case 192: buf.append("\u00c0"); break; // A grave
           case 195: buf.append("\u00c3"); break; // A tilde
           case 213: buf.append("\u00d5"); break; // O tilde
           case 338: buf.append("m\u0306"); break; // m breve
           case 339: buf.append("\u0153"); break; // oe
           case 8211: buf.append("\u2013"); break; // endash
           case 8212: buf.append("\u2014"); break; // emdash
           case 8220: buf.append("\u201c"); break; // quotedblleft
           case 8221: buf.append("\u201d"); break; // quotedblright
           case 8216: buf.append("\u2018"); break; // quoteleft
           case 8217: buf.append("\u2019"); break; // quoteright
           case 247: buf.append("\u1e37"); break; // l underring [actually underdot]
           case 9674: buf.append("\u1e41"); break; // m overdot
           case 255: buf.append("n\u0306"); break; // n breve
           case 376: buf.append("\u00d7"); break; // multiply
           case 8364: buf.append("\u1e5b"); break; // r underring [actually underdot]
           case 8249: buf.append("\u1e44"); break; // N overdot
           case 8250: buf.append("\u1e62"); break; // S underdot
           case 64257: buf.append("\u1e24"); break; // H underdot
           case 64258: buf.append("\u1e0c"); break; // D underdot
           case 8225: buf.append("\u2021"); break; // daggerdbl
           case 8218: buf.append("\u1e36"); break; // L underdot
           case 8222: buf.append("\u0113"); break; // e macron
           case 194: buf.append("\u1e5f"); break; // r underbar
           case 202: buf.append("r\u0324"); break; // r underdieresis
           case 193: buf.append("\u012a"); break; // I macron
           case 203: buf.append("\u016b"); break; // u macron
           case 200: buf.append("\u1e6c"); break; // T underdot
           case 205: buf.append("\u1e64"); break; // S acute
           case 206: buf.append("\u2020"); break; // dagger
           case 207: buf.append("\u0115"); break; // e breve
           case 204: buf.append("\u014f"); break; // o breve
           case 211: buf.append("\u0100"); break; // A macron
           case 212: buf.append("\u1e46"); break; // N underdot
           case 210: buf.append("\u1e3b"); break; // l underbar
           case 218: buf.append("\u016a"); break; // U macron
           case 219: buf.append("\u0179"); break; // Z acute
           case 217: buf.append("\u1e5a"); break; // R underdot
           case 305: buf.append("\u0131"); break; // dotlessi
           case 710: buf.append("\u1e47"); break; // n underdot
           case 732: buf.append("\u1e49"); break; // n underbar
           case 175: buf.append("\u0304"); break; // macron
           case 728: buf.append("\u0306"); break; // breve
           case 729: buf.append("\u1e25"); break; // h underdot
           case 730: buf.append("\u012d"); break; // i breve
           case 184: buf.append("\u0327"); break; // cedilla
           case 733: buf.append("\u030b"); break; // hungarumlaut
           case 731: buf.append("\u0328"); break; // ogonek
           case 711: buf.append("\u030c"); break; // caron
           case 199: buf.append("\u012b\u0303"); break; // imacron tilde
           case 8226: buf.append("\u1e5d"); break; // runderdot macron
           case 8482: buf.append("\u016b\0306"); break; // umacron breve
           case 8804: buf.append("\u0101\u0301"); break; // amacron acute
           case 8805: buf.append("\u016b\u0301"); break; // umacron acute
           case 8719: buf.append("\u0113\u0301"); break; // emacron acute
           case 170: buf.append("\u0113\u0300"); break; // emacron breve
           case 186: buf.append("\u014d\u0300"); break; // omacron breve
           case 161: buf.append("\u0101\u0306"); break; // amacron breve
           case 8710: buf.append("\u0101\u0303"); break; // amacron tilde
           case 171: buf.append("\u012b\u0301"); break; // imacron acute
           case 8260: buf.append("\u1e00"); break; // runderdotmacron acute
           case 183: buf.append("\u1e5b\u0301"); break; // runderdot acute
           case 8240: buf.append("\u012b\u0306"); break; // imacron breve
           case 63743: buf.append("\u016b\u0303"); break; // umacron tilde
           default: buf.append(c); break;
         }
       }
       return buf.toString();
     }
   
   
 }  }
   

Removed from v.1.56  
changed lines
  Added in v.1.62


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>