Skip to content

Commit 8c1d619

Browse files
committed
Issue #29.
1 parent a51250c commit 8c1d619

File tree

9 files changed

+213
-28
lines changed

9 files changed

+213
-28
lines changed

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

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import java.util.LinkedHashSet;
3838
import java.util.Set;
3939

40+
import javax.xml.XMLConstants;
4041
import javax.xml.namespace.QName;
4142

4243
import org.apache.commons.lang3.ObjectUtils;
@@ -68,6 +69,7 @@ public class MappingCompiler<T, C extends T> {
6869
private final JSCodeModel codeModel;
6970
public final String mappingName;
7071

72+
private final String targetNamespaceURI;
7173
private final String defaultElementNamespaceURI;
7274
private final String defaultAttributeNamespaceURI;
7375

@@ -87,6 +89,7 @@ public MappingCompiler(JSCodeModel codeModel, Modules<T, C> modules,
8789
this.modules = modules;
8890
this.mapping = mapping;
8991
this.mappingName = mapping.getMappingName();
92+
this.targetNamespaceURI = mapping.getTargetNamespaceURI();
9093
this.defaultElementNamespaceURI = mapping
9194
.getDefaultElementNamespaceURI();
9295
this.defaultAttributeNamespaceURI = mapping
@@ -122,6 +125,11 @@ public JSObjectLiteral compile() {
122125

123126
mappingBody.append(naming.name(), codeModel.string(this.mappingName));
124127

128+
if (!(this.targetNamespaceURI.equals(this.defaultElementNamespaceURI))) {
129+
mappingBody.append(naming.targetNamespaceURI(),
130+
codeModel.string(this.targetNamespaceURI));
131+
}
132+
125133
if (!StringUtils.isEmpty(this.defaultElementNamespaceURI)) {
126134
mappingBody.append(naming.defaultElementNamespaceURI(),
127135
codeModel.string(this.defaultElementNamespaceURI));
@@ -183,9 +191,39 @@ private void compileEnumLeafInfos(JSArrayLiteral typeInfos) {
183191

184192
private JSObjectLiteral compileClassInfo(MClassInfo<T, C> classInfo) {
185193
final JSObjectLiteral classInfoMapping = this.codeModel.object();
186-
classInfoMapping.append(naming.localName(), this.codeModel
187-
.string(classInfo
188-
.getContainerLocalName(DEFAULT_SCOPED_NAME_DELIMITER)));
194+
final String localName = classInfo
195+
.getContainerLocalName(DEFAULT_SCOPED_NAME_DELIMITER);
196+
classInfoMapping.append(naming.localName(),
197+
this.codeModel.string(localName));
198+
final String targetNamespace = mapping.getTargetNamespaceURI();
199+
final QName defaultTypeName = new QName(targetNamespace, localName);
200+
final QName typeName = classInfo.getTypeName();
201+
202+
if (!defaultTypeName.equals(typeName)) {
203+
final JSAssignmentExpression typeNameExpression;
204+
if (typeName == null) {
205+
typeNameExpression = getCodeModel()._null();
206+
} else if (defaultTypeName.getNamespaceURI().equals(
207+
typeName.getNamespaceURI())) {
208+
typeNameExpression = getCodeModel().string(
209+
typeName.getLocalPart());
210+
} else {
211+
final JSObjectLiteral typeNameObject = getCodeModel().object();
212+
typeNameObject.append(naming.namespaceURI(), getCodeModel()
213+
.string(typeName.getNamespaceURI()));
214+
typeNameObject.append(naming.localPart(), getCodeModel()
215+
.string(typeName.getLocalPart()));
216+
if (!XMLConstants.DEFAULT_NS_PREFIX
217+
.equals(typeName.getPrefix())) {
218+
typeNameObject.append(naming.prefix(), getCodeModel()
219+
.string(typeName.getPrefix()));
220+
}
221+
typeNameExpression = typeNameObject;
222+
}
223+
classInfoMapping.append(naming.typeName(), typeNameExpression);
224+
225+
}
226+
189227
final MClassTypeInfo<T, C> baseTypeInfo = classInfo.getBaseTypeInfo();
190228
if (baseTypeInfo != null) {
191229
classInfoMapping.append(naming.baseTypeInfo(),

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

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ public class MappingConfiguration {
3030
private String id;
3131
private String name;
3232
private String _package;
33+
private String targetNamespaceURI;
3334
private String defaultElementNamespaceURI;
3435
private String defaultAttributeNamespaceURI;
3536
private IncludesConfiguration includesConfiguration;
@@ -67,6 +68,15 @@ public void setPackage(String _package) {
6768
this._package = _package;
6869
}
6970

71+
@XmlAttribute(name = "targetNamespace")
72+
public String getTargetNamespaceURI() {
73+
return targetNamespaceURI;
74+
}
75+
76+
public void setTargetNamespaceURI(String targetNamespaceURI) {
77+
this.targetNamespaceURI = targetNamespaceURI;
78+
}
79+
7080
@XmlAttribute(name = "defaultElementNamespaceURI")
7181
public String getDefaultElementNamespaceURI() {
7282
return defaultElementNamespaceURI;
@@ -132,16 +142,22 @@ public <T, C extends T> Mapping<T, C> build(JsonixContext context,
132142
final String mostUsedElementNamespaceURI = draftMostUsedElementNamespaceURI == null ? ""
133143
: draftMostUsedElementNamespaceURI;
134144

135-
final String defaultElementNamespaceURI;
136-
if (this.defaultElementNamespaceURI != null) {
137-
defaultElementNamespaceURI = this.defaultElementNamespaceURI;
145+
final String targetNamespaceURI;
146+
if (this.targetNamespaceURI != null) {
147+
targetNamespaceURI = this.targetNamespaceURI;
138148
} else {
139149
logger.debug(MessageFormat
140-
.format("Mapping [{0}] will use \"{1}\" as it is the most used element namespace URI in the package [{2}].",
150+
.format("Mapping [{0}] will use \"{1}\" as the target namespace as it is the most used element namespace URI in the package [{2}].",
141151
mappingName, mostUsedElementNamespaceURI,
142152
packageName));
143-
defaultElementNamespaceURI = mostUsedElementNamespaceURI;
153+
targetNamespaceURI = mostUsedElementNamespaceURI;
154+
}
144155

156+
final String defaultElementNamespaceURI;
157+
if (this.defaultElementNamespaceURI != null) {
158+
defaultElementNamespaceURI = this.defaultElementNamespaceURI;
159+
} else {
160+
defaultElementNamespaceURI = targetNamespaceURI;
145161
}
146162

147163
final String draftMostUsedAttributeNamespaceURI = qnameAnalyzer
@@ -158,12 +174,11 @@ public <T, C extends T> Mapping<T, C> build(JsonixContext context,
158174
mappingName, mostUsedAttributeNamespaceURI,
159175
packageName));
160176
defaultAttributeNamespaceURI = mostUsedAttributeNamespaceURI;
161-
162177
}
163178

164179
final Mapping<T, C> mapping = new Mapping<T, C>(context, analyzer,
165-
packageInfo, mappingName, defaultElementNamespaceURI,
166-
defaultAttributeNamespaceURI);
180+
packageInfo, mappingName, targetNamespaceURI,
181+
defaultElementNamespaceURI, defaultAttributeNamespaceURI);
167182

168183
if (getExcludesConfiguration() != null) {
169184
final ExcludesConfiguration excludesConfiguration = getExcludesConfiguration();

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,16 @@ public class Mapping<T, C extends T> {
4646
private final Collection<InfoVertex<T, C>> infoVertices = new HashSet<InfoVertex<T, C>>();
4747
private final String packageName;
4848
private final String mappingName;
49+
private final String targetNamespaceURI;
4950
private final String defaultElementNamespaceURI;
5051
private final String defaultAttributeNamespaceURI;
5152
private final Map<InfoVertex<T, C>, ContainmentType> verticesContainmentMap = new HashMap<InfoVertex<T, C>, ContainmentType>();
5253

5354
public Mapping(JsonixContext context,
5455
ModelInfoGraphAnalyzer<T, C> analyzer, MPackageInfo packageInfo,
55-
String mappingName, String defaultElementNamespaceURI,
56+
String mappingName,
57+
String targetNamespaceURI,
58+
String defaultElementNamespaceURI,
5659
String defaultAttributeNamespaceURI) {
5760
this.logger = Validate.notNull(context).getLoggerFactory()
5861
.getLogger(Mapping.class.getName());
@@ -65,6 +68,7 @@ public Mapping(JsonixContext context,
6568
this.packageInfo = packageInfo;
6669
this.packageName = packageInfo.getPackageName();
6770
this.mappingName = mappingName;
71+
this.targetNamespaceURI = targetNamespaceURI;
6872
this.defaultElementNamespaceURI = defaultElementNamespaceURI;
6973
this.defaultAttributeNamespaceURI = defaultAttributeNamespaceURI;
7074
}
@@ -442,6 +446,10 @@ public String getMappingName() {
442446
return mappingName;
443447
}
444448

449+
public String getTargetNamespaceURI() {
450+
return targetNamespaceURI;
451+
}
452+
445453
public String getDefaultElementNamespaceURI() {
446454
return defaultElementNamespaceURI;
447455
}

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

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package org.hisrc.jsonix.naming;
22

3-
43
public class CompactNaming implements Naming {
54

65
public static final Naming INSTANCE = new CompactNaming();
@@ -15,13 +14,15 @@ public class CompactNaming implements Naming {
1514
public static final String ELEMENT_NAME = "en";
1615
public static final String ATTRIBUTE_NAME = "an";
1716
public static final String LOCAL_NAME = "ln";
17+
public static final String TYPE_NAME = "tn";
1818
public static final String LOCAL_PART = "lp";
1919
public static final String BASE_TYPE_INFO = "bti";
2020
public static final String PROPERTY_INFOS = "ps";
2121
public static final String SCOPE = "sc";
2222
public static final String SUBSTITUTION_HEAD = "sh";
2323
public static final String NAME = "n";
2424
public static final String DEPENDENCIES = "deps";
25+
public static final String TARGET_NAMESPACE_URI = "tns";
2526
public static final String DEFAULT_ELEMENT_NAMESPACE_URI = "dens";
2627
public static final String DEFAULT_ATTRIBUTE_NAMESPACE_URI = "dans";
2728
public static final String NAMESPACE_URI = "ns";
@@ -73,6 +74,11 @@ public String localName() {
7374
return LOCAL_NAME;
7475
}
7576

77+
@Override
78+
public String typeName() {
79+
return TYPE_NAME;
80+
}
81+
7682
@Override
7783
public String classInfo() {
7884
return CLASS_INFO;
@@ -194,6 +200,7 @@ public String elementTypeInfos() {
194200
public String value() {
195201
return VALUE;
196202
}
203+
197204
@Override
198205
public String namespaceURI() {
199206
return NAMESPACE_URI;
@@ -208,12 +215,17 @@ public String prefix() {
208215
public String localPart() {
209216
return LOCAL_PART;
210217
}
211-
218+
212219
@Override
213220
public String dependencies() {
214221
return DEPENDENCIES;
215222
}
216223

224+
@Override
225+
public String targetNamespaceURI() {
226+
return TARGET_NAMESPACE_URI;
227+
}
228+
217229
@Override
218230
public String defaultElementNamespaceURI() {
219231
return DEFAULT_ELEMENT_NAMESPACE_URI;
Lines changed: 38 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,89 @@
11
package org.hisrc.jsonix.naming;
22

33
public interface Naming {
4-
4+
55
String name();
6-
6+
77
String dependencies();
88

9+
String targetNamespaceURI();
10+
911
String defaultElementNamespaceURI();
12+
1013
String defaultAttributeNamespaceURI();
1114

1215
String elementInfos();
16+
1317
String typeInfos();
1418

15-
1619
String type();
20+
1721
//
1822
String typeInfo();
23+
1924
String list();
20-
25+
2126
//
2227
String localName();
23-
24-
28+
29+
//
30+
String typeName();
31+
2532
// classInfo properties
2633
String classInfo();
34+
2735
String baseTypeInfo();
36+
2837
String propertyInfos();
29-
38+
3039
// enumInfo properties
3140
String enumInfo();
41+
3242
String values();
33-
34-
43+
3544
// elementInfo properties
3645
String elementName();
46+
3747
String scope();
48+
3849
String substitutionHead();
39-
50+
4051
// propertyInfo properties
4152
String collection();
53+
4254
String wrapperElementName();
55+
4356
String allowDom();
57+
4458
String allowTypedObject();
59+
4560
String mixed();
61+
4662
String attributeName();
63+
4764
String elementTypeInfos();
48-
65+
4966
// types of property Infos
5067
String element();
68+
5169
String elements();
70+
5271
String elementRef();
72+
5373
String elementRefs();
74+
5475
String anyElement();
76+
5577
String attribute();
78+
5679
String anyAttribute();
80+
5781
String value();
58-
82+
5983
String namespaceURI();
84+
6085
String prefix();
86+
6187
String localPart();
62-
6388

6489
}

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ public class StandardNaming implements Naming {
99
public static final String LIST = "list"; // li
1010
public static final String CLASS_INFO = "classInfo"; // ci
1111
public static final String LOCAL_NAME = "localName"; // ln
12+
public static final String TYPE_NAME = "typeName"; // tn
1213
public static final String BASE_TYPE_INFO = "baseTypeInfo"; // base
1314
public static final String PROPERTY_INFOS = "propertyInfos"; // ps
1415
public static final String ENUM_INFO = "enumInfo"; // ei
@@ -18,6 +19,7 @@ public class StandardNaming implements Naming {
1819
public static final String SUBSTITUTION_HEAD = "substitutionHead"; // sh
1920
public static final String NAME = "name"; // n
2021
public static final String DEPENDENCIES = "dependencies"; // deps
22+
public static final String TARGET_NAMESPACE_URI = "targetNamespace"; // dens
2123
public static final String DEFAULT_ELEMENT_NAMESPACE_URI = "defaultElementNamespaceURI"; // dens
2224
public static final String DEFAULT_ATTRIBUTE_NAMESPACE_URI = "defaultAttributeNamespaceURI"; // dans
2325
public static final String TYPE_INFOS = "typeInfos"; // tis
@@ -66,6 +68,11 @@ public String list() {
6668
public String localName() {
6769
return LOCAL_NAME;
6870
}
71+
72+
@Override
73+
public String typeName() {
74+
return TYPE_NAME;
75+
}
6976

7077
// classInfo properties
7178
@Override
@@ -209,6 +216,11 @@ public String localPart() {
209216
public String dependencies() {
210217
return DEPENDENCIES;
211218
}
219+
220+
@Override
221+
public String targetNamespaceURI() {
222+
return TARGET_NAMESPACE_URI;
223+
}
212224

213225
@Override
214226
public String defaultElementNamespaceURI() {

0 commit comments

Comments
 (0)