Statistics
| Revision:

svn-gvsig-desktop / branches / v2_0_0_prep / libraries / libFMap_dal / src / org / gvsig / fmap / dal / feature / spi / BaseFeatureStoreProviderFactory.java @ 36202

History | View | Annotate | Download (2.92 KB)

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

    
3
import java.lang.reflect.Constructor;
4
import java.util.List;
5

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

    
14
public class BaseFeatureStoreProviderFactory extends
15
                AbstractDataStoreProviderFactory implements FeatureStoreProviderFactory {
16

    
17
        private Class providerClass = null;
18
        private Class parametersClass = null;
19

    
20
        public BaseFeatureStoreProviderFactory(String name, String description,
21
                        Class provider, Class parametersClass) {
22
                super(name, description);
23
                this.providerClass = provider;
24
                this.parametersClass = parametersClass;
25
        }
26

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

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

    
43
        public final DynObject createParameters() {
44
                try {
45
                        return (DynObject) parametersClass.newInstance();
46
                } catch (Exception e) {
47
                        throw new RuntimeException(e);
48
                }
49
        }
50
        
51
        public List getGeomtriesSupporteds() {
52
                return null;
53
        }
54

    
55
        protected Constructor findConstructor(Class clazz, Class[] types)
56
                        throws SecurityException, NoSuchMethodException {
57
                try {
58
                        return clazz.getConstructor(types);
59
                } catch (NoSuchMethodException e) {
60
                        // Nothing to do
61
                }
62

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

    
80
                        }
81
                }
82
                StringBuffer strb = new StringBuffer();
83
                strb.append(clazz.getName());
84
                strb.append('(');
85
                if (types.length > 0) {
86
                        for (int i = 0; i < types.length - 1; i++) {
87
                                strb.append(types[i].getName());
88
                                strb.append(',');
89
                        }
90
                        strb.append(types[types.length - 1].getName());
91
                }
92
                strb.append(')');
93
                throw new NoSuchMethodException(strb.toString());
94
        }
95

    
96
        private boolean isParameterCompatible(Class current, Class defined) {
97
                if (current == null) {
98
                        return !defined.isPrimitive();
99
                } else {
100
                        return defined.isAssignableFrom(current);
101
                }
102
        }
103

    
104
}