Statistics
| Revision:

svn-gvsig-desktop / tags / v1_11_0_Build_1306 / extensions / extArcims / src / es / prodevelop / cit / gvsig / arcims / fmap / layers / FFeatureLyrArcIMSCollection.java @ 35731

History | View | Annotate | Download (18.6 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 java.awt.Graphics2D;
46
import java.awt.geom.Rectangle2D;
47
import java.awt.image.BufferedImage;
48
import java.net.URL;
49
import java.util.ArrayList;
50
import java.util.Collections;
51
import java.util.ConcurrentModificationException;
52
import java.util.Iterator;
53
import java.util.List;
54
import java.util.Map;
55
import java.util.Vector;
56

    
57
import org.apache.log4j.Logger;
58
import org.cresques.cts.IProjection;
59
import org.gvsig.remoteClient.arcims.ArcImsFeatureClient;
60
import org.gvsig.remoteClient.arcims.ArcImsProtocolHandler;
61
import org.gvsig.remoteClient.arcims.utils.MyCancellable;
62
import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
63
import org.gvsig.remoteClient.arcims.utils.ServiceInformation;
64
import org.gvsig.remoteClient.arcims.utils.ServiceInformationLayer;
65
import org.gvsig.remoteClient.arcims.utils.ServiceInformationLayerFeatures;
66

    
67
import com.hardcode.gdbms.driver.exceptions.ReadDriverException;
68
import com.iver.cit.gvsig.fmap.MapContext;
69
import com.iver.cit.gvsig.fmap.ViewPort;
70
import com.iver.cit.gvsig.fmap.crs.CRSFactory;
71
import com.iver.cit.gvsig.fmap.layers.CancelationException;
72
import com.iver.cit.gvsig.fmap.layers.FLayer;
73
import com.iver.cit.gvsig.fmap.layers.FLayers;
74
import com.iver.cit.gvsig.fmap.layers.LayerCollectionEvent;
75
import com.iver.cit.gvsig.fmap.layers.LayerCollectionListener;
76
import com.iver.cit.gvsig.fmap.layers.LayerDrawEvent;
77
import com.iver.cit.gvsig.fmap.layers.LayerPositionEvent;
78
import com.iver.cit.gvsig.fmap.layers.SelectionEvent;
79
import com.iver.cit.gvsig.fmap.layers.SelectionListener;
80
import com.iver.cit.gvsig.fmap.layers.XMLException;
81
import com.iver.cit.gvsig.fmap.layers.layerOperations.LayerCollection;
82
import com.iver.utiles.XMLEntity;
83
import com.iver.utiles.connections.ConnectionException;
84
import com.iver.utiles.swing.threads.Cancellable;
85
import com.iver.utiles.swing.threads.DefaultCancellableMonitorable;
86

    
87
import es.prodevelop.cit.gvsig.arcims.fmap.drivers.ArcImsVectorialAdapter;
88
import es.prodevelop.cit.gvsig.arcims.fmap.drivers.ArcImsVectorialEditableAdapter;
89
import es.prodevelop.cit.gvsig.arcims.fmap.drivers.FMapFeatureArcImsDriver;
90

    
91

    
92
public class FFeatureLyrArcIMSCollection extends FLayers
93
    implements SelectionListener, LayerCollectionListener {
94
    private static Logger logger = Logger.getLogger(FFeatureLyrArcIMSCollection.class.getName());
95
    private ArrayList layerlist = new ArrayList();
96
    private boolean mustBeSeparated = false;
97
    private MapContext myFMap;
98

    
99
    public FFeatureLyrArcIMSCollection(MapContext fmap, FLayers parent,
100
        boolean willbesep) {
101
        super();
102
        setParentLayer(parent);
103
        setMapContext(fmap);
104
        myFMap = fmap;
105
        mustBeSeparated = willbesep;
106
    }
107

    
108
    public FFeatureLyrArcIMSCollection() {
109
        // super(null, null);
110
            super();
111
    }
112

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

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

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

    
144
            // --------------------------------------------
145
            IProjection srs = CRSFactory.getCRS(_srs);
146

    
147
            MyCancellable myCanc = new MyCancellable(new DefaultCancellableMonitorable());
148
            FMapFeatureArcImsDriver drv = new FMapFeatureArcImsDriver(host,
149
                    service);
150

    
151
            if (!drv.connect(myCanc)) {
152
                throw new Exception("Unable to connect to server. ");
153
            }
154

    
155
            ServiceInformation si = drv.getClient().getServiceInformation();
156
            int layercount = si.getLayers().size();
157
            String layerQuery = "";
158

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

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

    
174
            String[] selectedLayerIds = layerQuery.split(",");
175
            int count = selectedLayerIds.length;
176

    
177
            FFeatureLyrArcIMS[] individualLayers = new FFeatureLyrArcIMS[count];
178

    
179
            String item;
180

    
181
            for (int i = 0; i < count; i++) {
182
                item = selectedLayerIds[i];
183

    
184
                drv = new FMapFeatureArcImsDriver(host, service, item);
185

    
186
                if (!(drv.connect(myCanc))) {
187
                    throw new Exception();
188
                }
189

    
190
                ArcImsVectorialAdapter oldadapter = new ArcImsVectorialAdapter(drv);
191
                ArcImsVectorialEditableAdapter adapter = new ArcImsVectorialEditableAdapter();
192

    
193
                /* 1 */ individualLayers[i] = new FFeatureLyrArcIMS(adapter);
194

    
195
                /* 2 */ drv.setLayer(individualLayers[i]);
196

    
197
                si = drv.getClient().getServiceInformation();
198

    
199
                ServiceInformationLayerFeatures silf = (ServiceInformationLayerFeatures) si.getLayerById(item);
200
                String lyrname = silf.getName();
201

    
202
                individualLayers[i].setProjectionInStatus(srs.getAbrev());
203
                individualLayers[i].setHostInStatus(new URL(host));
204
                individualLayers[i].setServiceInStatus(service);
205

    
206
                String units = si.getMapunits();
207
                int theDpi = si.getScreen_dpi();
208
                long scale;
209

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

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

    
222
                individualLayers[i].setServiceInformationInStatus(si);
223

    
224
                Vector ids = new Vector();
225
                ids.add(item);
226
                individualLayers[i].setLayerIdsInStatus((Vector) ids.clone());
227
                individualLayers[i].setSubfieldsInStatus();
228

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

    
239
                Rectangle2D fext = ((ArcImsFeatureClient) drv.getClient()).getLayerExtent(individualLayers[i].getArcimsStatus());
240
                drv.setFullExtent(fext);
241

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

    
244
                // ------ -------------
245
                drv.setAdapter(adapter);
246

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

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

    
265
            setName(name);
266
            setProjection(srs);
267

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

    
278
    public MapContext getMapContext() {
279
        return myFMap;
280
    }
281

    
282
    public boolean mustBeSeparated() {
283
        return mustBeSeparated;
284
    }
285

    
286
    public void hasBeenSeparated() {
287
        mustBeSeparated = false;
288
    }
289

    
290
    public void setParentLayer(FLayers lyr) {
291
        super.setParentLayer(lyr);
292

    
293
        if (lyr == null) {
294
            return;
295
        }
296

    
297
        myFMap = lyr.getMapContext();
298

    
299
        if (lyr instanceof LayerCollection) {
300
            LayerCollection lyrcol = (LayerCollection) lyr;
301
            lyrcol.addLayerCollectionListener(this);
302
        }
303
    }
304

    
305
    private List myGetList() {
306
        List resp = Collections.synchronizedList(new ArrayList());
307

    
308
        int count = getLayersCount();
309

    
310
        for (int i = 0; i < count; i++) {
311
            resp.add(getLayer(i));
312
        }
313

    
314
        return resp;
315
    }
316

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

    
323
        Iterator iter = myList.iterator();
324

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

    
331
                FLayer lyr = (FLayer) iter.next();
332
                LayerDrawEvent beforeEvent = new LayerDrawEvent(lyr, g,
333
                        viewPort, LayerDrawEvent.LAYER_BEFORE_DRAW);
334

    
335
                myFMap.fireLayerDrawingEvent(beforeEvent);
336

    
337
                if (lyr.isVisible()) {
338
                    long t1 = System.currentTimeMillis();
339

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

    
349
                    long t2 = System.currentTimeMillis();
350
                    System.out.println("Layer " + lyr.getName() + " " +
351
                        (t2 - t1) + " milisecs.");
352
                }
353

    
354
                LayerDrawEvent afterEvent = new LayerDrawEvent(lyr, g,
355
                        viewPort, LayerDrawEvent.LAYER_AFTER_DRAW);
356
                myFMap.fireLayerDrawingEvent(afterEvent);
357
            }
358

    
359
            if (getVirtualLayers() != null) {
360
                getVirtualLayers().draw(image, g, viewPort, cancel, scale);
361
            }
362
        }
363
        catch (ConcurrentModificationException e) {
364
            System.err.println(e.getMessage());
365
        }
366
    }
367

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

    
373
            return;
374
        }
375

    
376
        FFeatureLyrArcIMS lyr = (FFeatureLyrArcIMS) layer;
377

    
378
        // lyr.addSelectionListener(this);
379
        super.addLayer(layer);
380
        layerlist.add(layer);
381
    }
382

    
383
    public void selectionChanged(SelectionEvent e) {
384
        // e.get
385
        getMapContext().invalidate();
386

    
387
        // System.out.println("==========> Selection changed somewhere....");
388
        // TODO Auto-generated method stub
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
                try {
491
                                        lyrcol.addLayer(item);
492
                                } catch (Exception ex) {
493
                                        logger.error("While addgin layer: " + ex.getMessage());
494
                                }
495
                count = getLayersCount();
496
            }
497

    
498
            lyrcol.removeLayer(this);
499
        }
500
    }
501

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

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

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

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

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

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

    
528
    public void visibilityChanged(LayerCollectionEvent e)
529
        throws CancelationException {
530
        // TODO Auto-generated method stub
531
    }
532

    
533
    public void setXMLEntity03(XMLEntity xml) throws XMLException {
534
        // TODO
535
    }
536

    
537
    public void replaceLayer(String layerName, FLayer layer) {
538
        // TODO
539
    }
540

    
541
    private boolean isTrueString(String visible) {
542
        if (visible.compareToIgnoreCase("true") == 0) {
543
            return true;
544
        }
545

    
546
        return false;
547
    }
548
}