Skip to content

Commit 6489372

Browse files
hansonrhansonr
authored andcommitted
JAXB marshaller fix
1 parent 6384bdf commit 6489372

File tree

8 files changed

+75
-48
lines changed

8 files changed

+75
-48
lines changed

sources/net.sf.j2s.core/src/net/sf/j2s/core/Java2ScriptVisitor.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6179,10 +6179,11 @@ protected ClassAnnotation(String qName, Annotation annotation, BodyDeclaration n
61796179
@SuppressWarnings("unchecked")
61806180
public static void addClassAnnotations(int accessType, List<ClassAnnotation> class_annotations, List<FieldDeclaration> fields,
61816181
List<IMethodBinding> methods, TrailingBuffer trailingBuffer) {
6182+
61826183
int pt = 0, ptBuf = 0;
61836184
ASTNode lastNode = null;
61846185
List<?> fragments = null;
6185-
boolean allowImplicit = true;
6186+
String propOrder = null;
61866187
for (int i = 0; i < class_annotations.size(); i++) {
61876188
ClassAnnotation a = class_annotations.get(i);
61886189
String str = a.annotation.toString();
@@ -6204,7 +6205,7 @@ public static void addClassAnnotations(int accessType, List<ClassAnnotation> cla
62046205
str += sep;
62056206
e = (Expression) expressions.get(j);
62066207
if (e instanceof TypeLiteral) {
6207-
str += ((TypeLiteral) e).getType().resolveBinding().getQualifiedName() + ".class";
6208+
str += "\""+((TypeLiteral) e).getType().resolveBinding().getQualifiedName() + ".class\"";
62086209
} else {
62096210
str += e.toString();
62106211
}
@@ -6224,7 +6225,7 @@ public static void addClassAnnotations(int accessType, List<ClassAnnotation> cla
62246225
fragments = null;
62256226
if (a.node instanceof EnumDeclaration) {
62266227
type = ((EnumDeclaration) a.node).resolveBinding();
6227-
allowImplicit = false;
6228+
propOrder = "XX";
62286229
} else if (a.node instanceof TypeDeclaration) {
62296230
type = ((TypeDeclaration) a.node).resolveBinding();
62306231
} else if (a.node instanceof FieldDeclaration) {
@@ -6263,13 +6264,12 @@ public static void addClassAnnotations(int accessType, List<ClassAnnotation> cla
62636264
trailingBuffer.append(",'" + className + "'],[");
62646265
}
62656266
trailingBuffer.append("'" + str + "'");
6266-
if (allowImplicit && str.indexOf("propOrder=") >= 0)
6267-
allowImplicit = false;
6267+
if (propOrder == null && str.indexOf("propOrder=") >= 0)
6268+
propOrder = str;
62686269
}
62696270
if (pt > 0) {
62706271
addTrailingFragments(fragments, trailingBuffer, ptBuf);
6271-
if (allowImplicit)
6272-
addImplicitJAXBFieldsAndMethods(accessType, trailingBuffer, fields, methods);
6272+
addImplicitJAXBFieldsAndMethods(accessType, trailingBuffer, fields, methods, propOrder);
62736273
trailingBuffer.append("]]];\n");
62746274
}
62756275
}
@@ -6286,7 +6286,7 @@ private static IMethodBinding getJAXBGetMethod(IMethodBinding var, List<IMethodB
62866286
}
62876287

62886288
private static void addImplicitJAXBFieldsAndMethods(int accessType, TrailingBuffer trailingBuffer,
6289-
List<FieldDeclaration> fields, List<IMethodBinding> methods) {
6289+
List<FieldDeclaration> fields, List<IMethodBinding> methods, String propOrder) {
62906290
if (accessType == JAXB_TYPE_NONE)
62916291
return;
62926292
boolean publicOnly = (accessType == JAXB_TYPE_PUBLIC_MEMBER);
@@ -6300,6 +6300,10 @@ private static void addImplicitJAXBFieldsAndMethods(int accessType, TrailingBuff
63006300
VariableDeclarationFragment identifier = (VariableDeclarationFragment) fragments.get(i);
63016301
IVariableBinding var = identifier.resolveBinding();
63026302
String varName = var.getName();
6303+
// If propOrder is defined, then we are only allowed to
6304+
// add implicit fields that are in that propOrder
6305+
if (propOrder != null && propOrder.indexOf("\"" + varName + "\"") < 0)
6306+
continue;
63036307
ITypeBinding type = var.getType();
63046308
addAnnotation(type, varName, "@XmlElement", trailingBuffer);
63056309
}

sources/net.sf.j2s.java.core/src/javax/xml/bind/helpers/AbstractMarshallerImpl.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -129,21 +129,18 @@ public void marshal(Object jaxbElement, File output) throws JAXBException {
129129

130130
public final void marshal( Object obj, java.io.Writer w )
131131
throws JAXBException {
132-
JSUtil.notImplemented("marshal Contenthandler");
133132
checkNotNull( obj, "obj", w, "writer" );
134133
marshal( obj, new StreamResult(w) );
135134
}
136135

137136
public final void marshal( Object obj, org.xml.sax.ContentHandler handler )
138137
throws JAXBException {
139-
JSUtil.notImplemented("marshal Contenthandler");
140138
checkNotNull( obj, "obj", handler, "handler" );
141139
marshal( obj, new SAXResult(handler) );
142140
}
143141

144142
public final void marshal( Object obj, org.w3c.dom.Node node )
145143
throws JAXBException {
146-
JSUtil.notImplemented("marshal Contenthandler");
147144
checkNotNull( obj, "obj", node, "node" );
148145
marshal( obj, new DOMResult(node) );
149146
}

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

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ class JSJAXBClass {
7070
String defaultNamespace;
7171
String[] seeAlso;
7272
final Map<String, JSJAXBField> unmarshallerFieldMap = new Hashtable<String, JSJAXBField>();
73+
private Class<?> javaClass;
7374

7475
private final static Map<String, String> marshallerNamespacePrefixes = new Hashtable<String, String>();
7576
private final static Map<String, XmlAdapter> adapterMap = new HashMap<String, XmlAdapter>();
@@ -82,6 +83,7 @@ static void clearStatics() {
8283

8384
JSJAXBClass(Class<?> javaClass, Object javaObject, boolean isXmlIDREF, boolean isMarshaller) {
8485
this.isMarshaller = isMarshaller;
86+
this.javaClass = javaClass;
8587
checkC$__ANN__(this, javaClass, javaObject, isXmlIDREF);
8688
this.isXmlIDREF = isXmlIDREF;
8789
}
@@ -96,6 +98,7 @@ static void clearStatics() {
9698
@SuppressWarnings("unused")
9799
static boolean checkC$__ANN__(JSJAXBClass jsjaxbClass, Class<?> javaClass, Object javaObject, boolean isXmlIDREF) {
98100
boolean isTop = true;
101+
JSJAXBClass top = jsjaxbClass;
99102
while (javaClass != null) {
100103

101104
// C$.__ANN__ = [[null,'XmlAccessorType',['@XmlAccessorType(XmlAccessType.FIELD)','@XmlType(name="MoreComplex")']],
@@ -112,40 +115,44 @@ static void clearStatics() {
112115
if (!isTop) {
113116
className = null;
114117
}
115-
isTop = false;
116118
if (jsdata != null) {
117119
if (jsjaxbClass == null)
118120
return true;
119121
jsjaxbClass.addTypeData(jsdata, clazz, javaObject);
122+
if (!isTop) {
123+
for (int i = 1, n = jsjaxbClass.fields.size(); i < n; i++)
124+
top.addField(jsjaxbClass.fields.get(i));
125+
}
120126
}
127+
isTop = false;
121128
javaClass = javaClass.getSuperclass();
122129
}
123130
return false;
124131
}
125132

126133
JSJAXBClass addTypeData(Object[][][] jsdata, Object clazz, Object javaObject) {
127134
int n = (javaObject == null ? 1 : jsdata.length);
128-
for (int i = 0; i < n; i++) {
135+
for (int i = fields.size() == 0 ? 0 : 1; i < n; i++) {
129136
JSJAXBField field = new JSJAXBField(this, jsdata[i], clazz, javaObject, fields.size(), propOrder);
130137
addField(field);
131138
}
132-
if (isMarshaller)
133-
processPropOrder(javaObject);
139+
// if (isMarshaller)
140+
// processPropOrder(javaObject);
134141
return this;
135142
}
136143

137-
private void processPropOrder(Object javaObject) {
138-
for (int i = propOrder.size(); --i >= 0;) {
139-
String prop = propOrder.get(i);
140-
JSJAXBField field = fieldMap.get(prop);
141-
// annotations may only show up in @XmlType:propOrder
142-
if (field == null) {
143-
addField(new JSJAXBField(this,
144-
new Object[][] { new Object[] { prop, null, null, null }, new Object[] { "@XmlElement" } },
145-
null, javaObject, fields.size(), null));
146-
}
147-
}
148-
}
144+
// private void processPropOrder(Object javaObject) {
145+
// for (int i = propOrder.size(); --i >= 0;) {
146+
// String prop = propOrder.get(i);
147+
// JSJAXBField field = fieldMap.get(prop);
148+
// // annotations may only show up in @XmlType:propOrder
149+
// if (field == null) {
150+
// addField(new JSJAXBField(this,
151+
// new Object[][] { new Object[] { prop, null, null, null }, new Object[] { "@XmlElement" } },
152+
// null, javaObject, fields.size(), null));
153+
// }
154+
// }
155+
// }
149156

150157
private void addField(JSJAXBField field) {
151158
fields.add(field);

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,8 @@ void setNode(DOMNode node) {
134134

135135
private Object clazz;
136136

137+
private Object[][] adata;
138+
137139
/**
138140
* @param jclass
139141
* @param adata
@@ -146,6 +148,7 @@ void setNode(DOMNode node) {
146148
this.javaObject = javaObject;
147149
this.clazz = clazz;
148150
this.index = index;
151+
this.adata = adata;
149152
javaName = (String) adata[0][0];
150153
isMethod = (javaName != null && javaName.charAt(1) == ':');
151154
javaClassName = (String) adata[0][1];

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

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,21 +38,15 @@ public class JSJAXBMarshaller extends AbstractMarshallerImpl {
3838
private OutputStream outputStream;
3939
private JAXBContext context;
4040
private StreamResult result;
41-
private JAXBElement<?> jaxbElement;
4241

4342
public JSJAXBMarshaller(JAXBContext context) {
4443
this.context = context;
4544
}
4645

4746
@Override
4847
public void marshal(Object jaxbElement, Result result) throws JAXBException {
49-
Object javaObject;
50-
if (jaxbElement instanceof JAXBElement) {
51-
jaxbElement = (JAXBElement<?>) jaxbElement;
52-
javaObject = this.jaxbElement.getValue();
53-
} else {
54-
javaObject = jaxbElement;
55-
}
48+
Object javaObject = (jaxbElement instanceof JAXBElement
49+
? ((JAXBElement<?>) jaxbElement).getValue() : jaxbElement);
5650
this.result = (StreamResult) result;
5751
this.writer = this.result.getWriter();
5852
this.outputStream = this.result.getOutputStream();
@@ -238,7 +232,11 @@ private void addFields(JSJAXBClass jaxbClass, boolean isAttribute) throws JAXBEx
238232
addField(field);
239233
} else {
240234
for (int i = 0, n = jaxbClass.propOrder.size(); i < n; i++) {
241-
field = getField(jaxbClass, jaxbClass.propOrder.get(i));
235+
String name = jaxbClass.propOrder.get(i);
236+
field = getField(jaxbClass, name);
237+
if (field == null) {
238+
/**@j2sNative debugger */
239+
}
242240
if (!field.isAttribute)
243241
addField(field);
244242
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
//
2+
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802
3+
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
4+
// Any modifications to this file will be lost upon recompilation of the source schema.
5+
// Generated on: 2018.09.28 at 12:18:54 PM BST
6+
//
7+
8+
9+
package test.jaxb;
10+
11+
import java.util.List;
12+
13+
import javax.xml.bind.annotation.XmlAccessType;
14+
import javax.xml.bind.annotation.XmlAccessorType;
15+
import javax.xml.bind.annotation.XmlRootElement;
16+
import javax.xml.bind.annotation.XmlType;
17+
18+
@XmlAccessorType(XmlAccessType.FIELD)
19+
@XmlType(name = "", propOrder = {"a"})
20+
@XmlRootElement(name = "Annotation")
21+
public class Annotation {
22+
23+
protected List<Object> a;
24+
25+
}

sources/net.sf.j2s.java.core/src/test/jaxb/Root_FIELD.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
// "c",
2828
// "publ"
2929
// })
30-
public class Root_FIELD {
30+
public class Root_FIELD extends ROOT {
3131

3232
public static boolean isCopy = false;
3333

sources/net.sf.j2s.java.core/src/test/jaxb/Root_ORDERED.java

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
@XmlSeeAlso({test.jaxb2.Obj.class, test.jaxb.Obj.class})
3131
@XmlRootElement(name="RootOrdered",namespace="www.jalview.org")
3232
@XmlAccessorType(XmlAccessType.FIELD)
33-
@XmlType(propOrder = {
33+
@XmlType(propOrder = {
3434
"type",
3535
"cx",
3636
"list0",
@@ -84,28 +84,20 @@ public Root_ORDERED(String name) {
8484

8585
}
8686

87-
@XmlElement
8887
List<Object> list0;
8988

90-
@XmlElement
9189
BigInteger bi;
9290

93-
@XmlElement
9491
BigDecimal bd = new BigDecimal("123.456");
9592

96-
@XmlElement
9793
float[] f;
9894

99-
@XmlElement
10095
float f2 = 1.3f;
10196

102-
@XmlElement
10397
Float[] f3 = new Float[] {1.2f};
10498

105-
@XmlElement
10699
Float f4 = 1.3f;
107100

108-
@XmlElement
109101
Object f6 = new Integer(3);
110102

111103

@@ -152,8 +144,9 @@ public SomewhatComplex(String id) {
152144
byte[] bytes64 = new byte[] {(byte) 100, (byte) 101};
153145

154146
//@XmlIDREF
155-
@XmlElement(namespace="www.jalview.org3")
156-
public SomewhatComplex cx;
147+
//@XmlElement(namespace="www.jalview.org3")
148+
public SomewhatComplex cx;
149+
157150
//
158151
// @XmlElement(namespace="www.jalview.org3")
159152
// public SomewhatComplex[] cxa = new SomewhatComplex[] { new SomewhatComplex("1"), new SomewhatComplex("2")};

0 commit comments

Comments
 (0)