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);