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_getRelatedFeature.java @ 42775

History | View | Annotate | Download (4.43 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.FeatureSet;
11
import org.gvsig.fmap.dal.feature.FeatureStore;
12
import org.gvsig.tools.dispose.DisposableIterator;
13
import org.gvsig.tools.dispose.DisposeUtils;
14
import org.gvsig.tools.dynobject.AbstractDynMethod;
15
import org.gvsig.tools.dynobject.DynField_v2;
16
import org.gvsig.tools.dynobject.DynObject;
17
import org.gvsig.tools.dynobject.exception.DynMethodException;
18

    
19
public class DALLink_getRelatedFeature extends AbstractDynMethod {
20
    private static final String DAL_code = "DAL.code";
21
    private static final String DAL_foreingTable = "DAL.foreingTable";
22
    private static final String DAL_foreingCode = "DAL.foreingCode";
23
 
24

    
25
    public DALLink_getRelatedFeature() {
26
        super("DAL.getRelatedFeature","Retrieve the element of the other side of the relation.");
27
    }
28

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

    
34
        DynField_v2 field = (DynField_v2) args[0];
35
        String codeName = (String) field.getTags().get(DAL_code);
36
        String foreignTableName = (String) field.getTags().get(DAL_foreingTable);
37
        String foreignCodeName = (String) field.getTags().get(DAL_foreingCode);
38

    
39
        Feature feature = ((FacadeOfAFeature) self).getFeature();
40
        return getRelatedFeature(feature, codeName, foreignTableName, foreignCodeName);
41
    }
42

    
43
    private DynObject getRelatedFeature(Feature feature, String attrName, String otherStoreName, String otherAttrName) throws ComputeRelatedFeatureException {
44
        Object fkValue = "<unknow>";
45
        FeatureSet set = null;
46
        DisposableIterator it = null;
47
        try {
48
            FeatureStore store = feature.getStore();
49

    
50
            DataManager manager = DALLocator.getDataManager();
51
            FeatureAttributeDescriptor attrdesc = feature.getType().getAttributeDescriptor(attrName);
52

    
53
            DataStoreParameters foreignStoreParmeters = store.getExplorer().get(otherStoreName);
54
            FeatureStore foreignStore = (FeatureStore) manager.openStore(store.getProviderName(), foreignStoreParmeters);
55
            FeatureQuery query = foreignStore.createFeatureQuery();
56
            fkValue = feature.get(attrName);
57
            if (attrdesc.getDataType().isNumeric()) {
58
                fkValue = fkValue.toString();
59
            } else {
60
                fkValue = "'" + fkValue.toString().replace("'", "''") + "'";
61
            }
62
            String where = otherAttrName + " = " + fkValue;
63
            query.addFilter(manager.createExpresion(where));
64
            set = foreignStore.getFeatureSet(query);
65
            if( set.getSize()!= 1 ) {
66
                throw new ComputeRelatedFeatureException(otherStoreName, otherAttrName, fkValue.toString());
67
            }
68
            it = set.fastIterator();
69
            Feature otherFeature = (Feature) it.next();
70
            return otherFeature.getAsDynObject();
71
        } catch (Exception ex) {
72
            throw new ComputeRelatedFeatureException(otherStoreName, otherAttrName, fkValue.toString(), ex);
73
        } finally {
74
            DisposeUtils.disposeQuietly(it);
75
            DisposeUtils.disposeQuietly(set);
76
        }
77
    }
78

    
79
    private static class ComputeRelatedFeatureException extends DynMethodException {
80

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

    
85
        public ComputeRelatedFeatureException(String storename, String attrname, String attrvalue) {
86
            super(MESSAGE_FORMAT, MESSAGE_KEY, serialVersionUID);
87
            setValue("storename", storename);
88
            setValue("attrname", attrname);
89
            setValue("attrvalue", attrvalue);
90
        }
91

    
92
        public ComputeRelatedFeatureException(String storename, String attrname, String attrvalue, Throwable cause) {
93
            this(storename,attrname, attrvalue);
94
            this.initCause(cause);
95
        }
96
    }
97

    
98
}