Skip to content

Commit 338ae6d

Browse files
hansonrhansonr
authored andcommitted
JAXB XMLEnumValue for attributes
1 parent 7720a45 commit 338ae6d

File tree

6 files changed

+115
-88
lines changed

6 files changed

+115
-88
lines changed
-3.77 MB
Binary file not shown.

sources/net.sf.j2s.java.core/src/swingjs/xml/JSJAXBClass.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,4 +251,22 @@ public Object getJavaObject() {
251251
return javaObject;
252252
}
253253

254+
public void initEnum(String data) {
255+
enumClassType = data;
256+
isEnum = true;
257+
enumMap = new Hashtable<Object, Object>();
258+
}
259+
260+
static boolean hasAnnotations(Object value) {
261+
if (value == null)
262+
return false;
263+
try {
264+
// Date does not have a class?
265+
Class<?> cl = value.getClass();
266+
return (/** @j2sNative (value.$clazz$ ? !!value.$clazz$.__ANN__ : cl.$clazz$ ? !!cl.$clazz$.__ANN__ : 0) || */false);
267+
} catch (Throwable t) {
268+
return false;
269+
}
270+
}
271+
254272
}

sources/net.sf.j2s.java.core/src/swingjs/xml/JSJAXBField.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,6 @@ void setNode(DOMNode node) {
9696
boolean isArray;
9797
boolean isByteArray;
9898
boolean isContainer;
99-
boolean isEnum;
100-
boolean isEnumValue;
10199

102100
QName qualifiedName = new QName("", "##default", "");
103101
QName qualifiedWrapName;
@@ -106,6 +104,7 @@ void setNode(DOMNode node) {
106104
String xmlSchemaType;
107105
String typeAdapter;
108106
String mimeType;
107+
String enumValue;
109108

110109
private Object methodSet;
111110
private Object methodGet;
@@ -137,6 +136,7 @@ void setNode(DOMNode node) {
137136

138137
private Object[][] adata;
139138

139+
140140
/**
141141
* @param jclass
142142
* @param adata
@@ -298,9 +298,7 @@ else if (data.indexOf("PROPERTY") >= 0)
298298
jaxbClass.seeAlso = getSeeAlso(data);
299299
return;
300300
case "@XmlEnum":
301-
jaxbClass.enumClassType = data;
302-
jaxbClass.isEnum = true;
303-
jaxbClass.enumMap = new Hashtable<Object, Object>();
301+
jaxbClass.initEnum(data);
304302
return;
305303
}
306304
System.out.println("JSJAXBField Unprocessed type annotation: " + text);
@@ -356,10 +354,10 @@ private void processFieldAnnotation(JSJAXBClass jaxbClass, String tag, String da
356354
isXmlValue = true;
357355
return;
358356
case "@XmlEnumValue":
359-
data = PT.trim(data, "\"");
357+
enumValue = data = PT.trim(data, "\"");
360358
jaxbClass.enumMap.put("/" + javaName, data); // for marshaller
359+
jaxbClass.enumMap.put("//" + data, javaName); // for unmarshaller
361360
jaxbClass.enumMap.put(data, this); // for unmarshaller
362-
isEnumValue = true;
363361
return;
364362
case "@XmlList":
365363
asList = true;
@@ -597,6 +595,9 @@ public Object getValue(Object javaObject) {
597595

598596
@SuppressWarnings("unused")
599597
public Object getObject(Object javaObject) {
598+
if (enumValue != null) {
599+
return enumValue;
600+
}
600601
String n = javaName;
601602
Object m = (isMethod ? methodGet : null);
602603

sources/net.sf.j2s.java.core/src/swingjs/xml/JSJAXBMarshaller.java

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ private void addFieldListable(JSJAXBField field, Object value, boolean addXsiTyp
262262
writeField(field, null, addXsiType);
263263
return;
264264
}
265-
if (needsMarshalling(value)) {
265+
if (!field.isAttribute && JSJAXBClass.hasAnnotations(value)) {
266266
doMarshal(value.getClass(), value, this.javaObject, field, addXsiType);
267267
return;
268268
}
@@ -277,18 +277,6 @@ private void addFieldListable(JSJAXBField field, Object value, boolean addXsiTyp
277277
}
278278
}
279279

280-
static boolean needsMarshalling(Object value) {
281-
if (value == null)
282-
return false;
283-
try {
284-
// Date does not have a class?
285-
Class<?> cl = value.getClass();
286-
return (/** @j2sNative (cl.$clazz$ ? !!cl.$clazz$.__ANN__ : 0) || */false);
287-
} catch (Throwable t) {
288-
return false;
289-
}
290-
}
291-
292280
private void writeField(JSJAXBField field, Object value, boolean addXsiType) throws JAXBException {
293281
if (field.isAttribute) {
294282
writeAttribute(field, value);
@@ -354,6 +342,15 @@ private void writeAttribute(JSJAXBField field, Object value) throws JAXBExceptio
354342
// null attributes are not allowed
355343
if (value == null)
356344
return;
345+
if (value.getClass().isEnum()) {
346+
JSJAXBClass jjc = new JSJAXBClass(value.getClass(), null, false, true);
347+
if (jjc.enumMap != null) {
348+
Object o = jjc.enumMap.get("/" + value.toString());
349+
if (o != null)
350+
value = o;
351+
}
352+
}
353+
357354
addNameSpaceIfNeeded(field.qualifiedName, false);
358355
output(" " + getXMLQname(field.qualifiedName, true) + "=\"");
359356
writeValue(field, value);

0 commit comments

Comments
 (0)