Revision 44307 trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.file/org.gvsig.fmap.dal.file.lib/src/main/java/org/gvsig/fmap/dal/feature/spi/simpleprovider/SimpleSequentialReaderStoreProvider.java

View differences:

SimpleSequentialReaderStoreProvider.java
34 34

  
35 35
import org.apache.commons.lang3.StringUtils;
36 36
import org.cresques.cts.IProjection;
37
import org.gvsig.fmap.dal.BaseStoresRepository;
37 38
import org.gvsig.fmap.dal.DALLocator;
38 39
import org.gvsig.fmap.dal.DataManager;
39 40
import org.gvsig.fmap.dal.DataServerExplorer;
......
55 56
import org.gvsig.fmap.dal.feature.FeatureAttributeEmulator;
56 57
import org.gvsig.fmap.dal.feature.FeatureStore;
57 58
import org.gvsig.fmap.dal.feature.FeatureType;
59
import org.gvsig.fmap.dal.feature.OpenFeatureStoreParameters;
58 60
import org.gvsig.fmap.dal.feature.exception.PerformEditingException;
59 61
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
60 62
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProviderServices;
......
78 80
import org.gvsig.timesupport.Interval;
79 81
import org.gvsig.tools.ToolsLocator;
80 82
import org.gvsig.tools.dataTypes.CoercionException;
83
import org.gvsig.tools.dataTypes.DataTypeUtils;
81 84
import org.gvsig.tools.dataTypes.DataTypesManager;
82 85
import org.gvsig.tools.dataTypes.DataTypesManager.Coercion;
83 86
import org.gvsig.tools.dataTypes.DataTypesManager.CoercionWithLocale;
87
import org.gvsig.tools.dispose.Disposable;
88
import org.gvsig.tools.dispose.DisposeUtils;
84 89
import org.gvsig.tools.dynobject.Tags;
85 90
import org.gvsig.tools.dynobject.exception.DynFieldNotFoundException;
86 91
import org.gvsig.tools.exception.BaseException;
......
100 105

  
101 106
    private static final Logger LOGGER = LoggerFactory.getLogger(SimpleSequentialReaderStoreProvider.class);
102 107

  
103
    private class ReaderData {
108
    private class StoresRepositoryWithChildren extends BaseStoresRepository {
109
        
110
        public StoresRepositoryWithChildren() {
111
            super(SimpleSequentialReaderStoreProvider.this.getName());
112
        }
113
        
114
        @Override
115
        public DataStore getStore(String name) {
116
            if( StringUtils.equalsIgnoreCase(name, readerData.getName()) ||
117
                StringUtils.equalsIgnoreCase(name, readerData.getAlias()) ) {
118
                return readerData.getStore();
119
            }
120
            for (ReaderData child : childrenData) {
121
                if( StringUtils.equalsIgnoreCase(name, child.getName()) ||
122
                    StringUtils.equalsIgnoreCase(name, child.getAlias()) ) {
123
                    return child.getStore();
124
                }
125
            }
126
            return super.getStore(name);
127
        }
128
        
129
    }
130
    
131
    private class ReaderData implements Disposable {
104 132
        private FeatureType defaultFeatureType;
105 133
        private List<FeatureType> featureTypes;
106
        private final List<FeatureProvider> features;
134
        private List<FeatureProvider> features;
107 135
        private boolean needCalculateEnvelope;
108 136
        private String name;
137
        private String alias;
109 138
        private long OIDcounter;
110 139
        private DataStore store;
111 140
        private StoresRepository storesRepository;
141
        private OpenFeatureStoreParameters parameters;
112 142

  
113 143
        public ReaderData() {
114 144
            this.needCalculateEnvelope = false;
......
116 146
            this.OIDcounter = 0;
117 147
            this.store = null;
118 148
        }
149

  
150
        @Override
151
        public void dispose() {
152
            DisposeUtils.disposeQuietly(store);
153
            this.store = null;
154
            this.features = null;
155
            this.OIDcounter = 0;
156
            this.defaultFeatureType = null;
157
            this.featureTypes = null;
158
            this.parameters = null;
159
            this.storesRepository = null;
160
        }
119 161
        
120 162
        public void addFeatureProvider(FeatureProvider feature) {
121 163
		feature.setOID(this.OIDcounter++);
......
155 197
            return this.features;
156 198
        }
157 199
        
158
        public DataStore getStore() throws InitializeException {
200
        public DataStore getStore() {
159 201
            if( this.store == null ) {
160
                SimpleSequentialReaderStoreProvider provider = new SimpleSequentialReaderStoreProvider(
161
                        readerFactory,
162
                        getParameters(),
163
                        null,
164
                        childrenData,
165
                        this
166
                );
167
                DataManagerProviderServices manager = DALSPILocator.getDataManagerProviderServices();
168
                this.store = manager.openStore(
169
                        getParameters(), 
170
                        provider
171
                );
172
                provider.setStoreServices((FeatureStoreProviderServices) this.store);
173
                provider.name = this.name;
202
                try {
203
                    SimpleSequentialReaderStoreProvider provider = new SimpleSequentialReaderStoreProvider(
204
                            readerFactory, 
205
                            (SimpleSequentialReaderStoreParameters) getParameters(),
206
                            null,
207
                            childrenData,
208
                            this
209
                    );
210
                    DataManagerProviderServices manager = DALSPILocator.getDataManagerProviderServices();
211
                    this.store = manager.openStore(
212
                            getParameters(), 
213
                            provider
214
                    );
215
                    provider.setStoreServices((FeatureStoreProviderServices) this.store);
216
                    provider.name = this.name;
217
                    DisposeUtils.bind(this.store);
218
                } catch(Exception ex) {
219
                   LOGGER.warn("Can't build store form child '"+name+"'.",ex);
220
                   return null; 
221
                }
174 222
            }
223
            DisposeUtils.bind(this.store);
175 224
            return this.store;
176 225
        }
177 226

  
......
182 231
        public StoresRepository getStoresRepository() {
183 232
            return storesRepository;
184 233
        }
234

  
235
        public void setParameters(OpenFeatureStoreParameters parameters) {
236
            if( parameters==null ) {
237
                LOGGER.warn("Can't set parameters to null");
238
                return;
239
            }
240
            this.parameters = parameters;
241
        }
242

  
243
        public OpenFeatureStoreParameters getParameters() {
244
            return parameters;
245
        }
246

  
247
        public String getAlias() {
248
            return this.alias;
249
        }
250

  
251
        public void setAlias(String alias) {
252
            this.alias = alias;
253
        }
185 254
        
255
        
186 256
    }
187 257
    
188 258
    class Children implements UnmodifiableBasicMap<String, DataStore> {
......
194 264
        public DataStore get(String key) {
195 265
            for (ReaderData child : childrenData) {
196 266
                if( StringUtils.equalsIgnoreCase(child.getName(), key) ) {
197
                    try {
198
                        return child.getStore();
199
                    } catch (Exception ex) {
200
                        throw new RuntimeException(ex);
201
                    }
267
                    return child.getStore();
202 268
                }
203 269
            }
204 270
            return null;
......
289 355
    private final SimpleSequentialReaderFactory readerFactory;
290 356
    private List<ReaderData> childrenData;
291 357
    private ReaderData readerData;
358
    private final boolean isAChild;
292 359

  
293 360
    public SimpleSequentialReaderStoreProvider(
294 361
            SimpleSequentialReaderFactory readerFactory,
......
314 381
        this.childrenData = childrenData;
315 382
        this.readerData = readerData;
316 383
        this.readerFactory = readerFactory;
317

  
384
        this.isAChild = this.readerData!=null;
385
        
318 386
        File file = getParameters().getFile();
319 387
        resource = this.createResource(
320 388
                FileResource.NAME,
......
329 397
            initializeFeatureTypes();
330 398
        }
331 399
    }
332

  
400
    
401
    private boolean isChild() {
402
        return this.isAChild;
403
    }
404
    
333 405
    private void setStoreServices(FeatureStoreProviderServices storeServices) throws InitializeException {
334 406
        this.store = storeServices;
335 407
        initializeFeatureTypes();
336 408
    }
409

  
410
    @Override
411
    public FeatureStoreProviderServices getStoreServices() {
412
        if( this.store==null ) {
413
            // Por aqui no deberia de pasar.
414
            // Si pasa es que algo va mal.
415
            LOGGER.warn("Algo no anda bien, el store es null");
416
            DataStore theStore = this.readerData.getStore();
417
            if( theStore==null ) {
418
                return null;
419
            }
420
            this.store = (FeatureStoreProviderServices) theStore ;
421
        }
422
        return this.store;
423
    }
337 424
    
338 425
    @Override
339 426
    public SimpleSequentialReaderStoreParameters getParameters() {
......
437 524
        throw new UnsupportedOperationException();
438 525
    }
439 526

  
440
    protected void initializeFeatureTypes() throws InitializeException {
527
    @Override
528
    protected void doDispose() throws BaseException {
529
        for (ReaderData theReaderData : this.childrenData) {
530
            DisposeUtils.disposeQuietly(theReaderData);
531
        }
532
        this.childrenData = null;
533
        DisposeUtils.disposeQuietly(this.readerData);
534
        this.readerData = null;
535
//        this.resource = null;
536
//        this.readerFactory = null;
537
        this.envelope = null;
538
        super.doDispose();
539
    }
540

  
541
    
542
    private void initializeFeatureTypes() throws InitializeException {
441 543
        try {
442 544
            this.open();
443 545
        } catch (OpenException e) {
......
723 825
                try {
724 826
                    switch(entry.getKey().toLowerCase()) {
725 827
                        case "hidden":
726
                            fad.setHidden((boolean) dataTypesManager.coerce(DataTypes.BOOLEAN, entry.getValue()));
828
                            fad.setHidden(DataTypeUtils.toBoolean(entry.getValue(), false));
727 829
                            break;
728 830
                        case "allownull":
729
                            fad.setAllowNull((boolean) dataTypesManager.coerce(DataTypes.BOOLEAN, entry.getValue()));
831
                            fad.setAllowNull(DataTypeUtils.toBoolean(entry.getValue(), false));
730 832
                            break;
731 833
                        case "pk":
732 834
                        case "ispk":
733 835
                        case "primarykey":
734 836
                        case "isprimarykey":
735
                            fad.setIsPrimaryKey((boolean) dataTypesManager.coerce(DataTypes.BOOLEAN, entry.getValue()));
837
                            fad.setIsPrimaryKey(DataTypeUtils.toBoolean(entry.getValue(), false));
736 838
                            break;
737 839
                        case "isautomatic":
738 840
                        case "automatic":
739
                            fad.setIsAutomatic((boolean) dataTypesManager.coerce(DataTypes.BOOLEAN, entry.getValue()));
841
                            fad.setIsAutomatic(DataTypeUtils.toBoolean(entry.getValue(), false));
740 842
                            break;
741 843
                        case "time":
742 844
                        case "istime":
743
                            fad.setIsTime((boolean) dataTypesManager.coerce(DataTypes.BOOLEAN, entry.getValue()));
845
                            fad.setIsTime(DataTypeUtils.toBoolean(entry.getValue(), false));
744 846
                            break;
745 847
                        case "profile":
746
                            fad.setDataProfileName((String) dataTypesManager.coerce(DataTypes.STRING, entry.getValue()));
848
                            fad.setDataProfileName(DataTypeUtils.toString(entry.getValue(), ""));
747 849
                            break;
748 850
                        case "group":
749
                            fad.setGroup((String) dataTypesManager.coerce(DataTypes.STRING, entry.getValue()));
851
                            fad.setGroup(DataTypeUtils.toString(entry.getValue(), ""));
750 852
                            break;
751 853
                        case "description":
752
                            fad.setDescription((String) dataTypesManager.coerce(DataTypes.STRING, entry.getValue()));
854
                            fad.setDescription(DataTypeUtils.toString(entry.getValue(), ""));
753 855
                            break;
754 856
                        case "label":
755
                            fad.setLabel((String) dataTypesManager.coerce(DataTypes.STRING, entry.getValue()));
857
                            fad.setLabel(DataTypeUtils.toString(entry.getValue(), ""));
756 858
                            break;
757 859
                        case "expression":
758 860
                            // Los campos calculados los procesamos en una segunda
......
760 862
                            // ya que pueden requerir campos que aun no se han definido.
761 863
                            break;
762 864
                        case "size":
763
                            fad.setSize((int) dataTypesManager.coerce(DataTypes.INT, entry.getValue()));
865
                            fad.setSize(DataTypeUtils.toInteger(entry.getValue(), 50));
764 866
                            break;
765 867
                        case "precision":
766
                            fad.setPrecision((int) dataTypesManager.coerce(DataTypes.INT, entry.getValue()));
868
                            fad.setPrecision(DataTypeUtils.toInteger(entry.getValue(), 10));
767 869
                            break;
768 870
                        case "order":
769
                            fad.setOrder((int) dataTypesManager.coerce(DataTypes.INT, entry.getValue()));
871
                            fad.setOrder(DataTypeUtils.toInteger(entry.getValue(), 0));
770 872
                            break;
873
                        case "foreingkey":
874
                            fad.getForeingKey().setForeingKey(DataTypeUtils.toBoolean(entry.getValue(), false));
875
                            break;
876
                        case "foreingkey.code":
877
                            fad.getForeingKey().setCodeName(DataTypeUtils.toString(entry.getValue(), ""));
878
                            break;
879
                        case "foreingkey.label":
880
                            fad.getForeingKey().setLabelFormula(DataTypeUtils.toString(entry.getValue(), ""));
881
                            break;
882
                        case "foreingkey.selectable":
883
                            fad.getForeingKey().setSelectable(DataTypeUtils.toBoolean(entry.getValue(), false));
884
                            break;
885
                        case "foreingkey.table":
886
                            fad.getForeingKey().setTableName(DataTypeUtils.toString(entry.getValue(), ""));
887
                            break;
771 888
                        case "interval":
772 889
                            fad.setInterval((Interval) dataTypesManager.coerce(DataTypes.INTERVAL, entry.getValue()));
773 890
                            break;
......
934 1051
            SimpleSequentialReader reader = this.readerFactory.createReader(this.getParameters());
935 1052
            try {
936 1053
                loadFeatures(reader, theReaderData);
1054
                StoresRepositoryWithChildren repoWithChildren = new StoresRepositoryWithChildren();
1055
                StoresRepository repo = reader.getStoresRepository();
1056
                if( repo!=null ) {
1057
                    repoWithChildren.addRepository(repo);
1058
                }        
937 1059
                this.childrenData = new ArrayList<>();
938
                for(SimpleSequentialReader childReader : reader.getChildren() ) {
1060
                List<SimpleSequentialReader> children = reader.getChildren();
1061
                for(SimpleSequentialReader childReader : children ) {
939 1062
                    ReaderData childData = new ReaderData();
940 1063
                    loadFeatures(childReader, childData);
941 1064
                    this.childrenData.add(childData);
1065
                    repoWithChildren.add(childReader.getName(), childData.getParameters());
1066
                    if( !StringUtils.isBlank(childReader.getAlias()) ) {
1067
                        repoWithChildren.add(childReader.getAlias(), childData.getParameters());
1068
                    }
1069
                    childData.setStoresRepository(repoWithChildren);
942 1070
                }
1071
                repoWithChildren.add(reader.getName(), theReaderData.getParameters());
1072
                if( !StringUtils.isBlank(reader.getAlias()) ) {
1073
                    repoWithChildren.add(reader.getAlias(), theReaderData.getParameters());
1074
                }
1075
                theReaderData.setStoresRepository(repoWithChildren);
943 1076
                this.readerData = theReaderData;
944 1077
            } finally {
945 1078
                reader.close();
......
967 1100
            taskStatus.message("_preparing");
968 1101
            readerData.setName(reader.getName());
969 1102
            readerData.setStoresRepository(reader.getStoresRepository());
1103
            readerData.setParameters(reader.getParameters());
1104
            readerData.setAlias(reader.getAlias());
970 1105
            
971 1106
            boolean ignore_errors = getParameters().getIgnoreErrors();
972 1107

  
......
1129 1264

  
1130 1265
    @Override
1131 1266
    public UnmodifiableBasicMap<String, DataStore> getChildren() {
1267
        if( this.isChild() ) {
1268
            return null;
1269
        }
1132 1270
        return new Children();
1133 1271
    }
1134 1272

  
1135 1273
    @Override
1136 1274
    public StoresRepository getStoresRepository() {
1137 1275
        StoresRepository repo = this.readerData.getStoresRepository();
1138
        if( repo == null ) {
1139
            return super.getStoresRepository();
1140
        }
1141 1276
        return repo;
1142 1277
    }
1143 1278
    

Also available in: Unified diff