Skip to content

Commit 2497ff9

Browse files
committed
Issue #7. Basic implementation, but no full/brief configuration yet.
1 parent 4f53229 commit 2497ff9

File tree

6 files changed

+211
-5
lines changed

6 files changed

+211
-5
lines changed

compiler/src/main/java/org/hisrc/jsonix/compilation/MappingCompiler.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333

3434
package org.hisrc.jsonix.compilation;
3535

36+
import java.util.Collection;
37+
3638
import javax.xml.namespace.QName;
3739

3840
import org.apache.commons.lang3.ObjectUtils;
@@ -44,6 +46,7 @@
4446
import org.hisrc.jscm.codemodel.expression.JSMemberExpression;
4547
import org.hisrc.jscm.codemodel.expression.JSObjectLiteral;
4648
import org.hisrc.jsonix.definition.Mapping;
49+
import org.hisrc.jsonix.definition.MappingDependency;
4750
import org.hisrc.jsonix.definition.Module;
4851
import org.hisrc.jsonix.definition.Modules;
4952
import org.hisrc.jsonix.definition.Output;
@@ -53,6 +56,7 @@
5356
import org.jvnet.jaxb2_commons.xml.bind.model.MElementInfo;
5457
import org.jvnet.jaxb2_commons.xml.bind.model.MEnumConstantInfo;
5558
import org.jvnet.jaxb2_commons.xml.bind.model.MEnumLeafInfo;
59+
import org.jvnet.jaxb2_commons.xml.bind.model.MPackageInfo;
5660
import org.jvnet.jaxb2_commons.xml.bind.model.MPropertyInfo;
5761
import org.jvnet.jaxb2_commons.xml.bind.model.MTypeInfo;
5862

@@ -126,6 +130,12 @@ public JSObjectLiteral compile() {
126130
codeModel.string(this.defaultAttributeNamespaceURI));
127131
}
128132

133+
final JSArrayLiteral dependencies = codeModel.array();
134+
compileDependencies(dependencies);
135+
if (!dependencies.getElements().isEmpty()) {
136+
mappingBody.append(naming.dependencies(), dependencies);
137+
}
138+
129139
final JSArrayLiteral typeInfos = codeModel.array();
130140
mappingBody.append(naming.typeInfos(), typeInfos);
131141

@@ -136,9 +146,24 @@ public JSObjectLiteral compile() {
136146
compileEnumLeafInfos(typeInfos);
137147
compileElementInfos(elementInfos);
138148

149+
139150
return mappingBody;
140151
}
141152

153+
private void compileDependencies(JSArrayLiteral dependencies) {
154+
final Collection<MappingDependency<T, C>> mappingDependencies = mapping
155+
.getDirectDependencies();
156+
for (final MappingDependency<T, C> mappingDependency : mappingDependencies) {
157+
final MPackageInfo dependencyPackageInfo = mappingDependency
158+
.getPackageInfo();
159+
final String dependencyPackageName = dependencyPackageInfo
160+
.getPackageName();
161+
final String dependencyMappingName = modules
162+
.getMappingName(dependencyPackageName);
163+
dependencies.append(getCodeModel().string(dependencyMappingName));
164+
}
165+
}
166+
142167
private void compileClassInfos(JSArrayLiteral typeInfos) {
143168
for (MClassInfo<T, C> classInfo : mapping.getClassInfos()) {
144169
typeInfos.append(compileClassInfo(classInfo));

compiler/src/main/java/org/hisrc/jsonix/definition/Mapping.java

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ public class Mapping<T, C extends T> {
4343
private final Collection<MPropertyInfo<T, C>> propertyInfos = new HashSet<MPropertyInfo<T, C>>();
4444
private final Collection<MEnumLeafInfo<T, C>> enumLeafInfos = new HashSet<MEnumLeafInfo<T, C>>();
4545
private final Collection<MElementInfo<T, C>> elementInfos = new HashSet<MElementInfo<T, C>>();
46+
private final Collection<InfoVertex<T, C>> infoVertices = new HashSet<InfoVertex<T, C>>();
4647
private final String packageName;
4748
private final String mappingName;
4849
private final String defaultElementNamespaceURI;
@@ -135,6 +136,40 @@ public void includeDependenciesOfMapping(Mapping<T, C> mapping) {
135136
}
136137
}
137138

139+
public Collection<MappingDependency<T, C>> getDirectDependencies() {
140+
final Map<MPackageInfo, MappingDependency<T, C>> dependencies = new HashMap<MPackageInfo, MappingDependency<T, C>>();
141+
final DirectedGraph<InfoVertex<T, C>, DependencyEdge> graph = analyzer
142+
.getGraph();
143+
final Collection<InfoVertex<T, C>> vertices = new HashSet<InfoVertex<T, C>>(
144+
getInfoVertices());
145+
for (InfoVertex<T, C> sourceVertex : vertices) {
146+
final Set<DependencyEdge> edges = graph
147+
.outgoingEdgesOf(sourceVertex);
148+
for (DependencyEdge edge : edges) {
149+
if (edge.getType() == DependencyType.HARD) {
150+
final InfoVertex<T, C> targetVertex = graph
151+
.getEdgeTarget(edge);
152+
final MPackageInfo packageInfo = targetVertex
153+
.getPackageInfo();
154+
// If this another package (not this package and not the
155+
// built-in package)
156+
if (packageInfo != null
157+
&& !this.packageInfo.equals(packageInfo)) {
158+
MappingDependency<T, C> dependency = dependencies
159+
.get(packageInfo);
160+
if (dependency == null) {
161+
dependency = new MappingDependency<T, C>(
162+
packageInfo);
163+
dependencies.put(packageInfo, dependency);
164+
}
165+
dependency.addInfoVertex(targetVertex);
166+
}
167+
}
168+
}
169+
}
170+
return dependencies.values();
171+
}
172+
138173
public void excludePropertyInfo(MPropertyInfo<T, C> propertyInfo) {
139174
Validate.notNull(propertyInfo);
140175
final PropertyInfoVertex<T, C> vertex = new PropertyInfoVertex<T, C>(
@@ -170,6 +205,7 @@ private void includeInfoVertex(final InfoVertex<T, C> initialVertex) {
170205
new LinkedList<InfoVertex<T, C>>());
171206
deques.put(ContainmentType.INCLUDED_AS_SOFT_DEPENDENCY,
172207
new LinkedList<InfoVertex<T, C>>());
208+
173209
deques.get(ContainmentType.INCLUDED_EXPLICITLY).add(initialVertex);
174210

175211
for (Map.Entry<ContainmentType, Deque<InfoVertex<T, C>>> dequeEntry : deques
@@ -195,7 +231,6 @@ private void includeInfoVertex(final InfoVertex<T, C> initialVertex) {
195231
currentSourceContainmentType,
196232
sourceContainmentType));
197233
} else {
198-
199234
logger.trace(MessageFormat
200235
.format("Including the vertex [{0}] with the containment type [{1}].",
201236
sourceVertex, dequeContainmentType));
@@ -360,20 +395,25 @@ private void addElementInfo(MElementInfo<T, C> elementInfo) {
360395
Validate.notNull(elementInfo);
361396
if (this.packageInfo.equals(elementInfo.getPackageInfo())) {
362397
this.elementInfos.add(elementInfo);
398+
this.infoVertices.add(new ElementInfoVertex<T, C>(elementInfo));
363399
}
364400
}
365401

366402
private void addClassInfo(MClassInfo<T, C> classInfo) {
367403
Validate.notNull(classInfo);
368404
if (this.packageInfo.equals(classInfo.getPackageInfo())) {
369405
this.classInfos.add(classInfo);
406+
this.infoVertices.add(new TypeInfoVertex<T, C>(classInfo
407+
.getPackageInfo(), classInfo));
370408
}
371409
}
372410

373411
private void addEnumLeafInfo(MEnumLeafInfo<T, C> enumLeafInfo) {
374412
Validate.notNull(enumLeafInfo);
375413
if (this.packageInfo.equals(enumLeafInfo.getPackageInfo())) {
376414
this.enumLeafInfos.add(enumLeafInfo);
415+
this.infoVertices.add(new TypeInfoVertex<T, C>(enumLeafInfo
416+
.getPackageInfo(), enumLeafInfo));
377417
}
378418
}
379419

@@ -382,9 +422,14 @@ private void addPropertyInfo(MPropertyInfo<T, C> propertyInfo) {
382422
if (this.packageInfo.equals(propertyInfo.getClassInfo()
383423
.getPackageInfo())) {
384424
this.propertyInfos.add(propertyInfo);
425+
this.infoVertices.add(new PropertyInfoVertex<T, C>(propertyInfo));
385426
}
386427
}
387428

429+
private Collection<InfoVertex<T, C>> getInfoVertices() {
430+
return infoVertices;
431+
}
432+
388433
public MPackageInfo getPackageInfo() {
389434
return packageInfo;
390435
}
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
package org.hisrc.jsonix.definition;
2+
3+
import java.util.Collection;
4+
import java.util.HashSet;
5+
6+
import org.apache.commons.lang3.Validate;
7+
import org.hisrc.jsonix.analysis.DefaultInfoVertexVisitor;
8+
import org.hisrc.jsonix.analysis.ElementInfoVertex;
9+
import org.hisrc.jsonix.analysis.InfoVertex;
10+
import org.hisrc.jsonix.analysis.InfoVertexVisitor;
11+
import org.hisrc.jsonix.analysis.PropertyInfoVertex;
12+
import org.hisrc.jsonix.analysis.TypeInfoVertex;
13+
import org.jvnet.jaxb2_commons.xml.bind.model.MClassInfo;
14+
import org.jvnet.jaxb2_commons.xml.bind.model.MElementInfo;
15+
import org.jvnet.jaxb2_commons.xml.bind.model.MEnumLeafInfo;
16+
import org.jvnet.jaxb2_commons.xml.bind.model.MPackageInfo;
17+
import org.jvnet.jaxb2_commons.xml.bind.model.MPropertyInfo;
18+
import org.jvnet.jaxb2_commons.xml.bind.model.MTypeInfo;
19+
import org.jvnet.jaxb2_commons.xml.bind.model.MTypeInfoVisitor;
20+
import org.jvnet.jaxb2_commons.xml.bind.model.util.DefaultTypeInfoVisitor;
21+
22+
public class MappingDependency<T, C extends T> {
23+
24+
private final MPackageInfo packageInfo;
25+
private final Collection<MClassInfo<T, C>> classInfos = new HashSet<MClassInfo<T, C>>();
26+
private final Collection<MPropertyInfo<T, C>> propertyInfos = new HashSet<MPropertyInfo<T, C>>();
27+
private final Collection<MEnumLeafInfo<T, C>> enumLeafInfos = new HashSet<MEnumLeafInfo<T, C>>();
28+
private final Collection<MElementInfo<T, C>> elementInfos = new HashSet<MElementInfo<T, C>>();
29+
30+
public MappingDependency(MPackageInfo packageInfo) {
31+
this.packageInfo = Validate.notNull(packageInfo);
32+
}
33+
34+
public MPackageInfo getPackageInfo() {
35+
return packageInfo;
36+
}
37+
38+
public Collection<MClassInfo<T, C>> getClassInfos() {
39+
return classInfos;
40+
}
41+
42+
public Collection<MElementInfo<T, C>> getElementInfos() {
43+
return elementInfos;
44+
}
45+
46+
public Collection<MEnumLeafInfo<T, C>> getEnumLeafInfos() {
47+
return enumLeafInfos;
48+
}
49+
50+
public Collection<MPropertyInfo<T, C>> getPropertyInfos() {
51+
return propertyInfos;
52+
}
53+
54+
private void addTypeInfo(MTypeInfo<T, C> typeInfo) {
55+
Validate.notNull(typeInfo);
56+
typeInfo.acceptTypeInfoVisitor(typeInfoAdder);
57+
}
58+
59+
private void addElementInfo(MElementInfo<T, C> elementInfo) {
60+
Validate.notNull(elementInfo);
61+
this.elementInfos.add(elementInfo);
62+
}
63+
64+
private void addClassInfo(MClassInfo<T, C> classInfo) {
65+
Validate.notNull(classInfo);
66+
Validate.isTrue(this.packageInfo.equals(classInfo.getPackageInfo()));
67+
this.classInfos.add(classInfo);
68+
}
69+
70+
private void addEnumLeafInfo(MEnumLeafInfo<T, C> enumLeafInfo) {
71+
Validate.notNull(enumLeafInfo);
72+
Validate.isTrue(this.packageInfo.equals(enumLeafInfo.getPackageInfo()));
73+
this.enumLeafInfos.add(enumLeafInfo);
74+
}
75+
76+
private void addPropertyInfo(MPropertyInfo<T, C> propertyInfo) {
77+
Validate.notNull(propertyInfo);
78+
Validate.isTrue(this.packageInfo.equals(propertyInfo.getClassInfo()
79+
.getPackageInfo()));
80+
this.propertyInfos.add(propertyInfo);
81+
}
82+
83+
public void addInfoVertex(InfoVertex<T, C> vertex) {
84+
Validate.notNull(vertex);
85+
vertex.accept(infoVertexAdder);
86+
}
87+
88+
private final InfoVertexVisitor<T, C, Void> infoVertexAdder = new DefaultInfoVertexVisitor<T, C, Void>() {
89+
90+
@Override
91+
public Void visitTypeInfoVertex(TypeInfoVertex<T, C> vertex) {
92+
addTypeInfo(vertex.getTypeInfo());
93+
return null;
94+
}
95+
96+
@Override
97+
public Void visitElementInfoVertex(ElementInfoVertex<T, C> vertex) {
98+
addElementInfo(vertex.getElementInfo());
99+
return null;
100+
}
101+
102+
@Override
103+
public Void visitPropertyInfoVertex(PropertyInfoVertex<T, C> vertex) {
104+
addPropertyInfo(vertex.getPropertyInfo());
105+
return null;
106+
}
107+
};
108+
109+
private final MTypeInfoVisitor<T, C, Void> typeInfoAdder = new DefaultTypeInfoVisitor<T, C, Void>() {
110+
111+
@Override
112+
public Void visitClassInfo(MClassInfo<T, C> info) {
113+
addClassInfo(info);
114+
return null;
115+
}
116+
117+
@Override
118+
public Void visitEnumLeafInfo(MEnumLeafInfo<T, C> info) {
119+
addEnumLeafInfo(info);
120+
return null;
121+
}
122+
};
123+
}

compiler/src/main/java/org/hisrc/jsonix/naming/CompactNaming.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public class CompactNaming implements Naming {
2121
public static final String SCOPE = "sc";
2222
public static final String SUBSTITUTION_HEAD = "sh";
2323
public static final String NAME = "n";
24+
public static final String DEPENDENCIES = "deps";
2425
public static final String DEFAULT_ELEMENT_NAMESPACE_URI = "dens";
2526
public static final String DEFAULT_ATTRIBUTE_NAMESPACE_URI = "dans";
2627
public static final String NAMESPACE_URI = "ns";
@@ -207,6 +208,11 @@ public String prefix() {
207208
public String localPart() {
208209
return LOCAL_PART;
209210
}
211+
212+
@Override
213+
public String dependencies() {
214+
return DEPENDENCIES;
215+
}
210216

211217
@Override
212218
public String defaultElementNamespaceURI() {

compiler/src/main/java/org/hisrc/jsonix/naming/Naming.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
public interface Naming {
44

55
String name();
6+
7+
String dependencies();
68

79
String defaultElementNamespaceURI();
810
String defaultAttributeNamespaceURI();

compiler/src/main/java/org/hisrc/jsonix/naming/StandardNaming.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
package org.hisrc.jsonix.naming;
22

3-
43
public class StandardNaming implements Naming {
5-
4+
65
public static final Naming INSTANCE = new StandardNaming();
76

87
public static final String TYPE = "type"; // t
@@ -18,8 +17,9 @@ public class StandardNaming implements Naming {
1817
public static final String SCOPE = "scope"; // sc
1918
public static final String SUBSTITUTION_HEAD = "substitutionHead"; // sh
2019
public static final String NAME = "name"; // n
21-
public static final String DEFAULT_ELEMENT_NAMESPACE_URI = "defaultElementNamespaceURI"; // ens
22-
public static final String DEFAULT_ATTRIBUTE_NAMESPACE_URI = "defaultAttributeNamespaceURI"; // ans
20+
public static final String DEPENDENCIES = "dependencies"; // deps
21+
public static final String DEFAULT_ELEMENT_NAMESPACE_URI = "defaultElementNamespaceURI"; // dens
22+
public static final String DEFAULT_ATTRIBUTE_NAMESPACE_URI = "defaultAttributeNamespaceURI"; // dans
2323
public static final String TYPE_INFOS = "typeInfos"; // tis
2424
public static final String ELEMENT_INFOS = "elementInfos"; // eis
2525
public static final String LOCAL_PART = "localPart"; // lp
@@ -205,6 +205,11 @@ public String localPart() {
205205
return LOCAL_PART;
206206
}
207207

208+
@Override
209+
public String dependencies() {
210+
return DEPENDENCIES;
211+
}
212+
208213
@Override
209214
public String defaultElementNamespaceURI() {
210215
return DEFAULT_ELEMENT_NAMESPACE_URI;

0 commit comments

Comments
 (0)