Revision 46517 trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.api/src/main/java/org/gvsig/fmap/dal/AbstractStoresRepository.java

View differences:

AbstractStoresRepository.java
3 3
import java.util.ArrayList;
4 4
import java.util.Collection;
5 5
import java.util.Collections;
6
import java.util.HashMap;
6 7
import java.util.Iterator;
7 8
import java.util.List;
8 9
import java.util.Map;
......
11 12
import java.util.TreeSet;
12 13
import org.apache.commons.lang3.StringUtils;
13 14
import org.gvsig.fmap.dal.feature.FeatureStore;
15
import org.gvsig.fmap.dal.feature.FeatureType;
16
import org.gvsig.tools.dispose.DisposeUtils;
14 17
import org.gvsig.tools.observer.Notification;
15 18
import org.gvsig.tools.observer.ObservableHelper;
16 19
import org.gvsig.tools.observer.Observer;
20
import org.gvsig.tools.util.CachedValue;
17 21
import org.gvsig.tools.util.PropertiesSupport;
18 22
import org.gvsig.tools.util.PropertiesSupportHelper;
19 23
import org.gvsig.tools.util.UnmodifiableBasicSet;
......
35 39
    private final List<StoresRepository> subrepositories;
36 40
    private final ObservableHelper observableHelper;
37 41
    private final PropertiesSupportHelper propertiesHelper;
42
    protected Map<String, CachedValue<FeatureType>> featureTypes;
43
    protected long featureTypeExpireTimeInMillis;
38 44

  
39 45
    public AbstractStoresRepository(String name) {
40 46
        this(name, null);
......
46 52
        this.subrepositories = new ArrayList<>();
47 53
        this.observableHelper = new ObservableHelper();
48 54
        this.propertiesHelper = new PropertiesSupportHelper();
55
        this.featureTypeExpireTimeInMillis = 5*60*1000;
49 56
    }
50 57
    
51 58
    protected abstract DataStoreParameters getMyParameters(String name);
......
56 63

  
57 64
    protected abstract UnmodifiableBasicSet<String> getMyKeySet();
58 65

  
66
    protected FeatureType getMyFeatureType(String name) {
67
        if(this.featureTypes == null){
68
            this.featureTypes = new HashMap<>();
69
        }
70
        CachedValue<FeatureType> featureType = this.featureTypes.get(name.toLowerCase());
71
        if (featureType == null) {
72
            DataStoreParameters parameters = this.getMyParameters(name);
73
            if (parameters == null) {
74
                return null;
75
            }
76
            featureType = new CachedValue<FeatureType>(this.featureTypeExpireTimeInMillis){
77
                @Override
78
                protected void reload() {
79
                    DataStore store = null;
80
                    try {
81
                        store = DALLocator.getDataManager().openStore(
82
                                parameters.getDataStoreName(),
83
                                parameters,
84
                                false
85
                        );
86
                        if (!(store instanceof FeatureStore)) {
87
                            return;
88
                        }
89
                        this.setValue(((FeatureStore) store).getDefaultFeatureType());
90
                    } catch (Exception ex) {
91
                        throw new RuntimeException("Can't get feature type of '" + name + "'.", ex);
92
                    } finally {
93
                        DisposeUtils.disposeQuietly(store);
94
                    }
95
                }
96
            };
97
            
98
            this.featureTypes.put(name.toLowerCase(), featureType);
99

  
100
        }
101
        return featureType.get();
102
    }
103

  
59 104
    @Override
60 105
    public void addObserver(Observer o) {
61 106
        this.observableHelper.addObserver(o);
......
225 270
    }
226 271

  
227 272
    @Override
273
    public FeatureType getFeatureType(String name) {
274
        FeatureType featureType = this.getMyFeatureType(name);
275
        if( featureType != null ) {
276
            return featureType;
277
        }
278
        for ( StoresRepository theRepository : this.subrepositories) {
279
            featureType = theRepository.getFeatureType(name);
280
            if( featureType != null ) {
281
                return featureType;
282
            }
283
        }
284
        return null;
285
    }
286

  
287
    @Override
228 288
    public boolean containsKey(String key) {
229 289
        DataStoreParameters parameters = this.getMyParameters(name);
230 290
        if( parameters!=null ) {

Also available in: Unified diff