Skip to content

Commit b7c8503

Browse files
committed
Issue #23. Retrieving type name from the class.
1 parent efc779a commit b7c8503

File tree

43 files changed

+559
-6
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+559
-6
lines changed
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
package org.jvnet.jaxb2_commons.xml.bind.model.util;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
6+
import javax.xml.bind.annotation.XmlNs;
7+
import javax.xml.bind.annotation.XmlSchema;
8+
import javax.xml.bind.annotation.XmlType;
9+
import javax.xml.namespace.QName;
10+
11+
import org.jvnet.jaxb2_commons.lang.Validate;
12+
13+
import com.sun.xml.bind.api.impl.NameConverter;
14+
15+
public class XmlTypeUtils {
16+
17+
private XmlTypeUtils() {
18+
}
19+
20+
public static QName getTypeName(Class<?> targetClass) {
21+
Validate.notNull(targetClass);
22+
final Package targetPackage = targetClass.getPackage();
23+
final XmlType xmlTypeAnnotation = targetClass
24+
.getAnnotation(XmlType.class);
25+
26+
final String localPart;
27+
final String namespaceURI;
28+
final String prefix;
29+
30+
if (xmlTypeAnnotation == null) {
31+
localPart = NameConverter.standard.toVariableName(targetClass
32+
.getSimpleName());
33+
namespaceURI = getNamespace(targetPackage);
34+
} else {
35+
final String name = xmlTypeAnnotation.name();
36+
if (name == null || "".equals(name)) {
37+
localPart = null;
38+
} else {
39+
if ("##default".equals(name)) {
40+
localPart = NameConverter.standard
41+
.toVariableName(targetClass.getSimpleName());
42+
} else {
43+
localPart = name;
44+
}
45+
}
46+
47+
final String namespace = xmlTypeAnnotation.namespace();
48+
49+
if (namespace == null || "".equals(namespace)) {
50+
namespaceURI = "";
51+
} else {
52+
if ("##default".equals(namespace)) {
53+
namespaceURI = getNamespace(targetPackage);
54+
} else {
55+
namespaceURI = namespace;
56+
}
57+
}
58+
}
59+
60+
if (localPart == null) {
61+
return null;
62+
} else {
63+
prefix = getPrefix(targetPackage, namespaceURI);
64+
}
65+
66+
return prefix == null ? new QName(namespaceURI, localPart) : new QName(
67+
namespaceURI, localPart, prefix);
68+
}
69+
70+
private static String getPrefix(final Package targetPackage,
71+
String namespaceURI) {
72+
String prefix;
73+
final Map<String, String> namespacePrefixes = new HashMap<String, String>();
74+
if (targetPackage != null) {
75+
final XmlSchema xmlSchemaAnnotation = targetPackage
76+
.getAnnotation(XmlSchema.class);
77+
if (xmlSchemaAnnotation != null) {
78+
for (XmlNs xmlns : xmlSchemaAnnotation.xmlns()) {
79+
namespacePrefixes.put(xmlns.namespaceURI(), xmlns.prefix());
80+
}
81+
}
82+
}
83+
84+
prefix = namespacePrefixes.get(namespaceURI);
85+
return prefix;
86+
}
87+
88+
private static String getNamespace(final Package targetPackage) {
89+
String namespaceURI;
90+
if (targetPackage == null) {
91+
namespaceURI = "";
92+
} else {
93+
final XmlSchema xmlSchemaAnnotation = targetPackage
94+
.getAnnotation(XmlSchema.class);
95+
if (xmlSchemaAnnotation == null) {
96+
namespaceURI = "";
97+
} else {
98+
final String packageNamespace = xmlSchemaAnnotation.namespace();
99+
if (packageNamespace == null || "".equals(packageNamespace)) {
100+
namespaceURI = "";
101+
} else {
102+
namespaceURI = packageNamespace;
103+
}
104+
}
105+
}
106+
return namespaceURI;
107+
}
108+
}

runtime/src/main/java/org/jvnet/jaxb2_commons/xml/namespace/util/QNameUtils.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@
33
import javax.xml.XMLConstants;
44
import javax.xml.namespace.QName;
55

6-
import org.jvnet.jaxb2_commons.lang.Validate;
7-
86
public class QNameUtils {
97

108
private QNameUtils() {
119
}
1210

1311
public static String getKey(QName name) {
14-
Validate.notNull(name);
12+
if (name == null) {
13+
return null;
14+
}
1515
final StringBuilder sb = new StringBuilder();
1616
final String namespaceURI = name.getNamespaceURI();
1717
if (!namespaceURI.equals(XMLConstants.NULL_NS_URI)) {
Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
package org.jvnet.jaxb2_commons.xml.bind.model.util.tests;
2+
3+
import java.util.Arrays;
4+
import java.util.Collection;
5+
6+
import org.junit.Assert;
7+
import org.junit.Test;
8+
import org.junit.runner.RunWith;
9+
import org.junit.runners.Parameterized;
10+
import org.junit.runners.Parameterized.Parameters;
11+
import org.jvnet.jaxb2_commons.xml.bind.model.util.XmlTypeUtils;
12+
import org.jvnet.jaxb2_commons.xml.namespace.util.QNameUtils;
13+
14+
@RunWith(Parameterized.class)
15+
public class XmlTypeUtilsTest {
16+
17+
@Parameters
18+
public static Collection<Object[]> data() {
19+
return Arrays
20+
.asList(new Object[][] {
21+
//
22+
{
23+
"a1",
24+
org.jvnet.jaxb2_commons.xml.bind.model.util.tests.alpha.A1.class },
25+
{
26+
"a2",
27+
org.jvnet.jaxb2_commons.xml.bind.model.util.tests.alpha.A2.class },
28+
{
29+
"AThree",
30+
org.jvnet.jaxb2_commons.xml.bind.model.util.tests.alpha.A3.class },
31+
{
32+
"AFour",
33+
org.jvnet.jaxb2_commons.xml.bind.model.util.tests.alpha.A4.class },
34+
{
35+
"{urn:five}AFive",
36+
org.jvnet.jaxb2_commons.xml.bind.model.util.tests.alpha.A5.class },
37+
{
38+
"a6",
39+
org.jvnet.jaxb2_commons.xml.bind.model.util.tests.alpha.A6.class },
40+
{
41+
"{urn:seven}a7",
42+
org.jvnet.jaxb2_commons.xml.bind.model.util.tests.alpha.A7.class },
43+
{
44+
null,
45+
org.jvnet.jaxb2_commons.xml.bind.model.util.tests.alpha.A8.class },
46+
{
47+
"{urn:nine}ANine",
48+
org.jvnet.jaxb2_commons.xml.bind.model.util.tests.alpha.A9.class },
49+
{
50+
"a1",
51+
org.jvnet.jaxb2_commons.xml.bind.model.util.tests.beta.A1.class },
52+
{
53+
"a2",
54+
org.jvnet.jaxb2_commons.xml.bind.model.util.tests.beta.A2.class },
55+
{
56+
"AThree",
57+
org.jvnet.jaxb2_commons.xml.bind.model.util.tests.beta.A3.class },
58+
{
59+
"AFour",
60+
org.jvnet.jaxb2_commons.xml.bind.model.util.tests.beta.A4.class },
61+
{
62+
"{urn:five}AFive",
63+
org.jvnet.jaxb2_commons.xml.bind.model.util.tests.beta.A5.class },
64+
{
65+
"a6",
66+
org.jvnet.jaxb2_commons.xml.bind.model.util.tests.beta.A6.class },
67+
{
68+
"{urn:seven}a7",
69+
org.jvnet.jaxb2_commons.xml.bind.model.util.tests.beta.A7.class },
70+
{
71+
null,
72+
org.jvnet.jaxb2_commons.xml.bind.model.util.tests.beta.A8.class },
73+
{
74+
"{urn:nine}ANine",
75+
org.jvnet.jaxb2_commons.xml.bind.model.util.tests.beta.A9.class },
76+
{
77+
"{urn:gamma}a1",
78+
org.jvnet.jaxb2_commons.xml.bind.model.util.tests.gamma.A1.class },
79+
{
80+
"{urn:gamma}a2",
81+
org.jvnet.jaxb2_commons.xml.bind.model.util.tests.gamma.A2.class },
82+
{
83+
"{urn:gamma}AThree",
84+
org.jvnet.jaxb2_commons.xml.bind.model.util.tests.gamma.A3.class },
85+
{
86+
"AFour",
87+
org.jvnet.jaxb2_commons.xml.bind.model.util.tests.gamma.A4.class },
88+
{
89+
"{urn:five}AFive",
90+
org.jvnet.jaxb2_commons.xml.bind.model.util.tests.gamma.A5.class },
91+
{
92+
"a6",
93+
org.jvnet.jaxb2_commons.xml.bind.model.util.tests.gamma.A6.class },
94+
{
95+
"{urn:seven}a7",
96+
org.jvnet.jaxb2_commons.xml.bind.model.util.tests.gamma.A7.class },
97+
{
98+
null,
99+
org.jvnet.jaxb2_commons.xml.bind.model.util.tests.gamma.A8.class },
100+
{
101+
"{urn:nine}ANine",
102+
org.jvnet.jaxb2_commons.xml.bind.model.util.tests.gamma.A9.class },
103+
{
104+
"{urn:delta}a1",
105+
org.jvnet.jaxb2_commons.xml.bind.model.util.tests.delta.A1.class },
106+
{
107+
"{urn:delta}a2",
108+
org.jvnet.jaxb2_commons.xml.bind.model.util.tests.delta.A2.class },
109+
{
110+
"{urn:delta}AThree",
111+
org.jvnet.jaxb2_commons.xml.bind.model.util.tests.delta.A3.class },
112+
{
113+
"AFour",
114+
org.jvnet.jaxb2_commons.xml.bind.model.util.tests.delta.A4.class },
115+
{
116+
"{urn:five}five:AFive",
117+
org.jvnet.jaxb2_commons.xml.bind.model.util.tests.delta.A5.class },
118+
{
119+
"a6",
120+
org.jvnet.jaxb2_commons.xml.bind.model.util.tests.delta.A6.class },
121+
{
122+
"{urn:seven}a7",
123+
org.jvnet.jaxb2_commons.xml.bind.model.util.tests.delta.A7.class },
124+
{
125+
null,
126+
org.jvnet.jaxb2_commons.xml.bind.model.util.tests.delta.A8.class },
127+
{
128+
"{urn:nine}ANine",
129+
org.jvnet.jaxb2_commons.xml.bind.model.util.tests.delta.A9.class },
130+
131+
});
132+
}
133+
134+
private final String key;
135+
136+
private final Class<?> _class;
137+
138+
public XmlTypeUtilsTest(String key, Class<?> _class) {
139+
this.key = key;
140+
this._class = _class;
141+
}
142+
143+
@Test
144+
public void producesCorrectTypeName() {
145+
Assert.assertEquals(key,
146+
QNameUtils.getKey(XmlTypeUtils.getTypeName(_class)));
147+
148+
}
149+
150+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package org.jvnet.jaxb2_commons.xml.bind.model.util.tests.alpha;
2+
3+
public class A1 {
4+
5+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package org.jvnet.jaxb2_commons.xml.bind.model.util.tests.alpha;
2+
3+
import javax.xml.bind.annotation.XmlType;
4+
5+
@XmlType
6+
public class A2 {
7+
8+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package org.jvnet.jaxb2_commons.xml.bind.model.util.tests.alpha;
2+
3+
import javax.xml.bind.annotation.XmlType;
4+
5+
@XmlType(name="AThree")
6+
public class A3 {
7+
8+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package org.jvnet.jaxb2_commons.xml.bind.model.util.tests.alpha;
2+
3+
import javax.xml.bind.annotation.XmlType;
4+
5+
@XmlType(name="AFour", namespace="")
6+
public class A4 {
7+
8+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package org.jvnet.jaxb2_commons.xml.bind.model.util.tests.alpha;
2+
3+
import javax.xml.bind.annotation.XmlType;
4+
5+
@XmlType(name="AFive", namespace="urn:five")
6+
public class A5 {
7+
8+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package org.jvnet.jaxb2_commons.xml.bind.model.util.tests.alpha;
2+
3+
import javax.xml.bind.annotation.XmlType;
4+
5+
@XmlType(namespace="")
6+
public class A6 {
7+
8+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package org.jvnet.jaxb2_commons.xml.bind.model.util.tests.alpha;
2+
3+
import javax.xml.bind.annotation.XmlType;
4+
5+
@XmlType(namespace="urn:seven")
6+
public class A7 {
7+
8+
}

0 commit comments

Comments
 (0)