Skip to content

Commit 7faba8a

Browse files
hansonrhansonr
authored andcommitted
JAXB unmarshalling succesful for Jalview session
1 parent 5e03b04 commit 7faba8a

File tree

11 files changed

+181
-125
lines changed

11 files changed

+181
-125
lines changed
1.42 KB
Binary file not shown.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
20181105193243
1+
20181106221821
1.42 KB
Binary file not shown.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
20181105193243
1+
20181106221821
1.42 KB
Binary file not shown.

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

Lines changed: 105 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -30,69 +30,69 @@ class JSJAXBClass implements Cloneable {
3030
final static int TYPE_PROPERTY = 3;
3131

3232
/**
33-
* This class's accessorType. We need explicit
34-
* propOrder or XmlAttribute or XmlElement.
33+
* This class's accessorType. We need explicit propOrder or XmlAttribute or
34+
* XmlElement.
3535
*
36-
* This field is not used, because all this is determined
37-
* during transpilation. BUT...
38-
* Note that the Java2Script transpiler currently does not
39-
* honor package-info.java annotations for this. TODO
36+
* This field is not used, because all this is determined during transpilation.
37+
* BUT... Note that the Java2Script transpiler currently does not honor
38+
* package-info.java annotations for this. TODO
4039
*
4140
*/
4241
int accessorType = TYPE_PUBLIC_MEMBER;
4342

4443
private boolean isMarshaller;
4544

4645
private String unmarshallerDefaultNamespace;
47-
48-
QName qname = new QName("", "##default", "");
46+
47+
private QName qname = new QName("", "##default", "");
4948
QName qualifiedTypeName;
5049

5150
/**
52-
* for the root, null, but for fields that need unmarshalling, the field that
53-
* is being filled by this unmarshalling
51+
* for the root, null, but for fields that need unmarshalling, the field that is
52+
* being filled by this unmarshalling
5453
*/
5554
JSJAXBField tagField;
5655

5756
/**
5857
* from XmlType(name=""), but not used
5958
*/
60-
boolean isAnonymous;
61-
59+
boolean isAnonymous;
60+
6261
/**
63-
* XmlIDREF
62+
* XmlIDREF
6463
*/
6564
boolean isXmlIDREF;
6665
JSJAXBField xmlIDField;
67-
66+
6867
boolean isEnum;
69-
68+
7069
List<String> propOrder = new ArrayList<String>();
7170
List<JSJAXBField> fields = new ArrayList<JSJAXBField>();
72-
71+
7372
private Map<String, JSJAXBField> marshallerFieldMap = new Hashtable<String, JSJAXBField>();
7473

7574
/**
7675
* holds the enum name/value pairs for marshaller and unmarshaller
7776
*/
7877
Map<Object, Object> enumMap;
7978
String enumClassType;
80-
79+
8180
JSJAXBField xmlValueField;
8281
final Map<String, JSJAXBField> unmarshallerFieldMap = new Hashtable<String, JSJAXBField>();
8382

8483
Class<?> javaClass; // for JavaScript debugging
8584
private Object javaObject;
8685
List<String> seeAlso;
87-
8886

8987
transient Object tagObject;
9088
private String createName;
9189
private boolean isInnerClass;
92-
90+
91+
QName declaredTypeName;
92+
9393
private static String packageNamespace;
9494
private static String packageAccessorType;
95-
95+
9696
private final static Map<String, String> marshallerNamespacePrefixes = new Hashtable<String, String>();
9797
private final static Map<String, XmlAdapter> adapterMap = new HashMap<String, XmlAdapter>();
9898

@@ -110,22 +110,22 @@ private static void getDefaultNamespaceFromPackageInfo(Class<?> javaClass) {
110110
packageNamespace = "";
111111
InputStream is = javaClass.getResourceAsStream("_$.js");
112112
if (is != null) {
113-
String data = Rdr.streamToUTF8String(new BufferedInputStream(is));
114-
data = PT.getQuotedAttribute(data, "namespace");
115-
if (data != null)
116-
packageNamespace = data;
113+
String data = Rdr.streamToUTF8String(new BufferedInputStream(is));
114+
data = PT.getQuotedAttribute(data, "namespace");
115+
if (data != null)
116+
packageNamespace = data;
117117
}
118118
}
119119

120120
JSJAXBClass(Class<?> javaClass, Object javaObject, boolean isXmlIDREF, boolean isMarshaller, QName qname) {
121121
this.isMarshaller = isMarshaller;
122122
this.javaClass = javaClass;
123-
isInnerClass = /** @j2sNative !!javaClass.$clazz$.__CLASS_NAME$__ || */false;
123+
isInnerClass = /** @j2sNative !!javaClass.$clazz$.__CLASS_NAME$__ || */
124+
false;
124125
this.javaObject = javaObject;
126+
this.qname = qname; // from JAXBElement constructor in ObjectFactory
125127
checkC$__ANN__(this, javaClass, javaObject != null || javaClass.isEnum(), isXmlIDREF);
126128
this.isXmlIDREF = isXmlIDREF;
127-
if (qname != null)
128-
setQName(qname); // from JAXBElement constructor
129129
}
130130

131131
/**
@@ -136,7 +136,8 @@ private static void getDefaultNamespaceFromPackageInfo(Class<?> javaClass) {
136136
* @return
137137
*/
138138
@SuppressWarnings("unused")
139-
static boolean checkC$__ANN__(JSJAXBClass jsjaxbClass, Class<?> javaClass, boolean haveJavaObject, boolean isXmlIDREF) {
139+
static boolean checkC$__ANN__(JSJAXBClass jsjaxbClass, Class<?> javaClass, boolean haveJavaObject,
140+
boolean isXmlIDREF) {
140141
getDefaultNamespaceFromPackageInfo(javaClass);
141142
boolean isTop = true;
142143
while (javaClass != null) {
@@ -146,12 +147,15 @@ private static void getDefaultNamespaceFromPackageInfo(Class<?> javaClass) {
146147
// ['cb','String',['@XmlAttribute(namespace="www.jalview.org2")']],
147148
// ['bytes','[array]',['@XmlAttribute']]];
148149

149-
Object clazz = (/** @j2sNative javaClass.$clazz$ || */ null);
150+
Object clazz = (/** @j2sNative javaClass.$clazz$ || */
151+
null);
150152
if (clazz == null)
151153
break;
152-
Object[][][] jsdata = (/** @j2sNative clazz.__ANN__ || */ null);
153-
String className = (/** @j2sNative clazz.__CLASS$NAME__ || clazz.__CLASS_NAME__ || */ null);
154-
154+
Object[][][] jsdata = (/** @j2sNative clazz.__ANN__ || */
155+
null);
156+
String className = (/** @j2sNative clazz.__CLASS$NAME__ || clazz.__CLASS_NAME__ || */
157+
null);
158+
155159
if (!isTop) {
156160
className = null;
157161
}
@@ -198,7 +202,7 @@ public void addSeeAlso(String... javaClassName) {
198202
if (seeAlso == null)
199203
seeAlso = new ArrayList<>();
200204
for (int i = 0; i < javaClassName.length; i++)
201-
seeAlso.add(javaClassName[i]);
205+
seeAlso.add(javaClassName[i]);
202206
}
203207

204208
private void addField(JSJAXBField field) {
@@ -244,13 +248,17 @@ static XmlAdapter getAdapter(String adapterClass) {
244248

245249
void setUnmarshallerDefaultNamespace(String namespace) {
246250
if (namespace != null)
247-
this.unmarshallerDefaultNamespace = namespace;
251+
this.unmarshallerDefaultNamespace = namespace;
248252
}
249253

250254
String getUnmarshallerDefaultNamespace() {
251255
return unmarshallerDefaultNamespace;
252256
}
253257

258+
public QName getQName() {
259+
return qname;
260+
}
261+
254262
void setQName(QName qualifiedName) {
255263
if (qname.getPrefix().length() > 0)
256264
return;
@@ -272,13 +280,74 @@ static boolean hasAnnotations(Object value) {
272280
return false;
273281
try {
274282
// Date does not have a class?
275-
Class<?> cl = value.getClass();
276-
return (/** @j2sNative (value.$clazz$ ? !!value.$clazz$.__ANN__ : cl.$clazz$ ? !!cl.$clazz$.__ANN__ : 0) || */false);
283+
Class<?> cl = value.getClass();
284+
return (/**
285+
* @j2sNative (value.$clazz$ ? !!value.$clazz$.__ANN__ : cl.$clazz$ ?
286+
* !!cl.$clazz$.__ANN__ : 0) ||
287+
*/
288+
false);
277289
} catch (Throwable t) {
278290
return false;
279291
}
280292
}
281293

294+
QName finalizeFieldQName(QName qName, String defaultName, int type) {
295+
if (qName == null)
296+
qName = new QName("##default", "##default", "");
297+
String namespace = qName.getNamespaceURI();
298+
if (namespace.equals("##default"))
299+
namespace = getDefaultNamespace(type);
300+
String name = qName.getLocalPart();
301+
if (name.equals("##default")) {
302+
switch (type) {
303+
case JSJAXBField.TYPE_ROOT_ELEMENT:
304+
if (qname != null) {
305+
// from JAXBElement constructor in ObjectFactory
306+
name = qname.getLocalPart();
307+
break;
308+
}
309+
// fall through //
310+
case JSJAXBField.TYPE_XML_TYPE:
311+
name = JSJAXBClass.getXmlNameFromClassName(defaultName);
312+
break;
313+
case JSJAXBField.TYPE_ATTRIBUTE:
314+
case JSJAXBField.TYPE_ELEMENT:
315+
name = defaultName;
316+
break;
317+
}
318+
}
319+
QName qname = new QName(namespace, name, JSJAXBClass.getPrefixFor(namespace));
320+
switch (type) {
321+
case JSJAXBField.TYPE_ROOT_ELEMENT:
322+
return this.qname = qname;
323+
case JSJAXBField.TYPE_XML_TYPE:
324+
return this.qname = qualifiedTypeName = qname;
325+
case JSJAXBField.TYPE_ATTRIBUTE:
326+
case JSJAXBField.TYPE_ELEMENT:
327+
return qname;
328+
}
329+
// not possible
330+
return null;
331+
}
332+
333+
private boolean haveXMLTypeNamespace = true;
334+
335+
private String getDefaultNamespace(int type) {
336+
switch (type) {
337+
case JSJAXBField.TYPE_ROOT_ELEMENT:
338+
return (isInnerClass || qname == null ? packageNamespace : qname.getNamespaceURI());
339+
case JSJAXBField.TYPE_XML_TYPE:
340+
haveXMLTypeNamespace = false;
341+
return qname.getNamespaceURI();
342+
case JSJAXBField.TYPE_ATTRIBUTE:
343+
return "";
344+
case JSJAXBField.TYPE_ELEMENT:
345+
return (haveXMLTypeNamespace ? qname.getNamespaceURI() : packageNamespace);
346+
}
347+
// not possible
348+
return null;
349+
}
350+
282351
public JSJAXBClass clone() {
283352
try {
284353
JSJAXBClass jaxbClass = (JSJAXBClass) super.clone();
@@ -292,28 +361,4 @@ public JSJAXBClass clone() {
292361
}
293362
}
294363

295-
QName finalizeFieldQName(QName qName, String defaultName) {
296-
if (qName == null)
297-
qName = new QName("##default", "##default", "");
298-
String namespace = qName.getNamespaceURI();
299-
String name = qName.getLocalPart();
300-
if (namespace.equals("##default"))
301-
namespace = getDefaultNamespace();
302-
if (name.equals("##default"))
303-
name = JSJAXBClass.getXmlNameFromClassName(defaultName);
304-
String prefix = JSJAXBClass.getPrefixFor(namespace);
305-
return new QName(namespace, name, prefix);
306-
}
307-
308-
private String getDefaultNamespace() {
309-
return (isInnerClass && qualifiedTypeName != null ? qualifiedTypeName.getNamespaceURI() : packageNamespace);
310-
}
311-
312-
public QName getQName() {
313-
314-
// TODO Auto-generated method stub
315-
return null;
316-
}
317-
318-
319364
}

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

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ class JSJAXBField implements Cloneable {
3939
DOMNode boundNode;
4040
List<Object> boundListNodes;
4141
QName qualifiedTypeName;
42+
String unmarshallingClassName;
4243

4344
String xmlCharacterData = "";
4445
String xmlAttributeData;
@@ -55,6 +56,12 @@ class JSJAXBField implements Cloneable {
5556
final static int MAP_KEY_OBJECT = 4;
5657
final static int MAP_VALUE_OBJECT = 8;
5758

59+
final static int TYPE_NONE = 0;
60+
final static int TYPE_ROOT_ELEMENT = 1;
61+
final static int TYPE_XML_TYPE = 2;
62+
final static int TYPE_ATTRIBUTE = 3;
63+
final static int TYPE_ELEMENT = 4;
64+
5865
int holdsObjects = NO_OBJECT;
5966

6067
QName qualifiedName;
@@ -94,6 +101,7 @@ class JSJAXBField implements Cloneable {
94101
private int index;
95102
private Object clazz; // for debugging only
96103

104+
97105

98106
/**
99107
* prior to re-use in unmarshalling
@@ -107,7 +115,7 @@ public JSJAXBField clone() {
107115
// unmarshaller
108116
f.boundNode = null;
109117
f.boundListNodes = null;
110-
f.xmlCharacterData = null;
118+
f.xmlCharacterData = "";
111119
f.xmlAttributeData = null;
112120
// f.xmlAttributes = null;
113121
f.xmlType = null;
@@ -119,7 +127,8 @@ public JSJAXBField clone() {
119127
}
120128

121129
void setCharacters(String ch) {
122-
xmlCharacterData = ch;
130+
// <..../> will result in null for textContent
131+
xmlCharacterData = (ch == null ? "" : ch);
123132
}
124133

125134
void setAttributeData(String val) {
@@ -194,28 +203,16 @@ void setNode(DOMNode node) {
194203
readAnnotations(jaxbClass, (String[]) adata[1], propOrder, attr);
195204
// ensure that we have a qualified name if appropriate
196205
setDefaults();
197-
if (qualifiedWrapName != null) {
198-
qualifiedWrapName = jaxbClass.finalizeFieldQName(qualifiedWrapName, null);
199-
}
200206
if (index == 0) {
201-
if (qualifiedTypeName == null)
202-
qualifiedTypeName = new QName("##default", "##default", "");
203-
boolean haveTypeNS = (!qualifiedTypeName.getNamespaceURI().equals("##default"));
204-
qualifiedName = jaxbClass.finalizeFieldQName(qualifiedName, javaClassName);
205-
if (!haveTypeNS)
206-
qualifiedTypeName = new QName(qualifiedName.getNamespaceURI(), qualifiedTypeName.getLocalPart(), "");
207-
jaxbClass.qualifiedTypeName = jaxbClass.finalizeFieldQName(qualifiedTypeName, javaClassName);
207+
qualifiedName = jaxbClass.finalizeFieldQName(qualifiedName, javaClassName, TYPE_ROOT_ELEMENT);
208+
qualifiedTypeName = jaxbClass.finalizeFieldQName(qualifiedTypeName, javaClassName, TYPE_XML_TYPE);
208209
jaxbClass.isAnonymous = (jaxbClass.qualifiedTypeName.getLocalPart().length() == 0);
209-
jaxbClass.setQName(jaxbClass.qualifiedTypeName);
210210
} else {
211211
if (javaName != null) {
212-
if (qualifiedName == null)
213-
qualifiedName = new QName("##default", "##default", "");
214-
boolean isDefaultNS = (qualifiedName.getNamespaceURI().equals("##default"));
215-
qualifiedName = jaxbClass.finalizeFieldQName(qualifiedName, javaName);
216-
if (isDefaultNS)
217-
qualifiedName = new QName(isAttribute ? "" : jaxbClass.qname.getNamespaceURI(),
218-
qualifiedName.getLocalPart(), this.isAttribute ? "" : jaxbClass.qname.getPrefix());
212+
if (qualifiedWrapName != null) {
213+
qualifiedWrapName = jaxbClass.finalizeFieldQName(qualifiedWrapName, null, TYPE_ELEMENT);
214+
}
215+
qualifiedName = jaxbClass.finalizeFieldQName(qualifiedName, javaName, (isAttribute ? TYPE_ATTRIBUTE : TYPE_ELEMENT));
219216
}
220217
}
221218
}
@@ -495,12 +492,15 @@ public String toString() {
495492

496493
// unmarshalling
497494

498-
boolean isSimpleType() {
499-
return (isAttribute || asList || isByteArray || isArray || qualifiedWrapName != null || isNil
500-
|| simplePackages());
495+
boolean isSimpleType(String javaClassName) {
496+
return (javaClassName != null ? simplePackages(javaClassName)
497+
: isNil || isAttribute
498+
|| asList || isByteArray
499+
|| isArray || qualifiedWrapName != null
500+
|| simplePackages(this.javaClassName));
501501
}
502502

503-
private boolean simplePackages() {
503+
static boolean simplePackages(String javaClassName) {
504504
return (javaClassName.indexOf(".") < 0 || javaClassName.startsWith("java.")
505505
|| javaClassName.startsWith("javax.") || javaClassName.startsWith("javajs."));
506506
}

0 commit comments

Comments
 (0)