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 ValueOfDataParser extends NonDisposableDataParser { private static Map parseMethods = new HashMap(); private static Class[] argClasses = {String.class}; private static Object[] args = new Object[1]; public static Method getParseMethod(Class klass) { Object o = parseMethods.get(klass); if (o instanceof Method) { return (Method)o; } else if (o != null) { return null; } Method m = null; try { m = ClassDataParser.getObjectClass(klass).getMethod("valueOf", argClasses); } catch (SecurityException e) { } catch (NoSuchMethodException e) { } if (m == null) { try { String name = klass.getName(); int pos = name.lastIndexOf('.'); if (pos >= 0) { name = name.substring(pos + 1); } m = ClassDataParser.getObjectClass(klass).getMethod("parse" + XSWT.upperCaseFirstLetter(name), argClasses); } catch (SecurityException e) { } catch (NoSuchMethodException e) { } } if (m != null) { parseMethods.put(klass, m); } return m; } private static boolean hasParseMethod(Class klass) { return getParseMethod(klass) != null; } public static Constructor getConstructor(Class klass) { Object o = parseMethods.get(klass); if (o instanceof Constructor) { return (Constructor)o; } else if (o != null) { return null; } Constructor cons = null; try { cons = ClassDataParser.getObjectClass(klass).getConstructor(argClasses); } catch (SecurityException e) { } catch (NoSuchMethodException e) { } if (cons != null) { parseMethods.put(klass, cons); } return cons; } private static boolean hasConstructor(Class klass) { return getConstructor(klass) != null; } public static boolean supportsClass(Class klass) { return hasParseMethod(klass) || hasConstructor(klass); } public Object parse(String source, Class klass, IDataParserContext context) throws XSWTException { args[0] = source; try { Method m = getParseMethod(klass); if (m != null) { return m.invoke(null, args); } else if (klass.getName().startsWith("java.")) { Constructor cons = getConstructor(klass); if (cons != null) { return cons.newInstance(args); } } } catch (IllegalArgumentException e) { } catch (IllegalAccessException e) { } catch (InvocationTargetException e) { } catch (InstantiationException e) { } return null; } }