1aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin/* GENERATED SOURCE. DO NOT MODIFY. */
2aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin/*
3aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin *******************************************************************************
4aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * Copyright (C) 2002-2012, International Business Machines Corporation and    *
5aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * others. All Rights Reserved.                                                *
6aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin *******************************************************************************
7aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */
8aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinpackage android.icu.dev.util;
9aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
10aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.ArrayList;
11aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.Arrays;
12aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.BitSet;
13aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.Collection;
14aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.HashMap;
15aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.HashSet;
16aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.Iterator;
17aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.List;
18aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.Locale;
19aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.Map;
20aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.Set;
21aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.TreeMap;
22aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.TreeSet;
23aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
24aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.lang.UCharacter;
25aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.lang.UProperty;
26aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.lang.UScript;
27aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.text.Normalizer;
28aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.text.UTF16;
29aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.util.VersionInfo;
30aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
31aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
32aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin/**
33aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * Provides a general interface for Unicode Properties, and
34aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * extracting sets based on those values.
35aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * @author Davis
36aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */
37aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
38aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinpublic class ICUPropertyFactory extends UnicodeProperty.Factory {
39aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
40aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    static class ICUProperty extends UnicodeProperty {
41aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        protected int propEnum = Integer.MIN_VALUE;
42aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
43aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        protected ICUProperty(String propName, int propEnum) {
44aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            setName(propName);
45aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            this.propEnum = propEnum;
46aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            setType(internalGetPropertyType(propEnum));
47aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (propEnum == UProperty.DEFAULT_IGNORABLE_CODE_POINT || propEnum == UProperty.BIDI_CLASS || propEnum == UProperty.GENERAL_CATEGORY) {
48aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                setUniformUnassigned(false);
49aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            } else {
50aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                setUniformUnassigned(true);
51aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
52aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
53aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
54aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        boolean shownException = false;
55aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
56aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        public String _getValue(int codePoint) {
57aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            switch (propEnum) {
58aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            case UProperty.AGE:
59aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return getAge(codePoint);
60aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            case UProperty.BIDI_MIRRORING_GLYPH:
61aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return UTF16.valueOf(UCharacter.getMirror(codePoint));
62aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            case UProperty.CASE_FOLDING:
63aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return UCharacter.foldCase(UTF16.valueOf(codePoint), true);
64aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            case UProperty.ISO_COMMENT:
65aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return UCharacter.getISOComment(codePoint);
66aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            case UProperty.LOWERCASE_MAPPING:
67aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return UCharacter.toLowerCase(Locale.ENGLISH, UTF16.valueOf(codePoint));
68aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            case UProperty.NAME:
69aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return UCharacter.getName(codePoint);
70aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            case UProperty.SIMPLE_CASE_FOLDING:
71aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return UTF16.valueOf(UCharacter.foldCase(codePoint, true));
72aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            case UProperty.SIMPLE_LOWERCASE_MAPPING:
73aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return UTF16.valueOf(UCharacter.toLowerCase(codePoint));
74aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            case UProperty.SIMPLE_TITLECASE_MAPPING:
75aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return UTF16.valueOf(UCharacter.toTitleCase(codePoint));
76aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            case UProperty.SIMPLE_UPPERCASE_MAPPING:
77aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return UTF16.valueOf(UCharacter.toUpperCase(codePoint));
78aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            case UProperty.TITLECASE_MAPPING:
79aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return UCharacter.toTitleCase(Locale.ENGLISH, UTF16.valueOf(codePoint), null);
80aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            case UProperty.UNICODE_1_NAME:
81aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return UCharacter.getName1_0(codePoint);
82aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            case UProperty.UPPERCASE_MAPPING:
83aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return UCharacter.toUpperCase(Locale.ENGLISH, UTF16.valueOf(codePoint));
84aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            // case NFC: return Normalizer.normalize(codePoint, Normalizer.NFC);
85aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            // case NFD: return Normalizer.normalize(codePoint, Normalizer.NFD);
86aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            // case NFKC: return Normalizer.normalize(codePoint, Normalizer.NFKC);
87aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            // case NFKD: return Normalizer.normalize(codePoint, Normalizer.NFKD);
88aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            case isNFC:
89aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return String.valueOf(Normalizer.normalize(codePoint, Normalizer.NFC).equals(UTF16.valueOf(codePoint)));
90aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            case isNFD:
91aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return String.valueOf(Normalizer.normalize(codePoint, Normalizer.NFD).equals(UTF16.valueOf(codePoint)));
92aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            case isNFKC:
93aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return String
94aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        .valueOf(Normalizer.normalize(codePoint, Normalizer.NFKC).equals(UTF16.valueOf(codePoint)));
95aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            case isNFKD:
96aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return String
97aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        .valueOf(Normalizer.normalize(codePoint, Normalizer.NFKD).equals(UTF16.valueOf(codePoint)));
98aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            case isLowercase:
99aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return String.valueOf(UCharacter.toLowerCase(Locale.ENGLISH, UTF16.valueOf(codePoint)).equals(
100aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        UTF16.valueOf(codePoint)));
101aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            case isUppercase:
102aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return String.valueOf(UCharacter.toUpperCase(Locale.ENGLISH, UTF16.valueOf(codePoint)).equals(
103aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        UTF16.valueOf(codePoint)));
104aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            case isTitlecase:
105aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return String.valueOf(UCharacter.toTitleCase(Locale.ENGLISH, UTF16.valueOf(codePoint), null).equals(
106aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        UTF16.valueOf(codePoint)));
107aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            case isCasefolded:
108aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return String.valueOf(UCharacter.foldCase(UTF16.valueOf(codePoint), true).equals(
109aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        UTF16.valueOf(codePoint)));
110aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            case isCased:
111aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return String.valueOf(UCharacter.toLowerCase(Locale.ENGLISH, UTF16.valueOf(codePoint)).equals(
112aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        UTF16.valueOf(codePoint)));
113aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            case UProperty.SCRIPT_EXTENSIONS:
114aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return getStringScriptExtensions(codePoint);
115aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
116aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (propEnum < UProperty.INT_LIMIT) {
117aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                int enumValue = -1;
118aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                String value = null;
119aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                try {
120aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    enumValue = UCharacter.getIntPropertyValue(codePoint, propEnum);
121aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    if (enumValue >= 0)
122aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        value = fixedGetPropertyValueName(propEnum, enumValue, UProperty.NameChoice.LONG);
123aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                } catch (IllegalArgumentException e) {
124aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    if (!shownException) {
125aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        System.out.println("Fail: " + getName() + ", " + Integer.toHexString(codePoint));
126aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        shownException = true;
127aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    }
128aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
129aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return value != null ? value : String.valueOf(enumValue);
130aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            } else if (propEnum < UProperty.DOUBLE_LIMIT) {
131aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                double num = UCharacter.getUnicodeNumericValue(codePoint);
132aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if (num == UCharacter.NO_NUMERIC_VALUE)
133aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    return null;
134aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return Double.toString(num);
135aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                // TODO: Fix HACK -- API deficient
136aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
137aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return null;
138aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
139aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
140aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        private String getAge(int codePoint) {
141aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            String temp = UCharacter.getAge(codePoint).toString();
142aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (temp.equals("0.0.0.0"))
143aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return "unassigned";
144aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (temp.endsWith(".0.0"))
145aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return temp.substring(0, temp.length() - 4);
146aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return temp;
147aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
148aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
149aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /**
150aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         * @param valueAlias null if unused.
151aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         * @param valueEnum -1 if unused
152aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         * @param nameChoice
153aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         * @return
154aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         */
155aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        private String getFixedValueAlias(String valueAlias, int valueEnum, int nameChoice) {
156aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (propEnum >= UProperty.STRING_START) {
157aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if (nameChoice > UProperty.NameChoice.LONG)
158aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    throw new IllegalArgumentException();
159aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if (nameChoice != UProperty.NameChoice.LONG)
160aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    return null;
161aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return "<string>";
162aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            } else if (propEnum >= UProperty.DOUBLE_START) {
163aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if (nameChoice > UProperty.NameChoice.LONG)
164aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    throw new IllegalArgumentException();
165aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if (nameChoice != UProperty.NameChoice.LONG)
166aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    return null;
167aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return "<number>";
168aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
169aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (valueAlias != null && !valueAlias.equals("<integer>")) {
170aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                valueEnum = fixedGetPropertyValueEnum(propEnum, valueAlias);
171aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
172aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            // because these are defined badly, there may be no normal (long) name.
173aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            // if there is
174aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            String result = fixedGetPropertyValueName(propEnum, valueEnum, nameChoice);
175aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (result != null)
176aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return result;
177aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            // HACK try other namechoice
178aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (nameChoice == UProperty.NameChoice.LONG) {
179aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                result = fixedGetPropertyValueName(propEnum, valueEnum, UProperty.NameChoice.SHORT);
180aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if (result != null)
181aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    return result;
182aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if (isCombiningClassProperty())
183aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    return null;
184aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return "<integer>";
185aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
186aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return null;
187aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
188aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
189aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        public boolean isCombiningClassProperty() {
190aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return (propEnum == UProperty.CANONICAL_COMBINING_CLASS
191aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    || propEnum == UProperty.LEAD_CANONICAL_COMBINING_CLASS
192aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    || propEnum == UProperty.TRAIL_CANONICAL_COMBINING_CLASS);
193aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
194aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
195aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        private static int fixedGetPropertyValueEnum(int propEnum, String valueAlias) {
196aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            try {
197aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if (propEnum < BINARY_LIMIT) {
198aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    propEnum = UProperty.ALPHABETIC;
199aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
200aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return UCharacter.getPropertyValueEnum(propEnum, valueAlias);
201aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            } catch (Exception e) {
202aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return Integer.parseInt(valueAlias);
203aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
204aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
205aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
206aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        static Map fixSkeleton = new HashMap();
207aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
208aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        private static String fixedGetPropertyValueName(int propEnum, int valueEnum, int nameChoice) {
209aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            String value = UCharacter.getPropertyValueName(propEnum, valueEnum, nameChoice);
210aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            String newValue = (String) fixSkeleton.get(value);
211aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (newValue == null) {
212aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                newValue = value;
213aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if (propEnum == UProperty.JOINING_GROUP) {
214aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    newValue = newValue == null ? null : newValue.toLowerCase(Locale.ENGLISH);
215aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
216aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                newValue = regularize(newValue, true);
217aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                fixSkeleton.put(value, newValue);
218aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
219aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return newValue;
220aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
221aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
222aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        public List _getNameAliases(List result) {
223aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (result == null)
224aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                result = new ArrayList();
225aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            // String alias = String_Extras.get(propEnum);
226aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            // if (alias == null)
227aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            String alias = Binary_Extras.get(propEnum);
228aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (alias != null) {
229aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                addUnique(alias, result);
230aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            } else {
231aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                addUnique(getFixedPropertyName(propEnum, UProperty.NameChoice.SHORT), result);
232aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                addUnique(getFixedPropertyName(propEnum, UProperty.NameChoice.LONG), result);
233aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
234aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return result;
235aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
236aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
237aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        public String getFixedPropertyName(int propName, int nameChoice) {
238aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            try {
239aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return UCharacter.getPropertyName(propEnum, nameChoice);
240aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            } catch (IllegalArgumentException e) {
241aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return null;
242aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
243aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
244aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
245aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        private static Map cccHack = new HashMap();
246aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        private static Set cccExtras = new HashSet();
247aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        static {
248aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            for (int i = 0; i <= 255; ++i) {
249aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                String alias = UCharacter.getPropertyValueName(UProperty.CANONICAL_COMBINING_CLASS, i,
250aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        UProperty.NameChoice.LONG);
251aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                String numStr = String.valueOf(i);
252aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if (alias != null) {
253aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    cccHack.put(alias, numStr);
254aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                } else {
255aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    cccHack.put(numStr, numStr);
256aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    cccExtras.add(numStr);
257aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
258aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
259aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
260aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
261aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        public List _getAvailableValues(List result) {
262aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (result == null)
263aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                result = new ArrayList();
264aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (propEnum == UProperty.AGE) {
265aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                addAllUnique(getAges(), result);
266aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return result;
267aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
268aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
269aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (propEnum < UProperty.INT_LIMIT) {
270aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if (Binary_Extras.isInRange(propEnum)) {
271aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    propEnum = UProperty.BINARY_START; // HACK
272aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
273aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                int start = UCharacter.getIntPropertyMinValue(propEnum);
274aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                int end = UCharacter.getIntPropertyMaxValue(propEnum);
275aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                for (int i = start; i <= end; ++i) {
276aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    String alias = getFixedValueAlias(null, i, UProperty.NameChoice.LONG);
277aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    String alias2 = getFixedValueAlias(null, i, UProperty.NameChoice.SHORT);
278aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    if (alias == null) {
279aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        alias = alias2;
280aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        if (alias == null && isCombiningClassProperty()) {
281aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                            alias = String.valueOf(i);
282aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        }
283aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    }
284aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    // System.out.println(propertyAlias + "\t" + i + ":\t" + alias);
285aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    addUnique(alias, result);
286aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
287aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            } else if (propEnum >= UProperty.DOUBLE_START && propEnum < UProperty.DOUBLE_LIMIT) {
288aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                UnicodeMap map = getUnicodeMap();
289aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                Collection values = map.values();
290aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                addAllUnique(values, result);
291aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            } else {
292aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                String alias = getFixedValueAlias(null, -1, UProperty.NameChoice.LONG);
293aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                addUnique(alias, result);
294aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
295aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return result;
296aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
297aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
298aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        static String[] AGES = null;
299aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
300aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        private String[] getAges() {
301aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (AGES == null) {
302aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                Set ages = new TreeSet();
303aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                for (int i = 0; i < 0x10FFFF; ++i) {
304aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    ages.add(getAge(i));
305aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
306aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                AGES = (String[]) ages.toArray(new String[ages.size()]);
307aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
308aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return AGES;
309aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
310aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
311aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        public List _getValueAliases(String valueAlias, List result) {
312aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (result == null)
313aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                result = new ArrayList();
314aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (propEnum == UProperty.AGE) {
315aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                addUnique(valueAlias, result);
316aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return result;
317aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
318aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (isCombiningClassProperty()) {
319aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                addUnique(cccHack.get(valueAlias), result); // add number
320aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
321aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            int type = getType();
322aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (type == UnicodeProperty.NUMERIC || type == EXTENDED_NUMERIC) {
323aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                addUnique(valueAlias, result);
324aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if (valueAlias.endsWith(".0")) {
325aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    addUnique(valueAlias.substring(0, valueAlias.length() - 2), result);
326aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
327aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            } else {
328aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                for (int nameChoice = UProperty.NameChoice.SHORT;; ++nameChoice) {
329aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    try {
330aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        addUnique(getFixedValueAlias(valueAlias, -1, nameChoice), result);
331aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    } catch (Exception e) {
332aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        break;
333aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    }
334aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
335aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
336aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return result;
337aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
338aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
339aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* (non-Javadoc)
340aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         * @see android.icu.dev.test.util.UnicodePropertySource#getPropertyType()
341aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         */
342aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        private int internalGetPropertyType(int prop) {
343aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            switch (prop) {
344aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            case UProperty.AGE:
345aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            case UProperty.BLOCK:
346aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            case UProperty.SCRIPT:
347aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return UnicodeProperty.CATALOG;
348aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            case UProperty.ISO_COMMENT:
349aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            case UProperty.NAME:
350aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            case UProperty.UNICODE_1_NAME:
351aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            case UProperty.SCRIPT_EXTENSIONS:
352aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return UnicodeProperty.MISC;
353aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            case UProperty.BIDI_MIRRORING_GLYPH:
354aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            case UProperty.CASE_FOLDING:
355aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            case UProperty.LOWERCASE_MAPPING:
356aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            case UProperty.SIMPLE_CASE_FOLDING:
357aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            case UProperty.SIMPLE_LOWERCASE_MAPPING:
358aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            case UProperty.SIMPLE_TITLECASE_MAPPING:
359aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            case UProperty.SIMPLE_UPPERCASE_MAPPING:
360aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            case UProperty.TITLECASE_MAPPING:
361aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            case UProperty.UPPERCASE_MAPPING:
362aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return UnicodeProperty.EXTENDED_STRING;
363aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
364aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (prop < UProperty.BINARY_START)
365aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return UnicodeProperty.UNKNOWN;
366aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (prop < UProperty.BINARY_LIMIT)
367aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return UnicodeProperty.BINARY;
368aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (prop < UProperty.INT_START)
369aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return UnicodeProperty.EXTENDED_BINARY;
370aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (prop < UProperty.INT_LIMIT)
371aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return UnicodeProperty.ENUMERATED;
372aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (prop < UProperty.DOUBLE_START)
373aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return UnicodeProperty.EXTENDED_ENUMERATED;
374aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (prop < UProperty.DOUBLE_LIMIT)
375aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return UnicodeProperty.NUMERIC;
376aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (prop < UProperty.STRING_START)
377aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return UnicodeProperty.EXTENDED_NUMERIC;
378aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (prop < UProperty.STRING_LIMIT)
379aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return UnicodeProperty.STRING;
380aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return UnicodeProperty.EXTENDED_STRING;
381aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
382aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
383aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /*
384aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         * (non-Javadoc)
385aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         *
386aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         * @see android.icu.dev.test.util.UnicodeProperty#getVersion()
387aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         */
388aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        public String _getVersion() {
389aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return VersionInfo.ICU_VERSION.toString();
390aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
391aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
392aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
393aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin  /*{
394aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            matchIterator = new UnicodeSetIterator(
395aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                new UnicodeSet("[^[:Cn:]-[:Default_Ignorable_Code_Point:]]"));
396aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }*/
397aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
398aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
399aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
400aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /*
401aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     * Other Missing Functions:
402aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            Expands_On_NFC
403aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            Expands_On_NFD
404aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            Expands_On_NFKC
405aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            Expands_On_NFKD
406aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            Composition_Exclusion
407aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            Decomposition_Mapping
408aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            FC_NFKC_Closure
409aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            ISO_Comment
410aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            NFC_Quick_Check
411aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            NFD_Quick_Check
412aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            NFKC_Quick_Check
413aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            NFKD_Quick_Check
414aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            Special_Case_Condition
415aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            Unicode_Radical_Stroke
416aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     */
417aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
418aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    static final Names Binary_Extras = new Names(UProperty.BINARY_LIMIT,
419aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin          new String[] {
420aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin          "isNFC", "isNFD", "isNFKC", "isNFKD",
421aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin          "isLowercase", "isUppercase", "isTitlecase", "isCasefolded", "isCased",
422aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    });
423aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
424aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin//    static final Names String_Extras = new Names(UProperty.STRING_LIMIT,
425aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin//          new String[] {
426aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin//          "toNFC", "toNFD", "toNFKC", "toNKFD",
427aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin//    });
428aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
429aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    static final int
430aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        isNFC = UProperty.BINARY_LIMIT,
431aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        isNFD = UProperty.BINARY_LIMIT+1,
432aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        isNFKC = UProperty.BINARY_LIMIT+2,
433aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        isNFKD = UProperty.BINARY_LIMIT+3,
434aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        isLowercase = UProperty.BINARY_LIMIT+4,
435aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        isUppercase = UProperty.BINARY_LIMIT+5,
436aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        isTitlecase = UProperty.BINARY_LIMIT+6,
437aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        isCasefolded = UProperty.BINARY_LIMIT+7,
438aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        isCased = UProperty.BINARY_LIMIT+8,
439aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        BINARY_LIMIT = UProperty.BINARY_LIMIT+9
440aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
441aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin//        NFC  = UProperty.STRING_LIMIT,
442aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin//        NFD  = UProperty.STRING_LIMIT+1,
443aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin//        NFKC = UProperty.STRING_LIMIT+2,
444aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin//        NFKD = UProperty.STRING_LIMIT+3
445aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        ;
446aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
447aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    protected ICUPropertyFactory() {
448aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Collection c = getInternalAvailablePropertyAliases(new ArrayList());
449aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Iterator it = c.iterator();
450aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        while (it.hasNext()) {
451aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            add(getInternalProperty((String) it.next()));
452aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
453aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
454aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
455aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    static BitSet BITSET = new BitSet();
456aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public static synchronized String getStringScriptExtensions(int codePoint) {
457aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int result = UScript.getScriptExtensions(codePoint, BITSET);
458aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (result >= 0) {
459aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return UScript.getName(result);
460aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
461aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        TreeMap<String,String> sorted = new TreeMap<String,String>();
462aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int scriptCode = BITSET.nextSetBit(0); scriptCode >= 0; scriptCode = BITSET.nextSetBit(scriptCode+1)) {
463aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            // sort by short form
464aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            sorted.put(UScript.getShortName(scriptCode), UScript.getName(scriptCode));
465aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
466aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        return CollectionUtilities.join(sorted.values(), " ");
467aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
468aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
469aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    private static ICUPropertyFactory singleton = null;
470aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
471aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public static synchronized ICUPropertyFactory make() {
472aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (singleton != null)
473aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return singleton;
474aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        singleton = new ICUPropertyFactory();
475aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        return singleton;
476aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
477aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
478aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public List getInternalAvailablePropertyAliases(List result) {
479aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int[][] ranges = {
480aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {UProperty.BINARY_START,    UProperty.BINARY_LIMIT},
481aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {UProperty.INT_START,       UProperty.INT_LIMIT},
482aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {UProperty.DOUBLE_START,    UProperty.DOUBLE_LIMIT},
483aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {UProperty.STRING_START,    UProperty.STRING_LIMIT},
484aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                {UProperty.OTHER_PROPERTY_START, UProperty.OTHER_PROPERTY_LIMIT},
485aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
486aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
487aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int i = 0; i < ranges.length; ++i) {
488aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            for (int j = ranges[i][0]; j < ranges[i][1]; ++j) {
489aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                String alias = UCharacter.getPropertyName(j, UProperty.NameChoice.LONG);
490aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                UnicodeProperty.addUnique(alias, result);
491aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if (!result.contains(alias))
492aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    result.add(alias);
493aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
494aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
495aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // result.addAll(String_Extras.getNames());
496aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        result.addAll(Binary_Extras.getNames());
497aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        return result;
498aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
499aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
500aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public UnicodeProperty getInternalProperty(String propertyAlias) {
501aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int propEnum;
502aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        main: {
503aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            int possibleItem = Binary_Extras.get(propertyAlias);
504aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (possibleItem >= 0) {
505aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                propEnum = possibleItem;
506aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                break main;
507aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
508aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            // possibleItem = String_Extras.get(propertyAlias);
509aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            // if (possibleItem >= 0) {
510aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            // propEnum = possibleItem;
511aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            // break main;
512aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            // }
513aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            propEnum = UCharacter.getPropertyEnum(propertyAlias);
514aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
515aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        return new ICUProperty(propertyAlias, propEnum);
516aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
517aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
518aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /*
519aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     * (non-Javadoc)
520aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     *
521aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     * @see android.icu.dev.test.util.UnicodePropertySource#getProperty(java.lang.String)
522aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     */
523aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // TODO file bug on getPropertyValueName for Canonical_Combining_Class
524aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public static class Names {
525aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        private String[] names;
526aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        private int base;
527aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
528aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        public Names(int base, String[] names) {
529aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            this.base = base;
530aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            this.names = names;
531aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
532aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
533aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        public int get(String name) {
534aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            for (int i = 0; i < names.length; ++i) {
535aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if (name.equalsIgnoreCase(names[i]))
536aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    return base + i;
537aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
538aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return -1;
539aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
540aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
541aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        public String get(int number) {
542aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            number -= base;
543aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (number < 0 || names.length <= number)
544aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return null;
545aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return names[number];
546aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
547aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
548aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        public boolean isInRange(int number) {
549aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            number -= base;
550aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return (0 <= number && number < names.length);
551aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
552aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
553aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        public List getNames() {
554aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return Arrays.asList(names);
555aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
556aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
557aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin}
558