You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by bu...@apache.org on 2003/10/31 01:20:27 UTC
DO NOT REPLY [Bug 24272] New: -
Enum/ValueEnum class needs functionality to load values from a properties file
DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://nagoya.apache.org/bugzilla/show_bug.cgi?id=24272>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND
INSERTED IN THE BUG DATABASE.
http://nagoya.apache.org/bugzilla/show_bug.cgi?id=24272
Enum/ValueEnum class needs functionality to load values from a properties file
Summary: Enum/ValueEnum class needs functionality to load values
from a properties file
Product: Commons
Version: 2.0 Final
Platform: All
OS/Version: Windows XP
Status: NEW
Severity: Enhancement
Priority: Other
Component: Lang
AssignedTo: commons-dev@jakarta.apache.org
ReportedBy: sudheer_tumuluru@yahoo.com
CC: sudheer_tumuluru@yahoo.com
It would be good to have an implementation of Enum that can load the possible
values from a properties file, instead of having to change the code everytime a
new value is added. This properties file could be named the same as the Enum
class being implemented, e.g., if MyEnum.java extends Enum or ValuedEnum, it
should be able to load the values from MyEnum.properties file located in the
same directory as the class itself and be packaged in the jar along with the
class.
I took a crack at solving the problem, as follows:
import java.io.Serializable;
import java.io.InputStream;
import java.io.IOException;
import java.util.Properties;
import java.util.Iterator;
import java.util.Map;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import org.apache.commons.lang.enum.*;
public abstract class ConfigEnum extends ValuedEnum {
protected static void loadEnumConfig(Class enumClass)
throws IOException, InstantiationException,
IllegalAccessException, Throwable {
Properties p = new Properties();
String propFilename = enumClass.getName().replace('.', '/')
+ ".properties";
InputStream is = null;
ClassLoader loader = enumClass.getClassLoader();
is = ((loader != null) ? loader.getResourceAsStream(propFilename) :
ClassLoader.getSystemResourceAsStream(propFilename));
if (is == null) {
throw new RuntimeException("No such resource");
}
p.load(is);
is.close();
for(Iterator pIter = p.entrySet().iterator(); pIter.hasNext(); ) {
// Read the entries from the properties file and create Objects of
that type
Map.Entry entry = (Map.Entry) pIter.next();
int enumValue = Integer.parseInt((String) entry.getKey());
String enumStr = (String) entry.getValue();
Class[] constructorArgTypes = new Class[] { String.class,
int.class };
try {
Constructor constructor = enumClass.getConstructor
(constructorArgTypes);
Object[] constructorArgs = new Object [] { enumStr, new Integer
(enumValue) };
constructor.newInstance(constructorArgs);
} catch (NoSuchMethodException nsme) {
System.err.println("Caught Exception in loadEnumConfig: " +
nsme);
} catch (InvocationTargetException ite) {
throw ite.getTargetException();
}
}
}
protected ConfigEnum(String name, int value) {
super(name, value);
}
}
The only problem with this implementation is that it requires the MyEnum.java
class to have a public constructor with MyEnum(String, int) signature. This
defeats the very purpose of protecting creation of new values. Another solution
is to make the ConfigEnum class non-abstract, but it doesn't seem elegant or
fool-proof. Any suggestions/ideas.
Thanks.
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org