1   /*
2    * SPDX-FileCopyrightText: none
3    * SPDX-License-Identifier: CC0-1.0
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     * Create a new expression that concatenates the results of evaluating the
23     * provided {@code expressions} as strings.
24     *
25     * @param expressions
26     *          the expressions to evaluate
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      // TODO: replace with concat function when implemented
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  }