Skip to content

Commit 70d6dc1

Browse files
Copilotslachiewicz
andcommitted
Fix SnakeYaml, Stax, and JDOM generators for simple type associations with multiplicity=1
Co-authored-by: slachiewicz <[email protected]>
1 parent 5df2ce1 commit 70d6dc1

File tree

5 files changed

+147
-56
lines changed

5 files changed

+147
-56
lines changed

modello-plugins/modello-plugin-jdom/src/main/java/org/codehaus/modello/plugin/jdom/JDOMWriterGenerator.java

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -538,11 +538,25 @@ private void updateClass(ModelClass clazz, JClass jClass, List<ModelClass> alway
538538

539539
ModelClass toClass = association.getToClass();
540540
if (association.isOneMultiplicity()) {
541-
sc.add(getValueChecker(type, value, field));
542-
sc.add("{");
543-
sc.addIndented("update" + capitalise(field.getType()) + "( " + value + ", \"" + fieldTagName
544-
+ "\", innerCount, root );");
545-
sc.add("}");
541+
// Check if the association type is a class in the model or a simple type
542+
boolean inModel = isClassInModel(
543+
association.getTo(), field.getModelClass().getModel());
544+
545+
if (inModel) {
546+
// It's a model class, call the update method for that class
547+
sc.add(getValueChecker(type, value, field));
548+
sc.add("{");
549+
sc.addIndented("update" + capitalise(field.getType()) + "( " + value + ", \"" + fieldTagName
550+
+ "\", innerCount, root );");
551+
sc.add("}");
552+
} else {
553+
// It's a simple type (like String), update it directly
554+
sc.add(getValueChecker(type, value, field));
555+
sc.add("{");
556+
sc.addIndented("updateElement( innerCount, root, \"" + fieldTagName + "\" ).setText( "
557+
+ getValue(association.getTo(), value, xmlFieldMetadata) + " );");
558+
sc.add("}");
559+
}
546560
} else {
547561
// MANY_MULTIPLICITY
548562

modello-plugins/modello-plugin-snakeyaml/src/main/java/org/codehaus/modello/plugin/snakeyaml/SnakeYamlReaderGenerator.java

Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -520,24 +520,44 @@ private void processField(
520520
String associationName = association.getName();
521521

522522
if (association.isOneMultiplicity()) {
523-
sc.add(tagComparison);
523+
// Check if the association type is a class in the model or a simple type
524+
boolean inModel = isClassInModel(
525+
association.getTo(), field.getModelClass().getModel());
524526

525-
sc.add("{");
526-
sc.indent();
527+
if (inModel) {
528+
// It's a model class, call the parse method for that class
529+
sc.add(tagComparison);
530+
531+
sc.add("{");
532+
sc.indent();
527533

528-
// sc.add( "// consume current key" );
529-
// sc.add( "parser.getEvent();" );
530-
sc.add(objectName
531-
+ ".set"
532-
+ capFieldName
533-
+ "( parse"
534-
+ association.getTo()
535-
+ "( parser, strict"
536-
+ trackingArgs
537-
+ " ) );");
534+
// sc.add( "// consume current key" );
535+
// sc.add( "parser.getEvent();" );
536+
sc.add(objectName + ".set" + capFieldName + "( parse" + association.getTo() + "( parser, strict"
537+
+ trackingArgs + " ) );");
538538

539-
sc.unindent();
540-
sc.add("}");
539+
sc.unindent();
540+
sc.add("}");
541+
} else {
542+
// It's a simple type (like String), use primitive field handling
543+
sc.add(tagComparison);
544+
545+
sc.add("{");
546+
sc.indent();
547+
548+
writePrimitiveField(
549+
field,
550+
association.getTo(),
551+
objectName,
552+
objectName,
553+
"\"" + field.getName() + "\"",
554+
"set" + capFieldName,
555+
sc,
556+
false);
557+
558+
sc.unindent();
559+
sc.add("}");
560+
}
541561
} else {
542562
// MANY_MULTIPLICITY
543563

modello-plugins/modello-plugin-snakeyaml/src/main/java/org/codehaus/modello/plugin/snakeyaml/SnakeYamlWriterGenerator.java

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -264,17 +264,36 @@ private void writeClass(ModelClass modelClass, JClass jClass) throws ModelloExce
264264
ModelAssociation association = (ModelAssociation) field;
265265

266266
if (association.isOneMultiplicity()) {
267-
sc.add(getValueChecker(type, value, association));
267+
// Check if the association type is a class in the model or a simple type
268+
boolean inModel = isClassInModel(
269+
association.getTo(), field.getModelClass().getModel());
268270

269-
sc.add("{");
270-
sc.indent();
271+
if (inModel) {
272+
// It's a model class, call the write method for that class
273+
sc.add(getValueChecker(type, value, association));
274+
275+
sc.add("{");
276+
sc.indent();
277+
278+
writeScalarKey(sc, fieldTagName);
279+
sc.add("write" + association.getTo() + "( (" + association.getTo() + ") " + value
280+
+ ", generator );");
281+
282+
sc.unindent();
283+
sc.add("}");
284+
} else {
285+
// It's a simple type (like String), write it directly as a scalar
286+
sc.add(getValueChecker(type, value, association));
271287

272-
writeScalarKey(sc, fieldTagName);
273-
sc.add("write" + association.getTo() + "( (" + association.getTo() + ") " + value
274-
+ ", generator );");
288+
sc.add("{");
289+
sc.indent();
275290

276-
sc.unindent();
277-
sc.add("}");
291+
writeScalarKey(sc, fieldTagName);
292+
writeScalar(sc, getValue(association.getTo(), value, xmlFieldMetadata));
293+
294+
sc.unindent();
295+
sc.add("}");
296+
}
278297
} else {
279298
// MANY_MULTIPLICITY
280299

modello-plugins/modello-plugin-stax/src/main/java/org/codehaus/modello/plugin/stax/StaxReaderGenerator.java

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -988,28 +988,46 @@ private void processField(
988988
String associationName = association.getName();
989989

990990
if (association.isOneMultiplicity()) {
991-
sc.add(tagComparison);
991+
// Check if the association type is a class in the model or a simple type
992+
boolean inModel = isClassInModel(
993+
association.getTo(), field.getModelClass().getModel());
992994

993-
sc.add("{");
994-
sc.indent();
995+
if (inModel) {
996+
// It's a model class, process as usual
997+
sc.add(tagComparison);
995998

996-
ModelField referenceIdentifierField = getReferenceIdentifierField(association);
999+
sc.add("{");
1000+
sc.indent();
9971001

998-
if (referenceIdentifierField != null) {
999-
addCodeToAddReferences(association, jClass, sc, referenceIdentifierField, objectName);
1002+
ModelField referenceIdentifierField = getReferenceIdentifierField(association);
10001003

1001-
// gobble the rest of the tag
1002-
sc.add("while ( xmlStreamReader.getEventType() != XMLStreamConstants.END_ELEMENT )");
1003-
sc.add("{");
1004-
sc.addIndented("xmlStreamReader.next();");
1004+
if (referenceIdentifierField != null) {
1005+
addCodeToAddReferences(association, jClass, sc, referenceIdentifierField, objectName);
1006+
1007+
// gobble the rest of the tag
1008+
sc.add("while ( xmlStreamReader.getEventType() != XMLStreamConstants.END_ELEMENT )");
1009+
sc.add("{");
1010+
sc.addIndented("xmlStreamReader.next();");
1011+
sc.add("}");
1012+
} else {
1013+
sc.add(objectName + ".set" + capFieldName + "( parse" + association.getTo()
1014+
+ "( xmlStreamReader, strict ) );");
1015+
}
1016+
1017+
sc.unindent();
10051018
sc.add("}");
10061019
} else {
1007-
sc.add(objectName + ".set" + capFieldName + "( parse" + association.getTo()
1008-
+ "( xmlStreamReader, strict ) );");
1009-
}
1020+
// It's a simple type (like String), use primitive field handling
1021+
sc.add(tagComparison);
10101022

1011-
sc.unindent();
1012-
sc.add("}");
1023+
sc.add("{");
1024+
sc.indent();
1025+
1026+
writePrimitiveField(field, association.getTo(), objectName, "set" + capFieldName, sc);
1027+
1028+
sc.unindent();
1029+
sc.add("}");
1030+
}
10131031
} else {
10141032
// MANY_MULTIPLICITY
10151033

modello-plugins/modello-plugin-stax/src/main/java/org/codehaus/modello/plugin/stax/StaxWriterGenerator.java

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -349,25 +349,45 @@ private void writeClass(ModelClass modelClass, JClass jClass) throws ModelloExce
349349
ModelField referenceIdentifierField = getReferenceIdentifierField(association);
350350

351351
if (association.isOneMultiplicity()) {
352-
sc.add(getValueChecker(type, value, association));
353-
sc.add("{");
354-
sc.indent();
352+
// Check if the association type is a class in the model or a simple type
353+
boolean inModel = isClassInModel(
354+
association.getTo(), field.getModelClass().getModel());
355355

356-
if (referenceIdentifierField != null) {
357-
// if xml.reference, then store as a reference instead
356+
if (inModel) {
357+
// It's a model class, process as usual
358+
sc.add(getValueChecker(type, value, association));
359+
sc.add("{");
360+
sc.indent();
358361

359-
sc.add("serializer.writeStartElement( \"" + fieldTagName + "\" );");
362+
if (referenceIdentifierField != null) {
363+
// if xml.reference, then store as a reference instead
360364

361-
writeElementAttribute(sc, referenceIdentifierField, value);
365+
sc.add("serializer.writeStartElement( \"" + fieldTagName + "\" );");
362366

363-
sc.add("serializer.writeEndElement();");
367+
writeElementAttribute(sc, referenceIdentifierField, value);
368+
369+
sc.add("serializer.writeEndElement();");
370+
} else {
371+
sc.add("write" + association.getTo() + "( (" + association.getTo() + ") " + value + ", \""
372+
+ fieldTagName + "\", serializer );");
373+
}
374+
375+
sc.unindent();
376+
sc.add("}");
364377
} else {
365-
sc.add("write" + association.getTo() + "( (" + association.getTo() + ") " + value + ", \""
366-
+ fieldTagName + "\", serializer );");
367-
}
378+
// It's a simple type (like String), write it directly
379+
sc.add(getValueChecker(type, value, association));
380+
sc.add("{");
381+
sc.indent();
368382

369-
sc.unindent();
370-
sc.add("}");
383+
sc.add("serializer.writeStartElement( " + "\"" + fieldTagName + "\" );");
384+
sc.add("serializer.writeCharacters( " + getValue(association.getTo(), value, xmlFieldMetadata)
385+
+ " );");
386+
sc.add("serializer.writeEndElement();");
387+
388+
sc.unindent();
389+
sc.add("}");
390+
}
371391
} else {
372392
// MANY_MULTIPLICITY
373393

0 commit comments

Comments
 (0)