Skip to content

Commit

Permalink
Fixed bugs causing the ordering of generated classes to be chaotic. A…
Browse files Browse the repository at this point in the history
…lso fixed bugs causing binding configurations to match based on minor URI differences caused by incosistent behavior between file and path URI productions.
  • Loading branch information
david-waltermire committed Jun 15, 2024
1 parent 87e4f68 commit 58a28ce
Show file tree
Hide file tree
Showing 19 changed files with 93 additions and 106 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,8 @@ public T load(@NonNull URI resource) throws MetaschemaException, IOException {
@Override
@NonNull
public T load(@NonNull Path path) throws MetaschemaException, IOException {
return loadInternal(ObjectUtils.notNull(path.toAbsolutePath().normalize().toUri()), new LinkedList<>());
// use toURL to normalize the URI
return load(ObjectUtils.notNull(path.toAbsolutePath().normalize().toUri().toURL()));
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,12 @@
<use-package-name>gov.nist.secauto.metaschema.databind.metaschema</use-package-name>
</java>
</model-binding>
<metaschema-binding
href="../../../../core/metaschema/schema/metaschema/metaschema-module-metaschema.xml">
<define-assembly-binding name="group-as">
<java>
<use-class-name>GroupingAs</use-class-name>
</java>
</define-assembly-binding>
</metaschema-binding>
</metaschema-bindings>
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ public String getPackageNameForModule(IModule module) {
@Nullable
public IDefinitionBindingConfiguration getBindingConfigurationForDefinition(
@NonNull IModelDefinition definition) {
String moduleUri = ObjectUtils.notNull(definition.getContainingModule().getLocation().toString());
String moduleUri = ObjectUtils.notNull(definition.getContainingModule().getLocation().toASCIIString());
String definitionName = definition.getName();

MetaschemaBindingConfiguration metaschemaConfig = getMetaschemaBindingConfiguration(moduleUri);
Expand Down Expand Up @@ -236,7 +236,7 @@ public MetaschemaBindingConfiguration addMetaschemaBindingConfiguration(
* if an error occurred while reading the {@code file}
*/
public void load(Path file) throws IOException {
URL resource = file.toUri().toURL();
URL resource = file.toAbsolutePath().normalize().toUri().toURL();
load(resource);
}

Expand All @@ -249,8 +249,7 @@ public void load(Path file) throws IOException {
* if an error occurred while reading the {@code file}
*/
public void load(File file) throws IOException {
URL resource = file.toURI().toURL();
load(resource);
load(file.toPath());
}

/**
Expand Down Expand Up @@ -299,7 +298,7 @@ private void processMetaschemaBindingConfig(URL configResource, MetaschemaBindin
throws MalformedURLException, URISyntaxException {
String href = metaschema.getHref();
URL moduleUrl = new URL(configResource, href);
String moduleUri = ObjectUtils.notNull(moduleUrl.toURI().toString());
String moduleUri = ObjectUtils.notNull(moduleUrl.toURI().normalize().toString());

MetaschemaBindingConfiguration metaschemaConfig = getMetaschemaBindingConfiguration(moduleUri);
if (metaschemaConfig == null) {
Expand All @@ -325,12 +324,9 @@ private void processMetaschemaBindingConfig(URL configResource, MetaschemaBindin
private static IMutableDefinitionBindingConfiguration processDefinitionBindingConfiguration(
@Nullable IDefinitionBindingConfiguration oldConfig,
@NonNull ObjectDefinitionBindingType objectDefinitionBinding) {
IMutableDefinitionBindingConfiguration config;
if (oldConfig != null) {
config = new DefaultDefinitionBindingConfiguration(oldConfig);
} else {
config = new DefaultDefinitionBindingConfiguration();
}
IMutableDefinitionBindingConfiguration config = oldConfig == null
? new DefaultDefinitionBindingConfiguration()
: new DefaultDefinitionBindingConfiguration(oldConfig);

if (objectDefinitionBinding.isSetJava()) {
JavaObjectDefinitionBindingType java = objectDefinitionBinding.getJava();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
import gov.nist.secauto.metaschema.core.util.CollectionUtil;

import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;

import edu.umd.cs.findbugs.annotations.NonNull;
Expand All @@ -41,7 +41,7 @@ public class DefaultDefinitionBindingConfiguration implements IMutableDefinition
@Nullable
private String baseClassName;
@NonNull
private final Set<String> interfacesToImplement = new HashSet<>();
private final Set<String> interfacesToImplement = new LinkedHashSet<>();

/**
* Create a new definition binding configuration.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
import org.apache.commons.lang3.StringUtils;

import java.lang.annotation.Annotation;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;

import javax.lang.model.element.Modifier;
Expand Down Expand Up @@ -83,7 +83,7 @@ public Set<IModelDefinition> generateMemberAnnotation(

TypeInfoUtils.buildCommonBindingAnnotationValues(getInstance(), memberAnnotation);

Set<IModelDefinition> retval = new HashSet<>();
Set<IModelDefinition> retval = new LinkedHashSet<>();

I instance = getInstance();
IModelDefinition definition = getInstance().getDefinition();
Expand All @@ -106,7 +106,7 @@ public Set<IModelDefinition> generateMemberAnnotation(

TypeSpec.Builder subClass = TypeSpec.classBuilder(itemTypeName);
subClass.superclass(extendedClassName);
subClass.addModifiers(Modifier.PUBLIC, Modifier.STATIC);
subClass.addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL);
// subClass.addField(
// FieldSpec.builder(String.class, "DISCRIMINATOR", Modifier.PUBLIC,
// Modifier.STATIC, Modifier.FINAL)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@
import gov.nist.secauto.metaschema.databind.codegen.typeinfo.def.IAssemblyDefinitionTypeInfo;
import gov.nist.secauto.metaschema.databind.model.annotations.GroupAs;

import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
Expand Down Expand Up @@ -100,7 +100,7 @@ public String getBaseName() {
public Set<IModelDefinition> buildField(
TypeSpec.Builder typeBuilder,
FieldSpec.Builder fieldBuilder) {
Set<IModelDefinition> retval = new HashSet<>(super.buildField(typeBuilder, fieldBuilder));
Set<IModelDefinition> retval = new LinkedHashSet<>(super.buildField(typeBuilder, fieldBuilder));

AnnotationSpec.Builder annotation = newBindingAnnotation();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,8 @@
import gov.nist.secauto.metaschema.databind.codegen.typeinfo.def.IAssemblyDefinitionTypeInfo;
import gov.nist.secauto.metaschema.databind.codegen.typeinfo.def.IModelDefinitionTypeInfo;

import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.Set;

Expand Down Expand Up @@ -93,7 +93,7 @@ public Set<IModelDefinition> buildField(

IModelDefinition definition = getInstance().getDefinition();
if (definition.isInline() && (definition.hasChildren() || definition instanceof IAssemblyDefinition)) {
retval = new HashSet<>(retval);
retval = new LinkedHashSet<>(retval);

// this is an inline definition that must be built as a child class
retval.add(definition);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,8 @@
import gov.nist.secauto.metaschema.databind.model.annotations.BoundChoiceGroup;

import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
Expand Down Expand Up @@ -98,7 +98,7 @@ public Set<IModelDefinition> buildBindingAnnotation(
annotation.addMember("jsonKey", "$S", jsonKeyName);
}

Set<IModelDefinition> retval = new HashSet<>();
Set<IModelDefinition> retval = new LinkedHashSet<>();

IAssemblyDefinitionTypeInfo parentTypeInfo = getParentTypeInfo();
ITypeResolver typeResolver = parentTypeInfo.getTypeResolver();
Expand All @@ -124,52 +124,6 @@ public Set<IModelDefinition> buildBindingAnnotation(
annotation,
typeBuilder,
referencedDefinitions.get(className).size() > 1));

// Class<?> groupedAnnotationType;
// if (modelInstance instanceof IFieldInstanceGrouped) {
// groupedAnnotationType = BoundGroupedField.class;
// } else if (modelInstance instanceof IAssemblyInstanceGrouped) {
// groupedAnnotationType = BoundGroupedAssembly.class;
// } else {
// throw new UnsupportedOperationException(String.format("Unsuported named model
// instance type '%s'.",
// instanceTypeInfo.getClass().getName()));
// }
// AnnotationSpec.Builder memberAnnotation =
// ObjectUtils.notNull(AnnotationSpec.builder(groupedAnnotationType));

// instanceTypeInfo.buildBindingAnnotationCommon(memberAnnotation);
//
// IContainerFlag definition = modelInstance.getDefinition();
// TypeName instanceTypeName;
// if (definition.isInline()) {
// retval.add(definition);
// instanceTypeName = typeResolver.getClassName(definition);
// } else {
// // build the definition
// throw new UnsupportedOperationException("implement");
// // ClassName extendedClassName = typeResolver.getClassName(definition);
// // ClassName parentClassName = getParentDefinitionTypeInfo().getClassName();
// // ClassName extendingClassName =
// typeResolver.getSubclassName(parentClassName,
// // definition, modelInstance);
// //
// // IModelDefinitionTypeInfo referencedClassTypeInfo =
// // typeResolver.getTypeInfo(definition);
// // typeResolver.getSubClassName(instanceTypeInfo, );
// // instanceTypeName = instanceTypeInfo.getJavaItemType();
// }
//
// memberAnnotation.addMember("binding", "$T.class",
// instanceTypeInfo.getJavaItemType());
//
// if (modelInstance instanceof IFieldInstanceGrouped) {
// annotation.addMember("fields", "$L",
// instanceTypeInfo.generateMemberAnnotation().build());
// } else if (modelInstance instanceof IAssemblyInstanceGrouped) {
// annotation.addMember("assemblies", "$L",
// instanceTypeInfo.generateMemberAnnotation().build());
// }
}

if (maxOccurs == -1 || maxOccurs > 1) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,8 @@
import gov.nist.secauto.metaschema.databind.model.IMetaschemaData;
import gov.nist.secauto.metaschema.databind.model.annotations.MetaschemaAssembly;
import gov.nist.secauto.metaschema.databind.model.annotations.MetaschemaField;
import gov.nist.secauto.metaschema.databind.model.annotations.MetaschemaModule;
import gov.nist.secauto.metaschema.databind.model.annotations.MetaschemaPackage;
import gov.nist.secauto.metaschema.databind.model.annotations.Module;
import gov.nist.secauto.metaschema.databind.model.annotations.XmlNs;
import gov.nist.secauto.metaschema.databind.model.annotations.XmlNsForm;
import gov.nist.secauto.metaschema.databind.model.annotations.XmlSchema;
Expand All @@ -77,7 +77,7 @@
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
Expand Down Expand Up @@ -148,7 +148,7 @@ public IGeneratedModuleClass generateClass(
module.getAssemblyDefinitions().stream(),
module.getFieldDefinitions().stream());

Set<String> classNames = new HashSet<>();
Set<String> classNames = new LinkedHashSet<>();

@SuppressWarnings("PMD.UseConcurrentHashMap") // map is unmodifiable
Map<IModelDefinition, IGeneratedDefinitionClass> definitionProductions
Expand Down Expand Up @@ -271,7 +271,7 @@ protected TypeSpec.Builder newClassBuilder(

builder.superclass(AbstractBoundModule.class);

AnnotationSpec.Builder moduleAnnotation = AnnotationSpec.builder(Module.class);
AnnotationSpec.Builder moduleAnnotation = AnnotationSpec.builder(MetaschemaModule.class);

ITypeResolver typeResolver = getTypeResolver();
for (IFieldDefinition definition : module.getFieldDefinitions()) {
Expand Down Expand Up @@ -510,7 +510,7 @@ protected Set<IModelDefinition> buildClass(

builder.addAnnotation(metaschemaAssembly.build());

return new HashSet<>(buildClass((IModelDefinitionTypeInfo) typeInfo, builder));
return new LinkedHashSet<>(buildClass((IModelDefinitionTypeInfo) typeInfo, builder));
}

/**
Expand All @@ -536,7 +536,7 @@ protected Set<IModelDefinition> buildClass(

builder.addAnnotation(metaschemaField.build());

return new HashSet<>(buildClass((IModelDefinitionTypeInfo) typeInfo, builder));
return new LinkedHashSet<>(buildClass((IModelDefinitionTypeInfo) typeInfo, builder));
}

/**
Expand All @@ -559,7 +559,7 @@ protected Set<IModelDefinition> buildClass(
builder.addJavadoc(description.toHtml());
}

Set<IModelDefinition> additionalChildClasses = new HashSet<>();
Set<IModelDefinition> additionalChildClasses = new LinkedHashSet<>();

// // generate a no-arg constructor
// builder.addMethod(MethodSpec.constructorBuilder().addModifiers(Modifier.PUBLIC).build());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@

import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
Expand Down Expand Up @@ -84,15 +85,15 @@ protected IBindingConfiguration getBindingConfiguration() {
public IAssemblyDefinitionTypeInfo getTypeInfo(@NonNull IAssemblyDefinition definition) {
return ObjectUtils.notNull(assemblyDefinitionToTypeInfoMap.computeIfAbsent(
definition,
(def) -> IAssemblyDefinitionTypeInfo.newTypeInfo(ObjectUtils.notNull(def),
def -> IAssemblyDefinitionTypeInfo.newTypeInfo(ObjectUtils.notNull(def),
this)));
}

@Override
public IFieldDefinitionTypeInfo getTypeInfo(@NonNull IFieldDefinition definition) {
return ObjectUtils.notNull(fieldDefinitionToTypeInfoMap.computeIfAbsent(
definition,
(def) -> IFieldDefinitionTypeInfo.newTypeInfo(ObjectUtils.notNull(def),
def -> IFieldDefinitionTypeInfo.newTypeInfo(ObjectUtils.notNull(def),
this)));
}

Expand Down Expand Up @@ -176,7 +177,7 @@ public ClassName getSubclassName(
public ClassName getClassName(@NonNull IModelDefinition definition) {
return ObjectUtils.notNull(definitionToTypeMap.computeIfAbsent(
definition,
(def) -> {
def -> {
String packageName = getBindingConfiguration().getPackageNameForModule(def.getContainingModule());
String suggestedClassName = getBindingConfiguration().getClassName(definition);
return getFlagContainerClassName(def, packageName, suggestedClassName);
Expand All @@ -198,7 +199,7 @@ public ClassName getClassName(IChoiceGroupInstance instance) {
public ClassName getClassName(IModule module) {
return ObjectUtils.notNull(moduleToTypeMap.computeIfAbsent(
module,
(mod) -> {
mod -> {
assert mod != null;
String packageName = getBindingConfiguration().getPackageNameForModule(mod);
String className = getBindingConfiguration().getClassName(mod);
Expand All @@ -216,7 +217,7 @@ public ClassName getClassName(IModule module) {
protected Set<String> getClassNamesFor(@NonNull String packageOrTypeName) {
return ObjectUtils.notNull(packageToClassNamesMap.computeIfAbsent(
packageOrTypeName,
(pkg) -> Collections.synchronizedSet(new HashSet<>())));
pkg -> Collections.synchronizedSet(new LinkedHashSet<>())));
}

protected boolean isClassNameClash(@NonNull String packageOrTypeName, @NonNull String className) {
Expand Down
Loading

0 comments on commit 58a28ce

Please sign in to comment.