diff --git a/core/src/main/java/gov/nist/secauto/metaschema/core/metapath/cst/path/RootSlashPath.java b/core/src/main/java/gov/nist/secauto/metaschema/core/metapath/cst/path/RootSlashPath.java index 1be0d9bf6..4d0cec884 100644 --- a/core/src/main/java/gov/nist/secauto/metaschema/core/metapath/cst/path/RootSlashPath.java +++ b/core/src/main/java/gov/nist/secauto/metaschema/core/metapath/cst/path/RootSlashPath.java @@ -61,7 +61,8 @@ public ISequence accept( ISequence roots = ObjectUtils.notNull(focus.stream() .map(ItemUtils::checkItemIsNodeItemForStep) - .map(item -> Axis.ANCESTOR_OR_SELF.execute(ObjectUtils.notNull(item)).findFirst().get()) + // the previous checks for a null instance + .flatMap(item -> Axis.ANCESTOR_OR_SELF.execute(ObjectUtils.notNull(item)).limit(1)) .collect(ISequence.toSequence())); return getExpression().accept(dynamicContext, roots); diff --git a/core/src/main/java/gov/nist/secauto/metaschema/core/metapath/function/IFunction.java b/core/src/main/java/gov/nist/secauto/metaschema/core/metapath/function/IFunction.java index 35ba12bdb..224fce0f5 100644 --- a/core/src/main/java/gov/nist/secauto/metaschema/core/metapath/function/IFunction.java +++ b/core/src/main/java/gov/nist/secauto/metaschema/core/metapath/function/IFunction.java @@ -228,28 +228,13 @@ ISequence execute( */ @NonNull default String toSignature() { - StringBuilder builder = new StringBuilder() - .append("Q{") - .append(getNamespace()) - .append('}') - .append(getName()) // name - .append('('); // arguments - - List arguments = getArguments(); - if (arguments.isEmpty()) { - builder.append("()"); - } else { - builder.append(arguments.stream().map(IArgument::toSignature).collect(Collectors.joining(","))); - - if (isArityUnbounded()) { - builder.append(", ..."); - } - } - - builder.append(") as ") - .append(getResult().toSignature());// return type - - return ObjectUtils.notNull(builder.toString()); + return ObjectUtils.notNull(String.format("Q{%s}%s(%s) as %s", + getNamespace(), + getName(), + getArguments().isEmpty() ? "()" + : getArguments().stream().map(IArgument::toSignature).collect(Collectors.joining(",")) + + (isArityUnbounded() ? ", ..." : ""), + getResult().toSignature())); } /** diff --git a/core/src/main/java/gov/nist/secauto/metaschema/core/metapath/function/library/FnDocumentUri.java b/core/src/main/java/gov/nist/secauto/metaschema/core/metapath/function/library/FnDocumentUri.java index 1bb8c0c7e..64c8f602f 100644 --- a/core/src/main/java/gov/nist/secauto/metaschema/core/metapath/function/library/FnDocumentUri.java +++ b/core/src/main/java/gov/nist/secauto/metaschema/core/metapath/function/library/FnDocumentUri.java @@ -88,14 +88,9 @@ private static ISequence executeNoArg(@NonNull IFunction function, INodeItem item = FunctionUtils.requireTypeOrNull(INodeItem.class, focus); - ISequence retval; - if (item instanceof IDocumentNodeItem) { - IAnyUriItem uri = fnDocumentUri((IDocumentNodeItem) item); - retval = ISequence.of(uri); - } else { - retval = ISequence.empty(); - } - return retval; + return item instanceof IDocumentNodeItem + ? ISequence.of(fnDocumentUri((IDocumentNodeItem) item)) + : ISequence.empty(); } @SuppressWarnings("unused") @@ -109,16 +104,9 @@ private static ISequence executeOneArg(@NonNull IFunction function, INodeItem item = arg.getFirstItem(true); - ISequence retval; - if (item == null) { - retval = ISequence.empty(); - } else if (item instanceof IDocumentNodeItem) { - IAnyUriItem uri = fnDocumentUri((IDocumentNodeItem) item); - retval = ISequence.of(uri); - } else { - retval = ISequence.empty(); - } - return retval; + return item instanceof IDocumentNodeItem + ? ISequence.of(fnDocumentUri((IDocumentNodeItem) item)) + : ISequence.empty(); } /** diff --git a/core/src/main/java/gov/nist/secauto/metaschema/core/metapath/impl/StreamSequence.java b/core/src/main/java/gov/nist/secauto/metaschema/core/metapath/impl/StreamSequence.java index 75b82e861..d4c840bfd 100644 --- a/core/src/main/java/gov/nist/secauto/metaschema/core/metapath/impl/StreamSequence.java +++ b/core/src/main/java/gov/nist/secauto/metaschema/core/metapath/impl/StreamSequence.java @@ -62,6 +62,7 @@ public List getValue() { @Override public Stream stream() { @NonNull Stream retval; + // Ensure thread safety and prevent multiple consumptions of the stream synchronized (this) { if (list == null) { if (stream == null) { diff --git a/core/src/main/java/gov/nist/secauto/metaschema/core/metapath/item/function/IArrayItem.java b/core/src/main/java/gov/nist/secauto/metaschema/core/metapath/item/function/IArrayItem.java index fa98e22bc..754d186e0 100644 --- a/core/src/main/java/gov/nist/secauto/metaschema/core/metapath/item/function/IArrayItem.java +++ b/core/src/main/java/gov/nist/secauto/metaschema/core/metapath/item/function/IArrayItem.java @@ -55,6 +55,15 @@ import edu.umd.cs.findbugs.annotations.NonNull; +/** + * A representation of a Metapath array item type. + *

+ * Instances of this interface are required to enforce non-mutability for array + * contents. + * + * @param + * the Metapath item type of array members + */ @SuppressWarnings("PMD.ShortMethodName") public interface IArrayItem extends IFunction, IItem, List, IStringValued { @NonNull