Skip to content

Commit bd2f64a

Browse files
committed
Issue #22.
1 parent 289b134 commit bd2f64a

12 files changed

+458
-0
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package org.hisrc.jsonix.compilation.jsc;
2+
3+
import org.apache.commons.lang3.Validate;
4+
import org.hisrc.jsonix.jsonschema.JsonSchemaBuilder;
5+
import org.jvnet.jaxb2_commons.xml.bind.model.MTypeInfo;
6+
7+
public class JsonSchemaArrayRefTypeInfoCompiler<T, C extends T> implements
8+
JsonSchemaTypeInfoCompiler<MTypeInfo<T, C>, T, C> {
9+
10+
private final String $ref;
11+
12+
public JsonSchemaArrayRefTypeInfoCompiler(String $ref) {
13+
Validate.notNull($ref);
14+
this.$ref = $ref;
15+
}
16+
17+
@Override
18+
public JsonSchemaBuilder compile(MTypeInfo<T, C> typeInfo) {
19+
return new JsonSchemaBuilder().addType("array").addItem(
20+
new JsonSchemaBuilder().addRef($ref));
21+
}
22+
23+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package org.hisrc.jsonix.compilation.jsc;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
import javax.xml.namespace.QName;
7+
8+
import org.apache.commons.lang3.Validate;
9+
import org.hisrc.jsonix.definition.Mapping;
10+
import org.hisrc.jsonix.jsonschema.JsonSchemaBuilder;
11+
import org.jvnet.jaxb2_commons.xml.bind.model.MClassInfo;
12+
import org.jvnet.jaxb2_commons.xml.bind.model.MClassTypeInfo;
13+
import org.jvnet.jaxb2_commons.xml.bind.model.MPropertyInfo;
14+
15+
public class JsonSchemaClassInfoCompiler<T, C extends T> implements
16+
JsonSchemaTypeInfoCompiler<MClassInfo<T, C>, T, C> {
17+
18+
// TODO move to constants
19+
public static final String DEFAULT_SCOPED_NAME_DELIMITER = ".";
20+
21+
private final JsonSchemaMappingCompiler<T, C> mappingCompiler;
22+
private final Mapping<T, C> mapping;
23+
24+
public JsonSchemaClassInfoCompiler(
25+
JsonSchemaMappingCompiler<T, C> mappingCompiler) {
26+
Validate.notNull(mappingCompiler);
27+
this.mappingCompiler = mappingCompiler;
28+
this.mapping = mappingCompiler.getMapping();
29+
}
30+
31+
public JsonSchemaMappingCompiler<T, C> getMappingCompiler() {
32+
return mappingCompiler;
33+
}
34+
35+
@Override
36+
public JsonSchemaBuilder compile(MClassInfo<T, C> classInfo) {
37+
final JsonSchemaBuilder classInfoSchemaBuilder = new JsonSchemaBuilder();
38+
classInfoSchemaBuilder.addType("object");
39+
final String localName = classInfo
40+
.getContainerLocalName(DEFAULT_SCOPED_NAME_DELIMITER);
41+
classInfoSchemaBuilder.addTitle(localName);
42+
// TODO addId ?
43+
// ...
44+
// TODO add type name ?
45+
final String targetNamespace = mapping.getTargetNamespaceURI();
46+
final QName defaultTypeName = new QName(targetNamespace, localName);
47+
final QName typeName = classInfo.getTypeName();
48+
49+
final MClassTypeInfo<T, C> baseTypeInfo = classInfo.getBaseTypeInfo();
50+
final JsonSchemaBuilder typeInfoSchemaBuilder;
51+
if (baseTypeInfo != null) {
52+
final JsonSchemaBuilder baseTypeInfoSchemaBuilder = mappingCompiler
53+
.createTypeInfoSchemaRef(baseTypeInfo);
54+
typeInfoSchemaBuilder = new JsonSchemaBuilder();
55+
typeInfoSchemaBuilder.addAllOf(baseTypeInfoSchemaBuilder);
56+
typeInfoSchemaBuilder.addAllOf(classInfoSchemaBuilder);
57+
} else {
58+
typeInfoSchemaBuilder = classInfoSchemaBuilder;
59+
}
60+
61+
final List<JsonSchemaBuilder> propertyInfoSchemaBuilders = compilePropertyInfos(classInfo);
62+
for (JsonSchemaBuilder propertyInfoSchemaBuilder : propertyInfoSchemaBuilders) {
63+
classInfoSchemaBuilder.addItem(propertyInfoSchemaBuilder);
64+
}
65+
66+
return typeInfoSchemaBuilder;
67+
}
68+
69+
private List<JsonSchemaBuilder> compilePropertyInfos(
70+
MClassInfo<T, C> classInfo) {
71+
final List<JsonSchemaBuilder> propertyInfoSchemaBuilders = new ArrayList<JsonSchemaBuilder>(
72+
classInfo.getProperties().size());
73+
for (MPropertyInfo<T, C> propertyInfo : classInfo.getProperties()) {
74+
if (mapping.getPropertyInfos().contains(propertyInfo)) {
75+
propertyInfoSchemaBuilders
76+
.add(propertyInfo
77+
.acceptPropertyInfoVisitor(new JsonSchemaPropertyInfoCompilerVisitor<T, C>(
78+
this)));
79+
}
80+
}
81+
return propertyInfoSchemaBuilders;
82+
}
83+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package org.hisrc.jsonix.compilation.jsc;
2+
3+
import javax.json.JsonBuilderFactory;
4+
5+
import org.apache.commons.lang3.Validate;
6+
import org.hisrc.jsonix.definition.Mapping;
7+
import org.hisrc.jsonix.definition.Module;
8+
import org.hisrc.jsonix.definition.Modules;
9+
import org.hisrc.jsonix.jsonschema.JsonSchemaBuilder;
10+
import org.jvnet.jaxb2_commons.xml.bind.model.MTypeInfo;
11+
12+
public class JsonSchemaMappingCompiler<T, C extends T> {
13+
14+
private final JsonBuilderFactory builderFactory;
15+
private final Modules<T, C> modules;
16+
private final Module<T, C> module;
17+
private final Mapping<T, C> mapping;
18+
19+
public JsonSchemaMappingCompiler(JsonBuilderFactory builderFactory,
20+
Modules<T, C> modules, Module<T, C> module, Mapping<T, C> mapping) {
21+
Validate.notNull(builderFactory);
22+
Validate.notNull(modules);
23+
Validate.notNull(module);
24+
Validate.notNull(mapping);
25+
this.builderFactory = builderFactory;
26+
this.modules = modules;
27+
this.module = module;
28+
this.mapping = mapping;
29+
}
30+
31+
public JsonSchemaBuilder compile() {
32+
throw new UnsupportedOperationException();
33+
}
34+
35+
public Mapping<T, C> getMapping() {
36+
return mapping;
37+
}
38+
39+
public JsonSchemaBuilder createTypeInfoSchemaRef(MTypeInfo<T, C> typeInfo) {
40+
throw new UnsupportedOperationException();
41+
}
42+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package org.hisrc.jsonix.compilation.jsc;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
import javax.json.JsonBuilderFactory;
7+
8+
import org.apache.commons.lang3.Validate;
9+
import org.hisrc.jsonix.definition.Mapping;
10+
import org.hisrc.jsonix.definition.Module;
11+
import org.hisrc.jsonix.definition.Modules;
12+
import org.hisrc.jsonix.jsonschema.JsonSchemaBuilder;
13+
14+
public class JsonSchemaModuleCompiler<T, C extends T> {
15+
16+
private final JsonBuilderFactory builderFactory;
17+
private final Modules<T, C> modules;
18+
private final Module<T, C> module;
19+
20+
public JsonSchemaModuleCompiler(JsonBuilderFactory builderFactory,
21+
Modules<T, C> modules, Module<T, C> module) {
22+
Validate.notNull(builderFactory);
23+
Validate.notNull(modules);
24+
Validate.notNull(module);
25+
this.builderFactory = builderFactory;
26+
this.modules = modules;
27+
this.module = module;
28+
}
29+
30+
public JsonSchemaBuilder compile() {
31+
final List<JsonSchemaBuilder> mappingSchemaBuilders = new ArrayList<JsonSchemaBuilder>(
32+
this.module.getMappings().size());
33+
for (Mapping<T, C> mapping : this.module.getMappings()) {
34+
if (!mapping.isEmpty()) {
35+
final JsonSchemaMappingCompiler<T, C> mappingCompiler = new JsonSchemaMappingCompiler<T, C>(
36+
builderFactory, modules, module, mapping);
37+
38+
final JsonSchemaBuilder mappingSchemaBuilder = mappingCompiler
39+
.compile();
40+
41+
mappingSchemaBuilders.add(mappingSchemaBuilder);
42+
}
43+
}
44+
45+
if (mappingSchemaBuilders.size() == 1) {
46+
return mappingSchemaBuilders.get(0);
47+
} else {
48+
final JsonSchemaBuilder schemaBuilder = new JsonSchemaBuilder();
49+
for (JsonSchemaBuilder mappingSchemaBuilder : mappingSchemaBuilders) {
50+
schemaBuilder.addAnyOf(mappingSchemaBuilder);
51+
}
52+
return schemaBuilder;
53+
}
54+
}
55+
56+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package org.hisrc.jsonix.compilation.jsc;
2+
3+
import javax.json.JsonBuilderFactory;
4+
import javax.json.JsonObject;
5+
import javax.json.spi.JsonProvider;
6+
7+
import org.apache.commons.lang3.Validate;
8+
import org.hisrc.jsonix.definition.Module;
9+
import org.hisrc.jsonix.definition.Modules;
10+
import org.hisrc.jsonix.definition.Output;
11+
import org.hisrc.jsonix.jsonschema.JsonSchemaBuilder;
12+
13+
public class JsonSchemaModulesCompiler<T, C extends T> {
14+
15+
private final Modules<T, C> modules;
16+
17+
public JsonSchemaModulesCompiler(Modules<T, C> modules) {
18+
Validate.notNull(modules);
19+
this.modules = modules;
20+
}
21+
22+
public void compile(JsonSchemaWriter<T, C> writer) {
23+
final JsonProvider provider = JsonProvider.provider();
24+
final JsonBuilderFactory builderFactory = provider
25+
.createBuilderFactory(null);
26+
27+
for (final Module<T, C> module : this.modules.getModules()) {
28+
if (!module.isEmpty()) {
29+
for (Output output : module.getOutputs()) {
30+
final JsonSchemaModuleCompiler<T, C> moduleCompiler = new JsonSchemaModuleCompiler<T, C>(
31+
builderFactory, modules, module);
32+
final JsonSchemaBuilder schemaBuilder = moduleCompiler
33+
.compile();
34+
final JsonObject schema = schemaBuilder
35+
.build(builderFactory);
36+
writer.writeJsonSchema(module, schema, output);
37+
}
38+
}
39+
}
40+
}
41+
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package org.hisrc.jsonix.compilation.jsc;
2+
3+
import org.apache.commons.lang3.Validate;
4+
import org.hisrc.jsonix.jsonschema.JsonSchemaBuilder;
5+
import org.jvnet.jaxb2_commons.xml.bind.model.MAnyAttributePropertyInfo;
6+
import org.jvnet.jaxb2_commons.xml.bind.model.MAnyElementPropertyInfo;
7+
import org.jvnet.jaxb2_commons.xml.bind.model.MAttributePropertyInfo;
8+
import org.jvnet.jaxb2_commons.xml.bind.model.MElementPropertyInfo;
9+
import org.jvnet.jaxb2_commons.xml.bind.model.MElementRefPropertyInfo;
10+
import org.jvnet.jaxb2_commons.xml.bind.model.MElementRefsPropertyInfo;
11+
import org.jvnet.jaxb2_commons.xml.bind.model.MElementsPropertyInfo;
12+
import org.jvnet.jaxb2_commons.xml.bind.model.MPropertyInfoVisitor;
13+
import org.jvnet.jaxb2_commons.xml.bind.model.MValuePropertyInfo;
14+
15+
public class JsonSchemaPropertyInfoCompilerVisitor<T, C extends T> implements
16+
MPropertyInfoVisitor<T, C, JsonSchemaBuilder> {
17+
18+
private final JsonSchemaClassInfoCompiler<T, C> classInfoCompiler;
19+
20+
public JsonSchemaPropertyInfoCompilerVisitor(
21+
JsonSchemaClassInfoCompiler<T, C> classInfoCompiler) {
22+
Validate.notNull(classInfoCompiler);
23+
this.classInfoCompiler = classInfoCompiler;
24+
}
25+
26+
public JsonSchemaClassInfoCompiler<T, C> getClassInfoCompiler() {
27+
return classInfoCompiler;
28+
}
29+
30+
@Override
31+
public JsonSchemaBuilder visitElementPropertyInfo(
32+
MElementPropertyInfo<T, C> info) {
33+
throw new UnsupportedOperationException();
34+
}
35+
36+
@Override
37+
public JsonSchemaBuilder visitElementsPropertyInfo(
38+
MElementsPropertyInfo<T, C> info) {
39+
throw new UnsupportedOperationException();
40+
}
41+
42+
@Override
43+
public JsonSchemaBuilder visitAnyElementPropertyInfo(
44+
MAnyElementPropertyInfo<T, C> info) {
45+
throw new UnsupportedOperationException();
46+
}
47+
48+
@Override
49+
public JsonSchemaBuilder visitAttributePropertyInfo(
50+
MAttributePropertyInfo<T, C> info) {
51+
throw new UnsupportedOperationException();
52+
}
53+
54+
@Override
55+
public JsonSchemaBuilder visitAnyAttributePropertyInfo(
56+
MAnyAttributePropertyInfo<T, C> info) {
57+
throw new UnsupportedOperationException();
58+
}
59+
60+
@Override
61+
public JsonSchemaBuilder visitValuePropertyInfo(
62+
MValuePropertyInfo<T, C> info) {
63+
throw new UnsupportedOperationException();
64+
}
65+
66+
@Override
67+
public JsonSchemaBuilder visitElementRefPropertyInfo(
68+
MElementRefPropertyInfo<T, C> info) {
69+
throw new UnsupportedOperationException();
70+
}
71+
72+
@Override
73+
public JsonSchemaBuilder visitElementRefsPropertyInfo(
74+
MElementRefsPropertyInfo<T, C> info) {
75+
throw new UnsupportedOperationException();
76+
}
77+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package org.hisrc.jsonix.compilation.jsc;
2+
3+
import org.hisrc.jsonix.jsonschema.JsonSchemaBuilder;
4+
import org.jvnet.jaxb2_commons.xml.bind.model.MTypeInfo;
5+
6+
public class JsonSchemaRefTypeInfoCompiler<T, C extends T> implements
7+
JsonSchemaTypeInfoCompiler<MTypeInfo<T, C>, T, C> {
8+
9+
private final String $ref;
10+
11+
public JsonSchemaRefTypeInfoCompiler(String $ref) {
12+
this.$ref = $ref;
13+
}
14+
15+
@Override
16+
public JsonSchemaBuilder compile(MTypeInfo<T, C> typeInfo) {
17+
return new JsonSchemaBuilder().addRef($ref);
18+
}
19+
20+
}

0 commit comments

Comments
 (0)