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