-//##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