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 @ 32555

History | View | Annotate | Download (13.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.FeatureAttributeDescriptor;
52
import org.gvsig.fmap.dal.feature.FeatureQuery;
53
import org.gvsig.fmap.dal.feature.FeatureReference;
54
import org.gvsig.fmap.dal.feature.FeatureSelection;
55
import org.gvsig.fmap.dal.feature.FeatureStore;
56
import org.gvsig.fmap.dal.feature.FeatureType;
57
import org.gvsig.fmap.dal.feature.impl.DefaultFeature;
58
import org.gvsig.fmap.dal.feature.spi.AbstractFeatureStoreProvider;
59
import org.gvsig.fmap.dal.feature.spi.DefaultFeatureProvider;
60
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
61
import org.gvsig.fmap.dal.feature.spi.FeatureReferenceProviderServices;
62
import org.gvsig.fmap.dal.feature.spi.FeatureSetProvider;
63
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProviderServices;
64
import org.gvsig.fmap.dal.resource.file.FileResource;
65
import org.gvsig.fmap.dal.resource.spi.ResourceConsumer;
66
import org.gvsig.fmap.dal.resource.spi.ResourceProvider;
67
import org.gvsig.fmap.dal.serverexplorer.arcims.ArcImsServerExplorer;
68
import org.gvsig.fmap.dal.serverexplorer.arcims.ArcImsServerExplorerParameters;
69
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
70
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
71
import org.gvsig.fmap.geom.Geometry.TYPES;
72
import org.gvsig.remoteclient.arcims.ArcImsClient;
73
import org.gvsig.remoteclient.arcims.ArcImsFeatureClient;
74
import org.gvsig.remoteclient.arcims.ArcImsProtFeatureHandler;
75
import org.gvsig.remoteclient.arcims.ArcImsStatus;
76
import org.gvsig.remoteclient.arcims.ArcImsVectStatus;
77
import org.gvsig.remoteclient.arcims.exceptions.ArcImsException;
78
import org.gvsig.remoteclient.arcims.utils.ArcImsFeature;
79
import org.gvsig.remoteclient.arcims.utils.FieldInformation;
80
import org.gvsig.remoteclient.arcims.utils.ServiceInformation;
81
import org.gvsig.remoteclient.arcims.utils.ServiceInformationLayerFeatures;
82
import org.gvsig.tools.ToolsLocator;
83
import org.gvsig.tools.dynobject.DynClass;
84
import org.gvsig.tools.dynobject.DynObjectManager;
85
import org.slf4j.Logger;
86
import org.slf4j.LoggerFactory;
87

    
88
/**
89
 * ArcIMS datastore parameters
90
 * 
91
 * @author vsanjaime version 2.0
92
 * 
93
 */
94
public class ArcImsStoreProvider extends AbstractFeatureStoreProvider implements
95
                ResourceConsumer {
96

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

    
104
        // ArcIms Parameters
105
        private ArcImsClient arcimsClient;
106
        private ArcImsStatus arcimsStatus;
107
        private int numFeats = 0;
108
        protected boolean isOpen = false;
109
        private List<Feature> features = new ArrayList<Feature>();
110

    
111
        /**
112
         * Constructor
113
         * 
114
         * @param params
115
         * @param storeServices
116
         * @throws InitializeException
117
         */
118
        public ArcImsStoreProvider(DataStoreParameters params,
119
                        DataStoreProviderServices storeServices) throws InitializeException {
120

    
121
                super(params, storeServices, ToolsLocator.getDynObjectManager()
122
                                .createDynObject(DYNCLASS));
123

    
124
                // build status from parameters
125
                ArcImsStoreParameters pa = (ArcImsStoreParameters) params;
126
                arcimsClient = new ArcImsFeatureClient(pa.getServerUrl(), pa
127
                                .getServiceName());
128
                arcimsStatus = new ArcImsVectStatus();
129
                arcimsStatus.setLayersIdsSelected(pa.getSelectedLayers());
130
                arcimsStatus.setServiceInformation(pa.getServiceInfo());
131
                arcimsStatus.setSrs(pa.getSRS().getAbrev());
132
                arcimsStatus.setEnvelope(pa.getEnvelope());
133

    
134
                // initialize default feature type
135
                this.initDefaultFeatureType();
136

    
137
        }
138

    
139
        /**
140
         * 
141
         */
142
        protected static void registerDynClass() {
143
                DynObjectManager dynman = ToolsLocator.getDynObjectManager();
144
                DynClass dynClass;
145
                if (DYNCLASS == null) {
146

    
147
                        dynClass = dynman.add(DYNCLASS_NAME);
148
                        dynClass.extend(dynman.get(FeatureStore.DYNCLASS_NAME));
149

    
150
                        DYNCLASS = dynClass;
151
                }
152

    
153
        }
154

    
155
        /**
156
         * 
157
         */
158
        @Override
159
        protected FeatureProvider internalGetFeatureProviderByReference(
160
                        FeatureReferenceProviderServices reference, FeatureType featureType)
161
                        throws DataException {
162
                logger
163
                                .info("ArcImsStoreProvider: internalGetFeatureProviderByReference");
164
                return null;
165
        }
166

    
167
        /**
168
         * 
169
         */
170
        public boolean closeResourceRequested(ResourceProvider resource) {
171
                logger.info("ArcImsStoreProvider: closeResourceRequested");
172
                return false;
173
        }
174

    
175
        /**
176
         * 
177
         */
178
        public void resourceChanged(ResourceProvider resource) {
179
                logger.info("ArcImsStoreProvider: resourceChanged");
180

    
181
        }
182

    
183
        /**
184
         * 
185
         */
186
        public Object createNewOID() {
187
                logger.info("ArcImsStoreProvider: createNewOID");
188
                return null;
189
        }
190

    
191
        /**
192
         * 
193
         */
194
        public FeatureSetProvider createSet(FeatureQuery query,
195
                        FeatureType featureType) throws DataException {
196
                logger.info("ArcImsStoreProvider: createSet");
197
                // isOpen = false;
198
                open();
199
                return new ArcImsSetProvider(this, query);
200
        }
201

    
202
        /**
203
         * 
204
         */
205
        public long getFeatureCount() throws DataException {
206
                logger.info("ArcImsStoreProvider: getFeatureCount");
207

    
208
                return features.size();
209
        }
210

    
211
        /**
212
         * 
213
         */
214
        public String getName() {
215
                return NAME;
216
        }
217

    
218
        /**
219
         * 
220
         */
221
        public int getOIDType() {
222
                logger.info("ArcImsStoreProvider: getOIDType");
223
                return 0;
224
        }
225

    
226
        public ResourceProvider getResource() {
227
                logger.info("ArcImsStoreProvider: getResource");
228
                ResourceProvider res = null;
229
                try {
230
                        res = this.createResource(FileResource.NAME, new Object[] { "" });
231
                } catch (InitializeException e) {
232
                        e.printStackTrace();
233
                }
234
                return res;
235
        }
236

    
237
        public Object getSourceId() {
238
                logger.info("ArcImsStoreProvider: getSourceId");
239
                return arcimsClient.getHost();
240
        }
241

    
242
        public void open() throws OpenException {
243
                logger.info("ArcImsStoreProvider: open");
244
                if (isOpen) {
245
                        return;
246
                }
247

    
248
                this.numFeats = 0;
249

    
250
                FeatureStoreProviderServices store = (FeatureStoreProviderServices) this
251
                                .getFeatureStore();
252

    
253
                // add features to store
254
                List<List<ArcImsFeature>> feats = null;
255
                try {
256
                        feats = ((ArcImsProtFeatureHandler) arcimsClient.getHandler())
257
                                        .getMap((ArcImsVectStatus) arcimsStatus);
258
                } catch (ArcImsException e) {
259
                        logger.debug("Error getting the atributes", e);
260
                }
261
                if (feats != null && feats.size() > 0) {
262
                        // TODO Por ahora solo el primer elemento
263
                        List<ArcImsFeature> feats2 = feats.get(0);
264
                        for (ArcImsFeature aFeat : feats2) {
265
                                if (aFeat.isValid()) {
266
                                        try {
267
                                                this.addFeatureToStore((FeatureStore) store, aFeat);
268
                                                this.numFeats++;
269
                                        } catch (DataException e) {
270
                                                logger.error("Error adding feature", e);
271
                                                continue;
272
                                        }
273
                                }
274

    
275
                        }
276
                }
277
                isOpen = true;
278

    
279
        }
280

    
281
        /**
282
         * 
283
         * @param store
284
         * @param feature
285
         * @throws DataException
286
         */
287
        public void addFeatureToStore(FeatureStore store, ArcImsFeature feature)
288
                        throws DataException {
289

    
290
                if (store != null) {
291

    
292
                        FeatureType dfType = store.getDefaultFeatureType();
293
                        String pk = feature.getFieldPK();
294
                        Object opk = feature.get(pk);
295
                        FeatureProvider data = new DefaultFeatureProvider(dfType, opk);
296
                        data.setDefaultGeometry(feature.getGeometry());
297
                        Iterator<Map.Entry<String, Object>> it = feature.entrySet()
298
                                        .iterator();
299
                        while (it.hasNext()) {
300
                                Map.Entry<String, Object> entry = it.next();
301
                                String key = entry.getKey();
302
                                Object value = entry.getValue();
303
                                if (key.compareToIgnoreCase("#SHAPE#") != 0) {
304
                                        data.set(key, value);
305
                                }
306

    
307
                        }
308
                        Feature fe = ((FeatureStoreProviderServices) store)
309
                                        .createFeature(data);
310
                        DefaultFeature dfeat = (DefaultFeature) fe;
311
                        FeatureReference ref = dfeat.getReference();
312
                        features.add(fe);
313
                }
314
        }
315

    
316
        /**
317
         * 
318
         * @param params
319
         * @param layerId
320
         * @param status
321
         * @return
322
         */
323
        private FeatureType createFeatureType(ArcImsStoreParameters params,
324
                        String layerId, ArcImsStatus status) {
325

    
326
                logger.info("ArcImsStoreProvider: createFeatureType");
327

    
328
                EditableFeatureType eFType = ((FeatureStoreProviderServices) this
329
                                .getFeatureStore()).createFeatureType();
330
                ServiceInformation infoService = status.getServiceInfo();
331
                ServiceInformationLayerFeatures infoLayer = (ServiceInformationLayerFeatures) infoService
332
                                .getLayerById(layerId);
333

    
334
                Vector<FieldInformation> fieldsInfo = infoLayer.getFieldsInfo();
335
                for (FieldInformation fieldInfo : fieldsInfo) {
336
                        logger.info("Name: " + fieldInfo.getName() + " Type: "
337
                                        + fieldInfo.getType());
338
                        if (parseType(fieldInfo.getType()) == DataTypes.GEOMETRY) {
339
                                // TYPES.GEOMETRY
340
                                String geometryType = status.getServiceInfo().getType();
341
                                int geomType = TYPES.SURFACE;
342
                                if (geometryType.compareToIgnoreCase("line") == 0) {
343
                                        geomType = TYPES.CURVE;
344
                                }
345
                                if (geometryType.compareToIgnoreCase("point") == 0) {
346
                                        geomType = TYPES.POINT;
347
                                }
348

    
349
                                EditableFeatureAttributeDescriptor attributeDescriptor = eFType
350
                                                .add("geom", DataTypes.GEOMETRY).setGeometryType(
351
                                                                geomType);
352
                                attributeDescriptor.setGeometrySubType(SUBTYPES.GEOM2D);
353
                                attributeDescriptor.setSRS(CRSFactory.getCRS(arcimsStatus
354
                                                .getSrs()));
355
                                // attributeDescriptor.setIsPrimaryKey(true);
356
                                eFType.setDefaultGeometryAttributeName("geom");
357
                        } else {
358
                                eFType.add(fieldInfo.getName(), parseType(fieldInfo.getType()));
359
                                if (fieldInfo.getType() == -99) {
360
                                        int si = eFType.size();
361
                                        FeatureAttributeDescriptor attri = eFType
362
                                                        .getAttributeDescriptor(si - 1);
363
                                        ((EditableFeatureAttributeDescriptor) attri)
364
                                                        .setIsPrimaryKey(true);
365
                                        eFType.setHasOID(true);
366
                                }
367
                        }
368
                }
369

    
370
                return eFType.getNotEditableCopy();
371
        }
372

    
373
        /**
374
         * It executes a wfs Query without spatial filter
375
         * 
376
         * @throws DataException
377
         */
378
        private void executeQuery() throws DataException {
379

    
380
                logger.info("ArcImsStoreProvider: executeQuery");
381

    
382
        }
383

    
384
        /*
385
         * (non-Javadoc)
386
         * 
387
         * @see
388
         * org.gvsig.fmap.dal.feature.spi.AbstractFeatureStoreProvider#getExplorer()
389
         */
390
        public DataServerExplorer getExplorer() throws ReadException {
391

    
392
                logger.info("ArcImsStoreProvider: getExplorer");
393

    
394
                DataManager manager = DALLocator.getDataManager();
395
                ArcImsServerExplorerParameters params;
396
                try {
397
                        params = (ArcImsServerExplorerParameters) manager
398
                                        .createServerExplorerParameters(ArcImsServerExplorer.NAME);
399
                        params.setUrl(arcimsClient.getHost());
400
                        params.setVersion(arcimsStatus.getServerVersion());
401
                        return manager.createServerExplorer(params);
402
                } catch (Exception e) {
403
                        throw new ReadException(this.getName(), e);
404
                }
405
        }
406

    
407
        /**
408
         * 
409
         */
410
        private void initDefaultFeatureType() {
411

    
412
                FeatureStoreProviderServices store = (FeatureStoreProviderServices) this
413
                                .getFeatureStore();
414
                // Add Feature type
415
                FeatureType defaultFType = this.createFeatureType(
416
                                getArcImsParameters(), arcimsStatus.getLayersIdsSelected().get(
417
                                                0), arcimsStatus);
418
                List<FeatureType> types = new ArrayList<FeatureType>(1);
419
                types.add(defaultFType);
420
                store.setFeatureTypes(types, defaultFType);
421

    
422
        }
423

    
424
        /**
425
         * Get number
426
         * 
427
         * @return
428
         */
429
        public int getNumFeats() {
430
                return numFeats;
431
        }
432

    
433
        /**
434
         * 
435
         * @return
436
         * @throws DataException
437
         */
438
        public HashMap getMapFeatures() throws DataException {
439
                HashMap feats = new HashMap();
440
                FeatureStore store = this.getFeatureStore();
441
                FeatureSelection sel = store.getFeatureSelection();
442
                sel.selectAll();
443
                Iterator<Feature> it = sel.iterator();
444
                int id = 0;
445
                while (it.hasNext()) {
446
                        Feature feat = it.next();
447
                        feats.put(id, feat);
448
                        id++;
449
                }
450

    
451
                return feats;
452
        }
453

    
454
        /**
455
         * Parse arcims attribute type to gvsig attribute type
456
         * 
457
         * @param arcimsType
458
         * @return
459
         */
460
        private int parseType(int arcimsType) {
461

    
462
                switch (arcimsType) {
463
                case FieldInformation.BOOLEAN:
464
                        return DataTypes.BOOLEAN;
465
                case FieldInformation.SHAPE:
466
                        return DataTypes.GEOMETRY;
467
                case FieldInformation.STRING:
468
                        return DataTypes.STRING;
469
                case FieldInformation.DATE:
470
                        return DataTypes.DATE;
471
                case FieldInformation.FLOAT:
472
                        return DataTypes.FLOAT;
473
                case FieldInformation.DOUBLE:
474
                        return DataTypes.DOUBLE;
475
                case FieldInformation.SMALLINT:
476
                        return DataTypes.INT;
477
                case FieldInformation.BIGINT:
478
                        return DataTypes.INT;
479
                case FieldInformation.ID:
480
                        return DataTypes.STRING;
481
                case FieldInformation.INTEGER:
482
                        return DataTypes.INT;
483
                default:
484
                        return DataTypes.UNKNOWN;
485
                }
486

    
487
        }
488

    
489
        /**
490
         * Get arcims parameters
491
         * 
492
         * @return
493
         */
494
        private ArcImsStoreParameters getArcImsParameters() {
495
                return (ArcImsStoreParameters) getParameters();
496
        }
497

    
498
        /**
499
         * 
500
         * @return
501
         */
502
        public List<Feature> getFeatures() {
503
                return features;
504
        }
505

    
506
}