]> gitweb.fperrin.net Git - Dictionary.git/blobdiff - jars/icu4j-4_2_1-src/src/com/ibm/icu/dev/test/util/ICUPropertyFactory.java
go
[Dictionary.git] / jars / icu4j-4_2_1-src / src / com / ibm / icu / dev / test / util / ICUPropertyFactory.java
old mode 100755 (executable)
new mode 100644 (file)
index 08046dd..9beba64
-//##header\r
-//#if defined(FOUNDATION10) || defined(J2SE13)\r
-//#else\r
-/*\r
- *******************************************************************************\r
- * Copyright (C) 2002-2009, International Business Machines Corporation and    *\r
- * others. All Rights Reserved.                                                *\r
- *******************************************************************************\r
- */\r
-package com.ibm.icu.dev.test.util;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Arrays;\r
-import java.util.Collection;\r
-import java.util.HashMap;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-import java.util.Locale;\r
-import java.util.Map;\r
-import java.util.Set;\r
-import java.util.TreeSet;\r
-\r
-import com.ibm.icu.lang.UCharacter;\r
-import com.ibm.icu.lang.UProperty;\r
-import com.ibm.icu.text.Normalizer;\r
-import com.ibm.icu.text.UTF16;\r
-import com.ibm.icu.util.VersionInfo;\r
-\r
-\r
-/**\r
- * Provides a general interface for Unicode Properties, and\r
- * extracting sets based on those values.\r
- * @author Davis\r
- */\r
-\r
-public class ICUPropertyFactory extends UnicodeProperty.Factory {\r
-        \r
-    static class ICUProperty extends UnicodeProperty {\r
-            protected int propEnum = Integer.MIN_VALUE;\r
-            \r
-            protected ICUProperty(String propName, int propEnum) {\r
-                setName(propName);\r
-                this.propEnum = propEnum;\r
-                setType(internalGetPropertyType(propEnum));\r
-            }\r
-\r
-            boolean shownException = false;\r
-            \r
-            public String _getValue(int codePoint) {\r
-                switch(propEnum) {\r
-                    case UProperty.AGE: String temp = UCharacter.getAge(codePoint).toString();\r
-                        if (temp.equals("0.0.0.0")) return "unassigned";\r
-                        if (temp.endsWith(".0.0")) return temp.substring(0,temp.length()-4);\r
-                        return temp;\r
-                    case UProperty.BIDI_MIRRORING_GLYPH: return UTF16.valueOf(UCharacter.getMirror(codePoint));\r
-                    case UProperty.CASE_FOLDING: return UCharacter.foldCase(UTF16.valueOf(codePoint),true);\r
-                    case UProperty.ISO_COMMENT: return UCharacter.getISOComment(codePoint);\r
-                    case UProperty.LOWERCASE_MAPPING: return UCharacter.toLowerCase(Locale.ENGLISH,UTF16.valueOf(codePoint));\r
-                    case UProperty.NAME: return UCharacter.getName(codePoint);\r
-                    case UProperty.SIMPLE_CASE_FOLDING: return UTF16.valueOf(UCharacter.foldCase(codePoint,true));\r
-                    case UProperty.SIMPLE_LOWERCASE_MAPPING: return UTF16.valueOf(UCharacter.toLowerCase(codePoint));\r
-                    case UProperty.SIMPLE_TITLECASE_MAPPING: return UTF16.valueOf(UCharacter.toTitleCase(codePoint));\r
-                    case UProperty.SIMPLE_UPPERCASE_MAPPING: return UTF16.valueOf(UCharacter.toUpperCase(codePoint));\r
-                    case UProperty.TITLECASE_MAPPING: return UCharacter.toTitleCase(Locale.ENGLISH,UTF16.valueOf(codePoint),null);\r
-                    case UProperty.UNICODE_1_NAME: return UCharacter.getName1_0(codePoint);\r
-                    case UProperty.UPPERCASE_MAPPING: return UCharacter.toUpperCase(Locale.ENGLISH,UTF16.valueOf(codePoint));\r
-                    case NFC: return Normalizer.normalize(codePoint, Normalizer.NFC);\r
-                    case NFD: return Normalizer.normalize(codePoint, Normalizer.NFD);\r
-                    case NFKC: return Normalizer.normalize(codePoint, Normalizer.NFKC);\r
-                    case NFKD: return Normalizer.normalize(codePoint, Normalizer.NFKD);\r
-                    case isNFC: return String.valueOf(Normalizer.normalize(codePoint, Normalizer.NFC).equals(UTF16.valueOf(codePoint)));\r
-                    case isNFD: return String.valueOf(Normalizer.normalize(codePoint, Normalizer.NFD).equals(UTF16.valueOf(codePoint)));\r
-                    case isNFKC: return String.valueOf(Normalizer.normalize(codePoint, Normalizer.NFKC).equals(UTF16.valueOf(codePoint)));\r
-                    case isNFKD: return String.valueOf(Normalizer.normalize(codePoint, Normalizer.NFKD).equals(UTF16.valueOf(codePoint)));\r
-                    case isLowercase: return String.valueOf(UCharacter.toLowerCase(Locale.ENGLISH,UTF16.valueOf(codePoint)).equals(UTF16.valueOf(codePoint)));\r
-                    case isUppercase: return String.valueOf(UCharacter.toUpperCase(Locale.ENGLISH,UTF16.valueOf(codePoint)).equals(UTF16.valueOf(codePoint)));\r
-                    case isTitlecase: return String.valueOf(UCharacter.toTitleCase(Locale.ENGLISH,UTF16.valueOf(codePoint),null).equals(UTF16.valueOf(codePoint)));\r
-                    case isCasefolded: return String.valueOf(UCharacter.foldCase(UTF16.valueOf(codePoint),true).equals(UTF16.valueOf(codePoint)));\r
-                    case isCased: return String.valueOf(UCharacter.toLowerCase(Locale.ENGLISH,UTF16.valueOf(codePoint)).equals(UTF16.valueOf(codePoint)));\r
-                }\r
-                if (propEnum < UProperty.INT_LIMIT) {\r
-                    int enumValue = -1;\r
-                    String value = null;\r
-                    try {\r
-                        enumValue = UCharacter.getIntPropertyValue(codePoint, propEnum);\r
-                        if (enumValue >= 0) value = fixedGetPropertyValueName(propEnum,enumValue, UProperty.NameChoice.LONG);\r
-                    } catch (IllegalArgumentException e) {\r
-                        if (!shownException) {\r
-                            System.out.println("Fail: " + getName() + ", " + Integer.toHexString(codePoint));\r
-                            shownException = true;\r
-                        }\r
-                    }\r
-                    return value != null ? value : String.valueOf(enumValue);\r
-                } else if (propEnum < UProperty.DOUBLE_LIMIT) {\r
-                    double num = UCharacter.getUnicodeNumericValue(codePoint);\r
-                    if (num == UCharacter.NO_NUMERIC_VALUE) return null;\r
-                    return Double.toString(num);\r
-                    // TODO: Fix HACK -- API deficient\r
-                }\r
-                return null;\r
-            }\r
-\r
-            /**\r
-             * @param valueAlias null if unused.\r
-             * @param valueEnum -1 if unused\r
-             * @param nameChoice\r
-             * @return\r
-             */\r
-            private String getFixedValueAlias(String valueAlias, int valueEnum, int nameChoice) {\r
-                if (propEnum >= UProperty.STRING_START) {\r
-                    if (nameChoice != UProperty.NameChoice.LONG) return null;\r
-                    return "<string>";\r
-                } else if (propEnum >= UProperty.DOUBLE_START) {\r
-                    if (nameChoice != UProperty.NameChoice.LONG) return null;\r
-                    return "<number>";\r
-                }\r
-                if (valueAlias != null && !valueAlias.equals("<integer>")) {\r
-                    valueEnum = fixedGetPropertyValueEnum(propEnum,valueAlias);\r
-                }\r
-                // because these are defined badly, there may be no normal (long) name.\r
-                // if there is \r
-                String result = fixedGetPropertyValueName(propEnum, valueEnum, nameChoice);\r
-                if (result != null) return result;\r
-                // HACK try other namechoice\r
-                if (nameChoice == UProperty.NameChoice.LONG) {\r
-                    result = fixedGetPropertyValueName(propEnum,valueEnum, UProperty.NameChoice.SHORT);\r
-                    if (result != null) return result;\r
-                    if (propEnum == UProperty.CANONICAL_COMBINING_CLASS) return null;\r
-                    return "<integer>";\r
-               }\r
-               return null;\r
-            }\r
-\r
-            private static int fixedGetPropertyValueEnum(int propEnum, String valueAlias) {\r
-                try {\r
-                    return UCharacter.getPropertyValueEnum(propEnum, valueAlias);\r
-                } catch (Exception e) {\r
-                    return Integer.parseInt(valueAlias);\r
-                }\r
-            }\r
-    \r
-            static Map fixSkeleton = new HashMap();\r
-            private static String fixedGetPropertyValueName(int propEnum, int valueEnum, int nameChoice) {\r
-                \r
-                try {\r
-                    String value = UCharacter.getPropertyValueName(propEnum,valueEnum,nameChoice);\r
-                    String newValue = (String) fixSkeleton.get(value);\r
-                    if (newValue == null) {\r
-                        newValue = value;\r
-                        if (propEnum == UProperty.JOINING_GROUP) {\r
-                            newValue = newValue.toLowerCase(Locale.ENGLISH);\r
-                        } \r
-                        newValue = regularize(newValue, true);\r
-                        fixSkeleton.put(value, newValue);\r
-                    }\r
-                    return newValue;\r
-                } catch (Exception e) {\r
-                    return null;\r
-                }\r
-            }\r
-\r
-            public List _getNameAliases(List result) {\r
-                if (result == null) result = new ArrayList();\r
-                String alias = String_Extras.get(propEnum);\r
-                if (alias == null) alias = Binary_Extras.get(propEnum);\r
-                if (alias != null) {\r
-                    addUnique(alias, result);\r
-                } else {\r
-                    addUnique(getFixedPropertyName(propEnum, UProperty.NameChoice.SHORT), result);\r
-                    addUnique(getFixedPropertyName(propEnum, UProperty.NameChoice.LONG), result);\r
-                }\r
-                return result;\r
-            }\r
-            \r
-            public String getFixedPropertyName(int propName, int nameChoice) {\r
-                try {\r
-                    return UCharacter.getPropertyName(propEnum, nameChoice);\r
-                } catch (IllegalArgumentException e) {\r
-                    return null;\r
-                }\r
-            }\r
-\r
-            private Map cccHack = new HashMap();\r
-            boolean needCccHack = true;\r
-            \r
-            public List _getAvailableValues(List result) {\r
-                if (result == null) result = new ArrayList();\r
-                if (propEnum == UProperty.AGE) {\r
-                    addAllUnique(getAges(),\r
-                        result);\r
-                    return result;\r
-                }\r
-                if (propEnum < UProperty.INT_LIMIT) {\r
-                    if (Binary_Extras.isInRange(propEnum)) {\r
-                        propEnum = UProperty.BINARY_START; // HACK\r
-                    }\r
-                    int start = UCharacter.getIntPropertyMinValue(propEnum);\r
-                    int end = UCharacter.getIntPropertyMaxValue(propEnum);\r
-                    for (int i = start; i <= end; ++i) {\r
-                        String alias = getFixedValueAlias(null, i, UProperty.NameChoice.LONG);\r
-                        String alias2 = getFixedValueAlias(null, i, UProperty.NameChoice.SHORT);\r
-                        if (alias == null) {\r
-                            alias = alias2;\r
-                            if (alias == null && propEnum == UProperty.CANONICAL_COMBINING_CLASS) {\r
-                                alias = String.valueOf(i);\r
-                            }\r
-                        }\r
-                        if (needCccHack && propEnum == UProperty.CANONICAL_COMBINING_CLASS) { // HACK\r
-                            cccHack.put(alias, String.valueOf(i));\r
-                        }\r
-                        //System.out.println(propertyAlias + "\t" + i + ":\t" + alias);\r
-                        addUnique(alias, result);\r
-                    }\r
-                    needCccHack = false;\r
-                } else {\r
-                    String alias = getFixedValueAlias(null, -1,UProperty.NameChoice.LONG);\r
-                    addUnique(alias, result);\r
-                }\r
-                return result;\r
-            }\r
-\r
-            static String[] AGES = null;\r
-            private String[] getAges() {\r
-                if (AGES == null) {\r
-                  Set ages = new TreeSet();\r
-                  for (int i = 0; i < 0x10FFFF; ++i) {\r
-                    VersionInfo age = UCharacter.getAge(i);\r
-                    ages.add(age.toString());\r
-                  }\r
-                  AGES = (String[]) ages.toArray(new String[ages.size()]);\r
-                }\r
-                return AGES;\r
-            }\r
-\r
-            public List _getValueAliases(String valueAlias, List result) {\r
-                if (result == null) result = new ArrayList();\r
-                if (propEnum == UProperty.AGE) {\r
-                    addUnique(valueAlias, result);\r
-                    return result;\r
-                }\r
-                if (propEnum == UProperty.CANONICAL_COMBINING_CLASS) {\r
-                    addUnique(cccHack.get(valueAlias), result); // add number\r
-                }\r
-                addUnique(getFixedValueAlias(valueAlias, -1, UProperty.NameChoice.SHORT), result);\r
-                addUnique(getFixedValueAlias(valueAlias, -1, UProperty.NameChoice.LONG), result);\r
-                return result;\r
-            }\r
-\r
-\r
-            /* (non-Javadoc)\r
-             * @see com.ibm.icu.dev.test.util.UnicodePropertySource#getPropertyType()\r
-             */\r
-            private int internalGetPropertyType(int prop) {\r
-                switch(prop) {\r
-                    case UProperty.AGE: \r
-                    case UProperty.BLOCK: \r
-                    case UProperty.SCRIPT: \r
-                        return UnicodeProperty.CATALOG;\r
-                    case UProperty.ISO_COMMENT:\r
-                    case UProperty.NAME:\r
-                    case UProperty.UNICODE_1_NAME: \r
-                        return UnicodeProperty.MISC;\r
-                    case UProperty.BIDI_MIRRORING_GLYPH:\r
-                    case UProperty.CASE_FOLDING:\r
-                    case UProperty.LOWERCASE_MAPPING:\r
-                    case UProperty.SIMPLE_CASE_FOLDING: \r
-                    case UProperty.SIMPLE_LOWERCASE_MAPPING:\r
-                    case UProperty.SIMPLE_TITLECASE_MAPPING: \r
-                    case UProperty.SIMPLE_UPPERCASE_MAPPING:\r
-                    case UProperty.TITLECASE_MAPPING: \r
-                    case UProperty.UPPERCASE_MAPPING: \r
-                        return UnicodeProperty.EXTENDED_STRING;\r
-                }\r
-                if (prop < UProperty.BINARY_START) return UnicodeProperty.UNKNOWN;\r
-                if (prop < UProperty.BINARY_LIMIT) return UnicodeProperty.BINARY;\r
-                if (prop < UProperty.INT_START) return UnicodeProperty.EXTENDED_BINARY;\r
-                if (prop < UProperty.INT_LIMIT) return UnicodeProperty.ENUMERATED;\r
-                if (prop < UProperty.DOUBLE_START) return UnicodeProperty.EXTENDED_ENUMERATED;\r
-                if (prop < UProperty.DOUBLE_LIMIT) return UnicodeProperty.NUMERIC;\r
-                if (prop < UProperty.STRING_START) return UnicodeProperty.EXTENDED_NUMERIC;\r
-                if (prop < UProperty.STRING_LIMIT) return UnicodeProperty.STRING;\r
-                return UnicodeProperty.EXTENDED_STRING;\r
-            }\r
-\r
-            /* (non-Javadoc)\r
-             * @see com.ibm.icu.dev.test.util.UnicodeProperty#getVersion()\r
-             */\r
-            public String _getVersion() {\r
-                return VersionInfo.ICU_VERSION.toString();\r
-            }\r
-        }\r
-\r
-        /*{\r
-            matchIterator = new UnicodeSetIterator(\r
-                new UnicodeSet("[^[:Cn:]-[:Default_Ignorable_Code_Point:]]"));\r
-        }*/\r
-\r
-\r
-        \r
-        /*\r
-         * Other Missing Functions:\r
-            Expands_On_NFC\r
-            Expands_On_NFD\r
-            Expands_On_NFKC\r
-            Expands_On_NFKD\r
-            Composition_Exclusion\r
-            Decomposition_Mapping\r
-            FC_NFKC_Closure\r
-            ISO_Comment\r
-            NFC_Quick_Check\r
-            NFD_Quick_Check\r
-            NFKC_Quick_Check\r
-            NFKD_Quick_Check\r
-            Special_Case_Condition\r
-            Unicode_Radical_Stroke\r
-         */\r
-        \r
-         static final Names Binary_Extras = new Names(UProperty.BINARY_LIMIT,\r
-            new String[] {\r
-            "isNFC", "isNFD", "isNFKC", "isNFKD",\r
-            "isLowercase", "isUppercase", "isTitlecase", "isCasefolded", "isCased",\r
-        });\r
-\r
-        static final Names String_Extras = new Names(UProperty.STRING_LIMIT,\r
-            new String[] {\r
-            "toNFC", "toNFD", "toNFKC", "toNKFD",\r
-        });\r
-\r
-        static final int\r
-            isNFC = UProperty.BINARY_LIMIT,\r
-            isNFD = UProperty.BINARY_LIMIT+1,\r
-            isNFKC = UProperty.BINARY_LIMIT+2,\r
-            isNFKD = UProperty.BINARY_LIMIT+3,\r
-            isLowercase = UProperty.BINARY_LIMIT+4,\r
-            isUppercase = UProperty.BINARY_LIMIT+5,\r
-            isTitlecase = UProperty.BINARY_LIMIT+6,\r
-            isCasefolded = UProperty.BINARY_LIMIT+7,\r
-            isCased = UProperty.BINARY_LIMIT+8,\r
-\r
-            NFC  = UProperty.STRING_LIMIT,\r
-            NFD  = UProperty.STRING_LIMIT+1,\r
-            NFKC = UProperty.STRING_LIMIT+2,\r
-            NFKD = UProperty.STRING_LIMIT+3\r
-            ;\r
-        \r
-        private ICUPropertyFactory() {\r
-            Collection c = getInternalAvailablePropertyAliases(new ArrayList());\r
-            Iterator it = c.iterator();\r
-            while (it.hasNext()) {\r
-                add(getInternalProperty((String)it.next()));\r
-            }\r
-        }\r
-        \r
-        private static ICUPropertyFactory singleton = null;\r
-        \r
-        public static synchronized ICUPropertyFactory make() {\r
-            if (singleton != null) return singleton;\r
-            singleton = new ICUPropertyFactory();\r
-            return singleton;\r
-        }\r
-        \r
-        public List getInternalAvailablePropertyAliases(List result) {\r
-            int[][] ranges = {\r
-                {UProperty.BINARY_START,    UProperty.BINARY_LIMIT},\r
-                {UProperty.INT_START,       UProperty.INT_LIMIT},\r
-                {UProperty.DOUBLE_START,    UProperty.DOUBLE_LIMIT},\r
-                {UProperty.STRING_START,    UProperty.STRING_LIMIT},\r
-            };\r
-            for (int i = 0; i < ranges.length; ++i) {\r
-                for (int j = ranges[i][0]; j < ranges[i][1]; ++j) {\r
-                    String alias = UCharacter.getPropertyName(j, UProperty.NameChoice.LONG);\r
-                    UnicodeProperty.addUnique(alias, result);\r
-                    if (!result.contains(alias)) result.add(alias);\r
-                }\r
-            }\r
-            result.addAll(String_Extras.getNames());\r
-            result.addAll(Binary_Extras.getNames());\r
-            return result;\r
-        }\r
-       \r
-        public UnicodeProperty getInternalProperty(String propertyAlias) {\r
-            int propEnum;\r
-            main:\r
-            {\r
-                int possibleItem = Binary_Extras.get(propertyAlias);\r
-                if (possibleItem >= 0) {\r
-                    propEnum = possibleItem;\r
-                    break main;\r
-                }\r
-                possibleItem = String_Extras.get(propertyAlias);\r
-                if (possibleItem >= 0) {\r
-                    propEnum = possibleItem;\r
-                    break main;\r
-                }\r
-                propEnum = UCharacter.getPropertyEnum(propertyAlias);\r
-            }\r
-            return new ICUProperty(propertyAlias, propEnum);\r
-        }\r
\r
-        /* (non-Javadoc)\r
-         * @see com.ibm.icu.dev.test.util.UnicodePropertySource#getProperty(java.lang.String)\r
-         */\r
-    // TODO file bug on getPropertyValueName for Canonical_Combining_Class  \r
-    \r
-    public static class Names {\r
-        private String[] names;\r
-        private int base;\r
-        public Names(int base, String[] names) {\r
-            this.base = base;\r
-            this.names = names;\r
-        }\r
-        public int get(String name) {\r
-            for (int i = 0; i < names.length; ++i) {\r
-                if (name.equalsIgnoreCase(names[i])) return base + i;\r
-            }\r
-            return -1;\r
-        }\r
-        public String get(int number) {\r
-            number -= base;\r
-            if (number < 0 || names.length <= number) return null;\r
-            return names[number];\r
-        }\r
-        public boolean isInRange(int number) {\r
-            number -= base;\r
-            return (0 <= number && number < names.length);\r
-        }\r
-        public List getNames() {\r
-            return Arrays.asList(names);\r
-        }\r
-    }\r
-}\r
-//#endif\r
+//##header J2SE15
+//#if defined(FOUNDATION10) || defined(J2SE13)
+//#else
+/*
+ *******************************************************************************
+ * Copyright (C) 2002-2009, International Business Machines Corporation and    *
+ * others. All Rights Reserved.                                                *
+ *******************************************************************************
+ */
+package com.ibm.icu.dev.test.util;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+
+import com.ibm.icu.lang.UCharacter;
+import com.ibm.icu.lang.UProperty;
+import com.ibm.icu.text.Normalizer;
+import com.ibm.icu.text.UTF16;
+import com.ibm.icu.util.VersionInfo;
+
+
+/**
+ * Provides a general interface for Unicode Properties, and
+ * extracting sets based on those values.
+ * @author Davis
+ */
+
+public class ICUPropertyFactory extends UnicodeProperty.Factory {
+        
+    static class ICUProperty extends UnicodeProperty {
+            protected int propEnum = Integer.MIN_VALUE;
+            
+            protected ICUProperty(String propName, int propEnum) {
+                setName(propName);
+                this.propEnum = propEnum;
+                setType(internalGetPropertyType(propEnum));
+            }
+
+            boolean shownException = false;
+            
+            public String _getValue(int codePoint) {
+                switch(propEnum) {
+                    case UProperty.AGE: String temp = UCharacter.getAge(codePoint).toString();
+                        if (temp.equals("0.0.0.0")) return "unassigned";
+                        if (temp.endsWith(".0.0")) return temp.substring(0,temp.length()-4);
+                        return temp;
+                    case UProperty.BIDI_MIRRORING_GLYPH: return UTF16.valueOf(UCharacter.getMirror(codePoint));
+                    case UProperty.CASE_FOLDING: return UCharacter.foldCase(UTF16.valueOf(codePoint),true);
+                    case UProperty.ISO_COMMENT: return UCharacter.getISOComment(codePoint);
+                    case UProperty.LOWERCASE_MAPPING: return UCharacter.toLowerCase(Locale.ENGLISH,UTF16.valueOf(codePoint));
+                    case UProperty.NAME: return UCharacter.getName(codePoint);
+                    case UProperty.SIMPLE_CASE_FOLDING: return UTF16.valueOf(UCharacter.foldCase(codePoint,true));
+                    case UProperty.SIMPLE_LOWERCASE_MAPPING: return UTF16.valueOf(UCharacter.toLowerCase(codePoint));
+                    case UProperty.SIMPLE_TITLECASE_MAPPING: return UTF16.valueOf(UCharacter.toTitleCase(codePoint));
+                    case UProperty.SIMPLE_UPPERCASE_MAPPING: return UTF16.valueOf(UCharacter.toUpperCase(codePoint));
+                    case UProperty.TITLECASE_MAPPING: return UCharacter.toTitleCase(Locale.ENGLISH,UTF16.valueOf(codePoint),null);
+                    case UProperty.UNICODE_1_NAME: return UCharacter.getName1_0(codePoint);
+                    case UProperty.UPPERCASE_MAPPING: return UCharacter.toUpperCase(Locale.ENGLISH,UTF16.valueOf(codePoint));
+                    case NFC: return Normalizer.normalize(codePoint, Normalizer.NFC);
+                    case NFD: return Normalizer.normalize(codePoint, Normalizer.NFD);
+                    case NFKC: return Normalizer.normalize(codePoint, Normalizer.NFKC);
+                    case NFKD: return Normalizer.normalize(codePoint, Normalizer.NFKD);
+                    case isNFC: return String.valueOf(Normalizer.normalize(codePoint, Normalizer.NFC).equals(UTF16.valueOf(codePoint)));
+                    case isNFD: return String.valueOf(Normalizer.normalize(codePoint, Normalizer.NFD).equals(UTF16.valueOf(codePoint)));
+                    case isNFKC: return String.valueOf(Normalizer.normalize(codePoint, Normalizer.NFKC).equals(UTF16.valueOf(codePoint)));
+                    case isNFKD: return String.valueOf(Normalizer.normalize(codePoint, Normalizer.NFKD).equals(UTF16.valueOf(codePoint)));
+                    case isLowercase: return String.valueOf(UCharacter.toLowerCase(Locale.ENGLISH,UTF16.valueOf(codePoint)).equals(UTF16.valueOf(codePoint)));
+                    case isUppercase: return String.valueOf(UCharacter.toUpperCase(Locale.ENGLISH,UTF16.valueOf(codePoint)).equals(UTF16.valueOf(codePoint)));
+                    case isTitlecase: return String.valueOf(UCharacter.toTitleCase(Locale.ENGLISH,UTF16.valueOf(codePoint),null).equals(UTF16.valueOf(codePoint)));
+                    case isCasefolded: return String.valueOf(UCharacter.foldCase(UTF16.valueOf(codePoint),true).equals(UTF16.valueOf(codePoint)));
+                    case isCased: return String.valueOf(UCharacter.toLowerCase(Locale.ENGLISH,UTF16.valueOf(codePoint)).equals(UTF16.valueOf(codePoint)));
+                }
+                if (propEnum < UProperty.INT_LIMIT) {
+                    int enumValue = -1;
+                    String value = null;
+                    try {
+                        enumValue = UCharacter.getIntPropertyValue(codePoint, propEnum);
+                        if (enumValue >= 0) value = fixedGetPropertyValueName(propEnum,enumValue, UProperty.NameChoice.LONG);
+                    } catch (IllegalArgumentException e) {
+                        if (!shownException) {
+                            System.out.println("Fail: " + getName() + ", " + Integer.toHexString(codePoint));
+                            shownException = true;
+                        }
+                    }
+                    return value != null ? value : String.valueOf(enumValue);
+                } else if (propEnum < UProperty.DOUBLE_LIMIT) {
+                    double num = UCharacter.getUnicodeNumericValue(codePoint);
+                    if (num == UCharacter.NO_NUMERIC_VALUE) return null;
+                    return Double.toString(num);
+                    // TODO: Fix HACK -- API deficient
+                }
+                return null;
+            }
+
+            /**
+             * @param valueAlias null if unused.
+             * @param valueEnum -1 if unused
+             * @param nameChoice
+             * @return
+             */
+            private String getFixedValueAlias(String valueAlias, int valueEnum, int nameChoice) {
+                if (propEnum >= UProperty.STRING_START) {
+                    if (nameChoice != UProperty.NameChoice.LONG) return null;
+                    return "<string>";
+                } else if (propEnum >= UProperty.DOUBLE_START) {
+                    if (nameChoice != UProperty.NameChoice.LONG) return null;
+                    return "<number>";
+                }
+                if (valueAlias != null && !valueAlias.equals("<integer>")) {
+                    valueEnum = fixedGetPropertyValueEnum(propEnum,valueAlias);
+                }
+                // because these are defined badly, there may be no normal (long) name.
+                // if there is 
+                String result = fixedGetPropertyValueName(propEnum, valueEnum, nameChoice);
+                if (result != null) return result;
+                // HACK try other namechoice
+                if (nameChoice == UProperty.NameChoice.LONG) {
+                    result = fixedGetPropertyValueName(propEnum,valueEnum, UProperty.NameChoice.SHORT);
+                    if (result != null) return result;
+                    if (propEnum == UProperty.CANONICAL_COMBINING_CLASS) return null;
+                    return "<integer>";
+               }
+               return null;
+            }
+
+            private static int fixedGetPropertyValueEnum(int propEnum, String valueAlias) {
+                try {
+                    return UCharacter.getPropertyValueEnum(propEnum, valueAlias);
+                } catch (Exception e) {
+                    return Integer.parseInt(valueAlias);
+                }
+            }
+    
+            static Map fixSkeleton = new HashMap();
+            private static String fixedGetPropertyValueName(int propEnum, int valueEnum, int nameChoice) {
+                
+                try {
+                    String value = UCharacter.getPropertyValueName(propEnum,valueEnum,nameChoice);
+                    String newValue = (String) fixSkeleton.get(value);
+                    if (newValue == null) {
+                        newValue = value;
+                        if (propEnum == UProperty.JOINING_GROUP) {
+                            newValue = newValue.toLowerCase(Locale.ENGLISH);
+                        } 
+                        newValue = regularize(newValue, true);
+                        fixSkeleton.put(value, newValue);
+                    }
+                    return newValue;
+                } catch (Exception e) {
+                    return null;
+                }
+            }
+
+            public List _getNameAliases(List result) {
+                if (result == null) result = new ArrayList();
+                String alias = String_Extras.get(propEnum);
+                if (alias == null) alias = Binary_Extras.get(propEnum);
+                if (alias != null) {
+                    addUnique(alias, result);
+                } else {
+                    addUnique(getFixedPropertyName(propEnum, UProperty.NameChoice.SHORT), result);
+                    addUnique(getFixedPropertyName(propEnum, UProperty.NameChoice.LONG), result);
+                }
+                return result;
+            }
+            
+            public String getFixedPropertyName(int propName, int nameChoice) {
+                try {
+                    return UCharacter.getPropertyName(propEnum, nameChoice);
+                } catch (IllegalArgumentException e) {
+                    return null;
+                }
+            }
+
+            private Map cccHack = new HashMap();
+            boolean needCccHack = true;
+            
+            public List _getAvailableValues(List result) {
+                if (result == null) result = new ArrayList();
+                if (propEnum == UProperty.AGE) {
+                    addAllUnique(getAges(),
+                        result);
+                    return result;
+                }
+                if (propEnum < UProperty.INT_LIMIT) {
+                    if (Binary_Extras.isInRange(propEnum)) {
+                        propEnum = UProperty.BINARY_START; // HACK
+                    }
+                    int start = UCharacter.getIntPropertyMinValue(propEnum);
+                    int end = UCharacter.getIntPropertyMaxValue(propEnum);
+                    for (int i = start; i <= end; ++i) {
+                        String alias = getFixedValueAlias(null, i, UProperty.NameChoice.LONG);
+                        String alias2 = getFixedValueAlias(null, i, UProperty.NameChoice.SHORT);
+                        if (alias == null) {
+                            alias = alias2;
+                            if (alias == null && propEnum == UProperty.CANONICAL_COMBINING_CLASS) {
+                                alias = String.valueOf(i);
+                            }
+                        }
+                        if (needCccHack && propEnum == UProperty.CANONICAL_COMBINING_CLASS) { // HACK
+                            cccHack.put(alias, String.valueOf(i));
+                        }
+                        //System.out.println(propertyAlias + "\t" + i + ":\t" + alias);
+                        addUnique(alias, result);
+                    }
+                    needCccHack = false;
+                } else {
+                    String alias = getFixedValueAlias(null, -1,UProperty.NameChoice.LONG);
+                    addUnique(alias, result);
+                }
+                return result;
+            }
+
+            static String[] AGES = null;
+            private String[] getAges() {
+                if (AGES == null) {
+                  Set ages = new TreeSet();
+                  for (int i = 0; i < 0x10FFFF; ++i) {
+                    VersionInfo age = UCharacter.getAge(i);
+                    ages.add(age.toString());
+                  }
+                  AGES = (String[]) ages.toArray(new String[ages.size()]);
+                }
+                return AGES;
+            }
+
+            public List _getValueAliases(String valueAlias, List result) {
+                if (result == null) result = new ArrayList();
+                if (propEnum == UProperty.AGE) {
+                    addUnique(valueAlias, result);
+                    return result;
+                }
+                if (propEnum == UProperty.CANONICAL_COMBINING_CLASS) {
+                    addUnique(cccHack.get(valueAlias), result); // add number
+                }
+                addUnique(getFixedValueAlias(valueAlias, -1, UProperty.NameChoice.SHORT), result);
+                addUnique(getFixedValueAlias(valueAlias, -1, UProperty.NameChoice.LONG), result);
+                return result;
+            }
+
+
+            /* (non-Javadoc)
+             * @see com.ibm.icu.dev.test.util.UnicodePropertySource#getPropertyType()
+             */
+            private int internalGetPropertyType(int prop) {
+                switch(prop) {
+                    case UProperty.AGE: 
+                    case UProperty.BLOCK: 
+                    case UProperty.SCRIPT: 
+                        return UnicodeProperty.CATALOG;
+                    case UProperty.ISO_COMMENT:
+                    case UProperty.NAME:
+                    case UProperty.UNICODE_1_NAME: 
+                        return UnicodeProperty.MISC;
+                    case UProperty.BIDI_MIRRORING_GLYPH:
+                    case UProperty.CASE_FOLDING:
+                    case UProperty.LOWERCASE_MAPPING:
+                    case UProperty.SIMPLE_CASE_FOLDING: 
+                    case UProperty.SIMPLE_LOWERCASE_MAPPING:
+                    case UProperty.SIMPLE_TITLECASE_MAPPING: 
+                    case UProperty.SIMPLE_UPPERCASE_MAPPING:
+                    case UProperty.TITLECASE_MAPPING: 
+                    case UProperty.UPPERCASE_MAPPING: 
+                        return UnicodeProperty.EXTENDED_STRING;
+                }
+                if (prop < UProperty.BINARY_START) return UnicodeProperty.UNKNOWN;
+                if (prop < UProperty.BINARY_LIMIT) return UnicodeProperty.BINARY;
+                if (prop < UProperty.INT_START) return UnicodeProperty.EXTENDED_BINARY;
+                if (prop < UProperty.INT_LIMIT) return UnicodeProperty.ENUMERATED;
+                if (prop < UProperty.DOUBLE_START) return UnicodeProperty.EXTENDED_ENUMERATED;
+                if (prop < UProperty.DOUBLE_LIMIT) return UnicodeProperty.NUMERIC;
+                if (prop < UProperty.STRING_START) return UnicodeProperty.EXTENDED_NUMERIC;
+                if (prop < UProperty.STRING_LIMIT) return UnicodeProperty.STRING;
+                return UnicodeProperty.EXTENDED_STRING;
+            }
+
+            /* (non-Javadoc)
+             * @see com.ibm.icu.dev.test.util.UnicodeProperty#getVersion()
+             */
+            public String _getVersion() {
+                return VersionInfo.ICU_VERSION.toString();
+            }
+        }
+
+        /*{
+            matchIterator = new UnicodeSetIterator(
+                new UnicodeSet("[^[:Cn:]-[:Default_Ignorable_Code_Point:]]"));
+        }*/
+
+
+        
+        /*
+         * Other Missing Functions:
+            Expands_On_NFC
+            Expands_On_NFD
+            Expands_On_NFKC
+            Expands_On_NFKD
+            Composition_Exclusion
+            Decomposition_Mapping
+            FC_NFKC_Closure
+            ISO_Comment
+            NFC_Quick_Check
+            NFD_Quick_Check
+            NFKC_Quick_Check
+            NFKD_Quick_Check
+            Special_Case_Condition
+            Unicode_Radical_Stroke
+         */
+        
+         static final Names Binary_Extras = new Names(UProperty.BINARY_LIMIT,
+            new String[] {
+            "isNFC", "isNFD", "isNFKC", "isNFKD",
+            "isLowercase", "isUppercase", "isTitlecase", "isCasefolded", "isCased",
+        });
+
+        static final Names String_Extras = new Names(UProperty.STRING_LIMIT,
+            new String[] {
+            "toNFC", "toNFD", "toNFKC", "toNKFD",
+        });
+
+        static final int
+            isNFC = UProperty.BINARY_LIMIT,
+            isNFD = UProperty.BINARY_LIMIT+1,
+            isNFKC = UProperty.BINARY_LIMIT+2,
+            isNFKD = UProperty.BINARY_LIMIT+3,
+            isLowercase = UProperty.BINARY_LIMIT+4,
+            isUppercase = UProperty.BINARY_LIMIT+5,
+            isTitlecase = UProperty.BINARY_LIMIT+6,
+            isCasefolded = UProperty.BINARY_LIMIT+7,
+            isCased = UProperty.BINARY_LIMIT+8,
+
+            NFC  = UProperty.STRING_LIMIT,
+            NFD  = UProperty.STRING_LIMIT+1,
+            NFKC = UProperty.STRING_LIMIT+2,
+            NFKD = UProperty.STRING_LIMIT+3
+            ;
+        
+        private ICUPropertyFactory() {
+            Collection c = getInternalAvailablePropertyAliases(new ArrayList());
+            Iterator it = c.iterator();
+            while (it.hasNext()) {
+                add(getInternalProperty((String)it.next()));
+            }
+        }
+        
+        private static ICUPropertyFactory singleton = null;
+        
+        public static synchronized ICUPropertyFactory make() {
+            if (singleton != null) return singleton;
+            singleton = new ICUPropertyFactory();
+            return singleton;
+        }
+        
+        public List getInternalAvailablePropertyAliases(List result) {
+            int[][] ranges = {
+                {UProperty.BINARY_START,    UProperty.BINARY_LIMIT},
+                {UProperty.INT_START,       UProperty.INT_LIMIT},
+                {UProperty.DOUBLE_START,    UProperty.DOUBLE_LIMIT},
+                {UProperty.STRING_START,    UProperty.STRING_LIMIT},
+            };
+            for (int i = 0; i < ranges.length; ++i) {
+                for (int j = ranges[i][0]; j < ranges[i][1]; ++j) {
+                    String alias = UCharacter.getPropertyName(j, UProperty.NameChoice.LONG);
+                    UnicodeProperty.addUnique(alias, result);
+                    if (!result.contains(alias)) result.add(alias);
+                }
+            }
+            result.addAll(String_Extras.getNames());
+            result.addAll(Binary_Extras.getNames());
+            return result;
+        }
+       
+        public UnicodeProperty getInternalProperty(String propertyAlias) {
+            int propEnum;
+            main:
+            {
+                int possibleItem = Binary_Extras.get(propertyAlias);
+                if (possibleItem >= 0) {
+                    propEnum = possibleItem;
+                    break main;
+                }
+                possibleItem = String_Extras.get(propertyAlias);
+                if (possibleItem >= 0) {
+                    propEnum = possibleItem;
+                    break main;
+                }
+                propEnum = UCharacter.getPropertyEnum(propertyAlias);
+            }
+            return new ICUProperty(propertyAlias, propEnum);
+        }
+        /* (non-Javadoc)
+         * @see com.ibm.icu.dev.test.util.UnicodePropertySource#getProperty(java.lang.String)
+         */
+    // TODO file bug on getPropertyValueName for Canonical_Combining_Class  
+    
+    public static class Names {
+        private String[] names;
+        private int base;
+        public Names(int base, String[] names) {
+            this.base = base;
+            this.names = names;
+        }
+        public int get(String name) {
+            for (int i = 0; i < names.length; ++i) {
+                if (name.equalsIgnoreCase(names[i])) return base + i;
+            }
+            return -1;
+        }
+        public String get(int number) {
+            number -= base;
+            if (number < 0 || names.length <= number) return null;
+            return names[number];
+        }
+        public boolean isInRange(int number) {
+            number -= base;
+            return (0 <= number && number < names.length);
+        }
+        public List getNames() {
+            return Arrays.asList(names);
+        }
+    }
+}
+//#endif