Index: xmlctf/tests/MasterTestSuite/sourcegenerator/Enums/java5WithClashingConstants/builder.properties =================================================================== --- xmlctf/tests/MasterTestSuite/sourcegenerator/Enums/java5WithClashingConstants/builder.properties (revision 0) +++ xmlctf/tests/MasterTestSuite/sourcegenerator/Enums/java5WithClashingConstants/builder.properties (revision 0) @@ -0,0 +1 @@ +org.exolab.castor.builder.javaVersion=5.0 Index: xmlctf/tests/MasterTestSuite/sourcegenerator/Enums/java5WithClashingConstants/input-capital-a.xml =================================================================== --- xmlctf/tests/MasterTestSuite/sourcegenerator/Enums/java5WithClashingConstants/input-capital-a.xml (revision 0) +++ xmlctf/tests/MasterTestSuite/sourcegenerator/Enums/java5WithClashingConstants/input-capital-a.xml (revision 0) @@ -0,0 +1,5 @@ + + + A + Index: xmlctf/tests/MasterTestSuite/sourcegenerator/Enums/java5WithClashingConstants/input_wrong.xml =================================================================== --- xmlctf/tests/MasterTestSuite/sourcegenerator/Enums/java5WithClashingConstants/input_wrong.xml (revision 0) +++ xmlctf/tests/MasterTestSuite/sourcegenerator/Enums/java5WithClashingConstants/input_wrong.xml (revision 0) @@ -0,0 +1,6 @@ + + + A + FIVE + Index: xmlctf/tests/MasterTestSuite/sourcegenerator/Enums/java5WithClashingConstants/test.xsd =================================================================== --- xmlctf/tests/MasterTestSuite/sourcegenerator/Enums/java5WithClashingConstants/test.xsd (revision 0) +++ xmlctf/tests/MasterTestSuite/sourcegenerator/Enums/java5WithClashingConstants/test.xsd (revision 0) @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Index: xmlctf/tests/MasterTestSuite/sourcegenerator/Enums/java5WithClashingConstants/TestDescriptor.xml =================================================================== --- xmlctf/tests/MasterTestSuite/sourcegenerator/Enums/java5WithClashingConstants/TestDescriptor.xml (revision 0) +++ xmlctf/tests/MasterTestSuite/sourcegenerator/Enums/java5WithClashingConstants/TestDescriptor.xml (revision 0) @@ -0,0 +1,24 @@ + + + Test java5style enums + Matthias Epheser + + Tests the generation and unmarshalling of java5 enums with a string value property + + basic capability + 1.5 + + test.xsd + builder.properties + Root + + Test Source Generation + input.xml + + + Test invalid input file + input_wrong.xml + true + + + Index: xmlctf/tests/MasterTestSuite/sourcegenerator/Enums/java5WithClashingConstants/input.xml =================================================================== --- xmlctf/tests/MasterTestSuite/sourcegenerator/Enums/java5WithClashingConstants/input.xml (revision 0) +++ xmlctf/tests/MasterTestSuite/sourcegenerator/Enums/java5WithClashingConstants/input.xml (revision 0) @@ -0,0 +1,6 @@ + + + A + 5 + Index: xmlctf/tests/MasterTestSuite/sourcegenerator/Enums/java5_defaultWithClashes/output.xml =================================================================== --- xmlctf/tests/MasterTestSuite/sourcegenerator/Enums/java5_defaultWithClashes/output.xml (revision 0) +++ xmlctf/tests/MasterTestSuite/sourcegenerator/Enums/java5_defaultWithClashes/output.xml (revision 0) @@ -0,0 +1,5 @@ + + + Medium + Index: xmlctf/tests/MasterTestSuite/sourcegenerator/Enums/java5_defaultWithClashes/builder.properties =================================================================== --- xmlctf/tests/MasterTestSuite/sourcegenerator/Enums/java5_defaultWithClashes/builder.properties (revision 0) +++ xmlctf/tests/MasterTestSuite/sourcegenerator/Enums/java5_defaultWithClashes/builder.properties (revision 0) @@ -0,0 +1 @@ +org.exolab.castor.builder.javaVersion=5.0 Index: xmlctf/tests/MasterTestSuite/sourcegenerator/Enums/java5_defaultWithClashes/test.xsd =================================================================== --- xmlctf/tests/MasterTestSuite/sourcegenerator/Enums/java5_defaultWithClashes/test.xsd (revision 0) +++ xmlctf/tests/MasterTestSuite/sourcegenerator/Enums/java5_defaultWithClashes/test.xsd (revision 0) @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + Index: xmlctf/tests/MasterTestSuite/sourcegenerator/Enums/java5_defaultWithClashes/TestDescriptor.xml =================================================================== --- xmlctf/tests/MasterTestSuite/sourcegenerator/Enums/java5_defaultWithClashes/TestDescriptor.xml (revision 0) +++ xmlctf/tests/MasterTestSuite/sourcegenerator/Enums/java5_defaultWithClashes/TestDescriptor.xml (revision 0) @@ -0,0 +1,20 @@ + + + Test java5style enums with default value + Matthias Epheser + + Tests the generation and unmarshalling of java5 enums with a default value + + basic capability + 1.5 + + test.xsd + builder.properties + Root + + Test Source Generation + input.xml + output.xml + + + Index: xmlctf/tests/MasterTestSuite/sourcegenerator/Enums/java5_defaultWithClashes/input.xml =================================================================== --- xmlctf/tests/MasterTestSuite/sourcegenerator/Enums/java5_defaultWithClashes/input.xml (revision 0) +++ xmlctf/tests/MasterTestSuite/sourcegenerator/Enums/java5_defaultWithClashes/input.xml (revision 0) @@ -0,0 +1,4 @@ + + + Index: codegen/src/main/java/org/exolab/castor/builder/factory/EnumerationFactory.java =================================================================== --- codegen/src/main/java/org/exolab/castor/builder/factory/EnumerationFactory.java (revision 8018) +++ codegen/src/main/java/org/exolab/castor/builder/factory/EnumerationFactory.java (working copy) @@ -16,6 +16,7 @@ package org.exolab.castor.builder.factory; import java.util.Enumeration; +import java.util.HashSet; import org.exolab.castor.builder.AnnotationBuilder; import org.exolab.castor.builder.BuilderConfiguration; @@ -55,6 +56,11 @@ public final class EnumerationFactory extends BaseFactory { /** + * Length of the defaul tmember name. + */ + private static final int DEFAULT_MEMBER_NAME_LENGTH = 32; + + /** * The TypeConversion instance to use for mapping SimpleTypes into XSTypes. */ private TypeConversion _typeConversion; @@ -77,6 +83,11 @@ private int _maxEnumerationsPerClass; /** + * Describes whether the generated symbols should not be uppercased. + */ + private boolean _shouldNotUpperCase = false; + + /** * Creates a new EnumerationFactory for the builder configuration given. * @param config the current BuilderConfiguration instance. * @param groupNaming The group naming scheme to be used. @@ -138,9 +149,9 @@ return; } - JField field = null; - JField fHash = new JField( - SGTypes.createHashtable(getConfig().useJava50()), "_memberTable"); + JField field = null; + JField fHash = new JField(SGTypes.createHashtable(getConfig() + .useJava50()), "_memberTable"); fHash.setInitString("init()"); fHash.getModifiers().setStatic(true); @@ -165,7 +176,7 @@ int count = 0; while (enumeration.hasMoreElements()) { - Facet facet = (Facet) enumeration.nextElement(); + Facet facet = enumeration.nextElement(); String value = facet.getValue(); @@ -173,7 +184,7 @@ String objName = null; if (useValuesAsName) { - objName = translateEnumValueToIdentifier(component.getEnumBinding(), facet); + objName = translateEnumValueToIdentifier(component.getEnumBinding(), facet, true); } else { objName = "VALUE_" + count; } @@ -213,7 +224,7 @@ modifiers.setStatic(true); modifiers.makePublic(); - StringBuilder init = new StringBuilder(32); + StringBuilder init = new StringBuilder(DEFAULT_MEMBER_NAME_LENGTH); init.append("new "); init.append(className); init.append("("); @@ -240,7 +251,7 @@ if (generateConstantDefinitions) { jsc.append(objName); } else { - StringBuilder init = new StringBuilder(32); + StringBuilder init = new StringBuilder(DEFAULT_MEMBER_NAME_LENGTH); init.append("new "); init.append(className); init.append("("); @@ -278,6 +289,14 @@ createGetTypeMethod(jClass, className); } //-- processEnumerationAsNewObject + /** + * Creates a Java 5 enum instance for an enumerated simple type. + * @param simpleType The (enumerated) SimpleType instance. + * @param state State of this factory. + * @param component {@link XMLBindingComponent} instance used for bindings. + * @param useValuesAsName True if values should be used as names. + * @param enumeration The enumeration facets. + */ private void createJava5Enum(final SimpleType simpleType, final FactoryState state, final XMLBindingComponent component, final boolean useValuesAsName, final Enumeration enumeration) { @@ -339,11 +358,11 @@ int enumCount = 0; while (enumeration.hasMoreElements()) { - Facet facet = (Facet) enumeration.nextElement(); + Facet facet = enumeration.nextElement(); JEnumConstant enumConstant; if (useValuesAsName) { enumConstant = new JEnumConstant( - translateEnumValueToIdentifier(component.getEnumBinding(), facet), + translateEnumValueToIdentifier(component.getEnumBinding(), facet, true), new String[]{"\"" + facet.getValue() + "\""}); } else { enumConstant = new JEnumConstant( @@ -403,29 +422,44 @@ return "init" + index; } + /** + * Selects naming scheme for enum constant definitions. + * @param component {@link XMLBindingComponent} instance used to derive a binding if specified. + * @param enumeration Enumeration of facets. + * @param useValuesAsName True if value should be used as constant name. + * @return true if ??? + */ private boolean selectNamingScheme(final XMLBindingComponent component, final Enumeration enumeration, final boolean useValuesAsName) { - boolean duplicateTranslation = false; - short numberOfTranslationToSpecialCharacter = 0; + int numSymbols = 0; + HashSet upperCaseSymbols = new HashSet(); + HashSet symbols = new HashSet(); while (enumeration.hasMoreElements()) { Facet facet = enumeration.nextElement(); - String possibleId = translateEnumValueToIdentifier(component.getEnumBinding(), facet); - if (possibleId.equals("_")) { - numberOfTranslationToSpecialCharacter++; - if (numberOfTranslationToSpecialCharacter > 1) { - duplicateTranslation = true; - } - } + EnumBindingType enumBinding = component.getEnumBinding(); + String possibleId = translateEnumValueToIdentifier(enumBinding, facet, true); + upperCaseSymbols.add(possibleId); + symbols.add(translateEnumValueToIdentifier(enumBinding, facet, false)); + numSymbols++; if (!getJavaNaming().isValidJavaIdentifier(possibleId)) { return false; } } - if (duplicateTranslation) { + // if the two sets differ in size, then we have a case clash here. + // i.e. a duplicate naming that can be resolved by keeping the case. + if (symbols.size() != upperCaseSymbols.size()) { + _shouldNotUpperCase = true; + } + + // if the size of the set of symbols does not equal our + // counted symbols, we have a duplicate naming. + if (symbols.size() != numSymbols) { return false; } + return useValuesAsName; } @@ -603,7 +637,7 @@ StringBuilder values = new StringBuilder("{\n"); while (enumeration.hasMoreElements()) { - Facet facet = (Facet) enumeration.nextElement(); + Facet facet = enumeration.nextElement(); String value = facet.getValue(); //-- Should we make sure the value is valid before proceeding?? @@ -669,12 +703,15 @@ * * @param enumBinding if not null, a possible custom binding for this enum * @param facet the facet whose enum value is being translated. + * @param upperCase controls whether the generated symbol gets uppercased. + * Overridden by this.shouldNotUpperCase. * @return the identifier for the enum value * * @author rhett-sutphin@uiowa.edu */ private String translateEnumValueToIdentifier(final EnumBindingType enumBinding, - final Facet facet) { + final Facet facet, + final boolean upperCase) { String enumValue = facet.getValue(); try { @@ -703,7 +740,7 @@ // just keep going } - StringBuilder sb = new StringBuilder(32); + StringBuilder sb = new StringBuilder(DEFAULT_MEMBER_NAME_LENGTH); String customMemberName = null; if (enumBinding != null) { @@ -713,7 +750,11 @@ if (customMemberName != null) { sb.append(customMemberName); } else { - sb.append(enumValue.toUpperCase()); + if (upperCase && !_shouldNotUpperCase) { + sb.append(enumValue.toUpperCase()); + } else { + sb.append(enumValue); + } int i = 0; while (i < sb.length()) { char c = sb.charAt(i);