package com.swtworkbench.community.xswt.dataparser.parsers;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import com.swtworkbench.community.xswt.XSWT;
import com.swtworkbench.community.xswt.XSWTException;
import com.swtworkbench.community.xswt.dataparser.IDataParserContext;
import com.swtworkbench.community.xswt.dataparser.NonDisposableDataParser;
public class NewInstanceDataParser extends NonDisposableDataParser {
private static Map constructors = new HashMap();
private static Class[] argClasses = {String.class};
private static Object[] args = new Object[1];
public static Constructor getConstructor(Class klass) {
Constructor cons = (Constructor)constructors.get(klass);
if (cons != null) {
return cons;
}
if (cons == null) {
try {
cons = ClassDataParser.getObjectClass(klass).getConstructor(argClasses);
} catch (SecurityException e) {
} catch (NoSuchMethodException e) {
}
}
if (cons == null) {
Constructor[] conses = klass.getConstructors();
for (int i = 0; i < conses.length; i++) {
if (conses[i].getParameterTypes().length == 1) {
cons = conses[i];
break;
}
}
}
if (cons != null) {
constructors.put(klass, cons);
}
return cons;
}
public static boolean hasConstructor(Class klass) {
return getConstructor(klass) != null;
}
public Object parse(String source, Class klass, IDataParserContext context) throws XSWTException {
Constructor cons = getConstructor(klass);
if (cons != null) {
args[0] = context.parse(source, cons.getParameterTypes()[0]);
try {
return cons.newInstance(args);
} catch (InstantiationException e) {
} catch (IllegalArgumentException e) {
} catch (IllegalAccessException e) {
} catch (InvocationTargetException e) {
}
}
return null;
}
}