Skip to content

Commit

Permalink
Refactored configurations to expose the YAML_CODEPOINT_LIMIT_DEFAULT …
Browse files Browse the repository at this point in the history
…as a integer valued config option. Previously, config options had to be boolean values.
  • Loading branch information
david-waltermire committed Jul 11, 2023
1 parent 8103b86 commit 282ff93
Show file tree
Hide file tree
Showing 40 changed files with 495 additions and 200 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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<SchemaGenerationFeature> configuration
= new DefaultConfiguration<>(SchemaGenerationFeature.class);
IMutableConfiguration<SchemaGenerationFeature<?>> configuration = new DefaultConfiguration<>();
if (cmdLine.hasOption(INLINE_TYPES_OPTION)) {
configuration.enableFeature(SchemaGenerationFeature.INLINE_DEFINITIONS);
if (SchemaFormat.JSON.equals(asFormat)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -49,7 +51,7 @@
* the bound class to deserialize to
*/
public abstract class AbstractDeserializer<CLASS>
extends AbstractSerializationBase<DeserializationFeature>
extends AbstractSerializationBase<DeserializationFeature<?>>
implements IDeserializer<CLASS> {

private IConstraintValidationHandler constraintValidationHandler;
Expand All @@ -63,7 +65,7 @@ public abstract class AbstractDeserializer<CLASS>
* 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
Expand Down Expand Up @@ -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<CLASS> enableFeature(DeserializationFeature<?> feature) {
return set(feature, true);
}

@Override
public IDeserializer<CLASS> disableFeature(DeserializationFeature<?> feature) {
return set(feature, false);
}

@Override
public IDeserializer<CLASS> applyConfiguration(
@NonNull IConfiguration<DeserializationFeature<?>> other) {
IMutableConfiguration<DeserializationFeature<?>> config = getConfiguration();
config.applyConfiguration(other);
configurationChanged(config);
return this;
}

@Override
public IDeserializer<CLASS> set(DeserializationFeature<?> feature, Object value) {
IMutableConfiguration<DeserializationFeature<?>> config = getConfiguration();
config.set(feature, value);
configurationChanged(config);
return this;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<T extends Enum<T> & IConfigurationFeature>
abstract class AbstractSerializationBase<T extends IConfigurationFeature<?>>
implements IMutableConfiguration<T> {
@NonNull
private final IBindingContext bindingContext;
Expand All @@ -48,11 +47,12 @@ abstract class AbstractSerializationBase<T extends Enum<T> & IConfigurationFeatu
@NonNull
private final DefaultConfiguration<T> configuration;

protected AbstractSerializationBase(@NonNull IBindingContext bindingContext,
@NonNull IAssemblyClassBinding classBinding, @NonNull Class<T> 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<>();
}

/**
Expand All @@ -76,39 +76,34 @@ protected IAssemblyClassBinding getClassBinding() {
return classBinding;
}

@SuppressWarnings("unused")
protected void configurationChanged(@NonNull IMutableConfiguration<T> 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<T> getConfiguration() {
protected IMutableConfiguration<T> getConfiguration() {
return configuration;
}

@Override
public IMutableConfiguration<T> enableFeature(T feature) {
return configuration.enableFeature(feature);
}

@Override
public IMutableConfiguration<T> disableFeature(T feature) {
return configuration.disableFeature(feature);
}

@Override
public boolean isFeatureEnabled(T feature) {
return configuration.isFeatureEnabled(feature);
}

@Override
public Set<T> getFeatureSet() {
return configuration.getFeatureSet();
public Map<T, Object> getFeatureValues() {
return configuration.getFeatureValues();
}

@Override
public IMutableConfiguration<T>
applyConfiguration(@NonNull IConfiguration<T> other) {
return configuration.applyConfiguration(other);
public <V> V get(T feature) {
return configuration.get(feature);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -38,7 +40,7 @@
* the bound class to serialize from
*/
public abstract class AbstractSerializer<CLASS>
extends AbstractSerializationBase<SerializationFeature>
extends AbstractSerializationBase<SerializationFeature<?>>
implements ISerializer<CLASS> {

/**
Expand All @@ -49,7 +51,36 @@ public abstract class AbstractSerializer<CLASS>
* @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<CLASS> enableFeature(SerializationFeature<?> feature) {
return set(feature, true);
}

@Override
public ISerializer<CLASS> disableFeature(SerializationFeature<?> feature) {
return set(feature, false);
}

@Override
public ISerializer<CLASS> applyConfiguration(
@NonNull IConfiguration<SerializationFeature<?>> other) {
IMutableConfiguration<SerializationFeature<?>> config = getConfiguration();
config.applyConfiguration(other);
configurationChanged(config);
return this;
}

@Override
public ISerializer<CLASS> set(SerializationFeature<?> feature, Object value) {
IMutableConfiguration<SerializationFeature<?>> config = getConfiguration();
config.set(feature, value);
configurationChanged(config);
return this;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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<DeserializationFeature> configuration;
private final IMutableConfiguration<DeserializationFeature<?>> configuration;

/**
* An {@link EntityResolver} is not provided by default.
Expand All @@ -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<DeserializationFeature> enableFeature(DeserializationFeature feature) {
return configuration.enableFeature(feature);
public IBoundLoader enableFeature(DeserializationFeature<?> feature) {
return set(feature, true);
}

@Override
public IMutableConfiguration<DeserializationFeature> 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<DeserializationFeature> getFeatureSet() {
return configuration.getFeatureSet();
public Map<DeserializationFeature<?>, Object> getFeatureValues() {
return getConfiguration().getFeatureValues();
}

@Override
public IMutableConfiguration<DeserializationFeature>
applyConfiguration(@NonNull IConfiguration<DeserializationFeature> other) {
return configuration.applyConfiguration(other);
public IBoundLoader applyConfiguration(@NonNull IConfiguration<DeserializationFeature<?>> other) {
getConfiguration().applyConfiguration(other);
resetDetector();
return this;
}

private void resetDetector() {
// reset the detector
detectorFactory = null;
}

@NonNull
protected IMutableConfiguration<DeserializationFeature> getConfiguration() {
protected IMutableConfiguration<DeserializationFeature<?>> getConfiguration() {
return configuration;
}

@Override
public IBoundLoader set(DeserializationFeature<?> feature, Object value) {
getConfiguration().set(feature, value);
resetDetector();
return this;
}

@Override
public <V> V get(DeserializationFeature<?> feature) {
return getConfiguration().get(feature);
}

@Override
public IBindingContext getBindingContext() {
return bindingContext;
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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()));
Expand Down Expand Up @@ -452,8 +484,10 @@ protected <CLASS> CLASS loadInternal(@NonNull Class<CLASS> clazz, @NonNull Buffe
}

@NonNull
protected <CLASS> IDeserializer<CLASS> getDeserializer(@NonNull Class<CLASS> clazz, @NonNull Format format,
@NonNull IConfiguration<DeserializationFeature> config) {
protected <CLASS> IDeserializer<CLASS> getDeserializer(
@NonNull Class<CLASS> clazz,
@NonNull Format format,
@NonNull IConfiguration<DeserializationFeature<?>> config) {
IDeserializer<CLASS> retval = getBindingContext().newDeserializer(format, clazz);
retval.applyConfiguration(config);
return retval;
Expand Down
Loading

0 comments on commit 282ff93

Please sign in to comment.