jsc.add("this.type = type;");
jsc.add("this.stringValue = value;");
//-- #valueOf method
JMethod mValueOf = new JMethod(jClass, "valueOf");
mValueOf.addParameter(new JParameter(SGTypes.String, "string"));
mValueOf.getModifiers().setStatic(true);
jClass.addMethod(mValueOf);
jdc = mValueOf.getJDocComment();
jdc.appendComment("Returns a new " + className);
jdc.appendComment(" based on the given String value.");
jsc = mValueOf.getSourceCode();
jsc.add("java.lang.Object obj = null;");
jsc.add("if (string != null) ");
jsc.append("obj = _memberTable.get(string);");
jsc.add("if (obj == null) {");
jsc.indent();
jsc.add("String err = \"'\" + string + \"' is not a valid ");
jsc.append(className);
jsc.append("\";");
jsc.add("throw new IllegalArgumentException(err);");
jsc.unindent();
jsc.add("}");
jsc.add("return (");
jsc.append(className);
jsc.append(") obj;");
//-- #enumerate method
JMethod mEnumerate = new JMethod(SGTypes.Enumeration, "enumerate");
mEnumerate.getModifiers().setStatic(true);
jClass.addMethod(mEnumerate);
jdc = mEnumerate.getJDocComment();
jdc.appendComment("Returns an enumeration of all possible instances of ");
jdc.appendComment(className);
mEnumerate.getSourceCode().add("return _memberTable.elements();");
//-- #toString method
JMethod mToString = new JMethod(SGTypes.String, "toString");
jClass.addMethod(mToString);
jdc = mToString.getJDocComment();
jdc.appendComment("Returns the String representation of this ");
jdc.appendComment(className);
mToString.getSourceCode().add("return this.stringValue;");
//-- #init method
JMethod mInit = new JMethod(SGTypes.Hashtable, "init");
jClass.addMethod(mInit);
mInit.getModifiers().makePrivate();
mInit.getModifiers().setStatic(true);
mInit.getSourceCode().add("Hashtable members = new Hashtable();");
//-- #readResolve method
JMethod mReadResolve = new JMethod(SGTypes.Object,"readResolve");
mReadResolve.getModifiers().makePrivate();
jClass.addMethod(mReadResolve);
jdc = mReadResolve.getJDocComment();
jdc.appendComment(" will be called during deserialization to replace ");
jdc.appendComment("the deserialized object with the correct constant ");
jdc.appendComment("instance. <br/>");
jsc = mReadResolve.getSourceCode();
jsc.add("return valueOf(this.stringValue);");
//-- Loop through "enumeration" facets
int count = 0;
while (enumeration.hasMoreElements()) {
Facet facet = (Facet) enumeration.nextElement();
String value = facet.getValue();
String typeName = null;
String objName = null;
if (useValuesAsName) objName = translateEnumValueToIdentifier(value);
else objName = "VALUE_" + count;
//-- create typeName
//-- Note: this could cause name conflicts
typeName = objName + "_TYPE";
//-- Inheritence/Duplicate name cleanup
boolean addInitializerCode = true;
if (jClass.getField(objName) != null) {
//-- either inheritence, duplicate name, or error.
//-- if inheritence or duplicate name, always take
//-- the later definition. Do same if error, for now.
jClass.removeField(objName);
jClass.removeField(typeName);
addInitializerCode = false;
}
//-- handle int type
field = new JField(JType.Int, typeName);
field.setComment("The " + value + " type");
JModifiers modifiers = field.getModifiers();
modifiers.setFinal(true);
modifiers.setStatic(true);
modifiers.makePublic();
field.setInitString(Integer.toString(count));
jClass.addField(field);
//-- handle Class type
field = new JField(jClass, objName);
field.setComment("The instance of the " + value + " type");
modifiers = field.getModifiers();
modifiers.setFinal(true);
modifiers.setStatic(true);
modifiers.makePublic();
StringBuffer init = new StringBuffer();
init.append("new ");
init.append(className);
init.append("(");
init.append(typeName);
init.append(", \"");
init.append(escapeValue(value));
init.append("\")");
field.setInitString(init.toString());
jClass.addField(field);
//-- initializer method
if (addInitializerCode) {
jsc = mInit.getSourceCode();
jsc.add("members.put(\"");
jsc.append(escapeValue(value));
jsc.append("\", ");
jsc.append(objName);
jsc.append(");");
}
++count;
}
//-- finish init method
mInit.getSourceCode().add("return members;");
//-- add memberTable to the class, we can only
//-- add this after all the types, or we'll
//-- create source code that will generate
//-- null pointer exceptions, because calling
//-- init() will try to add null values to
//-- the hashtable.
jClass.addField(fHash);
//-- add internal type
field = new JField(JType.Int, "type");
field.setInitString("-1");
jClass.addField(field);
//-- add internal stringValue
field = new JField(SGTypes.String, "stringValue");
field.setInitString("null");
jClass.addField(field);
//-- add #getType method
JMethod mGetType = new JMethod(JType.Int, "getType");
mGetType.getSourceCode().add("return this.type;");
jdc = mGetType.getJDocComment();
jdc.appendComment("Returns the type of this " + className);
jClass.addMethod(mGetType);