View Javadoc
1   /*
2    * Copyright (c) 2005, 2009, Oracle and/or its affiliates. All rights reserved.
3    * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4    *
5    * This code is free software; you can redistribute it and/or modify it
6    * under the terms of the GNU General Public License version 2 only, as
7    * published by the Free Software Foundation.  Oracle designates this
8    * particular file as subject to the "Classpath" exception as provided
9    * by Oracle in the LICENSE file that accompanied this code.
10   *
11   * This code is distributed in the hope that it will be useful, but WITHOUT
12   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13   * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14   * version 2 for more details (a copy is included in the LICENSE file that
15   * accompanied this code).
16   *
17   * You should have received a copy of the GNU General Public License version
18   * 2 along with this work; if not, write to the Free Software Foundation,
19   * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20   *
21   * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22   * or visit www.oracle.com if you need additional information or have any
23   * questions.
24   */
25  /*
26   *******************************************************************************
27   * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved         *
28   *                                                                             *
29   * The original version of this source code and documentation is copyrighted   *
30   * and owned by IBM, These materials are provided under terms of a License     *
31   * Agreement between IBM and Sun. This technology is protected by multiple     *
32   * US and International patents. This notice and attribution to IBM may not    *
33   * to removed.                                                                 *
34   *******************************************************************************
35  *   file name:  UBiDiProps.java
36  *   encoding:   US-ASCII
37  *   tab size:   8 (not used)
38  *   indentation:4
39  *
40  *   created on: 2005jan16
41  *   created by: Markus W. Scherer
42  *
43  *   Low-level Unicode bidi/shaping properties access.
44  *   Java port of ubidi_props.h/.c.
45  */
46  
47  package sun.text.normalizer;
48  
49  import java.io.BufferedInputStream;
50  import java.io.DataInputStream;
51  import java.io.InputStream;
52  import java.io.IOException;
53  
54  public final class UBiDiProps {
55      // constructors etc. --------------------------------------------------- ***
56  
57      // port of ubidi_openProps()
58      public UBiDiProps() throws IOException{
59          InputStream is=ICUData.getStream(DATA_FILE_NAME);
60          BufferedInputStream b=new BufferedInputStream(is, 4096 /* data buffer size */);
61          readData(b);
62          b.close();
63          is.close();
64  
65      }
66  
67      private void readData(InputStream is) throws IOException {
68          DataInputStream inputStream=new DataInputStream(is);
69  
70          // read the header
71          ICUBinary.readHeader(inputStream, FMT, new IsAcceptable());
72  
73          // read indexes[]
74          int i, count;
75          count=inputStream.readInt();
76          if(count<IX_INDEX_TOP) {
77              throw new IOException("indexes[0] too small in "+DATA_FILE_NAME);
78          }
79          indexes=new int[count];
80  
81          indexes[0]=count;
82          for(i=1; i<count; ++i) {
83              indexes[i]=inputStream.readInt();
84          }
85  
86          // read the trie
87          trie=new CharTrie(inputStream, null);
88  
89          // read mirrors[]
90          count=indexes[IX_MIRROR_LENGTH];
91          if(count>0) {
92              mirrors=new int[count];
93              for(i=0; i<count; ++i) {
94                  mirrors[i]=inputStream.readInt();
95              }
96          }
97  
98          // read jgArray[]
99          count=indexes[IX_JG_LIMIT]-indexes[IX_JG_START];
100         jgArray=new byte[count];
101         for(i=0; i<count; ++i) {
102             jgArray[i]=inputStream.readByte();
103         }
104     }
105 
106     // implement ICUBinary.Authenticate
107     private final class IsAcceptable implements ICUBinary.Authenticate {
108         public boolean isDataVersionAcceptable(byte version[]) {
109             return version[0]==1 &&
110                    version[2]==Trie.INDEX_STAGE_1_SHIFT_ && version[3]==Trie.INDEX_STAGE_2_SHIFT_;
111         }
112     }
113 
114     // UBiDiProps singleton
115     private static UBiDiProps gBdp=null;
116 
117     // port of ubidi_getSingleton()
118     public static final synchronized UBiDiProps getSingleton() throws IOException {
119         if(gBdp==null) {
120             gBdp=new UBiDiProps();
121         }
122         return gBdp;
123     }
124 
125     // UBiDiProps dummy singleton
126     private static UBiDiProps gBdpDummy=null;
127 
128     private UBiDiProps(boolean makeDummy) { // ignore makeDummy, only creates a unique signature
129         indexes=new int[IX_TOP];
130         indexes[0]=IX_TOP;
131         trie=new CharTrie(0, 0, null); // dummy trie, always returns 0
132     }
133 
134     /**
135      * Get a singleton dummy object, one that works with no real data.
136      * This can be used when the real data is not available.
137      * Using the dummy can reduce checks for available data after an initial failure.
138      * Port of ucase_getDummy().
139      */
140     public static final synchronized UBiDiProps getDummy() {
141         if(gBdpDummy==null) {
142             gBdpDummy=new UBiDiProps(true);
143         }
144         return gBdpDummy;
145     }
146 
147     public final int getClass(int c) {
148         return getClassFromProps(trie.getCodePointValue(c));
149     }
150 
151     // data members -------------------------------------------------------- ***
152     private int indexes[];
153     private int mirrors[];
154     private byte jgArray[];
155 
156     private CharTrie trie;
157 
158     // data format constants ----------------------------------------------- ***
159     private static final String DATA_FILE_NAME = "/sun/text/resources/ubidi.icu";
160 
161     /* format "BiDi" */
162     private static final byte FMT[]={ 0x42, 0x69, 0x44, 0x69 };
163 
164     /* indexes into indexes[] */
165     private static final int IX_INDEX_TOP=0;
166     private static final int IX_MIRROR_LENGTH=3;
167 
168     private static final int IX_JG_START=4;
169     private static final int IX_JG_LIMIT=5;
170 
171     private static final int IX_TOP=16;
172 
173     private static final int CLASS_MASK=    0x0000001f;
174 
175     private static final int getClassFromProps(int props) {
176         return props&CLASS_MASK;
177     }
178 
179 }