Skip to content

Commit 7f64d12

Browse files
committed
Issue #60.
1 parent b1b9aa9 commit 7f64d12

15 files changed

+367
-87
lines changed

compiler/src/main/java/org/hisrc/jsonix/analysis/ElementInfoVertex.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
import javax.xml.namespace.QName;
66

77
import org.apache.commons.lang3.Validate;
8+
import org.jvnet.jaxb2_commons.xml.bind.model.MClassInfo;
89
import org.jvnet.jaxb2_commons.xml.bind.model.MElementInfo;
910
import org.jvnet.jaxb2_commons.xml.bind.model.MPackageInfo;
10-
import org.jvnet.jaxb2_commons.xml.bind.model.MTypeInfo;
1111

1212
public class ElementInfoVertex<T, C extends T> extends InfoVertex<T,C> {
1313

@@ -59,7 +59,7 @@ public boolean equals(Object obj) {
5959
@Override
6060
public String toString() {
6161
final QName elementName = this.elementInfo.getElementName();
62-
final MTypeInfo<T, C> scope = elementInfo.getScope();
62+
final MClassInfo<T, C> scope = elementInfo.getScope();
6363
return MessageFormat.format(
6464
"Element [{0}], scope [{1}]",
6565
elementName.toString(),

compiler/src/main/java/org/hisrc/jsonix/analysis/PropertyInfoGraphBuilder.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@
77
import org.jvnet.jaxb2_commons.xml.bind.model.MAnyElementPropertyInfo;
88
import org.jvnet.jaxb2_commons.xml.bind.model.MAttributePropertyInfo;
99
import org.jvnet.jaxb2_commons.xml.bind.model.MClassInfo;
10+
import org.jvnet.jaxb2_commons.xml.bind.model.MElement;
1011
import org.jvnet.jaxb2_commons.xml.bind.model.MElementInfo;
1112
import org.jvnet.jaxb2_commons.xml.bind.model.MElementPropertyInfo;
1213
import org.jvnet.jaxb2_commons.xml.bind.model.MElementRefPropertyInfo;
1314
import org.jvnet.jaxb2_commons.xml.bind.model.MElementRefsPropertyInfo;
1415
import org.jvnet.jaxb2_commons.xml.bind.model.MElementTypeInfo;
16+
import org.jvnet.jaxb2_commons.xml.bind.model.MElementTypeRef;
1517
import org.jvnet.jaxb2_commons.xml.bind.model.MElementsPropertyInfo;
1618
import org.jvnet.jaxb2_commons.xml.bind.model.MModelInfo;
1719
import org.jvnet.jaxb2_commons.xml.bind.model.MPropertyInfoVisitor;
@@ -93,8 +95,7 @@ public PropertyInfoVertex<T, C> visitElementsPropertyInfo(
9395
MElementsPropertyInfo<T, C> info) {
9496
// Elements property has a "soft" dependency types of its elements
9597
// That is, some of these types may be excluded
96-
for (MElementTypeInfo<T, C> elementTypeInfo : info
97-
.getElementTypeInfos()) {
98+
for (MElementTypeRef<T, C> elementTypeInfo : info.getElementTypeInfos()) {
9899
addSoftDependencyOnType(vertex, elementTypeInfo);
99100
}
100101
return vertex;
@@ -112,8 +113,7 @@ public PropertyInfoVertex<T, C> visitElementRefPropertyInfo(
112113
@Override
113114
public PropertyInfoVertex<T, C> visitElementRefsPropertyInfo(
114115
MElementRefsPropertyInfo<T, C> info) {
115-
for (MElementTypeInfo<T, C> elementTypeInfo : info
116-
.getElementTypeInfos()) {
116+
for (MElement<T, C> elementTypeInfo : info.getElementTypeInfos()) {
117117
// Element references property has "soft" dependencies on the
118118
// types
119119
// of its elements
@@ -123,9 +123,8 @@ public PropertyInfoVertex<T, C> visitElementRefsPropertyInfo(
123123
return vertex;
124124
}
125125

126-
private void addSubstitutionHeadDependencies(
127-
MElementTypeInfo<T, C> elementTypeInfo,
128-
PropertyInfoVertex<T, C> propertyInfoVertex) {
126+
private <M extends MElementTypeInfo<T, C, O>, O> void addSubstitutionHeadDependencies(
127+
M elementTypeInfo, PropertyInfoVertex<T, C> propertyInfoVertex) {
129128
final MClassInfo<T, C> classInfo = propertyInfoVertex.getClassInfo();
130129
final QName elementName = elementTypeInfo.getElementName();
131130
for (MElementInfo<T, C> elementInfo : this.modelInfo.getElementInfos()) {
@@ -136,7 +135,8 @@ private void addSubstitutionHeadDependencies(
136135
.elementInfo(elementInfo);
137136
modelInfoGraphBuilder.addSoftDependency(elementInfoVertex,
138137
propertyInfoVertex);
139-
modelInfoGraphBuilder.addSoftDependency(propertyInfoVertex, elementInfoVertex);
138+
modelInfoGraphBuilder.addSoftDependency(propertyInfoVertex,
139+
elementInfoVertex);
140140
}
141141
}
142142
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,11 @@ public JsonSchemaBuilder produce(MClassInfo<T, C> classInfo) {
4848
final String localName = classInfo
4949
.getContainerLocalName(JsonixConstants.DEFAULT_SCOPED_NAME_DELIMITER);
5050
classInfoSchema.addTitle(localName);
51-
final MClassTypeInfo<T, C> baseTypeInfo = classInfo.getBaseTypeInfo();
51+
final MClassTypeInfo<T, C, ?> baseTypeInfo = classInfo.getBaseTypeInfo();
5252
final JsonSchemaBuilder typeInfoSchema;
5353
if (baseTypeInfo != null) {
5454
final JsonSchemaBuilder baseTypeInfoSchema = mappingCompiler
55-
.createTypeInfoSchemaRef(baseTypeInfo);
55+
.createTypeInfoSchemaRef(baseTypeInfo, baseTypeInfo);
5656
typeInfoSchema = new JsonSchemaBuilder();
5757
typeInfoSchema.addAllOf(baseTypeInfoSchema);
5858
typeInfoSchema.addAllOf(classInfoSchema);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public JsonSchemaBuilder produce(MEnumLeafInfo<T, C> enumLeafInfo) {
3434
final MTypeInfo<T, C> baseTypeInfo = enumLeafInfo.getBaseTypeInfo();
3535
final JsonSchemaBuilder typeInfoSchema;
3636
final JsonSchemaBuilder baseTypeInfoSchema = mappingCompiler
37-
.createTypeInfoSchemaRef(baseTypeInfo);
37+
.createTypeInfoSchemaRef(enumLeafInfo, baseTypeInfo);
3838
typeInfoSchema = new JsonSchemaBuilder();
3939
typeInfoSchema.addAllOf(baseTypeInfoSchema);
4040

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

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.jvnet.jaxb2_commons.xml.bind.model.MElementInfo;
1414
import org.jvnet.jaxb2_commons.xml.bind.model.MEnumLeafInfo;
1515
import org.jvnet.jaxb2_commons.xml.bind.model.MTypeInfo;
16+
import org.jvnet.jaxb2_commons.xml.bind.model.origin.MOriginated;
1617

1718
public class JsonSchemaMappingCompiler<T, C extends T> {
1819

@@ -61,7 +62,7 @@ private void addElementInfos(final JsonSchemaBuilder schema) {
6162
for (MElementInfo<T, C> elementInfo : mapping.getElementInfos()) {
6263
final QName elementName = elementInfo.getElementName();
6364
final MTypeInfo<T, C> typeInfo = elementInfo.getTypeInfo();
64-
final MTypeInfo<T, C> scope = elementInfo.getScope();
65+
final MClassInfo<T, C> scope = elementInfo.getScope();
6566

6667
final JsonSchemaBuilder elementInfoSchema = new JsonSchemaBuilder();
6768
elementInfoSchema.addType(JsonSchemaConstants.OBJECT_TYPE);
@@ -85,7 +86,7 @@ private void addElementInfos(final JsonSchemaBuilder schema) {
8586
nameConstant));
8687

8788
elementInfoSchema.addProperty(JsonixConstants.VALUE_PROPERTY_NAME,
88-
createTypeInfoSchemaRef(typeInfo));
89+
createTypeInfoSchemaRef(elementInfo, typeInfo));
8990

9091
elementInfoSchema
9192
.add(JsonixJsonSchemaConstants.ELEMENT_NAME_PROPERTY_NAME,
@@ -97,7 +98,7 @@ private void addElementInfos(final JsonSchemaBuilder schema) {
9798
if (scope != null) {
9899
elementInfoSchema.add(
99100
JsonixJsonSchemaConstants.SCOPE_PROPERTY_NAME,
100-
createTypeInfoSchemaRef(scope));
101+
createTypeInfoSchemaRef(scope, scope));
101102
}
102103
schema.addAnyOf(elementInfoSchema);
103104
}
@@ -129,9 +130,10 @@ private void addClassInfoSchemas(final JsonSchemaBuilder schema) {
129130
}
130131
}
131132

132-
public JsonSchemaBuilder createTypeInfoSchemaRef(MTypeInfo<T, C> typeInfo) {
133+
public <M extends MOriginated<O>, O> JsonSchemaBuilder createTypeInfoSchemaRef(
134+
M originated, MTypeInfo<T, C> typeInfo) {
133135
return typeInfo
134-
.acceptTypeInfoVisitor(new JsonSchemaRefTypeInfoProducerVisitor<T, C>(
135-
this));
136+
.acceptTypeInfoVisitor(new JsonSchemaRefTypeInfoProducerVisitor<T, C, O>(
137+
this, originated));
136138
}
137139
}

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

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,22 @@
1515
import org.jvnet.jaxb2_commons.xml.bind.model.MAnyAttributePropertyInfo;
1616
import org.jvnet.jaxb2_commons.xml.bind.model.MAnyElementPropertyInfo;
1717
import org.jvnet.jaxb2_commons.xml.bind.model.MAttributePropertyInfo;
18+
import org.jvnet.jaxb2_commons.xml.bind.model.MElement;
1819
import org.jvnet.jaxb2_commons.xml.bind.model.MElementPropertyInfo;
1920
import org.jvnet.jaxb2_commons.xml.bind.model.MElementRefPropertyInfo;
2021
import org.jvnet.jaxb2_commons.xml.bind.model.MElementRefsPropertyInfo;
2122
import org.jvnet.jaxb2_commons.xml.bind.model.MElementTypeInfo;
2223
import org.jvnet.jaxb2_commons.xml.bind.model.MElementTypeInfos;
24+
import org.jvnet.jaxb2_commons.xml.bind.model.MElementTypeRef;
2325
import org.jvnet.jaxb2_commons.xml.bind.model.MElementsPropertyInfo;
2426
import org.jvnet.jaxb2_commons.xml.bind.model.MPropertyInfo;
2527
import org.jvnet.jaxb2_commons.xml.bind.model.MPropertyInfoVisitor;
2628
import org.jvnet.jaxb2_commons.xml.bind.model.MTypeInfo;
2729
import org.jvnet.jaxb2_commons.xml.bind.model.MValuePropertyInfo;
2830
import org.jvnet.jaxb2_commons.xml.bind.model.MWrappable;
31+
import org.jvnet.jaxb2_commons.xml.bind.model.origin.MElementOrigin;
32+
import org.jvnet.jaxb2_commons.xml.bind.model.origin.MElementTypeRefOrigin;
33+
import org.jvnet.jaxb2_commons.xml.bind.model.origin.MOriginated;
2934

3035
import com.sun.tools.xjc.model.Multiplicity;
3136

@@ -56,7 +61,7 @@ public JsonSchemaBuilder visitElementPropertyInfo(
5661
addElementNameSchema(info.getElementName(), schema);
5762
addWrappableSchema(info, schema);
5863

59-
final JsonSchemaBuilder itemTypeSchema = createTypeSchema(info
64+
final JsonSchemaBuilder itemTypeSchema = createTypeSchema(info, info
6065
.getTypeInfo());
6166
final JsonSchemaBuilder typeSchema = createPossiblyCollectionTypeSchema(
6267
info, itemTypeSchema);
@@ -147,7 +152,7 @@ public JsonSchemaBuilder visitValuePropertyInfo(
147152
addPropertyInfoSchema(info, schema);
148153
addPropertyInfoTypeSchema(StandardNaming.VALUE, schema);
149154

150-
final JsonSchemaBuilder itemTypeSchema = createTypeSchema(info
155+
final JsonSchemaBuilder itemTypeSchema = createTypeSchema(info, info
151156
.getTypeInfo());
152157
final JsonSchemaBuilder typeSchema = createPossiblyCollectionTypeSchema(
153158
info, itemTypeSchema);
@@ -200,7 +205,7 @@ public JsonSchemaBuilder visitAttributePropertyInfo(
200205
addPropertyInfoSchema(info, schema);
201206
addPropertyInfoTypeSchema(StandardNaming.ATTRIBUTE, schema);
202207
addAttributeNameSchema(info.getAttributeName(), schema);
203-
final JsonSchemaBuilder itemTypeSchema = createTypeSchema(info
208+
final JsonSchemaBuilder itemTypeSchema = createTypeSchema(info, info
204209
.getTypeInfo());
205210
final JsonSchemaBuilder typeSchema = createPossiblyCollectionTypeSchema(
206211
info, itemTypeSchema);
@@ -271,12 +276,12 @@ private void addAttributeNameSchema(QName attributeName,
271276
}
272277

273278
private JsonSchemaBuilder createElementTypeInfosSchema(
274-
MElementTypeInfos<T, C> info) {
279+
MElementTypeInfos<T, C, MElementTypeRef<T, C>, MElementTypeRefOrigin> info) {
275280

276281
final JsonSchemaBuilder schema = new JsonSchemaBuilder();
277282

278283
if (!info.getElementTypeInfos().isEmpty()) {
279-
for (MElementTypeInfo<T, C> elementTypeInfo : info
284+
for (MElementTypeRef<T, C> elementTypeInfo : info
280285
.getElementTypeInfos()) {
281286
final JsonSchemaBuilder elementTypeInfoSchema = createElementTypeInfoSchema(elementTypeInfo);
282287
schema.addAnyOf(elementTypeInfoSchema);
@@ -286,33 +291,33 @@ private JsonSchemaBuilder createElementTypeInfosSchema(
286291
}
287292

288293
private JsonSchemaBuilder createElementTypeInfoSchema(
289-
MElementTypeInfo<T, C> elementTypeInfo) {
294+
MElementTypeRef<T, C> elementTypeInfo) {
290295
final JsonSchemaBuilder elementTypeInfoSchema = new JsonSchemaBuilder();
291296
addElementNameSchema(elementTypeInfo.getElementName(),
292297
elementTypeInfoSchema);
293-
elementTypeInfoSchema.addAnyOf(createTypeSchema(elementTypeInfo
298+
elementTypeInfoSchema.addAnyOf(createTypeSchema(elementTypeInfo, elementTypeInfo
294299
.getTypeInfo()));
295300
return elementTypeInfoSchema;
296301
}
297302

298303
private List<JsonSchemaBuilder> createElementRefsSchema(
299-
MElementTypeInfos<T, C> info) {
304+
MElementTypeInfos<T, C, MElement<T, C>, MElementOrigin> info) {
300305

301-
final List<MElementTypeInfo<T, C>> elementTypeInfos = info
306+
final List<MElement<T, C>> elementTypeInfos = info
302307
.getElementTypeInfos();
303308
final List<JsonSchemaBuilder> schemas = new ArrayList<JsonSchemaBuilder>(
304309
elementTypeInfos.size());
305310

306-
for (MElementTypeInfo<T, C> elementTypeInfo : elementTypeInfos) {
311+
for (MElement<T, C> elementTypeInfo : elementTypeInfos) {
307312
final JsonSchemaBuilder elementTypeInfoSchema = createElementRefSchema(elementTypeInfo);
308313
schemas.add(elementTypeInfoSchema);
309314
}
310315
return schemas;
311316

312317
}
313318

314-
private JsonSchemaBuilder createElementRefSchema(
315-
MElementTypeInfo<T, C> elementTypeInfo) {
319+
private <M extends MElementTypeInfo<T, C, O>, O> JsonSchemaBuilder createElementRefSchema(
320+
M elementTypeInfo) {
316321
final JsonSchemaBuilder schema = new JsonSchemaBuilder();
317322
addElementNameSchema(elementTypeInfo.getElementName(), schema);
318323
schema.addType(JsonSchemaConstants.OBJECT_TYPE);
@@ -321,7 +326,7 @@ private JsonSchemaBuilder createElementRefSchema(
321326
new JsonSchemaBuilder()
322327
.addRef(XmlSchemaJsonSchemaConstants.QNAME_TYPE_INFO_SCHEMA_REF));
323328
schema.addProperty(JsonixConstants.VALUE_PROPERTY_NAME,
324-
createTypeSchema(elementTypeInfo.getTypeInfo()));
329+
createTypeSchema(elementTypeInfo, elementTypeInfo.getTypeInfo()));
325330
return schema;
326331
}
327332

@@ -364,8 +369,9 @@ private JsonSchemaBuilder createPossiblyCollectionTypeSchema(
364369
return typeSchema;
365370
}
366371

367-
private JsonSchemaBuilder createTypeSchema(MTypeInfo<T, C> typeInfo) {
372+
private <M extends MOriginated<O>, O> JsonSchemaBuilder createTypeSchema(
373+
M originated, MTypeInfo<T, C> typeInfo) {
368374
return getClassInfoCompiler().getMappingCompiler()
369-
.createTypeInfoSchemaRef(typeInfo);
375+
.createTypeInfoSchemaRef(originated, typeInfo);
370376
}
371377
}

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

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

33
import java.text.MessageFormat;
4+
import java.util.LinkedList;
5+
import java.util.List;
46
import java.util.Map;
57

68
import javax.xml.namespace.QName;
@@ -13,6 +15,8 @@
1315
import org.hisrc.jsonix.jsonschema.JsonSchemaBuilder;
1416
import org.hisrc.jsonix.jsonschema.JsonSchemaConstants;
1517
import org.hisrc.jsonix.jsonschema.JsonSchemaKeywords;
18+
import org.hisrc.jsonix.xml.xsom.CollectSimpleTypeNamesVisitor;
19+
import org.hisrc.xml.xsom.SchemaComponentAware;
1620
import org.jvnet.jaxb2_commons.xml.bind.model.MBuiltinLeafInfo;
1721
import org.jvnet.jaxb2_commons.xml.bind.model.MClassInfo;
1822
import org.jvnet.jaxb2_commons.xml.bind.model.MClassRef;
@@ -24,20 +28,27 @@
2428
import org.jvnet.jaxb2_commons.xml.bind.model.MPackagedTypeInfo;
2529
import org.jvnet.jaxb2_commons.xml.bind.model.MTypeInfoVisitor;
2630
import org.jvnet.jaxb2_commons.xml.bind.model.MWildcardTypeInfo;
31+
import org.jvnet.jaxb2_commons.xml.bind.model.origin.MOriginated;
2732

28-
public class JsonSchemaRefTypeInfoProducerVisitor<T, C extends T> implements
33+
import com.sun.xml.xsom.XSComponent;
34+
35+
public class JsonSchemaRefTypeInfoProducerVisitor<T, C extends T, O> implements
2936
MTypeInfoVisitor<T, C, JsonSchemaBuilder> {
3037

3138
private final JsonSchemaMappingCompiler<T, C> mappingCompiler;
39+
private final MOriginated<O> originated;
3240
private final Modules<T, C> modules;
3341
private final Module<T, C> module;
3442
private final Mapping<T, C> mapping;
3543
private final Map<QName, String> typeNameSchemaRefs;
3644

3745
public JsonSchemaRefTypeInfoProducerVisitor(
38-
JsonSchemaMappingCompiler<T, C> mappingCompiler) {
46+
JsonSchemaMappingCompiler<T, C> mappingCompiler,
47+
MOriginated<O> originated) {
3948
Validate.notNull(mappingCompiler);
49+
Validate.notNull(originated);
4050
this.mappingCompiler = mappingCompiler;
51+
this.originated = originated;
4152
this.modules = mappingCompiler.getModules();
4253
this.module = mappingCompiler.getModule();
4354
this.mapping = mappingCompiler.getMapping();
@@ -96,17 +107,33 @@ public JsonSchemaBuilder visitIDREFS(MIDREFS<T, C> info) {
96107

97108
@Override
98109
public JsonSchemaBuilder visitBuiltinLeafInfo(MBuiltinLeafInfo<T, C> info) {
99-
final QName typeName = info.getTypeName();
100-
final String $ref = this.typeNameSchemaRefs.get(typeName);
110+
111+
final O origin = this.originated.getOrigin();
112+
113+
final List<QName> simpleTypeNames = new LinkedList<QName>();
114+
if (origin instanceof SchemaComponentAware) {
115+
final XSComponent component = ((SchemaComponentAware) origin)
116+
.getSchemaComponent();
117+
if (component != null) {
118+
final CollectSimpleTypeNamesVisitor visitor = new CollectSimpleTypeNamesVisitor();
119+
component.visit(visitor);
120+
simpleTypeNames.addAll(visitor.getTypeNames());
121+
}
122+
}
123+
124+
simpleTypeNames.add(info.getTypeName());
125+
101126
final JsonSchemaBuilder schema = new JsonSchemaBuilder();
102-
if ($ref != null) {
103-
return schema.addRef($ref);
104-
} else {
105-
return schema
106-
.addDescription(MessageFormat
107-
.format("WARNING, the type [{0}] is not supported, using the lax schema {}.",
108-
typeName));
127+
for (QName candidateName : simpleTypeNames) {
128+
final String $ref = this.typeNameSchemaRefs.get(candidateName);
129+
if ($ref != null) {
130+
return schema.addRef($ref);
131+
}
109132
}
133+
return schema
134+
.addDescription(MessageFormat
135+
.format("WARNING, the type [{0}] is not supported, using the lax schema {}.",
136+
info.getTypeName()));
110137
}
111138

112139
@Override

0 commit comments

Comments
 (0)