@@ -133,14 +133,10 @@ private Class<?> findClassForNode(DOMNode doc, Class<?>[] classes) {
133133 return null ;
134134 }
135135
136- private Object unmarshalField (JSJAXBField field , DOMNode node ) {
136+ private Object unmarshalField (JSJAXBField field , DOMNode node , String className ) {
137137 if (field != null )
138138 try {
139- String className = field .unmarshallingClassName ;
140- if (className == null )
141- className = field .javaClassName ;
142- field .unmarshallingClassName = null ;
143- return doUnmarshal (node , Class .forName (className ), MODE_CONTINUE );
139+ return doUnmarshal (node , Class .forName (className == null ? field .javaClassName :className ), MODE_CONTINUE );
144140 } catch (ClassNotFoundException e ) {
145141 e .printStackTrace ();
146142 }
@@ -268,8 +264,14 @@ private void processMaps() {
268264 : field .mapClassNameKey );
269265 String valueType = ((field .holdsObjects & JSJAXBField .MAP_VALUE_OBJECT ) != 0 ? null
270266 : field .mapClassNameValue );
271- JSJAXBField keyFieldToUnmarshal = (needsUnmarshalling (field , keyType ) ? field : null );
272- JSJAXBField valueFieldToUnmarshal = (needsUnmarshalling (field , valueType ) ? field : null );
267+ String className = needsUnmarshalling (field , keyType );
268+ if (className != null )
269+ keyType = className ;
270+ JSJAXBField keyFieldToUnmarshal = (className == null ? null : field );
271+ className = needsUnmarshalling (field , valueType );
272+ if (className != null )
273+ valueType = className ;
274+ JSJAXBField valueFieldToUnmarshal = (className == null ? null : field );
273275 for (int i = 1 , n = nodes .size (); i < n ;) {
274276 Object key = getNodeObject (keyFieldToUnmarshal , (DOMNode ) nodes .get (i ++), keyType , null , true );
275277 Object value = getNodeObject (valueFieldToUnmarshal , (DOMNode ) nodes .get (i ++), valueType , null , true );
@@ -316,16 +318,19 @@ private Object[] fillArrayData(JSJAXBField field, DOMNode node, Object[] data, S
316318 if (!haveData )
317319 data = a ; // nulls
318320 // TODO: what if arrayType is Object?
319- JSJAXBField fieldToUnmarshal = (needsUnmarshalling (field , arrayType ) ? field : null );
321+ String className = needsUnmarshalling (field , arrayType );
322+ JSJAXBField fieldToUnmarshal = (className == null ? null : field );
323+ if (className != null )
324+ arrayType = className ;
320325 for (int i = 0 ; i < n ; i ++)
321- a [i ] = getNodeObject (fieldToUnmarshal , (node == null ? (DOMNode ) field .boundListNodes .get (i ) : node ), field . unmarshallingClassName , data [i ],
326+ a [i ] = getNodeObject (fieldToUnmarshal , (node == null ? (DOMNode ) field .boundListNodes .get (i ) : node ), arrayType , data [i ],
322327 asObject );
323328 return a ;
324329 }
325330
326331 private Object getNodeObject (JSJAXBField fieldToUnmarshal , DOMNode node , String type , Object data , boolean asObject ) {
327332 if (fieldToUnmarshal != null ) {
328- return unmarshalField (fieldToUnmarshal , node );
333+ return unmarshalField (fieldToUnmarshal , node , type );
329334 }
330335 if (node == null )
331336 return null ;
@@ -339,7 +344,7 @@ private Object getNodeObject(JSJAXBField fieldToUnmarshal, DOMNode node, String
339344 // this is a SeeAlso entry
340345 QName qname = getQnameForAttribute (null , null , type );
341346 JSJAXBField field = getFieldFromQName (qname );
342- return unmarshalField (field , node );
347+ return unmarshalField (field , node , null );
343348 }
344349 }
345350 return convertFromType (null , data , type , asObject );
@@ -428,25 +433,23 @@ static JSJAXBClass newUnmarshalledInstance(Class<?> javaClass, Object javaObject
428433 return jjc .clone ();
429434 }
430435
431- public static boolean needsUnmarshalling (JSJAXBField field , String javaClassName ) {
436+ public static String needsUnmarshalling (JSJAXBField field , String javaClassName ) {
432437 if (field .isSimpleType (javaClassName ))
433- return false ;
438+ return null ;
434439 boolean isMarshalled = false ;
435440 if (javaClassName == null )
436441 javaClassName = field .javaClassName ;
437442 try {
438443 isMarshalled = (knownJavaClasses .containsKey (javaClassName )
439444 ? knownJavaClasses .get (javaClassName ).booleanValue ()
440445 : JSJAXBClass .checkC$__ANN__ (null , Class .forName (javaClassName ), false , false ));
441- if (isMarshalled )
442- field .unmarshallingClassName = javaClassName ;
443446 } catch (ClassNotFoundException e ) {
444447 System .out .println ("JSJAXBClass: class was not found: " + javaClassName );
445448 e .printStackTrace ();
446449 } finally {
447450 knownJavaClasses .put (javaClassName , Boolean .valueOf (isMarshalled ));
448451 }
449- return isMarshalled ;
452+ return ( isMarshalled ? javaClassName : null ) ;
450453 }
451454
452455 void prepareForUnmarshalling (String defaultNamespace ) {
@@ -518,8 +521,9 @@ private void setFieldValue(JSJAXBField field) {
518521
519522 // complex object -- unmarshal directly
520523
521- if (needsUnmarshalling (field , null )) {
522- field .setValue (unmarshalField (field , field .boundNode ), javaObject );
524+ String className = needsUnmarshalling (field , null );
525+ if (className != null ) {
526+ field .setValue (unmarshalField (field , field .boundNode , className ), javaObject );
523527 return ;
524528 }
525529
0 commit comments