< prev index next >
src/java.base/share/classes/sun/text/BreakDictionary.java
Print this page
*** 1,7 ****
/*
! * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
--- 1,7 ----
/*
! * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
*** 35,53 ****
* is protected by multiple US and International patents.
*
* This notice and attribution to Taligent may not be removed.
* Taligent is a registered trademark of Taligent, Inc.
*/
! package sun.util.locale.provider;
! import java.io.BufferedInputStream;
! import java.io.InputStream;
! import java.io.IOException;
! import java.lang.reflect.Module;
! import java.security.AccessController;
! import java.security.PrivilegedActionException;
! import java.security.PrivilegedExceptionAction;
import java.util.MissingResourceException;
import sun.text.CompactByteArray;
import sun.text.SupplementaryCharacterData;
/**
--- 35,48 ----
* is protected by multiple US and International patents.
*
* This notice and attribution to Taligent may not be removed.
* Taligent is a registered trademark of Taligent, Inc.
*/
! package sun.text;
! import java.nio.BufferUnderflowException;
! import java.nio.ByteBuffer;
import java.util.MissingResourceException;
import sun.text.CompactByteArray;
import sun.text.SupplementaryCharacterData;
/**
*** 135,269 ****
//=========================================================================
// deserialization
//=========================================================================
! BreakDictionary(Module module, String dictionaryName)
! throws IOException, MissingResourceException {
!
! readDictionaryFile(module, dictionaryName);
! }
!
! private void readDictionaryFile(final Module module, final String dictionaryName)
! throws IOException, MissingResourceException {
!
! BufferedInputStream in;
try {
! PrivilegedExceptionAction<BufferedInputStream> pa = () -> {
! String pathName = "jdk.localedata".equals(module.getName()) ?
! "sun/text/resources/ext/" :
! "sun/text/resources/";
! InputStream is = module.getResourceAsStream(pathName + dictionaryName);
! if (is == null) {
! // Try to load the file with "java.base" module instance. Assumption
! // here is that the fall back data files to be read should reside in
! // java.base.
! is = BreakDictionary.class.getModule().getResourceAsStream("sun/text/resources/" + dictionaryName);
! }
!
! return new BufferedInputStream(is);
! };
! in = AccessController.doPrivileged(pa);
! }
! catch (PrivilegedActionException e) {
! throw new InternalError(e.toString(), e);
! }
!
! byte[] buf = new byte[8];
! if (in.read(buf) != 8) {
! throw new MissingResourceException("Wrong data length",
dictionaryName, "");
}
// check version
! int version = RuleBasedBreakIterator.getInt(buf, 0);
if (version != supportedVersion) {
throw new MissingResourceException("Dictionary version(" + version + ") is unsupported",
dictionaryName, "");
}
! // get data size
! int len = RuleBasedBreakIterator.getInt(buf, 4);
! buf = new byte[len];
! if (in.read(buf) != len) {
! throw new MissingResourceException("Wrong data length",
dictionaryName, "");
}
- // close the stream
- in.close();
-
- int l;
- int offset = 0;
-
// read in the column map for BMP characteres (this is serialized in
// its internal form: an index array followed by a data array)
! l = RuleBasedBreakIterator.getInt(buf, offset);
! offset += 4;
! short[] temp = new short[l];
! for (int i = 0; i < l; i++, offset+=2) {
! temp[i] = RuleBasedBreakIterator.getShort(buf, offset);
! }
! l = RuleBasedBreakIterator.getInt(buf, offset);
! offset += 4;
! byte[] temp2 = new byte[l];
! for (int i = 0; i < l; i++, offset++) {
! temp2[i] = buf[offset];
! }
columnMap = new CompactByteArray(temp, temp2);
// read in numCols and numColGroups
! numCols = RuleBasedBreakIterator.getInt(buf, offset);
! offset += 4;
! numColGroups = RuleBasedBreakIterator.getInt(buf, offset);
! offset += 4;
// read in the row-number index
! l = RuleBasedBreakIterator.getInt(buf, offset);
! offset += 4;
! rowIndex = new short[l];
! for (int i = 0; i < l; i++, offset+=2) {
! rowIndex[i] = RuleBasedBreakIterator.getShort(buf, offset);
}
// load in the populated-cells bitmap: index first, then bitmap list
! l = RuleBasedBreakIterator.getInt(buf, offset);
! offset += 4;
! rowIndexFlagsIndex = new short[l];
! for (int i = 0; i < l; i++, offset+=2) {
! rowIndexFlagsIndex[i] = RuleBasedBreakIterator.getShort(buf, offset);
! }
! l = RuleBasedBreakIterator.getInt(buf, offset);
! offset += 4;
! rowIndexFlags = new int[l];
! for (int i = 0; i < l; i++, offset+=4) {
! rowIndexFlags[i] = RuleBasedBreakIterator.getInt(buf, offset);
}
// load in the row-shift index
! l = RuleBasedBreakIterator.getInt(buf, offset);
! offset += 4;
! rowIndexShifts = new byte[l];
! for (int i = 0; i < l; i++, offset++) {
! rowIndexShifts[i] = buf[offset];
! }
// load in the actual state table
! l = RuleBasedBreakIterator.getInt(buf, offset);
! offset += 4;
! table = new short[l];
! for (int i = 0; i < l; i++, offset+=2) {
! table[i] = RuleBasedBreakIterator.getShort(buf, offset);
}
// finally, prepare the column map for supplementary characters
! l = RuleBasedBreakIterator.getInt(buf, offset);
! offset += 4;
! int[] temp3 = new int[l];
! for (int i = 0; i < l; i++, offset+=4) {
! temp3[i] = RuleBasedBreakIterator.getInt(buf, offset);
}
supplementaryCharColumnMap = new SupplementaryCharacterData(temp3);
}
//=========================================================================
// access to the words
--- 130,223 ----
//=========================================================================
// deserialization
//=========================================================================
! BreakDictionary(String dictionaryName, byte[] dictionaryData) {
try {
! setupDictionary(dictionaryName, dictionaryData);
! } catch (BufferUnderflowException bue) {
! MissingResourceException e;
! e = new MissingResourceException("Corrupted dictionary data",
dictionaryName, "");
+ e.initCause(bue);
+ throw e;
+ }
}
+ private void setupDictionary(String dictionaryName, byte[] dictionaryData) {
+ ByteBuffer bb = ByteBuffer.wrap(dictionaryData);
+
// check version
! int version = bb.getInt();
if (version != supportedVersion) {
throw new MissingResourceException("Dictionary version(" + version + ") is unsupported",
dictionaryName, "");
}
! // Check data size
! int len = bb.getInt();
! if (bb.position() + len != bb.limit()) {
! throw new MissingResourceException("Dictionary size is wrong: " + bb.limit(),
dictionaryName, "");
}
// read in the column map for BMP characteres (this is serialized in
// its internal form: an index array followed by a data array)
! len = bb.getInt();
! short[] temp = new short[len];
! for (int i = 0; i < len; i++) {
! temp[i] = bb.getShort();
! }
! len = bb.getInt();
! byte[] temp2 = new byte[len];
! bb.get(temp2);
columnMap = new CompactByteArray(temp, temp2);
// read in numCols and numColGroups
! numCols = bb.getInt();
! numColGroups = bb.getInt();
// read in the row-number index
! len = bb.getInt();
! rowIndex = new short[len];
! for (int i = 0; i < len; i++) {
! rowIndex[i] = bb.getShort();
}
// load in the populated-cells bitmap: index first, then bitmap list
! len = bb.getInt();
! rowIndexFlagsIndex = new short[len];
! for (int i = 0; i < len; i++) {
! rowIndexFlagsIndex[i] = bb.getShort();
! }
! len = bb.getInt();
! rowIndexFlags = new int[len];
! for (int i = 0; i < len; i++) {
! rowIndexFlags[i] = bb.getInt();
}
// load in the row-shift index
! len = bb.getInt();
! rowIndexShifts = new byte[len];
! bb.get(rowIndexShifts);
// load in the actual state table
! len = bb.getInt();
! table = new short[len];
! for (int i = 0; i < len; i++) {
! table[i] = bb.getShort();
}
// finally, prepare the column map for supplementary characters
! len = bb.getInt();
! int[] temp3 = new int[len];
! for (int i = 0; i < len; i++) {
! temp3[i] = bb.getInt();
}
+ assert bb.position() == bb.limit();
+
supplementaryCharColumnMap = new SupplementaryCharacterData(temp3);
}
//=========================================================================
// access to the words
< prev index next >