Project

General

Profile

Download (2.18 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
 * 
3
 */
4
package eu.etaxonomy.taxeditor.singlesource;
5

    
6
import java.lang.reflect.Constructor;
7
import java.lang.reflect.InvocationTargetException;
8
import java.util.ArrayList;
9

    
10
import org.apache.log4j.Logger;
11

    
12
/**
13
 * @author Lutz Suhrbier
14
 * 
15
 */
16
public class ImplementationLoader {
17
	private static final Logger logger = Logger.getLogger(ImplementationLoader.class);
18

    
19
	public static Object newInstance(final Class<?> type, final Object... parameter) {
20
		String className = type.getName() + "Impl";
21
		Object result = null;
22
		logger.debug("Loading class " + className);
23
		Class clazz;
24
		try {
25
			clazz = type.getClassLoader().loadClass(className);
26

    
27
			if (parameter.length > 0) {
28
				ArrayList<Class<?>> parameterList = new ArrayList<Class<?>>();
29
				for (Object o : parameter) {
30
					parameterList.add(o.getClass());
31
				}
32
				Class<?>[] parameterTypes = (Class<?>[]) parameterList.toArray(new Class<?>[parameter.length]);
33
				Constructor constructor = getPossibleConstructor(clazz,	parameterTypes);
34
				if (constructor == null) {
35
					logger.error("No constructor found for class " +  className +".");
36
					logger.error("ParameterTypes:");
37
					for (Class<?> c: parameterTypes) {
38
						logger.debug(c.getName());
39
					}
40
				}
41
				else
42
					logger.debug("Constructor " + constructor + " found for class " +  className);
43

    
44
			result = constructor.newInstance(parameter);
45
			} else
46
				result = clazz.newInstance();
47
		} catch (IllegalArgumentException e) {
48
			e.printStackTrace();
49
		} catch (InstantiationException e) {
50
			e.printStackTrace();
51
		} catch (IllegalAccessException e) {
52
			e.printStackTrace();
53
		} catch (InvocationTargetException e) {
54
			e.printStackTrace();
55
		} catch (ClassNotFoundException e) {
56
			e.printStackTrace();
57
		}
58
		return result;
59
	}
60

    
61
	public static Constructor getPossibleConstructor(Class motherClass,	Class[] pars) {
62

    
63
		Constructor[] ctors = motherClass.getConstructors();
64
		for (Constructor c : ctors) {
65
			Class[] cpars = c.getParameterTypes();
66
			if (cpars.length != pars.length)
67
				continue;
68
			boolean found = true;
69

    
70
			for (int i = 0; i < cpars.length; ++i) {
71
				if (!cpars[i].isAssignableFrom(pars[i])) {
72
					found = false;
73
					break;
74
				}
75
			}
76

    
77
			if (found)
78
				return c;
79
		}
80
		return null;
81
	}
82
}
    (1-1/1)