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 0163b91..5f465bf 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 @@ -23,105 +23,111 @@ public class JsonSchemaMappingCompiler { - private final Modules modules; - private final Module module; - private final Mapping mapping; - private final JsonBuilderFactory jsonBuilderFactory; - - public JsonSchemaMappingCompiler(JsonBuilderFactory jsonBuilderFactory, Modules modules, Module module, - Mapping mapping) { - Validate.notNull(jsonBuilderFactory); - Validate.notNull(modules); - Validate.notNull(module); - Validate.notNull(mapping); - this.jsonBuilderFactory = jsonBuilderFactory; - this.modules = modules; - this.module = module; - this.mapping = mapping; - } - - public Modules getModules() { - return modules; - } - - public Module getModule() { - return module; - } - - public Mapping getMapping() { - return mapping; - } - - public JsonBuilderFactory getJsonBuilderFactory() { - return jsonBuilderFactory; - } - - public JsonSchemaBuilder compile() { - final JsonSchemaBuilder schema = new JsonSchemaBuilder(); - final String schemaId = mapping.getSchemaId(); - schema.addId(schemaId); - addElementInfos(schema); - addClassInfoSchemas(schema); - addEnumLeafInfoSchemas(schema); - return schema; - } - - private void addElementInfos(final JsonSchemaBuilder schema) { - for (MElementInfo elementInfo : mapping.getElementInfos()) { - final QName elementName = elementInfo.getElementName(); - final MTypeInfo typeInfo = elementInfo.getTypeInfo(); - final MClassInfo scope = elementInfo.getScope(); - - final JsonSchemaBuilder elementInfoSchema = new JsonSchemaBuilder(); - elementInfoSchema.addType(JsonSchemaConstants.OBJECT_TYPE); - final JsonSchemaBuilder qNameRef = new JsonSchemaBuilder() - .addRef(XmlSchemaJsonSchemaConstants.QNAME_TYPE_INFO_SCHEMA_REF); - final JsonSchemaBuilder nameConstant = new JsonSchemaBuilder(); - nameConstant.addType(JsonSchemaConstants.OBJECT_TYPE); - nameConstant.addProperty(JsonixJsonSchemaConstants.LOCAL_PART_PROPERTY_NAME, - new JsonSchemaBuilder().addEnum(elementName.getLocalPart())); - nameConstant.addProperty(JsonixJsonSchemaConstants.NAMESPACE_URI_PROPERTY_NAME, - new JsonSchemaBuilder().addEnum(elementName.getNamespaceURI())); - - elementInfoSchema.addProperty(JsonixConstants.NAME_PROPERTY_NAME, - new JsonSchemaBuilder().addAllOf(qNameRef).addAllOf(nameConstant)); - - elementInfoSchema.addProperty(JsonixConstants.VALUE_PROPERTY_NAME, - typeInfo.acceptTypeInfoVisitor(new CreateTypeInfoSchema, MElementInfoOrigin>(this, elementInfo))); - - elementInfoSchema.add(JsonixJsonSchemaConstants.ELEMENT_NAME_PROPERTY_NAME, - new JsonSchemaBuilder() - .add(JsonixJsonSchemaConstants.LOCAL_PART_PROPERTY_NAME, elementName.getLocalPart()).add( - JsonixJsonSchemaConstants.NAMESPACE_URI_PROPERTY_NAME, - elementName.getNamespaceURI())); - if (scope != null) { - elementInfoSchema.add(JsonixJsonSchemaConstants.SCOPE_PROPERTY_NAME, - getTypeInfoProducer(elementInfo, typeInfo).createTypeInfoSchemaRef(this)); - } - schema.addAnyOf(elementInfoSchema); - } - } - - private void addEnumLeafInfoSchemas(final JsonSchemaBuilder schema) { - for (MEnumLeafInfo enumLeafInfo : mapping.getEnumLeafInfos()) { - final EnumLeafInfoProducer enumLeafInfoCompiler = new EnumLeafInfoProducer(enumLeafInfo); - final JsonSchemaBuilder enumLeafInfoSchema = enumLeafInfoCompiler.compile(this); - schema.addDefinition(enumLeafInfo.getContainerLocalName(JsonixConstants.DEFAULT_SCOPED_NAME_DELIMITER), - enumLeafInfoSchema); - } - } - - private void addClassInfoSchemas(final JsonSchemaBuilder schema) { - for (MClassInfo classInfo : mapping.getClassInfos()) { - final ClassInfoProducer classInfoCompiler = new ClassInfoProducer(classInfo); - final JsonSchemaBuilder classInfoSchema = classInfoCompiler.compile(this); - schema.addDefinition(classInfo.getContainerLocalName(JsonixConstants.DEFAULT_SCOPED_NAME_DELIMITER), - classInfoSchema); - } - } - - public , O> TypeInfoProducer getTypeInfoProducer(M originated, - MTypeInfo typeInfo) { - return typeInfo.acceptTypeInfoVisitor(new CreateTypeInfoProducer(originated)); - } + private final Modules modules; + private final Module module; + private final Mapping mapping; + private final JsonBuilderFactory jsonBuilderFactory; + + public JsonSchemaMappingCompiler(JsonBuilderFactory jsonBuilderFactory, Modules modules, Module module, + Mapping mapping) { + Validate.notNull(jsonBuilderFactory); + Validate.notNull(modules); + Validate.notNull(module); + Validate.notNull(mapping); + this.jsonBuilderFactory = jsonBuilderFactory; + this.modules = modules; + this.module = module; + this.mapping = mapping; + } + + public Modules getModules() { + return modules; + } + + public Module getModule() { + return module; + } + + public Mapping getMapping() { + return mapping; + } + + public JsonBuilderFactory getJsonBuilderFactory() { + return jsonBuilderFactory; + } + + public JsonSchemaBuilder compile() { + final JsonSchemaBuilder schema = new JsonSchemaBuilder(); + final String schemaId = mapping.getSchemaId(); + schema.addId(schemaId); + addElementInfos(schema); + addClassInfoSchemas(schema); + addEnumLeafInfoSchemas(schema); + return schema; + } + + private void addElementInfos(final JsonSchemaBuilder schema) { + for (MElementInfo elementInfo : mapping.getElementInfos()) { + final QName elementName = elementInfo.getElementName(); + final MTypeInfo typeInfo = elementInfo.getTypeInfo(); + final MClassInfo scope = elementInfo.getScope(); + + final JsonSchemaBuilder elementInfoSchema; + + if (mapping.getMappingStyle().equals("simplified")) { + elementInfoSchema = typeInfo.acceptTypeInfoVisitor(new CreateTypeInfoSchema, MElementInfoOrigin>(this, elementInfo)); + } else { + elementInfoSchema = new JsonSchemaBuilder(); + elementInfoSchema.addType(JsonSchemaConstants.OBJECT_TYPE); + final JsonSchemaBuilder qNameRef = new JsonSchemaBuilder() + .addRef(XmlSchemaJsonSchemaConstants.QNAME_TYPE_INFO_SCHEMA_REF); + final JsonSchemaBuilder nameConstant = new JsonSchemaBuilder(); + nameConstant.addType(JsonSchemaConstants.OBJECT_TYPE); + nameConstant.addProperty(JsonixJsonSchemaConstants.LOCAL_PART_PROPERTY_NAME, + new JsonSchemaBuilder().addEnum(elementName.getLocalPart())); + nameConstant.addProperty(JsonixJsonSchemaConstants.NAMESPACE_URI_PROPERTY_NAME, + new JsonSchemaBuilder().addEnum(elementName.getNamespaceURI())); + + elementInfoSchema.addProperty(JsonixConstants.NAME_PROPERTY_NAME, + new JsonSchemaBuilder().addAllOf(qNameRef).addAllOf(nameConstant)); + + elementInfoSchema.addProperty(JsonixConstants.VALUE_PROPERTY_NAME, + typeInfo.acceptTypeInfoVisitor(new CreateTypeInfoSchema, MElementInfoOrigin>(this, elementInfo))); + + elementInfoSchema.add(JsonixJsonSchemaConstants.ELEMENT_NAME_PROPERTY_NAME, + new JsonSchemaBuilder() + .add(JsonixJsonSchemaConstants.LOCAL_PART_PROPERTY_NAME, elementName.getLocalPart()).add( + JsonixJsonSchemaConstants.NAMESPACE_URI_PROPERTY_NAME, + elementName.getNamespaceURI())); + if (scope != null) { + elementInfoSchema.add(JsonixJsonSchemaConstants.SCOPE_PROPERTY_NAME, + getTypeInfoProducer(elementInfo, typeInfo).createTypeInfoSchemaRef(this)); + } + } + schema.addAnyOf(elementInfoSchema); + } + } + + private void addEnumLeafInfoSchemas(final JsonSchemaBuilder schema) { + for (MEnumLeafInfo enumLeafInfo : mapping.getEnumLeafInfos()) { + final EnumLeafInfoProducer enumLeafInfoCompiler = new EnumLeafInfoProducer(enumLeafInfo); + final JsonSchemaBuilder enumLeafInfoSchema = enumLeafInfoCompiler.compile(this); + schema.addDefinition(enumLeafInfo.getContainerLocalName(JsonixConstants.DEFAULT_SCOPED_NAME_DELIMITER), + enumLeafInfoSchema); + } + } + + private void addClassInfoSchemas(final JsonSchemaBuilder schema) { + for (MClassInfo classInfo : mapping.getClassInfos()) { + final ClassInfoProducer classInfoCompiler = new ClassInfoProducer(classInfo); + final JsonSchemaBuilder classInfoSchema = classInfoCompiler.compile(this); + schema.addDefinition(classInfo.getContainerLocalName(JsonixConstants.DEFAULT_SCOPED_NAME_DELIMITER), + classInfoSchema); + } + } + + public , O> TypeInfoProducer getTypeInfoProducer(M originated, + MTypeInfo typeInfo) { + return typeInfo.acceptTypeInfoVisitor(new CreateTypeInfoProducer(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 653ca17..5336c21 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 @@ -155,10 +155,15 @@ public JsonSchemaBuilder visitAnyElementPropertyInfo(MAnyElementPropertyInfo createElementRefsSchema( } private , O> JsonSchemaBuilder createElementRefSchema(M elementTypeInfo) { - final JsonSchemaBuilder schema = new JsonSchemaBuilder(); - addElementNameSchema(elementTypeInfo.getElementName(), schema); - schema.addType(JsonSchemaConstants.OBJECT_TYPE); - schema.addProperty(JsonixConstants.NAME_PROPERTY_NAME, - new JsonSchemaBuilder().addRef(XmlSchemaJsonSchemaConstants.QNAME_TYPE_INFO_SCHEMA_REF)); - schema.addProperty(JsonixConstants.VALUE_PROPERTY_NAME, - createTypeSchema(elementTypeInfo, elementTypeInfo.getTypeInfo())); + final JsonSchemaBuilder schema; + if (mappingCompiler.getMapping().getMappingStyle().equals("simplified")) { + schema = createTypeSchema(elementTypeInfo, elementTypeInfo.getTypeInfo()); + } else { + schema = new JsonSchemaBuilder(); + addElementNameSchema(elementTypeInfo.getElementName(), schema); + schema.addType(JsonSchemaConstants.OBJECT_TYPE); + schema.addProperty(JsonixConstants.NAME_PROPERTY_NAME, + new JsonSchemaBuilder().addRef(XmlSchemaJsonSchemaConstants.QNAME_TYPE_INFO_SCHEMA_REF)); + schema.addProperty(JsonixConstants.VALUE_PROPERTY_NAME, + createTypeSchema(elementTypeInfo, elementTypeInfo.getTypeInfo())); + } return schema; } diff --git a/compiler/src/main/java/org/hisrc/jsonix/configuration/MappingConfiguration.java b/compiler/src/main/java/org/hisrc/jsonix/configuration/MappingConfiguration.java index 2e956c5..0ea45de 100644 --- a/compiler/src/main/java/org/hisrc/jsonix/configuration/MappingConfiguration.java +++ b/compiler/src/main/java/org/hisrc/jsonix/configuration/MappingConfiguration.java @@ -29,12 +29,14 @@ public class MappingConfiguration { public static final String MAPPING_NAME_PROPERTY = "${mapping.name}"; public static final String MAPPING_TARGET_NAMESPACE_URI_PROPERTY = "${mapping.targetNamespace}"; public static final String LOCAL_ELEMENT_NAME = "mapping"; + public static final String DEFAULT_MAPPING_STYLE = "default"; private ModuleConfiguration moduleConfiguration; private String id; private String name; private String _package; private String schemaId = MappingConfiguration.MAPPING_TARGET_NAMESPACE_URI_PROPERTY + "#"; + private String mappingStyle; private String targetNamespaceURI; private String defaultElementNamespaceURI; private String defaultAttributeNamespaceURI; @@ -82,6 +84,15 @@ public void setSchemaId(String schemaId) { this.schemaId = schemaId; } + @XmlAttribute(name = "mappingStyle") + public String getMappingStyle() { + return mappingStyle; + } + + public void setMappingStyle(String mappingStyle) { + this.mappingStyle = mappingStyle; + } + @XmlAttribute(name = "targetNamespace") public String getTargetNamespaceURI() { return targetNamespaceURI; @@ -198,8 +209,18 @@ public Mapping build(JsonixContext context, .replace(MappingConfiguration.MAPPING_NAME_PROPERTY, getName()) .replace(MappingConfiguration.MAPPING_TARGET_NAMESPACE_URI_PROPERTY, targetNamespaceURI); + final String mappingStyle; + if (this.mappingStyle != null) { + mappingStyle = this.mappingStyle; + } else { + logger.debug(MessageFormat + .format("Mapping [{0}] will use Standard Mapping Style in the package [{2}].", + mappingName, packageName)); + mappingStyle = MappingConfiguration.DEFAULT_MAPPING_STYLE; + } + final Mapping mapping = new Mapping(context, analyzer, - packageInfo, mappingName, mappingSchemaId, targetNamespaceURI, + packageInfo, mappingName, mappingSchemaId, mappingStyle, targetNamespaceURI, defaultElementNamespaceURI, defaultAttributeNamespaceURI); if (getExcludesConfiguration() != null) { diff --git a/compiler/src/main/java/org/hisrc/jsonix/definition/Mapping.java b/compiler/src/main/java/org/hisrc/jsonix/definition/Mapping.java index a5eee0f..fdc8808 100644 --- a/compiler/src/main/java/org/hisrc/jsonix/definition/Mapping.java +++ b/compiler/src/main/java/org/hisrc/jsonix/definition/Mapping.java @@ -47,6 +47,7 @@ public class Mapping { private final String packageName; private final String mappingName; private final String schemaId; + private final String mappingStyle; private final String targetNamespaceURI; private final String defaultElementNamespaceURI; private final String defaultAttributeNamespaceURI; @@ -54,7 +55,7 @@ public class Mapping { public Mapping(JsonixContext context, ModelInfoGraphAnalyzer analyzer, MPackageInfo packageInfo, - String mappingName, String schemaId, String targetNamespaceURI, + String mappingName, String schemaId, String mappingStyle, String targetNamespaceURI, String defaultElementNamespaceURI, String defaultAttributeNamespaceURI) { this.logger = Validate.notNull(context).getLoggerFactory() @@ -63,6 +64,7 @@ public Mapping(JsonixContext context, Validate.notNull(packageInfo); Validate.notNull(mappingName); Validate.notNull(schemaId); + Validate.notNull(mappingStyle); Validate.notNull(defaultElementNamespaceURI); Validate.notNull(defaultAttributeNamespaceURI); this.analyzer = analyzer; @@ -70,6 +72,7 @@ public Mapping(JsonixContext context, this.packageName = packageInfo.getPackageName(); this.mappingName = mappingName; this.schemaId = schemaId; + this.mappingStyle = mappingStyle; this.targetNamespaceURI = targetNamespaceURI; this.defaultElementNamespaceURI = defaultElementNamespaceURI; this.defaultAttributeNamespaceURI = defaultAttributeNamespaceURI; @@ -452,6 +455,10 @@ public String getSchemaId() { return this.schemaId; } + public String getMappingStyle() { + return this.mappingStyle; + } + public String getTargetNamespaceURI() { return targetNamespaceURI; }