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 |
} |