Revision 45772 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
139 139
    public static final String FILESYSTEM_EXPLORER_NAME = "FilesystemExplorer";
140 140
    
141 141
    public static final long DEFAULT_MAX_SIZE_FOR_SMALL_FEATURE_SELECTION = 2000000000;
142
    
142

  
143 143
    private class Registers {
144 144

  
145 145
        private final Register store;
......
1332 1332
        }
1333 1333
    }
1334 1334

  
1335
    private Map<String,DynObjectValueItem[]> availableValues = null;
1336
    
1337 1335
    @Override
1338 1336
    public void clearAvailableValuesCache() {
1339
      this.availableValues = null;
1337
      //TODO
1340 1338
    }
1341
    
1339
     
1342 1340
    @Override
1343
    public DynObjectValueItem[] getAvailableValues(DynObject contextValues, FeatureStore myStore, FeatureAttributeDescriptor descriptor) {
1344
        String keyName = myStore.getFullName() + ":columnName=" + descriptor.getName();
1345
        if( this.availableValues==null ) {
1346
            this.availableValues = new HashMap<>();
1347
        }
1348
        DynObjectValueItem[] values = this.availableValues.get(keyName);
1349
        if( values != null ) {
1350
            return values;
1351
        }
1352
        if( !descriptor.isForeingKey() ) {
1353
            return null;
1354
        }
1355
        ForeingKey foreingKey = descriptor.getForeingKey();
1356
        FeatureStore foreingStore = null;
1357
        DisposableFeatureSetIterable  set = null;
1358
        try {
1359
            StoresRepository theStoresRepository;
1360
            FeatureStore store = descriptor.getStore();
1361
            if (store == null) {
1362
                theStoresRepository = DALLocator.getDataManager().getStoresRepository();
1363

  
1364
            } else {
1365
                theStoresRepository = store.getStoresRepository();
1366
            }
1367
            foreingStore = (FeatureStore) theStoresRepository.getStore(
1368
                foreingKey.getTableName()
1369
            );
1370
            Expression labelExpression = foreingKey.getLabelExpression(null);
1371
            String codeName = foreingKey.getCodeName();
1372
            FeatureSymbolTable featureSymbolTable = this.createFeatureSymbolTable("feature");
1373
            MutableSymbolTable symbolTable = featureSymbolTable.createParent();
1374
        
1375
            Expression filter = descriptor.getAvailableValuesFilter();
1376
            if( filter != null ) {
1377
                MutableSymbolTable filterFeatureSymbolTable = ExpressionUtils.createSymbolTable(
1378
                        "filter", contextValues
1379
                );
1380
                featureSymbolTable.addSymbolTable(filterFeatureSymbolTable);
1381
            }
1382

  
1383
            List<DynObjectValueItem> values_list = new ArrayList<>();
1384
            int n = 0;
1385
            for (Feature feature : set = foreingStore.getFeatureSet().iterable()) {
1386
                Object value = feature.get(codeName);
1387
                Object label;
1388
                if (labelExpression == null) {
1389
                    label = value;
1390
                } else {
1391
                    featureSymbolTable.setFeature(feature);
1392
                    label = labelExpression.execute(symbolTable);
1393
                }
1394

  
1395
                if( filter != null ) {
1396
                    symbolTable.setVar("$value", value);
1397
                    symbolTable.setVar("$label", label);
1398
                    featureSymbolTable.setFeature(feature);
1399
                    Object include = filter.execute(featureSymbolTable);
1400
                    if( DataTypeUtils.isFalse(include, false) ) {
1401
                        continue;
1402
                    }
1403
                }
1404
  
1405
                values_list.add(new DynObjectValueItem(value, Objects.toString(label, Objects.toString(value, "##ERROR##"))));
1406
                if( n>=MAX_AVAILABLE_VALUES ) {
1407
                    break;
1408
                }
1409
            }
1410
            values = values_list.toArray(new DynObjectValueItem[values_list.size()]);
1411
            if( filter==null ) {
1412
                this.availableValues.put(keyName, values);
1413
            }
1414
            return values;
1415
        } catch (Exception ex) {
1416
            LOGGER.warn("Can't get available values for field '"+myStore.getName()+"."+descriptor.getName()+"' from table '" + foreingKey.getTableName() + "'.", ex);
1417
        } finally {
1418
            DisposeUtils.disposeQuietly(set);
1419
            DisposeUtils.disposeQuietly(foreingStore);
1420
        }
1421
        return null;
1422
    }
1423

  
1424
    @Override
1425 1341
    public String createUniqueID() {
1426 1342
        UUID x = UUID.randomUUID();
1427 1343
        String s = x.toString();
......
1532 1448
    public FeatureRuleExpression createFeatureRuleExpression() {
1533 1449
        FeatureRuleExpression rule = new DefaultFeatureRuleExpression();
1534 1450
        return rule;
1535
    }
1451
}
1536 1452
    
1537 1453
}

Also available in: Unified diff