Statistics
| Revision:

svn-gvsig-desktop / branches / v2_0_0_prep / extensions / org.gvsig.arcims.feature.extension / src / main / java / org / gvsig / fmap / dal / store / arcims / ArcImsStoreProvider.java @ 32543

History | View | Annotate | Download (12.8 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 */
22

    
23
/*
24
 * AUTHORS (In addition to CIT):
25
 * 2010 Prodevelop S.L. main development
26
 * http://www.prodevelop.es
27
 */
28

    
29
package org.gvsig.fmap.dal.store.arcims;
30

    
31
import java.util.ArrayList;
32
import java.util.HashMap;
33
import java.util.Iterator;
34
import java.util.List;
35
import java.util.Map;
36
import java.util.Vector;
37

    
38
import org.gvsig.fmap.crs.CRSFactory;
39
import org.gvsig.fmap.dal.DALLocator;
40
import org.gvsig.fmap.dal.DataManager;
41
import org.gvsig.fmap.dal.DataServerExplorer;
42
import org.gvsig.fmap.dal.DataStoreParameters;
43
import org.gvsig.fmap.dal.DataTypes;
44
import org.gvsig.fmap.dal.exception.DataException;
45
import org.gvsig.fmap.dal.exception.InitializeException;
46
import org.gvsig.fmap.dal.exception.OpenException;
47
import org.gvsig.fmap.dal.exception.ReadException;
48
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
49
import org.gvsig.fmap.dal.feature.EditableFeatureType;
50
import org.gvsig.fmap.dal.feature.Feature;
51
import org.gvsig.fmap.dal.feature.FeatureQuery;
52
import org.gvsig.fmap.dal.feature.FeatureSelection;
53
import org.gvsig.fmap.dal.feature.FeatureStore;
54
import org.gvsig.fmap.dal.feature.FeatureType;
55
import org.gvsig.fmap.dal.feature.spi.AbstractFeatureStoreProvider;
56
import org.gvsig.fmap.dal.feature.spi.DefaultFeatureProvider;
57
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
58
import org.gvsig.fmap.dal.feature.spi.FeatureReferenceProviderServices;
59
import org.gvsig.fmap.dal.feature.spi.FeatureSetProvider;
60
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProviderServices;
61
import org.gvsig.fmap.dal.resource.spi.ResourceConsumer;
62
import org.gvsig.fmap.dal.resource.spi.ResourceProvider;
63
import org.gvsig.fmap.dal.serverexplorer.arcims.ArcImsServerExplorer;
64
import org.gvsig.fmap.dal.serverexplorer.arcims.ArcImsServerExplorerParameters;
65
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
66
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
67
import org.gvsig.fmap.geom.Geometry.TYPES;
68
import org.gvsig.remoteclient.arcims.ArcImsClient;
69
import org.gvsig.remoteclient.arcims.ArcImsFeatureClient;
70
import org.gvsig.remoteclient.arcims.ArcImsProtFeatureHandler;
71
import org.gvsig.remoteclient.arcims.ArcImsStatus;
72
import org.gvsig.remoteclient.arcims.ArcImsVectStatus;
73
import org.gvsig.remoteclient.arcims.exceptions.ArcImsException;
74
import org.gvsig.remoteclient.arcims.utils.ArcImsFeature;
75
import org.gvsig.remoteclient.arcims.utils.FieldInformation;
76
import org.gvsig.remoteclient.arcims.utils.ServiceInformation;
77
import org.gvsig.remoteclient.arcims.utils.ServiceInformationLayerFeatures;
78
import org.gvsig.tools.ToolsLocator;
79
import org.gvsig.tools.dynobject.DynClass;
80
import org.gvsig.tools.dynobject.DynObjectManager;
81
import org.slf4j.Logger;
82
import org.slf4j.LoggerFactory;
83

    
84
/**
85
 * ArcIMS datastore parameters
86
 * 
87
 * @author vsanjaime version 2.0
88
 * 
89
 */
90
public class ArcImsStoreProvider extends AbstractFeatureStoreProvider implements
91
                ResourceConsumer {
92

    
93
        private static final Logger logger = LoggerFactory
94
                        .getLogger(ArcImsStoreProvider.class);
95
        public static String NAME = "ArcIMSStore";
96
        public static String DESCRIPTION = "ArcIMS store to load ArcIMS resources";
97
        private static final String DYNCLASS_NAME = "ArcIMSStore";
98
        protected static DynClass DYNCLASS = null;
99

    
100
        // ArcIms Parameters
101
        private ArcImsClient arcimsClient;
102
        private ArcImsStatus arcimsStatus;
103
        private int numFeats = 0;
104
        protected boolean isOpen = false;        
105

    
106
        /**
107
         * Constructor
108
         * 
109
         * @param params
110
         * @param storeServices
111
         * @throws InitializeException
112
         */
113
        public ArcImsStoreProvider(DataStoreParameters params,
114
                        DataStoreProviderServices storeServices) throws InitializeException {
115

    
116
                super(params, storeServices, ToolsLocator.getDynObjectManager()
117
                                .createDynObject(DYNCLASS));                
118
                
119
                // build status from parameters
120
                ArcImsStoreParameters pa = (ArcImsStoreParameters) params;
121
                arcimsClient = new ArcImsFeatureClient(pa.getServerUrl(), pa
122
                                .getServiceName());
123
                arcimsStatus = new ArcImsVectStatus();
124
                arcimsStatus.setLayersIdsSelected(pa.getSelectedLayers());
125
                arcimsStatus.setServiceInformation(pa.getServiceInfo());
126
                arcimsStatus.setSrs(pa.getSRS().getAbrev());
127
                arcimsStatus.setEnvelope(pa.getEnvelope());
128

    
129
                // initialize default feature type
130
                this.initDefaultFeatureType();
131

    
132
        }
133

    
134
        /**
135
         * 
136
         */
137
        protected static void registerDynClass() {
138
                DynObjectManager dynman = ToolsLocator.getDynObjectManager();
139
                DynClass dynClass;
140
                if (DYNCLASS == null) {
141

    
142
                        dynClass = dynman.add(DYNCLASS_NAME);
143
                        dynClass.extend(dynman.get(FeatureStore.DYNCLASS_NAME));
144

    
145
                        DYNCLASS = dynClass;
146
                }
147

    
148
        }
149

    
150
        /**
151
         * 
152
         */
153
        @Override
154
        protected FeatureProvider internalGetFeatureProviderByReference(
155
                        FeatureReferenceProviderServices reference, FeatureType featureType)
156
                        throws DataException {
157
                logger
158
                                .info("ArcImsStoreProvider: internalGetFeatureProviderByReference");
159
                return null;
160
        }
161

    
162
        /**
163
         * 
164
         */
165
        public boolean closeResourceRequested(ResourceProvider resource) {
166
                logger.info("ArcImsStoreProvider: closeResourceRequested");
167
                return false;
168
        }
169

    
170
        /**
171
         * 
172
         */
173
        public void resourceChanged(ResourceProvider resource) {
174
                logger.info("ArcImsStoreProvider: resourceChanged");
175

    
176
        }
177

    
178
        /**
179
         * 
180
         */
181
        public Object createNewOID() {
182
                logger.info("ArcImsStoreProvider: createNewOID");
183
                return null;
184
        }
185

    
186
        /**
187
         * 
188
         */
189
        public FeatureSetProvider createSet(FeatureQuery query,
190
                        FeatureType featureType) throws DataException {
191
                logger.info("ArcImsStoreProvider: createSet");
192
                //isOpen = false;
193
                open();
194
                return new ArcImsSetProvider(this, query);
195
        }
196

    
197
        /**
198
         * 
199
         */
200
        public long getFeatureCount() throws DataException {
201
                logger.info("ArcImsStoreProvider: getFeatureCount");
202

    
203
                return this.numFeats;
204
        }
205

    
206
        /**
207
         * 
208
         */
209
        public String getName() {
210
                return NAME;
211
        }
212

    
213
        /**
214
         * 
215
         */
216
        public int getOIDType() {
217
                logger.info("ArcImsStoreProvider: getOIDType");
218
                return 0;
219
        }
220

    
221
        public ResourceProvider getResource() {
222
                logger.info("ArcImsStoreProvider: getResource");
223
                return null;
224
        }
225

    
226
        public Object getSourceId() {
227
                logger.info("ArcImsStoreProvider: getSourceId");
228
                return null;
229
        }
230

    
231
        public void open() throws OpenException {
232
                logger.info("ArcImsStoreProvider: open");
233
                if (isOpen) {
234
                        return;
235
                }
236

    
237
                this.numFeats = 0;
238

    
239
                FeatureStoreProviderServices store = (FeatureStoreProviderServices) this
240
                                .getFeatureStore();
241

    
242
                // add features to store
243
                List<List<ArcImsFeature>> feats = null;
244
                try {
245
                        feats = ((ArcImsProtFeatureHandler) arcimsClient.getHandler())
246
                                        .getMap((ArcImsVectStatus) arcimsStatus);
247
                } catch (ArcImsException e) {
248
                        logger.debug("Error getting the atributes", e);
249
                }
250
                if (feats != null && feats.size() > 0) {
251
                        //TODO Por ahora solo el primer elemento
252
                        List<ArcImsFeature> feats2 = feats.get(0);
253
                        for (ArcImsFeature aFeat : feats2) {
254
                                if (aFeat.isValid()) {
255
                                        try {
256
                                                this.addFeatureToStore((FeatureStore) store, aFeat);
257
                                                this.numFeats++;
258
                                        } catch (DataException e) {
259
                                                logger.error("Error adding feature", e);
260
                                                continue;
261
                                        }
262
                                }
263

    
264
                        }
265
                }
266
                isOpen = true;
267

    
268
        }
269

    
270
        /**
271
         * 
272
         * @param store
273
         * @param feature
274
         * @throws DataException
275
         */
276
        public void addFeatureToStore(FeatureStore store, ArcImsFeature feature)
277
                        throws DataException {
278

    
279
                if (store != null) {
280
                        // EditableFeature eFeat = store.createNewFeature();
281
                        FeatureProvider data = new DefaultFeatureProvider(store
282
                                        .getDefaultFeatureType(), this.createNewOID());
283
                        data.setDefaultGeometry(feature.getGeometry());
284
                        Iterator<Map.Entry<String, Object>> it = feature.entrySet()
285
                                        .iterator();
286
                        while (it.hasNext()) {
287
                                Map.Entry<String, Object> entry = it.next();
288
                                String key = entry.getKey();
289
                                Object value = entry.getValue();
290
                                if (key.compareToIgnoreCase("#SHAPE#") != 0) {
291
                                        data.set(key, value);
292
                                }
293

    
294
                        }
295
                        ((FeatureStoreProviderServices) store).createFeature(data);                
296

    
297
                }
298
        }
299

    
300
        /**
301
         * 
302
         * @param params
303
         * @param layerId
304
         * @param status
305
         * @return
306
         */
307
        private FeatureType createFeatureType(ArcImsStoreParameters params,
308
                        String layerId, ArcImsStatus status) {
309

    
310
                logger.info("ArcImsStoreProvider: createFeatureType");
311

    
312
                EditableFeatureType eFType = ((FeatureStoreProviderServices) this
313
                                .getFeatureStore()).createFeatureType();
314
                ServiceInformation infoService = status.getServiceInfo();
315
                ServiceInformationLayerFeatures infoLayer = (ServiceInformationLayerFeatures) infoService
316
                                .getLayerById(layerId);
317

    
318
                Vector<FieldInformation> fieldsInfo = infoLayer.getFieldsInfo();
319
                for (FieldInformation fieldInfo : fieldsInfo) {
320
                        logger.info("Name: " + fieldInfo.getName() + " Type: "
321
                                        + fieldInfo.getType());
322
                        if (parseType(fieldInfo.getType()) == DataTypes.GEOMETRY) {
323
                                // TYPES.GEOMETRY
324
                                String geometryType = status.getServiceInfo().getType();
325
                                int geomType = TYPES.SURFACE;
326
                                if (geometryType.compareToIgnoreCase("line") == 0) {
327
                                        geomType = TYPES.CURVE;
328
                                }
329
                                if (geometryType.compareToIgnoreCase("point") == 0) {
330
                                        geomType = TYPES.POINT;
331
                                }
332

    
333
                                EditableFeatureAttributeDescriptor attributeDescriptor = eFType
334
                                                .add("geom", DataTypes.GEOMETRY).setGeometryType(
335
                                                                geomType);
336
                                attributeDescriptor.setGeometrySubType(SUBTYPES.GEOM2D);
337
                                attributeDescriptor.setSRS(CRSFactory.getCRS(arcimsStatus
338
                                                .getSrs()));
339
                                eFType.setDefaultGeometryAttributeName("geom");
340
                        } else {
341
                                eFType.add(fieldInfo.getName(), parseType(fieldInfo.getType()));
342
                        }
343
                }
344

    
345
                return eFType.getNotEditableCopy();
346
        }
347

    
348
        
349

    
350
        /**
351
         * It executes a wfs Query without spatial filter
352
         * 
353
         * @throws DataException
354
         */
355
        private void executeQuery() throws DataException {
356

    
357
                logger.info("ArcImsStoreProvider: executeQuery");
358

    
359
        }
360

    
361
        /*
362
         * (non-Javadoc)
363
         * 
364
         * @see
365
         * org.gvsig.fmap.dal.feature.spi.AbstractFeatureStoreProvider#getExplorer()
366
         */
367
        public DataServerExplorer getExplorer() throws ReadException {
368

    
369
                logger.info("ArcImsStoreProvider: getExplorer");
370

    
371
                DataManager manager = DALLocator.getDataManager();
372
                ArcImsServerExplorerParameters params;
373
                try {
374
                        params = (ArcImsServerExplorerParameters) manager
375
                                        .createServerExplorerParameters(ArcImsServerExplorer.NAME);
376
                        params.setUrl(arcimsClient.getHost());
377
                        params.setVersion(arcimsStatus.getServerVersion());
378
                        return manager.createServerExplorer(params);
379
                } catch (Exception e) {
380
                        throw new ReadException(this.getName(), e);
381
                }
382
        }
383

    
384

    
385

    
386
        /**
387
         * 
388
         */
389
        private void initDefaultFeatureType() {
390

    
391
                FeatureStoreProviderServices store = (FeatureStoreProviderServices) this
392
                                .getFeatureStore();
393
                // Add Feature type
394
                FeatureType defaultFType = this.createFeatureType(
395
                                getArcImsParameters(), arcimsStatus.getLayersIdsSelected().get(
396
                                                0), arcimsStatus);
397
                List<FeatureType> types = new ArrayList<FeatureType>(1);
398
                types.add(defaultFType);
399
                store.setFeatureTypes(types, defaultFType);
400
                
401

    
402
        }
403

    
404
        /**
405
         * Get number 
406
         * @return
407
         */
408
        public int getNumFeats() {
409
                return numFeats;
410
        }
411

    
412
        /**
413
         * 
414
         * @return
415
         * @throws DataException
416
         */
417
        public HashMap getMapFeatures() throws DataException {
418
                HashMap feats = new HashMap();
419
                FeatureStore store = this.getFeatureStore();
420
                FeatureSelection sel = store.getFeatureSelection();
421
                sel.selectAll();
422
                Iterator<Feature> it = sel.iterator();
423
                int id = 0;
424
                while (it.hasNext()) {
425
                        Feature feat = it.next();
426
                        feats.put(id, feat);
427
                        id++;
428
                }
429

    
430
                return feats;
431
        }
432
        
433
        
434
        /**
435
         * Parse arcims attribute type to gvsig attribute type
436
         * @param arcimsType
437
         * @return
438
         */
439
        private int parseType(int arcimsType) {
440

    
441
                switch (arcimsType) {
442
                case FieldInformation.BOOLEAN:
443
                        return DataTypes.BOOLEAN;
444
                case FieldInformation.SHAPE:
445
                        return DataTypes.GEOMETRY;
446
                case FieldInformation.STRING:
447
                        return DataTypes.STRING;
448
                case FieldInformation.DATE:
449
                        return DataTypes.DATE;
450
                case FieldInformation.FLOAT:
451
                        return DataTypes.FLOAT;
452
                case FieldInformation.DOUBLE:
453
                        return DataTypes.DOUBLE;
454
                case FieldInformation.SMALLINT:
455
                        return DataTypes.INT;
456
                case FieldInformation.BIGINT:
457
                        return DataTypes.INT;
458
                case FieldInformation.ID:
459
                        return DataTypes.STRING;
460
                case FieldInformation.INTEGER:
461
                        return DataTypes.INT;
462
                default:
463
                        return DataTypes.UNKNOWN;
464
                }
465

    
466
        }
467
        
468
        /**
469
         * Get arcims parameters
470
         * @return
471
         */
472
        private ArcImsStoreParameters getArcImsParameters() {
473
                return (ArcImsStoreParameters) getParameters();
474
        }
475

    
476
}