Revision 45037 trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/fmap/dal/impl/DataStoreProviderToFeatureStoreProviderFactoryWrapper.java

View differences:

DataStoreProviderToFeatureStoreProviderFactoryWrapper.java
31 31
import org.gvsig.fmap.dal.feature.spi.AbstractFeatureStoreProviderFactory;
32 32
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
33 33
import org.gvsig.tools.dynobject.DynObject;
34
import org.slf4j.Logger;
35
import org.slf4j.LoggerFactory;
34 36

  
35
public class DataStoreProviderToFeatureStoreProviderFactoryWrapper 
36
    extends AbstractFeatureStoreProviderFactory 
37
    {
37
@SuppressWarnings("UseSpecificCatch")
38
public class DataStoreProviderToFeatureStoreProviderFactoryWrapper
39
        extends AbstractFeatureStoreProviderFactory {
38 40

  
39
	private Class providerClass = null;
40
	private Class parametersClass = null;
41
    private static final Logger LOGGER = LoggerFactory.getLogger(DataStoreProviderToFeatureStoreProviderFactoryWrapper.class);
41 42

  
42
	public DataStoreProviderToFeatureStoreProviderFactoryWrapper(String name, String description,
43
			Class provider, Class parametersClass) {
44
		super(name, description);
45
		this.providerClass = provider;
46
		this.parametersClass = parametersClass;
47
	}
43
    private Class providerClass = null;
44
    private Class parametersClass = null;
48 45

  
49
	public DataStoreProvider createProvider(DataParameters parameters,
50
			DataStoreProviderServices providerServices)
51
			throws InitializeException {
52
		try {
53
			Class[] argsTypes = new Class[] { DataParameters.class,
54
					DataStoreProviderServices.class };
55
			Object[] args = new Object[] { parameters, providerServices };
46
    public DataStoreProviderToFeatureStoreProviderFactoryWrapper(String name, String description,
47
            Class provider, Class parametersClass) {
48
        super(name, description);
49
        this.providerClass = provider;
50
        this.parametersClass = parametersClass;
51
        LOGGER.warn("Creating wrapper for old style FeatureStoreProvider (" + providerClass.getName() + ").");
52
    }
56 53

  
57
			Constructor contructor;
58
			contructor = findConstructor(providerClass, argsTypes);
59
			return (DataStoreProvider) contructor.newInstance(args);
60
		} catch (Throwable e) {
61
			throw new InitializeException(e);
62
		}
63
	}
54
    @Override
55
    public DataStoreProvider createProvider(DataParameters parameters,
56
            DataStoreProviderServices providerServices)
57
            throws InitializeException {
58
        try {
59
            Class[] argsTypes = new Class[]{DataParameters.class,
60
                DataStoreProviderServices.class};
61
            Object[] args = new Object[]{parameters, providerServices};
64 62

  
65
	public final DynObject createParameters() {
66
		try {
67
			return (DynObject) parametersClass.newInstance();
68
		} catch (Exception e) {
69
			throw new RuntimeException(e);
70
		}
71
	}
72
	
73
	protected Constructor findConstructor(Class clazz, Class[] types)
74
			throws SecurityException, NoSuchMethodException {
75
		try {
76
			return clazz.getConstructor(types);
77
		} catch (NoSuchMethodException e) {
78
			// Nothing to do
79
		}
63
            Constructor contructor;
64
            contructor = findConstructor(providerClass, argsTypes);
65
            return (DataStoreProvider) contructor.newInstance(args);
66
        } catch (Throwable e) {
67
            throw new InitializeException(e);
68
        }
69
    }
80 70

  
81
		// search for the required constructor
82
		Constructor[] constrs = clazz.getConstructors();
83
		boolean allMatch;
84
		for (int i = 0; i < constrs.length; i++) {
85
			Class[] paramTypes = constrs[i].getParameterTypes();
86
			if (paramTypes.length == types.length) { // a general candidate
87
				allMatch = true;
88
				for (int j = 0; j < paramTypes.length; j++) {
89
					if (!isParameterCompatible(types[j], paramTypes[j])) {
90
						allMatch = false;
91
						break;
92
					}
93
				}
94
				if (allMatch) {
95
					return constrs[i];
96
				}
71
    @Override
72
    public final DynObject createParameters() {
73
        try {
74
            return (DynObject) parametersClass.newInstance();
75
        } catch (Exception e) {
76
            throw new RuntimeException(e);
77
        }
78
    }
97 79

  
98
			}
99
		}
100
		StringBuffer strb = new StringBuffer();
101
		strb.append(clazz.getName());
102
		strb.append('(');
103
		if (types.length > 0) {
104
			for (int i = 0; i < types.length - 1; i++) {
105
				strb.append(types[i].getName());
106
				strb.append(',');
107
			}
108
			strb.append(types[types.length - 1].getName());
109
		}
110
		strb.append(')');
111
		throw new NoSuchMethodException(strb.toString());
112
	}
80
    protected Constructor findConstructor(Class clazz, Class[] types)
81
            throws SecurityException, NoSuchMethodException {
82
        try {
83
            return clazz.getConstructor(types);
84
        } catch (NoSuchMethodException e) {
85
            // Nothing to do
86
        }
113 87

  
114
	private boolean isParameterCompatible(Class current, Class defined) {
115
		if (current == null) {
116
			return !defined.isPrimitive();
117
		} else {
118
			return current.isAssignableFrom(defined);
119
		}
120
	}
88
        // search for the required constructor
89
        Constructor[] constrs = clazz.getConstructors();
90
        boolean allMatch;
91
        for (Constructor constr : constrs) {
92
            Class[] paramTypes = constr.getParameterTypes();
93
            if (paramTypes.length == types.length) {
94
                // a general candidate
95
                allMatch = true;
96
                for (int j = 0; j < paramTypes.length; j++) {
97
                    if (!isParameterCompatible(types[j], paramTypes[j])) {
98
                        allMatch = false;
99
                        break;
100
                    }
101
                }
102
                if (allMatch) {
103
                    return constr;
104
                }
105
            }
106
        }
107
        StringBuilder strb = new StringBuilder();
108
        strb.append(clazz.getName());
109
        strb.append('(');
110
        if (types.length > 0) {
111
            for (int i = 0; i < types.length - 1; i++) {
112
                strb.append(types[i].getName());
113
                strb.append(',');
114
            }
115
            strb.append(types[types.length - 1].getName());
116
        }
117
        strb.append(')');
118
        throw new NoSuchMethodException(strb.toString());
119
    }
120

  
121
    private boolean isParameterCompatible(Class current, Class defined) {
122
        if (current == null) {
123
            return !defined.isPrimitive();
124
        } else {
125
            return current.isAssignableFrom(defined);
126
        }
127
    }
121 128
}

Also available in: Unified diff