diff --git a/modello-plugins/modello-plugin-xpp3/src/main/java/org/codehaus/modello/plugin/xpp3/Xpp3ExtendedWriterGenerator.java b/modello-plugins/modello-plugin-xpp3/src/main/java/org/codehaus/modello/plugin/xpp3/Xpp3ExtendedWriterGenerator.java index 0a8854f63..5ed558800 100644 --- a/modello-plugins/modello-plugin-xpp3/src/main/java/org/codehaus/modello/plugin/xpp3/Xpp3ExtendedWriterGenerator.java +++ b/modello-plugins/modello-plugin-xpp3/src/main/java/org/codehaus/modello/plugin/xpp3/Xpp3ExtendedWriterGenerator.java @@ -67,7 +67,7 @@ private void createLocationTrackingMethod( JClass jClass ) JSourceCode sc = method.getSourceCode(); - sc.add( locationTracker.getName() + " location = locationTracker.getLocation( key );" ); + sc.add( locationTracker.getName() + " location = ( locationTracker == null ) ? null : locationTracker.getLocation( key );" ); sc.add( "if ( location != null )" ); sc.add( "{" ); sc.addIndented( "serializer.comment( toString( location ) );" ); diff --git a/modello-plugins/modello-plugin-xpp3/src/main/java/org/codehaus/modello/plugin/xpp3/Xpp3WriterGenerator.java b/modello-plugins/modello-plugin-xpp3/src/main/java/org/codehaus/modello/plugin/xpp3/Xpp3WriterGenerator.java index c44fcc753..923c2abee 100644 --- a/modello-plugins/modello-plugin-xpp3/src/main/java/org/codehaus/modello/plugin/xpp3/Xpp3WriterGenerator.java +++ b/modello-plugins/modello-plugin-xpp3/src/main/java/org/codehaus/modello/plugin/xpp3/Xpp3WriterGenerator.java @@ -383,6 +383,8 @@ private void writeClass( ModelClass modelClass, JClass jClass ) if ( ModelDefault.LIST.equals( type ) || ModelDefault.SET.equals( type ) ) { + boolean isList = ModelDefault.LIST.equals( type ); + sc.add( getValueChecker( type, value, association ) ); sc.add( "{" ); @@ -393,6 +395,15 @@ private void writeClass( ModelClass modelClass, JClass jClass ) sc.add( "serializer.startTag( NAMESPACE, " + "\"" + fieldTagName + "\" );" ); } + if ( isLocationTracking() && !isClassInModel( association.getTo(), modelClass.getModel() ) ) + { + sc.add( locationTracker.getName() + " location = " + uncapClassName + ".getLocation( \"" + fieldTagName + "\" );" ); + if ( isList ) + { + sc.add( "int n = 0;" ); + } + } + sc.add( "for ( Iterator iter = " + value + ".iterator(); iter.hasNext(); )" ); sc.add( "{" ); @@ -406,12 +417,14 @@ private void writeClass( ModelClass modelClass, JClass jClass ) } else { - sc.add( toType + " " + singular( uncapitalise( field.getName() ) ) + " = (" + toType - + ") iter.next();" ); + String variable = singular( uncapitalise( field.getName() ) ); + + sc.add( toType + " " + variable + " = (" + toType + ") iter.next();" ); - sc.add( "serializer.startTag( NAMESPACE, " + "\"" + valuesTagName + "\" ).text( " - + singular( uncapitalise( field.getName() ) ) + " ).endTag( NAMESPACE, " + "\"" - + valuesTagName + "\" );" ); + sc.add( "serializer.startTag( NAMESPACE, \"" + valuesTagName + "\" ).text( " + variable + + " ).endTag( NAMESPACE, \"" + valuesTagName + "\" );" ); + + writeLocationTracking( sc, "location", isList ? "Integer.valueOf( n++ )" : variable ); } sc.unindent(); @@ -419,7 +432,7 @@ private void writeClass( ModelClass modelClass, JClass jClass ) if ( wrappedItems ) { - sc.add( "serializer.endTag( NAMESPACE, " + "\"" + fieldTagName + "\" );" ); + sc.add( "serializer.endTag( NAMESPACE, \"" + fieldTagName + "\" );" ); } sc.unindent();