Statistics
| Revision:

root / trunk / extensions / extArcims / src / es / prodevelop / cit / gvsig / arcims / fmap / layers / FFeatureLyrArcIMSCollection.java @ 8110

History | View | Annotate | Download (14.1 KB)

1
package es.prodevelop.cit.gvsig.arcims.fmap.layers;
2

    
3
import java.awt.Graphics2D;
4
import java.awt.geom.Rectangle2D;
5
import java.awt.image.BufferedImage;
6
import java.net.URL;
7
import java.util.ArrayList;
8
import java.util.Collections;
9
import java.util.ConcurrentModificationException;
10
import java.util.Iterator;
11
import java.util.List;
12
import java.util.Map;
13
import java.util.Vector;
14

    
15
import org.apache.log4j.Logger;
16
import org.cresques.cts.IProjection;
17
import org.cresques.cts.ProjectionPool;
18
import org.gvsig.remoteClient.arcims.ArcImsFeatureClient;
19
import org.gvsig.remoteClient.arcims.ArcImsProtocolHandler;
20
import org.gvsig.remoteClient.arcims.utils.MyCancellable;
21
import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
22
import org.gvsig.remoteClient.arcims.utils.ServiceInformation;
23
import org.gvsig.remoteClient.arcims.utils.ServiceInformationLayer;
24
import org.gvsig.remoteClient.arcims.utils.ServiceInformationLayerFeatures;
25

    
26
import com.iver.cit.gvsig.fmap.DriverException;
27
import com.iver.cit.gvsig.fmap.MapContext;
28
import com.iver.cit.gvsig.fmap.ViewPort;
29
import com.iver.cit.gvsig.fmap.crs.CRSFactory;
30
import com.iver.cit.gvsig.fmap.edition.VectorialEditableAdapter;
31
import com.iver.cit.gvsig.fmap.layers.CancelationException;
32
import com.iver.cit.gvsig.fmap.layers.FLayer;
33
import com.iver.cit.gvsig.fmap.layers.FLayers;
34
import com.iver.cit.gvsig.fmap.layers.LayerCollectionEvent;
35
import com.iver.cit.gvsig.fmap.layers.LayerCollectionListener;
36
import com.iver.cit.gvsig.fmap.layers.LayerDrawEvent;
37
import com.iver.cit.gvsig.fmap.layers.LayerPositionEvent;
38
import com.iver.cit.gvsig.fmap.layers.SelectionEvent;
39
import com.iver.cit.gvsig.fmap.layers.SelectionListener;
40
import com.iver.cit.gvsig.fmap.layers.XMLException;
41
import com.iver.cit.gvsig.fmap.layers.layerOperations.LayerCollection;
42
import com.iver.utiles.XMLEntity;
43
import com.iver.utiles.connections.ConnectionException;
44
import com.iver.utiles.swing.threads.Cancellable;
45
import com.iver.utiles.swing.threads.DefaultCancellableMonitorable;
46

    
47
import es.prodevelop.cit.gvsig.arcims.fmap.drivers.ArcImsVectorialAdapter;
48
import es.prodevelop.cit.gvsig.arcims.fmap.drivers.FMapFeatureArcImsDriver;
49

    
50
public class FFeatureLyrArcIMSCollection extends FLayers implements SelectionListener, LayerCollectionListener {
51
        
52
        private static Logger logger = Logger.getLogger(FFeatureLyrArcIMSCollection.class.getName());
53
        private ArrayList layerlist = new ArrayList();
54
        
55
        private boolean mustBeSeparated = false;
56
        
57
        private MapContext myFMap;
58
        
59
        public FFeatureLyrArcIMSCollection(MapContext fmap, FLayers parent, boolean willbesep) {
60
                super(fmap, parent);
61
                myFMap = fmap;
62
                mustBeSeparated = willbesep;
63
        }
64
        
65
        public FFeatureLyrArcIMSCollection() {
66
                super(null, null);
67
        }
68
        
69
        public MapContext getMapContext() {
70
                return myFMap;
71
        }
72
        
73
        public boolean mustBeSeparated() {
74
                return mustBeSeparated;
75
        }
76
        
77
        public void hasBeenSeparated() {
78
                mustBeSeparated = false;
79
        }
80
        
81
        public void setParentLayer(FLayers lyr) {
82
                
83
                super.setParentLayer(lyr);
84
                
85
                if (lyr == null) {
86
                        return;
87
                }
88
                
89
                myFMap = lyr.getMapContext();
90
                if (lyr instanceof LayerCollection) {
91
                        LayerCollection lyrcol = (LayerCollection) lyr;
92
                        lyrcol.addLayerCollectionListener(this);
93
                }
94
        }
95
        
96
        private List myGetList() {
97
                List resp = Collections.synchronizedList(new ArrayList());
98
                
99
                int count = getLayersCount();
100
                for (int i=0; i<count; i++) {
101
                        resp.add(getLayer(i));
102
                }
103
                return resp;
104
        }
105
        
106
        // we need to rewrite this method because we dont have access to fmap
107
        // and list
108
        public void draw(BufferedImage image, Graphics2D g, ViewPort viewPort,
109
                        Cancellable cancel,double scale) throws DriverException {
110
                
111
                List myList = myGetList();
112
                
113
                Iterator iter = myList.iterator();
114
                try {
115
                        while (iter.hasNext()) {
116
                                if (cancel.isCanceled()) {
117
                            break; // M?s que nada porque las capas raster no son interrumpibles por ahora.
118
                                }
119
                                FLayer lyr = (FLayer) iter.next();
120
                                LayerDrawEvent beforeEvent = new LayerDrawEvent(lyr, g, viewPort, LayerDrawEvent.LAYER_BEFORE_DRAW);
121
                                
122
                                myFMap.fireLayerDrawingEvent(beforeEvent);
123
                                
124
                                if (lyr.isVisible()) {
125
                                        long t1 = System.currentTimeMillis();
126
                                        try {
127
                                                lyr.draw(image, g, viewPort, cancel,scale);
128
                                        } catch (DriverException e) {
129
                                                myFMap.addLayerError("La capa " + lyr.getName() + " es err?nea.");
130
                                                e.printStackTrace();
131
                                        }
132
                                        long t2 = System.currentTimeMillis();
133
                                        System.out.println("Layer " + lyr.getName() + " "
134
                                                            + (t2-t1) + " milisecs.");
135
                                }
136
                                LayerDrawEvent afterEvent = new LayerDrawEvent(lyr, g, viewPort, LayerDrawEvent.LAYER_AFTER_DRAW);
137
                                myFMap.fireLayerDrawingEvent(afterEvent);
138
                        }
139
                        if (getVirtualLayers() != null) {
140
                                getVirtualLayers().draw(image, g, viewPort, cancel,scale);
141
                        }
142
                } catch (ConcurrentModificationException e) {
143
                        System.err.println(e.getMessage());
144
                }
145
        }
146

    
147
        public void addLayer(FLayer layer) throws CancelationException {
148
                if (! (layer instanceof FFeatureLyrArcIMS)) {
149
                        logger.error("Only FFeatureLyrArcIMS layers allowed in this collection. ");
150
                        return;
151
                }
152
                FFeatureLyrArcIMS lyr = (FFeatureLyrArcIMS) layer;
153
                // lyr.addSelectionListener(this);
154
                super.addLayer(layer);
155
                layerlist.add(layer);
156
        }
157

    
158
        public void selectionChanged(SelectionEvent e) {
159
                // e.get
160
                getMapContext().invalidate();
161
                // System.out.println("==========> Selection changed somewhere....");
162
                // TODO Auto-generated method stub
163
                
164
        }
165
        
166
        public void setXMLEntity(XMLEntity xml) throws XMLException{
167
                
168
                setActive(xml.getBooleanProperty("active"));
169
                setName(xml.getStringProperty("name"));
170
                setMinScale(xml.getDoubleProperty("minScale"));
171
                setMaxScale(xml.getDoubleProperty("maxScale"));
172
                setVisible(xml.getBooleanProperty("visible"));
173
                
174
                if (xml.contains("proj")) {
175
                        setProjection(CRSFactory.getCRS(xml.getStringProperty("proj")));
176
                }
177
                
178
                if (xml.contains("transparency")) {
179
                        setTransparency(xml.getIntProperty("transparency"));
180
                }
181

    
182
                // ------------
183
                
184
                int numLayers = xml.getIntProperty("numLayers");
185
                String[] s = xml.getStringArrayProperty("LayerNames");
186
                
187
                for (int i = 0; i < numLayers; i++) {
188
                        FLayer layer = null;
189
                        try {
190
                                String className = xml.getChild(i).getStringProperty("className");
191
                                Class clase = Class.forName(className);
192
                                layer = (FLayer) clase.newInstance();
193
                                layer.setName(s[i]);
194
                                layer.setXMLEntity(xml.getChild(i));
195
                                layer.load();
196
                                logger.debug("Layer: "+ layer.getName() +" has been loaded.");
197
                        } catch (Exception e) {
198
                                logger.error("While loading layer: " + layer.getName() + " (visible = false)", e);
199
                                layer.setVisible(false);
200
                        }
201
                        addLayer(layer);
202
                }
203
        }
204
        
205
        public XMLEntity getXMLEntity() throws XMLException {
206
                
207
                XMLEntity xml = new XMLEntity();
208
                xml.putProperty("className", this.getClass().getName());
209
                xml.putProperty("active", isActive());
210
                xml.putProperty("name", getName());
211
                xml.putProperty("minScale", getMinScale());
212
                xml.putProperty("maxScale", getMaxScale());
213
                xml.putProperty("visible", isVisible());
214
                
215
                if (getProjection() != null) {
216
                        xml.putProperty("proj", getProjection().getAbrev());
217
                }
218
                xml.putProperty("transparency", getTransparency());
219
                
220
                // --------------------
221

    
222
                xml.putProperty("numLayers", layerlist.size());
223

    
224
                String[] s = new String[layerlist.size()];
225

    
226
                for (int i = 0; i < layerlist.size(); i++) {
227
                        s[i] = ((FFeatureLyrArcIMS) layerlist.get(i)).getName();
228
                }
229

    
230
                xml.putProperty("LayerNames", s);
231

    
232
                for (int i = 0; i < layerlist.size(); i++) {
233
                        xml.addChild(((FFeatureLyrArcIMS) layerlist.get(i)).getXMLEntity());
234
                }
235

    
236
                return xml;
237
        }
238

    
239
        public void layerAdded(LayerCollectionEvent e) {
240
                // this layer has been added to a collection
241
                // if it has to be separated, it will be separated now:
242
                
243
                if (!mustBeSeparated) {
244
                        return;
245
                }
246
                
247
                hasBeenSeparated();
248
                
249
                FLayers lyr = getParentLayer();
250
                if (lyr == null) {
251
                        return;
252
                }
253
                
254
                FLayer item;
255
                int count;
256
                
257
                if (lyr instanceof LayerCollection) {
258
                        LayerCollection lyrcol = (LayerCollection) lyr;
259
                        count = getLayersCount();
260
                        while (count > 0) {
261
                                item = getLayer(count - 1);
262
                                removeLayer(item);
263
                                lyrcol.addLayer(item);
264
                                count = getLayersCount();
265
                        }
266
                        lyrcol.removeLayer(this);
267
                }
268
        }
269

    
270
        public void layerMoved(LayerPositionEvent e) {
271
                // TODO Auto-generated method stub
272
                
273
        }
274

    
275
        public void layerRemoved(LayerCollectionEvent e) {
276
                // TODO Auto-generated method stub
277
                
278
        }
279

    
280
        public void layerAdding(LayerCollectionEvent e) throws CancelationException {
281
                // TODO Auto-generated method stub
282
                
283
        }
284

    
285
        public void layerMoving(LayerPositionEvent e) throws CancelationException {
286
                // TODO Auto-generated method stub
287
                
288
        }
289

    
290
        public void layerRemoving(LayerCollectionEvent e) throws CancelationException {
291
                // TODO Auto-generated method stub
292
                
293
        }
294

    
295
        public void activationChanged(LayerCollectionEvent e) throws CancelationException {
296
                // TODO Auto-generated method stub
297
                
298
        }
299

    
300
        public void visibilityChanged(LayerCollectionEvent e) throws CancelationException {
301
                // TODO Auto-generated method stub
302
                
303
        }
304
        
305
        public void setXMLEntity03(XMLEntity xml) throws XMLException{
306
                // TODO
307
        }
308
        
309
        public void replaceLayer(String layerName, FLayer layer) {
310
                // TODO
311
        }
312
        
313
        /**
314
         * The extCatalogYNomenclator needs this creator.
315
         * 
316
         * @param p a Map object with the following keys:
317
         * 
318
         * (key, object type returned)
319
         * ---------------------------
320
         * "host", String (with or without the servlet path)
321
         * "service_name", String (remote service name)
322
         * "srs", String (coordinate system)
323
         * "layer_name", String (local layer name)
324
         * 
325
         * @return a FFeatureLyrArcIMSCollection layer
326
         * @throws ConnectionException 
327
         */
328
        public FFeatureLyrArcIMSCollection(Map m) throws ConnectionException {
329
                
330
                super(null, null);
331
                
332
                try {
333
                String _host = (String) m.get("host");
334
                String host = ArcImsProtocolHandler.getUrlWithServlet(new URL(_host)).toString();
335
                String service = (String) m.get("service_name");
336
                String _srs = (String) m.get("srs");
337
                String name = (String) m.get("layer_name");
338
                
339
                // in case layer_name is missing or equals the empty string:
340
                if ((name == null) || (name.length() == 0)) {
341
                        name = service;
342
                }
343
                // --------------------------------------------
344
                
345
                IProjection srs = CRSFactory.getCRS(_srs);
346

    
347
                MyCancellable myCanc = new MyCancellable(new DefaultCancellableMonitorable());
348
                FMapFeatureArcImsDriver drv = new FMapFeatureArcImsDriver(host, service);
349
                if (!drv.connect(myCanc)) {
350
                        throw new Exception("Unable to connect to server. ");
351
                }
352
                ServiceInformation si = drv.getClient().getServiceInformation();
353
                int layercount = si.getLayers().size();
354
                String layerQuery = "";
355
                for (int i=0; i<layercount; i++) {
356
                        if (isTrueString(((ServiceInformationLayer) si.getLayer(i)).getVisible())) {
357
                                layerQuery = layerQuery + "," + ((ServiceInformationLayer) si.getLayer(i)).getId();
358
                        }
359
                }
360
                
361
                if (layerQuery.length() == 0) {
362
                        throw new Exception("No layers are visible by default ");
363
                } else {
364
                        layerQuery = layerQuery.substring(1);
365
                }
366
                
367
                String[] selectedLayerIds = layerQuery.split(",");
368
                int count = selectedLayerIds.length;
369
                
370
                FFeatureLyrArcIMS[] individualLayers = new FFeatureLyrArcIMS[count];
371
                
372
                String item;
373
                
374
                for (int i=0; i<count; i++) {
375
                        
376
                        item = selectedLayerIds[i];
377
                        
378
                        drv = new FMapFeatureArcImsDriver(host, service, item);
379
                        if (!(drv.connect(myCanc))) throw new Exception();
380
                        
381
                        ArcImsVectorialAdapter oldadapter = new ArcImsVectorialAdapter(drv);
382
                        VectorialEditableAdapter adapter = new VectorialEditableAdapter();
383
                        
384
                        /* 1 */ individualLayers[i] = new FFeatureLyrArcIMS(adapter);
385
                        /* 2 */ drv.setLayer(individualLayers[i]);
386
                        
387
                        si = drv.getClient().getServiceInformation();
388
                        ServiceInformationLayerFeatures silf = (ServiceInformationLayerFeatures) si.getLayerById(item);
389
                        String lyrname = silf.getName(); 
390

    
391
                        individualLayers[i].setProjectionInStatus(srs.getAbrev());
392
                        individualLayers[i].setHostInStatus(new URL(host));
393
                        individualLayers[i].setServiceInStatus(service);
394

    
395
                        String units = si.getMapunits();
396
                        int theDpi = si.getScreen_dpi();
397
                        long scale;
398
                        if (silf.getMaxscale()!=-1){
399
                                scale = LayerScaleData.getTrueScaleFromRelativeScaleAndMapUnits(silf.getMaxscale(), units, theDpi);
400
                                individualLayers[i].setMaxScale((double) scale);
401
                        }
402
                        if (silf.getMinscale()!=-1){
403
                                scale = LayerScaleData.getTrueScaleFromRelativeScaleAndMapUnits(silf.getMinscale(), units, theDpi);
404
                                individualLayers[i].setMinScale((double) scale);                        
405
                        }
406
                
407
                        individualLayers[i].setServiceInformationInStatus(si);
408
                        Vector ids = new Vector(); ids.add(item);
409
                        individualLayers[i].setLayerIdsInStatus((Vector) ids.clone());
410
                        individualLayers[i].setSubfieldsInStatus();
411
                        /* 3 */ 
412
                        // individualLayers[i].setLegend(new VectorialUniqueValueLegend());
413
                        individualLayers[i].setHost(new URL(host));
414
                        individualLayers[i].setService(service);
415
                        individualLayers[i].setServiceType(ServiceInfoTags.vFEATURESERVICE);
416
                        individualLayers[i].setTransparency(0);
417
                        individualLayers[i].setLayerQuery(item);
418
                        individualLayers[i].setProjection(srs);
419
                        individualLayers[i].setName(lyrname);
420

    
421
                        Rectangle2D fext = ((ArcImsFeatureClient) drv.getClient()).getLayerExtent(individualLayers[i].getArcimsStatus());
422
                        drv.setFullExtent(fext);
423
                        // individualLayers[i].setF. setFullExtent(((ArcImsProtImageHandler) drv.getClient().getHandler()).getServiceExtent(srs, individualLayers[i].getArcimsStatus()));
424
                        
425
                        // ------ -------------
426
                        drv.setAdapter(adapter);
427
                        // adapter.setRecordSet(drv.getRecordSet());
428
                        adapter.setOriginalDataSource(drv.getRecordSet());
429
                        adapter.setOriginalVectorialAdapter(oldadapter);
430
                        drv.declareTable();
431
                        individualLayers[i].setInitialLegend();
432
                        individualLayers[i].setShapeType(adapter.getShapeType());
433
                        individualLayers[i].setRecordset(drv.getRecordSet());
434
                        // ------ -------------
435
                        
436
                        if ((si.getFeaturecoordsys() == null) || (si.getFeaturecoordsys().equals(""))) {
437
                                si.setFeaturecoordsys(srs.getAbrev().substring(ServiceInfoTags.vINI_SRS.length()).trim());
438
                                logger.warn("Server provides no SRS. ");
439
                        }
440
                }
441
                setName(name);
442
                setProjection(srs);
443
                for (int i=0; i<count; i++) {
444
                        addLayer(individualLayers[i]);
445
                }
446
                } catch (Exception e) {
447
                        throw new ConnectionException("Unable to create ArcIMS feature layer collection ", e);
448
                }
449
        }
450

    
451
        private boolean isTrueString(String visible) {
452
                if (visible.compareToIgnoreCase("true") == 0) {
453
                        return true;
454
                }
455
                return false;
456
        }        
457
}