[Unicode]   Common Locale Data Repository : Bug Tracking Home | Site Map | Search
 

Changeset 9504


Ignore:
Timestamp:
11/12/13 21:14:27 (5 years ago)
Author:
markdavis
Message:

cldrbug 6426: misc changes connected with the DtdData cleanup

Location:
trunk/tools/java/org/unicode/cldr
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/tools/java/org/unicode/cldr/draft/ExemplarInfo.java

    r9468 r9504  
    88import java.util.TreeSet; 
    99 
     10import org.unicode.cldr.tool.ConvertLanguageData; 
     11import org.unicode.cldr.tool.LanguageCodeConverter; 
    1012import org.unicode.cldr.util.CLDRFile; 
    1113import org.unicode.cldr.util.CLDRFile.WinningChoice; 
     
    227229 
    228230    public static String getCldrLanguage(String language) { 
    229         String cldrLanguage = language.replace("-", "_"); 
    230         if (cldrLanguage.equals("tl")) { 
    231             cldrLanguage = "fil"; 
    232         } else if (cldrLanguage.equals("no")) { 
    233             cldrLanguage = "nb"; 
    234         } 
    235         return cldrLanguage; 
     231        return LanguageCodeConverter.fromGoogleLocaleId(language); 
     232//        String cldrLanguage = language.replace("-", "_"); 
     233//        if (cldrLanguage.equals("tl")) { 
     234//            cldrLanguage = "fil"; 
     235//        } else if (cldrLanguage.equals("no")) { 
     236//            cldrLanguage = "nb"; 
     237//        } 
     238//        return cldrLanguage; 
    236239    } 
    237240 
  • trunk/tools/java/org/unicode/cldr/draft/FileUtilities.java

    r9342 r9504  
    192192                    + className, e); 
    193193            } 
    194             throw new IllegalArgumentException("Couldn't open file: " + canonicalName 
     194            throw new IllegalArgumentException("Couldn't open file: " + canonicalName + "; relative to class: " 
    195195                + className, e); 
    196196        } 
  • trunk/tools/java/org/unicode/cldr/draft/ScriptMetadata.java

    r9138 r9504  
    22 
    33import java.util.Arrays; 
     4import java.util.Collections; 
    45import java.util.HashMap; 
    56import java.util.HashSet; 
     7import java.util.Iterator; 
    68import java.util.LinkedHashSet; 
    79import java.util.List; 
    810import java.util.Locale; 
    911import java.util.Map; 
     12import java.util.Map.Entry; 
    1013import java.util.Set; 
    1114 
     
    6972 
    7073    public enum IdUsage { 
    71         UNKNOWN("Other"), EXCLUSION("Historic"), LIMITED_USE("Limited Use"), ASPIRATIONAL("Aspirational"), RECOMMENDED( 
    72             "Major Use"); 
     74        UNKNOWN("Other"),  
     75        EXCLUSION("Historic"),  
     76        LIMITED_USE("Limited Use"),  
     77        ASPIRATIONAL("Aspirational"),  
     78        RECOMMENDED("Major Use"); 
     79         
    7380        public final String name; 
    7481 
     
    109116    public static void addNameToCode(String type, Map<String, String> hashMap) { 
    110117        for (String language : SC.getAvailableCodes(type)) { 
    111             Map<String, String> fullData = SC.getLStreg().get(type).get(language); 
     118            Map<String, String> fullData = StandardCodes.getLStreg().get(type).get(language); 
    112119            String name = (String) (fullData.get("Description")); 
    113120            hashMap.put(name.toUpperCase(Locale.ENGLISH), language); 
     
    217224 
    218225    private static class MyFileReader extends FileUtilities.SemiFileReader { 
    219         public Map<String, Info> data = new HashMap<String, Info>(); 
     226        private Map<String, Info> data = new HashMap<String, Info>(); 
    220227 
    221228        @Override 
     
    268275        } 
    269276 
     277        private Map<String, Info> getData() { 
     278            return Collections.unmodifiableMap(data); 
     279        } 
    270280    } 
    271281 
     
    276286        EXTRAS.put("Hang", "Kore"); 
    277287        EXTRAS.put("Hira", "Jpan"); 
    278     } 
    279     static Map<String, Info> data = new MyFileReader().process(ScriptMetadata.class, DATA_FILE).data; 
     288        EXTRAS.freeze(); 
     289    } 
     290    static final Map<String, Info> data = new MyFileReader().process(ScriptMetadata.class, DATA_FILE).getData(); 
    280291 
    281292    public static Info getInfo(String s) { 
    282         return data.get(s); 
     293        Info result = data.get(s); 
     294        if (result == null) { 
     295            try { 
     296                String name2 = UScript.getShortName(UScript.getCodeFromName(s)); 
     297                result = data.get(name2); 
     298            } catch (Exception e) {} 
     299        } 
     300        return result; 
    283301    } 
    284302 
     
    290308        return data.get(UScript.getShortName(i)); 
    291309    } 
     310 
     311    public static Set<Entry<String, Info>> iterable() { 
     312        return data.entrySet(); 
     313    } 
     314     
     315    /**  
     316     * Specialized scripts 
     317     * @return 
     318     */ 
     319    public static Set<String> getExtras() { 
     320        return EXTRAS.values(); 
     321    } 
    292322} 
  • trunk/tools/java/org/unicode/cldr/tool/GenerateBirth.java

    r9480 r9504  
    3636 
    3737    public enum Versions { 
    38         trunk, v23_0, v22_0, v21_0, v2_0_1, v1_9_1, v1_8_1, v1_7_2, v1_6_1, v1_5_1, v1_4_1, v1_3_0, v1_2_0, v1_1_1; 
     38        trunk, v24_0, v23_1, v22_1, v21_0, v2_0_1, v1_9_1, v1_8_1, v1_7_2, v1_6_1, v1_5_1, v1_4_1, v1_3_0, v1_2_0, v1_1_1; 
    3939        public String toString() { 
    4040            return this == Versions.trunk ? name() : name().substring(1).replace('_', '.'); 
  • trunk/tools/java/org/unicode/cldr/tool/LanguageCodeConverter.java

    r7859 r9504  
    4040        Builder.with(new LinkedHashMap<String, String>()) // preserve order 
    4141            .put("iw", "he") 
     42            .put("jw", "jv") 
    4243            .put("no", "nb") 
    4344            .put("tl", "fil") 
  • trunk/tools/java/org/unicode/cldr/unittest/TestBasic.java

    r9470 r9504  
    66import java.util.ArrayList; 
    77import java.util.Arrays; 
     8import java.util.Collections; 
    89import java.util.EnumSet; 
    910import java.util.HashSet; 
     
    1920import org.unicode.cldr.test.CheckCLDR; 
    2021import org.unicode.cldr.test.DisplayAndInputProcessor; 
     22import org.unicode.cldr.tool.GenerateBirth; 
     23import org.unicode.cldr.tool.GenerateBirth.Versions; 
    2124import org.unicode.cldr.tool.LikelySubtags; 
    2225import org.unicode.cldr.unittest.TestAll.TestInfo; 
     
    3437import org.unicode.cldr.util.DtdData.Attribute; 
    3538import org.unicode.cldr.util.DtdData.Element; 
     39import org.unicode.cldr.util.DtdData.ElementType; 
    3640import org.unicode.cldr.util.Factory; 
    3741import org.unicode.cldr.util.LanguageTagParser; 
     
    122126            } else if (fileName.isDirectory()) { 
    123127                if (name.equals("tools") || name.equals("specs")  
    124                         || name.equals("cldr-apps") || name.equals("Servers") || name.equals("cldr-tools")) { 
     128                    || name.equals("cldr-apps") || name.equals("Servers") || name.equals("cldr-tools")) { 
    125129                    continue; 
    126130                } 
     
    186190        Relation<String, R3<Boolean, DtdType, String>> attributesToTypeElementUsed  
    187191        = Relation.of(new TreeMap<String, Set<R3<Boolean, DtdType, String>>>(), LinkedHashSet.class); 
    188          
     192 
    189193        for (Entry<R2<DtdType, String>, Set<String>> s : theoryAttributes.keyValuesSet()) { 
    190194            R2<DtdType, String> typeElement = s.getKey(); 
     
    208212                + "\t" + siftDeprecated(type, element, unusedAttributes, attributesToTypeElementUsed, false)); 
    209213        } 
    210          
     214 
    211215        System.out.println("Undeprecated Attributes\t"); 
    212216        for (Entry<String, R3<Boolean, DtdType, String>> s : attributesToTypeElementUsed.keyValueSet()) { 
     
    811815        return "root".equals(LocaleIDParser.getParent(localeID)); 
    812816    } 
     817 
     818    public void TestDtdCompatibility() { 
     819        for (DtdType type : DtdType.values()) { 
     820            DtdData dtdData = DtdData.getInstance(type); 
     821            Map<String, Element> currentElementFromName = dtdData.getElementFromName(); 
     822 
     823            // current has no orphan 
     824            Set<Element> orphans = new LinkedHashSet(dtdData.getElementFromName().values()); 
     825            orphans.remove(dtdData.ROOT); 
     826            orphans.remove(dtdData.PCDATA); 
     827            orphans.remove(dtdData.ANY); 
     828            Set<String> elementsWithoutAlt = new TreeSet(); 
     829            Set<String> elementsWithoutDraft = new TreeSet(); 
     830            Set<String> elementsWithoutAlias = new TreeSet(); 
     831            Set<String> elementsWithoutSpecial = new TreeSet(); 
     832 
     833            for (Element element : dtdData.getElementFromName().values()) { 
     834                Set<Element> children = element.getChildren().keySet(); 
     835                orphans.removeAll(children); 
     836                if (type == DtdType.ldml  
     837                    && !SUPPLEMENTAL_DATA_INFO.isDeprecated(type, element.name, "*", "*")) { 
     838                    if (element.getType() == ElementType.PCDATA ) { 
     839                        if (element.getAttributeNamed("alt") == null) { 
     840                            elementsWithoutAlt.add(element.name); 
     841                        } 
     842                        if (element.getAttributeNamed("draft") == null) { 
     843                            elementsWithoutDraft.add(element.name); 
     844                        } 
     845                    } 
     846                    if (children.size() != 0 && !"alias".equals(element.name)) { 
     847                        if (element.getChildNamed("alias") == null) { 
     848                            elementsWithoutAlias.add(element.name); 
     849                        } 
     850                        if (element.getChildNamed("special") == null) { 
     851                            elementsWithoutSpecial.add(element.name); 
     852                        } 
     853                    } 
     854                } 
     855            } 
     856            assertEquals(type + " DTD Must not have orphan elements", Collections.EMPTY_SET, orphans); 
     857            assertEquals(type + " DTD elements with PCDATA must have 'alt' attributes", Collections.EMPTY_SET, elementsWithoutAlt); 
     858            assertEquals(type + " DTD elements with PCDATA must have 'draft' attributes", Collections.EMPTY_SET, elementsWithoutDraft); 
     859            assertEquals(type + " DTD elements with children must have 'alias' elements", Collections.EMPTY_SET, elementsWithoutAlias); 
     860            assertEquals(type + " DTD elements with children must have 'special' elements", Collections.EMPTY_SET, elementsWithoutSpecial); 
     861 
     862            for (Versions version : Versions.values()) { 
     863                if (version == Versions.trunk) { 
     864                    continue; 
     865                } else if (version == Versions.v1_1_1) { 
     866                    break; 
     867                } 
     868                DtdData dtdDataOld; 
     869                try { 
     870                    dtdDataOld = DtdData.getInstance(type, version.toString()); 
     871                } catch (IllegalArgumentException e) { 
     872                    boolean tooOld = false; 
     873                    switch (type) { 
     874                    case ldmlBCP47: 
     875                        tooOld = version.compareTo(Versions.v1_7_2) >= 0; 
     876                        break; 
     877                    case keyboard: 
     878                    case platform: 
     879                        tooOld = version.compareTo(Versions.v22_1) >= 0; 
     880                        break; 
     881                    } 
     882                    if (tooOld) { 
     883                        continue; 
     884                    } else { 
     885                        throw e; 
     886                    } 
     887                } 
     888                // verify that if E is in dtdDataOld, then it is in dtdData, and has at least the same children and attributes 
     889                for (Entry<String, Element> entry : dtdDataOld.getElementFromName().entrySet()) { 
     890                    Element oldElement = entry.getValue(); 
     891                    Element newElement = currentElementFromName.get(entry.getKey()); 
     892                    if (assertNotNull(type + " DTD for trunk must be superset of v" + version + ", and must contain «" 
     893                        + oldElement.getName() + "»", newElement)) { 
     894                        // TODO Check order also 
     895                        for (Element oldChild : oldElement.getChildren().keySet()) { 
     896                            Element newChild = newElement.getChildNamed(oldChild.getName()); 
     897                            assertNotNull(type + " DTD - Children of «" + newElement.getName() + 
     898                                "» must be superset of v" + version + ", and must contain «" + oldChild.getName() + "»", newChild); 
     899                        } 
     900                        for (Attribute oldAttribute : oldElement.getAttributes().keySet()) { 
     901                            Attribute newAttribute = newElement.getAttributeNamed(oldAttribute.getName()); 
     902                            assertNotNull(type + " DTD - Attributes of «" + newElement.getName() + 
     903                                "» must be superset of v" + version + ", and must contain «" + oldAttribute.getName() + "»", newAttribute); 
     904 
     905                        } 
     906                    } 
     907                } 
     908            } 
     909        } 
     910    } 
    813911} 
  • trunk/tools/java/org/unicode/cldr/unittest/TestCoverageLevel.java

    r9489 r9504  
    33import java.io.IOException; 
    44import java.util.Date; 
     5import java.util.EnumMap; 
    56import java.util.EnumSet; 
    67import java.util.HashMap; 
     
    1415 
    1516import org.unicode.cldr.unittest.TestAll.TestInfo; 
     17import org.unicode.cldr.util.CLDRConfig; 
    1618import org.unicode.cldr.util.CLDRFile; 
    1719import org.unicode.cldr.util.CLDRFile.Status; 
    1820import org.unicode.cldr.util.CLDRPaths; 
     21import org.unicode.cldr.util.ChainedMap; 
     22import org.unicode.cldr.util.ChainedMap.M3; 
     23import org.unicode.cldr.util.ChainedMap.M4; 
    1924import org.unicode.cldr.util.Counter2; 
    2025import org.unicode.cldr.util.LanguageTagParser; 
     
    3439 
    3540import com.ibm.icu.dev.test.TestFmwk; 
     41import com.ibm.icu.dev.util.CollectionUtilities; 
    3642import com.ibm.icu.dev.util.Relation; 
    3743import com.ibm.icu.impl.Row; 
     
    5157        // new TestCoverageLevel().getOrgs(); 
    5258        new TestCoverageLevel().run(args); 
     59    } 
     60 
     61    public void oldTestInvariantPaths() { 
     62        org.unicode.cldr.util.Factory factory = testInfo.getCldrFactory(); 
     63        PathStarrer pathStarrer = new PathStarrer().setSubstitutionPattern("*"); 
     64        SupplementalDataInfo sdi = SupplementalDataInfo.getInstance(CLDRPaths.DEFAULT_SUPPLEMENTAL_DIRECTORY); 
     65 
     66        Set<String> allPaths = new HashSet<String>(); 
     67        M4<String, String, Level, Boolean> starredToLocalesToLevels = ChainedMap.of( 
     68            new TreeMap<String,Object>(), 
     69            new TreeMap<String,Object>(),  
     70            new TreeMap<Level,Object>(),  
     71            Boolean.class); 
     72         
     73        for (String locale : factory.getAvailableLanguages()) { 
     74            logln(locale); 
     75            CLDRFile cldrFileToCheck = factory.make(locale, true); 
     76            for (String path : cldrFileToCheck.fullIterable()) { 
     77                allPaths.add(path); 
     78                String starred = pathStarrer.set(path); 
     79                String attributes = pathStarrer.getAttributesString("|"); 
     80                Level level = sdi.getCoverageLevel(path, locale); 
     81                starredToLocalesToLevels.put(starred, locale, level, true); 
     82            } 
     83        } 
     84 
     85        Set<Level> levelsFound = EnumSet.noneOf(Level.class); 
     86        Set<String> localesWithUniqueLevels = new TreeSet<String>(); 
     87        for (Entry<String, Map<String, Map<Level, Boolean>>> entry : starredToLocalesToLevels) { 
     88            String starred = entry.getKey(); 
     89            Map<String, Map<Level, Boolean>> localesToLevels = entry.getValue(); 
     90            int maxLevelCount = 0; 
     91            double localeCount = 0; 
     92            levelsFound.clear(); 
     93            localesWithUniqueLevels.clear(); 
     94 
     95            for (Entry<String, Map<Level, Boolean>> entry2 : localesToLevels.entrySet()) { 
     96                String locale = entry2.getKey(); 
     97                Map<Level, Boolean> levels = entry2.getValue(); 
     98                levelsFound.addAll(levels.keySet()); 
     99                if (levels.size() > maxLevelCount) { 
     100                    maxLevelCount = levels.size(); 
     101                } 
     102                if (levels.size() == 1) { 
     103                    localesWithUniqueLevels.add(locale); 
     104                } 
     105                localeCount++; 
     106            } 
     107            System.out.println( 
     108                maxLevelCount 
     109                + "\t" + localesWithUniqueLevels.size()/localeCount 
     110                + "\t" + starred  
     111                + "\t" + CollectionUtilities.join(levelsFound, ", ") 
     112                + "\t" + (maxLevelCount == 1 ? "all"  
     113                    : localesWithUniqueLevels.size() == 0 ? "none"  
     114                        : CollectionUtilities.join(localesWithUniqueLevels, ", ")) 
     115                ); 
     116        } 
    53117    } 
    54118 
  • trunk/tools/java/org/unicode/cldr/unittest/TestScriptMetadata.java

    r9468 r9504  
    1616import org.unicode.cldr.draft.ScriptMetadata.Shaping; 
    1717import org.unicode.cldr.draft.ScriptMetadata.Trinary; 
     18import org.unicode.cldr.unittest.TestAll.TestInfo; 
    1819import org.unicode.cldr.util.CLDRFile; 
    1920import org.unicode.cldr.util.CLDRPaths; 
     21import org.unicode.cldr.util.Containment; 
    2022import org.unicode.cldr.util.Factory; 
    2123import org.unicode.cldr.util.StandardCodes; 
     
    2527import com.ibm.icu.dev.util.CollectionUtilities; 
    2628import com.ibm.icu.dev.util.Relation; 
     29import com.ibm.icu.impl.Row; 
     30import com.ibm.icu.impl.Row.R2; 
     31import com.ibm.icu.impl.Row.R3; 
    2732import com.ibm.icu.lang.UProperty; 
    2833import com.ibm.icu.lang.UScript; 
     
    105110        XPathParts parts = new XPathParts(); 
    106111        for (Iterator<String> it = english.getAvailableIterator(code); it.hasNext();) { 
    107             parts.set(it.next()); 
     112            parts.set(it.next());  
    108113            String newType = parts.getAttributeValue(-1, "type"); 
    109114            if (!result.contains(newType)) { 
     
    135140        } 
    136141    } 
     142 
     143    public void TestGeographicGrouping() { 
     144        CLDRFile english = TestInfo.getInstance().getEnglish(); 
     145        Set<Row.R3<IdUsage, String, String>> lines = new TreeSet(); 
     146        Set<String> extras = ScriptMetadata.getExtras(); 
     147        for (Entry<String, Info> sc : ScriptMetadata.iterable()) { 
     148            String scriptCode = sc.getKey(); 
     149            if (extras.contains(scriptCode)) { 
     150                continue; 
     151            } 
     152            Info info = sc.getValue(); 
     153            String continent = Containment.getContinent(info.originCountry); 
     154            String container = !continent.equals("142") ? continent : 
     155                Containment.getSubcontinent(info.originCountry); 
     156 
     157            lines.add( 
     158                Row.of(info.idUsage, 
     159                    english.getName(CLDRFile.TERRITORY_NAME, continent), 
     160                    info.idUsage 
     161                    + "\t" +  
     162                    english.getName(CLDRFile.TERRITORY_NAME, container) 
     163                    + "\t" + scriptCode + "\t" + 
     164                    english.getName(CLDRFile.SCRIPT_NAME, scriptCode)  
     165                    )); 
     166        } 
     167        for (Row.R3<IdUsage, String, String> s : lines) { 
     168            logln(s.get2()); 
     169        } 
     170    } 
    137171} 
  • trunk/tools/java/org/unicode/cldr/util/ApproximateWidth.java

    r7859 r9504  
    55import com.ibm.icu.dev.util.UnicodeMap; 
    66 
    7 public class ApproximateWidth { 
     7public class ApproximateWidth {  
    88    static UnicodeMap<Integer> data = new UnicodeMap<Integer>(); 
    99    static Integer defaultWidth; 
  • trunk/tools/java/org/unicode/cldr/util/CLDRFile.java

    r9486 r9504  
    12271227    // } 
    12281228 
    1229     static String[][] distinguishingData = { 
    1230         { "*", "key" }, 
    1231         { "*", "id" }, 
    1232         { "*", "_q" }, 
    1233         { "*", "alt" }, 
    1234         { "*", "iso4217" }, 
    1235         { "*", "iso3166" }, 
    1236         { "*", "indexSource" }, 
    1237         { "default", "type" }, 
    1238         { "measurementSystem", "type" }, 
    1239         { "mapping", "type" }, 
    1240         { "abbreviationFallback", "type" }, 
    1241         { "preferenceOrdering", "type" }, 
    1242         { "deprecatedItems", "iso3166" }, 
    1243         { "ruleset", "type" }, 
    1244         { "rbnfrule", "value" }, 
    1245     }; 
    1246  
    1247     private final static Map distinguishingAttributeMap = asMap(distinguishingData, true); 
     1229//    private static String[][] distinguishingData = { 
     1230//        { "*", "key" }, 
     1231//        { "*", "id" }, 
     1232//        { "*", "_q" }, 
     1233//        { "*", "alt" }, 
     1234//        { "*", "iso4217" }, 
     1235//        { "*", "iso3166" }, 
     1236//        { "*", "indexSource" }, 
     1237//        { "default", "type" }, 
     1238//        { "measurementSystem", "type" }, 
     1239//        { "mapping", "type" }, 
     1240//        { "abbreviationFallback", "type" }, 
     1241//        { "preferenceOrdering", "type" }, 
     1242//        { "deprecatedItems", "iso3166" }, 
     1243//        { "ruleset", "type" }, 
     1244//        { "rbnfrule", "value" }, 
     1245//    }; 
     1246// 
     1247//    private final static Map distinguishingAttributeMap = asMap(distinguishingData, true); 
    12481248 
    12491249    /** 
     
    16181618        } 
    16191619 
    1620         private Set<String> fixedSkeletons = new HashSet(); 
    1621  
    1622         private DateTimePatternGenerator dateGenerator = DateTimePatternGenerator.getEmptyInstance(); 
     1620        //private Set<String> fixedSkeletons = new HashSet(); 
     1621 
     1622        //private DateTimePatternGenerator dateGenerator = DateTimePatternGenerator.getEmptyInstance(); 
    16231623 
    16241624        /** 
     
    18261826        } 
    18271827 
    1828         static final char XML_LINESEPARATOR = (char) 0xA; 
    1829         static final String XML_LINESEPARATOR_STRING = String.valueOf(XML_LINESEPARATOR); 
     1828        //static final char XML_LINESEPARATOR = (char) 0xA; 
     1829        //static final String XML_LINESEPARATOR_STRING = String.valueOf(XML_LINESEPARATOR); 
    18301830 
    18311831        public void characters(char[] ch, int start, int length) 
     
    24252425    // TODO, convert to use SupplementalInfo 
    24262426 
    2427     private static MapComparator<String> attributeOrdering = new MapComparator<String>() 
    2428         .add( 
    2429             // START MECHANICALLY attributeOrdering GENERATED BY FindDTDOrder 
    2430             "_q type id choice key registry source target path day date version count lines characters before from to iso4217 mzone number time casing list uri digits rounding iso3166 hex request direction alternate backwards caseFirst caseLevel hiraganaQuarternary hiraganaQuaternary variableTop normalization numeric strength elements element attributes attribute attributeValue contains multizone order other replacement scripts services territories territory aliases tzidVersion value values variant variants visibility alpha3 code end exclude fips10 gdp internet literacyPercent locales population writingPercent populationPercent officialStatus start used otherVersion typeVersion access after allowsParsing at bcp47 decexp desired indexSource numberSystem numbers oneway ordering percent priority radix rules supported tender territoryId yeartype cldrVersion grouping inLanguage inScript inTerritory match parent private reason reorder status cashDigits cashRounding allowed override preferred regions paths votes validSubLocales standard references alt draft" // END 
    2431             // MECHANICALLY 
    2432             // attributeOrdering 
    2433             // GENERATED 
    2434             // BY 
    2435             // FindDTDOrder 
    2436             .trim().split("\\s+")) 
    2437             .setErrorOnMissing(false) 
    2438             .freeze(); 
    2439  
    2440     private static MapComparator<String> elementOrdering = new MapComparator<String>() 
    2441         .add( 
    2442             // START MECHANICALLY elementOrdering GENERATED BY FindDTDOrder 
    2443             "ldml alternate approvalRequirement approvalRequirements attributeOrder attributes blockingItems calendarPreference calendarSystem casingData casingItem character character-fallback characterOrder codesByTerritory comment context coverageVariable coverageLevel cp dayPeriodRule dayPeriodRules deprecatedItems distinguishingItems elementOrder exception first_variable fractions hours identity indexSeparator compressedIndexSeparator indexRangePattern indexLabelBefore indexLabelAfter indexLabel info keyMap languageAlias languageCodes languageCoverage languageMatch languageMatches languagePopulation last_variable first_tertiary_ignorable last_tertiary_ignorable first_secondary_ignorable last_secondary_ignorable first_primary_ignorable last_primary_ignorable first_non_ignorable last_non_ignorable first_trailing last_trailing likelySubtag lineOrder mapKeys mapTypes mapZone numberingSystem parentLocale personList pluralRule pluralRules postCodeRegex primaryZone reference region scriptAlias scriptCoverage serialElements stopwordList substitute suppress tRule telephoneCountryCode territoryAlias territoryCodes territoryCoverage currencyCoverage timezone timezoneCoverage transform typeMap usesMetazone validity alias appendItem base beforeCurrency afterCurrency codePattern compoundUnit compoundUnitPattern contextTransform contextTransformUsage currencyMatch cyclicName cyclicNameContext cyclicNameSet cyclicNameWidth dateFormatItem day dayPeriod dayPeriodContext dayPeriodWidth defaultCollation defaultNumberingSystem deprecated distinguishing blocking coverageAdditions durationUnitPattern era eraNames eraAbbr eraNarrow exemplarCharacters ellipsis fallback field generic greatestDifference height hourFormat hoursFormat gmtFormat gmtZeroFormat intervalFormatFallback intervalFormatItem key listPattern listPatternPart localeDisplayNames layout contextTransforms localeDisplayPattern languages localePattern localeSeparator localeKeyTypePattern localizedPatternChars dateRangePattern calendars long measurementSystem measurementSystemName messages minDays firstDay month monthPattern monthPatternContext monthPatternWidth months monthNames monthAbbr monthPatterns days dayNames dayAbbr moreInformation native orientation inList inText otherNumberingSystems paperSize quarter quarters quotationStart quotationEnd alternateQuotationStart alternateQuotationEnd rbnfrule regionFormat fallbackFormat fallbackRegionFormat abbreviationFallback preferenceOrdering relativeTimePattern reset import p pc rule ruleset rulesetGrouping s sc scripts segmentation settings short commonlyUsed exemplarCity singleCountries default calendar collation currency currencyFormat currencySpacing currencyFormatLength dateFormat dateFormatLength dateTimeFormat dateTimeFormatLength availableFormats appendItems dayContext dayWidth decimalFormat decimalFormatLength intervalFormats monthContext monthWidth pattern displayName percentFormat percentFormatLength quarterContext quarterWidth relative relativeTime scientificFormat scientificFormatLength skipDefaultLocale defaultContent standard daylight stopwords indexLabels mapping suppress_contractions optimize cr rules surroundingMatch insertBetween symbol decimal group list percentSign nativeZeroDigit patternDigit plusSign minusSign exponential superscriptingExponent perMille infinity nan currencyDecimal currencyGroup symbols decimalFormats scientificFormats percentFormats currencyFormats currencies miscPatterns t tc q qc i ic extend territories timeFormat timeFormatLength traditional finance transformName type unit unitLength durationUnit unitPattern variable attributeValues variables segmentRules exceptions variantAlias variants keys types transformNames measurementSystemNames codePatterns version generation cldrVersion currencyData language script territory territoryContainment languageData territoryInfo postalCodeData calendarData calendarPreferenceData variant week am pm dayPeriods eras cyclicNameSets dateFormats timeFormats dateTimeFormats fields timeZoneNames weekData timeData measurementData timezoneData characters delimiters measurement dates numbers transforms units listPatterns collations posix segmentations rbnf metadata codeMappings parentLocales likelySubtags metazoneInfo mapTimezones plurals telephoneCodeData numberingSystems bcp47KeywordMappings gender references languageMatching dayPeriodRuleSet metaZones primaryZones weekendStart weekendEnd width windowsZones coverageLevels x yesstr nostr yesexpr noexpr zone metazone special zoneAlias zoneFormatting zoneItem supplementalData" 
    2444             .trim().split("\\s+")) 
    2445             .setErrorOnMissing(false) 
    2446             .freeze(); 
     2427//    private static MapComparator<String> attributeOrdering = new MapComparator<String>() 
     2428//        .add( 
     2429//            // START MECHANICALLY attributeOrdering GENERATED BY FindDTDOrder 
     2430//            "_q type id choice key registry source target path day date version count lines characters before from to iso4217 mzone number time casing list uri digits rounding iso3166 hex request direction alternate backwards caseFirst caseLevel hiraganaQuarternary hiraganaQuaternary variableTop normalization numeric strength elements element attributes attribute attributeValue contains multizone order other replacement scripts services territories territory aliases tzidVersion value values variant variants visibility alpha3 code end exclude fips10 gdp internet literacyPercent locales population writingPercent populationPercent officialStatus start used otherVersion typeVersion access after allowsParsing at bcp47 decexp desired indexSource numberSystem numbers oneway ordering percent priority radix rules supported tender territoryId yeartype cldrVersion grouping inLanguage inScript inTerritory match parent private reason reorder status cashDigits cashRounding allowed override preferred regions validSubLocales standard references alt draft" // END 
     2431//            // MECHANICALLY 
     2432//            // attributeOrdering 
     2433//            // GENERATED 
     2434//            // BY 
     2435//            // FindDTDOrder 
     2436//            .trim().split("\\s+")) 
     2437//            .setErrorOnMissing(false) 
     2438//            .freeze(); 
     2439 
     2440//    private static MapComparator<String> elementOrdering = new MapComparator<String>() 
     2441//        .add( 
     2442//            // START MECHANICALLY elementOrdering GENERATED BY FindDTDOrder 
     2443//            "ldml alternate attributeOrder attributes blockingItems calendarPreference calendarSystem casingData casingItem character character-fallback characterOrder codesByTerritory comment context coverageVariable coverageLevel cp dayPeriodRule dayPeriodRules deprecatedItems distinguishingItems elementOrder exception first_variable fractions hours identity indexSeparator compressedIndexSeparator indexRangePattern indexLabelBefore indexLabelAfter indexLabel info keyMap languageAlias languageCodes languageCoverage languageMatch languageMatches languagePopulation last_variable first_tertiary_ignorable last_tertiary_ignorable first_secondary_ignorable last_secondary_ignorable first_primary_ignorable last_primary_ignorable first_non_ignorable last_non_ignorable first_trailing last_trailing likelySubtag lineOrder mapKeys mapTypes mapZone numberingSystem parentLocale personList pluralRule pluralRules postCodeRegex primaryZone reference region scriptAlias scriptCoverage serialElements stopwordList substitute suppress tRule telephoneCountryCode territoryAlias territoryCodes territoryCoverage currencyCoverage timezone timezoneCoverage transform typeMap usesMetazone validity alias appendItem base beforeCurrency afterCurrency codePattern compoundUnit compoundUnitPattern contextTransform contextTransformUsage currencyMatch cyclicName cyclicNameContext cyclicNameSet cyclicNameWidth dateFormatItem day dayPeriod dayPeriodContext dayPeriodWidth defaultCollation defaultNumberingSystem deprecated distinguishing blocking coverageAdditions durationUnitPattern era eraNames eraAbbr eraNarrow exemplarCharacters ellipsis fallback field generic greatestDifference height hourFormat hoursFormat gmtFormat gmtZeroFormat intervalFormatFallback intervalFormatItem key listPattern listPatternPart localeDisplayNames layout contextTransforms localeDisplayPattern languages localePattern localeSeparator localeKeyTypePattern localizedPatternChars dateRangePattern calendars long measurementSystem measurementSystemName messages minDays firstDay month monthPattern monthPatternContext monthPatternWidth months monthNames monthAbbr monthPatterns days dayNames dayAbbr moreInformation native orientation inList inText otherNumberingSystems paperSize quarter quarters quotationStart quotationEnd alternateQuotationStart alternateQuotationEnd rbnfrule regionFormat fallbackFormat fallbackRegionFormat abbreviationFallback preferenceOrdering relativeTimePattern reset import p pc rule ruleset rulesetGrouping s sc scripts segmentation settings short commonlyUsed exemplarCity singleCountries default calendar collation currency currencyFormat currencySpacing currencyFormatLength dateFormat dateFormatLength dateTimeFormat dateTimeFormatLength availableFormats appendItems dayContext dayWidth decimalFormat decimalFormatLength intervalFormats monthContext monthWidth pattern displayName percentFormat percentFormatLength quarterContext quarterWidth relative relativeTime scientificFormat scientificFormatLength skipDefaultLocale defaultContent standard daylight stopwords indexLabels mapping suppress_contractions optimize cr rules surroundingMatch insertBetween symbol decimal group list percentSign nativeZeroDigit patternDigit plusSign minusSign exponential superscriptingExponent perMille infinity nan currencyDecimal currencyGroup symbols decimalFormats scientificFormats percentFormats currencyFormats currencies miscPatterns t tc q qc i ic extend territories timeFormat timeFormatLength traditional finance transformName type unit unitLength durationUnit unitPattern variable attributeValues variables segmentRules exceptions variantAlias variants keys types transformNames measurementSystemNames codePatterns version generation cldrVersion currencyData language script territory territoryContainment languageData territoryInfo postalCodeData calendarData calendarPreferenceData variant week am pm dayPeriods eras cyclicNameSets dateFormats timeFormats dateTimeFormats fields timeZoneNames weekData timeData measurementData timezoneData characters delimiters measurement dates numbers transforms units listPatterns collations posix segmentations rbnf metadata codeMappings parentLocales likelySubtags metazoneInfo mapTimezones plurals telephoneCodeData numberingSystems bcp47KeywordMappings gender references languageMatching dayPeriodRuleSet metaZones primaryZones weekendStart weekendEnd width windowsZones coverageLevels x yesstr nostr yesexpr noexpr zone metazone special zoneAlias zoneFormatting zoneItem supplementalData" 
     2444//            .trim().split("\\s+")) 
     2445//            .setErrorOnMissing(false) 
     2446//            .freeze(); 
    24472447 
    24482448    private static MapComparator<String> valueOrdering = new MapComparator<String>().setErrorOnMissing(false).freeze(); 
     
    26372637    // new LDMLComparator(); 
    26382638 
    2639     private static class LDMLComparator implements Comparator<String> { 
    2640  
    2641         transient XPathParts a = new XPathParts(getAttributeOrdering(), null); 
    2642         transient XPathParts b = new XPathParts(getAttributeOrdering(), null); 
    2643  
    2644         public void addElement(String a) { 
    2645             // elementOrdering.add(a); 
    2646         } 
    2647  
    2648         public void addAttribute(String a) { 
    2649             // attributeOrdering.add(a); 
    2650         } 
    2651  
    2652         public void addValue(String a) { 
    2653             // valueOrdering.add(a); 
    2654         } 
    2655  
    2656         public int compare(String o1, String o2) { 
    2657             if (o1 == o2) return 0; // quick test for common case 
    2658             int result; 
    2659             a.set(o1); 
    2660             b.set(o2); 
    2661             int minSize = a.size(); 
    2662             if (b.size() < minSize) minSize = b.size(); 
    2663             for (int i = 0; i < minSize; ++i) { 
    2664                 String aname = a.getElement(i); 
    2665                 String bname = b.getElement(i); 
    2666                 if (0 != (result = elementOrdering.compare(aname, bname))) { 
    2667                     // if they are different, then 
    2668                     // all ordered items are equal, and > than all unordered 
    2669                     boolean aOrdered = orderedElements.contains(aname); 
    2670                     boolean bOrdered = orderedElements.contains(bname); 
    2671                     // if both ordered, continue, return result 
    2672                     if (aOrdered && bOrdered) { 
    2673                         // continue with comparison 
    2674                     } else { 
    2675                         if (aOrdered == bOrdered) return result; // both off 
    2676                         return aOrdered ? 1 : -1; 
    2677                     } 
    2678                 } 
    2679                 Map<String, String> am = a.getAttributes(i); 
    2680                 Map<String, String> bm = b.getAttributes(i); 
    2681                 int minMapSize = am.size(); 
    2682                 if (bm.size() < minMapSize) minMapSize = bm.size(); 
    2683                 if (minMapSize != 0) { 
    2684                     Iterator ait = am.keySet().iterator(); 
    2685                     Iterator bit = bm.keySet().iterator(); 
    2686                     for (int j = 0; j < minMapSize; ++j) { 
    2687                         String akey = (String) ait.next(); 
    2688                         String bkey = (String) bit.next(); 
    2689                         if (0 != (result = getAttributeOrdering().compare(akey, bkey))) return result; 
    2690                         String avalue = (String) am.get(akey); 
    2691                         String bvalue = (String) bm.get(bkey); 
    2692                         if (!avalue.equals(bvalue)) { 
    2693                             Comparator<String> comp = getAttributeValueComparator(aname, akey); 
    2694                             if (0 != (result = comp.compare(avalue, bvalue))) { 
    2695                                 return result; 
    2696                             } 
    2697                         } 
    2698                     } 
    2699                 } 
    2700                 if (am.size() < bm.size()) return -1; 
    2701                 if (am.size() > bm.size()) return 1; 
    2702             } 
    2703             if (a.size() < b.size()) return -1; 
    2704             if (a.size() > b.size()) return 1; 
    2705             return 0; 
    2706         } 
    2707     } 
     2639//    private static class LDMLComparator implements Comparator<String> { 
     2640// 
     2641//        transient XPathParts a = new XPathParts(getAttributeOrdering(), null); 
     2642//        transient XPathParts b = new XPathParts(getAttributeOrdering(), null); 
     2643// 
     2644//        public void addElement(String a) { 
     2645//            // elementOrdering.add(a); 
     2646//        } 
     2647// 
     2648//        public void addAttribute(String a) { 
     2649//            // attributeOrdering.add(a); 
     2650//        } 
     2651// 
     2652//        public void addValue(String a) { 
     2653//            // valueOrdering.add(a); 
     2654//        } 
     2655// 
     2656//        public int compare(String o1, String o2) { 
     2657//            if (o1 == o2) return 0; // quick test for common case 
     2658//            int result; 
     2659//            a.set(o1); 
     2660//            b.set(o2); 
     2661//            int minSize = a.size(); 
     2662//            if (b.size() < minSize) minSize = b.size(); 
     2663//            for (int i = 0; i < minSize; ++i) { 
     2664//                String aname = a.getElement(i); 
     2665//                String bname = b.getElement(i); 
     2666//                if (0 != (result = elementOrdering.compare(aname, bname))) { 
     2667//                    // if they are different, then 
     2668//                    // all ordered items are equal, and > than all unordered 
     2669//                    boolean aOrdered = orderedElements.contains(aname); 
     2670//                    boolean bOrdered = orderedElements.contains(bname); 
     2671//                    // if both ordered, continue, return result 
     2672//                    if (aOrdered && bOrdered) { 
     2673//                        // continue with comparison 
     2674//                    } else { 
     2675//                        if (aOrdered == bOrdered) return result; // both off 
     2676//                        return aOrdered ? 1 : -1; 
     2677//                    } 
     2678//                } 
     2679//                Map<String, String> am = a.getAttributes(i); 
     2680//                Map<String, String> bm = b.getAttributes(i); 
     2681//                int minMapSize = am.size(); 
     2682//                if (bm.size() < minMapSize) minMapSize = bm.size(); 
     2683//                if (minMapSize != 0) { 
     2684//                    Iterator ait = am.keySet().iterator(); 
     2685//                    Iterator bit = bm.keySet().iterator(); 
     2686//                    for (int j = 0; j < minMapSize; ++j) { 
     2687//                        String akey = (String) ait.next(); 
     2688//                        String bkey = (String) bit.next(); 
     2689//                        if (0 != (result = getAttributeOrdering().compare(akey, bkey))) return result; 
     2690//                        String avalue = (String) am.get(akey); 
     2691//                        String bvalue = (String) bm.get(bkey); 
     2692//                        if (!avalue.equals(bvalue)) { 
     2693//                            Comparator<String> comp = getAttributeValueComparator(aname, akey); 
     2694//                            if (0 != (result = comp.compare(avalue, bvalue))) { 
     2695//                                return result; 
     2696//                            } 
     2697//                        } 
     2698//                    } 
     2699//                } 
     2700//                if (am.size() < bm.size()) return -1; 
     2701//                if (am.size() > bm.size()) return 1; 
     2702//            } 
     2703//            if (a.size() < b.size()) return -1; 
     2704//            if (a.size() > b.size()) return 1; 
     2705//            return 0; 
     2706//        } 
     2707//    } 
    27082708 
    27092709    private final static Map defaultSuppressionMap; 
  • trunk/tools/java/org/unicode/cldr/util/DtdData.java

    r9469 r9504  
    2323 
    2424import org.unicode.cldr.util.CLDRFile.DtdType; 
     25import org.unicode.cldr.util.DtdData.Attribute; 
    2526 
    2627import com.ibm.icu.dev.util.Relation; 
     28import com.ibm.icu.text.Transform; 
    2729import com.ibm.icu.text.UTF16; 
    2830 
     
    4345 
    4446    public final Element ROOT; 
    45     public final Element PCDATA = elementFrom("PCDATA"); 
     47    public final Element PCDATA = elementFrom("#PCDATA"); 
    4648    public final Element ANY = elementFrom("ANY"); 
    4749    public final DtdType dtdType; 
    48  
    49     enum Mode { 
     50    public final String version; 
     51    private Element lastElement; 
     52    private Attribute lastAttribute; 
     53    private String firstComment; 
     54 
     55    public enum Mode { 
    5056        REQUIRED("#REQUIRED"), 
    5157        OPTIONAL("#IMPLIED"), 
    5258        FIXED("#FIXED"), 
    5359        NULL("null"); 
    54         final String source; 
     60 
     61        public final String source; 
    5562 
    5663        Mode(String s) { 
     
    8289        public final AttributeType type; 
    8390        public final Map<String, Integer> values; 
     91        private String comment; 
    8492 
    8593        private Attribute(Element element2, String aName, Mode mode2, String[] split, String value2) { 
     
    126134            return name; 
    127135        } 
    128     } 
    129  
    130     private DtdData(DtdType type) { 
     136 
     137        public void addComment(String commentIn) { 
     138            comment = comment == null ? commentIn : comment + "\n" + commentIn; 
     139        } 
     140    } 
     141 
     142    private DtdData(DtdType type, String version) { 
    131143        this.dtdType = type; 
    132144        this.ROOT = elementFrom(type.toString()); 
     145        this.version = version; 
    133146    } 
    134147 
     
    137150        getAttributesFromName().put(aName, a); 
    138151        CldrUtility.putNew(a.element.attributes, a, a.element.attributes.size()); 
     152        lastElement = null; 
     153        lastAttribute = a; 
    139154    } 
    140155 
    141156    public enum ElementType { 
    142         EMPTY, ANY, PCDATA, CHILDREN 
     157        EMPTY, ANY, PCDATA("(#PCDATA)"), CHILDREN; 
     158        public final String source; 
     159 
     160        private ElementType(String s) { 
     161            source = s; 
     162        } 
     163        private ElementType() { 
     164            source = name(); 
     165        } 
    143166    } 
    144167 
     
    150173        public final String name; 
    151174        private ElementType type; 
     175        private String rawChildren; 
    152176        private final Map<Element, Integer> children = new LinkedHashMap<Element, Integer>(); 
    153177        private final Map<Attribute, Integer> attributes = new LinkedHashMap<Attribute, Integer>(); 
     178        private String comment; 
    154179 
    155180        private Element(String name2) { 
     
    158183 
    159184        private void setChildren(DtdData dtdData, String model) { 
     185            rawChildren = model; 
    160186            if (model.equals("EMPTY")) { 
    161187                type = ElementType.EMPTY; 
     
    174200                } 
    175201            } 
    176             if ((type == ElementType.CHILDREN) == (children.size() == 0) && !model.startsWith("(#PCDATA|cp")) { 
     202            if ((type == ElementType.CHILDREN) == (children.size() == 0)  
     203                && !model.startsWith("(#PCDATA|cp")) { 
    177204                throw new IllegalArgumentException("CLDR does not permit Mixed content. " + name + ":" + model); 
    178205            } 
     
    209236            return name; 
    210237        } 
     238 
     239        public Element getChildNamed(String string) { 
     240            for (Element e : children.keySet()) { 
     241                if (e.name.equals(string)) { 
     242                    return e; 
     243                } 
     244            } 
     245            return null; 
     246        } 
     247 
     248        public Attribute getAttributeNamed(String string) { 
     249            for (Attribute a : attributes.keySet()) { 
     250                if (a.name.equals(string)) { 
     251                    return a; 
     252                } 
     253            } 
     254            return null; 
     255        } 
     256 
     257        public void addComment(String comment) { 
     258            this.comment = this.comment == null ? comment : this.comment + "\n" + comment; 
     259        } 
    211260    } 
    212261 
     
    222271        Element element = elementFrom(name2); 
    223272        element.setChildren(this, model); 
     273        lastElement = element; 
     274        lastAttribute = null; 
     275    } 
     276 
     277    private void addComment(String comment) { 
     278        if (comment.contains("##########")) { 
     279            return; 
     280        } 
     281        if (lastElement != null) { 
     282            lastElement.addComment(comment); 
     283        } else if (lastAttribute != null) { 
     284            lastAttribute.addComment(comment); 
     285        } else { 
     286            firstComment = firstComment == null ? comment : firstComment + "\n" + comment; 
     287        } 
    224288    } 
    225289 
     
    251315        addAttribute(eName, aName, type, mode, value); 
    252316    } 
     317     
     318    @Override 
     319    public void handleComment(String path, String comment) { 
     320        addComment(comment); 
     321    } 
    253322 
    254323    // TODO hide this 
     
    261330    } 
    262331 
    263 //    static final Map<CLDRFile.DtdType, String> DTD_TYPE_TO_FILE; 
    264 //    static { 
    265 //        EnumMap<CLDRFile.DtdType, String> temp = new EnumMap<CLDRFile.DtdType, String>(CLDRFile.DtdType.class); 
    266 //        temp.put(CLDRFile.DtdType.ldml, CldrUtility.BASE_DIRECTORY + "common/dtd/ldml.dtd"); 
    267 //        temp.put(CLDRFile.DtdType.supplementalData, CldrUtility.BASE_DIRECTORY + "common/dtd/ldmlSupplemental.dtd"); 
    268 //        temp.put(CLDRFile.DtdType.ldmlBCP47, CldrUtility.BASE_DIRECTORY + "common/dtd/ldmlBCP47.dtd"); 
    269 //        temp.put(CLDRFile.DtdType.keyboard, CldrUtility.BASE_DIRECTORY + "keyboards/dtd/ldmlKeyboard.dtd"); 
    270 //        temp.put(CLDRFile.DtdType.platform, CldrUtility.BASE_DIRECTORY + "keyboards/dtd/ldmlPlatform.dtd"); 
    271 //        DTD_TYPE_TO_FILE = Collections.unmodifiableMap(temp); 
    272 //    } 
     332    //    static final Map<CLDRFile.DtdType, String> DTD_TYPE_TO_FILE; 
     333    //    static { 
     334    //        EnumMap<CLDRFile.DtdType, String> temp = new EnumMap<CLDRFile.DtdType, String>(CLDRFile.DtdType.class); 
     335    //        temp.put(CLDRFile.DtdType.ldml, CldrUtility.BASE_DIRECTORY + "common/dtd/ldml.dtd"); 
     336    //        temp.put(CLDRFile.DtdType.supplementalData, CldrUtility.BASE_DIRECTORY + "common/dtd/ldmlSupplemental.dtd"); 
     337    //        temp.put(CLDRFile.DtdType.ldmlBCP47, CldrUtility.BASE_DIRECTORY + "common/dtd/ldmlBCP47.dtd"); 
     338    //        temp.put(CLDRFile.DtdType.keyboard, CldrUtility.BASE_DIRECTORY + "keyboards/dtd/ldmlKeyboard.dtd"); 
     339    //        temp.put(CLDRFile.DtdType.platform, CldrUtility.BASE_DIRECTORY + "keyboards/dtd/ldmlPlatform.dtd"); 
     340    //        DTD_TYPE_TO_FILE = Collections.unmodifiableMap(temp); 
     341    //    } 
    273342 
    274343    static final EnumMap<CLDRFile.DtdType, DtdData> CACHE = new EnumMap<CLDRFile.DtdType, DtdData>(CLDRFile.DtdType.class); 
    275344 
    276345    public static synchronized DtdData getInstance(CLDRFile.DtdType type) { 
    277         DtdData simpleHandler = CACHE.get(type); 
     346        return getInstance(type, null); 
     347    } 
     348 
     349    public static synchronized DtdData getInstance(CLDRFile.DtdType type, String version) { 
     350        DtdData simpleHandler = version == null ? CACHE.get(type) : null; // don't bother caching old versions 
    278351        if (simpleHandler == null) { 
    279             simpleHandler = new DtdData(type); 
     352            simpleHandler = new DtdData(type, version); 
    280353            XMLFileReader xfr = new XMLFileReader().setHandler(simpleHandler); 
     354            File directory = version == null ? CLDRConfig.getInstance().getCldrBaseDirectory() 
     355                : new File(CLDRPaths.ARCHIVE_DIRECTORY + "/cldr-" + version); 
     356            File file = new File(directory,type.dtdPath); 
    281357            StringReader s = new StringReader("<?xml version='1.0' encoding='UTF-8' ?>" 
    282                 + "<!DOCTYPE ldml SYSTEM '" + new File(CLDRConfig.getInstance().getCldrBaseDirectory(),type.dtdPath).getAbsolutePath() + "'>"); 
     358                + "<!DOCTYPE ldml SYSTEM '" + file.getAbsolutePath() + "'>"); 
    283359            xfr.read(type.toString(), s, -1, true); //  DTD_TYPE_TO_FILE.get(type) 
    284360            if (simpleHandler.ROOT.children.size() == 0) { 
     
    286362            } 
    287363            simpleHandler.freeze(); 
    288             CACHE.put(type, simpleHandler); 
     364            if (version == null) { 
     365                CACHE.put(type, simpleHandler); 
     366            } 
    289367        } 
    290368        return simpleHandler; 
     
    292370 
    293371    private void freeze() { 
    294         MergeLists<String> elementMergeList = new MergeLists<String>(); 
    295         elementMergeList.add(dtdType.toString()); 
    296         MergeLists<String> attributeMergeList = new MergeLists<String>(); 
    297         attributeMergeList.add("_q"); 
    298  
    299         for (Element element : nameToElement.values()) { 
    300             if (element.children.size() > 0) { 
    301                 Collection<String> names = getNames(element.children.keySet()); 
    302                 elementMergeList.add(names); 
    303                 if (DEBUG) { 
    304                     System.out.println(element.getName() + "\t→\t" + names); 
    305                 } 
    306             } 
    307             if (element.attributes.size() > 0) { 
    308                 Collection<String> names = getNames(element.attributes.keySet()); 
    309                 attributeMergeList.add(names); 
    310                 if (DEBUG) { 
    311                     System.out.println(element.getName() + "\t→\t@" + names); 
    312                 } 
    313             } 
    314         } 
    315         List<String> elementList = elementMergeList.merge(); 
    316         List<String> attributeList = attributeMergeList.merge(); 
    317         if (DEBUG) { 
    318             System.out.println("Element Ordering:\t" + elementList); 
    319             System.out.println("Attribute Ordering:\t" + attributeList); 
    320         } 
    321         // double-check 
    322         //        for (Element element : elements) { 
    323         //            if (!MergeLists.hasConsistentOrder(elementList, element.children.keySet())) { 
    324         //                throw new IllegalArgumentException("Failed to find good element order: " + element.children.keySet()); 
    325         //            } 
    326         //            if (!MergeLists.hasConsistentOrder(attributeList, element.attributes.keySet())) { 
    327         //                throw new IllegalArgumentException("Failed to find good attribute order: " + element.attributes.keySet()); 
    328         //            } 
    329         //        } 
    330         elementComparator = new MapComparator(elementList).setErrorOnMissing(true).freeze(); 
    331         attributeComparator = new MapComparator(attributeList).setErrorOnMissing(true).freeze(); 
     372        if (version == null) { // only generate for new versions 
     373            MergeLists<String> elementMergeList = new MergeLists<String>(); 
     374            elementMergeList.add(dtdType.toString()); 
     375            MergeLists<String> attributeMergeList = new MergeLists<String>(); 
     376            attributeMergeList.add("_q"); 
     377 
     378            for (Element element : nameToElement.values()) { 
     379                if (element.children.size() > 0) { 
     380                    Collection<String> names = getNames(element.children.keySet()); 
     381                    elementMergeList.add(names); 
     382                    if (DEBUG) { 
     383                        System.out.println(element.getName() + "\t→\t" + names); 
     384                    } 
     385                } 
     386                if (element.attributes.size() > 0) { 
     387                    Collection<String> names = getNames(element.attributes.keySet()); 
     388                    attributeMergeList.add(names); 
     389                    if (DEBUG) { 
     390                        System.out.println(element.getName() + "\t→\t@" + names); 
     391                    } 
     392                } 
     393            } 
     394            List<String> elementList = elementMergeList.merge(); 
     395            List<String> attributeList = attributeMergeList.merge(); 
     396            if (DEBUG) { 
     397                System.out.println("Element Ordering:\t" + elementList); 
     398                System.out.println("Attribute Ordering:\t" + attributeList); 
     399            } 
     400            // double-check 
     401            //        for (Element element : elements) { 
     402            //            if (!MergeLists.hasConsistentOrder(elementList, element.children.keySet())) { 
     403            //                throw new IllegalArgumentException("Failed to find good element order: " + element.children.keySet()); 
     404            //            } 
     405            //            if (!MergeLists.hasConsistentOrder(attributeList, element.attributes.keySet())) { 
     406            //                throw new IllegalArgumentException("Failed to find good attribute order: " + element.attributes.keySet()); 
     407            //            } 
     408            //        } 
     409            elementComparator = new MapComparator(elementList).setErrorOnMissing(true).freeze(); 
     410            attributeComparator = new MapComparator(attributeList).setErrorOnMissing(true).freeze(); 
     411        } 
    332412        nameToAttributes.freeze(); 
    333413        nameToElement = Collections.unmodifiableMap(nameToElement); 
     
    391471                // at this point the elements are the same and correspond to elementA 
    392472                // in the dtd 
    393                  
     473 
    394474                // Handle the special added elements 
    395475                String aqValue = a.getAttributeValue(i, "_q"); 
     
    406486 
    407487                attributes:  
    408                 for (Entry<Attribute, Integer> attr : elementA.attributes.entrySet()) { 
    409                     Attribute main = attr.getKey(); 
    410                     String valueA = a.getAttributeValue(i, main.name); 
    411                     String valueB = b.getAttributeValue(i, main.name); 
    412                     if (valueA == null) { 
    413                         if (valueB != null) { 
    414                             return -1; 
     488                    for (Entry<Attribute, Integer> attr : elementA.attributes.entrySet()) { 
     489                        Attribute main = attr.getKey(); 
     490                        String valueA = a.getAttributeValue(i, main.name); 
     491                        String valueB = b.getAttributeValue(i, main.name); 
     492                        if (valueA == null) { 
     493                            if (valueB != null) { 
     494                                return -1; 
     495                            } 
     496                        } else if (valueB == null) { 
     497                            return 1; 
     498                        } else if (valueA.equals(valueB)) { 
     499                            --countA; 
     500                            --countB; 
     501                            if (countA == 0 && countB == 0) { 
     502                                break attributes; 
     503                            } 
     504                            continue; // TODO 
     505                        } else if (avc != null) { 
     506                            return avc.compare(elementA.name, main.name, valueA, valueB); 
     507                        } else if (main.values.size() != 0) { 
     508                            int aa = main.values.get(valueA); 
     509                            int bb = main.values.get(valueB); 
     510                            return aa - bb; 
     511                        } else { 
     512                            return valueA.compareTo(valueB); 
    415513                        } 
    416                     } else if (valueB == null) { 
    417                         return 1; 
    418                     } else if (valueA.equals(valueB)) { 
    419                         --countA; 
    420                         --countB; 
    421                         if (countA == 0 && countB == 0) { 
    422                             break attributes; 
    423                         } 
    424                         continue; // TODO 
    425                     } else if (avc != null) { 
    426                         return avc.compare(elementA.name, main.name, valueA, valueB); 
    427                     } else if (main.values.size() != 0) { 
    428                         int aa = main.values.get(valueA); 
    429                         int bb = main.values.get(valueB); 
    430                         return aa - bb; 
    431                     } else { 
    432                         return valueA.compareTo(valueB); 
    433514                    } 
    434                 } 
    435515                if (countA != 0 || countB != 0) { 
    436516                    throw new IllegalArgumentException(); 
     
    514594    //    } 
    515595 
     596    public String toString() { 
     597        StringBuilder b = new StringBuilder(); 
     598        // <!ELEMENT ldml (identity, (alias | (fallback*, localeDisplayNames?, layout?, contextTransforms?, characters?, delimiters?, measurement?, dates?, numbers?, units?, listPatterns?, collations?, posix?, segmentations?, rbnf?, metadata?, references?, special*))) > 
     599        // <!ATTLIST ldml draft ( approved | contributed | provisional | unconfirmed | true | false ) #IMPLIED > <!-- true and false are deprecated. --> 
     600        if (firstComment != null) { 
     601            b.append("\n<!--").append(firstComment).append("-->"); 
     602        } 
     603        toString(ROOT, b, new HashSet<Element>()); 
     604        return b.toString(); 
     605    } 
     606 
     607    private void toString(Element current, StringBuilder b, Set<Element> seen) { 
     608        if (seen.contains(current)) { 
     609            return; 
     610        } 
     611        seen.add(current); 
     612 
     613        b.append("\n\n<!ELEMENT " + current.name + " "); 
     614        boolean first = true; 
     615        Element aliasElement = getElementFromName().get("alias"); 
     616        Element specialElement = getElementFromName().get("special"); 
     617        //b.append(current.rawChildren); 
     618        if (current.type == ElementType.CHILDREN) { 
     619            LinkedHashSet<Element> elements = new LinkedHashSet(current.children.keySet()); 
     620            boolean hasAlias = aliasElement != null && elements.remove(aliasElement); 
     621            //boolean hasSpecial = specialElement != null && elements.remove(specialElement); 
     622            if (hasAlias) { 
     623                b.append("(alias |"); 
     624            } 
     625            b.append("("); 
     626            // <!ELEMENT transformNames ( alias | (transformName | special)* ) > 
     627            // <!ELEMENT layout ( alias | (orientation*, inList*, inText*, special*) ) > 
     628 
     629            for (Element e : elements) { 
     630                if (first) { 
     631                    first = false; 
     632                } else { 
     633                    b.append(", "); 
     634                } 
     635                b.append(e.name); 
     636                if (e.type != ElementType.PCDATA) { 
     637                    b.append("*"); 
     638                } 
     639            } 
     640            if (hasAlias) { 
     641                b.append(")"); 
     642            } 
     643            b.append(")"); 
     644        } else { 
     645            b.append(current.type.source); 
     646        } 
     647        b.append(">"); 
     648        if (current.comment != null) { 
     649            b.append(" <!--").append(current.comment).append("-->"); 
     650        } 
     651        for (Attribute a : current.attributes.keySet()) { 
     652            b.append("\n<!ATTLIST " + current.name + " " + a.name); 
     653            if (a.type == AttributeType.ENUMERATED_TYPE) { 
     654                b.append(" ("); 
     655                first = true; 
     656                for (String s : a.values.keySet()) { 
     657                    if (first) { 
     658                        first = false; 
     659                    } else { 
     660                        b.append(" | "); 
     661                    } 
     662                    b.append(s); 
     663                } 
     664                b.append(")"); 
     665            } else { 
     666                b.append(' ').append(a.type); 
     667            } 
     668            if (a.mode != Mode.NULL){  
     669                b.append(" ").append(a.mode.source); 
     670            } 
     671            if (a.defaultValue != null) { 
     672                b.append(" \"").append(a.defaultValue).append('"'); 
     673            } 
     674            b.append(">"); 
     675            if (a.comment != null) { 
     676                b.append(" <!--").append(a.comment).append("-->"); 
     677            } 
     678        } 
     679        if (current.children.size() > 0) { 
     680            for (Element e : current.children.keySet()) { 
     681                toString(e, b, seen); 
     682            } 
     683        } 
     684    } 
     685 
     686    public static <T> T removeFirst(Collection<T> elements, Transform<T,Boolean> matcher) { 
     687        for (Iterator<T> it = elements.iterator(); it.hasNext();) { 
     688            T item = it.next(); 
     689            if (matcher.transform(item) == Boolean.TRUE) { 
     690                it.remove(); 
     691                return item; 
     692            } 
     693        } 
     694        return null; 
     695    } 
    516696} 
  • trunk/tools/java/org/unicode/cldr/util/DtdDataCheck.java

    r9461 r9504  
    11package org.unicode.cldr.util; 
    22 
     3import java.io.BufferedReader; 
     4import java.io.IOException; 
     5import java.io.PrintWriter; 
    36import java.util.Arrays; 
    47import java.util.Comparator; 
     8import java.util.EnumMap; 
    59import java.util.HashSet; 
    610import java.util.LinkedHashSet; 
     
    1115import java.util.TreeSet; 
    1216 
     17import org.unicode.cldr.draft.FileUtilities; 
    1318import org.unicode.cldr.unittest.TestAll.TestInfo; 
    1419import org.unicode.cldr.util.CLDRFile.DtdType; 
     
    1924import org.unicode.cldr.util.DtdData.ElementType; 
    2025 
     26import com.ibm.icu.dev.util.BagFormatter; 
    2127import com.ibm.icu.dev.util.CollectionUtilities; 
    2228import com.ibm.icu.dev.util.Relation; 
    2329import com.ibm.icu.impl.Row; 
     30import com.ibm.icu.impl.Row.R2; 
    2431import com.ibm.icu.impl.Row.R3; 
    2532import com.ibm.icu.impl.Row.R4; 
     
    3037 
    3138    static final Set<Row.R4<DtdType,String,String,String>> DEPRECATED = new LinkedHashSet<Row.R4<DtdType,String,String,String>>(); 
    32     static final Set<Row.R3<DtdType,String,String>> DISTINGUISHING = new LinkedHashSet<Row.R3<DtdType,String,String>>(); 
    33     static final Set<Row.R3<DtdType,String,String>> NONDISTINGUISHING = new LinkedHashSet<Row.R3<DtdType,String,String>>(); 
     39    static final Map<Row.R2<DtdType,String>, Relation<Boolean,String>> TYPE_ATTRIBUTE_TO_DIST_ELEMENTS  
     40    = new TreeMap<Row.R2<DtdType,String>, Relation<Boolean,String>>(); 
    3441 
    3542    private static final boolean CHECK_CORRECTNESS = false; 
     
    141148                    } 
    142149                    if (!allDeprecated) { 
    143                         if (CLDRFile.isDistinguishing(dtdData.dtdType, element.name, a.name)) { 
    144                             special += "\t#DISTINGUISHING#"; 
    145                             DISTINGUISHING.add(Row.of(dtdData.dtdType, element.name, a.name)); 
    146                         } else { 
    147                             NONDISTINGUISHING.add(Row.of(dtdData.dtdType, element.name, a.name)); 
     150                        R2<DtdType, String> key = Row.of(dtdData.dtdType, a.name); 
     151                        boolean isDisting = CLDRFile.isDistinguishing(dtdData.dtdType, element.name, a.name); 
     152                        special += "\t#DISTINGUISHING#"; 
     153                        Relation<Boolean, String> info = TYPE_ATTRIBUTE_TO_DIST_ELEMENTS.get(key); 
     154                        if (info == null) { 
     155                            TYPE_ATTRIBUTE_TO_DIST_ELEMENTS.put(key, info = Relation.of(new TreeMap<Boolean,Set<String>>(), TreeSet.class)); 
    148156                        } 
     157                        info.put(isDisting, element.name); 
    149158                    } 
    150159                    System.out.println(indent + "@" + a.name + "\t" + a.features() + special); 
     
    160169    } 
    161170 
    162     public static void main(String[] args) { 
     171    public static void main(String[] args) throws IOException { 
    163172        if (args.length == 0) { 
    164173            DtdType[] args2 = DtdType.values(); 
     
    171180        Timer timer = new Timer(); 
    172181        for (String arg : args) { 
     182             
    173183            timer.start(); 
    174184            DtdType type = CLDRFile.DtdType.valueOf(arg); 
    175185            DtdData dtdData = DtdData.getInstance(type); 
     186            PrintWriter br = BagFormatter.openUTF8Writer("/Users/markdavis/Google Drive/Backup-2012-10-09/Documents/indigo/dataproj/src/temp/", type + "-gen.dtd"); 
     187            br.append(dtdData.toString()); 
     188            br.close(); 
    176189            long duration = timer.stop(); 
    177190            System.out.println("Time: " + timer); 
     191            if (true) { 
     192                return; 
     193            } 
    178194            new Walker(dtdData).show(dtdData.ROOT); 
    179195            if (CHECK_CORRECTNESS && type == DtdType.ldml) { 
     
    233249        } 
    234250        int i = 0; 
    235         for (R3<DtdType, String, String> x : DISTINGUISHING) { 
    236             System.out.println(++i + "\tDISTINGUISHING\t" + x); 
    237         } 
    238         i = 0; 
    239         for (R3<DtdType, String, String> x : NONDISTINGUISHING) { 
    240             System.out.println(++i + "\tNONDISTINGUISHING\t" + x); 
    241         } 
     251        System.out.println("        <distinguishing>"); 
     252        Set<String> allElements = new TreeSet<String>(); 
     253        allElements.add("_q"); 
     254        DtdType lastType = null; 
     255         
     256        for (Entry<R2<DtdType, String>, Relation<Boolean, String>> typeAttributeToDistElement : TYPE_ATTRIBUTE_TO_DIST_ELEMENTS.entrySet()) { 
     257            R2<DtdType, String> typeAttribute = typeAttributeToDistElement.getKey(); 
     258            Relation<Boolean, String> distElement = typeAttributeToDistElement.getValue(); 
     259            Set<String> areDisting = distElement.get(true); 
     260            if (areDisting == null) { 
     261                continue; 
     262            } 
     263            DtdType type = typeAttribute.get0(); 
     264            if (lastType != type) { 
     265                if (lastType != null) { 
     266                    showAll(lastType, allElements); 
     267                } 
     268                lastType = type; 
     269            } 
     270            String attribute = typeAttribute.get1(); 
     271            Set<String> areNotDisting = distElement.get(false); 
     272            if (areNotDisting == null) { 
     273                allElements.add(attribute); 
     274                continue; 
     275            } 
     276            System.out.println("            <distinguishingItems" 
     277                + " type=\"" + type  
     278                + "\" elements=\"" + CollectionUtilities.join(areDisting, " ")  
     279                + "\" attributes=\"" + attribute  
     280                + "\"/>"  
     281                + "\n            <!-- NONDISTINGUISH."  
     282                + " TYPE=\"" + type 
     283                + "\" ELEMENTS=\"" + CollectionUtilities.join(areNotDisting, " ")  
     284                + "\" ATTRIBUTES=\"" + attribute 
     285                + "\" -->"); 
     286        } 
     287        showAll(lastType, allElements); 
     288        System.out.println("        </distinguishing>"); 
     289         
    242290        i = 0; 
    243291        for (R4<DtdType, String, String, String> x : DEPRECATED) { 
     
    250298            new Walker(dtdData).showSuppressed(); 
    251299        } 
     300    } 
     301 
     302    public static void showAll(DtdType type, Set<String> allElements) { 
     303        System.out.println("            <distinguishingItems" 
     304            + " type=\"" + type  
     305            + "\" elements=\"*" 
     306            + "\" attributes=\"" + CollectionUtilities.join(allElements, " ") 
     307            + "\"/>"); 
     308        allElements.clear(); 
     309        allElements.add("_q"); 
    252310    } 
    253311 
Note: See TracChangeset for help on using the changeset viewer.