Skip to content

Commit 4b0a823

Browse files
committed
Issue #22.
1 parent b4be752 commit 4b0a823

File tree

9 files changed

+155
-13
lines changed

9 files changed

+155
-13
lines changed

compiler/src/main/java/org/hisrc/jsonix/JsonixConstants.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
public class JsonixConstants {
44

5+
// TODO move to constants
6+
public static final String DEFAULT_SCOPED_NAME_DELIMITER = ".";
57
private JsonixConstants() {
68
}
79

compiler/src/main/java/org/hisrc/jsonix/compilation/jsonschema/JsonSchemaClassInfoCompiler.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package org.hisrc.jsonix.compilation.jsonschema;
22

3+
import java.util.ArrayList;
34
import java.util.LinkedHashMap;
5+
import java.util.List;
46
import java.util.Map;
57
import java.util.Map.Entry;
68

@@ -41,8 +43,6 @@ public JsonSchemaBuilder compile(MClassInfo<T, C> classInfo) {
4143
final String localName = classInfo
4244
.getContainerLocalName(DEFAULT_SCOPED_NAME_DELIMITER);
4345
classInfoSchema.addTitle(localName);
44-
// TODO addId ?
45-
// ...
4646
final MClassTypeInfo<T, C> baseTypeInfo = classInfo.getBaseTypeInfo();
4747
final JsonSchemaBuilder typeInfoSchema;
4848
if (baseTypeInfo != null) {
@@ -57,23 +57,28 @@ public JsonSchemaBuilder compile(MClassInfo<T, C> classInfo) {
5757

5858
// TODO move to the builder
5959
final Map<String, JsonSchemaBuilder> propertyInfoSchemas = compilePropertyInfos(classInfo);
60+
final List<String> propertiesOrder = new ArrayList<String>(
61+
propertyInfoSchemas.size());
6062
for (Entry<String, JsonSchemaBuilder> entry : propertyInfoSchemas
6163
.entrySet()) {
64+
propertiesOrder.add(entry.getKey());
6265
classInfoSchema.addProperty(entry.getKey(), entry.getValue());
6366
}
64-
classInfoSchema.add(JsonixJsonSchemaConstants.TYPE_TYPE_PROPERTY_NAME,
67+
typeInfoSchema.add(JsonixJsonSchemaConstants.TYPE_TYPE_PROPERTY_NAME,
6568
StandardNaming.CLASS_INFO);
6669
final QName typeName = classInfo.getTypeName();
6770
if (typeName != null) {
68-
classInfoSchema
71+
typeInfoSchema
6972
.add(JsonixJsonSchemaConstants.TYPE_NAME_PROPERTY_NAME,
7073
new JsonSchemaBuilder()
7174
.add(JsonixJsonSchemaConstants.LOCAL_PART_PROPERTY_NAME,
7275
typeName.getLocalPart())
7376
.add(JsonixJsonSchemaConstants.NAMESPACE_URI_PROPERTY_NAME,
7477
typeName.getNamespaceURI()));
7578
}
76-
79+
if (!propertiesOrder.isEmpty()) {
80+
typeInfoSchema.add("propertiesOrder", propertiesOrder);
81+
}
7782
return typeInfoSchema;
7883
}
7984

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package org.hisrc.jsonix.compilation.jsonschema;
2+
3+
import javax.xml.namespace.QName;
4+
5+
import org.apache.commons.lang3.Validate;
6+
import org.hisrc.jsonix.JsonixConstants;
7+
import org.hisrc.jsonix.jsonschema.JsonSchemaBuilder;
8+
import org.hisrc.jsonix.naming.StandardNaming;
9+
import org.jvnet.jaxb2_commons.xml.bind.model.MEnumConstantInfo;
10+
import org.jvnet.jaxb2_commons.xml.bind.model.MEnumLeafInfo;
11+
import org.jvnet.jaxb2_commons.xml.bind.model.MTypeInfo;
12+
13+
public class JsonSchemaEnumLeafInfoCompiler<T, C extends T> implements
14+
JsonSchemaTypeInfoCompiler<MEnumLeafInfo<T, C>, T, C> {
15+
16+
private final JsonSchemaMappingCompiler<T, C> mappingCompiler;
17+
18+
public JsonSchemaEnumLeafInfoCompiler(
19+
JsonSchemaMappingCompiler<T, C> mappingCompiler) {
20+
Validate.notNull(mappingCompiler);
21+
this.mappingCompiler = mappingCompiler;
22+
}
23+
24+
public JsonSchemaMappingCompiler<T, C> getMappingCompiler() {
25+
return mappingCompiler;
26+
}
27+
28+
@Override
29+
public JsonSchemaBuilder compile(MEnumLeafInfo<T, C> enumLeafInfo) {
30+
final JsonSchemaBuilder enumLeafInfoSchema = new JsonSchemaBuilder();
31+
final String localName = enumLeafInfo
32+
.getContainerLocalName(JsonixConstants.DEFAULT_SCOPED_NAME_DELIMITER);
33+
enumLeafInfoSchema.addTitle(localName);
34+
final MTypeInfo<T, C> baseTypeInfo = enumLeafInfo.getBaseTypeInfo();
35+
final JsonSchemaBuilder typeInfoSchema;
36+
final JsonSchemaBuilder baseTypeInfoSchema = mappingCompiler
37+
.createTypeInfoSchemaRef(baseTypeInfo);
38+
typeInfoSchema = new JsonSchemaBuilder();
39+
typeInfoSchema.addAllOf(baseTypeInfoSchema);
40+
41+
for (MEnumConstantInfo<T, C> enumConstant : enumLeafInfo.getConstants()) {
42+
final JsonSchemaBuilder enumConstantSchema = createEnumConstant(
43+
enumLeafInfo, enumConstant);
44+
// TODO
45+
if (enumConstantSchema != null) {
46+
typeInfoSchema.addEnum(enumConstantSchema);
47+
}
48+
}
49+
50+
typeInfoSchema.add(JsonixJsonSchemaConstants.TYPE_TYPE_PROPERTY_NAME,
51+
StandardNaming.ENUM_INFO);
52+
final QName typeName = enumLeafInfo.getTypeName();
53+
if (typeName != null) {
54+
typeInfoSchema
55+
.add(JsonixJsonSchemaConstants.TYPE_NAME_PROPERTY_NAME,
56+
new JsonSchemaBuilder()
57+
.add(JsonixJsonSchemaConstants.LOCAL_PART_PROPERTY_NAME,
58+
typeName.getLocalPart())
59+
.add(JsonixJsonSchemaConstants.NAMESPACE_URI_PROPERTY_NAME,
60+
typeName.getNamespaceURI()));
61+
}
62+
63+
return typeInfoSchema;
64+
}
65+
66+
private JsonSchemaBuilder createEnumConstant(
67+
MEnumLeafInfo<T, C> enumLeafInfo,
68+
MEnumConstantInfo<T, C> enumConstant) {
69+
return null;
70+
}
71+
}

compiler/src/main/java/org/hisrc/jsonix/compilation/jsonschema/JsonSchemaMappingCompiler.java

Lines changed: 62 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
package org.hisrc.jsonix.compilation.jsonschema;
22

3+
import javax.xml.namespace.QName;
4+
35
import org.apache.commons.lang3.Validate;
6+
import org.hisrc.jsonix.JsonixConstants;
47
import org.hisrc.jsonix.definition.Mapping;
58
import org.hisrc.jsonix.definition.Module;
69
import org.hisrc.jsonix.definition.Modules;
710
import org.hisrc.jsonix.jsonschema.JsonSchemaBuilder;
11+
import org.hisrc.jsonix.jsonschema.JsonSchemaConstants;
812
import org.jvnet.jaxb2_commons.xml.bind.model.MClassInfo;
13+
import org.jvnet.jaxb2_commons.xml.bind.model.MElementInfo;
14+
import org.jvnet.jaxb2_commons.xml.bind.model.MEnumLeafInfo;
915
import org.jvnet.jaxb2_commons.xml.bind.model.MTypeInfo;
1016

1117
public class JsonSchemaMappingCompiler<T, C extends T> {
@@ -44,16 +50,69 @@ public Mapping<T, C> getMapping() {
4450
public JsonSchemaBuilder compile() {
4551
final JsonSchemaBuilder schema = new JsonSchemaBuilder();
4652
schema.addId(mapping.getSchemaId());
53+
addElementInfos(schema);
54+
addClassInfoSchemas(schema);
55+
addElementLeafInfoSchemas(schema);
56+
return schema;
57+
}
58+
59+
private void addElementInfos(final JsonSchemaBuilder schema) {
60+
for (MElementInfo<T, C> elementInfo : mapping.getElementInfos()) {
61+
final QName elementName = elementInfo.getElementName();
62+
final MTypeInfo<T, C> typeInfo = elementInfo.getTypeInfo();
63+
final MTypeInfo<T, C> scope = elementInfo.getScope();
64+
65+
final JsonSchemaBuilder elementInfoSchema = new JsonSchemaBuilder();
66+
elementInfoSchema.addType(JsonSchemaConstants.OBJECT_TYPE);
67+
elementInfoSchema
68+
.addProperty(
69+
JsonixConstants.NAME_PROPERTY_NAME,
70+
new JsonSchemaBuilder()
71+
.addRef(XmlSchemaJsonSchemaConstants.QNAME_TYPE_INFO_SCHEMA_REF));
72+
elementInfoSchema.addProperty(JsonixConstants.VALUE_PROPERTY_NAME,
73+
createTypeInfoSchemaRef(typeInfo));
74+
75+
elementInfoSchema
76+
.add(JsonixJsonSchemaConstants.ELEMENT_NAME_PROPERTY_NAME,
77+
new JsonSchemaBuilder()
78+
.add(JsonixJsonSchemaConstants.LOCAL_PART_PROPERTY_NAME,
79+
elementName.getLocalPart())
80+
.add(JsonixJsonSchemaConstants.NAMESPACE_URI_PROPERTY_NAME,
81+
elementName.getNamespaceURI()));
82+
if (scope != null) {
83+
elementInfoSchema.add(
84+
JsonixJsonSchemaConstants.SCOPE_PROPERTY_NAME,
85+
createTypeInfoSchemaRef(scope));
86+
}
87+
schema.addAnyOf(elementInfoSchema);
88+
}
89+
}
90+
91+
private void addElementLeafInfoSchemas(final JsonSchemaBuilder schema) {
92+
final JsonSchemaEnumLeafInfoCompiler<T, C> enumLeafInfoCompiler = new JsonSchemaEnumLeafInfoCompiler<T, C>(
93+
this);
94+
for (MEnumLeafInfo<T, C> enumLeafInfo : mapping.getEnumLeafInfos()) {
95+
final JsonSchemaBuilder enumLeafInfoSchema = enumLeafInfoCompiler
96+
.compile(enumLeafInfo);
97+
// TODO constant
98+
schema.addDefinition(
99+
enumLeafInfo
100+
.getContainerLocalName(JsonixConstants.DEFAULT_SCOPED_NAME_DELIMITER),
101+
enumLeafInfoSchema);
102+
}
103+
}
104+
105+
private void addClassInfoSchemas(final JsonSchemaBuilder schema) {
47106
final JsonSchemaClassInfoCompiler<T, C> classInfoCompiler = new JsonSchemaClassInfoCompiler<T, C>(
48107
this);
49108
for (MClassInfo<T, C> classInfo : mapping.getClassInfos()) {
50109
final JsonSchemaBuilder classInfoSchema = classInfoCompiler
51110
.compile(classInfo);
52-
// TODO constant
53-
schema.addDefinition(classInfo.getContainerLocalName("."),
111+
schema.addDefinition(
112+
classInfo
113+
.getContainerLocalName(JsonixConstants.DEFAULT_SCOPED_NAME_DELIMITER),
54114
classInfoSchema);
55115
}
56-
return schema;
57116
}
58117

59118
public JsonSchemaBuilder createTypeInfoSchemaRef(MTypeInfo<T, C> typeInfo) {

compiler/src/main/java/org/hisrc/jsonix/compilation/jsonschema/JsonixJsonSchemaConstants.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ private JsonixJsonSchemaConstants() {
1414

1515
public static String TYPE_TYPE_PROPERTY_NAME = "typeType";
1616

17+
public static String PROPERTIES_ORDER_PROPERTY_NAME = "propertiesOrder";
18+
1719
public static String PROPERTY_TYPE_PROPERTY_NAME = "propertyType";
1820

1921
public static String ELEMENT_NAME_PROPERTY_NAME = "elementName";
@@ -27,4 +29,6 @@ private JsonixJsonSchemaConstants() {
2729
public static String LOCAL_PART_PROPERTY_NAME = "localPart";
2830

2931
public static String NAMESPACE_URI_PROPERTY_NAME = "namespaceURI";
32+
33+
public static String SCOPE_PROPERTY_NAME = "scope";
3034
}

compiler/src/main/java/org/hisrc/jsonix/configuration/ModuleConfiguration.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public void setMappingConfigurations(
5757
this.mappingConfigurations = mappingConfigurations;
5858
}
5959

60-
@XmlElement(name = "output")
60+
@XmlElement(name = OutputConfiguration.LOCAL_ELEMENT_NAME)
6161
public List<OutputConfiguration> getOutputConfigurations() {
6262
return outputConfigurations;
6363
}

compiler/src/main/java/org/hisrc/jsonix/configuration/ModulesConfigurationUnmarshaller.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ private <T> T unmarshal(CPluginCustomization customization,
116116
}
117117

118118
public ModulesConfiguration unmarshal(Model model,
119-
OutputConfiguration defaultOutputConfiguration,
119+
OutputConfiguration defaultOutputConfiguration,
120120
JsonSchemaConfiguration defaultJsonSchemaConfiguration) {
121121
Validate.notNull(model);
122122
Validate.notNull(defaultOutputConfiguration);
@@ -142,7 +142,8 @@ public ModulesConfiguration unmarshal(Model model,
142142
unmarshalOutputConfiguration(customization));
143143
}
144144
for (CPluginCustomization customization : CustomizationUtils
145-
.findCustomizations(model, JsonSchemaConfiguration.JSON_SCHEMA_NAME)) {
145+
.findCustomizations(model,
146+
JsonSchemaConfiguration.JSON_SCHEMA_NAME)) {
146147
modulesConfiguration.getJsonSchemaConfigurations().add(
147148
unmarshalJsonSchemaConfiguration(customization));
148149
}

full/src/main/java/org/hisrc/jsonix/JsonixMain.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import org.apache.commons.lang3.Validate;
88
import org.hisrc.jsonix.args4j.PartialCmdLineParser;
99
import org.hisrc.jsonix.compilation.ProgramWriter;
10-
import org.hisrc.jsonix.compilation.jsc.JsonStructureWriter;
10+
import org.hisrc.jsonix.compilation.jsonschema.JsonStructureWriter;
1111
import org.hisrc.jsonix.execution.JsonixInvoker;
1212
import org.hisrc.jsonix.settings.Settings;
1313
import org.hisrc.jsonix.xjc.plugin.JsonixPlugin;

full/src/main/java/org/hisrc/jsonix/TargetDirectoryJsonStructureWriter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
import javax.json.stream.JsonGenerator;
1313

1414
import org.apache.commons.lang3.Validate;
15-
import org.hisrc.jsonix.compilation.jsc.JsonStructureWriter;
15+
import org.hisrc.jsonix.compilation.jsonschema.JsonStructureWriter;
1616
import org.hisrc.jsonix.definition.Module;
1717
import org.xml.sax.SAXParseException;
1818

0 commit comments

Comments
 (0)