Skip to content

Commit 254abb2

Browse files
committed
Issue #40, #50.
1 parent 6f5018d commit 254abb2

12 files changed

+449
-14
lines changed

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

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

3+
import java.math.BigInteger;
34
import java.util.ArrayList;
45
import java.util.LinkedHashMap;
56
import java.util.List;
@@ -13,15 +14,21 @@
1314
import org.hisrc.jsonix.jsonschema.JsonSchemaBuilder;
1415
import org.hisrc.jsonix.jsonschema.JsonSchemaConstants;
1516
import org.hisrc.jsonix.naming.StandardNaming;
17+
import org.hisrc.jsonix.xml.xsom.ParticleMultiplicityCounter;
18+
import org.hisrc.xml.xsom.XSFunctionApplier;
1619
import org.jvnet.jaxb2_commons.xml.bind.model.MClassInfo;
1720
import org.jvnet.jaxb2_commons.xml.bind.model.MClassTypeInfo;
1821
import org.jvnet.jaxb2_commons.xml.bind.model.MPropertyInfo;
1922

23+
import com.sun.tools.xjc.model.Multiplicity;
24+
2025
public class JsonSchemaClassInfoProducer<T, C extends T> implements
2126
JsonSchemaTypeInfoProducer<MClassInfo<T, C>, T, C> {
2227

2328
private final JsonSchemaMappingCompiler<T, C> mappingCompiler;
2429
private final Mapping<T, C> mapping;
30+
private final XSFunctionApplier<Multiplicity> multiplicityCounter = new XSFunctionApplier<Multiplicity>(
31+
ParticleMultiplicityCounter.INSTANCE);
2532

2633
public JsonSchemaClassInfoProducer(
2734
JsonSchemaMappingCompiler<T, C> mappingCompiler) {
@@ -58,6 +65,14 @@ public JsonSchemaBuilder produce(MClassInfo<T, C> classInfo) {
5865
propertyInfoSchemas.size());
5966
propertiesOrder.addAll(propertyInfoSchemas.keySet());
6067
classInfoSchema.addProperties(propertyInfoSchemas);
68+
for (MPropertyInfo<T, C> propertyInfo : classInfo.getProperties()) {
69+
final Multiplicity multiplicity = multiplicityCounter
70+
.apply(propertyInfo.getOrigin());
71+
if (multiplicity != null && multiplicity.min != null
72+
&& multiplicity.min.compareTo(BigInteger.ZERO) > 0) {
73+
typeInfoSchema.addRequired(propertyInfo.getPrivateName());
74+
}
75+
}
6176
typeInfoSchema.add(JsonixJsonSchemaConstants.TYPE_TYPE_PROPERTY_NAME,
6277
StandardNaming.CLASS_INFO);
6378
final QName typeName = classInfo.getTypeName();

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

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import org.hisrc.jsonix.jsonschema.JsonSchemaBuilder;
1111
import org.hisrc.jsonix.jsonschema.JsonSchemaConstants;
1212
import org.hisrc.jsonix.naming.StandardNaming;
13+
import org.hisrc.jsonix.xml.xsom.ParticleMultiplicityCounter;
14+
import org.hisrc.xml.xsom.XSFunctionApplier;
1315
import org.jvnet.jaxb2_commons.xml.bind.model.MAnyAttributePropertyInfo;
1416
import org.jvnet.jaxb2_commons.xml.bind.model.MAnyElementPropertyInfo;
1517
import org.jvnet.jaxb2_commons.xml.bind.model.MAttributePropertyInfo;
@@ -25,11 +27,16 @@
2527
import org.jvnet.jaxb2_commons.xml.bind.model.MValuePropertyInfo;
2628
import org.jvnet.jaxb2_commons.xml.bind.model.MWrappable;
2729

30+
import com.sun.tools.xjc.model.Multiplicity;
31+
2832
public class JsonSchemaPropertyInfoProducerVisitor<T, C extends T> implements
2933
MPropertyInfoVisitor<T, C, JsonSchemaBuilder> {
3034

3135
private final JsonSchemaClassInfoProducer<T, C> classInfoCompiler;
3236

37+
private final XSFunctionApplier<Multiplicity> multiplicityCounter = new XSFunctionApplier<Multiplicity>(
38+
ParticleMultiplicityCounter.INSTANCE);
39+
3340
public JsonSchemaPropertyInfoProducerVisitor(
3441
JsonSchemaClassInfoProducer<T, C> classInfoCompiler) {
3542
Validate.notNull(classInfoCompiler);
@@ -52,7 +59,8 @@ public JsonSchemaBuilder visitElementPropertyInfo(
5259
final JsonSchemaBuilder itemTypeSchema = createTypeSchema(info
5360
.getTypeInfo());
5461
final JsonSchemaBuilder typeSchema = createPossiblyCollectionTypeSchema(
55-
info.isCollection(), itemTypeSchema);
62+
info, itemTypeSchema);
63+
5664
schema.addAllOf(typeSchema);
5765
return schema;
5866
}
@@ -67,7 +75,7 @@ public JsonSchemaBuilder visitElementsPropertyInfo(
6775

6876
final JsonSchemaBuilder itemTypeSchema = createElementTypeInfosSchema(info);
6977
final JsonSchemaBuilder typeSchema = createPossiblyCollectionTypeSchema(
70-
info.isCollection(), itemTypeSchema);
78+
info, itemTypeSchema);
7179
schema.addAllOf(typeSchema);
7280
return schema;
7381
}
@@ -98,8 +106,7 @@ public JsonSchemaBuilder visitElementRefPropertyInfo(
98106
itemTypeSchemas.add(createElementRefSchema(info));
99107
}
100108
final JsonSchemaBuilder typeSchema = createPossiblyCollectionTypeSchema(
101-
info.isCollection(),
102-
createPossiblyAnyOfTypeSchema(itemTypeSchemas));
109+
info, createPossiblyAnyOfTypeSchema(itemTypeSchemas));
103110
schema.addAllOf(typeSchema);
104111
return schema;
105112
}
@@ -128,8 +135,7 @@ public JsonSchemaBuilder visitElementRefsPropertyInfo(
128135
itemTypeSchemas.addAll(createElementRefsSchema(info));
129136
}
130137
final JsonSchemaBuilder typeSchema = createPossiblyCollectionTypeSchema(
131-
info.isCollection(),
132-
createPossiblyAnyOfTypeSchema(itemTypeSchemas));
138+
info, createPossiblyAnyOfTypeSchema(itemTypeSchemas));
133139
schema.addAllOf(typeSchema);
134140
return schema;
135141
}
@@ -144,7 +150,7 @@ public JsonSchemaBuilder visitValuePropertyInfo(
144150
final JsonSchemaBuilder itemTypeSchema = createTypeSchema(info
145151
.getTypeInfo());
146152
final JsonSchemaBuilder typeSchema = createPossiblyCollectionTypeSchema(
147-
info.isCollection(), itemTypeSchema);
153+
info, itemTypeSchema);
148154
schema.addAllOf(typeSchema);
149155
return schema;
150156
}
@@ -182,8 +188,7 @@ public JsonSchemaBuilder visitAnyElementPropertyInfo(
182188
itemTypeSchemas.add(anyElementSchema);
183189
}
184190
final JsonSchemaBuilder typeSchema = createPossiblyCollectionTypeSchema(
185-
info.isCollection(),
186-
createPossiblyAnyOfTypeSchema(itemTypeSchemas));
191+
info, createPossiblyAnyOfTypeSchema(itemTypeSchemas));
187192
schema.addAllOf(typeSchema);
188193
return schema;
189194
}
@@ -198,7 +203,7 @@ public JsonSchemaBuilder visitAttributePropertyInfo(
198203
final JsonSchemaBuilder itemTypeSchema = createTypeSchema(info
199204
.getTypeInfo());
200205
final JsonSchemaBuilder typeSchema = createPossiblyCollectionTypeSchema(
201-
info.isCollection(), itemTypeSchema);
206+
info, itemTypeSchema);
202207
schema.addAllOf(typeSchema);
203208
return schema;
204209
}
@@ -334,12 +339,25 @@ private JsonSchemaBuilder createPossiblyAnyOfTypeSchema(
334339
}
335340

336341
private JsonSchemaBuilder createPossiblyCollectionTypeSchema(
337-
boolean collection, final JsonSchemaBuilder itemTypeSchema) {
342+
MPropertyInfo<T, C> propertyInfo,
343+
final JsonSchemaBuilder itemTypeSchema) {
338344
final JsonSchemaBuilder typeSchema;
339-
if (collection) {
345+
if (propertyInfo.isCollection()) {
340346
typeSchema = new JsonSchemaBuilder();
341347
typeSchema.addType(JsonSchemaConstants.ARRAY_TYPE).addItem(
342348
itemTypeSchema);
349+
350+
final Multiplicity multiplicity = multiplicityCounter
351+
.apply(propertyInfo.getOrigin());
352+
if (multiplicity != null) {
353+
if (multiplicity.min != null) {
354+
typeSchema.addMinItems(multiplicity.min);
355+
}
356+
if (multiplicity.max != null) {
357+
typeSchema.addMaxItems(multiplicity.max);
358+
}
359+
}
360+
343361
} else {
344362
typeSchema = itemTypeSchema;
345363
}

compiler/src/main/java/org/hisrc/jsonix/jsonschema/JsonSchemaKeywords.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ private JsonSchemaKeywords() {
3131
public static final String properties = "properties";
3232
public static final String additionalProperties = "additionalProperties";
3333
public static final String patternProperties = "patternProperties";
34-
public static final String required = "rminPropertiesequired";
34+
public static final String required = "required";
3535
public static final String minProperties = "minProperties";
3636
public static final String maxProperties = "maxProperties";
3737
public static final String dependencies = "dependencies";
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package org.hisrc.jsonix.xml.xsom.tests;
2+
3+
import org.hisrc.jsonix.xml.xsom.ParticleMultiplicityCounter;
4+
import org.hisrc.xml.bind.model.util.MModelInfoLoader;
5+
import org.hisrc.xml.xsom.XSFunctionApplier;
6+
import org.junit.Assert;
7+
import org.junit.Before;
8+
import org.junit.Test;
9+
import org.jvnet.jaxb2_commons.xml.bind.model.MClassInfo;
10+
import org.jvnet.jaxb2_commons.xml.bind.model.MModelInfo;
11+
import org.jvnet.jaxb2_commons.xml.bind.model.MPropertyInfo;
12+
13+
import com.sun.tools.xjc.model.Multiplicity;
14+
import com.sun.tools.xjc.model.nav.NClass;
15+
import com.sun.tools.xjc.model.nav.NType;
16+
17+
public class MultiplicityCounterAnyAttribute01Test {
18+
19+
private MModelInfo<NType, NClass> model;
20+
21+
@Before
22+
public void loadModel() throws Exception {
23+
model = MModelInfoLoader.INSTANCE
24+
.loadModel("jsonschema/minmaxoccurs/anyAttribute01.xsd");
25+
}
26+
27+
@Test
28+
public void aa01a() throws Exception {
29+
30+
final MClassInfo<NType, NClass> eType = model.getClassInfo("test.Aa01");
31+
32+
Assert.assertNotNull(eType);
33+
34+
final MPropertyInfo<NType, NClass> otherAttributes = eType
35+
.getProperty("otherAttributes");
36+
37+
Assert.assertNotNull(otherAttributes);
38+
39+
final Multiplicity multiplicity = new XSFunctionApplier<Multiplicity>(
40+
ParticleMultiplicityCounter.INSTANCE).apply(otherAttributes
41+
.getOrigin());
42+
43+
Assert.assertNull(multiplicity);
44+
45+
}
46+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package org.hisrc.jsonix.xml.xsom.tests;
2+
3+
import org.hisrc.jsonix.xml.xsom.ParticleMultiplicityCounter;
4+
import org.hisrc.xml.bind.model.util.MModelInfoLoader;
5+
import org.hisrc.xml.xsom.XSFunctionApplier;
6+
import org.junit.Assert;
7+
import org.junit.Before;
8+
import org.junit.Test;
9+
import org.jvnet.jaxb2_commons.xml.bind.model.MClassInfo;
10+
import org.jvnet.jaxb2_commons.xml.bind.model.MModelInfo;
11+
import org.jvnet.jaxb2_commons.xml.bind.model.MPropertyInfo;
12+
13+
import com.sun.tools.xjc.model.Multiplicity;
14+
import com.sun.tools.xjc.model.nav.NClass;
15+
import com.sun.tools.xjc.model.nav.NType;
16+
17+
public class MultiplicityCounterAnyElement01Test {
18+
19+
private MModelInfo<NType, NClass> model;
20+
21+
@Before
22+
public void loadModel() throws Exception {
23+
model = MModelInfoLoader.INSTANCE
24+
.loadModel("jsonschema/minmaxoccurs/anyElement01.xsd");
25+
}
26+
27+
@Test
28+
public void e01a() throws Exception {
29+
30+
final MClassInfo<NType, NClass> ae01Type = model.getClassInfo("test.Ae01");
31+
32+
Assert.assertNotNull(ae01Type);
33+
34+
final MPropertyInfo<NType, NClass> any = ae01Type.getProperty("any");
35+
36+
Assert.assertNotNull(any);
37+
38+
final Multiplicity multiplicity = new XSFunctionApplier<Multiplicity>(
39+
ParticleMultiplicityCounter.INSTANCE).apply(any.getOrigin());
40+
41+
Assert.assertEquals(2, multiplicity.min.intValue());
42+
Assert.assertEquals(20, multiplicity.max.intValue());
43+
44+
}
45+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package org.hisrc.jsonix.xml.xsom.tests;
2+
3+
import org.hisrc.jsonix.xml.xsom.ParticleMultiplicityCounter;
4+
import org.hisrc.xml.bind.model.util.MModelInfoLoader;
5+
import org.hisrc.xml.xsom.XSFunctionApplier;
6+
import org.junit.Assert;
7+
import org.junit.Before;
8+
import org.junit.Test;
9+
import org.jvnet.jaxb2_commons.xml.bind.model.MClassInfo;
10+
import org.jvnet.jaxb2_commons.xml.bind.model.MModelInfo;
11+
import org.jvnet.jaxb2_commons.xml.bind.model.MPropertyInfo;
12+
13+
import com.sun.tools.xjc.model.Multiplicity;
14+
import com.sun.tools.xjc.model.nav.NClass;
15+
import com.sun.tools.xjc.model.nav.NType;
16+
17+
public class MultiplicityCounterAttribute01Test {
18+
19+
private MModelInfo<NType, NClass> model;
20+
21+
@Before
22+
public void loadModel() throws Exception {
23+
model = MModelInfoLoader.INSTANCE
24+
.loadModel("jsonschema/minmaxoccurs/attribute01.xsd");
25+
}
26+
27+
@Test
28+
public void a01a() throws Exception {
29+
30+
final MClassInfo<NType, NClass> eType = model.getClassInfo("test.A01");
31+
32+
Assert.assertNotNull(eType);
33+
34+
final MPropertyInfo<NType, NClass> a = eType.getProperty("a");
35+
36+
Assert.assertNotNull(a);
37+
38+
final Multiplicity multiplicity = new XSFunctionApplier<Multiplicity>(
39+
ParticleMultiplicityCounter.INSTANCE).apply(a.getOrigin());
40+
41+
Assert.assertNotNull(multiplicity);
42+
Assert.assertEquals(1, multiplicity.min.intValue());
43+
Assert.assertEquals(1, multiplicity.max.intValue());
44+
45+
}
46+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package org.hisrc.jsonix.xml.xsom.tests;
2+
3+
import org.hisrc.jsonix.xml.xsom.ParticleMultiplicityCounter;
4+
import org.hisrc.xml.bind.model.util.MModelInfoLoader;
5+
import org.hisrc.xml.xsom.XSFunctionApplier;
6+
import org.junit.Assert;
7+
import org.junit.Before;
8+
import org.junit.Test;
9+
import org.jvnet.jaxb2_commons.xml.bind.model.MClassInfo;
10+
import org.jvnet.jaxb2_commons.xml.bind.model.MModelInfo;
11+
import org.jvnet.jaxb2_commons.xml.bind.model.MPropertyInfo;
12+
13+
import com.sun.tools.xjc.model.Multiplicity;
14+
import com.sun.tools.xjc.model.nav.NClass;
15+
import com.sun.tools.xjc.model.nav.NType;
16+
17+
public class MultiplicityCounterElement01Test {
18+
19+
private MModelInfo<NType, NClass> model;
20+
21+
@Before
22+
public void loadModel() throws Exception {
23+
model = MModelInfoLoader.INSTANCE
24+
.loadModel("jsonschema/minmaxoccurs/element01.xsd");
25+
}
26+
27+
@Test
28+
public void e01a() throws Exception {
29+
30+
final MClassInfo<NType, NClass> eType = model.getClassInfo("test.E01");
31+
32+
Assert.assertNotNull(eType);
33+
34+
final MPropertyInfo<NType, NClass> a = eType.getProperty("a");
35+
36+
Assert.assertNotNull(a);
37+
38+
final Multiplicity multiplicity = new XSFunctionApplier<Multiplicity>(
39+
ParticleMultiplicityCounter.INSTANCE).apply(a.getOrigin());
40+
41+
Assert.assertEquals(10, multiplicity.min.intValue());
42+
Assert.assertEquals(20, multiplicity.max.intValue());
43+
44+
}
45+
}

0 commit comments

Comments
 (0)