Statistics
| Revision:

svn-gvsig-desktop / 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 / feature / impl / dynobjectutils / relations / DALLink_getRelatedFeatures.java @ 42775

History | View | Annotate | Download (4.37 KB)

1
package org.gvsig.fmap.dal.feature.impl.dynobjectutils.relations;
2

    
3
import org.gvsig.fmap.dal.DALLocator;
4
import org.gvsig.fmap.dal.DataManager;
5
import org.gvsig.fmap.dal.DataStoreParameters;
6
import org.gvsig.fmap.dal.feature.Feature;
7
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
8
import org.gvsig.fmap.dal.feature.FacadeOfAFeature;
9
import org.gvsig.fmap.dal.feature.FeatureQuery;
10
import org.gvsig.fmap.dal.feature.FeatureStore;
11
import org.gvsig.fmap.dal.feature.paging.FeaturePagingHelper;
12
import org.gvsig.tools.dataTypes.CoercionException;
13
import org.gvsig.tools.dynobject.AbstractDynMethod;
14
import org.gvsig.tools.dynobject.DynField_v2;
15
import org.gvsig.tools.dynobject.DynObject;
16
import org.gvsig.tools.dynobject.exception.DynMethodException;
17
import org.gvsig.tools.dynobject.exception.DynMethodNotSupportedException;
18

    
19
public class DALLink_getRelatedFeatures extends AbstractDynMethod {
20

    
21
    private static final String DAL_code = "DAL.code";
22
    private static final String DAL_foreingTable = "DAL.foreingTable";
23
    private static final String DAL_foreingCode = "DAL.foreingCode";
24
    private static final String DAL_pageSize = "DAL.pageSize";
25

    
26

    
27
    public DALLink_getRelatedFeatures() {
28
        super("DAL.getRelatedFeatures","Retrieve a list with al elements related to this object.");
29
    }
30

    
31
    public Object invoke(DynObject self, Object[] args) throws DynMethodException {
32
        if (!(self instanceof FacadeOfAFeature)) {
33
            return null;
34
        }
35

    
36
        DynField_v2 field = (DynField_v2) args[0];
37
        String foreignCodeName = (String) field.getTags().get(DAL_foreingCode);
38
        String foreignTableName = (String) field.getTags().get(DAL_foreingTable);
39
        String codeName = (String) field.getTags().get(DAL_code);
40
        int pageSize;
41
        try {
42
            pageSize = field.getTags().getInt(DAL_pageSize);
43
        } catch (CoercionException ex) {
44
            pageSize = 100;
45
        }
46
        if (pageSize < 100) {
47
            pageSize = 100;
48
        }
49

    
50
        Feature feature = ((FacadeOfAFeature) self).getFeature();
51
        FeaturePagingHelper featurePager = getRelatedFeatures(feature, codeName, foreignTableName, foreignCodeName, pageSize);
52

    
53
        return featurePager.asListOfDynObjects();
54
    }
55

    
56
    private FeaturePagingHelper getRelatedFeatures(Feature feature, String codeName, String foreignTableName, String foreignCodeName, int pageSize) throws ComputeRelatedFeaturesException {
57
        Object fkValue = "<unknow>";
58
        try {
59
            FeatureStore store = feature.getStore();
60

    
61
            DataManager manager = DALLocator.getDataManager();
62
            FeatureAttributeDescriptor attrdesc = feature.getType().getAttributeDescriptor(codeName);
63

    
64
            DataStoreParameters foreignStoreParmeters = store.getExplorer().get(foreignTableName);
65
            FeatureStore foreignStore = (FeatureStore) manager.openStore(store.getProviderName(), foreignStoreParmeters);
66
            FeatureQuery query = foreignStore.createFeatureQuery();
67
            fkValue = feature.get(codeName);
68
            if (attrdesc.getDataType().isNumeric()) {
69
                fkValue = fkValue.toString();
70
            } else {
71
                fkValue = "'" + fkValue.toString().replace("'", "''") + "'";
72
            }
73
            String where = foreignCodeName + " = " + fkValue;
74
            query.addFilter(manager.createExpresion(where));
75
            FeaturePagingHelper featurePager = manager.createFeaturePagingHelper(foreignStore, query, pageSize);
76
            return featurePager;
77
        } catch (Exception ex) {
78
            throw new ComputeRelatedFeaturesException(foreignTableName, foreignCodeName, fkValue.toString(), ex);
79
        }
80
    }
81

    
82
    private static class ComputeRelatedFeaturesException extends DynMethodException {
83

    
84
        private final static String MESSAGE_FORMAT = "Can't retrieve relation items from %(storename)s for attribute %(attrname)s with value %(attrvalue)s.";
85
        private final static String MESSAGE_KEY = "_OneToManyMethodException";
86
        private static final long serialVersionUID = -3248317756866564508L;
87

    
88
        public ComputeRelatedFeaturesException(String storename, String attrname, String attrvalue, Throwable cause) {
89
            super(MESSAGE_FORMAT, MESSAGE_KEY, serialVersionUID);
90
            setValue("storename", storename);
91
            setValue("attrname", attrname);
92
            setValue("attrvalue", attrvalue);
93
            this.initCause(cause);
94
        }
95
    }
96

    
97
}