@@ -226,7 +226,6 @@ private void processArraysAndLists() {
226226 && (field .boundListNodes != null || field .listValues != null )
227227 && field .fieldType != JSJAXBField .MAP ) {
228228 // unwrapped set - array or list or map?
229- // System.out.println("Filling List " + field.javaName);
230229 String type = (field .isArray ? field .javaClassName .replace ("[]" , "" ) : field .listClassName );
231230 boolean holdsObject = (field .holdsObjects != JSJAXBField .NO_OBJECT );
232231 field .setValue (fillArrayData (field , null , null , (holdsObject ? null : type )), this .javaObject );
@@ -240,7 +239,6 @@ private void processMaps() {
240239 JSJAXBField field = jaxbClass .fields .get (j );
241240 if (field .fieldType != JSJAXBField .MAP )
242241 continue ;
243- // System.out.println("Filling Map " + field.javaName);
244242 List <Object > nodes = field .boundListNodes ;
245243 Map <Object , Object > map = (Map <Object , Object >) field .getObject (javaObject );
246244 if (map == null ) {
@@ -261,9 +259,8 @@ private void processMaps() {
261259 valueType = className ;
262260 JSJAXBField valueFieldToUnmarshal = (className == null ? null : field );
263261 for (int i = 1 , n = nodes .size (); i < n ;) {
264- Object key = getNodeObject (keyFieldToUnmarshal , (DOMNode ) nodes .get (i ++), keyType , null );
265- Object value = getNodeObject (valueFieldToUnmarshal , (DOMNode ) nodes .get (i ++), valueType , null );
266- // System.out.println("map.put " + key + " = " + value);
262+ Object key = getNodeObject (keyFieldToUnmarshal , (DOMNode ) nodes .get (i ++), keyType , null , true );
263+ Object value = getNodeObject (valueFieldToUnmarshal , (DOMNode ) nodes .get (i ++), valueType , null , true );
267264 map .put (key , value );
268265 }
269266 }
@@ -308,14 +305,15 @@ private Object[] fillArrayData(JSJAXBField field, DOMNode node, Object[] data, S
308305 // TODO: what if arrayType is Object?
309306 String className = needsUnmarshalling (field , arrayType );
310307 JSJAXBField fieldToUnmarshal = (className == null ? null : field );
308+ boolean asObject = (arrayType == null );
311309 if (className != null )
312310 arrayType = className ;
313311 for (int i = 0 ; i < n ; i ++)
314- a [i ] = (field .listValues != null ? field .listValues .get (i ) : getNodeObject (fieldToUnmarshal , (node == null ? (DOMNode ) field .boundListNodes .get (i ) : node ), arrayType , data [i ]));
312+ a [i ] = (field .listValues != null ? field .listValues .get (i ) : getNodeObject (fieldToUnmarshal , (node == null ? (DOMNode ) field .boundListNodes .get (i ) : node ), arrayType , data [i ], asObject ));
315313 return a ;
316314 }
317315
318- private Object getNodeObject (JSJAXBField fieldToUnmarshal , DOMNode node , String type , Object data ) {
316+ private Object getNodeObject (JSJAXBField fieldToUnmarshal , DOMNode node , String type , Object data , boolean asObject ) {
319317 if (fieldToUnmarshal != null ) {
320318 return unmarshalField (fieldToUnmarshal , node , type );
321319 }
@@ -327,28 +325,27 @@ private Object getNodeObject(JSJAXBField fieldToUnmarshal, DOMNode node, String
327325 type = JSSAXParser .getAttribute (node , "xsi:type" );
328326 if (type == null )
329327 return null ;
330- if (type .indexOf (":" ) >= 0 && !type .startsWith ("xs:" )) {
331- // this is a SeeAlso entry
332- QName qname = getQnameForAttribute (null , null , type );
333- JSJAXBField field = getFieldFromQName (qname );
334- return unmarshalField (field , node , null );
328+ if (type .indexOf (":" ) >= 0 ) {
329+ if (!type .startsWith ("xs:" )) {
330+ // this is a SeeAlso entry
331+ QName qname = getQnameForAttribute (null , null , type );
332+ JSJAXBField field = getFieldFromQName (qname );
333+ return unmarshalField (field , node , null );
334+ }
335+ } else if (asObject ) {
336+ type = JSJAXBField .boxPrimitive (type );
335337 }
336338 }
337339 return convertFromType (null , data , type );
338340 }
339341
340342 private void start (DOMNode node , QName qName , Attributes atts ) {
341- //System.out.println(">>JSJAXBUnmarshaller start:" + qName);
342343 String text = JSSAXParser .getSimpleInnerText (node );
343344 if (doc == null ) {
344345 doc = node ;
345346 setDocAttributes (qName , text , atts );
346347 return ;
347348 }
348- // /**
349- // * @j2sNative
350- // System.out.println("start:" +node.outerHTML);
351- // */
352349 JSJAXBField field = getFieldFromQName (qName );
353350 if (field != null ) {
354351 bindNode (node , field , atts );
@@ -465,7 +462,6 @@ void prepareForUnmarshalling(String defaultNamespace) {
465462 String cl = seeAlso .get (i );
466463 try {
467464 addSeeAlso (Class .forName (cl ));
468- //System.out.println("JSJAXBClass seeAlso: " + cl);
469465 } catch (ClassNotFoundException e ) {
470466 System .out .println ("JSJAXBClass seeAlso[" + i + "] not found: " + cl );
471467 }
@@ -498,8 +494,6 @@ private void bindQName(QName q, JSJAXBField field, boolean isSeeAlso) {
498494 String qn = q .getNamespaceURI () + ":" + q .getLocalPart ();
499495 map .put (qn , field );
500496 map .put ("/lc/" + qn .toLowerCase (), field );
501- // System.out.println("JSJAXBClass#binding " + namespace + ":" +
502- // q.getLocalPart() + "->" + field.javaName);
503497 }
504498
505499 JSJAXBField getFieldFromQName (QName qName ) {
@@ -570,7 +564,12 @@ private void setFieldValue(JSJAXBField field) {
570564 return ;
571565 }
572566
573- String dataType = (field .xmlType == null ? field .javaClassName : field .xmlType );
567+ String dataType ;
568+ if ("java.lang.Object" .equals (field .javaClassName ) && field .xmlType != null ) {
569+ dataType = JSJAXBField .boxPrimitive (field .xmlType );
570+ } else {
571+ dataType = field .javaClassName ;
572+ }
574573 field .setValue (convertFromType (field , data , dataType ), javaObject );
575574 }
576575
@@ -633,8 +632,9 @@ private Object convertFromType(JSJAXBField field, Object objVal, String type) {
633632 null );
634633 default :
635634 if (haventUnmarshalled .indexOf (field .xmlSchemaType ) < 0 ) {
636- haventUnmarshalled += ";" + field .xmlSchemaType ;
637- System .out .println ("JSJAXBUnmarhsaller using target type " + type + " for " + field .xmlSchemaType );
635+ haventUnmarshalled += ";" + field .xmlSchemaType ;
636+ System .out .println (
637+ "JSJAXBUnmarhsaller using target type " + type + " for " + field .xmlSchemaType );
638638 }
639639 // fall through //
640640 case "xsd:ID" :
@@ -647,31 +647,35 @@ private Object convertFromType(JSJAXBField field, Object objVal, String type) {
647647 String lctype = type .substring (3 );
648648 // must be an OBJECT for a List, Map, or Object field
649649 type = type .substring (3 , 4 ).toUpperCase () + lctype .substring (1 );
650- switch (type ) {
651- case "Decimal" :
652- type = "java.math.BigDecimal" ;
653- break ;
654- case "Unsignedlong" :
655- case "Integer" :
656- type = "java.math.BigInteger" ;
657- break ;
658- case "Int" :
659- case "Unsignedshort" :
660- type = "Integer" ;
661- break ;
662- case "Unsignedbyte" :
663- type = "Short" ;
664- break ;
665- case "Unsignedint" :
666- type = "Long" ;
667- break ;
668- default :
669- if (isPrimitive (lctype )) {
670- /**
671- * return newVal = eval(type + ".valueOf$S(" + objVal + ")");
672- */
650+ if (field == null || field .javaClassName == null || field .javaClassName .equals ("java.lang.Object" )) {
651+ switch (type ) {
652+ case "Decimal" :
653+ type = "java.math.BigDecimal" ;
654+ break ;
655+ case "Unsignedlong" :
656+ case "Integer" :
657+ type = "java.math.BigInteger" ;
658+ break ;
659+ case "Int" :
660+ case "Unsignedshort" :
661+ type = "Integer" ;
662+ break ;
663+ case "Unsignedbyte" :
664+ type = "Short" ;
665+ break ;
666+ case "Unsignedint" :
667+ type = "Long" ;
668+ break ;
669+ default :
670+ if (isPrimitive (lctype )) {
671+ /**
672+ * return newVal = eval(type + ".valueOf$S(" + objVal + ")");
673+ */
674+ }
675+ break ;
673676 }
674- break ;
677+ } else {
678+ type = field .javaClassName ;
675679 }
676680 }
677681
@@ -720,7 +724,7 @@ private Object convertFromType(JSJAXBField field, Object objVal, String type) {
720724 return newVal = DatatypeConverter .parseQName (val , null );
721725 case "unsignedlong" :
722726 type = "java.math.BigInteger" ;
723- break ;
727+ break ;
724728 }
725729 Class <?> cl = null ;
726730 try {
@@ -738,8 +742,8 @@ private Object convertFromType(JSJAXBField field, Object objVal, String type) {
738742
739743 // all Numbers and Enum
740744 /**
741- * @j2sNative if (cl.$clazz$.valueOf$S) return newVal =
742- * cl.$clazz$.valueOf$S(objVal);
745+ * @j2sNative if (cl.$clazz$.valueOf$S) return (objVal == null || objVal == "" ? null :
746+ * cl.$clazz$.valueOf$S(objVal)) ;
743747 */
744748
745749 // BigInteger, BigDecimal
0 commit comments