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

View differences:

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