1
2
3
4
5
6 package dev.metaschema.core.metapath.function.library;
7
8 import org.apache.commons.lang3.StringUtils;
9
10 import java.util.List;
11
12 import dev.metaschema.core.metapath.DynamicContext;
13 import dev.metaschema.core.metapath.MetapathConstants;
14 import dev.metaschema.core.metapath.function.FunctionUtils;
15 import dev.metaschema.core.metapath.function.IArgument;
16 import dev.metaschema.core.metapath.function.IFunction;
17 import dev.metaschema.core.metapath.item.IItem;
18 import dev.metaschema.core.metapath.item.ISequence;
19 import dev.metaschema.core.metapath.item.atomic.IStringItem;
20 import dev.metaschema.core.util.ObjectUtils;
21 import edu.umd.cs.findbugs.annotations.NonNull;
22
23
24
25
26
27
28
29 public final class FnSubstringAfter {
30 private static final String NAME = "substring-after";
31 @NonNull
32 static final IFunction SIGNATURE_TWO_ARG = IFunction.builder()
33 .name(NAME)
34 .namespace(MetapathConstants.NS_METAPATH_FUNCTIONS)
35 .deterministic()
36 .contextIndependent()
37 .focusIndependent()
38 .argument(IArgument.builder()
39 .name("arg1")
40 .type(IStringItem.type())
41 .zeroOrOne()
42 .build())
43 .argument(IArgument.builder()
44 .name("arg2")
45 .type(IStringItem.type())
46 .zeroOrOne()
47 .build())
48 .returnType(IStringItem.type())
49 .returnOne()
50 .functionHandler(FnSubstringAfter::executeTwoArg)
51 .build();
52
53
54 private FnSubstringAfter() {
55
56 }
57
58 @SuppressWarnings("unused")
59 @NonNull
60 private static ISequence<IStringItem> executeTwoArg(
61 @NonNull IFunction function,
62 @NonNull List<ISequence<?>> arguments,
63 @NonNull DynamicContext dynamicContext,
64 IItem focus) {
65
66
67
68
69 IStringItem arg1 = arguments.get(0).isEmpty()
70 ? IStringItem.valueOf("")
71 : FunctionUtils.asType(ObjectUtils.notNull(arguments.get(0).getFirstItem(true)));
72 IStringItem arg2 = arguments.get(1).isEmpty()
73 ? IStringItem.valueOf("")
74 : FunctionUtils.asType(ObjectUtils.notNull(arguments.get(1).getFirstItem(true)));
75
76 return ISequence.of(IStringItem.valueOf(fnSubstringAfter(arg1.asString(), arg2.asString())));
77 }
78
79
80
81
82
83
84
85
86
87
88
89
90 @NonNull
91 public static String fnSubstringAfter(
92 @NonNull String arg1,
93 @NonNull String arg2) {
94 return ObjectUtils.notNull(StringUtils.substringAfter(arg1, arg2));
95 }
96 }