From 7f64d121d77a8d5d4ddc59f9e94f6b06a1082d8e Mon Sep 17 00:00:00 2001 From: highsource Date: Sun, 27 Dec 2015 22:53:58 +0100 Subject: [PATCH] Issue #60. --- .../jsonix/analysis/ElementInfoVertex.java | 4 +- .../analysis/PropertyInfoGraphBuilder.java | 16 +-- .../JsonSchemaClassInfoProducer.java | 4 +- .../JsonSchemaEnumLeafInfoProducer.java | 2 +- .../jsonschema/JsonSchemaMappingCompiler.java | 14 +- ...JsonSchemaPropertyInfoProducerVisitor.java | 36 +++-- .../JsonSchemaRefTypeInfoProducerVisitor.java | 49 +++++-- .../CreateTypeInfoDeclarationVisitor.java | 56 +++++--- .../compilation/mapping/MappingCompiler.java | 52 +++++-- .../mapping/PropertyInfoVisitor.java | 48 +++++-- .../xsom/CollectSimpleTypeNamesVisitor.java | 130 ++++++++++++++++++ pom.xml | 4 +- tests/issues/src/main/resources/schema.xsd | 35 ++++- .../jsonix/tests/issues/CompileIssues.java | 3 +- tests/pom.xml | 1 + 15 files changed, 367 insertions(+), 87 deletions(-) create mode 100644 compiler/src/main/java/org/hisrc/jsonix/xml/xsom/CollectSimpleTypeNamesVisitor.java diff --git a/compiler/src/main/java/org/hisrc/jsonix/analysis/ElementInfoVertex.java b/compiler/src/main/java/org/hisrc/jsonix/analysis/ElementInfoVertex.java index 463e258..420576e 100644 --- a/compiler/src/main/java/org/hisrc/jsonix/analysis/ElementInfoVertex.java +++ b/compiler/src/main/java/org/hisrc/jsonix/analysis/ElementInfoVertex.java @@ -5,9 +5,9 @@ import javax.xml.namespace.QName; import org.apache.commons.lang3.Validate; +import org.jvnet.jaxb2_commons.xml.bind.model.MClassInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MElementInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MPackageInfo; -import org.jvnet.jaxb2_commons.xml.bind.model.MTypeInfo; public class ElementInfoVertex extends InfoVertex { @@ -59,7 +59,7 @@ public boolean equals(Object obj) { @Override public String toString() { final QName elementName = this.elementInfo.getElementName(); - final MTypeInfo scope = elementInfo.getScope(); + final MClassInfo scope = elementInfo.getScope(); return MessageFormat.format( "Element [{0}], scope [{1}]", elementName.toString(), diff --git a/compiler/src/main/java/org/hisrc/jsonix/analysis/PropertyInfoGraphBuilder.java b/compiler/src/main/java/org/hisrc/jsonix/analysis/PropertyInfoGraphBuilder.java index 3d5bd63..bfd6897 100644 --- a/compiler/src/main/java/org/hisrc/jsonix/analysis/PropertyInfoGraphBuilder.java +++ b/compiler/src/main/java/org/hisrc/jsonix/analysis/PropertyInfoGraphBuilder.java @@ -7,11 +7,13 @@ import org.jvnet.jaxb2_commons.xml.bind.model.MAnyElementPropertyInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MAttributePropertyInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MClassInfo; +import org.jvnet.jaxb2_commons.xml.bind.model.MElement; import org.jvnet.jaxb2_commons.xml.bind.model.MElementInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MElementPropertyInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MElementRefPropertyInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MElementRefsPropertyInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MElementTypeInfo; +import org.jvnet.jaxb2_commons.xml.bind.model.MElementTypeRef; import org.jvnet.jaxb2_commons.xml.bind.model.MElementsPropertyInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MModelInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MPropertyInfoVisitor; @@ -93,8 +95,7 @@ public PropertyInfoVertex visitElementsPropertyInfo( MElementsPropertyInfo info) { // Elements property has a "soft" dependency types of its elements // That is, some of these types may be excluded - for (MElementTypeInfo elementTypeInfo : info - .getElementTypeInfos()) { + for (MElementTypeRef elementTypeInfo : info.getElementTypeInfos()) { addSoftDependencyOnType(vertex, elementTypeInfo); } return vertex; @@ -112,8 +113,7 @@ public PropertyInfoVertex visitElementRefPropertyInfo( @Override public PropertyInfoVertex visitElementRefsPropertyInfo( MElementRefsPropertyInfo info) { - for (MElementTypeInfo elementTypeInfo : info - .getElementTypeInfos()) { + for (MElement elementTypeInfo : info.getElementTypeInfos()) { // Element references property has "soft" dependencies on the // types // of its elements @@ -123,9 +123,8 @@ public PropertyInfoVertex visitElementRefsPropertyInfo( return vertex; } - private void addSubstitutionHeadDependencies( - MElementTypeInfo elementTypeInfo, - PropertyInfoVertex propertyInfoVertex) { + private , O> void addSubstitutionHeadDependencies( + M elementTypeInfo, PropertyInfoVertex propertyInfoVertex) { final MClassInfo classInfo = propertyInfoVertex.getClassInfo(); final QName elementName = elementTypeInfo.getElementName(); for (MElementInfo elementInfo : this.modelInfo.getElementInfos()) { @@ -136,7 +135,8 @@ private void addSubstitutionHeadDependencies( .elementInfo(elementInfo); modelInfoGraphBuilder.addSoftDependency(elementInfoVertex, propertyInfoVertex); - modelInfoGraphBuilder.addSoftDependency(propertyInfoVertex, elementInfoVertex); + modelInfoGraphBuilder.addSoftDependency(propertyInfoVertex, + elementInfoVertex); } } } diff --git a/compiler/src/main/java/org/hisrc/jsonix/compilation/jsonschema/JsonSchemaClassInfoProducer.java b/compiler/src/main/java/org/hisrc/jsonix/compilation/jsonschema/JsonSchemaClassInfoProducer.java index 0597bd3..83a603e 100644 --- a/compiler/src/main/java/org/hisrc/jsonix/compilation/jsonschema/JsonSchemaClassInfoProducer.java +++ b/compiler/src/main/java/org/hisrc/jsonix/compilation/jsonschema/JsonSchemaClassInfoProducer.java @@ -48,11 +48,11 @@ public JsonSchemaBuilder produce(MClassInfo classInfo) { final String localName = classInfo .getContainerLocalName(JsonixConstants.DEFAULT_SCOPED_NAME_DELIMITER); classInfoSchema.addTitle(localName); - final MClassTypeInfo baseTypeInfo = classInfo.getBaseTypeInfo(); + final MClassTypeInfo baseTypeInfo = classInfo.getBaseTypeInfo(); final JsonSchemaBuilder typeInfoSchema; if (baseTypeInfo != null) { final JsonSchemaBuilder baseTypeInfoSchema = mappingCompiler - .createTypeInfoSchemaRef(baseTypeInfo); + .createTypeInfoSchemaRef(baseTypeInfo, baseTypeInfo); typeInfoSchema = new JsonSchemaBuilder(); typeInfoSchema.addAllOf(baseTypeInfoSchema); typeInfoSchema.addAllOf(classInfoSchema); diff --git a/compiler/src/main/java/org/hisrc/jsonix/compilation/jsonschema/JsonSchemaEnumLeafInfoProducer.java b/compiler/src/main/java/org/hisrc/jsonix/compilation/jsonschema/JsonSchemaEnumLeafInfoProducer.java index 61c3894..2eb9670 100644 --- a/compiler/src/main/java/org/hisrc/jsonix/compilation/jsonschema/JsonSchemaEnumLeafInfoProducer.java +++ b/compiler/src/main/java/org/hisrc/jsonix/compilation/jsonschema/JsonSchemaEnumLeafInfoProducer.java @@ -34,7 +34,7 @@ public JsonSchemaBuilder produce(MEnumLeafInfo enumLeafInfo) { final MTypeInfo baseTypeInfo = enumLeafInfo.getBaseTypeInfo(); final JsonSchemaBuilder typeInfoSchema; final JsonSchemaBuilder baseTypeInfoSchema = mappingCompiler - .createTypeInfoSchemaRef(baseTypeInfo); + .createTypeInfoSchemaRef(enumLeafInfo, baseTypeInfo); typeInfoSchema = new JsonSchemaBuilder(); typeInfoSchema.addAllOf(baseTypeInfoSchema); diff --git a/compiler/src/main/java/org/hisrc/jsonix/compilation/jsonschema/JsonSchemaMappingCompiler.java b/compiler/src/main/java/org/hisrc/jsonix/compilation/jsonschema/JsonSchemaMappingCompiler.java index b75d5d0..c76afb7 100644 --- a/compiler/src/main/java/org/hisrc/jsonix/compilation/jsonschema/JsonSchemaMappingCompiler.java +++ b/compiler/src/main/java/org/hisrc/jsonix/compilation/jsonschema/JsonSchemaMappingCompiler.java @@ -13,6 +13,7 @@ import org.jvnet.jaxb2_commons.xml.bind.model.MElementInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MEnumLeafInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MTypeInfo; +import org.jvnet.jaxb2_commons.xml.bind.model.origin.MOriginated; public class JsonSchemaMappingCompiler { @@ -61,7 +62,7 @@ private void addElementInfos(final JsonSchemaBuilder schema) { for (MElementInfo elementInfo : mapping.getElementInfos()) { final QName elementName = elementInfo.getElementName(); final MTypeInfo typeInfo = elementInfo.getTypeInfo(); - final MTypeInfo scope = elementInfo.getScope(); + final MClassInfo scope = elementInfo.getScope(); final JsonSchemaBuilder elementInfoSchema = new JsonSchemaBuilder(); elementInfoSchema.addType(JsonSchemaConstants.OBJECT_TYPE); @@ -85,7 +86,7 @@ private void addElementInfos(final JsonSchemaBuilder schema) { nameConstant)); elementInfoSchema.addProperty(JsonixConstants.VALUE_PROPERTY_NAME, - createTypeInfoSchemaRef(typeInfo)); + createTypeInfoSchemaRef(elementInfo, typeInfo)); elementInfoSchema .add(JsonixJsonSchemaConstants.ELEMENT_NAME_PROPERTY_NAME, @@ -97,7 +98,7 @@ private void addElementInfos(final JsonSchemaBuilder schema) { if (scope != null) { elementInfoSchema.add( JsonixJsonSchemaConstants.SCOPE_PROPERTY_NAME, - createTypeInfoSchemaRef(scope)); + createTypeInfoSchemaRef(scope, scope)); } schema.addAnyOf(elementInfoSchema); } @@ -129,9 +130,10 @@ private void addClassInfoSchemas(final JsonSchemaBuilder schema) { } } - public JsonSchemaBuilder createTypeInfoSchemaRef(MTypeInfo typeInfo) { + public , O> JsonSchemaBuilder createTypeInfoSchemaRef( + M originated, MTypeInfo typeInfo) { return typeInfo - .acceptTypeInfoVisitor(new JsonSchemaRefTypeInfoProducerVisitor( - this)); + .acceptTypeInfoVisitor(new JsonSchemaRefTypeInfoProducerVisitor( + this, originated)); } } diff --git a/compiler/src/main/java/org/hisrc/jsonix/compilation/jsonschema/JsonSchemaPropertyInfoProducerVisitor.java b/compiler/src/main/java/org/hisrc/jsonix/compilation/jsonschema/JsonSchemaPropertyInfoProducerVisitor.java index 5325992..bdce6c6 100644 --- a/compiler/src/main/java/org/hisrc/jsonix/compilation/jsonschema/JsonSchemaPropertyInfoProducerVisitor.java +++ b/compiler/src/main/java/org/hisrc/jsonix/compilation/jsonschema/JsonSchemaPropertyInfoProducerVisitor.java @@ -15,17 +15,22 @@ import org.jvnet.jaxb2_commons.xml.bind.model.MAnyAttributePropertyInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MAnyElementPropertyInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MAttributePropertyInfo; +import org.jvnet.jaxb2_commons.xml.bind.model.MElement; import org.jvnet.jaxb2_commons.xml.bind.model.MElementPropertyInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MElementRefPropertyInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MElementRefsPropertyInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MElementTypeInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MElementTypeInfos; +import org.jvnet.jaxb2_commons.xml.bind.model.MElementTypeRef; import org.jvnet.jaxb2_commons.xml.bind.model.MElementsPropertyInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MPropertyInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MPropertyInfoVisitor; import org.jvnet.jaxb2_commons.xml.bind.model.MTypeInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MValuePropertyInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MWrappable; +import org.jvnet.jaxb2_commons.xml.bind.model.origin.MElementOrigin; +import org.jvnet.jaxb2_commons.xml.bind.model.origin.MElementTypeRefOrigin; +import org.jvnet.jaxb2_commons.xml.bind.model.origin.MOriginated; import com.sun.tools.xjc.model.Multiplicity; @@ -56,7 +61,7 @@ public JsonSchemaBuilder visitElementPropertyInfo( addElementNameSchema(info.getElementName(), schema); addWrappableSchema(info, schema); - final JsonSchemaBuilder itemTypeSchema = createTypeSchema(info + final JsonSchemaBuilder itemTypeSchema = createTypeSchema(info, info .getTypeInfo()); final JsonSchemaBuilder typeSchema = createPossiblyCollectionTypeSchema( info, itemTypeSchema); @@ -147,7 +152,7 @@ public JsonSchemaBuilder visitValuePropertyInfo( addPropertyInfoSchema(info, schema); addPropertyInfoTypeSchema(StandardNaming.VALUE, schema); - final JsonSchemaBuilder itemTypeSchema = createTypeSchema(info + final JsonSchemaBuilder itemTypeSchema = createTypeSchema(info, info .getTypeInfo()); final JsonSchemaBuilder typeSchema = createPossiblyCollectionTypeSchema( info, itemTypeSchema); @@ -200,7 +205,7 @@ public JsonSchemaBuilder visitAttributePropertyInfo( addPropertyInfoSchema(info, schema); addPropertyInfoTypeSchema(StandardNaming.ATTRIBUTE, schema); addAttributeNameSchema(info.getAttributeName(), schema); - final JsonSchemaBuilder itemTypeSchema = createTypeSchema(info + final JsonSchemaBuilder itemTypeSchema = createTypeSchema(info, info .getTypeInfo()); final JsonSchemaBuilder typeSchema = createPossiblyCollectionTypeSchema( info, itemTypeSchema); @@ -271,12 +276,12 @@ private void addAttributeNameSchema(QName attributeName, } private JsonSchemaBuilder createElementTypeInfosSchema( - MElementTypeInfos info) { + MElementTypeInfos, MElementTypeRefOrigin> info) { final JsonSchemaBuilder schema = new JsonSchemaBuilder(); if (!info.getElementTypeInfos().isEmpty()) { - for (MElementTypeInfo elementTypeInfo : info + for (MElementTypeRef elementTypeInfo : info .getElementTypeInfos()) { final JsonSchemaBuilder elementTypeInfoSchema = createElementTypeInfoSchema(elementTypeInfo); schema.addAnyOf(elementTypeInfoSchema); @@ -286,24 +291,24 @@ private JsonSchemaBuilder createElementTypeInfosSchema( } private JsonSchemaBuilder createElementTypeInfoSchema( - MElementTypeInfo elementTypeInfo) { + MElementTypeRef elementTypeInfo) { final JsonSchemaBuilder elementTypeInfoSchema = new JsonSchemaBuilder(); addElementNameSchema(elementTypeInfo.getElementName(), elementTypeInfoSchema); - elementTypeInfoSchema.addAnyOf(createTypeSchema(elementTypeInfo + elementTypeInfoSchema.addAnyOf(createTypeSchema(elementTypeInfo, elementTypeInfo .getTypeInfo())); return elementTypeInfoSchema; } private List createElementRefsSchema( - MElementTypeInfos info) { + MElementTypeInfos, MElementOrigin> info) { - final List> elementTypeInfos = info + final List> elementTypeInfos = info .getElementTypeInfos(); final List schemas = new ArrayList( elementTypeInfos.size()); - for (MElementTypeInfo elementTypeInfo : elementTypeInfos) { + for (MElement elementTypeInfo : elementTypeInfos) { final JsonSchemaBuilder elementTypeInfoSchema = createElementRefSchema(elementTypeInfo); schemas.add(elementTypeInfoSchema); } @@ -311,8 +316,8 @@ private List createElementRefsSchema( } - private JsonSchemaBuilder createElementRefSchema( - MElementTypeInfo elementTypeInfo) { + private , O> JsonSchemaBuilder createElementRefSchema( + M elementTypeInfo) { final JsonSchemaBuilder schema = new JsonSchemaBuilder(); addElementNameSchema(elementTypeInfo.getElementName(), schema); schema.addType(JsonSchemaConstants.OBJECT_TYPE); @@ -321,7 +326,7 @@ private JsonSchemaBuilder createElementRefSchema( new JsonSchemaBuilder() .addRef(XmlSchemaJsonSchemaConstants.QNAME_TYPE_INFO_SCHEMA_REF)); schema.addProperty(JsonixConstants.VALUE_PROPERTY_NAME, - createTypeSchema(elementTypeInfo.getTypeInfo())); + createTypeSchema(elementTypeInfo, elementTypeInfo.getTypeInfo())); return schema; } @@ -364,8 +369,9 @@ private JsonSchemaBuilder createPossiblyCollectionTypeSchema( return typeSchema; } - private JsonSchemaBuilder createTypeSchema(MTypeInfo typeInfo) { + private , O> JsonSchemaBuilder createTypeSchema( + M originated, MTypeInfo typeInfo) { return getClassInfoCompiler().getMappingCompiler() - .createTypeInfoSchemaRef(typeInfo); + .createTypeInfoSchemaRef(originated, typeInfo); } } diff --git a/compiler/src/main/java/org/hisrc/jsonix/compilation/jsonschema/JsonSchemaRefTypeInfoProducerVisitor.java b/compiler/src/main/java/org/hisrc/jsonix/compilation/jsonschema/JsonSchemaRefTypeInfoProducerVisitor.java index c57a3ab..d075145 100644 --- a/compiler/src/main/java/org/hisrc/jsonix/compilation/jsonschema/JsonSchemaRefTypeInfoProducerVisitor.java +++ b/compiler/src/main/java/org/hisrc/jsonix/compilation/jsonschema/JsonSchemaRefTypeInfoProducerVisitor.java @@ -1,6 +1,8 @@ package org.hisrc.jsonix.compilation.jsonschema; import java.text.MessageFormat; +import java.util.LinkedList; +import java.util.List; import java.util.Map; import javax.xml.namespace.QName; @@ -13,6 +15,8 @@ import org.hisrc.jsonix.jsonschema.JsonSchemaBuilder; import org.hisrc.jsonix.jsonschema.JsonSchemaConstants; import org.hisrc.jsonix.jsonschema.JsonSchemaKeywords; +import org.hisrc.jsonix.xml.xsom.CollectSimpleTypeNamesVisitor; +import org.hisrc.xml.xsom.SchemaComponentAware; import org.jvnet.jaxb2_commons.xml.bind.model.MBuiltinLeafInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MClassInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MClassRef; @@ -24,20 +28,27 @@ import org.jvnet.jaxb2_commons.xml.bind.model.MPackagedTypeInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MTypeInfoVisitor; import org.jvnet.jaxb2_commons.xml.bind.model.MWildcardTypeInfo; +import org.jvnet.jaxb2_commons.xml.bind.model.origin.MOriginated; -public class JsonSchemaRefTypeInfoProducerVisitor implements +import com.sun.xml.xsom.XSComponent; + +public class JsonSchemaRefTypeInfoProducerVisitor implements MTypeInfoVisitor { private final JsonSchemaMappingCompiler mappingCompiler; + private final MOriginated originated; private final Modules modules; private final Module module; private final Mapping mapping; private final Map typeNameSchemaRefs; public JsonSchemaRefTypeInfoProducerVisitor( - JsonSchemaMappingCompiler mappingCompiler) { + JsonSchemaMappingCompiler mappingCompiler, + MOriginated originated) { Validate.notNull(mappingCompiler); + Validate.notNull(originated); this.mappingCompiler = mappingCompiler; + this.originated = originated; this.modules = mappingCompiler.getModules(); this.module = mappingCompiler.getModule(); this.mapping = mappingCompiler.getMapping(); @@ -96,17 +107,33 @@ public JsonSchemaBuilder visitIDREFS(MIDREFS info) { @Override public JsonSchemaBuilder visitBuiltinLeafInfo(MBuiltinLeafInfo info) { - final QName typeName = info.getTypeName(); - final String $ref = this.typeNameSchemaRefs.get(typeName); + + final O origin = this.originated.getOrigin(); + + final List simpleTypeNames = new LinkedList(); + if (origin instanceof SchemaComponentAware) { + final XSComponent component = ((SchemaComponentAware) origin) + .getSchemaComponent(); + if (component != null) { + final CollectSimpleTypeNamesVisitor visitor = new CollectSimpleTypeNamesVisitor(); + component.visit(visitor); + simpleTypeNames.addAll(visitor.getTypeNames()); + } + } + + simpleTypeNames.add(info.getTypeName()); + final JsonSchemaBuilder schema = new JsonSchemaBuilder(); - if ($ref != null) { - return schema.addRef($ref); - } else { - return schema - .addDescription(MessageFormat - .format("WARNING, the type [{0}] is not supported, using the lax schema {}.", - typeName)); + for (QName candidateName : simpleTypeNames) { + final String $ref = this.typeNameSchemaRefs.get(candidateName); + if ($ref != null) { + return schema.addRef($ref); + } } + return schema + .addDescription(MessageFormat + .format("WARNING, the type [{0}] is not supported, using the lax schema {}.", + info.getTypeName())); } @Override diff --git a/compiler/src/main/java/org/hisrc/jsonix/compilation/mapping/CreateTypeInfoDeclarationVisitor.java b/compiler/src/main/java/org/hisrc/jsonix/compilation/mapping/CreateTypeInfoDeclarationVisitor.java index 9f35776..281282a 100644 --- a/compiler/src/main/java/org/hisrc/jsonix/compilation/mapping/CreateTypeInfoDeclarationVisitor.java +++ b/compiler/src/main/java/org/hisrc/jsonix/compilation/mapping/CreateTypeInfoDeclarationVisitor.java @@ -34,6 +34,8 @@ package org.hisrc.jsonix.compilation.mapping; import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; import java.util.Map; import javax.xml.namespace.QName; @@ -44,6 +46,8 @@ import org.hisrc.jscm.codemodel.expression.JSObjectLiteral; import org.hisrc.jsonix.definition.Modules; import org.hisrc.jsonix.naming.Naming; +import org.hisrc.jsonix.xml.xsom.CollectSimpleTypeNamesVisitor; +import org.hisrc.xml.xsom.SchemaComponentAware; import org.jvnet.jaxb2_commons.xml.bind.model.MBuiltinLeafInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MClassInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MClassRef; @@ -55,9 +59,12 @@ import org.jvnet.jaxb2_commons.xml.bind.model.MPackagedTypeInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MTypeInfoVisitor; import org.jvnet.jaxb2_commons.xml.bind.model.MWildcardTypeInfo; +import org.jvnet.jaxb2_commons.xml.bind.model.origin.MOriginated; import org.jvnet.jaxb2_commons.xmlschema.XmlSchemaConstants; -final class CreateTypeInfoDeclarationVisitor implements +import com.sun.xml.xsom.XSComponent; + +final class CreateTypeInfoDeclarationVisitor implements MTypeInfoVisitor { private static final String IDREFS_TYPE_INFO_NAME = "IDREFS"; @@ -75,11 +82,11 @@ final class CreateTypeInfoDeclarationVisitor implements XSD_TYPE_MAPPING.put(XmlSchemaConstants.LANGUAGE, "Language"); XSD_TYPE_MAPPING.put(XmlSchemaConstants.NAME, "Name"); XSD_TYPE_MAPPING.put(XmlSchemaConstants.NCNAME, "NCName"); - // XSD_TYPE_MAPPING.put(XmlSchemaConstants.ID, "Id"); + XSD_TYPE_MAPPING.put(XmlSchemaConstants.ID, "ID"); XSD_TYPE_MAPPING.put(XmlSchemaConstants.ID, "String"); - // XSD_TYPE_MAPPING.put(XmlSchemaConstants.IDREF, "Idref"); + XSD_TYPE_MAPPING.put(XmlSchemaConstants.IDREF, "IDREF"); XSD_TYPE_MAPPING.put(XmlSchemaConstants.IDREF, "String"); - // XSD_TYPE_MAPPING.put(XmlSchemaConstants.IDREFS, "Idrefs"); + XSD_TYPE_MAPPING.put(XmlSchemaConstants.IDREFS, "IDREFS"); XSD_TYPE_MAPPING.put(XmlSchemaConstants.IDREFS, "Strings"); // XSD_TYPE_MAPPING.put(XmlSchemaConstants.ENTITY, "Entity"); // XSD_TYPE_MAPPING.put(XmlSchemaConstants.ENTITIES, "Entities"); @@ -108,7 +115,7 @@ final class CreateTypeInfoDeclarationVisitor implements XSD_TYPE_MAPPING.put(XmlSchemaConstants.POSITIVEINTEGER, "PositiveInteger"); XSD_TYPE_MAPPING.put(XmlSchemaConstants.DOUBLE, "Double"); - // XSD_TYPE_MAPPING.put(XmlSchemaConstants.ANYURI, "AnyURI"); + XSD_TYPE_MAPPING.put(XmlSchemaConstants.ANYURI, "AnyURI"); XSD_TYPE_MAPPING.put(XmlSchemaConstants.ANYURI, "String"); XSD_TYPE_MAPPING.put(XmlSchemaConstants.QNAME, "QName"); // XSD_TYPE_MAPPING.put(XmlSchemaConstants.NOTATION, "Notation"); @@ -122,11 +129,6 @@ final class CreateTypeInfoDeclarationVisitor implements XSD_TYPE_MAPPING.put(XmlSchemaConstants.GDAY, "GDay"); XSD_TYPE_MAPPING.put(XmlSchemaConstants.GMONTH, "GMonth"); XSD_TYPE_MAPPING.put(XmlSchemaConstants.CALENDAR, "Calendar"); - XSD_TYPE_MAPPING.put(XmlSchemaConstants.GYEARMONTH, "String"); - XSD_TYPE_MAPPING.put(XmlSchemaConstants.GYEAR, "String"); - XSD_TYPE_MAPPING.put(XmlSchemaConstants.GMONTHDAY, "String"); - XSD_TYPE_MAPPING.put(XmlSchemaConstants.GDAY, "String"); - XSD_TYPE_MAPPING.put(XmlSchemaConstants.GMONTH, "String"); // XSD_TYPE_MAPPING.put(XmlSchemaConstants.CALENDAR, "String"); } @@ -134,13 +136,17 @@ final class CreateTypeInfoDeclarationVisitor implements private final Modules mappingNameResolver; private final Naming naming; private final String mappingName; + private final MOriginated originated; - CreateTypeInfoDeclarationVisitor(MappingCompiler mappingCompiler) { + CreateTypeInfoDeclarationVisitor(MappingCompiler mappingCompiler, + MOriginated originated) { Validate.notNull(mappingCompiler); + Validate.notNull(originated); this.mappingNameResolver = mappingCompiler.getModules(); this.codeModel = mappingCompiler.getCodeModel(); this.naming = mappingCompiler.getNaming(); this.mappingName = mappingCompiler.getMapping().getMappingName(); + this.originated = originated; } private JSAssignmentExpression createTypeInfoDeclaration( @@ -185,13 +191,29 @@ public JSAssignmentExpression visitList(MList info) { public JSAssignmentExpression visitBuiltinLeafInfo( MBuiltinLeafInfo info) { - final String name = XSD_TYPE_MAPPING.get(info.getTypeName()); - if (name != null) { - return this.codeModel.string(name); - } else { - // TODO unsupported builtin - return null; + + final O origin = this.originated.getOrigin(); + + final List simpleTypeNames = new LinkedList(); + if (origin instanceof SchemaComponentAware) { + final XSComponent component = ((SchemaComponentAware) origin) + .getSchemaComponent(); + if (component != null) { + final CollectSimpleTypeNamesVisitor visitor = new CollectSimpleTypeNamesVisitor(); + component.visit(visitor); + simpleTypeNames.addAll(visitor.getTypeNames()); + } + } + + simpleTypeNames.add(info.getTypeName()); + + for (QName candidateName : simpleTypeNames) { + final String name = XSD_TYPE_MAPPING.get(candidateName); + if (name != null) { + return this.codeModel.string(name); + } } + return null; } public JSAssignmentExpression visitWildcardTypeInfo( diff --git a/compiler/src/main/java/org/hisrc/jsonix/compilation/mapping/MappingCompiler.java b/compiler/src/main/java/org/hisrc/jsonix/compilation/mapping/MappingCompiler.java index 6d3ff81..a8e63d3 100644 --- a/compiler/src/main/java/org/hisrc/jsonix/compilation/mapping/MappingCompiler.java +++ b/compiler/src/main/java/org/hisrc/jsonix/compilation/mapping/MappingCompiler.java @@ -57,11 +57,16 @@ import org.jvnet.jaxb2_commons.xml.bind.model.MClassInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MClassTypeInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MElementInfo; +import org.jvnet.jaxb2_commons.xml.bind.model.MElementTypeInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MEnumConstantInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MEnumLeafInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MPackageInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MPropertyInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MTypeInfo; +import org.jvnet.jaxb2_commons.xml.bind.model.origin.MClassInfoOrigin; +import org.jvnet.jaxb2_commons.xml.bind.model.origin.MEnumLeafInfoOrigin; +import org.jvnet.jaxb2_commons.xml.bind.model.origin.MOriginated; +import org.jvnet.jaxb2_commons.xml.bind.model.origin.MPropertyInfoOrigin; public class MappingCompiler { public static final String DEFAULT_SCOPED_NAME_DELIMITER = "."; @@ -224,10 +229,10 @@ private JSObjectLiteral compileClassInfo(MClassInfo classInfo) { } - final MClassTypeInfo baseTypeInfo = classInfo.getBaseTypeInfo(); + final MClassTypeInfo baseTypeInfo = classInfo.getBaseTypeInfo(); if (baseTypeInfo != null) { classInfoMapping.append(naming.baseTypeInfo(), - getTypeInfoDeclaration(baseTypeInfo)); + getTypeInfoDeclaration(classInfo, baseTypeInfo)); } final JSArrayLiteral ps = compilePropertyInfos(classInfo); if (!ps.getElements().isEmpty()) { @@ -244,7 +249,8 @@ private JSObjectLiteral compileEnumLeafInfo(MEnumLeafInfo enumLeafInfo) { final MTypeInfo baseTypeInfo = enumLeafInfo.getBaseTypeInfo(); if (baseTypeInfo != null) { - final JSAssignmentExpression baseTypeInfoDeclaration = getTypeInfoDeclaration(baseTypeInfo); + final JSAssignmentExpression baseTypeInfoDeclaration = getTypeInfoDeclaration( + enumLeafInfo, baseTypeInfo); if (!baseTypeInfoDeclaration .acceptExpressionVisitor(new CheckValueStringLiteralExpressionVisitor( "String"))) { @@ -287,11 +293,12 @@ private void compileElementInfos(JSArrayLiteral eis) { private JSObjectLiteral compileElementInfo(MElementInfo elementInfo) { MTypeInfo typeInfo = elementInfo.getTypeInfo(); - MTypeInfo scope = elementInfo.getScope(); + MClassInfo scope = elementInfo.getScope(); QName substitutionHead = elementInfo.getSubstitutionHead(); final JSObjectLiteral value = this.codeModel.object(); - JSAssignmentExpression typeInfoDeclaration = getTypeInfoDeclaration(typeInfo); + JSAssignmentExpression typeInfoDeclaration = getTypeInfoDeclaration( + elementInfo, typeInfo); QName elementName = elementInfo.getElementName(); value.append(naming.elementName(), createElementNameExpression(elementName)); @@ -304,7 +311,8 @@ private JSObjectLiteral compileElementInfo(MElementInfo elementInfo) { } if (scope != null) { - value.append(naming.scope(), getTypeInfoDeclaration(scope)); + value.append(naming.scope(), + getTypeInfoDeclaration(elementInfo, scope)); } if (substitutionHead != null) { value.append(naming.substitutionHead(), @@ -349,9 +357,35 @@ private JSMemberExpression createNameExpression(final QName name, } public JSAssignmentExpression getTypeInfoDeclaration( - MTypeInfo typeInfo) { + MClassInfo classInfo, MTypeInfo typeInfo) { + return getTypeInfoDeclaration( + (MOriginated) classInfo, typeInfo); + } + + public JSAssignmentExpression getTypeInfoDeclaration( + MEnumLeafInfo enumLeafInfo, MTypeInfo typeInfo) { + return getTypeInfoDeclaration( + (MOriginated) enumLeafInfo, typeInfo); + } + + public JSAssignmentExpression getTypeInfoDeclaration( + MPropertyInfo propertyInfo, MTypeInfo typeInfo) { + + return getTypeInfoDeclaration( + (MOriginated) propertyInfo, typeInfo); + + } + + public , O> JSAssignmentExpression getTypeInfoDeclaration( + M elementInfo, MTypeInfo typeInfo) { + return getTypeInfoDeclaration((MOriginated) elementInfo, typeInfo); + } + + public JSAssignmentExpression getTypeInfoDeclaration( + MOriginated originated, MTypeInfo typeInfo) { + return typeInfo - .acceptTypeInfoVisitor(new CreateTypeInfoDeclarationVisitor( - this)); + .acceptTypeInfoVisitor(new CreateTypeInfoDeclarationVisitor( + this, originated)); } } \ No newline at end of file diff --git a/compiler/src/main/java/org/hisrc/jsonix/compilation/mapping/PropertyInfoVisitor.java b/compiler/src/main/java/org/hisrc/jsonix/compilation/mapping/PropertyInfoVisitor.java index 34fd2df..7edbcad 100644 --- a/compiler/src/main/java/org/hisrc/jsonix/compilation/mapping/PropertyInfoVisitor.java +++ b/compiler/src/main/java/org/hisrc/jsonix/compilation/mapping/PropertyInfoVisitor.java @@ -26,8 +26,8 @@ import org.jvnet.jaxb2_commons.xml.bind.model.MMixable; import org.jvnet.jaxb2_commons.xml.bind.model.MPropertyInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MPropertyInfoVisitor; +import org.jvnet.jaxb2_commons.xml.bind.model.MSingleTypePropertyInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MTypeInfo; -import org.jvnet.jaxb2_commons.xml.bind.model.MTyped; import org.jvnet.jaxb2_commons.xml.bind.model.MValuePropertyInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MWildcard; import org.jvnet.jaxb2_commons.xml.bind.model.MWrappable; @@ -82,15 +82,15 @@ private void createPropertyInfoOptions(MPropertyInfo propertyInfo, } } - private void createTypedOptions(MTyped info, - final JSObjectLiteral options) { + private , O> void createTypedOptions( + final M info, final JSObjectLiteral options) { final MTypeInfo typeInfo = info.getTypeInfo(); typeInfo.acceptTypeInfoVisitor(new DefaultTypeInfoVisitor() { @Override public Void visitTypeInfo(MTypeInfo typeInfo) { final JSAssignmentExpression typeInfoDeclaration = PropertyInfoVisitor.this.mappingCompiler - .getTypeInfoDeclaration(typeInfo); + .getTypeInfoDeclaration(info, typeInfo); if (!typeInfoDeclaration .acceptExpressionVisitor(new CheckValueStringLiteralExpressionVisitor( "String"))) { @@ -104,7 +104,31 @@ public Void visitBuiltinLeafInfo(MBuiltinLeafInfo info) { return super.visitBuiltinLeafInfo(info); } }); + } + + private void createTypedOptions( + final MSingleTypePropertyInfo propertyInfo, + final JSObjectLiteral options) { + final MTypeInfo typeInfo = propertyInfo.getTypeInfo(); + + typeInfo.acceptTypeInfoVisitor(new DefaultTypeInfoVisitor() { + @Override + public Void visitTypeInfo(MTypeInfo typeInfo) { + final JSAssignmentExpression typeInfoDeclaration = PropertyInfoVisitor.this.mappingCompiler + .getTypeInfoDeclaration(propertyInfo, typeInfo); + if (!typeInfoDeclaration + .acceptExpressionVisitor(new CheckValueStringLiteralExpressionVisitor( + "String"))) { + options.append(naming.typeInfo(), typeInfoDeclaration); + } + return null; + } + @Override + public Void visitBuiltinLeafInfo(MBuiltinLeafInfo info) { + return super.visitBuiltinLeafInfo(info); + } + }); } private void createWrappableOptions(MWrappable info, JSObjectLiteral options) { @@ -115,16 +139,17 @@ private void createWrappableOptions(MWrappable info, JSObjectLiteral options) { } } - private void createElementTypeInfoOptions(MElementTypeInfo info, - JSObjectLiteral options) { + private , O> void createElementTypeInfoOptions( + M info, JSObjectLiteral options) { final QName elementName = info.getElementName(); options.append(naming.elementName(), mappingCompiler.createElementNameExpression(elementName)); createTypedOptions(info, options); } - private void createElementTypeInfoOptions(MElementTypeInfo info, - String privateName, QName elementName, JSObjectLiteral options) { + private , O> void createElementTypeInfoOptions( + M info, String privateName, QName elementName, + JSObjectLiteral options) { JSMemberExpression elementNameExpression = mappingCompiler .createElementNameExpression(elementName); if (!elementNameExpression @@ -173,13 +198,12 @@ public JSObjectLiteral visitElementsPropertyInfo( return options; } - private void createElementTypeInfosOptions(MElementTypeInfos info, - JSObjectLiteral options) { + private , O> void createElementTypeInfosOptions( + MElementTypeInfos info, JSObjectLiteral options) { if (!info.getElementTypeInfos().isEmpty()) { final JSArrayLiteral elementTypeInfos = this.codeModel.array(); options.append(naming.elementTypeInfos(), elementTypeInfos); - for (MElementTypeInfo elementTypeInfo : info - .getElementTypeInfos()) { + for (M elementTypeInfo : info.getElementTypeInfos()) { final JSObjectLiteral elementTypeInfoOptions = this.codeModel .object(); createElementTypeInfoOptions(elementTypeInfo, diff --git a/compiler/src/main/java/org/hisrc/jsonix/xml/xsom/CollectSimpleTypeNamesVisitor.java b/compiler/src/main/java/org/hisrc/jsonix/xml/xsom/CollectSimpleTypeNamesVisitor.java new file mode 100644 index 0000000..28e0ba0 --- /dev/null +++ b/compiler/src/main/java/org/hisrc/jsonix/xml/xsom/CollectSimpleTypeNamesVisitor.java @@ -0,0 +1,130 @@ +package org.hisrc.jsonix.xml.xsom; + +import java.util.LinkedList; +import java.util.List; + +import javax.xml.namespace.QName; + +import com.sun.xml.xsom.XSAnnotation; +import com.sun.xml.xsom.XSAttGroupDecl; +import com.sun.xml.xsom.XSAttributeDecl; +import com.sun.xml.xsom.XSAttributeUse; +import com.sun.xml.xsom.XSComplexType; +import com.sun.xml.xsom.XSContentType; +import com.sun.xml.xsom.XSElementDecl; +import com.sun.xml.xsom.XSFacet; +import com.sun.xml.xsom.XSIdentityConstraint; +import com.sun.xml.xsom.XSModelGroup; +import com.sun.xml.xsom.XSModelGroupDecl; +import com.sun.xml.xsom.XSNotation; +import com.sun.xml.xsom.XSParticle; +import com.sun.xml.xsom.XSSchema; +import com.sun.xml.xsom.XSSimpleType; +import com.sun.xml.xsom.XSType; +import com.sun.xml.xsom.XSWildcard; +import com.sun.xml.xsom.XSXPath; +import com.sun.xml.xsom.visitor.XSVisitor; + +public class CollectSimpleTypeNamesVisitor implements XSVisitor { + + // protected Log logger = LogFactory.getLog(getClass()); + + private List typeNames = new LinkedList(); + + public List getTypeNames() { + return typeNames; + } + + public void annotation(XSAnnotation ann) { + // todo("Annotation."); + } + + public void attGroupDecl(XSAttGroupDecl decl) { + // todo("Attribute group declaration [" + decl.getName() + "]."); + } + + public void attributeDecl(XSAttributeDecl decl) { + decl.getType().visit(this); + } + + public void attributeUse(XSAttributeUse use) { + use.getDecl().visit(this); + } + + public void complexType(XSComplexType type) { + // todo("Complex type [" + type.getName() + "]."); + } + + public void facet(XSFacet facet) { + // todo("Facet."); + } + + public void identityConstraint(XSIdentityConstraint decl) { + // todo("Identity constraint."); + } + + public void notation(XSNotation notation) { + // todo("Notation."); + } + + public void schema(XSSchema schema) { + // todo("Schema."); + } + + public void xpath(XSXPath xp) { + // todo("XPath."); + } + + public void elementDecl(XSElementDecl decl) { + decl.getType().visit(this); + } + + public void modelGroup(XSModelGroup group) { + for (XSParticle child : group.getChildren()) { + child.visit(this); + } + } + + public void modelGroupDecl(XSModelGroupDecl decl) { + // todo("Model group declaration."); + } + + public void wildcard(XSWildcard wc) { + // todo("Wildcard."); + } + + public void empty(XSContentType empty) { + // todo("Empty."); + } + + public void particle(XSParticle particle) { + particle.getTerm().visit(this); + } + + public void simpleType(XSSimpleType simpleType) { + if (simpleType.getName() != null) { + typeNames.add(new QName(simpleType.getTargetNamespace(), simpleType + .getName())); + if (simpleType.isRestriction()) { + final XSType baseType = simpleType.asRestriction() + .getBaseType(); + if (baseType != null) { + baseType.visit(this); + } + } + + if (simpleType.isList()) { + final XSSimpleType itemType = simpleType.asList().getItemType(); + if (itemType != null) { + itemType.visit(this); + } + } + // simpleType.getSimpleBaseType() + } + } + + private void todo(String comment) { + // logger.error((comment == null ? "" : comment + " ") + // + "Not yet supported."); + } +} diff --git a/pom.xml b/pom.xml index 3a3b864..e3ed01c 100644 --- a/pom.xml +++ b/pom.xml @@ -85,10 +85,10 @@ UTF-8 ${project.version} 2.2.1 - 0.9.6-SNAPSHOT + 0.11.0 1.1 2.2.11 - 0.13.0 + 0.13.1 0.9.0 1.7.7 2.0.29 diff --git a/tests/issues/src/main/resources/schema.xsd b/tests/issues/src/main/resources/schema.xsd index 189578e..beb00f8 100644 --- a/tests/issues/src/main/resources/schema.xsd +++ b/tests/issues/src/main/resources/schema.xsd @@ -6,7 +6,7 @@ elementFormDefault="qualified" attributeFormDefault="unqualified"> - + @@ -61,4 +61,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/issues/src/test/java/org/hisrc/jsonix/tests/issues/CompileIssues.java b/tests/issues/src/test/java/org/hisrc/jsonix/tests/issues/CompileIssues.java index 6242978..2a4d1b4 100644 --- a/tests/issues/src/test/java/org/hisrc/jsonix/tests/issues/CompileIssues.java +++ b/tests/issues/src/test/java/org/hisrc/jsonix/tests/issues/CompileIssues.java @@ -32,7 +32,8 @@ public void compilesIssues() throws Exception { "-b", binding.toExternalForm(), "-d", "target/generated-sources/xjc", "-extension", - "-Xjsonix" + "-Xjsonix", + "-Xjsonix-generateJsonSchema" }; diff --git a/tests/pom.xml b/tests/pom.xml index 5844629..6dc9d3b 100644 --- a/tests/pom.xml +++ b/tests/pom.xml @@ -12,6 +12,7 @@ filter wps zero + issues