]> granicus.if.org Git - icu/commitdiff
ICU-9745 comit icu4jscan
authorSteven R. Loomis <srl@icu-project.org>
Mon, 26 Nov 2012 19:34:31 +0000 (19:34 +0000)
committerSteven R. Loomis <srl@icu-project.org>
Mon, 26 Nov 2012 19:34:31 +0000 (19:34 +0000)
X-SVN-Rev: 32886

.gitattributes
tools/multi/j/icu4jscan/.classpath [new file with mode: 0644]
tools/multi/j/icu4jscan/.project [new file with mode: 0644]
tools/multi/j/icu4jscan/src/com/ibm/icu/dev/scan/CapDocument.java [new file with mode: 0644]
tools/multi/j/icu4jscan/src/com/ibm/icu/dev/scan/CapElement.java [new file with mode: 0755]
tools/multi/j/icu4jscan/src/com/ibm/icu/dev/scan/CapNode.java [new file with mode: 0644]
tools/multi/j/icu4jscan/src/com/ibm/icu/dev/scan/CapScan.java [new file with mode: 0644]
tools/multi/j/icu4jscan/src/com/ibm/icu/dev/scan/ScanICU.java [new file with mode: 0644]
tools/multi/j/icu4jscan/src/com/ibm/icu/dev/scan/ScanJava.java [new file with mode: 0644]
tools/multi/j/icu4jscan/src/com/ibm/icu/dev/scan/SimpleScan.java [new file with mode: 0644]
tools/multi/j/icu4jscan/src/com/ibm/icu/dev/scan/Spinner.java [new file with mode: 0644]

index 51f2508d0646fee38d1749b1789f152f2bc970c8..0973bf5114d151ccd5fbeefe7de600ed6fb7a628 100644 (file)
@@ -873,6 +873,16 @@ tools/multi/c/patch/3_2 -text
 tools/multi/c/patch/3_4_1 -text
 tools/multi/common/Makefile-multi.inc -text
 tools/multi/j/Makefile-j.inc -text
+tools/multi/j/icu4jscan/.classpath -text
+tools/multi/j/icu4jscan/.project -text
+tools/multi/j/icu4jscan/src/com/ibm/icu/dev/scan/CapDocument.java -text
+tools/multi/j/icu4jscan/src/com/ibm/icu/dev/scan/CapElement.java -text
+tools/multi/j/icu4jscan/src/com/ibm/icu/dev/scan/CapNode.java -text
+tools/multi/j/icu4jscan/src/com/ibm/icu/dev/scan/CapScan.java -text
+tools/multi/j/icu4jscan/src/com/ibm/icu/dev/scan/ScanICU.java -text
+tools/multi/j/icu4jscan/src/com/ibm/icu/dev/scan/ScanJava.java -text
+tools/multi/j/icu4jscan/src/com/ibm/icu/dev/scan/SimpleScan.java -text
+tools/multi/j/icu4jscan/src/com/ibm/icu/dev/scan/Spinner.java -text
 tools/multi/proj/provider/Makefile.local-sample -text
 tools/multi/proj/provider/icu-config.sed -text
 tools/multi/proj/provider/readme.txt -text
diff --git a/tools/multi/j/icu4jscan/.classpath b/tools/multi/j/icu4jscan/.classpath
new file mode 100644 (file)
index 0000000..68a5aad
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+       <classpathentry kind="src" path="src"/>
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+       <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/CLDR_JAR"/>
+       <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/ICU_META_LIB"/>
+       <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/ICU_UTILITIES"/>
+       <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/tools/multi/j/icu4jscan/.project b/tools/multi/j/icu4jscan/.project
new file mode 100644 (file)
index 0000000..400a6c1
--- /dev/null
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>icu4jscan</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+       </natures>
+</projectDescription>
diff --git a/tools/multi/j/icu4jscan/src/com/ibm/icu/dev/scan/CapDocument.java b/tools/multi/j/icu4jscan/src/com/ibm/icu/dev/scan/CapDocument.java
new file mode 100644 (file)
index 0000000..96af94e
--- /dev/null
@@ -0,0 +1,116 @@
+/* Copyright (C) 2008-2012 IBM Corporation and Others. All Rights Reserved. */
+
+package com.ibm.icu.dev.scan;
+
+import java.io.PrintWriter;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+
+public class CapDocument implements CapNode {
+
+       public class TextCap extends CapElement {
+               TextCap(String str) {
+                       super(str);
+               }
+
+               public void write(PrintWriter pw, int i) {
+                       writeIndent(pw,i);
+                       pw.write(getName()+"\n");
+               }
+       }
+
+       public class CommentElement extends CapElement {
+               CommentElement(String str) {
+                       super(str);
+               }
+               public void write(PrintWriter pw, int indent) {
+                       writeIndent(pw,indent);
+                       pw.write("<!-- "+getName()+" -->\n");
+               }
+       }
+
+       TagElement root = new TagElement();
+       
+       public class TagElement extends CapElement {
+               public TagElement() {
+                       super("");
+               }
+               public TagElement(String name) {
+                       super(name);
+               }
+
+               public void write(PrintWriter pw, int indent) {
+                       if(getName().length()>0) {
+                               writeIndent(pw,indent);
+                               pw.write("<"+getName());
+                               if(!attributes.isEmpty()) {
+                                       for(Iterator iter = attributes.entrySet().iterator();iter.hasNext();) {
+                                               Map.Entry o = (Map.Entry)iter.next();
+                                               pw.write(" "+o.getKey().toString()+"=\""+o.getValue()+"\"");
+                                       }
+                               }
+                               pw.write(">\n");
+                               indent++;
+                       }
+                       
+                       for(Iterator iter = children.iterator();iter.hasNext();) {
+                               CapNode ch = (CapNode)iter.next();
+                               ch.write(pw, indent);
+                       }
+                       
+                       if(getName().length()>0) {
+                               indent--;
+                               writeIndent(pw,indent);
+                               pw.write("</"+getName());
+                               pw.write(">\n");
+                       }
+               }
+       }
+
+       private static void writeIndent(PrintWriter pw, int indent) {
+               for(;indent>0;indent--) {
+                       pw.write(' ');
+               }
+       }
+
+       public CapElement createCapElement(String name) {
+               return new TagElement(name);
+       }
+
+       public void appendChild(CapElement base) {
+               root.appendChild(base);
+       }
+
+       public static CapDocument newCapDocument() {
+               return new CapDocument();
+       }
+
+       public static void printDOMTree(CapDocument out, PrintWriter pw,
+                       String string, Object object) {
+               pw.write(string+"\n");
+               out.root.write(pw,0);
+       }
+       
+       public void write(PrintWriter pw, int indent) {
+               root.write(pw,0);
+       }
+
+       public CapNode createTextNode(String trim) {
+               return new TextCap(trim);
+       }
+
+       public CapElement createComment(String com) {
+               return new CommentElement(com);
+       }
+
+       public int compareTo(Object arg0) {
+               return getName().compareTo(((CapNode)arg0).getName());
+       }
+       
+       public String getName() {
+               return root.getName();
+       }
+}
diff --git a/tools/multi/j/icu4jscan/src/com/ibm/icu/dev/scan/CapElement.java b/tools/multi/j/icu4jscan/src/com/ibm/icu/dev/scan/CapElement.java
new file mode 100755 (executable)
index 0000000..b13779a
--- /dev/null
@@ -0,0 +1,51 @@
+/* Copyright (C) 2008-2012 IBM Corporation and Others. All Rights Reserved. */
+
+package com.ibm.icu.dev.scan;
+
+import java.io.PrintWriter;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+
+public abstract class CapElement implements CapNode {
+       String com;
+       CapElement(String str) {
+               com = str;
+       }
+
+       public String getName() {
+               return com;
+       }
+       
+       public abstract void write(PrintWriter pw, int i);
+
+       public int compareTo(Object arg0) {
+               if(arg0 == this) return 0;
+               int str = getName().compareTo(((CapNode)arg0).getName());
+               if(str!=0) return str;
+               
+               if(arg0 instanceof CapElement) {                
+                       CapElement oth = (CapElement)arg0;
+                       return attributes.toString().compareTo(oth.attributes.toString());
+               }
+               return 0;
+       }
+
+       Map attributes = new HashMap();
+       Set children = new TreeSet();
+       public void setAttribute(String k, String v) {
+               attributes.put(k, v);
+               
+       }
+
+       public void appendChild(CapNode e) {
+               children.add(e);
+               
+       }
+
+       public String getNodeName() {
+               return getName();
+       }
+
+}
diff --git a/tools/multi/j/icu4jscan/src/com/ibm/icu/dev/scan/CapNode.java b/tools/multi/j/icu4jscan/src/com/ibm/icu/dev/scan/CapNode.java
new file mode 100644 (file)
index 0000000..86f2914
--- /dev/null
@@ -0,0 +1,13 @@
+/* Copyright (C) 2008-2012 IBM Corporation and Others. All Rights Reserved. */
+
+package com.ibm.icu.dev.scan;
+
+import java.io.PrintWriter;
+
+public interface CapNode extends Comparable {
+
+       void write(PrintWriter pw, int i);
+
+       String getName();
+
+}
diff --git a/tools/multi/j/icu4jscan/src/com/ibm/icu/dev/scan/CapScan.java b/tools/multi/j/icu4jscan/src/com/ibm/icu/dev/scan/CapScan.java
new file mode 100644 (file)
index 0000000..1816ce1
--- /dev/null
@@ -0,0 +1,129 @@
+/* Copyright (C) 2008-2012 IBM Corporation and Others. All Rights Reserved. */
+
+package com.ibm.icu.dev.scan;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.util.Calendar;
+
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.unicode.cldr.util.LDMLUtilities;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import com.ibm.icu.dev.meta.IcuInfo;
+import com.ibm.icu.dev.meta.XMLUtil;
+import com.ibm.icu.util.VersionInfo;
+
+public abstract class CapScan {
+
+    /** Capabilities string **/
+    public static final String FORMATTING = "formatting";
+    public static final String COLLATION = "collation";
+
+    /**
+     * @param args
+     */
+    public static void main(String[] args) throws IOException, ParserConfigurationException {
+     
+        System.err.println("# "+CapScan.class.getSimpleName()+": This is just the base class. Use a subclass.");
+        System.exit(1);
+    }
+
+    protected String prog;
+
+    protected Element addCapability(Document out, Element capabilities, String name) {
+        return addCapability(out, capabilities, name, (String)null);
+    }
+    protected Element addCapability(Document out, Element capabilities, String name,
+            String version) {
+    
+        Element e = out.createElement(IcuInfo.FEATURE);
+        e.setAttribute(IcuInfo.TYPE,name.trim());
+        if(version!=null) {
+            e.setAttribute(IcuInfo.VERSION,version.trim());
+        }
+        capabilities.appendChild(e);
+        return e;
+    }
+
+    protected Element addCapability(Document out, Element capabilities, String name,
+            VersionInfo version) {
+        return addCapability(out, capabilities, name, IcuInfo.versionInfoToShortString(version));
+    }
+
+    protected CapScan(String prog) {
+        this.prog = prog;
+    }
+    
+    Document out;
+    
+    protected Element createProduct(String productName) {
+        Element base = out.createElement(IcuInfo.ICU_INFO);
+        out.appendChild(base);
+        
+        Element products = out.createElement(IcuInfo.ICU_PRODUCTS);
+        base.appendChild(products);
+        
+        Element product = out.createElement(IcuInfo.ICU_PRODUCT);
+        product.setAttribute(IcuInfo.TYPE, productName);
+        products.appendChild(product);
+        return product;
+    }
+    
+    protected Element createRelease(Element product, String version) {
+        Element releases = out.createElement(IcuInfo.RELEASES);
+        product.appendChild(releases);
+        
+        Element release = out.createElement(IcuInfo.RELEASE);
+        release.setAttribute(IcuInfo.VERSION, version);
+        releases.appendChild(release);
+        return release;
+    }
+    
+    protected void runMain(String args[]) throws IOException, ParserConfigurationException {
+        
+        
+     System.err.println("# "+prog+": startup.");
+    // TODO Auto-generated method stub
+    out = XMLUtil.getBuilder().newDocument();
+    
+    Element product = createProduct(getProduct());
+    
+    Element release = createRelease(product, getRelease());
+    
+    
+    Element capabilities = out.createElement(IcuInfo.CAPABILITIES);
+    release.appendChild(capabilities);
+    
+    addCapabilitiesTo(capabilities);
+
+
+    // write out
+    OutputStream outstr = null;
+    outstr = System.out;
+//    java.io.FileOutputStream fos = null;
+//    if(outfile!=null) {
+//        fos = new FileOutputStream(outfile);
+//        out = fos;
+//        if(verbose) System.err.println("# Write <"+outfile+">");
+//    } else {
+//        out = System.out;
+//        if(verbose) System.err.println("# Write <stdout>");
+//    }
+//    try {
+     java.io.OutputStreamWriter writer = new java.io.OutputStreamWriter(
+             outstr);
+     String copy = "";
+     if(true) copy = ("<!-- Copyright (c) "+Calendar.getInstance().get(Calendar.YEAR)+" IBM Corporation and Others, All Rights Reserved. -->\n");
+     LDMLUtilities.printDOMTree(out, new PrintWriter(writer),copy+"\n<!DOCTYPE icuInfo SYSTEM \"http://icu-project.org/dtd/icumeta.dtd\">\n",null); //
+     writer.flush();
+    }
+    protected abstract String getProduct();
+    
+    protected abstract String getRelease();
+    
+    protected abstract void addCapabilitiesTo(Element capabilities);
+}
diff --git a/tools/multi/j/icu4jscan/src/com/ibm/icu/dev/scan/ScanICU.java b/tools/multi/j/icu4jscan/src/com/ibm/icu/dev/scan/ScanICU.java
new file mode 100644 (file)
index 0000000..4b6f8ab
--- /dev/null
@@ -0,0 +1,156 @@
+/* Copyright (C) 2008-2012 IBM Corporation and Others. All Rights Reserved. */
+
+/**
+ * 
+ */
+package com.ibm.icu.dev.scan;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.util.Calendar;
+import java.util.Date;
+
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.unicode.cldr.util.LDMLUtilities;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+import com.ibm.icu.dev.meta.IcuInfo;
+import com.ibm.icu.dev.meta.XMLUtil;
+import com.ibm.icu.lang.UCharacter;
+import com.ibm.icu.text.Collator;
+import com.ibm.icu.text.DateFormat;
+import com.ibm.icu.text.RuleBasedCollator;
+import com.ibm.icu.util.TimeZone;
+import com.ibm.icu.util.ULocale;
+import com.ibm.icu.util.VersionInfo;
+
+/**
+ * @author srl
+ *
+ */
+public class ScanICU extends CapScan{
+
+    protected ScanICU() {
+        super(ScanICU.class.getName());
+    }
+
+    /**
+     * @param args
+     * @throws ParserConfigurationException 
+     * @throws IOException 
+     * @throws IOException 
+     * @throws ParserConfigurationException 
+     * @throws IOException 
+     */
+    public static void main(String[] args) throws IOException, ParserConfigurationException  {
+        new ScanICU().runMain(args);
+    }
+    
+    protected String getProduct() {
+        return "icu4j";
+    }
+
+    protected String getRelease() {
+        /*
+         *     try {
+    } catch(NoClassDefFoundError ncdf) {
+        System.err.println(prog+": Can't get ICU version: " + ncdf.toString());
+        System.exit(1);
+    } catch(NoSuchFieldError nsme) {
+        System.err.println(prog+": Can't get ICU version: " + nsme.toString());
+        System.exit(1);
+    }
+         */
+        return IcuInfo.versionInfoToShortString(VersionInfo.ICU_VERSION);
+    }
+
+    protected void addCapabilitiesTo(Element capabilities) {
+        
+        addCapability(out, capabilities, "unicode", UCharacter.getUnicodeVersion());
+        try {
+            addCapability(out, capabilities, "uca", Collator.getInstance().getUCAVersion());
+        } catch(NoSuchMethodError nsme) {
+            System.err.println(prog+": Note: "+nsme.toString());
+        }
+        try {
+            addCapability(out, capabilities, "tz", TimeZone.getTZDataVersion());
+        } catch(NoSuchMethodError nsme) {
+            System.err.println(prog+": Note: "+nsme.toString());
+        }
+        addFormatting(capabilities);
+        addCollation(capabilities);
+    }
+    
+    void addFormatting(Element capabilities) {
+            Element locs = addCapability(out, capabilities, CapScan.FORMATTING);
+            
+            try {
+            ULocale available[] = ULocale.getAvailableLocales();
+            locs.setAttribute("total", new Integer(available.length).toString());
+            
+                String locinfo = "";
+                
+                Spinner sp = new Spinner(locs.getNodeName(),available.length);
+                for(int i=0;i<available.length;i++) {
+                       ULocale loc = available[i];
+                    if(loc.toString().equals("root")) continue;
+                    try {                      
+                        DateFormat fmt = null;
+                        try {
+                            fmt = DateFormat.getTimeInstance(DateFormat.FULL, loc);
+                        }catch (Throwable t) {
+                               fmt = DateFormat.getTimeInstance(DateFormat.FULL, loc.toLocale());
+                        }
+                        fmt.format(new Date(1234));
+                        locinfo = locinfo + " " + loc.toString();
+                        sp.spin(loc.getBaseName());
+                    } catch (Throwable t) {
+                        System.err.println(prog+": loc fail: " + loc + " - " + t.toString());
+                    }
+                }
+                
+                Node tt = out.createTextNode(locinfo.trim());
+                locs.appendChild(tt);
+            } catch(NoClassDefFoundError ncdf) {
+                System.err.println(prog+": locales: " + ncdf.toString());
+            } catch(NoSuchMethodError ncdf) {
+                System.err.println(prog+": locales: " + ncdf.toString());
+            }
+        }    
+    void addCollation(Element capabilities) {
+        {
+            Element locs = addCapability(out, capabilities, CapScan.COLLATION);
+            
+            try {
+                ULocale available[] = Collator.getAvailableULocales();
+                Spinner sp = new Spinner(locs.getNodeName(),available.length);
+                locs.setAttribute("total", new Integer(available.length).toString());
+            
+                String locinfo = "";
+                
+                for(int i=0;i<available.length;i++) {
+                       ULocale loc = available[i];
+                    if(loc.toString().equals("root")) continue;
+                    try {
+                      //  Collator.getInstance(loc);
+                        locinfo = locinfo + " " + loc.toString();
+                        sp.spin(loc.getBaseName());
+                    } catch (Throwable t) {
+                        System.err.println("loc fail: " + loc + " - " + t.toString());
+                    }
+                }
+                
+                Node tt = out.createTextNode(locinfo.trim());
+                locs.appendChild(tt);
+            } catch(NoClassDefFoundError ncdf) {
+                System.err.println("locales: " + ncdf.toString());
+            } catch(NoSuchMethodError ncdf) {
+                System.err.println("locales: " + ncdf.toString());
+            }
+        }
+    }
+}
diff --git a/tools/multi/j/icu4jscan/src/com/ibm/icu/dev/scan/ScanJava.java b/tools/multi/j/icu4jscan/src/com/ibm/icu/dev/scan/ScanJava.java
new file mode 100644 (file)
index 0000000..9b0876b
--- /dev/null
@@ -0,0 +1,137 @@
+/* Copyright (C) 2008-2012 IBM Corporation and Others. All Rights Reserved. */
+
+
+package com.ibm.icu.dev.scan;
+
+import java.io.IOException;
+import java.text.Collator;
+import java.text.DateFormat;
+import java.util.Date;
+import java.util.Locale;
+
+import javax.xml.parsers.ParserConfigurationException;
+
+
+import com.ibm.icu.util.ULocale;
+
+/**
+ * @author srl
+ *
+ */
+public class ScanJava extends SimpleScan {
+
+    /**
+     * @param prog
+     */
+    public ScanJava() {
+        super(ScanJava.class.getName());
+    }
+
+    /* (non-Javadoc)
+     * @see com.ibm.icu.dev.scan.CapScan#addCapabilitiesTo(org.w3c.dom.CapElement)
+     */
+    protected void addCapabilitiesTo(CapElement capabilities) {
+        addFormatting(capabilities);
+        addCollation(capabilities);
+    }
+
+    private void addCollation(CapElement capabilities) {
+        CapElement locs = addCapability(out, capabilities, CapScan.COLLATION);
+        
+        try {
+        Locale available[] = Collator.getAvailableLocales();
+        locs.setAttribute("total", new Integer(available.length).toString());
+        System.err.println("Begin coll!");
+            String locinfo = "";
+            
+            Spinner sp = new Spinner(locs.getNodeName(),available.length);
+            for(int i=0;i<available.length;i++) {
+               Locale loc = available[i];
+                if(loc.toString().equals("root")) continue;
+                try {
+                    Collator c = Collator.getInstance(loc);
+                    DateFormat fmt = DateFormat.getTimeInstance(DateFormat.FULL, loc);
+                    fmt.format(new Date(1234));
+                    locinfo = locinfo + " " + loc.toString();
+                    sp.spin(loc.toString());
+                } catch (Throwable t) {
+                    System.err.println(prog+": loc fail: " + loc + " - " + t.toString());
+                }
+            }
+            
+            CapNode tt = out.createTextNode(locinfo.trim());
+            locs.appendChild(tt);
+        } catch(NoClassDefFoundError ncdf) {
+            System.err.println(prog+": collation: " + ncdf.toString());
+        } catch(NoSuchMethodError ncdf) {
+            System.err.println(prog+": collation: " + ncdf.toString());
+        }
+        
+        locs.appendChild(out.createComment("Note: Java locales have different conventions than ICU."));
+        
+    }
+
+    private void addFormatting(CapElement capabilities) {
+        CapElement locs = addCapability(out, capabilities, CapScan.FORMATTING);
+        
+        try {
+        Locale available[] = Locale.getAvailableLocales();
+        locs.setAttribute("total", new Integer(available.length).toString());
+        
+            String locinfo = "";
+            
+            Spinner sp = new Spinner(locs.getNodeName(),available.length);
+            for(int i=0;i<available.length;i++) {
+               Locale loc = available[i];
+                if(loc.toString().equals("root")) continue;
+                try {
+                    DateFormat fmt = DateFormat.getTimeInstance(DateFormat.FULL, loc);
+                    fmt.format(new Date(1234));
+                    locinfo = locinfo + " " + loc.toString();
+                    sp.spin(loc.toString());
+                } catch (Throwable t) {
+                    System.err.println(prog+": loc fail: " + loc + " - " + t.toString());
+                }
+            }
+            
+            CapNode tt = out.createTextNode(locinfo.trim());
+            locs.appendChild(tt);
+        } catch(NoClassDefFoundError ncdf) {
+            System.err.println(prog+": locales: " + ncdf.toString());
+        } catch(NoSuchMethodError ncdf) {
+            System.err.println(prog+": locales: " + ncdf.toString());
+        }
+        
+        locs.appendChild(out.createComment("Note: Java locales have different conventions than ICU."));
+        
+    }
+
+    /* (non-Javadoc)
+     * @see com.ibm.icu.dev.scan.CapScan#getProduct()
+     */
+    protected String getProduct() {
+        return "java";
+    }
+
+    /* (non-Javadoc)
+     * @see com.ibm.icu.dev.scan.CapScan#getRelease()
+     */
+    protected String getRelease() {
+        String ver =  System.getProperty("java.version");
+        int u = ver.indexOf('_');
+        if(u>0) {
+               ver = ver.substring(0,u);
+        }
+        return ver;
+    }
+
+    /**
+     * @param args
+     * @throws ParserConfigurationException 
+     * @throws IOException 
+     */
+    public static void main(String[] args) throws IOException {
+        new ScanJava().runMain(args);
+    }
+
+}
diff --git a/tools/multi/j/icu4jscan/src/com/ibm/icu/dev/scan/SimpleScan.java b/tools/multi/j/icu4jscan/src/com/ibm/icu/dev/scan/SimpleScan.java
new file mode 100644 (file)
index 0000000..394d742
--- /dev/null
@@ -0,0 +1,126 @@
+/* Copyright (C) 2008-2012 IBM Corporation and Others. All Rights Reserved. */
+
+package com.ibm.icu.dev.scan;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.util.Calendar;
+
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.unicode.cldr.util.LDMLUtilities;
+
+import com.ibm.icu.dev.meta.IcuInfo;
+import com.ibm.icu.dev.meta.XMLUtil;
+import com.ibm.icu.util.VersionInfo;
+
+public abstract class SimpleScan {
+
+    /** Capabilities string **/
+    public static final String FORMATTING = "formatting";
+    public static final String COLLATION = "collation";
+
+    /**
+     * @param args
+     */
+    public static void main(String[] args) throws IOException, ParserConfigurationException {
+     
+        System.err.println("# "+SimpleScan.class.getSimpleName()+": This is just the base class. Use a subclass.");
+        System.exit(1);
+    }
+
+    protected String prog;
+
+    protected CapElement addCapability(CapDocument out, CapElement capabilities, String name) {
+        return addCapability(out, capabilities, name, (String)null);
+    }
+    protected CapElement addCapability(CapDocument out, CapElement capabilities, String name,
+            String version) {
+    
+        CapElement e = out.createCapElement(IcuInfo.FEATURE);
+        e.setAttribute(IcuInfo.TYPE,name.trim());
+        if(version!=null) {
+            e.setAttribute(IcuInfo.VERSION,version.trim());
+        }
+        capabilities.appendChild(e);
+        return e;
+    }
+
+    protected CapElement addCapability(CapDocument out, CapElement capabilities, String name,
+            VersionInfo version) {
+        return addCapability(out, capabilities, name, IcuInfo.versionInfoToShortString(version));
+    }
+
+    protected SimpleScan(String prog) {
+        this.prog = prog;
+    }
+    
+    CapDocument out;
+    
+    protected CapElement createProduct(String productName) {
+        CapElement base = out.createCapElement(IcuInfo.ICU_INFO);
+        out.appendChild(base);
+        
+        CapElement products = out.createCapElement(IcuInfo.ICU_PRODUCTS);
+        base.appendChild(products);
+        
+        CapElement product = out.createCapElement(IcuInfo.ICU_PRODUCT);
+        product.setAttribute(IcuInfo.TYPE, productName);
+        products.appendChild(product);
+        return product;
+    }
+    
+    protected CapElement createRelease(CapElement product, String version) {
+        CapElement releases = out.createCapElement(IcuInfo.RELEASES);
+        product.appendChild(releases);
+        
+        CapElement release = out.createCapElement(IcuInfo.RELEASE);
+        release.setAttribute(IcuInfo.VERSION, version);
+        releases.appendChild(release);
+        return release;
+    }
+    
+    protected void runMain(String args[]) throws IOException {
+        
+        
+     System.err.println("# "+prog+": startup.");
+    out = CapDocument.newCapDocument();
+    
+    CapElement product = createProduct(getProduct());
+    
+    CapElement release = createRelease(product, getRelease());
+    
+    
+    CapElement capabilities = out.createCapElement(IcuInfo.CAPABILITIES);
+    release.appendChild(capabilities);
+    
+    addCapabilitiesTo(capabilities);
+
+
+    // write out
+    OutputStream outstr = null;
+    outstr = System.out;
+//    java.io.FileOutputStream fos = null;
+//    if(outfile!=null) {
+//        fos = new FileOutputStream(outfile);
+//        out = fos;
+//        if(verbose) System.err.println("# Write <"+outfile+">");
+//    } else {
+//        out = System.out;
+//        if(verbose) System.err.println("# Write <stdout>");
+//    }
+//    try {
+     java.io.OutputStreamWriter writer = new java.io.OutputStreamWriter(
+             outstr);
+     String copy = "";
+     if(true) copy = ("<!-- Copyright (c) "+Calendar.getInstance().get(Calendar.YEAR)+" IBM Corporation and Others, All Rights Reserved. -->\n");
+     CapDocument.printDOMTree(out, new PrintWriter(writer),copy+"\n<!DOCTYPE icuInfo SYSTEM \"http://icu-project.org/dtd/icumeta.dtd\">\n",null); //
+     writer.flush();
+    }
+    protected abstract String getProduct();
+    
+    protected abstract String getRelease();
+    
+    protected abstract void addCapabilitiesTo(CapElement capabilities);
+}
diff --git a/tools/multi/j/icu4jscan/src/com/ibm/icu/dev/scan/Spinner.java b/tools/multi/j/icu4jscan/src/com/ibm/icu/dev/scan/Spinner.java
new file mode 100644 (file)
index 0000000..219a16b
--- /dev/null
@@ -0,0 +1,32 @@
+/* Copyright (C) 2008-2012 IBM Corporation and Others. All Rights Reserved. */
+
+package com.ibm.icu.dev.scan;
+
+class Spinner {
+    String str = "";
+    int n = 0;
+    int max = -1;
+    Spinner() {
+    }
+    Spinner(String str) {
+        this.str = str;
+    }
+    Spinner(String str, int max) {
+        this.str = str;
+        this.max = max;
+    }
+    void spin() {
+        spin(null);
+    }
+    void spin(String what) {
+        // TODO: time based.
+        n++;
+        if((n%25)==0) {
+            String nstr="";
+            if(max>0) {
+                nstr="/"+max;
+            }
+            System.err.println("#"+str+".."+n+nstr+" "+(what!=null?what:""));
+        }
+    }
+}
\ No newline at end of file