1
2
3
4
5
6 package gov.nist.secauto.metaschema.core.metapath.cst;
7
8 import gov.nist.secauto.metaschema.core.metapath.DynamicContext;
9 import gov.nist.secauto.metaschema.core.metapath.ISequence;
10 import gov.nist.secauto.metaschema.core.metapath.function.library.FnData;
11 import gov.nist.secauto.metaschema.core.metapath.item.atomic.IStringItem;
12 import gov.nist.secauto.metaschema.core.util.ObjectUtils;
13
14 import java.util.List;
15
16 import edu.umd.cs.findbugs.annotations.NonNull;
17
18 public class StringConcat
19 extends AbstractNAryExpression {
20
21
22
23
24
25
26
27
28 public StringConcat(@NonNull List<IExpression> expressions) {
29 super(expressions);
30 }
31
32 @Override
33 public Class<IStringItem> getBaseResultType() {
34 return IStringItem.class;
35 }
36
37 @Override
38 public Class<IStringItem> getStaticResultType() {
39 return getBaseResultType();
40 }
41
42 @Override
43 public <RESULT, CONTEXT> RESULT accept(IExpressionVisitor<RESULT, CONTEXT> visitor, CONTEXT context) {
44 return visitor.visitStringConcat(this, context);
45 }
46
47 @Override
48 public ISequence<?> accept(DynamicContext dynamicContext, ISequence<?> focus) {
49
50 StringBuilder builder = new StringBuilder();
51 for (IExpression child : getChildren()) {
52 ISequence<?> result = child.accept(dynamicContext, focus);
53 FnData.fnData(result).stream()
54 .forEachOrdered(item -> {
55 builder.append(item.asString());
56 });
57 }
58 return ISequence.of(IStringItem.valueOf(ObjectUtils.notNull(builder.toString())));
59 }
60 }