Statistics
| Revision:

svn-gvsig-desktop / branches / v10 / extensions / extArcims / src / es / prodevelop / cit / gvsig / arcims / fmap / layers / FFeatureLyrArcIMSCollection.java @ 20976

History | View | Annotate | Download (18.3 KB)

1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2006 Prodevelop 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
 *   Prodevelop Integraci?n de Tecnolog?as SL
34
 *   Conde Salvatierra de ?lava , 34-10
35
 *   46004 Valencia
36
 *   Spain
37
 *
38
 *   +34 963 510 612
39
 *   +34 963 510 968
40
 *   gis@prodevelop.es
41
 *   http://www.prodevelop.es
42
 */
43
package es.prodevelop.cit.gvsig.arcims.fmap.layers;
44

    
45
import com.iver.cit.gvsig.fmap.DriverException;
46
import com.iver.cit.gvsig.fmap.MapContext;
47
import com.iver.cit.gvsig.fmap.ViewPort;
48
import com.iver.cit.gvsig.fmap.crs.CRSFactory;
49
import com.iver.cit.gvsig.fmap.edition.VectorialEditableAdapter;
50
import com.iver.cit.gvsig.fmap.layers.CancelationException;
51
import com.iver.cit.gvsig.fmap.layers.FLayer;
52
import com.iver.cit.gvsig.fmap.layers.FLayers;
53
import com.iver.cit.gvsig.fmap.layers.LayerCollectionEvent;
54
import com.iver.cit.gvsig.fmap.layers.LayerCollectionListener;
55
import com.iver.cit.gvsig.fmap.layers.LayerDrawEvent;
56
import com.iver.cit.gvsig.fmap.layers.LayerPositionEvent;
57
import com.iver.cit.gvsig.fmap.layers.SelectionEvent;
58
import com.iver.cit.gvsig.fmap.layers.SelectionListener;
59
import com.iver.cit.gvsig.fmap.layers.XMLException;
60
import com.iver.cit.gvsig.fmap.layers.layerOperations.LayerCollection;
61

    
62
import com.iver.utiles.XMLEntity;
63
import com.iver.utiles.connections.ConnectionException;
64
import com.iver.utiles.swing.threads.Cancellable;
65
import com.iver.utiles.swing.threads.DefaultCancellableMonitorable;
66

    
67
import es.prodevelop.cit.gvsig.arcims.fmap.drivers.ArcImsVectorialAdapter;
68
import es.prodevelop.cit.gvsig.arcims.fmap.drivers.FMapFeatureArcImsDriver;
69

    
70
import org.apache.log4j.Logger;
71

    
72
import org.cresques.cts.IProjection;
73
import org.cresques.cts.ProjectionPool;
74

    
75
import org.gvsig.remoteClient.arcims.ArcImsFeatureClient;
76
import org.gvsig.remoteClient.arcims.ArcImsProtocolHandler;
77
import org.gvsig.remoteClient.arcims.utils.MyCancellable;
78
import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
79
import org.gvsig.remoteClient.arcims.utils.ServiceInformation;
80
import org.gvsig.remoteClient.arcims.utils.ServiceInformationLayer;
81
import org.gvsig.remoteClient.arcims.utils.ServiceInformationLayerFeatures;
82

    
83
import java.awt.Graphics2D;
84
import java.awt.geom.Rectangle2D;
85
import java.awt.image.BufferedImage;
86

    
87
import java.net.URL;
88

    
89
import java.util.ArrayList;
90
import java.util.Collections;
91
import java.util.ConcurrentModificationException;
92
import java.util.Iterator;
93
import java.util.List;
94
import java.util.Map;
95
import java.util.Vector;
96

    
97

    
98
public class FFeatureLyrArcIMSCollection extends FLayers
99
    implements SelectionListener, LayerCollectionListener {
100
    private static Logger logger = Logger.getLogger(FFeatureLyrArcIMSCollection.class.getName());
101
    private ArrayList layerlist = new ArrayList();
102
    private boolean mustBeSeparated = false;
103
    private MapContext myFMap;
104

    
105
    public FFeatureLyrArcIMSCollection(MapContext fmap, FLayers parent,
106
        boolean willbesep) {
107
        super(fmap, parent);
108
        myFMap = fmap;
109
        mustBeSeparated = willbesep;
110
    }
111

    
112
    public FFeatureLyrArcIMSCollection() {
113
        super(null, null);
114
    }
115

    
116
    /**
117
     * The extCatalogYNomenclator needs this creator.
118
     *
119
     * @param p a Map object with the following keys:
120
     *
121
     * (key, object type returned)
122
     * ---------------------------
123
     * "host", String (with or without the servlet path)
124
     * "service_name", String (remote service name)
125
     * "srs", String (coordinate system)
126
     * "layer_name", String (local layer name)
127
     *
128
     * @return a FFeatureLyrArcIMSCollection layer
129
     * @throws ConnectionException
130
     */
131
    public FFeatureLyrArcIMSCollection(Map m) throws ConnectionException {
132
        super(null, null);
133

    
134
        try {
135
            String _host = (String) m.get("host");
136
            String host = ArcImsProtocolHandler.getUrlWithServlet(new URL(_host))
137
                                               .toString();
138
            String service = (String) m.get("service_name");
139
            String _srs = (String) m.get("srs");
140
            String name = (String) m.get("layer_name");
141

    
142
            // in case layer_name is missing or equals the empty string:
143
            if ((name == null) || (name.length() == 0)) {
144
                name = service;
145
            }
146

    
147
            // --------------------------------------------
148
            IProjection srs = CRSFactory.getCRS(_srs);
149

    
150
            MyCancellable myCanc = new MyCancellable(new DefaultCancellableMonitorable());
151
            FMapFeatureArcImsDriver drv = new FMapFeatureArcImsDriver(host,
152
                    service);
153

    
154
            if (!drv.connect(myCanc)) {
155
                throw new Exception("Unable to connect to server. ");
156
            }
157

    
158
            ServiceInformation si = drv.getClient().getServiceInformation();
159
            int layercount = si.getLayers().size();
160
            String layerQuery = "";
161

    
162
            for (int i = 0; i < layercount; i++) {
163
                if (isTrueString(
164
                            ((ServiceInformationLayer) si.getLayer(i)).getVisible())) {
165
                    layerQuery = layerQuery + "," +
166
                        ((ServiceInformationLayer) si.getLayer(i)).getId();
167
                }
168
            }
169

    
170
            if (layerQuery.length() == 0) {
171
                throw new Exception("No layers are visible by default ");
172
            }
173
            else {
174
                layerQuery = layerQuery.substring(1);
175
            }
176

    
177
            String[] selectedLayerIds = layerQuery.split(",");
178
            int count = selectedLayerIds.length;
179

    
180
            FFeatureLyrArcIMS[] individualLayers = new FFeatureLyrArcIMS[count];
181

    
182
            String item;
183

    
184
            for (int i = 0; i < count; i++) {
185
                item = selectedLayerIds[i];
186

    
187
                drv = new FMapFeatureArcImsDriver(host, service, item);
188

    
189
                if (!(drv.connect(myCanc))) {
190
                    throw new Exception();
191
                }
192

    
193
                ArcImsVectorialAdapter oldadapter = new ArcImsVectorialAdapter(drv);
194
                VectorialEditableAdapter adapter = new VectorialEditableAdapter();
195

    
196
                /* 1 */ individualLayers[i] = new FFeatureLyrArcIMS(adapter);
197

    
198
                /* 2 */ drv.setLayer(individualLayers[i]);
199

    
200
                si = drv.getClient().getServiceInformation();
201

    
202
                ServiceInformationLayerFeatures silf = (ServiceInformationLayerFeatures) si.getLayerById(item);
203
                String lyrname = silf.getName();
204

    
205
                individualLayers[i].setProjectionInStatus(srs.getAbrev());
206
                individualLayers[i].setHostInStatus(new URL(host));
207
                individualLayers[i].setServiceInStatus(service);
208

    
209
                String units = si.getMapunits();
210
                int theDpi = si.getScreen_dpi();
211
                long scale;
212

    
213
                if (silf.getMaxscale() != -1) {
214
                    scale = LayerScaleData.getTrueScaleFromRelativeScaleAndMapUnits(silf.getMaxscale(),
215
                            units, theDpi);
216
                    individualLayers[i].setMaxScale((double) scale);
217
                }
218

    
219
                if (silf.getMinscale() != -1) {
220
                    scale = LayerScaleData.getTrueScaleFromRelativeScaleAndMapUnits(silf.getMinscale(),
221
                            units, theDpi);
222
                    individualLayers[i].setMinScale((double) scale);
223
                }
224

    
225
                individualLayers[i].setServiceInformationInStatus(si);
226

    
227
                Vector ids = new Vector();
228
                ids.add(item);
229
                individualLayers[i].setLayerIdsInStatus((Vector) ids.clone());
230
                individualLayers[i].setSubfieldsInStatus();
231

    
232
                /* 3 */
233
                // individualLayers[i].setLegend(new VectorialUniqueValueLegend());
234
                individualLayers[i].setHost(new URL(host));
235
                individualLayers[i].setService(service);
236
                individualLayers[i].setServiceType(ServiceInfoTags.vFEATURESERVICE);
237
                individualLayers[i].setTransparency(0);
238
                individualLayers[i].setLayerQuery(item);
239
                individualLayers[i].setProjection(srs);
240
                individualLayers[i].setName(lyrname);
241

    
242
                Rectangle2D fext = ((ArcImsFeatureClient) drv.getClient()).getLayerExtent(individualLayers[i].getArcimsStatus());
243
                drv.setFullExtent(fext);
244

    
245
                // individualLayers[i].setF. setFullExtent(((ArcImsProtImageHandler) drv.getClient().getHandler()).getServiceExtent(srs, individualLayers[i].getArcimsStatus()));
246

    
247
                // ------ -------------
248
                drv.setAdapter(adapter);
249

    
250
                // adapter.setRecordSet(drv.getRecordSet());
251
                adapter.setOriginalDataSource(drv.getRecordSet());
252
                adapter.setOriginalVectorialAdapter(oldadapter);
253
                drv.declareTable();
254
                individualLayers[i].setInitialLegend();
255
                individualLayers[i].setShapeType(adapter.getShapeType());
256
                individualLayers[i].setRecordset(drv.getRecordSet());
257

    
258
                // ------ -------------
259
                if ((si.getFeaturecoordsys() == null) ||
260
                        (si.getFeaturecoordsys().equals(""))) {
261
                    si.setFeaturecoordsys(srs.getAbrev()
262
                                             .substring(ServiceInfoTags.vINI_SRS.length())
263
                                             .trim());
264
                    logger.warn("Server provides no SRS. ");
265
                }
266
            }
267

    
268
            setName(name);
269
            setProjection(srs);
270

    
271
            for (int i = 0; i < count; i++) {
272
                addLayer(individualLayers[i]);
273
            }
274
        }
275
        catch (Exception e) {
276
            throw new ConnectionException("Unable to create ArcIMS feature layer collection ",
277
                e);
278
        }
279
    }
280

    
281
    public MapContext getMapContext() {
282
        return myFMap;
283
    }
284

    
285
    public boolean mustBeSeparated() {
286
        return mustBeSeparated;
287
    }
288

    
289
    public void hasBeenSeparated() {
290
        mustBeSeparated = false;
291
    }
292

    
293
    public void setParentLayer(FLayers lyr) {
294
        super.setParentLayer(lyr);
295

    
296
        if (lyr == null) {
297
            return;
298
        }
299

    
300
        myFMap = lyr.getMapContext();
301

    
302
        if (lyr instanceof LayerCollection) {
303
            LayerCollection lyrcol = (LayerCollection) lyr;
304
            lyrcol.addLayerCollectionListener(this);
305
        }
306
    }
307

    
308
    private List myGetList() {
309
        List resp = Collections.synchronizedList(new ArrayList());
310

    
311
        int count = getLayersCount();
312

    
313
        for (int i = 0; i < count; i++) {
314
            resp.add(getLayer(i));
315
        }
316

    
317
        return resp;
318
    }
319

    
320
    // we need to rewrite this method because we dont have access to fmap
321
    // and list
322
    public void draw(BufferedImage image, Graphics2D g, ViewPort viewPort,
323
        Cancellable cancel, double scale) throws DriverException {
324
        List myList = myGetList();
325

    
326
        Iterator iter = myList.iterator();
327

    
328
        try {
329
            while (iter.hasNext()) {
330
                if (cancel.isCanceled()) {
331
                    break; // M?s que nada porque las capas raster no son interrumpibles por ahora.
332
                }
333

    
334
                FLayer lyr = (FLayer) iter.next();
335
                LayerDrawEvent beforeEvent = new LayerDrawEvent(lyr, g,
336
                        viewPort, LayerDrawEvent.LAYER_BEFORE_DRAW);
337

    
338
                myFMap.fireLayerDrawingEvent(beforeEvent);
339

    
340
                if (lyr.isVisible()) {
341
                    long t1 = System.currentTimeMillis();
342

    
343
                    try {
344
                        lyr.draw(image, g, viewPort, cancel, scale);
345
                    }
346
                    catch (DriverException e) {
347
                        myFMap.addLayerError("La capa " + lyr.getName() +
348
                            " es err?nea.");
349
                        e.printStackTrace();
350
                    }
351

    
352
                    long t2 = System.currentTimeMillis();
353
                    logger.debug("Layer " + lyr.getName() + " - DRAWTIME = " +
354
                        (t2 - t1) + " milisecs.");
355
                }
356

    
357
                LayerDrawEvent afterEvent = new LayerDrawEvent(lyr, g,
358
                        viewPort, LayerDrawEvent.LAYER_AFTER_DRAW);
359
                myFMap.fireLayerDrawingEvent(afterEvent);
360
            }
361

    
362
            if (getVirtualLayers() != null) {
363
                getVirtualLayers().draw(image, g, viewPort, cancel, scale);
364
            }
365
        }
366
        catch (ConcurrentModificationException e) {
367
            logger.error("While drawing: " + e.getMessage());
368
        }
369
    }
370

    
371
    public void addLayer(FLayer layer) throws CancelationException {
372
        if (!(layer instanceof FFeatureLyrArcIMS)) {
373
            logger.error(
374
                "Only FFeatureLyrArcIMS layers allowed in this collection. ");
375

    
376
            return;
377
        }
378

    
379
        FFeatureLyrArcIMS lyr = (FFeatureLyrArcIMS) layer;
380

    
381
        // lyr.addSelectionListener(this);
382
        super.addLayer(layer);
383
        layerlist.add(layer);
384
    }
385

    
386
    public void selectionChanged(SelectionEvent e) {
387
        // e.get
388
        getMapContext().invalidate();
389
    }
390

    
391
    public void setXMLEntity(XMLEntity xml) throws XMLException {
392
        setActive(xml.getBooleanProperty("active"));
393
        setName(xml.getStringProperty("name"));
394
        setMinScale(xml.getDoubleProperty("minScale"));
395
        setMaxScale(xml.getDoubleProperty("maxScale"));
396
        setVisible(xml.getBooleanProperty("visible"));
397

    
398
        if (xml.contains("proj")) {
399
            setProjection(CRSFactory.getCRS(xml.getStringProperty("proj")));
400
        }
401

    
402
        if (xml.contains("transparency")) {
403
            setTransparency(xml.getIntProperty("transparency"));
404
        }
405

    
406
        // ------------
407
        int numLayers = xml.getIntProperty("numLayers");
408
        String[] s = xml.getStringArrayProperty("LayerNames");
409

    
410
        for (int i = 0; i < numLayers; i++) {
411
            FLayer layer = null;
412

    
413
            try {
414
                String className = xml.getChild(i).getStringProperty("className");
415
                Class clase = Class.forName(className);
416
                layer = (FLayer) clase.newInstance();
417
                layer.setName(s[i]);
418
                layer.setXMLEntity(xml.getChild(i));
419
                layer.load();
420
                logger.debug("Layer: " + layer.getName() + " has been loaded.");
421
            }
422
            catch (Exception e) {
423
                logger.error("While loading layer: " + layer.getName() +
424
                    " (visible = false)", e);
425
                layer.setVisible(false);
426
            }
427

    
428
            addLayer(layer);
429
        }
430
    }
431

    
432
    public XMLEntity getXMLEntity() throws XMLException {
433
        XMLEntity xml = new XMLEntity();
434
        xml.putProperty("className", this.getClass().getName());
435
        xml.putProperty("active", isActive());
436
        xml.putProperty("name", getName());
437
        xml.putProperty("minScale", getMinScale());
438
        xml.putProperty("maxScale", getMaxScale());
439
        xml.putProperty("visible", isVisible());
440

    
441
        if (getProjection() != null) {
442
            xml.putProperty("proj", getProjection().getAbrev());
443
        }
444

    
445
        xml.putProperty("transparency", getTransparency());
446

    
447
        // --------------------
448
        xml.putProperty("numLayers", layerlist.size());
449

    
450
        String[] s = new String[layerlist.size()];
451

    
452
        for (int i = 0; i < layerlist.size(); i++) {
453
            s[i] = ((FFeatureLyrArcIMS) layerlist.get(i)).getName();
454
        }
455

    
456
        xml.putProperty("LayerNames", s);
457

    
458
        for (int i = 0; i < layerlist.size(); i++) {
459
            xml.addChild(((FFeatureLyrArcIMS) layerlist.get(i)).getXMLEntity());
460
        }
461

    
462
        return xml;
463
    }
464

    
465
    public void layerAdded(LayerCollectionEvent e) {
466
        // this layer has been added to a collection
467
        // if it has to be separated, it will be separated now:
468
        if (!mustBeSeparated) {
469
            return;
470
        }
471

    
472
        hasBeenSeparated();
473

    
474
        FLayers lyr = getParentLayer();
475

    
476
        if (lyr == null) {
477
            return;
478
        }
479

    
480
        FLayer item;
481
        int count;
482

    
483
        if (lyr instanceof LayerCollection) {
484
            LayerCollection lyrcol = (LayerCollection) lyr;
485
            count = getLayersCount();
486

    
487
            while (count > 0) {
488
                item = getLayer(count - 1);
489
                removeLayer(item);
490
                lyrcol.addLayer(item);
491
                count = getLayersCount();
492
            }
493

    
494
            lyrcol.removeLayer(this);
495
        }
496
    }
497

    
498
    public void layerMoved(LayerPositionEvent e) {
499
        // TODO Auto-generated method stub
500
    }
501

    
502
    public void layerRemoved(LayerCollectionEvent e) {
503
        // TODO Auto-generated method stub
504
    }
505

    
506
    public void layerAdding(LayerCollectionEvent e) throws CancelationException {
507
        // TODO Auto-generated method stub
508
    }
509

    
510
    public void layerMoving(LayerPositionEvent e) throws CancelationException {
511
        // TODO Auto-generated method stub
512
    }
513

    
514
    public void layerRemoving(LayerCollectionEvent e)
515
        throws CancelationException {
516
        // TODO Auto-generated method stub
517
    }
518

    
519
    public void activationChanged(LayerCollectionEvent e)
520
        throws CancelationException {
521
        // TODO Auto-generated method stub
522
    }
523

    
524
    public void visibilityChanged(LayerCollectionEvent e)
525
        throws CancelationException {
526
        // TODO Auto-generated method stub
527
    }
528

    
529
    public void setXMLEntity03(XMLEntity xml) throws XMLException {
530
        // TODO
531
    }
532

    
533
    public void replaceLayer(String layerName, FLayer layer) {
534
        // TODO
535
    }
536

    
537
    private boolean isTrueString(String visible) {
538
        if (visible.compareToIgnoreCase("true") == 0) {
539
            return true;
540
        }
541

    
542
        return false;
543
    }
544
}