From 282ff93f03f3ecb8885579683ecec08ad17d38fa Mon Sep 17 00:00:00 2001 From: David Waltermire Date: Tue, 11 Jul 2023 12:04:19 -0400 Subject: [PATCH] Refactored configurations to expose the YAML_CODEPOINT_LIMIT_DEFAULT as a integer valued config option. Previously, config options had to be boolean values. --- .../cli/commands/GenerateSchemaCommand.java | 3 +- .../binding/io/AbstractDeserializer.java | 33 ++++++- .../binding/io/AbstractSerializationBase.java | 39 ++++---- .../binding/io/AbstractSerializer.java | 37 +++++++- .../binding/io/DefaultBoundLoader.java | 88 +++++++++++++------ .../binding/io/DeserializationFeature.java | 37 +++++--- .../metaschema/binding/io/IBoundLoader.java | 16 +++- .../metaschema/binding/io/IDeserializer.java | 16 +++- .../metaschema/binding/io/ISerializer.java | 16 +++- .../binding/io/SerializationFeature.java | 23 ++--- .../io/json/DefaultJsonDeserializer.java | 2 +- .../io/json/DefaultJsonSerializer.java | 7 ++ .../binding/io/json/JsonFactoryFactory.java | 7 +- .../io/yaml/DefaultYamlDeserializer.java | 7 +- .../io/yaml/DefaultYamlSerializer.java | 3 +- .../binding/io/yaml/YamlFactoryFactory.java | 40 ++++++--- .../binding/io/yaml/YamlOperations.java | 2 +- .../maven/plugin/AbstractMetaschemaMojo.java | 5 ++ .../maven/plugin/GenerateSchemaMojo.java | 8 +- .../maven/plugin/GenerateSourcesMojo.java | 8 ++ .../AbstractConfigurationFeature.java | 61 +++++++++++++ .../configuration/DefaultConfiguration.java | 85 +++++++++++------- .../common/configuration/IConfiguration.java | 12 +-- .../configuration/IConfigurationFeature.java | 23 +++-- .../configuration/IMutableConfiguration.java | 6 +- .../model/common/metapath/DynamicContext.java | 6 +- .../metapath/MetapathEvaluationFeature.java | 24 ++--- .../model/CommonmarkConformanceTest.java | 2 +- .../schemagen/AbstractGenerationState.java | 2 +- .../schemagen/AbstractSchemaGenerator.java | 4 +- .../metaschema/schemagen/IInlineStrategy.java | 2 +- .../schemagen/ISchemaGenerator.java | 6 +- .../schemagen/SchemaGenerationFeature.java | 32 ++++--- .../schemagen/json/JsonGenerationState.java | 6 +- .../schemagen/json/JsonSchemaGenerator.java | 2 +- .../schemagen/xml/XmlGenerationState.java | 2 +- .../schemagen/xml/XmlSchemaGenerator.java | 4 +- .../AbstractSchemaGeneratorTestSuite.java | 6 +- .../metaschema/schemagen/JsonSuiteTest.java | 9 +- .../metaschema/schemagen/XmlSuiteTest.java | 4 +- 40 files changed, 495 insertions(+), 200 deletions(-) create mode 100644 metaschema-model-common/src/main/java/gov/nist/secauto/metaschema/model/common/configuration/AbstractConfigurationFeature.java diff --git a/metaschema-cli/src/main/java/gov/nist/secauto/metaschema/cli/commands/GenerateSchemaCommand.java b/metaschema-cli/src/main/java/gov/nist/secauto/metaschema/cli/commands/GenerateSchemaCommand.java index 7bb27321d..9c3f4e723 100644 --- a/metaschema-cli/src/main/java/gov/nist/secauto/metaschema/cli/commands/GenerateSchemaCommand.java +++ b/metaschema-cli/src/main/java/gov/nist/secauto/metaschema/cli/commands/GenerateSchemaCommand.java @@ -189,8 +189,7 @@ public ExitStatus executeCommand(CallingContext callingContext, CommandLine cmdL String asFormatText = cmdLine.getOptionValue(AS_OPTION); SchemaFormat asFormat = SchemaFormat.valueOf(asFormatText.toUpperCase(Locale.ROOT)); - IMutableConfiguration configuration - = new DefaultConfiguration<>(SchemaGenerationFeature.class); + IMutableConfiguration> configuration = new DefaultConfiguration<>(); if (cmdLine.hasOption(INLINE_TYPES_OPTION)) { configuration.enableFeature(SchemaGenerationFeature.INLINE_DEFINITIONS); if (SchemaFormat.JSON.equals(asFormat)) { diff --git a/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/AbstractDeserializer.java b/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/AbstractDeserializer.java index cfad8e21b..afae101e6 100644 --- a/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/AbstractDeserializer.java +++ b/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/AbstractDeserializer.java @@ -28,6 +28,8 @@ import gov.nist.secauto.metaschema.binding.IBindingContext; import gov.nist.secauto.metaschema.binding.model.IAssemblyClassBinding; +import gov.nist.secauto.metaschema.model.common.configuration.IConfiguration; +import gov.nist.secauto.metaschema.model.common.configuration.IMutableConfiguration; import gov.nist.secauto.metaschema.model.common.constraint.DefaultConstraintValidator; import gov.nist.secauto.metaschema.model.common.constraint.IConstraintValidationHandler; import gov.nist.secauto.metaschema.model.common.constraint.LoggingConstraintValidationHandler; @@ -49,7 +51,7 @@ * the bound class to deserialize to */ public abstract class AbstractDeserializer - extends AbstractSerializationBase + extends AbstractSerializationBase> implements IDeserializer { private IConstraintValidationHandler constraintValidationHandler; @@ -63,7 +65,7 @@ public abstract class AbstractDeserializer * the bound class information for the Java type this deserializer is operating on */ protected AbstractDeserializer(@NonNull IBindingContext bindingContext, @NonNull IAssemblyClassBinding classBinding) { - super(bindingContext, classBinding, DeserializationFeature.class); + super(bindingContext, classBinding); } @Override @@ -120,4 +122,31 @@ public INodeItem deserializeToNodeItem(Reader reader, URI documentUri) throws IO @NonNull protected abstract INodeItem deserializeToNodeItemInternal(@NonNull Reader reader, @NonNull URI documentUri) throws IOException; + + @Override + public IDeserializer enableFeature(DeserializationFeature feature) { + return set(feature, true); + } + + @Override + public IDeserializer disableFeature(DeserializationFeature feature) { + return set(feature, false); + } + + @Override + public IDeserializer applyConfiguration( + @NonNull IConfiguration> other) { + IMutableConfiguration> config = getConfiguration(); + config.applyConfiguration(other); + configurationChanged(config); + return this; + } + + @Override + public IDeserializer set(DeserializationFeature feature, Object value) { + IMutableConfiguration> config = getConfiguration(); + config.set(feature, value); + configurationChanged(config); + return this; + } } diff --git a/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/AbstractSerializationBase.java b/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/AbstractSerializationBase.java index a8e01b6d7..740515d13 100644 --- a/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/AbstractSerializationBase.java +++ b/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/AbstractSerializationBase.java @@ -29,17 +29,16 @@ import gov.nist.secauto.metaschema.binding.IBindingContext; import gov.nist.secauto.metaschema.binding.model.IAssemblyClassBinding; import gov.nist.secauto.metaschema.model.common.configuration.DefaultConfiguration; -import gov.nist.secauto.metaschema.model.common.configuration.IConfiguration; import gov.nist.secauto.metaschema.model.common.configuration.IConfigurationFeature; import gov.nist.secauto.metaschema.model.common.configuration.IMutableConfiguration; import gov.nist.secauto.metaschema.model.common.util.ObjectUtils; -import java.util.Set; +import java.util.Map; import edu.umd.cs.findbugs.annotations.NonNull; @SuppressWarnings("PMD.ReplaceVectorWithList") // false positive -abstract class AbstractSerializationBase & IConfigurationFeature> +abstract class AbstractSerializationBase> implements IMutableConfiguration { @NonNull private final IBindingContext bindingContext; @@ -48,11 +47,12 @@ abstract class AbstractSerializationBase & IConfigurationFeatu @NonNull private final DefaultConfiguration configuration; - protected AbstractSerializationBase(@NonNull IBindingContext bindingContext, - @NonNull IAssemblyClassBinding classBinding, @NonNull Class configurationEnum) { + protected AbstractSerializationBase( + @NonNull IBindingContext bindingContext, + @NonNull IAssemblyClassBinding classBinding) { this.bindingContext = ObjectUtils.requireNonNull(bindingContext, "bindingContext"); this.classBinding = ObjectUtils.requireNonNull(classBinding, "classBinding"); - this.configuration = new DefaultConfiguration<>(configurationEnum); + this.configuration = new DefaultConfiguration<>(); } /** @@ -76,39 +76,34 @@ protected IAssemblyClassBinding getClassBinding() { return classBinding; } + @SuppressWarnings("unused") + protected void configurationChanged(@NonNull IMutableConfiguration config) { + // do nothing by default. Methods can override this to deal with factory caching + } + /** * Get the current configuration of the serializer/deserializer. * * @return the configuration */ @NonNull - protected IConfiguration getConfiguration() { + protected IMutableConfiguration getConfiguration() { return configuration; } - @Override - public IMutableConfiguration enableFeature(T feature) { - return configuration.enableFeature(feature); - } - - @Override - public IMutableConfiguration disableFeature(T feature) { - return configuration.disableFeature(feature); - } - @Override public boolean isFeatureEnabled(T feature) { return configuration.isFeatureEnabled(feature); } @Override - public Set getFeatureSet() { - return configuration.getFeatureSet(); + public Map getFeatureValues() { + return configuration.getFeatureValues(); } @Override - public IMutableConfiguration - applyConfiguration(@NonNull IConfiguration other) { - return configuration.applyConfiguration(other); + public V get(T feature) { + return configuration.get(feature); } + } diff --git a/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/AbstractSerializer.java b/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/AbstractSerializer.java index 2e74ffe04..ce1361021 100644 --- a/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/AbstractSerializer.java +++ b/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/AbstractSerializer.java @@ -28,6 +28,8 @@ import gov.nist.secauto.metaschema.binding.IBindingContext; import gov.nist.secauto.metaschema.binding.model.IAssemblyClassBinding; +import gov.nist.secauto.metaschema.model.common.configuration.IConfiguration; +import gov.nist.secauto.metaschema.model.common.configuration.IMutableConfiguration; import edu.umd.cs.findbugs.annotations.NonNull; @@ -38,7 +40,7 @@ * the bound class to serialize from */ public abstract class AbstractSerializer - extends AbstractSerializationBase + extends AbstractSerializationBase> implements ISerializer { /** @@ -49,7 +51,36 @@ public abstract class AbstractSerializer * @param classBinding * the bound class information for the Java type this serializer is operating on */ - public AbstractSerializer(@NonNull IBindingContext bindingContext, @NonNull IAssemblyClassBinding classBinding) { - super(bindingContext, classBinding, SerializationFeature.class); + public AbstractSerializer( + @NonNull IBindingContext bindingContext, + @NonNull IAssemblyClassBinding classBinding) { + super(bindingContext, classBinding); + } + + @Override + public ISerializer enableFeature(SerializationFeature feature) { + return set(feature, true); + } + + @Override + public ISerializer disableFeature(SerializationFeature feature) { + return set(feature, false); + } + + @Override + public ISerializer applyConfiguration( + @NonNull IConfiguration> other) { + IMutableConfiguration> config = getConfiguration(); + config.applyConfiguration(other); + configurationChanged(config); + return this; + } + + @Override + public ISerializer set(SerializationFeature feature, Object value) { + IMutableConfiguration> config = getConfiguration(); + config.set(feature, value); + configurationChanged(config); + return this; } } diff --git a/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/DefaultBoundLoader.java b/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/DefaultBoundLoader.java index d49550e1a..a88cbaff5 100644 --- a/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/DefaultBoundLoader.java +++ b/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/DefaultBoundLoader.java @@ -60,7 +60,7 @@ import java.net.URI; import java.net.URL; import java.nio.charset.Charset; -import java.util.Set; +import java.util.Map; import javax.xml.namespace.QName; import javax.xml.stream.XMLInputFactory; @@ -75,17 +75,19 @@ */ public class DefaultBoundLoader implements IBoundLoader { public static final int LOOK_AHEAD_BYTES = 32_768; - @NonNull - private static final JsonFactory JSON_FACTORY = new JsonFactory(); - @NonNull - private static final XmlFactory XML_FACTORY = new XmlFactory(); - @NonNull - private static final YAMLFactory YAML_FACTORY = new YAMLFactory(); - +// @NonNull +// private static final JsonFactory JSON_FACTORY = new JsonFactory(); +// @NonNull +// private static final XmlFactory XML_FACTORY = new XmlFactory(); +// @NonNull +// private static final YAMLFactory YAML_FACTORY = new YAMLFactory(); + + private JsonFactory[] detectorFactory; + @NonNull private final IBindingContext bindingContext; @NonNull - private final IMutableConfiguration configuration; + private final IMutableConfiguration> configuration; /** * An {@link EntityResolver} is not provided by default. @@ -101,40 +103,58 @@ public class DefaultBoundLoader implements IBoundLoader { */ public DefaultBoundLoader(@NonNull IBindingContext bindingContext) { this.bindingContext = bindingContext; - this.configuration = new DefaultConfiguration<>(DeserializationFeature.class); + this.configuration = new DefaultConfiguration<>(); } @Override - public IMutableConfiguration enableFeature(DeserializationFeature feature) { - return configuration.enableFeature(feature); + public IBoundLoader enableFeature(DeserializationFeature feature) { + return set(feature, true); } @Override - public IMutableConfiguration disableFeature(DeserializationFeature feature) { - return configuration.disableFeature(feature); + public IBoundLoader disableFeature(DeserializationFeature feature) { + return set(feature, false); } @Override - public boolean isFeatureEnabled(DeserializationFeature feature) { - return configuration.isFeatureEnabled(feature); + public boolean isFeatureEnabled(DeserializationFeature feature) { + return getConfiguration().isFeatureEnabled(feature); } @Override - public Set getFeatureSet() { - return configuration.getFeatureSet(); + public Map, Object> getFeatureValues() { + return getConfiguration().getFeatureValues(); } @Override - public IMutableConfiguration - applyConfiguration(@NonNull IConfiguration other) { - return configuration.applyConfiguration(other); + public IBoundLoader applyConfiguration(@NonNull IConfiguration> other) { + getConfiguration().applyConfiguration(other); + resetDetector(); + return this; + } + + private void resetDetector() { + // reset the detector + detectorFactory = null; } @NonNull - protected IMutableConfiguration getConfiguration() { + protected IMutableConfiguration> getConfiguration() { return configuration; } + @Override + public IBoundLoader set(DeserializationFeature feature, Object value) { + getConfiguration().set(feature, value); + resetDetector(); + return this; + } + + @Override + public V get(DeserializationFeature feature) { + return getConfiguration().get(feature); + } + @Override public IBindingContext getBindingContext() { return bindingContext; @@ -180,9 +200,19 @@ protected Format detectFormatInternal(@NonNull InputStream is, int lookAheadByte return formatFromMatcher(matcher); } + private JsonFactory[] getDetectorFactory() { + if (detectorFactory == null) { + detectorFactory = new JsonFactory[3]; + detectorFactory[0] = YamlFactoryFactory.newParserFactoryInstance(getConfiguration()); + detectorFactory[1] = JsonFactoryFactory.instance(); + detectorFactory[2] = new XmlFactory(); + } + return detectorFactory; + } + @NonNull protected DataFormatMatcher matchFormat(@NonNull InputStream is, int lookAheadBytes) throws IOException { - DataFormatDetector det = new DataFormatDetector(new JsonFactory[] { YAML_FACTORY, JSON_FACTORY, XML_FACTORY }); + DataFormatDetector det = new DataFormatDetector(getDetectorFactory()); det = det.withMinimalMatch(MatchStrength.INCONCLUSIVE).withOptimalMatch(MatchStrength.SOLID_MATCH) .withMaxInputLookahead(lookAheadBytes); @@ -252,7 +282,8 @@ public IDocumentNodeItem loadAsNodeItem(@NonNull Format format, @NonNull InputSo IDocumentNodeItem retval; if (source.getByteStream() != null) { // attempt to use a provided byte stream stream - try (@SuppressWarnings("resource") BufferedInputStream bis = toBufferedInputStream( + try (@SuppressWarnings("resource") + BufferedInputStream bis = toBufferedInputStream( ObjectUtils.requireNonNull(source.getByteStream()))) { Class clazz = detectModel(bis, format); // NOPMD - must be called before reset retval = deserializeToNodeItem(clazz, format, bis, uri); @@ -305,7 +336,8 @@ protected Class detectModel(@NonNull BufferedInputStream bis, @NonNull Format } break; case YAML: - clazz = detectModelJsonClass(ObjectUtils.notNull(YamlFactoryFactory.instance().createParser(bis))); + YAMLFactory factory = YamlFactoryFactory.newParserFactoryInstance(getConfiguration()); + clazz = detectModelJsonClass(ObjectUtils.notNull(factory.createParser(bis))); if (clazz == null) { throw new IllegalStateException( String.format("Detected format '%s', but unable to detect the bound data type", format.name())); @@ -452,8 +484,10 @@ protected CLASS loadInternal(@NonNull Class clazz, @NonNull Buffe } @NonNull - protected IDeserializer getDeserializer(@NonNull Class clazz, @NonNull Format format, - @NonNull IConfiguration config) { + protected IDeserializer getDeserializer( + @NonNull Class clazz, + @NonNull Format format, + @NonNull IConfiguration> config) { IDeserializer retval = getBindingContext().newDeserializer(format, clazz); retval.applyConfiguration(config); return retval; diff --git a/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/DeserializationFeature.java b/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/DeserializationFeature.java index 198d38392..16e630a59 100644 --- a/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/DeserializationFeature.java +++ b/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/DeserializationFeature.java @@ -27,28 +27,41 @@ package gov.nist.secauto.metaschema.binding.io; import gov.nist.secauto.metaschema.model.common.IAssemblyDefinition; -import gov.nist.secauto.metaschema.model.common.configuration.IConfigurationFeature; +import gov.nist.secauto.metaschema.model.common.configuration.AbstractConfigurationFeature; + +import org.yaml.snakeyaml.Yaml; + +import edu.umd.cs.findbugs.annotations.NonNull; + +public final class DeserializationFeature + extends AbstractConfigurationFeature { + public static final int YAML_CODEPOINT_LIMIT_DEFAULT = 2 * 1024 * 1024 * 1024; // 2 GB -public enum DeserializationFeature implements IConfigurationFeature { /** * If enabled, perform constraint validation on the deserialized bound objects. */ - DESERIALIZE_VALIDATE_CONSTRAINTS(true), + @NonNull + public static final DeserializationFeature DESERIALIZE_VALIDATE_CONSTRAINTS + = new DeserializationFeature<>(Boolean.class, true); + /** * If enabled, process the next JSON node as a field, whose name must match the * {@link IAssemblyDefinition#getRootJsonName()}. If not enabled, the next JSON node is expected to * be an object containing the data of the {@link IAssemblyDefinition}. */ - DESERIALIZE_JSON_ROOT_PROPERTY(true); - - private final boolean enabledByDefault; + public static final DeserializationFeature DESERIALIZE_JSON_ROOT_PROPERTY + = new DeserializationFeature<>(Boolean.class, true); - DeserializationFeature(boolean enabled) { - this.enabledByDefault = enabled; - } + /** + * If enabled, perform constraint validation on the deserialized bound objects. + */ + @NonNull + public static final DeserializationFeature YAML_CODEPOINT_LIMIT + = new DeserializationFeature<>(Integer.class, YAML_CODEPOINT_LIMIT_DEFAULT); - @Override - public boolean isEnabledByDefault() { - return enabledByDefault; + private DeserializationFeature( + @NonNull Class valueClass, + @NonNull V defaultValue) { + super(valueClass, defaultValue); } } diff --git a/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/IBoundLoader.java b/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/IBoundLoader.java index a31f3f37d..536e46add 100644 --- a/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/IBoundLoader.java +++ b/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/IBoundLoader.java @@ -28,6 +28,7 @@ import gov.nist.secauto.metaschema.binding.DefaultBindingContext; import gov.nist.secauto.metaschema.binding.IBindingContext; +import gov.nist.secauto.metaschema.model.common.configuration.IConfiguration; import gov.nist.secauto.metaschema.model.common.configuration.IMutableConfiguration; import gov.nist.secauto.metaschema.model.common.metapath.IDocumentLoader; import gov.nist.secauto.metaschema.model.common.metapath.item.IDocumentNodeItem; @@ -50,7 +51,20 @@ /** * A common interface for loading Metaschema based instance resources. */ -public interface IBoundLoader extends IDocumentLoader, IMutableConfiguration { +public interface IBoundLoader extends IDocumentLoader, IMutableConfiguration> { + + @Override + IBoundLoader enableFeature(DeserializationFeature feature); + + @Override + IBoundLoader disableFeature(DeserializationFeature feature); + + @Override + IBoundLoader applyConfiguration(IConfiguration> other); + + @Override + IBoundLoader set(DeserializationFeature feature, Object value); + /** * Determine the format of the provided resource. * diff --git a/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/IDeserializer.java b/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/IDeserializer.java index 04d7b1f16..5b9c4f4da 100644 --- a/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/IDeserializer.java +++ b/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/IDeserializer.java @@ -26,6 +26,7 @@ package gov.nist.secauto.metaschema.binding.io; +import gov.nist.secauto.metaschema.model.common.configuration.IConfiguration; import gov.nist.secauto.metaschema.model.common.configuration.IMutableConfiguration; import gov.nist.secauto.metaschema.model.common.constraint.IConstraintValidationHandler; import gov.nist.secauto.metaschema.model.common.metapath.item.INodeItem; @@ -52,7 +53,20 @@ * @param * the Java type into which data can be read */ -public interface IDeserializer extends IMutableConfiguration { +public interface IDeserializer extends IMutableConfiguration> { + + @Override + IDeserializer enableFeature(DeserializationFeature feature); + + @Override + IDeserializer disableFeature(DeserializationFeature feature); + + @Override + IDeserializer applyConfiguration(IConfiguration> other); + + @Override + IDeserializer set(DeserializationFeature feature, Object value); + /** * Determine if the serializer is performing validation. * diff --git a/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/ISerializer.java b/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/ISerializer.java index 93c70cfd9..0efabb86b 100644 --- a/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/ISerializer.java +++ b/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/ISerializer.java @@ -26,6 +26,7 @@ package gov.nist.secauto.metaschema.binding.io; +import gov.nist.secauto.metaschema.model.common.configuration.IConfiguration; import gov.nist.secauto.metaschema.model.common.configuration.IMutableConfiguration; import gov.nist.secauto.metaschema.model.common.util.ObjectUtils; @@ -49,7 +50,20 @@ * @param * the Java type from which data can be written */ -public interface ISerializer extends IMutableConfiguration { +public interface ISerializer extends IMutableConfiguration> { + + @Override + ISerializer enableFeature(SerializationFeature feature); + + @Override + ISerializer disableFeature(SerializationFeature feature); + + @Override + ISerializer applyConfiguration(IConfiguration> other); + + @Override + ISerializer set(SerializationFeature feature, Object value); + /** * Write data from a bound class instance to the {@link OutputStream}. *

diff --git a/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/SerializationFeature.java b/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/SerializationFeature.java index a1bee17a1..ed66f4079 100644 --- a/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/SerializationFeature.java +++ b/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/SerializationFeature.java @@ -26,24 +26,25 @@ package gov.nist.secauto.metaschema.binding.io; -import gov.nist.secauto.metaschema.model.common.configuration.IConfigurationFeature; +import gov.nist.secauto.metaschema.model.common.configuration.AbstractConfigurationFeature; -public enum SerializationFeature implements IConfigurationFeature { +import edu.umd.cs.findbugs.annotations.NonNull; + +public final class SerializationFeature + extends AbstractConfigurationFeature { /** * If enabled, generate document level constructs in the underlying data format. In XML this would * include XML declarations. In JSON or YAML, this would include an outer object and field with the * name associated with the root node. */ - SERIALIZE_ROOT(true); - - private final boolean enabledByDefault; + @NonNull + public static final SerializationFeature SERIALIZE_ROOT + = new SerializationFeature<>(Boolean.class, true); - SerializationFeature(boolean enabled) { - this.enabledByDefault = enabled; + private SerializationFeature( + @NonNull Class valueClass, + @NonNull V defaultValue) { + super(valueClass, defaultValue); } - @Override - public boolean isEnabledByDefault() { - return enabledByDefault; - } } diff --git a/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/json/DefaultJsonDeserializer.java b/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/json/DefaultJsonDeserializer.java index 2954cf3e8..57468d54b 100644 --- a/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/json/DefaultJsonDeserializer.java +++ b/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/json/DefaultJsonDeserializer.java @@ -92,7 +92,7 @@ protected INodeItem deserializeToNodeItemInternal(@NonNull Reader reader, @NonNu try (JsonParser parser = newJsonParser(reader)) { DefaultJsonParsingContext parsingContext = new DefaultJsonParsingContext(parser, new DefaultJsonProblemHandler()); IAssemblyClassBinding classBinding = getClassBinding(); - IConfiguration configuration = getConfiguration(); + IConfiguration> configuration = getConfiguration(); if (classBinding.isRoot() && configuration.isFeatureEnabled(DeserializationFeature.DESERIALIZE_JSON_ROOT_PROPERTY)) { diff --git a/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/json/DefaultJsonSerializer.java b/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/json/DefaultJsonSerializer.java index dbb356dcd..98242ac49 100644 --- a/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/json/DefaultJsonSerializer.java +++ b/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/json/DefaultJsonSerializer.java @@ -32,8 +32,10 @@ import gov.nist.secauto.metaschema.binding.IBindingContext; import gov.nist.secauto.metaschema.binding.io.AbstractSerializer; +import gov.nist.secauto.metaschema.binding.io.SerializationFeature; import gov.nist.secauto.metaschema.binding.model.IAssemblyClassBinding; import gov.nist.secauto.metaschema.binding.model.RootAssemblyDefinition; +import gov.nist.secauto.metaschema.model.common.configuration.IMutableConfiguration; import java.io.IOException; import java.io.Writer; @@ -53,6 +55,11 @@ protected JsonFactory getJsonFactoryInstance() { return JsonFactoryFactory.instance(); } + @Override + protected void configurationChanged(IMutableConfiguration> config) { + jsonFactory = null; + } + @NonNull protected JsonFactory getJsonFactory() { synchronized (this) { diff --git a/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/json/JsonFactoryFactory.java b/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/json/JsonFactoryFactory.java index 036f23139..c91ca97bf 100644 --- a/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/json/JsonFactoryFactory.java +++ b/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/json/JsonFactoryFactory.java @@ -42,8 +42,7 @@ private JsonFactoryFactory() { @NonNull public static JsonFactory newJsonFactoryInstance() { JsonFactory retval = new JsonFactory(); - // avoid automatically closing streams not owned by the reader - retval.disable(Feature.AUTO_CLOSE_SOURCE); + configureJsonFactory(retval); return retval; } @@ -52,4 +51,8 @@ public static JsonFactory instance() { return SINGLETON; } + public static void configureJsonFactory(@NonNull JsonFactory factory) { + // avoid automatically closing streams not owned by the reader + factory.disable(Feature.AUTO_CLOSE_SOURCE); + } } diff --git a/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/yaml/DefaultYamlDeserializer.java b/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/yaml/DefaultYamlDeserializer.java index cb421a993..23877aaac 100644 --- a/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/yaml/DefaultYamlDeserializer.java +++ b/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/yaml/DefaultYamlDeserializer.java @@ -26,12 +26,11 @@ package gov.nist.secauto.metaschema.binding.io.yaml; -import com.fasterxml.jackson.core.JsonFactory; +import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import gov.nist.secauto.metaschema.binding.IBindingContext; import gov.nist.secauto.metaschema.binding.io.json.DefaultJsonDeserializer; import gov.nist.secauto.metaschema.binding.model.IAssemblyClassBinding; -import gov.nist.secauto.metaschema.model.common.util.ObjectUtils; import edu.umd.cs.findbugs.annotations.NonNull; @@ -48,8 +47,8 @@ public DefaultYamlDeserializer(@NonNull IBindingContext bindingContext, @NonNull // } @Override - protected JsonFactory getJsonFactoryInstance() { - return ObjectUtils.notNull(YamlFactoryFactory.instance()); + protected YAMLFactory getJsonFactoryInstance() { + return YamlFactoryFactory.newParserFactoryInstance(getConfiguration()); } } diff --git a/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/yaml/DefaultYamlSerializer.java b/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/yaml/DefaultYamlSerializer.java index 41eb719ae..8c21bf8e8 100644 --- a/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/yaml/DefaultYamlSerializer.java +++ b/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/yaml/DefaultYamlSerializer.java @@ -31,7 +31,6 @@ import gov.nist.secauto.metaschema.binding.IBindingContext; import gov.nist.secauto.metaschema.binding.io.json.DefaultJsonSerializer; import gov.nist.secauto.metaschema.binding.model.IAssemblyClassBinding; -import gov.nist.secauto.metaschema.model.common.util.ObjectUtils; import edu.umd.cs.findbugs.annotations.NonNull; @@ -44,7 +43,7 @@ public DefaultYamlSerializer(@NonNull IBindingContext bindingContext, @NonNull I @Override protected JsonFactory getJsonFactoryInstance() { - return ObjectUtils.notNull(YamlFactoryFactory.instance()); + return YamlFactoryFactory.newGeneratorFactoryInstance(getConfiguration()); } } diff --git a/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/yaml/YamlFactoryFactory.java b/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/yaml/YamlFactoryFactory.java index 6aa0ffd70..b4842b4e3 100644 --- a/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/yaml/YamlFactoryFactory.java +++ b/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/yaml/YamlFactoryFactory.java @@ -26,40 +26,54 @@ package gov.nist.secauto.metaschema.binding.io.yaml; +import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import com.fasterxml.jackson.dataformat.yaml.YAMLFactoryBuilder; import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator; -import org.yaml.snakeyaml.LoaderOptions; +import gov.nist.secauto.metaschema.binding.io.DeserializationFeature; +import gov.nist.secauto.metaschema.binding.io.SerializationFeature; +import gov.nist.secauto.metaschema.binding.io.json.JsonFactoryFactory; +import gov.nist.secauto.metaschema.model.common.configuration.IMutableConfiguration; +import gov.nist.secauto.metaschema.model.common.util.ObjectUtils; -public final class YamlFactoryFactory { - public static final int CODEPOINT_LIMIT = 2 * 1024 * 1024 * 1024; // 2 GB +import org.yaml.snakeyaml.LoaderOptions; - private static final YAMLFactory SINGLETON = newYamlFactoryInstance(); +import edu.umd.cs.findbugs.annotations.NonNull; +public final class YamlFactoryFactory { private YamlFactoryFactory() { // disable construction } - public static YAMLFactory newYamlFactoryInstance() { + @NonNull + public static YAMLFactory newParserFactoryInstance(@NonNull IMutableConfiguration> config) { YAMLFactoryBuilder builder = YAMLFactory.builder(); LoaderOptions loaderOptions = builder.loaderOptions(); if (loaderOptions == null) { loaderOptions = new LoaderOptions(); } - loaderOptions.setCodePointLimit(CODEPOINT_LIMIT); + + int codePointLimit = config.get(DeserializationFeature.YAML_CODEPOINT_LIMIT); + loaderOptions.setCodePointLimit(codePointLimit); builder.loaderOptions(loaderOptions); - return builder + YAMLFactory retval = ObjectUtils.notNull(builder.build()); + JsonFactoryFactory.configureJsonFactory(retval); + return retval; + } + + @NonNull + public static YAMLFactory + newGeneratorFactoryInstance(@NonNull IMutableConfiguration> config) { + YAMLFactoryBuilder builder = YAMLFactory.builder(); + YAMLFactory retval = ObjectUtils.notNull(builder .enable(YAMLGenerator.Feature.MINIMIZE_QUOTES) .enable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER) .enable(YAMLGenerator.Feature.ALWAYS_QUOTE_NUMBERS_AS_STRINGS) .disable(YAMLGenerator.Feature.SPLIT_LINES) - .build(); + .build()); + JsonFactoryFactory.configureJsonFactory(retval); + return retval; } - - public static YAMLFactory instance() { - return SINGLETON; - } - } diff --git a/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/yaml/YamlOperations.java b/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/yaml/YamlOperations.java index 490c2e537..597548a9b 100644 --- a/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/yaml/YamlOperations.java +++ b/metaschema-java-binding/src/main/java/gov/nist/secauto/metaschema/binding/io/yaml/YamlOperations.java @@ -50,7 +50,7 @@ public final class YamlOperations { static { LoaderOptions loaderOptions = new LoaderOptions(); -// loaderOptions.setCodePointLimit(YamlFactoryFactory.CODEPOINT_LIMIT); + // loaderOptions.setCodePointLimit(YamlFactoryFactory.CODEPOINT_LIMIT); Constructor constructor = new Constructor(loaderOptions); DumperOptions dumperOptions = new DumperOptions(); Representer representer = new Representer(dumperOptions); diff --git a/metaschema-maven-plugin/src/main/java/gov/nist/secauto/metaschema/maven/plugin/AbstractMetaschemaMojo.java b/metaschema-maven-plugin/src/main/java/gov/nist/secauto/metaschema/maven/plugin/AbstractMetaschemaMojo.java index 3889ec1dc..bda280b5e 100644 --- a/metaschema-maven-plugin/src/main/java/gov/nist/secauto/metaschema/maven/plugin/AbstractMetaschemaMojo.java +++ b/metaschema-maven-plugin/src/main/java/gov/nist/secauto/metaschema/maven/plugin/AbstractMetaschemaMojo.java @@ -238,6 +238,11 @@ protected boolean shouldExecutionBeSkipped() { return skip; } + /** + * Get the name of the file that is used to detect staleness. + * + * @return the name + */ protected abstract String getStaleFileName(); /** diff --git a/metaschema-maven-plugin/src/main/java/gov/nist/secauto/metaschema/maven/plugin/GenerateSchemaMojo.java b/metaschema-maven-plugin/src/main/java/gov/nist/secauto/metaschema/maven/plugin/GenerateSchemaMojo.java index 3cdacbd03..99c1acfc3 100644 --- a/metaschema-maven-plugin/src/main/java/gov/nist/secauto/metaschema/maven/plugin/GenerateSchemaMojo.java +++ b/metaschema-maven-plugin/src/main/java/gov/nist/secauto/metaschema/maven/plugin/GenerateSchemaMojo.java @@ -131,8 +131,8 @@ protected String getStaleFileName() { } protected void generate(@NonNull Set metaschemaCollection) throws MojoExecutionException { - IMutableConfiguration schemaGenerationConfig - = new DefaultConfiguration<>(SchemaGenerationFeature.class); + IMutableConfiguration> schemaGenerationConfig + = new DefaultConfiguration<>(); if (isInlineDefinitions()) { schemaGenerationConfig.enableFeature(SchemaGenerationFeature.INLINE_DEFINITIONS); @@ -178,7 +178,7 @@ protected void generate(@NonNull Set metaschemaCollection) throws M private static void generateSchemas( @NonNull IMetaschema metaschema, - @NonNull IConfiguration schemaGenerationConfig, + @NonNull IConfiguration> schemaGenerationConfig, @NonNull Path outputDirectory, @NonNull Set schemaFormats) throws MojoExecutionException { @@ -207,7 +207,7 @@ private static void generateSchemas( private static void generateSchema( @NonNull IMetaschema metaschema, - @NonNull IConfiguration schemaGenerationConfig, + @NonNull IConfiguration> schemaGenerationConfig, @NonNull Path schemaPath, @NonNull ISchemaGenerator generator) throws IOException { try (@SuppressWarnings("resource") Writer writer = ObjectUtils.notNull(Files.newBufferedWriter( diff --git a/metaschema-maven-plugin/src/main/java/gov/nist/secauto/metaschema/maven/plugin/GenerateSourcesMojo.java b/metaschema-maven-plugin/src/main/java/gov/nist/secauto/metaschema/maven/plugin/GenerateSourcesMojo.java index 5485828d9..5850f1cec 100644 --- a/metaschema-maven-plugin/src/main/java/gov/nist/secauto/metaschema/maven/plugin/GenerateSourcesMojo.java +++ b/metaschema-maven-plugin/src/main/java/gov/nist/secauto/metaschema/maven/plugin/GenerateSourcesMojo.java @@ -96,6 +96,14 @@ protected List getConfigs() { return retval; } + /** + * Generate the Java source files for the provided Metaschemas. + * + * @param metaschemaCollection + * the collection of Metaschemas to generate sources for + * @throws MojoExecutionException + * if an error occurred while generating sources + */ protected void generate(@NonNull Set metaschemaCollection) throws MojoExecutionException { DefaultBindingConfiguration bindingConfiguration = new DefaultBindingConfiguration(); for (File config : getConfigs()) { diff --git a/metaschema-model-common/src/main/java/gov/nist/secauto/metaschema/model/common/configuration/AbstractConfigurationFeature.java b/metaschema-model-common/src/main/java/gov/nist/secauto/metaschema/model/common/configuration/AbstractConfigurationFeature.java new file mode 100644 index 000000000..820ad94ed --- /dev/null +++ b/metaschema-model-common/src/main/java/gov/nist/secauto/metaschema/model/common/configuration/AbstractConfigurationFeature.java @@ -0,0 +1,61 @@ +/* + * Portions of this software was developed by employees of the National Institute + * of Standards and Technology (NIST), an agency of the Federal Government and is + * being made available as a public service. Pursuant to title 17 United States + * Code Section 105, works of NIST employees are not subject to copyright + * protection in the United States. This software may be subject to foreign + * copyright. Permission in the United States and in foreign countries, to the + * extent that NIST may hold copyright, to use, copy, modify, create derivative + * works, and distribute this software and its documentation without fee is hereby + * granted on a non-exclusive basis, provided that this notice and disclaimer + * of warranty appears in all copies. + * + * THE SOFTWARE IS PROVIDED 'AS IS' WITHOUT ANY WARRANTY OF ANY KIND, EITHER + * EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTY + * THAT THE SOFTWARE WILL CONFORM TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND FREEDOM FROM + * INFRINGEMENT, AND ANY WARRANTY THAT THE DOCUMENTATION WILL CONFORM TO THE + * SOFTWARE, OR ANY WARRANTY THAT THE SOFTWARE WILL BE ERROR FREE. IN NO EVENT + * SHALL NIST BE LIABLE FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO, DIRECT, + * INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES, ARISING OUT OF, RESULTING FROM, + * OR IN ANY WAY CONNECTED WITH THIS SOFTWARE, WHETHER OR NOT BASED UPON WARRANTY, + * CONTRACT, TORT, OR OTHERWISE, WHETHER OR NOT INJURY WAS SUSTAINED BY PERSONS OR + * PROPERTY OR OTHERWISE, AND WHETHER OR NOT LOSS WAS SUSTAINED FROM, OR AROSE OUT + * OF THE RESULTS OF, OR USE OF, THE SOFTWARE OR SERVICES PROVIDED HEREUNDER. + */ + +package gov.nist.secauto.metaschema.model.common.configuration; + +import edu.umd.cs.findbugs.annotations.NonNull; + +public abstract class AbstractConfigurationFeature implements IConfigurationFeature { + @NonNull + private final Class valueClass; + @NonNull + private final V defaultValue; + + /** + * Construct a new feature with a default value. + * + * @param valueClass + * the class of the feature's value + * @param defaultValue + * the value's default + */ + protected AbstractConfigurationFeature( + @NonNull Class valueClass, + @NonNull V defaultValue) { + this.valueClass = valueClass; + this.defaultValue = defaultValue; + } + + @Override + public V getDefault() { + return defaultValue; + } + + @Override + public Class getValueClass() { + return valueClass; + } +} diff --git a/metaschema-model-common/src/main/java/gov/nist/secauto/metaschema/model/common/configuration/DefaultConfiguration.java b/metaschema-model-common/src/main/java/gov/nist/secauto/metaschema/model/common/configuration/DefaultConfiguration.java index b14b2d30c..d794227fe 100644 --- a/metaschema-model-common/src/main/java/gov/nist/secauto/metaschema/model/common/configuration/DefaultConfiguration.java +++ b/metaschema-model-common/src/main/java/gov/nist/secauto/metaschema/model/common/configuration/DefaultConfiguration.java @@ -28,8 +28,8 @@ import gov.nist.secauto.metaschema.model.common.util.CollectionUtil; -import java.util.EnumSet; -import java.util.Set; +import java.util.HashMap; +import java.util.Map; import edu.umd.cs.findbugs.annotations.NonNull; @@ -40,38 +40,28 @@ * the type of managed features */ @SuppressWarnings({ "PMD.ReplaceVectorWithList", "PMD.DoNotUseThreads" }) -public class DefaultConfiguration & IConfigurationFeature> +public class DefaultConfiguration> implements IMutableConfiguration { @NonNull - private Set featureSet; + private Map featureValues; /** - * Create a new configuration based on the provided feature enumeration. + * Create a new configuration. * - * @param enumClass - * the feature enumeration class */ - @SuppressWarnings({ "null", "PMD.CloseResource" }) - public DefaultConfiguration(@NonNull Class enumClass) { - this.featureSet = EnumSet.noneOf(enumClass); - - for (T feature : enumClass.getEnumConstants()) { - if (feature.isEnabledByDefault()) { - // enable default features - this.featureSet.add(feature); - } - } + @SuppressWarnings("PMD.CloseResource") + public DefaultConfiguration() { + this.featureValues = new HashMap<>(); } /** - * Create a new configuration based on the provided feature enumeration. + * Create a new configuration based on the provided feature value map. * - * @param featureSet + * @param featureValues * the set of enabled features */ - @SuppressWarnings("null") - public DefaultConfiguration(@NonNull Set featureSet) { - this.featureSet = EnumSet.copyOf(featureSet); + public DefaultConfiguration(@NonNull Map featureValues) { + this.featureValues = new HashMap<>(featureValues); } /** @@ -80,37 +70,70 @@ public DefaultConfiguration(@NonNull Set featureSet) { * @param original * the original configuration */ - @SuppressWarnings("null") public DefaultConfiguration(@NonNull DefaultConfiguration original) { - this.featureSet = EnumSet.copyOf(original.featureSet); + this(original.getFeatureValues()); } @Override - public Set getFeatureSet() { - return CollectionUtil.unmodifiableSet(featureSet); + public Map getFeatureValues() { + return CollectionUtil.unmodifiableMap(featureValues); + } + + private void ensureBooleanValue(@NonNull T feature) { + Class valueClass = feature.getValueClass(); + if (!Boolean.class.isAssignableFrom(valueClass)) { + throw new UnsupportedOperationException( + String.format("Feature value class '%s' is boolean valued.", valueClass.getName())); + } } @Override public boolean isFeatureEnabled(@NonNull T feature) { - return featureSet.contains(feature); + ensureBooleanValue(feature); + return get(feature); } @Override public IMutableConfiguration enableFeature(@NonNull T feature) { - this.featureSet.add(feature); + ensureBooleanValue(feature); + featureValues.put(feature, true); return this; } @Override public IMutableConfiguration disableFeature(@NonNull T feature) { - this.featureSet.remove(feature); + ensureBooleanValue(feature); + featureValues.put(feature, false); return this; } @Override - @SuppressWarnings("null") public IMutableConfiguration applyConfiguration(@NonNull IConfiguration original) { - this.featureSet = EnumSet.copyOf(original.getFeatureSet()); + this.featureValues.putAll(original.getFeatureValues()); + return this; + } + + @SuppressWarnings("unchecked") + @Override + public V get(T feature) { + V value = (V)featureValues.get(feature); + if (value == null) { + value = (V)feature.getDefault(); + } + return value; + } + + @Override + public IMutableConfiguration set(T feature, Object value) { + Class featureValueClass = feature.getClass(); + Class valueClass = value.getClass(); + if (!featureValueClass.isAssignableFrom(valueClass)) { + throw new UnsupportedOperationException( + String.format("Provided value of class '%s' is not assignment compatible with feature value class '%s'.", + valueClass.getName(), + featureValueClass.getName())); + } + featureValues.put(feature, value); return this; } } diff --git a/metaschema-model-common/src/main/java/gov/nist/secauto/metaschema/model/common/configuration/IConfiguration.java b/metaschema-model-common/src/main/java/gov/nist/secauto/metaschema/model/common/configuration/IConfiguration.java index 861440a14..1ae05de17 100644 --- a/metaschema-model-common/src/main/java/gov/nist/secauto/metaschema/model/common/configuration/IConfiguration.java +++ b/metaschema-model-common/src/main/java/gov/nist/secauto/metaschema/model/common/configuration/IConfiguration.java @@ -26,7 +26,7 @@ package gov.nist.secauto.metaschema.model.common.configuration; -import java.util.Set; +import java.util.Map; import edu.umd.cs.findbugs.annotations.NonNull; @@ -38,7 +38,7 @@ * the type of the feature set */ @SuppressWarnings({ "PMD.DoNotUseThreads", "PMD.ReplaceVectorWithList" }) -public interface IConfiguration & IConfigurationFeature> { +public interface IConfiguration> { /** * Determines if a specific serialization/deserialization feature is enabled. * @@ -47,12 +47,14 @@ public interface IConfiguration & IConfigurationFeature> { * @return {@code true} if the feature is enabled, or {@code false} otherwise */ boolean isFeatureEnabled(@NonNull T feature); + + V get(@NonNull T feature); /** - * Get the set of enabled features. + * Get the mapping of feature to feature value. * - * @return the set of enabled features. + * @return the mapping. */ @NonNull - Set getFeatureSet(); + Map getFeatureValues(); } diff --git a/metaschema-model-common/src/main/java/gov/nist/secauto/metaschema/model/common/configuration/IConfigurationFeature.java b/metaschema-model-common/src/main/java/gov/nist/secauto/metaschema/model/common/configuration/IConfigurationFeature.java index 4392c0469..e11bb5c48 100644 --- a/metaschema-model-common/src/main/java/gov/nist/secauto/metaschema/model/common/configuration/IConfigurationFeature.java +++ b/metaschema-model-common/src/main/java/gov/nist/secauto/metaschema/model/common/configuration/IConfigurationFeature.java @@ -26,18 +26,31 @@ package gov.nist.secauto.metaschema.model.common.configuration; +import edu.umd.cs.findbugs.annotations.NonNull; + /** * The common interface that all configuration features must implement. *

* This approach is inspired by the configuration implementation in the * Jackson databind library. + * + * @param + * the value type of the feature */ -public interface IConfigurationFeature { +public interface IConfigurationFeature { /** - * Determine if the given feature is enabled in the default configuration. + * Get the default value of the configuration feature. * - * @return {@code true} if the feature is enabled in the default configuration, or {@code false} - * otherwise + * @return the default value + */ + @NonNull + V getDefault(); + + /** + * Get the class of the feature's value. + * + * @return the value's class */ - boolean isEnabledByDefault(); + @NonNull + Class getValueClass(); } diff --git a/metaschema-model-common/src/main/java/gov/nist/secauto/metaschema/model/common/configuration/IMutableConfiguration.java b/metaschema-model-common/src/main/java/gov/nist/secauto/metaschema/model/common/configuration/IMutableConfiguration.java index 652412f70..f9fab1aee 100644 --- a/metaschema-model-common/src/main/java/gov/nist/secauto/metaschema/model/common/configuration/IMutableConfiguration.java +++ b/metaschema-model-common/src/main/java/gov/nist/secauto/metaschema/model/common/configuration/IMutableConfiguration.java @@ -29,7 +29,8 @@ import edu.umd.cs.findbugs.annotations.NonNull; @SuppressWarnings({ "PMD.DoNotUseThreads", "PMD.ReplaceVectorWithList" }) -public interface IMutableConfiguration & IConfigurationFeature> extends IConfiguration { +public interface IMutableConfiguration> + extends IConfiguration { /** * Turn on the provided feature. * @@ -59,4 +60,7 @@ public interface IMutableConfiguration & IConfigurationFeature */ @NonNull IMutableConfiguration applyConfiguration(@NonNull IConfiguration other); + + @NonNull + IMutableConfiguration set(@NonNull T feature, @NonNull Object value); } diff --git a/metaschema-model-common/src/main/java/gov/nist/secauto/metaschema/model/common/metapath/DynamicContext.java b/metaschema-model-common/src/main/java/gov/nist/secauto/metaschema/model/common/metapath/DynamicContext.java index 8b79ec4db..e406a7b78 100644 --- a/metaschema-model-common/src/main/java/gov/nist/secauto/metaschema/model/common/metapath/DynamicContext.java +++ b/metaschema-model-common/src/main/java/gov/nist/secauto/metaschema/model/common/metapath/DynamicContext.java @@ -63,7 +63,7 @@ public class DynamicContext { // NOPMD - intentional data class private final Map> functionResultCache; private CachingLoader documentLoader; @NonNull - private final IMutableConfiguration configuration; + private final IMutableConfiguration> configuration; @NonNull private final Map> letVariableMap; @@ -77,7 +77,7 @@ public DynamicContext(@NonNull StaticContext staticContext) { this.currentDateTime = ZonedDateTime.now(clock); this.availableDocuments = new HashMap<>(); this.functionResultCache = new HashMap<>(); - this.configuration = new DefaultConfiguration<>(MetapathEvaluationFeature.class); + this.configuration = new DefaultConfiguration<>(); this.configuration.enableFeature(MetapathEvaluationFeature.METAPATH_EVALUATE_PREDICATES); this.letVariableMap = new ConcurrentHashMap<>(); } @@ -122,7 +122,7 @@ public DynamicContext disablePredicateEvaluation() { } @NonNull - public IConfiguration getConfiguration() { + public IConfiguration> getConfiguration() { return configuration; } diff --git a/metaschema-model-common/src/main/java/gov/nist/secauto/metaschema/model/common/metapath/MetapathEvaluationFeature.java b/metaschema-model-common/src/main/java/gov/nist/secauto/metaschema/model/common/metapath/MetapathEvaluationFeature.java index fc4b9f698..1324610bc 100644 --- a/metaschema-model-common/src/main/java/gov/nist/secauto/metaschema/model/common/metapath/MetapathEvaluationFeature.java +++ b/metaschema-model-common/src/main/java/gov/nist/secauto/metaschema/model/common/metapath/MetapathEvaluationFeature.java @@ -26,22 +26,22 @@ package gov.nist.secauto.metaschema.model.common.metapath; -import gov.nist.secauto.metaschema.model.common.configuration.IConfigurationFeature; +import gov.nist.secauto.metaschema.model.common.configuration.AbstractConfigurationFeature; -public enum MetapathEvaluationFeature implements IConfigurationFeature { +import edu.umd.cs.findbugs.annotations.NonNull; + +public final class MetapathEvaluationFeature + extends AbstractConfigurationFeature { /** * If enabled, evaluate {@link Predicate} nodes, otherwise skip evaluating them. */ - METAPATH_EVALUATE_PREDICATES(true); - - private final boolean enabledByDefault; - - MetapathEvaluationFeature(boolean enabled) { - this.enabledByDefault = enabled; - } + @NonNull + public static final MetapathEvaluationFeature METAPATH_EVALUATE_PREDICATES + = new MetapathEvaluationFeature<>(Boolean.class, true); - @Override - public boolean isEnabledByDefault() { - return enabledByDefault; + private MetapathEvaluationFeature( + @NonNull Class valueClass, + @NonNull V defaultValue) { + super(valueClass, defaultValue); } } diff --git a/metaschema-model/src/test/java/gov/nist/secauto/metaschema/model/CommonmarkConformanceTest.java b/metaschema-model/src/test/java/gov/nist/secauto/metaschema/model/CommonmarkConformanceTest.java index 7c78d061c..4587bbe3c 100644 --- a/metaschema-model/src/test/java/gov/nist/secauto/metaschema/model/CommonmarkConformanceTest.java +++ b/metaschema-model/src/test/java/gov/nist/secauto/metaschema/model/CommonmarkConformanceTest.java @@ -137,7 +137,7 @@ private static Schema loadDataTypeSchema() throws URISyntaxException, SAXExcepti URL url = MetaschemaLoader.class.getResource(SCHEMA_CLASSPATH); // System.out.println(url.toString()); SchemaFactory schemafactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); - try (InputStream is = MetaschemaLoader.class.getResourceAsStream(SCHEMA_CLASSPATH)) { + try (InputStream is = ObjectUtils.requireNonNull(MetaschemaLoader.class.getResourceAsStream(SCHEMA_CLASSPATH))) { StreamSource source = new StreamSource(is, url.toURI().toString()); schemafactory.setResourceResolver(new Resolver()); diff --git a/metaschema-schema-generator/src/main/java/gov/nist/secauto/metaschema/schemagen/AbstractGenerationState.java b/metaschema-schema-generator/src/main/java/gov/nist/secauto/metaschema/schemagen/AbstractGenerationState.java index 0967792a7..8d543a08a 100644 --- a/metaschema-schema-generator/src/main/java/gov/nist/secauto/metaschema/schemagen/AbstractGenerationState.java +++ b/metaschema-schema-generator/src/main/java/gov/nist/secauto/metaschema/schemagen/AbstractGenerationState.java @@ -63,7 +63,7 @@ public abstract class AbstractGenerationState configuration, + @NonNull IConfiguration> configuration, @NonNull DATATYPE_MANAGER datatypeManager) { this.metaschema = metaschema; this.writer = writer; diff --git a/metaschema-schema-generator/src/main/java/gov/nist/secauto/metaschema/schemagen/AbstractSchemaGenerator.java b/metaschema-schema-generator/src/main/java/gov/nist/secauto/metaschema/schemagen/AbstractSchemaGenerator.java index 3f9b26bb3..39a915b58 100644 --- a/metaschema-schema-generator/src/main/java/gov/nist/secauto/metaschema/schemagen/AbstractSchemaGenerator.java +++ b/metaschema-schema-generator/src/main/java/gov/nist/secauto/metaschema/schemagen/AbstractSchemaGenerator.java @@ -86,7 +86,7 @@ public abstract class AbstractSchemaGenerator configuration); + @NonNull IConfiguration> configuration); /** * Called to generate the actual schema content. @@ -100,7 +100,7 @@ protected abstract S newGenerationState( public void generateFromMetaschema( IMetaschema metaschema, Writer out, - IConfiguration configuration) { + IConfiguration> configuration) { // IInlineStrategy inlineStrategy = IInlineStrategy.newInlineStrategy(configuration); try { // avoid automatically closing streams not owned by the generator diff --git a/metaschema-schema-generator/src/main/java/gov/nist/secauto/metaschema/schemagen/IInlineStrategy.java b/metaschema-schema-generator/src/main/java/gov/nist/secauto/metaschema/schemagen/IInlineStrategy.java index 8d85b61cf..cd1eaf6fe 100644 --- a/metaschema-schema-generator/src/main/java/gov/nist/secauto/metaschema/schemagen/IInlineStrategy.java +++ b/metaschema-schema-generator/src/main/java/gov/nist/secauto/metaschema/schemagen/IInlineStrategy.java @@ -56,7 +56,7 @@ public boolean isInline( IInlineStrategy CHOICE_NOT_INLINE = new ChoiceNotInlineStrategy(); @NonNull - static IInlineStrategy newInlineStrategy(@NonNull IConfiguration configuration) { + static IInlineStrategy newInlineStrategy(@NonNull IConfiguration> configuration) { IInlineStrategy retval; if (configuration.isFeatureEnabled(SchemaGenerationFeature.INLINE_DEFINITIONS)) { if (configuration.isFeatureEnabled(SchemaGenerationFeature.INLINE_CHOICE_DEFINITIONS)) { diff --git a/metaschema-schema-generator/src/main/java/gov/nist/secauto/metaschema/schemagen/ISchemaGenerator.java b/metaschema-schema-generator/src/main/java/gov/nist/secauto/metaschema/schemagen/ISchemaGenerator.java index 801ea2267..0b4f3a198 100644 --- a/metaschema-schema-generator/src/main/java/gov/nist/secauto/metaschema/schemagen/ISchemaGenerator.java +++ b/metaschema-schema-generator/src/main/java/gov/nist/secauto/metaschema/schemagen/ISchemaGenerator.java @@ -59,13 +59,13 @@ public interface ISchemaGenerator { void generateFromMetaschema( @NonNull IMetaschema metaschema, @NonNull Writer writer, - @NonNull IConfiguration configuration); + @NonNull IConfiguration> configuration); static void generateSchema( @NonNull IMetaschema metaschema, @NonNull Path destination, @NonNull SchemaFormat asFormat, - @NonNull IConfiguration configuration) + @NonNull IConfiguration> configuration) throws IOException { ISchemaGenerator schemaGenerator = asFormat.getSchemaGenerator(); @@ -85,7 +85,7 @@ static void generateSchema( @NonNull IMetaschema metaschema, @NonNull OutputStream os, @NonNull SchemaFormat asFormat, - @NonNull IConfiguration configuration) + @NonNull IConfiguration> configuration) throws IOException { ISchemaGenerator schemaGenerator = asFormat.getSchemaGenerator(); diff --git a/metaschema-schema-generator/src/main/java/gov/nist/secauto/metaschema/schemagen/SchemaGenerationFeature.java b/metaschema-schema-generator/src/main/java/gov/nist/secauto/metaschema/schemagen/SchemaGenerationFeature.java index 0d1bbab53..91b14f196 100644 --- a/metaschema-schema-generator/src/main/java/gov/nist/secauto/metaschema/schemagen/SchemaGenerationFeature.java +++ b/metaschema-schema-generator/src/main/java/gov/nist/secauto/metaschema/schemagen/SchemaGenerationFeature.java @@ -26,32 +26,40 @@ package gov.nist.secauto.metaschema.schemagen; -import gov.nist.secauto.metaschema.model.common.configuration.IConfigurationFeature; +import gov.nist.secauto.metaschema.model.common.configuration.AbstractConfigurationFeature; + +import edu.umd.cs.findbugs.annotations.NonNull; /** * Configuration options for schema generation. + * + * @param + * the feature value type */ -public enum SchemaGenerationFeature implements IConfigurationFeature { +public final class SchemaGenerationFeature + extends AbstractConfigurationFeature { + /** * If enabled, definitions that are defined inline will be generated as inline types. If disabled, * definitions will always be generated as global types. */ - INLINE_DEFINITIONS(false), + @NonNull + public static final SchemaGenerationFeature INLINE_DEFINITIONS + = new SchemaGenerationFeature<>(Boolean.class, false); + /** * If enabled, child definitions of a choice that are defined inline will be generated as inline * types. If disabled, child definitions of a choice will always be generated as global types. This * option will only be used if {@link #INLINE_DEFINITIONS} is also enabled. */ - INLINE_CHOICE_DEFINITIONS(false); + @NonNull + public static final SchemaGenerationFeature INLINE_CHOICE_DEFINITIONS + = new SchemaGenerationFeature<>(Boolean.class, false); - private final boolean enabledByDefault; - - SchemaGenerationFeature(boolean enabled) { - this.enabledByDefault = enabled; + private SchemaGenerationFeature( + @NonNull Class valueClass, + @NonNull V defaultValue) { + super(valueClass, defaultValue); } - @Override - public boolean isEnabledByDefault() { - return enabledByDefault; - } } diff --git a/metaschema-schema-generator/src/main/java/gov/nist/secauto/metaschema/schemagen/json/JsonGenerationState.java b/metaschema-schema-generator/src/main/java/gov/nist/secauto/metaschema/schemagen/json/JsonGenerationState.java index ee824575d..574bf32e7 100644 --- a/metaschema-schema-generator/src/main/java/gov/nist/secauto/metaschema/schemagen/json/JsonGenerationState.java +++ b/metaschema-schema-generator/src/main/java/gov/nist/secauto/metaschema/schemagen/json/JsonGenerationState.java @@ -63,15 +63,19 @@ public class JsonGenerationState extends AbstractGenerationState { + @NonNull private final Set definitionSchemas = new LinkedHashSet<>(); + @NonNull private final Map definitionToSchemaMap = new ConcurrentHashMap<>(); + @NonNull private final Map definitionValueToDataTypeSchemaMap = new ConcurrentHashMap<>(); + @NonNull private final Map, IJsonSchema> dataTypeToSchemaMap = new ConcurrentHashMap<>(); public JsonGenerationState( @NonNull IMetaschema metaschema, @NonNull JsonGenerator writer, - @NonNull IConfiguration configuration) { + @NonNull IConfiguration> configuration) { super(metaschema, writer, configuration, new JsonDatatypeManager()); } diff --git a/metaschema-schema-generator/src/main/java/gov/nist/secauto/metaschema/schemagen/json/JsonSchemaGenerator.java b/metaschema-schema-generator/src/main/java/gov/nist/secauto/metaschema/schemagen/json/JsonSchemaGenerator.java index 1f1ea177e..afbb7ee89 100644 --- a/metaschema-schema-generator/src/main/java/gov/nist/secauto/metaschema/schemagen/json/JsonSchemaGenerator.java +++ b/metaschema-schema-generator/src/main/java/gov/nist/secauto/metaschema/schemagen/json/JsonSchemaGenerator.java @@ -86,7 +86,7 @@ protected JsonGenerator newWriter(Writer out) { protected JsonGenerationState newGenerationState( IMetaschema metaschema, JsonGenerator schemaWriter, - IConfiguration configuration) { + IConfiguration> configuration) { return new JsonGenerationState(metaschema, schemaWriter, configuration); } diff --git a/metaschema-schema-generator/src/main/java/gov/nist/secauto/metaschema/schemagen/xml/XmlGenerationState.java b/metaschema-schema-generator/src/main/java/gov/nist/secauto/metaschema/schemagen/xml/XmlGenerationState.java index 929d4f110..d72180c9c 100644 --- a/metaschema-schema-generator/src/main/java/gov/nist/secauto/metaschema/schemagen/xml/XmlGenerationState.java +++ b/metaschema-schema-generator/src/main/java/gov/nist/secauto/metaschema/schemagen/xml/XmlGenerationState.java @@ -82,7 +82,7 @@ public class XmlGenerationState public XmlGenerationState( @NonNull IMetaschema metaschema, @NonNull AutoCloser writer, - @NonNull IConfiguration configuration) { + @NonNull IConfiguration> configuration) { super(metaschema, writer, configuration, new XmlDatatypeManager()); this.defaultNS = ObjectUtils.notNull(metaschema.getXmlNamespace().toASCIIString()); } diff --git a/metaschema-schema-generator/src/main/java/gov/nist/secauto/metaschema/schemagen/xml/XmlSchemaGenerator.java b/metaschema-schema-generator/src/main/java/gov/nist/secauto/metaschema/schemagen/xml/XmlSchemaGenerator.java index 3c14c3207..05b306cf7 100644 --- a/metaschema-schema-generator/src/main/java/gov/nist/secauto/metaschema/schemagen/xml/XmlSchemaGenerator.java +++ b/metaschema-schema-generator/src/main/java/gov/nist/secauto/metaschema/schemagen/xml/XmlSchemaGenerator.java @@ -133,7 +133,7 @@ protected AutoCloser newWriter( protected XmlGenerationState newGenerationState( IMetaschema metaschema, AutoCloser schemaWriter, - IConfiguration configuration) { + IConfiguration> configuration) { return new XmlGenerationState(metaschema, schemaWriter, configuration); } @@ -141,7 +141,7 @@ protected XmlGenerationState newGenerationState( public void generateFromMetaschema( @NonNull IMetaschema metaschema, @NonNull Writer out, - @NonNull IConfiguration configuration) { + @NonNull IConfiguration> configuration) { try (StringWriter stringWriter = new StringWriter()) { super.generateFromMetaschema(metaschema, stringWriter, configuration); stringWriter.flush(); diff --git a/metaschema-schema-generator/src/test/java/gov/nist/secauto/metaschema/schemagen/AbstractSchemaGeneratorTestSuite.java b/metaschema-schema-generator/src/test/java/gov/nist/secauto/metaschema/schemagen/AbstractSchemaGeneratorTestSuite.java index 599dd7315..60c7db2c8 100644 --- a/metaschema-schema-generator/src/test/java/gov/nist/secauto/metaschema/schemagen/AbstractSchemaGeneratorTestSuite.java +++ b/metaschema-schema-generator/src/test/java/gov/nist/secauto/metaschema/schemagen/AbstractSchemaGeneratorTestSuite.java @@ -71,7 +71,7 @@ public abstract class AbstractSchemaGeneratorTestSuite @NonNull protected static final ISchemaGenerator JSON_SCHEMA_GENERATOR = new JsonSchemaGenerator(); @NonNull - protected static final IConfiguration SCHEMA_GENERATION_CONFIG; + protected static final IConfiguration> SCHEMA_GENERATION_CONFIG; @NonNull protected static final BiFunction XML_SCHEMA_PROVIDER; @NonNull @@ -87,8 +87,8 @@ public abstract class AbstractSchemaGeneratorTestSuite = "../metaschema-model/metaschema/test-suite/schema-generation/unit-tests.xml"; static { - IMutableConfiguration features = new DefaultConfiguration<>(SchemaGenerationFeature.class) - .disableFeature(SchemaGenerationFeature.INLINE_DEFINITIONS); + IMutableConfiguration> features = new DefaultConfiguration<>(); + features.disableFeature(SchemaGenerationFeature.INLINE_DEFINITIONS); SCHEMA_GENERATION_CONFIG = features; BiFunction xmlProvider = (metaschema, writer) -> { diff --git a/metaschema-schema-generator/src/test/java/gov/nist/secauto/metaschema/schemagen/JsonSuiteTest.java b/metaschema-schema-generator/src/test/java/gov/nist/secauto/metaschema/schemagen/JsonSuiteTest.java index 8deecb337..dab98eb8e 100644 --- a/metaschema-schema-generator/src/test/java/gov/nist/secauto/metaschema/schemagen/JsonSuiteTest.java +++ b/metaschema-schema-generator/src/test/java/gov/nist/secauto/metaschema/schemagen/JsonSuiteTest.java @@ -135,8 +135,9 @@ void testOSCALComplete() throws IOException, MetaschemaException { // NOPMD - de IMetaschema metaschema = loader.load(new URL( "https://raw.githubusercontent.com/usnistgov/OSCAL/develop/src/metaschema/oscal_complete_metaschema.xml")); ISchemaGenerator schemaGenerator = new JsonSchemaGenerator(); - IMutableConfiguration features = new DefaultConfiguration<>(SchemaGenerationFeature.class) - .disableFeature(SchemaGenerationFeature.INLINE_DEFINITIONS); + IMutableConfiguration> features + = new DefaultConfiguration<>(); + features.disableFeature(SchemaGenerationFeature.INLINE_DEFINITIONS); try (Writer writer = Files.newBufferedWriter( Path.of("oscal-complete_schema.json"), StandardCharsets.UTF_8, @@ -153,8 +154,8 @@ void testTestMetaschema() throws IOException, MetaschemaException { // NOPMD - d IMetaschema metaschema = loader.load(new URL( "https://raw.githubusercontent.com/usnistgov/metaschema/71233f4eb6854e820c7949144e86afa4d7981b22/test-suite/metaschema-xspec/json-schema-gen/json-value-testing-mini-metaschema.xml")); ISchemaGenerator schemaGenerator = new JsonSchemaGenerator(); - IMutableConfiguration features = new DefaultConfiguration<>(SchemaGenerationFeature.class) - .disableFeature(SchemaGenerationFeature.INLINE_DEFINITIONS); + IMutableConfiguration> features = new DefaultConfiguration<>(); + features.disableFeature(SchemaGenerationFeature.INLINE_DEFINITIONS); try (Writer writer = Files.newBufferedWriter( Path.of("json-value-testing-mini_schema.json"), StandardCharsets.UTF_8, diff --git a/metaschema-schema-generator/src/test/java/gov/nist/secauto/metaschema/schemagen/XmlSuiteTest.java b/metaschema-schema-generator/src/test/java/gov/nist/secauto/metaschema/schemagen/XmlSuiteTest.java index 008de3170..5bb99b467 100644 --- a/metaschema-schema-generator/src/test/java/gov/nist/secauto/metaschema/schemagen/XmlSuiteTest.java +++ b/metaschema-schema-generator/src/test/java/gov/nist/secauto/metaschema/schemagen/XmlSuiteTest.java @@ -172,8 +172,8 @@ void testOSCALComplete() throws IOException, MetaschemaException { // NOPMD - de // "https://raw.githubusercontent.com/usnistgov/OSCAL/develop/src/metaschema/oscal_complete_metaschema.xml")); "https://raw.githubusercontent.com/usnistgov/OSCAL/develop/src/metaschema/oscal_complete_metaschema.xml")); ISchemaGenerator schemaGenerator = new XmlSchemaGenerator(); - IMutableConfiguration features = new DefaultConfiguration<>(SchemaGenerationFeature.class) - .disableFeature(SchemaGenerationFeature.INLINE_DEFINITIONS); + IMutableConfiguration> features = new DefaultConfiguration<>(); + features.disableFeature(SchemaGenerationFeature.INLINE_DEFINITIONS); try (Writer writer = Files.newBufferedWriter( Path.of("oscal-complete_schema.xsd"), StandardCharsets.UTF_8,