Details
-
Type:
Bug
-
Status:
Open
-
Priority:
Critical
-
Resolution: Unresolved
-
Affects Version/s: 1.0.2, 1.1
-
Fix Version/s: None
-
Component/s: modello-plugin-xpp3
-
Labels:None
-
Environment:maven 2.2.0 java 1.6.0_13
-
Complexity:Intermediate
-
Number of attachments :
Description
It convince in the model to define a field as a Map with some stringable id as a key and an association of the target class
Modello xml snippet
<class xml.tagName="agilepom" rootElement="true">
<name>AgilePOM</name>
<description>
<![CDATA[
The <code><agileProject></code> element is the root of the descriptor.
The following table lists all of the possible child elements.
]]>
</description>
<version>1.0.0+</version>
<fields>
...
<field xdoc.separator="blank">
<name>developers</name>
<version>1.0.0+</version>
<description>Describes the committers of a project.</description>
<type>Map</type>
<association>
<type>Developer</type>
<multiplicity>*</multiplicity>
</association>
</field>
...
</class>
C> mvn clean package
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building dbsvn-model
[INFO] task-segment: [clean, package]
[INFO] ------------------------------------------------------------------------
[INFO] [clean:clean {execution: default-clean}]
[INFO] Deleting directory C:\dev\org\tigris\dbsvn\trunk\home\dbsvn-model\target
[INFO] [modello:java {execution: java-sources}]
[INFO] outputDirectory: C:\dev\org\tigris\dbsvn\trunk\home\dbsvn-model\target\generated-sources\modello
[INFO] Working on model: src/main/mdo/AgilePOM.mdo
[INFO] Generating current version: 1.0.0
[INFO] Working on model: src/main/mdo/Dbsvn.mdo
[INFO] Generating current version: 1.0.0
[INFO] [modello:xpp3-writer {execution: java-sources}]
[INFO] outputDirectory: C:\dev\org\tigris\dbsvn\trunk\home\dbsvn-model\target\generated-sources\modello
[INFO] Working on model: src/main/mdo/AgilePOM.mdo
[INFO] Generating current version: 1.0.0
[INFO] Working on model: src/main/mdo/Dbsvn.mdo
[INFO] Generating current version: 1.0.0
[INFO] [modello:xpp3-reader {execution: java-sources}]
[INFO] outputDirectory: C:\dev\org\tigris\dbsvn\trunk\home\dbsvn-model\target\generated-sources\modello
[INFO] Working on model: src/main/mdo/AgilePOM.mdo
[INFO] Generating current version: 1.0.0
[INFO] Working on model: src/main/mdo/Dbsvn.mdo
[INFO] Generating current version: 1.0.0
[INFO] [resources:resources {execution: default-resources}]
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 0 resource
[INFO] [compiler:compile {execution: default-compile}]
[INFO] Compiling 18 source files to C:\dev\org\tigris\dbsvn\trunk\home\dbsvn-model\target\classes
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Compilation failure
C:\dev\org\tigris\dbsvn\trunk\home\dbsvn-model\target\generated-sources\modello\org\tigris\dbsvn\model\agilepom\io\xpp3\AgilePOMXpp3Reader.java:[483,32] addDeveloper(java.lang.Object,org.tigris.dbsvn.model.agilepom.Developer) in org.tigris.dbsvn.model.agilepom.AgilePOM cannot be applied to (java.lang.String,java.lang.String)
[INFO] ------------------------------------------------------------------------
[INFO] For more information, run Maven with the -e switch
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4 seconds
[INFO] Finished at: Thu Jul 09 09:49:22 GMT+01:00 2009
[INFO] Final Memory: 14M/27M
[INFO] ------------------------------------------------------------------------
Looking in the generated sources
......................./dbsvn-model/target/generated-sources/modello/org/tigris/dbsvn/model/agilepom/AgilePOM.java
public class AgilePOM implements java.io.Serializable { ... /** * Field developers. */ private java.util.Map developers; ... /** * Method getDevelopers. * * @return Map */ public java.util.Map getDevelopers() { if ( this.developers == null ) { this.developers = new java.util.HashMap(); } return this.developers; } //-- java.util.Map getDevelopers() ... /** * Set describes the commiters of a project. * * @param developers */ public void setDevelopers( java.util.Map developers ) { this.developers = developers; } //-- void setDevelopers( java.util.Map ) ... /** * Method addDeveloper. * * @param key * @param value */ public void addDeveloper( Object key, Developer value ) { getDevelopers().put( key, value ); } //-- void addDeveloper( Object, Developer ) ...
............./dbsvn-model/target/generated-sources/modello/org/tigris/dbsvn/model/agilepom/io/xpp3/AgilePOMXpp3Reader.java
else if ( checkFieldWithDuplicate( parser, "developers", null, parsed ) )
{
while ( parser.nextTag() == XmlPullParser.START_TAG )
{
String key = parser.getName();
String value = parser.nextText().trim();
agilePOM.addDeveloper( key, value );
}
}
............org.tigris.dbsvn.model.agilepom.io.xpp3.AgilePOMXpp3Writer
** * Class AgilePOMXpp3Writer. * * @version $Revision$ $Date$ */ public class AgilePOMXpp3Writer { ... /** * Method writeAgilePOM. * * @param agilePOM * @param serializer * @param tagName * @throws java.io.IOException */ private void writeAgilePOM( AgilePOM agilePOM, String tagName, XmlSerializer serializer ) throws java.io.IOException { if ( agilePOM != null ) { ... if ( ( agilePOM.getDevelopers() != null ) && ( agilePOM.getDevelopers().size() > 0 ) ) { serializer.startTag( NAMESPACE, "developers" ); for ( Iterator iter = agilePOM.getDevelopers().keySet().iterator(); iter.hasNext(); ) { String key = (String) iter.next(); String value = (String) agilePOM.getDevelopers().get( key ); serializer.startTag( NAMESPACE, "" + key + "" ).text( value ).endTag( NAMESPACE, "" + key + "" ); } serializer.endTag( NAMESPACE, "developers" ); } ... }
Conclusion
~~~~~~~~~
XPP3 plugin correctly generate AgilePOM#addDeveloper(Object, Developer)
(I think here AgilePOM#addDeveloper(String, Developer) suit better though, but OK)
However both Reader and Writer generate wrong snippets
String key = (String) iter.next();
String value = (String) agilePOM.getDevelopers().get( key );
I think it could be (for Writer)
Object key = iter.next();
Developer developer = (Developer) agilePOM.getDevelopers().get( key );
write(o,"key", key)
writeDeveloper( o, "developer", developer, serializer );
and correspond snippet for Reader
String key = parseKey("key", parser)
developers.addDeveloper( key, parseDeveloper( "developer", parser, strict ) );
xml should be look as
<developers> <key>taranenko</key> <developer> <primaryRole>engineer</primaryRole> ... </developer> </developers>
Issue Links
- is related to
-
MODELLO-30
MAP generation requires stash.keyType attribute
-
-
MODELLO-62
Map With association and defaultValue Does Not Instantiate
-
As an option suggest format of the xml