• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* GENERATED SOURCE. DO NOT MODIFY. */
2 // © 2016 and later: Unicode, Inc. and others.
3 // License & terms of use: http://www.unicode.org/copyright.html#License
4 /*
5  *******************************************************************************
6  * Copyright (C) 2002-2016, International Business Machines Corporation and
7  * others. All Rights Reserved.
8  *******************************************************************************
9  */
10 
11 package ohos.global.icu.text;
12 
13 import java.io.IOException;
14 import java.nio.ByteBuffer;
15 import java.util.Locale;
16 import java.util.MissingResourceException;
17 
18 import ohos.global.icu.impl.Assert;
19 import ohos.global.icu.impl.ICUBinary;
20 import ohos.global.icu.impl.ICUData;
21 import ohos.global.icu.impl.ICULocaleService;
22 import ohos.global.icu.impl.ICUResourceBundle;
23 import ohos.global.icu.impl.ICUService;
24 import ohos.global.icu.impl.ICUService.Factory;
25 import ohos.global.icu.util.ULocale;
26 
27 /**
28  * @author Ram
29  *
30  * To change this generated comment edit the template variable "typecomment":
31  * Window>Preferences>Java>Templates.
32  * To enable and disable the creation of type comments go to
33  * Window>Preferences>Java>Code Generation.
34  */
35 final class BreakIteratorFactory extends BreakIterator.BreakIteratorServiceShim {
36 
37     @Override
registerInstance(BreakIterator iter, ULocale locale, int kind)38     public Object registerInstance(BreakIterator iter, ULocale locale, int kind) {
39         iter.setText(new java.text.StringCharacterIterator(""));
40         return service.registerObject(iter, locale, kind);
41     }
42 
43     @Override
unregister(Object key)44     public boolean unregister(Object key) {
45         if (service.isDefault()) {
46             return false;
47         }
48         return service.unregisterFactory((Factory)key);
49     }
50 
51     @Override
getAvailableLocales()52     public Locale[] getAvailableLocales() {
53         if (service == null) {
54             return ICUResourceBundle.getAvailableLocales();
55         } else {
56             return service.getAvailableLocales();
57         }
58     }
59 
60     @Override
getAvailableULocales()61     public ULocale[] getAvailableULocales() {
62         if (service == null) {
63             return ICUResourceBundle.getAvailableULocales();
64         } else {
65             return service.getAvailableULocales();
66         }
67     }
68 
69     @Override
createBreakIterator(ULocale locale, int kind)70     public BreakIterator createBreakIterator(ULocale locale, int kind) {
71     // TODO: convert to ULocale when service switches over
72         if (service.isDefault()) {
73             return createBreakInstance(locale, kind);
74         }
75         ULocale[] actualLoc = new ULocale[1];
76         BreakIterator iter = (BreakIterator)service.get(locale, kind, actualLoc);
77         iter.setLocale(actualLoc[0], actualLoc[0]); // services make no distinction between actual & valid
78         return iter;
79     }
80 
81     private static class BFService extends ICULocaleService {
BFService()82         BFService() {
83             super("BreakIterator");
84 
85             class RBBreakIteratorFactory extends ICUResourceBundleFactory {
86                 @Override
87                 protected Object handleCreate(ULocale loc, int kind, ICUService srvc) {
88                     return createBreakInstance(loc, kind);
89                 }
90             }
91             registerFactory(new RBBreakIteratorFactory());
92 
93             markDefault();
94         }
95 
96         /**
97          * createBreakInstance() returns an appropriate BreakIterator for any locale.
98          * It falls back to root if there is no specific data.
99          *
100          * <p>Without this override, the service code would fall back to the default locale
101          * which is not desirable for an algorithm with a good Unicode default,
102          * like break iteration.
103          */
104         @Override
validateFallbackLocale()105         public String validateFallbackLocale() {
106             return "";
107         }
108     }
109     static final ICULocaleService service = new BFService();
110 
111 
112     /** KIND_NAMES are the resource key to be used to fetch the name of the
113      *             pre-compiled break rules.  The resource bundle name is "boundaries".
114      *             The value for each key will be the rules to be used for the
115      *             specified locale - "word" -> "word_th" for Thai, for example.
116      */
117     private static final String[] KIND_NAMES = {
118             "grapheme", "word", "line", "sentence", "title"
119     };
120 
121 
createBreakInstance(ULocale locale, int kind)122     private static BreakIterator createBreakInstance(ULocale locale, int kind) {
123 
124         RuleBasedBreakIterator    iter = null;
125         ICUResourceBundle rb           = ICUResourceBundle.
126                 getBundleInstance(ICUData.ICU_BRKITR_BASE_NAME, locale,
127                         ICUResourceBundle.OpenType.LOCALE_ROOT);
128 
129         //
130         //  Get the binary rules.
131         //
132         ByteBuffer bytes = null;
133         String typeKeyExt = null;
134         if (kind == BreakIterator.KIND_LINE) {
135             String lbKeyValue = locale.getKeywordValue("lb");
136             if ( lbKeyValue != null && (lbKeyValue.equals("strict") || lbKeyValue.equals("normal") || lbKeyValue.equals("loose")) ) {
137                 typeKeyExt = "_" + lbKeyValue;
138             }
139         }
140 
141         try {
142             String         typeKey       = (typeKeyExt == null)? KIND_NAMES[kind]: KIND_NAMES[kind] + typeKeyExt;
143             String         brkfname      = rb.getStringWithFallback("boundaries/" + typeKey);
144             String         rulesFileName = ICUData.ICU_BRKITR_NAME+ '/' + brkfname;
145                            bytes         = ICUBinary.getData(rulesFileName);
146         }
147         catch (Exception e) {
148             throw new MissingResourceException(e.toString(),"","");
149         }
150 
151         //
152         // Create a normal RuleBasedBreakIterator.
153         //
154         try {
155             iter = RuleBasedBreakIterator.getInstanceFromCompiledRules(bytes);
156         }
157         catch (IOException e) {
158             // Shouldn't be possible to get here.
159             // If it happens, the compiled rules are probably corrupted in some way.
160             Assert.fail(e);
161         }
162         // TODO: Determine valid and actual locale correctly.
163         ULocale uloc = ULocale.forLocale(rb.getLocale());
164         iter.setLocale(uloc, uloc);
165 
166         // filtered break
167         if (kind == BreakIterator.KIND_SENTENCE) {
168             final String ssKeyword = locale.getKeywordValue("ss");
169             if (ssKeyword != null && ssKeyword.equals("standard")) {
170                 final ULocale base = new ULocale(locale.getBaseName());
171                 return FilteredBreakIteratorBuilder.getInstance(base).wrapIteratorWithFilter(iter);
172             }
173         }
174 
175         return iter;
176 
177     }
178 
179 }
180