Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.spi / src / main / java / org / gvsig / fmap / dal / feature / spi / DataStoreProviderToFeatureStoreProviderFactoryWrapper.java @ 40435

History | View | Annotate | Download (2.82 KB)

1
package org.gvsig.fmap.dal.feature.spi;
2

    
3
import java.lang.reflect.Constructor;
4

    
5
import org.gvsig.fmap.dal.DataParameters;
6
import org.gvsig.fmap.dal.DataStoreProvider;
7
import org.gvsig.fmap.dal.exception.InitializeException;
8
import org.gvsig.fmap.dal.feature.FeatureStoreProviderFactory;
9
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
10
import org.gvsig.tools.dynobject.DynObject;
11

    
12
public class DataStoreProviderToFeatureStoreProviderFactoryWrapper extends
13
                AbstractFeatureStoreProviderFactory implements FeatureStoreProviderFactory {
14

    
15
        private Class providerClass = null;
16
        private Class parametersClass = null;
17

    
18
        public DataStoreProviderToFeatureStoreProviderFactoryWrapper(String name, String description,
19
                        Class provider, Class parametersClass) {
20
                super(name, description);
21
                this.providerClass = provider;
22
                this.parametersClass = parametersClass;
23
        }
24

    
25
        public DataStoreProvider createProvider(DataParameters parameters,
26
                        DataStoreProviderServices providerServices)
27
                        throws InitializeException {
28
                try {
29
                        Class[] argsTypes = new Class[] { DataParameters.class,
30
                                        DataStoreProviderServices.class };
31
                        Object[] args = new Object[] { parameters, providerServices };
32

    
33
                        Constructor contructor;
34
                        contructor = findConstructor(providerClass, argsTypes);
35
                        return (DataStoreProvider) contructor.newInstance(args);
36
                } catch (Throwable e) {
37
                        throw new InitializeException(e);
38
                }
39
        }
40

    
41
        public final DynObject createParameters() {
42
                try {
43
                        return (DynObject) parametersClass.newInstance();
44
                } catch (Exception e) {
45
                        throw new RuntimeException(e);
46
                }
47
        }
48
        
49
        protected Constructor findConstructor(Class clazz, Class[] types)
50
                        throws SecurityException, NoSuchMethodException {
51
                try {
52
                        return clazz.getConstructor(types);
53
                } catch (NoSuchMethodException e) {
54
                        // Nothing to do
55
                }
56

    
57
                // search for the required constructor
58
                Constructor[] constrs = clazz.getConstructors();
59
                boolean allMatch;
60
                for (int i = 0; i < constrs.length; i++) {
61
                        Class[] paramTypes = constrs[i].getParameterTypes();
62
                        if (paramTypes.length == types.length) { // a general candidate
63
                                allMatch = true;
64
                                for (int j = 0; j < paramTypes.length; j++) {
65
                                        if (!isParameterCompatible(types[j], paramTypes[j])) {
66
                                                allMatch = false;
67
                                                break;
68
                                        }
69
                                }
70
                                if (allMatch) {
71
                                        return constrs[i];
72
                                }
73

    
74
                        }
75
                }
76
                StringBuffer strb = new StringBuffer();
77
                strb.append(clazz.getName());
78
                strb.append('(');
79
                if (types.length > 0) {
80
                        for (int i = 0; i < types.length - 1; i++) {
81
                                strb.append(types[i].getName());
82
                                strb.append(',');
83
                        }
84
                        strb.append(types[types.length - 1].getName());
85
                }
86
                strb.append(')');
87
                throw new NoSuchMethodException(strb.toString());
88
        }
89

    
90
        private boolean isParameterCompatible(Class current, Class defined) {
91
                if (current == null) {
92
                        return !defined.isPrimitive();
93
                } else {
94
                        return current.isAssignableFrom(defined);
95
                }
96
        }
97
}