BreakIteratorFactory.java
4.54 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/*
* Decompiled with CFR 0_118.
*/
package com.adobe.agl.text;
import com.adobe.agl.impl.Assert;
import com.adobe.agl.impl.ICUData;
import com.adobe.agl.impl.ICULocaleService;
import com.adobe.agl.impl.ICUResourceBundle;
import com.adobe.agl.impl.ICUService;
import com.adobe.agl.text.BreakIterator;
import com.adobe.agl.text.RuleBasedBreakIterator;
import com.adobe.agl.text.ThaiBreakIterator;
import com.adobe.agl.util.ULocale;
import com.adobe.agl.util.UResourceBundle;
import java.io.IOException;
import java.io.InputStream;
import java.text.CharacterIterator;
import java.text.StringCharacterIterator;
import java.util.Locale;
import java.util.MissingResourceException;
final class BreakIteratorFactory
extends BreakIterator.BreakIteratorServiceShim {
static final ICULocaleService service = new BFService();
private static final String[] KIND_NAMES = new String[]{"grapheme", "word", "line", "sentence", "title"};
private static final boolean[] DICTIONARY_POSSIBLE = new boolean[]{false, true, true, false, false};
BreakIteratorFactory() {
}
public Object registerInstance(BreakIterator iter, ULocale locale, int kind) {
iter.setText(new StringCharacterIterator(""));
return service.registerObject(iter, locale, kind);
}
public boolean unregister(Object key) {
if (service.isDefault()) {
return false;
}
return service.unregisterFactory((ICUService.Factory)key);
}
public Locale[] getAvailableLocales() {
if (service == null) {
return ICUResourceBundle.getAvailableLocales("com/adobe/agl/impl/data/icudt40b");
}
return service.getAvailableLocales();
}
public ULocale[] getAvailableULocales() {
if (service == null) {
return ICUResourceBundle.getAvailableULocales("com/adobe/agl/impl/data/icudt40b");
}
return service.getAvailableULocales();
}
public BreakIterator createBreakIterator(ULocale locale, int kind) {
if (service.isDefault()) {
return BreakIteratorFactory.createBreakInstance(locale, kind);
}
ULocale[] actualLoc = new ULocale[1];
BreakIterator iter = (BreakIterator)service.get(locale, kind, actualLoc);
iter.setLocale(actualLoc[0], actualLoc[0]);
return iter;
}
private static BreakIterator createBreakInstance(ULocale locale, int kind) {
RuleBasedBreakIterator iter = null;
ICUResourceBundle rb = (ICUResourceBundle)UResourceBundle.getBundleInstance("com/adobe/agl/impl/data/icudt40b/brkitr", locale);
InputStream ruleStream = null;
try {
String typeKey = KIND_NAMES[kind];
String brkfname = rb.getStringWithFallback("boundaries/" + typeKey);
String rulesFileName = "data/icudt40b/brkitr/" + brkfname;
ruleStream = ICUData.getStream(rulesFileName);
}
catch (Exception e) {
throw new MissingResourceException(e.toString(), "", "");
}
if (DICTIONARY_POSSIBLE[kind]) {
try {
if (locale.getLanguage().equals("th")) {
String dictType = "Thai";
String dictFileName = rb.getStringWithFallback("dictionaries/" + dictType);
dictFileName = "data/icudt40b/brkitr/" + dictFileName;
InputStream is = ICUData.getStream(dictFileName);
iter = new ThaiBreakIterator(ruleStream, is);
}
}
catch (MissingResourceException e) {
}
catch (IOException e) {
Assert.fail(e);
}
}
if (iter == null) {
try {
iter = RuleBasedBreakIterator.getInstanceFromCompiledRules(ruleStream);
}
catch (IOException e) {
Assert.fail(e);
}
}
ULocale uloc = ULocale.forLocale(rb.getLocale());
iter.setLocale(uloc, uloc);
return iter;
}
private static class BFService
extends ICULocaleService {
BFService() {
class RBBreakIteratorFactory
extends ICULocaleService.ICUResourceBundleFactory {
RBBreakIteratorFactory() {
}
protected Object handleCreate(ULocale loc, int kind, ICUService srvc) {
return BreakIteratorFactory.createBreakInstance(loc, kind);
}
}
super("BreakIterator");
this.registerFactory(new RBBreakIteratorFactory());
this.markDefault();
}
}
}