Statistics
| Revision:

root / trunk / extensions / extWFS / src / com / iver / cit / gvsig / fmap / drivers / wfs / WFSDriver.java @ 2923

History | View | Annotate | Download (12.8 KB)

1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 *
19
 * For more information, contact:
20
 *
21
 *  Generalitat Valenciana
22
 *   Conselleria d'Infraestructures i Transport
23
 *   Av. Blasco Ib??ez, 50
24
 *   46010 VALENCIA
25
 *   SPAIN
26
 *
27
 *      +34 963862235
28
 *   gvsig@gva.es
29
 *      www.gvsig.gva.es
30
 *
31
 *    or
32
 *
33
 *   IVER T.I. S.A
34
 *   Salamanca 50
35
 *   46005 Valencia
36
 *   Spain
37
 *
38
 *   +34 963163400
39
 *   dac@iver.es
40
 */
41
package com.iver.cit.gvsig.fmap.drivers.wfs;
42

    
43
import java.awt.geom.Rectangle2D;
44
import java.io.IOException;
45
import java.net.MalformedURLException;
46
import java.net.URL;
47
import java.sql.SQLException;
48
import java.util.ArrayList;
49
import java.util.HashMap;
50
import java.util.Hashtable;
51
import java.util.Map;
52

    
53
import org.geotools.data.DataStore;
54
import org.geotools.data.DefaultQuery;
55
import org.geotools.data.FeatureReader;
56
import org.geotools.data.Query;
57
import org.geotools.data.Transaction;
58
import org.geotools.data.wfs.WFSDataStoreFactory;
59
import org.geotools.feature.AttributeType;
60
import org.geotools.filter.FidFilter;
61
import org.geotools.filter.Filter;
62
import org.geotools.filter.FilterFactory;
63

    
64
import com.hardcode.gdbms.engine.data.DataSourceFactory;
65
import com.hardcode.gdbms.engine.data.driver.ObjectDriver;
66
import com.hardcode.gdbms.engine.data.edition.DataWare;
67
import com.hardcode.gdbms.engine.values.Value;
68
import com.iver.cit.gvsig.fmap.DriverException;
69
import com.iver.cit.gvsig.fmap.core.FShape;
70
import com.iver.cit.gvsig.fmap.core.IFeature;
71
import com.iver.cit.gvsig.fmap.core.IGeometry;
72
import com.iver.cit.gvsig.fmap.drivers.DriverAttributes;
73
import com.iver.cit.gvsig.fmap.drivers.IFeatureIterator;
74
import com.iver.cit.gvsig.fmap.drivers.IWFSdriver;
75

    
76

    
77
/**
78
 * Driver de WFS, utilizando DataStore de geotools.
79
 *
80
 * @author Vicente Caballero Navarro
81
 */
82
public class WFSDriver implements IWFSdriver, ObjectDriver {
83
        private Rectangle2D fullExtent = null;
84
        private Rectangle2D extent = null;
85
        private DataStore ds;
86

    
87
        //private FeatureReader fr;
88
        private String urlS = "http://localhost:8080/geoserver/wfs";
89
        private String versionS = "version=1.0.0";
90
        private String requestS = "request=getcapabilities";
91
        private String serviceS = "service=wfs";
92
        private String userS = "admin";
93
        private String pwdS = "geoserver";
94
        private String[] layersS;
95
        private boolean protocolS = true;
96
        private int numFeaturesS = 100;
97
        private int timeoutS = 10000;
98
        private Hashtable hashRelate;
99

    
100
        ///private Hashtable indexFID;
101
        protected int idFID_FieldName;
102
        private int numReg = -1;
103
        private int numField = -1;
104
        private AttributeType[] attributes;
105

    
106
        //private FeatureReader fr;
107
        ///private ArrayList typeNames=new ArrayList();
108
        private ArrayList features = new ArrayList();
109

    
110
        /**
111
         * DOCUMENT ME!
112
         *
113
         * @return DOCUMENT ME!
114
         */
115
        public Rectangle2D getFullExtent() {
116
                return fullExtent;
117
        }
118

    
119
        /**
120
         * DOCUMENT ME!
121
         *
122
         * @return DOCUMENT ME!
123
         */
124
        public int getShapeType() {
125
                return FShape.MULTI;
126
        }
127

    
128
        /**
129
         * DOCUMENT ME!
130
         *
131
         * @param fids DOCUMENT ME!
132
         *
133
         * @return DOCUMENT ME!
134
         */
135
        private Filter createFidFilter(String[] fids) {
136
                FidFilter filter = FilterFactory.createFilterFactory().createFidFilter();
137

    
138
                for (int i = 0; i < fids.length; i++) {
139
                        filter.addFid(fids[i]);
140
                }
141

    
142
                return filter;
143
        }
144

    
145
        /**
146
         * DOCUMENT ME!
147
         *
148
         * @param index DOCUMENT ME!
149
         *
150
         * @return DOCUMENT ME!
151
         */
152
        public IGeometry getShape(int index) {
153
                return ((IFeature) features.get(index)).getGeometry();
154
        }
155

    
156
        /**
157
         * DOCUMENT ME!
158
         *
159
         * @return DOCUMENT ME!
160
         */
161
        public URL getHost() {
162
                try {
163
                        return new URL(urlS + "?" + versionS + "&" + requestS + "&" +
164
                                serviceS);
165
                } catch (MalformedURLException e) {
166
                        e.printStackTrace();
167
                }
168

    
169
                return null;
170
        }
171

    
172
        /**
173
         * DOCUMENT ME!
174
         *
175
         * @param r DOCUMENT ME!
176
         * @param strEPSG DOCUMENT ME!
177
         *
178
         * @return DOCUMENT ME!
179
         *
180
         * @throws DriverException DOCUMENT ME!
181
         * @throws IOException 
182
         */
183
        public IFeatureIterator getFeatureIterator(Rectangle2D r, String strEPSG)
184
                throws DriverException, IOException {
185
                WFSFeatureIterator geomIterator = null;
186

    
187
                /*if (r!=null && extent.contains(r)){
188
                   //extent=(Rectangle2D)r.clone();
189
                   return new WFSFeatureIterator(features);
190
                   }
191
                 */
192

    
193
                // ArrayList shapes=new ArrayList();   
194

    
195
                /*        BBoxExpressionImpl RectangleFilter=null;
196
                   try {
197
                           RectangleFilter = (BBoxExpressionImpl)FilterFactoryImpl.createFilterFactory().createBBoxExpression(new Envelope(fullExtent.getX(),fullExtent.getY(),fullExtent.getMaxX(),fullExtent.getMaxY()));
198
                   } catch (IllegalFilterException e2) {
199
                           e2.printStackTrace();
200
                   } catch (FactoryConfigurationError e2) {
201
                           e2.printStackTrace();
202
                   }
203
                 */
204
                Query query = new DefaultQuery(layersS[0]);
205
                FeatureReader fr = null;
206

    
207
                
208
                        fr = ds.getFeatureReader(query, Transaction.AUTO_COMMIT);
209

    
210
                        if (numField == -1) {
211
                                numField = fr.getFeatureType().getAttributeCount();
212
                                attributes = fr.getFeatureType().getAttributeTypes();
213
                        }
214
                
215
                geomIterator = new WFSFeatureIterator(fr);
216
                return geomIterator;
217
        }
218

    
219
        /**
220
         * DOCUMENT ME!
221
         */
222
        public void close() {
223
        }
224

    
225
        /**
226
         * DOCUMENT ME!
227
         *
228
         * @throws DriverException DOCUMENT ME!
229
         */
230
        public void open() throws DriverException {
231
        }
232

    
233
        /**
234
         * DOCUMENT ME!
235
         *
236
         * @param FID DOCUMENT ME!
237
         *
238
         * @return DOCUMENT ME!
239
         */
240
        public int getRowIndexByFID(IFeature FID) {
241
                int resul;
242
                Integer rowIndex = (Integer) hashRelate.get(FID.getID());
243
                resul = rowIndex.intValue();
244

    
245
                return resul;
246
        }
247

    
248
        /**
249
         * DOCUMENT ME!
250
         *
251
         * @return DOCUMENT ME!
252
         *
253
         * @throws IOException DOCUMENT ME!
254
         */
255
        public int getShapeCount() throws IOException {
256
                return numReg;
257
        }
258

    
259
        /**
260
         * DOCUMENT ME!
261
         *
262
         * @return DOCUMENT ME!
263
         */
264
        public DriverAttributes getDriverAttributes() {
265
                return null;
266
        }
267

    
268
        /**
269
         * DOCUMENT ME!
270
         *
271
         * @return DOCUMENT ME!
272
         */
273
        public String getName() {
274
                return "WFS Driver";
275
        }
276

    
277
        /**
278
         * Recorre el recordset creando una tabla Hash que usaremos para
279
         * relacionar el n?mero de un registro con su identificador ?nico. Debe
280
         * ser llamado en el setData justo despu?s de crear el recorset principal
281
         * @throws IOException 
282
         */
283
        protected void doRelateID_FID() throws IOException {
284
                if (ds == null) {
285
                        URL url = null;
286

    
287
                        try {
288
                                url = new URL(urlS + "?" + versionS + "&" + requestS + "&" +
289
                                                serviceS);
290
                        } catch (MalformedURLException e) {
291
                                e.printStackTrace();
292
                        }
293

    
294
                        //int timeout=10000;
295
                        //boolean protocol=true;
296
                        Map m = new HashMap();
297
                        m.put(WFSDataStoreFactory.URL.key, url);
298
                        m.put(WFSDataStoreFactory.TIMEOUT.key, new Integer(timeoutS));
299
                        m.put(WFSDataStoreFactory.PROTOCOL.key, new Boolean(protocolS));
300
                        m.put(WFSDataStoreFactory.PASSWORD.key, pwdS);
301
                        m.put(WFSDataStoreFactory.USERNAME.key, userS);
302
                        m.put(WFSDataStoreFactory.BUFFER_SIZE.key, new Integer(numFeaturesS));
303

    
304
                        try {
305
                                ds = (new WFSDataStoreFactory()).createNewDataStore(m);
306
                        } catch (IOException e) {
307
                                e.printStackTrace();
308
                        }
309

    
310
                        /*
311
                           String[] names=null;
312
                           try {
313
                                   names = ds.getTypeNames();
314
                           } catch (IOException e1) {
315
                                   e1.printStackTrace();
316
                           }
317
                           System.out.println("Capas :");
318
                        
319
                           for (int i=0;i<names.length;i++){
320
                                   System.out.println("Capa "+i+" : "+names[i]);
321
                                   //Se selecciona la capa que se quiere abrir
322
                                   //if (true)//si esta seleccionada en la lista o arbol que se muestre en el wizard
323
                                   //typeNames.add(names[i]);
324
                           }
325
                         */
326
                }
327

    
328
                hashRelate = new Hashtable();
329

    
330
                ///indexFID = new Hashtable();
331
                //Query query = new DefaultQuery(layersS[0]);
332

    
333
                //FeatureReader fr=null;
334
                //fr = ds.getFeatureReader(query,Transaction.AUTO_COMMIT);
335
                int index = 0;
336
                IFeatureIterator iter = null;
337

    
338
                try {
339
                        iter = getFeatureIterator(null, null);
340
                } catch (DriverException e) {
341
                        e.printStackTrace();
342
                }
343

    
344
                try {
345
                        while (iter.hasNext()) {
346
                                IFeature feature = iter.next();
347
                                features.add(feature);
348

    
349
                                Rectangle2D rect = feature.getGeometry().getBounds2D();
350

    
351
                                if (fullExtent == null) {
352
                                        fullExtent = new Rectangle2D.Double(rect.getMinX(),
353
                                                        rect.getMinY(), rect.getWidth(), rect.getHeight());
354
                                } else {
355
                                        fullExtent.add(new Rectangle2D.Double(rect.getMinX(),
356
                                                        rect.getMinY(), rect.getWidth(), rect.getHeight()));
357
                                }
358

    
359
                                hashRelate.put(feature.getID(), new Integer(index));
360

    
361
                                ///indexFID.put(new Integer(index),feature.getID());
362
                                index++;
363
                        }
364
                } catch (SQLException e) {
365
                        e.printStackTrace();
366
                }
367

    
368
                numReg = index;
369
                extent = (Rectangle2D)fullExtent.clone();
370
        }
371

    
372
        /**
373
         * DOCUMENT ME!
374
         *
375
         * @param url DOCUMENT ME!
376
         * @param user DOCUMENT ME!
377
         * @param pwd DOCUMENT ME!
378
         * @param layers DOCUMENT ME!
379
         * @param protocol DOCUMENT ME!
380
         * @param numFeatures DOCUMENT ME!
381
         * @param timeout DOCUMENT ME!
382
         * @param id_FID_field DOCUMENT ME!
383
         * @throws IOException 
384
         */
385
        public void setData(String url, String user, String pwd, String[] layers,
386
                boolean protocol, int numFeatures, int timeout, int id_FID_field) throws IOException {
387
                idFID_FieldName = id_FID_field;
388
                urlS = url;
389
                userS = user;
390
                pwdS = pwd;
391
                layersS = layers;
392
                protocolS = protocol;
393
                numFeaturesS = numFeatures;
394
                timeoutS = timeout;
395
                doRelateID_FID();
396
        }
397

    
398
        /**
399
         * DOCUMENT ME!
400
         *
401
         * @param arg0 DOCUMENT ME!
402
         * @param arg1 DOCUMENT ME!
403
         *
404
         * @return DOCUMENT ME!
405
         *
406
         * @throws com.hardcode.gdbms.engine.data.driver.DriverException DOCUMENT ME!
407
         */
408
        public Value getFieldValue(long arg0, int arg1)
409
                throws com.hardcode.gdbms.engine.data.driver.DriverException {
410
                /*try {
411
                   ds.getTypeNames();
412
                   } catch (IOException e1) {
413
                           e1.printStackTrace();
414
                   }*/
415
                /*System.out.println("Filter");
416
                   Filter fidFilter=createFilter(new String[]{(String)indexFID.get(new Integer((int)arg0))});
417
                   System.out.println("Query");
418
                   Query query = new DefaultQuery((String)typeNames.get(0),fidFilter);
419
                   FeatureReader fr=null;
420
                   try {
421
                           System.out.println("getFeatureReader");
422
                           fr = ds.getFeatureReader(query,Transaction.AUTO_COMMIT);
423
                   } catch (IOException e) {
424
                           e.printStackTrace();
425
                   }
426
                           try {
427
                                   return getValue(fr,arg1);
428
                           } catch (NoSuchElementException e) {
429
                                   e.printStackTrace();
430
                           } catch (IOException e) {
431
                                   e.printStackTrace();
432
                           } catch (IllegalAttributeException e) {
433
                                   e.printStackTrace();
434
                           }
435
                 */
436
                return ((IFeature) features.get((int) arg0)).getAttribute(arg1);
437
        }
438

    
439
        /**
440
         * DOCUMENT ME!
441
         *
442
         * @return DOCUMENT ME!
443
         *
444
         * @throws com.hardcode.gdbms.engine.data.driver.DriverException DOCUMENT ME!
445
         */
446
        public int getFieldCount()
447
                throws com.hardcode.gdbms.engine.data.driver.DriverException {
448
                return numField;
449
        }
450

    
451
        /**
452
         * DOCUMENT ME!
453
         *
454
         * @param arg0 DOCUMENT ME!
455
         *
456
         * @return DOCUMENT ME!
457
         *
458
         * @throws com.hardcode.gdbms.engine.data.driver.DriverException DOCUMENT ME!
459
         */
460
        public String getFieldName(int arg0)
461
                throws com.hardcode.gdbms.engine.data.driver.DriverException {
462
                return attributes[arg0].getName();
463
        }
464

    
465
        /**
466
         * DOCUMENT ME!
467
         *
468
         * @return DOCUMENT ME!
469
         *
470
         * @throws com.hardcode.gdbms.engine.data.driver.DriverException DOCUMENT ME!
471
         */
472
        public long getRowCount()
473
                throws com.hardcode.gdbms.engine.data.driver.DriverException {
474
                return numReg;
475
        }
476

    
477
        /**
478
         * DOCUMENT ME!
479
         *
480
         * @param arg0 DOCUMENT ME!
481
         *
482
         * @return DOCUMENT ME!
483
         *
484
         * @throws com.hardcode.gdbms.engine.data.driver.DriverException DOCUMENT ME!
485
         */
486
        public int getFieldType(int arg0)
487
                throws com.hardcode.gdbms.engine.data.driver.DriverException {
488
                attributes[arg0].getType();
489

    
490
                return FIELD_TYPE_STRING; //fr.getFeatureType().getAttributeType(arg0).getType();
491
        }
492

    
493
    /**
494
     * @see com.hardcode.gdbms.engine.data.driver.ObjectDriver#getPrimaryKeys()
495
     */
496
    public int[] getPrimaryKeys() throws com.hardcode.gdbms.engine.data.driver.DriverException {
497
        throw new UnsupportedOperationException();
498
    }
499

    
500
    /**
501
     * @see com.hardcode.gdbms.engine.data.driver.ObjectDriver#write(com.hardcode.gdbms.engine.data.edition.DataWare)
502
     */
503
    public void write(DataWare arg0) throws com.hardcode.gdbms.engine.data.driver.DriverException {
504
        // TODO Auto-generated method stub
505
        
506
    }
507

    
508
        public void setDataSourceFactory(DataSourceFactory arg0) {
509
                // TODO Auto-generated method stub
510
                
511
        }
512
}