Skip to content

Commit 60a2c81

Browse files
committed
Just say no to strings
1 parent 353713c commit 60a2c81

File tree

3 files changed

+50
-54
lines changed

3 files changed

+50
-54
lines changed

UnicodeJsps/src/main/java/org/unicode/jsp/UnicodeSetUtilities.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.ibm.icu.text.UTF16.StringComparator;
88
import com.ibm.icu.text.UnicodeSet;
99
import com.ibm.icu.util.ULocale;
10+
import com.ibm.icu.util.VersionInfo;
1011
import java.text.ParsePosition;
1112
import java.util.Comparator;
1213
import java.util.List;
@@ -294,11 +295,15 @@ private boolean applyPropertyAlias0(
294295
if (isAge) {
295296
set =
296297
prop.getSet(
297-
new UnicodePropertySymbolTable.ComparisonMatcher(
298-
propertyValue,
298+
new UnicodePropertySymbolTable.ComparisonMatcher<
299+
VersionInfo>(
300+
UnicodePropertySymbolTable.parseVersionInfoOrMax(
301+
propertyValue),
299302
UnicodePropertySymbolTable.Relation.geq,
300-
UnicodePropertySymbolTable
301-
.VERSION_STRING_COMPARATOR));
303+
Comparator.nullsFirst(Comparator.naturalOrder()),
304+
(s) ->
305+
UnicodePropertySymbolTable
306+
.parseVersionInfoOrMax(s)));
302307
} else {
303308
if (prop.getName().equals("General_Category")) {
304309
for (String[] coarseValue : COARSE_GENERAL_CATEGORIES) {

unicodetools/src/main/java/org/unicode/props/UnicodePropertySymbolTable.java

Lines changed: 31 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import java.util.Comparator;
1313
import java.util.HashMap;
1414
import java.util.List;
15+
import java.util.function.Function;
1516
import org.unicode.props.UnicodeProperty.PatternMatcher;
1617

1718
/**
@@ -201,10 +202,14 @@ public boolean applyPropertyAlias0(
201202
if (isAge) {
202203
set =
203204
prop.getSet(
204-
new ComparisonMatcher(
205-
propertyValue,
205+
new ComparisonMatcher<VersionInfo>(
206+
UnicodePropertySymbolTable.parseVersionInfoOrMax(
207+
propertyValue),
206208
Relation.geq,
207-
VERSION_STRING_COMPARATOR));
209+
Comparator.nullsFirst(Comparator.naturalOrder()),
210+
(s) ->
211+
UnicodePropertySymbolTable
212+
.parseVersionInfoOrMax(s)));
208213
} else {
209214
set = prop.getSet(propertyValue);
210215
}
@@ -244,20 +249,26 @@ public enum Relation {
244249
greater
245250
}
246251

247-
public static class ComparisonMatcher implements PatternMatcher {
252+
public static class ComparisonMatcher<T> implements PatternMatcher {
248253
final Relation relation;
249-
final Comparator<String> comparator;
250-
String pattern;
254+
final Comparator<T> comparator;
255+
final Function<String, T> parser;
256+
T expected;
251257

252-
public ComparisonMatcher(String pattern, Relation relation, Comparator<String> comparator) {
258+
public ComparisonMatcher(
259+
T expected,
260+
Relation relation,
261+
Comparator<T> comparator,
262+
Function<String, T> parser) {
253263
this.relation = relation;
254-
this.pattern = pattern;
264+
this.expected = expected;
255265
this.comparator = comparator;
266+
this.parser = parser;
256267
}
257268

258269
@Override
259270
public boolean test(String value) {
260-
int comp = comparator.compare(pattern, value);
271+
int comp = comparator.compare(expected, parser.apply(value));
261272
switch (relation) {
262273
case less:
263274
return comp < 0;
@@ -274,47 +285,19 @@ public boolean test(String value) {
274285

275286
@Override
276287
public PatternMatcher set(String pattern) {
277-
this.pattern = pattern;
288+
this.expected = parser.apply(pattern);
278289
return this;
279290
}
280291
}
281292

282-
/**
283-
* Special parser for version strings. Anything not parsable is higher than everything
284-
* parseable.
285-
*/
286-
public static final Comparator<String> VERSION_STRING_COMPARATOR =
287-
new Comparator<String>() {
288-
289-
@Override
290-
public int compare(String o1, String o2) {
291-
if (o1 == o2) {
292-
return 0;
293-
} else if (o1 == null) {
294-
return -1;
295-
} else if (o2 == null) {
296-
return 1;
297-
} else {
298-
boolean o1Valid = true;
299-
boolean o2Valid = true;
300-
VersionInfo v1 = null;
301-
VersionInfo v2 = null;
302-
try {
303-
v1 = VersionInfo.getInstance(o1);
304-
} catch (IllegalArgumentException e) {
305-
o1Valid = false;
306-
}
307-
try {
308-
v2 = VersionInfo.getInstance(o2);
309-
} catch (IllegalArgumentException e) {
310-
o2Valid = false;
311-
}
312-
if (o1Valid && o2Valid) {
313-
return v1.compareTo(v2);
314-
} else {
315-
return o2Valid ? 1 : o1Valid ? -1 : o1.compareTo(o2);
316-
}
317-
}
318-
}
319-
};
293+
public static VersionInfo parseVersionInfoOrMax(String s) {
294+
if (s == null) {
295+
return null;
296+
}
297+
try {
298+
return VersionInfo.getInstance(s);
299+
} catch (IllegalArgumentException e) {
300+
return VersionInfo.getInstance(255, 255, 255, 255);
301+
}
302+
}
320303
}

unicodetools/src/test/java/org/unicode/unittest/TestUnicodeSet.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import com.ibm.icu.impl.UnicodeRegex;
44
import com.ibm.icu.text.UnicodeSet;
5+
import com.ibm.icu.util.VersionInfo;
6+
import java.util.Comparator;
57
import java.util.regex.Matcher;
68
import java.util.regex.Pattern;
79
import org.junit.jupiter.api.Test;
@@ -48,12 +50,18 @@ private void checkOrder(String d1, String d2, Comparison expected) {
4850
d1 + " ?< " + d2,
4951
expected,
5052
Comparison.fromCompareResult(
51-
UnicodePropertySymbolTable.VERSION_STRING_COMPARATOR.compare(d1, d2)));
53+
Comparator.nullsFirst(Comparator.<VersionInfo>naturalOrder())
54+
.compare(
55+
UnicodePropertySymbolTable.parseVersionInfoOrMax(d1),
56+
UnicodePropertySymbolTable.parseVersionInfoOrMax(d2))));
5257
assertEquals(
5358
d2 + " ?< " + d1,
5459
expected.opposite(),
5560
Comparison.fromCompareResult(
56-
UnicodePropertySymbolTable.VERSION_STRING_COMPARATOR.compare(d2, d1)));
61+
Comparator.nullsFirst(Comparator.<VersionInfo>naturalOrder())
62+
.compare(
63+
UnicodePropertySymbolTable.parseVersionInfoOrMax(d2),
64+
UnicodePropertySymbolTable.parseVersionInfoOrMax(d1))));
5765
}
5866

5967
@Test

0 commit comments

Comments
 (0)