/*******************************************************************************
* Copyright (c) 2008 Hallvard Traetteberg.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Hallvard Traetteberg - initial API and implementation
******************************************************************************/
package org.eclipse.e4.tm.stringconverters;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.e4.tm.builder.AbstractBuilder;
import org.eclipse.e4.tm.stringconverter.AbstractStringConverter;
import org.eclipse.e4.tm.stringconverter.StringConverterContext;
public class ValueOfStringConverter extends AbstractStringConverter {
private static Map<Object, Object> parseMethods = new HashMap<Object, Object>();
private static Class<?>[] argClasses = {String.class};
private static Object[] args = new Object[1];
public static Method getParseMethod(Class<?> klass) {
Object o = ValueOfStringConverter.parseMethods.get(klass);
if (o instanceof Method) {
return (Method)o;
} else if (o != null) {
return null;
}
Method m = null;
try {
m = ClassStringConverter.getObjectClass(klass).getMethod("valueOf", ValueOfStringConverter.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 = ClassStringConverter.getObjectClass(klass).getMethod("parse" + AbstractBuilder.casify(name, Boolean.TRUE), ValueOfStringConverter.argClasses);
} catch (SecurityException e) {
} catch (NoSuchMethodException e) {
}
}
if (m != null) {
ValueOfStringConverter.parseMethods.put(klass, m);
}
return m;
}
private static boolean hasParseMethod(Class<?> klass) {
return ValueOfStringConverter.getParseMethod(klass) != null;
}
public static <T> Constructor<T> getConstructor(Class<T> klass) {
Object o = ValueOfStringConverter.parseMethods.get(klass);
if (o instanceof Constructor) {
return (Constructor<T>)o;
} else if (o != null) {
return null;
}
Constructor<T> cons = null;
try {
cons = ClassStringConverter.getObjectClass(klass).getConstructor(ValueOfStringConverter.argClasses);
} catch (SecurityException e) {
} catch (NoSuchMethodException e) {
}
if (cons != null) {
ValueOfStringConverter.parseMethods.put(klass, cons);
}
return cons;
}
private static boolean hasConstructor(Class<?> klass) {
return ValueOfStringConverter.getConstructor(klass) != null;
}
public static boolean supportsClass(Class<?> klass) {
return ValueOfStringConverter.hasParseMethod(klass) || ValueOfStringConverter.hasConstructor(klass);
}
public <T> T convert(String source, Class<T> klass, StringConverterContext stringConverter) {
ValueOfStringConverter.args[0] = source;
try {
Method m = ValueOfStringConverter.getParseMethod(klass);
if (m != null) {
return (T)m.invoke(null, ValueOfStringConverter.args);
} else if (klass.getName().startsWith("java.")) {
Constructor<T> cons = ValueOfStringConverter.getConstructor(klass);
if (cons != null) {
return cons.newInstance(ValueOfStringConverter.args);
}
}
}
catch (IllegalArgumentException e) {
} catch (IllegalAccessException e) {
} catch (InvocationTargetException e) {
} catch (InstantiationException e) {
}
return null;
}
}