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