Revision 44376 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/impl/DefaultDataManager.java
DefaultDataManager.java | ||
---|---|---|
10 | 10 |
import java.util.HashMap; |
11 | 11 |
import java.util.List; |
12 | 12 |
import java.util.Map; |
13 |
import java.util.Objects; |
|
13 | 14 |
import org.apache.commons.io.IOUtils; |
14 | 15 |
import org.apache.commons.lang3.StringUtils; |
15 | 16 |
import org.gvsig.expressionevaluator.Expression; |
16 | 17 |
import org.gvsig.expressionevaluator.ExpressionBuilder; |
17 | 18 |
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator; |
19 |
import org.gvsig.expressionevaluator.MutableSymbolTable; |
|
18 | 20 |
import org.gvsig.fmap.dal.BaseStoresRepository; |
21 |
import org.gvsig.fmap.dal.DALLocator; |
|
19 | 22 |
|
20 | 23 |
import org.gvsig.fmap.dal.DataFactory; |
21 | 24 |
import org.gvsig.fmap.dal.DataManager; |
... | ... | |
45 | 48 |
import org.gvsig.fmap.dal.expressionevaluator.FeatureSymbolTable; |
46 | 49 |
import org.gvsig.fmap.dal.feature.DataProfile; |
47 | 50 |
import org.gvsig.fmap.dal.feature.EditableFeatureType; |
51 |
import org.gvsig.fmap.dal.feature.Feature; |
|
48 | 52 |
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor; |
49 | 53 |
import org.gvsig.fmap.dal.feature.FeatureQuery; |
50 | 54 |
import org.gvsig.fmap.dal.feature.FeatureStore; |
51 | 55 |
import org.gvsig.fmap.dal.feature.FeatureType; |
56 |
import org.gvsig.fmap.dal.feature.ForeingKey; |
|
57 |
import static org.gvsig.fmap.dal.feature.ForeingKey.MAX_AVAILABLE_VALUES; |
|
52 | 58 |
import org.gvsig.fmap.dal.feature.impl.DALFile; |
53 | 59 |
import org.gvsig.fmap.dal.feature.impl.DefaultEditableFeatureType; |
54 | 60 |
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureIndex; |
... | ... | |
78 | 84 |
import org.gvsig.tools.dataTypes.DataType; |
79 | 85 |
import org.gvsig.tools.dataTypes.DataTypesManager; |
80 | 86 |
import org.gvsig.tools.dynobject.DynObject; |
87 |
import org.gvsig.tools.dynobject.DynObjectValueItem; |
|
81 | 88 |
import org.gvsig.tools.dynobject.DynStruct; |
82 | 89 |
import org.gvsig.tools.dynobject.DynStruct_v2; |
83 | 90 |
import org.gvsig.tools.dynobject.Tags; |
... | ... | |
1103 | 1110 |
IOUtils.closeQuietly(resource); |
1104 | 1111 |
} |
1105 | 1112 |
} |
1113 |
|
|
1114 |
private Map<String,DynObjectValueItem[]> availableValues = null; |
|
1115 |
|
|
1116 |
@Override |
|
1117 |
public DynObjectValueItem[] getAvailableValues(FeatureStore myStore, FeatureAttributeDescriptor descriptor) { |
|
1118 |
String keyName = myStore.getFullName() + ":columnName=" + descriptor.getName(); |
|
1119 |
if( this.availableValues==null ) { |
|
1120 |
this.availableValues = new HashMap<>(); |
|
1121 |
} |
|
1122 |
DynObjectValueItem[] values = this.availableValues.get(keyName); |
|
1123 |
if( values != null ) { |
|
1124 |
return values; |
|
1125 |
} |
|
1126 |
if( !descriptor.isForeingKey() ) { |
|
1127 |
return null; |
|
1128 |
} |
|
1129 |
ForeingKey foreingKey = descriptor.getForeingKey(); |
|
1130 |
try { |
|
1131 |
StoresRepository theStoresRepository; |
|
1132 |
FeatureStore store = descriptor.getStore(); |
|
1133 |
if (store == null) { |
|
1134 |
theStoresRepository = DALLocator.getDataManager().getStoresRepository(); |
|
1135 |
|
|
1136 |
} else { |
|
1137 |
theStoresRepository = store.getStoresRepository(); |
|
1138 |
} |
|
1139 |
FeatureStore foreingStore = (FeatureStore) theStoresRepository.getStore( |
|
1140 |
foreingKey.getTableName() |
|
1141 |
); |
|
1142 |
Expression labelExpression = foreingKey.getLabelExpression(null); |
|
1143 |
String codeName = foreingKey.getCodeName(); |
|
1144 |
FeatureSymbolTable featureSymbolTable = this.createFeatureSymbolTable(); |
|
1145 |
MutableSymbolTable symbolTable = featureSymbolTable.createParent(); |
|
1146 |
|
|
1147 |
int count = (int) foreingStore.getFeatureCount(); |
|
1148 |
values = new DynObjectValueItem[Math.min(count, MAX_AVAILABLE_VALUES)]; |
|
1149 |
int n = 0; |
|
1150 |
for (Feature feature : foreingStore.getFeatureSet()) { |
|
1151 |
Object code = feature.get(codeName); |
|
1152 |
Object value; |
|
1153 |
if (labelExpression == null) { |
|
1154 |
value = code; |
|
1155 |
} else { |
|
1156 |
featureSymbolTable.setFeature(feature); |
|
1157 |
value = labelExpression.execute(symbolTable); |
|
1158 |
} |
|
1159 |
values[n++] = new DynObjectValueItem(code, Objects.toString(value, Objects.toString(code, "##ERROR##"))); |
|
1160 |
if( n>=MAX_AVAILABLE_VALUES ) { |
|
1161 |
break; |
|
1162 |
} |
|
1163 |
} |
|
1164 |
this.availableValues.put(keyName, values); |
|
1165 |
return values; |
|
1166 |
} catch (Exception ex) { |
|
1167 |
LOGGER.warn("Can't get available values for field '"+myStore.getName()+"."+descriptor.getName()+"' from table '" + foreingKey.getTableName() + "'.", ex); |
|
1168 |
} |
|
1169 |
return null; |
|
1170 |
} |
|
1171 |
|
|
1106 | 1172 |
} |
Also available in: Unified diff