Statistics
| Revision:

root / trunk / libraries / libFMap / src / com / iver / cit / gvsig / fmap / drivers / wfs / WFSDriver.java @ 2183

History | View | Annotate | Download (12.2 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 com.hardcode.gdbms.engine.data.driver.ObjectDriver;
44
import com.hardcode.gdbms.engine.values.Value;
45

    
46
import com.iver.cit.gvsig.fmap.DriverException;
47
import com.iver.cit.gvsig.fmap.core.FShape;
48
import com.iver.cit.gvsig.fmap.core.IFeature;
49
import com.iver.cit.gvsig.fmap.core.IGeometry;
50
import com.iver.cit.gvsig.fmap.drivers.DriverAttributes;
51
import com.iver.cit.gvsig.fmap.drivers.IFeatureIterator;
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

    
60
import org.geotools.feature.AttributeType;
61

    
62
import org.geotools.filter.FidFilter;
63
import org.geotools.filter.Filter;
64
import org.geotools.filter.FilterFactory;
65

    
66
import java.awt.geom.Rectangle2D;
67

    
68
import java.io.IOException;
69

    
70
import java.net.MalformedURLException;
71
import java.net.URL;
72

    
73
import java.sql.SQLException;
74

    
75
import java.util.ArrayList;
76
import java.util.HashMap;
77
import java.util.Hashtable;
78
import java.util.Map;
79

    
80

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

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

    
104
        ///private Hashtable indexFID;
105
        protected int idFID_FieldName;
106
        private int numReg = -1;
107
        private int numField = -1;
108
        private AttributeType[] attributes;
109

    
110
        //private FeatureReader fr;
111
        ///private ArrayList typeNames=new ArrayList();
112
        private ArrayList features = new ArrayList();
113

    
114
        /**
115
         * DOCUMENT ME!
116
         *
117
         * @return DOCUMENT ME!
118
         */
119
        public Rectangle2D getFullExtent() {
120
                return fullExtent;
121
        }
122

    
123
        /**
124
         * DOCUMENT ME!
125
         *
126
         * @return DOCUMENT ME!
127
         */
128
        public int getShapeType() {
129
                return FShape.MULTI;
130
        }
131

    
132
        /**
133
         * DOCUMENT ME!
134
         *
135
         * @param fids DOCUMENT ME!
136
         *
137
         * @return DOCUMENT ME!
138
         */
139
        private Filter createFidFilter(String[] fids) {
140
                FidFilter filter = FilterFactory.createFilterFactory().createFidFilter();
141

    
142
                for (int i = 0; i < fids.length; i++) {
143
                        filter.addFid(fids[i]);
144
                }
145

    
146
                return filter;
147
        }
148

    
149
        /**
150
         * DOCUMENT ME!
151
         *
152
         * @param index DOCUMENT ME!
153
         *
154
         * @return DOCUMENT ME!
155
         */
156
        public IGeometry getShape(int index) {
157
                return ((IFeature) features.get(index)).getGeometry();
158
        }
159

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

    
173
                return null;
174
        }
175

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

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

    
196
                // ArrayList shapes=new ArrayList();   
197

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

    
210
                try {
211
                        fr = ds.getFeatureReader(query, Transaction.AUTO_COMMIT);
212

    
213
                        if (numField == -1) {
214
                                numField = fr.getFeatureType().getAttributeCount();
215
                                attributes = fr.getFeatureType().getAttributeTypes();
216
                        }
217
                } catch (IOException e) {
218
                        e.printStackTrace();
219
                }
220

    
221
                geomIterator = new WFSFeatureIterator(fr);
222
                return geomIterator;
223
        }
224

    
225
        /**
226
         * DOCUMENT ME!
227
         */
228
        public void close() {
229
        }
230

    
231
        /**
232
         * DOCUMENT ME!
233
         *
234
         * @throws DriverException DOCUMENT ME!
235
         */
236
        public void open() throws DriverException {
237
        }
238

    
239
        /**
240
         * DOCUMENT ME!
241
         *
242
         * @param FID DOCUMENT ME!
243
         *
244
         * @return DOCUMENT ME!
245
         */
246
        public int getRowIndexByFID(IFeature FID) {
247
                int resul;
248
                Integer rowIndex = (Integer) hashRelate.get(FID.getID());
249
                resul = rowIndex.intValue();
250

    
251
                return resul;
252
        }
253

    
254
        /**
255
         * DOCUMENT ME!
256
         *
257
         * @return DOCUMENT ME!
258
         *
259
         * @throws IOException DOCUMENT ME!
260
         */
261
        public int getShapeCount() throws IOException {
262
                return numReg;
263
        }
264

    
265
        /**
266
         * DOCUMENT ME!
267
         *
268
         * @return DOCUMENT ME!
269
         */
270
        public DriverAttributes getDriverAttributes() {
271
                return null;
272
        }
273

    
274
        /**
275
         * DOCUMENT ME!
276
         *
277
         * @return DOCUMENT ME!
278
         */
279
        public String getName() {
280
                return "WFS Driver";
281
        }
282

    
283
        /**
284
         * Recorre el recordset creando una tabla Hash que usaremos para
285
         * relacionar el n?mero de un registro con su identificador ?nico. Debe
286
         * ser llamado en el setData justo despu?s de crear el recorset principal
287
         */
288
        protected void doRelateID_FID() {
289
                if (ds == null) {
290
                        URL url = null;
291

    
292
                        try {
293
                                url = new URL(urlS + "?" + versionS + "&" + requestS + "&" +
294
                                                serviceS);
295
                        } catch (MalformedURLException e) {
296
                                e.printStackTrace();
297
                        }
298

    
299
                        //int timeout=10000;
300
                        //boolean protocol=true;
301
                        Map m = new HashMap();
302
                        m.put(WFSDataStoreFactory.URL.key, url);
303
                        m.put(WFSDataStoreFactory.TIMEOUT.key, new Integer(timeoutS));
304
                        m.put(WFSDataStoreFactory.PROTOCOL.key, new Boolean(protocolS));
305
                        m.put(WFSDataStoreFactory.PASSWORD.key, pwdS);
306
                        m.put(WFSDataStoreFactory.USERNAME.key, userS);
307
                        m.put(WFSDataStoreFactory.BUFFER_SIZE.key, new Integer(numFeaturesS));
308

    
309
                        try {
310
                                ds = (new WFSDataStoreFactory()).createNewDataStore(m);
311
                        } catch (IOException e) {
312
                                e.printStackTrace();
313
                        }
314

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

    
333
                hashRelate = new Hashtable();
334

    
335
                ///indexFID = new Hashtable();
336
                //Query query = new DefaultQuery(layersS[0]);
337

    
338
                //FeatureReader fr=null;
339
                //fr = ds.getFeatureReader(query,Transaction.AUTO_COMMIT);
340
                int index = 0;
341
                IFeatureIterator iter = null;
342

    
343
                try {
344
                        iter = getFeatureIterator(null, null);
345
                } catch (DriverException e) {
346
                        e.printStackTrace();
347
                }
348

    
349
                try {
350
                        while (iter.hasNext()) {
351
                                IFeature feature = iter.next();
352
                                features.add(feature);
353

    
354
                                Rectangle2D rect = feature.getGeometry().getBounds2D();
355

    
356
                                if (fullExtent == null) {
357
                                        fullExtent = new Rectangle2D.Double(rect.getMinX(),
358
                                                        rect.getMinY(), rect.getWidth(), rect.getHeight());
359
                                } else {
360
                                        fullExtent.add(new Rectangle2D.Double(rect.getMinX(),
361
                                                        rect.getMinY(), rect.getWidth(), rect.getHeight()));
362
                                }
363

    
364
                                hashRelate.put(feature.getID(), new Integer(index));
365

    
366
                                ///indexFID.put(new Integer(index),feature.getID());
367
                                index++;
368
                        }
369
                } catch (SQLException e) {
370
                        e.printStackTrace();
371
                }
372

    
373
                numReg = index;
374
                extent = (Rectangle2D)fullExtent.clone();
375
        }
376

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

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

    
443
        /**
444
         * DOCUMENT ME!
445
         *
446
         * @return DOCUMENT ME!
447
         *
448
         * @throws com.hardcode.gdbms.engine.data.driver.DriverException DOCUMENT ME!
449
         */
450
        public int getFieldCount()
451
                throws com.hardcode.gdbms.engine.data.driver.DriverException {
452
                return numField - 1;
453
        }
454

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

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

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

    
494
                return FIELD_TYPE_STRING; //fr.getFeatureType().getAttributeType(arg0).getType();
495
        }
496

    
497
    /**
498
     * @see com.hardcode.gdbms.engine.data.driver.ObjectDriver#getPrimaryKeys()
499
     */
500
    public int[] getPrimaryKeys() throws com.hardcode.gdbms.engine.data.driver.DriverException {
501
        throw new UnsupportedOperationException();
502
    }
503
}