/******************************************************************************* * 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.util.HashMap; import java.util.Map; import org.eclipse.e4.tm.stringconverter.AbstractStringConverter; import org.eclipse.e4.tm.stringconverter.StringConverterContext; public class NewInstanceStringConverter extends AbstractStringConverter { private static Map<Class<?>, Constructor<?>> constructors = new HashMap<Class<?>, Constructor<?>>(); private static Class[] argClasses = {String.class}; private static Object[] args = new Object[1]; public static <T> Constructor<T> getConstructor(Class<T> klass) { Constructor<T> cons = (Constructor<T>)NewInstanceStringConverter.constructors.get(klass); if (cons != null) { return cons; } if (cons == null) { try { cons = ClassStringConverter.getObjectClass(klass).getConstructor(NewInstanceStringConverter.argClasses); } catch (SecurityException e) { } catch (NoSuchMethodException e) { } } if (cons == null) { Constructor<T>[] conses = (Constructor<T>[]) klass.getConstructors(); for (int i = 0; i < conses.length; i++) { if (conses[i].getParameterTypes().length == 1) { cons = conses[i]; break; } } } if (cons != null) { NewInstanceStringConverter.constructors.put(klass, cons); } return cons; } public static boolean hasConstructor(Class<?> klass) { return NewInstanceStringConverter.getConstructor(klass) != null; } public <T> T convert(String source, Class<T> klass, StringConverterContext stringConverter) { Constructor<T> cons = NewInstanceStringConverter.getConstructor(klass); if (cons != null) { try { NewInstanceStringConverter.args[0] = stringConverter.convert(source, cons.getParameterTypes()[0]); return cons.newInstance(NewInstanceStringConverter.args); } catch (Exception e) { } } return null; } }