Skip to content

Commit 4886fe5

Browse files
chris-evolvedbinaryadamretter
authored andcommitted
[feature] Add fn:collation-key signature and errors.
1 parent db7ae8f commit 4886fe5

File tree

2 files changed

+20
-2
lines changed

2 files changed

+20
-2
lines changed

exist-core/src/main/java/org/exist/xquery/functions/fn/FnModule.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ public class FnModule extends AbstractInternalModule {
5353
new FunctionDef(FunCodepointEqual.signature, FunCodepointEqual.class),
5454
new FunctionDef(FunCodepointsToString.signature, FunCodepointsToString.class),
5555
new FunctionDef(FunCollationKey.FS_COLLATION_KEY_SIGNATURES[0], FunCollationKey.class),
56+
new FunctionDef(FunCollationKey.FS_COLLATION_KEY_SIGNATURES[1], FunCollationKey.class),
5657
new FunctionDef(FunCompare.signatures[0], FunCompare.class),
5758
new FunctionDef(FunCompare.signatures[1], FunCompare.class),
5859
new FunctionDef(FunConcat.signature, FunConcat.class),

exist-core/src/main/java/org/exist/xquery/functions/fn/FunCollationKey.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030

3131
import com.ibm.icu.text.Collator;
3232

33+
import java.nio.charset.StandardCharsets;
34+
3335
public class FunCollationKey extends BasicFunction {
3436

3537
private static final QName FN_NAME = new QName("collation-key", Function.BUILTIN_FUNCTION_NS, FnModule.PREFIX);
@@ -44,14 +46,18 @@ public class FunCollationKey extends BasicFunction {
4446
);
4547

4648
public static final FunctionSignature[] FS_COLLATION_KEY_SIGNATURES = {
49+
new FunctionSignature(FunCollationKey.FN_NAME, FunCollationKey.FN_DESCRIPTION,
50+
new SequenceType[] {
51+
new FunctionParameterSequenceType("value-string", Type.STRING,
52+
Cardinality.ZERO_OR_ONE, "The value string")
53+
}, FN_RETURN),
4754
new FunctionSignature(FunCollationKey.FN_NAME, FunCollationKey.FN_DESCRIPTION,
4855
new SequenceType[] {
4956
new FunctionParameterSequenceType("value-string", Type.STRING,
5057
Cardinality.ZERO_OR_ONE, "The value string"),
5158
new FunctionParameterSequenceType("collection-string", Type.STRING,
5259
Cardinality.ZERO_OR_ONE, "The collation string")
5360
}, FN_RETURN)
54-
5561
};
5662

5763
public FunCollationKey(final XQueryContext context, final FunctionSignature signature) {
@@ -61,7 +67,18 @@ public FunCollationKey(final XQueryContext context, final FunctionSignature sign
6167
public Sequence eval(Sequence[] args, Sequence contextSequence) throws XPathException {
6268
final BinaryValue result;
6369
final String source = (args.length >= 1) ? args[0].toString() : "";
64-
final Collator collator = (args.length >= 2) ? Collations.getCollationFromURI(args[1].toString()) : context.getDefaultCollator();
70+
final Collator collator;
71+
if (args.length >= 2) {
72+
collator = Collations.getCollationFromURI(args[1].toString());
73+
if (collator == null) {
74+
throw new XPathException(ErrorCodes.FOCH0002, "Unsupported collation: " + args[1]);
75+
}
76+
} else {
77+
collator = context.getDefaultCollator();
78+
if (collator == null) {
79+
throw new XPathException(ErrorCodes.FOCH0002, "Could not get default collator.");
80+
}
81+
}
6582
result = new BinaryValueFromBinaryString(new Base64BinaryValueType(), Base64.encodeBase64String(collator.getCollationKey(source).toByteArray()));
6683
return result;
6784
}

0 commit comments

Comments
 (0)