17935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/*
27935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*******************************************************************************
37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* Copyright (C) 2012-2014, International Business Machines
47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* Corporation and others.  All Rights Reserved.
57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*******************************************************************************
67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* CollationRoot.java, ported from collationroot.h/.cpp
77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*
87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* C++ version created on: 2012dec17
97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* created by: Markus W. Scherer
107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*/
117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.impl.coll;
137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.IOException;
157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.nio.ByteBuffer;
167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.MissingResourceException;
177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.ICUBinary;
197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.ICUData;
207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/**
227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Collation root provider.
237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic final class CollationRoot {  // purely static
257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final CollationTailoring rootSingleton;
267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final RuntimeException exception;
277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final CollationTailoring getRoot() {
297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if(exception != null) {
307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            throw exception;
317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return rootSingleton;
337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final CollationData getData() {
357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CollationTailoring root = getRoot();
367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return root.data;
377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static final CollationSettings getSettings() {
397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CollationTailoring root = getRoot();
407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return root.settings.readOnly();
417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static {  // Corresponds to C++ load() function.
447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CollationTailoring t = null;
457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        RuntimeException e2 = null;
467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ByteBuffer bytes = ICUBinary.getRequiredData("coll/ucadata.icu");
487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            CollationTailoring t2 = new CollationTailoring(null);
497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            CollationDataReader.read(null, bytes, t2);
507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Keep t=null until after the root data has been read completely.
517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Otherwise we would set a non-null root object if the data reader throws an exception.
527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            t = t2;
537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch(IOException e) {
547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            e2 = new MissingResourceException(
557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "IOException while reading CLDR root data",
567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "CollationRoot", ICUData.ICU_BUNDLE + "/coll/ucadata.icu");
577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch(RuntimeException e) {
587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            e2 = e;
597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        rootSingleton = t;
617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        exception = e2;
627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
64