Statistics
| Revision:

svn-gvsig-desktop / trunk / extensions / extArcims / src / es / prodevelop / cit / gvsig / arcims / fmap / layers / FFeatureLyrArcIMS.java @ 9034

History | View | Annotate | Download (25.2 KB)

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

    
3
import java.awt.Color;
4
import java.awt.Graphics2D;
5
import java.awt.Point;
6
import java.awt.geom.AffineTransform;
7
import java.awt.geom.NoninvertibleTransformException;
8
import java.awt.geom.Point2D;
9
import java.awt.geom.Rectangle2D;
10
import java.awt.image.BufferedImage;
11
import java.io.IOException;
12
import java.net.MalformedURLException;
13
import java.net.ProtocolException;
14
import java.net.URL;
15
import java.util.ArrayList;
16
import java.util.HashMap;
17
import java.util.Map;
18
import java.util.Vector;
19

    
20
import javax.swing.ImageIcon;
21

    
22
import org.apache.log4j.Logger;
23
import org.cresques.cts.ICoordTrans;
24
import org.cresques.cts.IProjection;
25
import org.gvsig.remoteClient.arcims.ArcImsClientP;
26
import org.gvsig.remoteClient.arcims.ArcImsFeatureClient;
27
import org.gvsig.remoteClient.arcims.ArcImsProtocolHandler;
28
import org.gvsig.remoteClient.arcims.ArcImsVectStatus;
29
import org.gvsig.remoteClient.arcims.exceptions.ArcImsException;
30
import org.gvsig.remoteClient.arcims.utils.FieldInformation;
31
import org.gvsig.remoteClient.arcims.utils.MyCancellable;
32
import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
33
import org.gvsig.remoteClient.arcims.utils.ServiceInformation;
34
import org.gvsig.remoteClient.arcims.utils.ServiceInformationLayerFeatures;
35
import org.gvsig.remoteClient.utils.Utilities;
36

    
37
import com.hardcode.driverManager.DriverLoadException;
38
import com.hardcode.gdbms.engine.data.DataSource;
39
import com.iver.andami.PluginServices;
40
import com.iver.cit.gvsig.fmap.DriverException;
41
import com.iver.cit.gvsig.fmap.MapContext;
42
import com.iver.cit.gvsig.fmap.ViewPort;
43
import com.iver.cit.gvsig.fmap.core.DefaultFeature;
44
import com.iver.cit.gvsig.fmap.core.IGeometry;
45
import com.iver.cit.gvsig.fmap.core.ISymbol;
46
import com.iver.cit.gvsig.fmap.core.v02.FSymbol;
47
import com.iver.cit.gvsig.fmap.crs.CRSFactory;
48
import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
49
import com.iver.cit.gvsig.fmap.edition.VectorialEditableAdapter;
50
import com.iver.cit.gvsig.fmap.layers.FBitSet;
51
import com.iver.cit.gvsig.fmap.layers.FLyrText;
52
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
53
import com.iver.cit.gvsig.fmap.layers.LegendListener;
54
import com.iver.cit.gvsig.fmap.layers.XMLException;
55
import com.iver.cit.gvsig.fmap.layers.layerOperations.InfoByPoint;
56
import com.iver.cit.gvsig.fmap.operations.Cancel;
57
import com.iver.cit.gvsig.fmap.rendering.Legend;
58
import com.iver.cit.gvsig.fmap.rendering.LegendChangedEvent;
59
import com.iver.cit.gvsig.fmap.rendering.VectorialLegend;
60
import com.iver.utiles.XMLEntity;
61
import com.iver.utiles.connections.ConnectionException;
62
import com.iver.utiles.swing.threads.Cancellable;
63
import com.iver.utiles.swing.threads.DefaultCancellableMonitorable;
64

    
65
import es.prodevelop.cit.gvsig.arcims.fmap.drivers.ArcImsInMemoryAttsTableDriver;
66
import es.prodevelop.cit.gvsig.arcims.fmap.drivers.ArcImsVectorialAdapter;
67
import es.prodevelop.cit.gvsig.arcims.fmap.drivers.FMapFeatureArcImsDriver;
68

    
69
public class FFeatureLyrArcIMS extends FLyrVect implements InfoByPoint, LegendListener {
70
        // ClassifiableVectorial, Selectable, AlphanumericData, VectorialData,
71
        // Labelable, SingleLayer, RandomVectorialData {
72

    
73
        private static Logger logger = Logger.getLogger(FFeatureLyrArcIMS.class.getName());
74

    
75
        private URL host;
76
        private String service;
77
        private String serviceType;
78
        private Rectangle2D fullExtent;
79
        private boolean firstLoad = true;
80
        private ArcImsVectStatus arcimsStatus = new ArcImsVectStatus();
81
        private String SRS;
82
        private String srsAbrev;
83
        private String layerQuery;
84
        private VisualStatusArcIms visualStatus = new VisualStatusArcIms();
85
        private int transparency = -1;
86
        private boolean arcImsTransparency = true;
87
        private int shapeType = 0;
88
//        private ArrayList initialColors = new ArrayList();
89
        
90
        private ArrayList geometries;
91
        
92
        private MyCancellable myCanc;
93

    
94
        // from ancestor FLyrVect:
95
        // private VectorialAdapter source;
96
        // private SelectableDataSource sds; --> is created like this --> new SelectableDataSource(source.getRecordSet()) 
97

    
98
        /**
99
         * Constructor needs ArcImsVectorialAdapter.
100
         * 
101
         * @param vectAdapter
102
         */
103
        public FFeatureLyrArcIMS(VectorialEditableAdapter vectAdapter) {
104
                
105
                myCanc = new MyCancellable(new DefaultCancellableMonitorable());
106

    
107
                setSource(vectAdapter);
108
//                try {
109
//                        // setRecordset(((FMapFeatureArcImsDriver) getSource().getDriver()).getRecordSet());
110
//                        shapeType = vectAdapter.getShapeType();
111
//                        // ((VectorialLegend) getLegend()).setShapeType(shapeType);
112
//                } catch (Exception e) {
113
//                        logger.error("Unexpected error while getting shape type ", e);
114
//                }
115
                addLegendListener(this);
116
//                loadInitialColors();
117
        }
118
        
119
        public FFeatureLyrArcIMS() {
120
        }
121
        
122
        public void setShapeType(int shpType) {
123
                shapeType = shpType;
124
        }
125
        
126
        public void setAdapter(VectorialEditableAdapter edapter) {
127
                setSource(edapter);
128
                try {
129
                        shapeType = edapter.getShapeType();
130
                        // ((VectorialLegend) getLegend()).setShapeType(shapeType);
131
                } catch (DriverIOException e) {
132
                        logger.error("Unexpected error while getting shape type ", e);
133
                }
134
                addLegendListener(this);
135
                myCanc = new MyCancellable(new DefaultCancellableMonitorable());
136
//                loadInitialColors();
137
        }
138
        
139
        
140
        /*
141
        public void setLegend(VectorialLegend r)
142
                throws DriverException, FieldNotFoundException {
143
                VectorialLegend oldLegend = legend;
144
                legend = r;
145

146
                try {
147
                        legend.setDataSource(getRecordset());
148

149
                        if (legend.getLabelField() != null) {
150
                            // sds.start();
151
                                // int idLabelField = getRecordset().getFieldIndexByName(legend.getLabelField());
152
                                createLabelLayer(sds);
153
                                // sds.stop();
154
                        }
155
                        else
156
                            removeLabels();
157
                } catch (DriverException e) {
158
                        throw new DriverException(e);
159
                } catch (FieldNotFoundException e) {
160
                        // TODO Auto-generated catch block
161
                        e.printStackTrace();
162
        }
163

164
                LegendChangedEvent e = LegendChangedEvent.createLegendChangedEvent(oldLegend, legend);
165
                callLegendChanged(e);
166
        }
167
         */
168
        
169
//        private void loadInitialColors() {
170
//                // Color[] cols = 
171
//                initialColors.add(new Color(179, 226, 205));
172
//                initialColors.add(new Color(253, 205, 172));
173
//                initialColors.add(new Color(203, 213, 232));
174
//                initialColors.add(new Color(230, 245, 201));
175
//                initialColors.add(new Color(141, 211, 199));
176
//                initialColors.add(new Color(255, 255, 179));
177
//                initialColors.add(new Color(190, 186, 218));
178
//                initialColors.add(new Color(251, 128, 114));
179
//                initialColors.add(new Color(128, 177, 211));
180
//        }
181

    
182
        /**
183
         * 
184
         */
185
        public void draw(BufferedImage image, Graphics2D g, ViewPort viewPort,
186
                        Cancellable cancel, double scale) throws DriverException {
187

    
188
                if (!isVisible()) return;
189
                if (!isWithinScale(scale)) return;
190

    
191
                // In case gvSIG calls the getVisualStatus method... (?)
192
                visualStatus.width = viewPort.getImageWidth();
193
                visualStatus.height = viewPort.getImageHeight();
194
                visualStatus.minX = viewPort.getAdjustedExtent().getMinX();
195
                visualStatus.minY = viewPort.getAdjustedExtent().getMinY();
196
                visualStatus.maxX = viewPort.getAdjustedExtent().getMaxX();
197
                visualStatus.maxY = viewPort.getAdjustedExtent().getMaxY();
198

    
199
                IGeometry geom, clonedGeom;
200
                ICoordTrans layerTransf = getCoordTrans();
201
                Rectangle2D bBox = viewPort.getAdjustedExtent();
202
                
203
                // CSV-WKT   or   LIBARCIMS
204
                boolean test = false;
205
                
206
                if (test) {
207
                        // -------------------------- TEST START ---------------------------------
208
                        // geometries = ((FMapFeatureArcImsDriver) getSource().getDriver()).getGeometries();
209
                        
210
                        for (int i = 0; i < geometries.size(); i++) {
211
                                geom = (IGeometry) geometries.get(i);
212
                                if (geom.intersects(bBox)) {
213
                                        clonedGeom = geom.cloneGeometry();
214
                                        ISymbol symbol = (ISymbol) ((VectorialLegend) getLegend()).getSymbol(i);
215
                                        // FSymbol symbol = ((VectorialLegend) getLegend()).getSymbol(i);
216
                                        if (layerTransf != null) geom.reProject(layerTransf);
217
                                        clonedGeom.draw(g, viewPort, symbol);
218
                                }
219
                        }
220
                        // -------------------------- TEST END   ---------------------------------
221
                } else {
222
                        // -------------------------- NOT TEST START ---------------------------------
223
                        arcimsStatus.setExtent(bBox);
224
                        arcimsStatus.setHeight(viewPort.getImageHeight());
225
                        arcimsStatus.setWidth(viewPort.getImageWidth());
226
                        // one-item vector:
227
                        arcimsStatus.setLayerIds(Utilities.createVector(layerQuery, ","));
228
                        arcimsStatus.setServer(host.toString());
229
                        arcimsStatus.setService(service);
230
                        arcimsStatus.setSrs(this.getProjection().getAbrev());
231
                        arcimsStatus.setTransparency(this.arcImsTransparency);
232
                        
233
                        FMapFeatureArcImsDriver drv = (FMapFeatureArcImsDriver) getSource().getDriver();
234
                        
235
                        try {
236
                                
237
                                // ********************************************
238
                                // first item in query must contain ID or #ALL#
239
                                // ********************************************
240
                                geometries = (ArrayList) drv.getMap(arcimsStatus);
241
                                
242
                        } catch (ProtocolException e) {
243
                                DriverException de = new DriverException(e.getMessage());
244
                                logger.error("While getting map (ArrayList of geometries) ", e);
245
                                throw de;
246
                        } catch (ArcImsException e) {
247
                                DriverException de = new DriverException(e.getMessage());
248
                                logger.error("While getting map (ArrayList of geometries) ", e);
249
                                throw de;
250
                        } catch (IOException e) {
251
                                DriverException de = new DriverException(e.getMessage());
252
                                logger.error("While getting map (ArrayList of geometries) ", e);
253
                                throw de;
254
                        } 
255
                        
256
                        for (int i = 0; i < geometries.size(); i++) {
257
                                geom = (IGeometry) ((DefaultFeature) geometries.get(i)).getGeometry();
258
                                
259
                                if (geom == null) {
260
                                        logger.error("Retrieved null geometry ");
261
                                } else {
262
                                        clonedGeom = geom.cloneGeometry();
263
                                        int ov_index = drv.getOverallIndex(i);
264
                                        ISymbol symbol = (ISymbol) getSymbolOrSelected(ov_index,
265
                                                        (FSymbol) ((VectorialLegend) getLegend()).getSymbol(ov_index));
266
                                        // FSymbol symbol = getSymbolOrSelected(ov_index, ((VectorialLegend) getLegend()).getSymbol(ov_index));
267
                                        if (layerTransf != null)
268
                                                geom.reProject(layerTransf);
269
                                        clonedGeom.draw(g, viewPort, symbol);
270
                                }
271
                        }
272
                        
273
                        FLyrText possibleLabels = getLayerText(); 
274
                        if (possibleLabels != null) {
275
                                possibleLabels.createLabels(this);
276
                                possibleLabels.draw(image, g, viewPort, cancel, scale);
277
                        }
278
                        // -------------------------- NOT TEST END   ---------------------------------
279
                }
280
        }
281

    
282
        private FSymbol getSymbolOrSelected(int i, FSymbol symbol) {
283
                
284
                boolean sel = false;
285
                try {
286
                        sel = getRecordset().getSelectionSupport().isSelected(i);
287
                } catch (DriverException e) {
288
                        logger.error("While getting selection", e);
289
                }
290
                
291
                if (sel) {
292
                        return new FSymbol(shapeType, Color.YELLOW);
293
                } else {
294
                        return symbol;
295
                }
296
        }
297

    
298
        /**
299
         * 
300
         */
301
        public void print(Graphics2D g, ViewPort viewPort, Cancellable cancel,
302
                        double scale) throws DriverException {
303

    
304
                draw(null, g, viewPort, cancel, scale);
305
        }
306

    
307
        /**
308
         * 
309
         */
310
        public String queryByPoint(Point p) throws DriverException {
311
                Point2D screenCoords, geoCoords;
312
                double screenTol, geoTol;
313
                
314
                screenCoords = new Point2D.Double(p.getX(), p.getY());
315
                geoCoords = new Point2D.Double(p.getX(), p.getY());
316
                AffineTransform af = getMapContext().getViewPort().getAffineTransform();
317
                try {
318
                        af.inverseTransform(screenCoords, geoCoords);
319
                } catch (NoninvertibleTransformException e) {
320
                        logger.error("Non invertible AffineTransform ", e);
321
                }
322
                screenTol = 2.0; geoTol = 1.0;                
323
                geoTol = screenTol / af.getScaleX();
324
                
325
                FBitSet fbs = queryByPoint(geoCoords, geoTol);
326
                
327
                // this invoques the client to get attrs.
328
                try {
329
                        ((ArcImsVectorialAdapter) getSource()).requestFeatureAttributes(fbs);
330
                } catch (ArcImsException e) {
331
                        DriverException de = new DriverException(e.getMessage());
332
                        logger.error("While querying by point ", de);
333
                        throw de;
334
                }
335

    
336
                String resp = getFormattedFieldsFromSetFeatures(fbs);
337
                System.err.println(resp); //TODO BORRAR ESTO
338
                return resp;
339
        }
340
        
341

    
342
        // TODO: move this to another class:
343
        private String getFormattedFieldsFromSetFeatures(FBitSet fbs) {
344
                String r = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>";
345
                r = r + "<FeatureInfoResponse>";
346
                r = r + "<LAYER ID=\"" + layerQuery + "\" NAME=\"" + getName() + "\">";
347
                
348
                for(int i=fbs.nextSetBit(0); i>=0; i=fbs.nextSetBit(i+1)) {
349
                        r = r + getFormattedFieldsFromFeature(i);
350
                }
351
                
352
                r = r + "</LAYER>";
353
                r = r + "</FeatureInfoResponse>";
354
                return r;
355
        }
356

    
357
        // TODO: move this to another class:
358
        private String getFormattedFieldsFromFeature(int j) {
359

    
360
                String r = "<FIELDS ";
361
                String fieldName, fieldValue;
362
                DataSource ds = null;
363
                
364
                try {
365
                        ds = getSource().getRecordset();
366
                } catch (DriverLoadException e1) {
367
                        logger.error("DriverException while getting field values. ", e1);
368
                }
369
                
370
                int count;
371
                try {
372
                        count = ds.getFieldCount();
373
                        for (int i=0; i<count; i++) {
374
                                
375
                                fieldName = ds.getFieldName(i);
376
                                fieldName = ArcImsInMemoryAttsTableDriver.replaceUnwantedCharacters(fieldName);
377
                                
378
                                fieldValue = restoreSpecialChars(ds.getFieldValue((long) j, i).toString());
379
                                logger.debug("fieldvalue = " + fieldValue);
380
                                r = r + " " + fieldName + "=" + "\"" + fieldValue + "\"";
381
                        }
382
                        // <FIELDS NOMBRE="LR-542" OBSERVACIO="" TIPO="CAUT3" _SHAPE_="[Geometry]" _ID_="1975" />
383
                        r = r + "/>";
384
                } catch (com.hardcode.gdbms.engine.data.driver.DriverException e) {
385
                        logger.error("DriverException while getting field values. ", e);
386
                }
387
                
388
                return r;
389
        }
390

    
391
        private String restoreSpecialChars(String str) {
392
                /*
393
                 * < 60 3c, > 62 3e, & 38 26, " 34 22, ' 39 27
394
                 */
395
                String resp = str.replaceAll("\\x26", "&amp;");
396
                resp = resp.replaceAll("\\x3c", "&lt;");
397
                resp = resp.replaceAll("\\x3e", "&gt;");
398
                
399
                resp = resp.replaceAll("\\x22", "&quot;");
400
                resp = resp.replaceAll("\\x27", "&#39;");
401
                return resp;
402
        }
403

    
404

    
405
        public void setInitialLegend() {
406

    
407
                FMapFeatureArcImsDriver drv = (FMapFeatureArcImsDriver) getSource()
408
                                .getDriver();
409
                
410
                //Try to get the legend from the service information
411
                try {
412
                        Legend initialleg = drv.getClient().getLegend(
413
                                        (String) this.arcimsStatus.getLayerIds().get(0));
414

    
415
                        if (initialleg != null) {
416

    
417
                                setLegend((VectorialLegend) initialleg);
418
                        }
419
                        return;
420
                } catch (Exception e) {
421
                        logger.error("While setting initial legend ", e);
422
                }
423
                
424
//                //If no legend is returned create a default legend
425
//                if (drv.getShapeType() == FShape.MULTIPOINT) {
426
//                        SingleSymbolLegend initialleg = new SingleSymbolLegend();
427
//                        initialleg.setShapeType(drv.getShapeType());
428
//                        try {
429
//                                setLegend(initialleg);
430
//                        } catch (Exception e) {
431
//                                logger.error("While setting initial legend ", e);
432
//                        }
433
//                        return;
434
//                }
435
//
436
//                try {
437
//                        int colorind = (int) (System.currentTimeMillis() % ((long) initialColors
438
//                                        .size()));
439
//                        FSymbol symb = new FSymbol(drv.getShapeType(),
440
//                                        (Color) initialColors.get(colorind));
441
//                        SingleSymbolLegend initialleg = new SingleSymbolLegend(symb);
442
//                        initialleg.setShapeType(drv.getShapeType());
443
//                        setLegend(initialleg);
444
//                } catch (FieldNotFoundException e) {
445
//                        logger.error("Whuile setting initial legend ", e);
446
//                } catch (DriverException e) {
447
//                        logger.error("Whuile setting initial legend ", e);
448
//                }
449
        }
450

    
451
        // Classifiable
452
        public int getShapeType() throws DriverException {
453
                FMapFeatureArcImsDriver drv = (FMapFeatureArcImsDriver) getSource().getDriver();
454
                return drv.getShapeType();
455
        }
456

    
457
        /**
458
         * Keeps the image's height and width or the image's tiles' height and
459
         * width, if any. These values are the same as the viewPort's height and
460
         * width,
461
         */
462
        private class VisualStatusArcIms {
463
                protected int width = 0, height = 0;
464

    
465
                protected double minX = 0D, minY = 0D, maxX = 0D, maxY = 0D;
466
        }
467

    
468
        public void setServiceInformationInStatus(ServiceInformation si) {
469
                this.arcimsStatus.setServiceInformation(si);
470
        }
471

    
472
        public ArcImsVectStatus getArcimsStatus() {
473
                return arcimsStatus;
474
        }
475

    
476
        public void setArcimsStatus(ArcImsVectStatus arcimsStatus) {
477
                this.arcimsStatus = arcimsStatus;
478
        }
479

    
480
        public boolean isFirstLoad() {
481
                return firstLoad;
482
        }
483

    
484
        public void setFirstLoad(boolean firstLoad) {
485
                this.firstLoad = firstLoad;
486
        }
487

    
488
        public URL getHost() {
489
                return host;
490
        }
491

    
492
        public void setHost(URL host) {
493
                this.host = host;
494
        }
495

    
496
        public String getLayerQuery() {
497
                return layerQuery;
498
        }
499

    
500
        public void setLayerQuery(String lQuery) {
501
                this.layerQuery = lQuery;
502
                if (layerQuery.substring(0, 1).compareTo(",") == 0)
503
                        layerQuery = layerQuery.substring(1);
504
        }
505

    
506
        public String getService() {
507
                return service;
508
        }
509

    
510
        public void setService(String service) {
511
                this.service = service;
512
        }
513

    
514
        public String getServiceType() {
515
                return serviceType;
516
        }
517

    
518
        public void setServiceType(String serviceType) {
519
                this.serviceType = serviceType;
520
        }
521

    
522
        public String getSRS() {
523
                return SRS;
524
        }
525

    
526
        public void setSRS(String srs) {
527
                SRS = srs;
528
        }
529

    
530
        public boolean getArcImsTransparency() {
531
                return arcImsTransparency;
532
        }
533

    
534
        public void setArcImsTransparency(boolean arcImsTransparency) {
535
                this.arcImsTransparency = arcImsTransparency;
536
        }
537

    
538
        public int getTransparency() {
539
                return transparency;
540
        }
541

    
542
        public void setTransparency(int transparency) {
543
                this.transparency = transparency;
544
        }
545

    
546
        public HashMap getProperties() {
547
                HashMap info = new HashMap();
548
                String[] layerNames = getLayerQuery().split(",");
549
                Vector layers = new Vector(layerNames.length);
550
                FMapFeatureArcImsDriver drv = (FMapFeatureArcImsDriver) getSource()
551
                .getDriver();
552
                
553
                try {
554
                        if (drv.connect(myCanc)) {
555
                                info.put("layerName", this.getName());
556
                                info.put("serverUrl", this.getHost());
557
                                info.put("serviceName", this.getService());
558
                                info.put("serviceType", this.getServiceType());
559
                                for (int i = 0; i < layerNames.length; i++)
560
                                        layers.add(layerNames[i]);
561
                                info.put("layerIds", layers);
562
                                return info;
563
                        }
564
                } catch (Exception e) {
565
                        logger.error("Error in FRasterLyrArcIMS.getProperties() ", e);
566
                }
567
                return null;
568
        }
569

    
570
        public void setLayerIdsInStatus(Vector idsv) {
571
                arcimsStatus.setLayerIds(idsv);
572
        }
573

    
574
        public void setProjectionInStatus(String abbrev_srs) {
575
                arcimsStatus.setSrs(abbrev_srs);
576
        }
577

    
578
        public void setHostInStatus(URL url) {
579
                arcimsStatus.setServer(url.toString());
580
        }
581

    
582
        public void setServiceInStatus(String srv) {
583
                arcimsStatus.setService(srv);
584
        }
585

    
586
        public void setSubfieldsInStatus() {
587
                String[] subfields = new String[2];
588
                String id = (String) arcimsStatus.getLayerIds().get(0);
589
                ServiceInformationLayerFeatures silf = (ServiceInformationLayerFeatures) arcimsStatus.getServiceInfo().getLayerById(id);
590
                FieldInformation fi = (FieldInformation) silf.getFieldInformationByType(FieldInformation.ID).get(0);
591
                subfields[1] = fi.getName();
592
                fi = (FieldInformation) silf.getFieldInformationByType(FieldInformation.SHAPE).get(0);
593
                subfields[0] = fi.getName();
594
                arcimsStatus.setSubfields(subfields);
595
        }
596

    
597
        public void legendChanged(LegendChangedEvent e) {
598
                MapContext fmap = getMapContext();
599
                if (fmap != null) {
600
                        fmap.invalidate();
601
                        
602
                }
603
        }
604
        
605
        public void setXMLEntity(XMLEntity xml) throws XMLException {
606
                try {
607
                        setHost(new URL(xml.getStringProperty("_host")));
608
                } catch (MalformedURLException e) {
609
                        logger.error("Bad url ", e);
610
                }
611
                setService(xml.getStringProperty("_service"));
612
                setLayerQuery(xml.getStringProperty("layerQuery"));
613
                setSrsAbrev(xml.getStringProperty("srs_abrev"));
614
                
615
                FMapFeatureArcImsDriver drv = new FMapFeatureArcImsDriver(host.toString(), service, layerQuery);
616
                if (!(drv.connect(myCanc))) {
617
                        throw new XMLException(new DriverException("Unable to connect to server"));
618
                }
619
                drv.setLayer(this);
620
                
621
                Vector ids = new Vector();
622
                ids.add(getLayerQuery());
623
                setLayerIdsInStatus(ids);
624
                
625
                ArcImsClientP cli = drv.getClient();
626
                ServiceInformation si = cli.getServiceInformation();
627
                arcimsStatus.setServiceInformation(si);
628
                
629
                String srs = getSrsAbrev();
630
                arcimsStatus.setSrs(srs);
631
                
632
                if ((si.getFeaturecoordsys() == null) || (si.getFeaturecoordsys().equals(""))) {
633
                        si.setFeaturecoordsys(srs.substring(ServiceInfoTags.vINI_SRS.length()).trim());
634
                        logger.warn("Server provides no SRS. ");
635
                } 
636
                
637
                Rectangle2D fext = null;
638
                try {
639
                        fext = ((ArcImsFeatureClient) drv.getClient()).getLayerExtent(arcimsStatus);
640
                } catch (Exception e) {
641
                        logger.error("While loading ArcIMS layer ", e);
642
                }
643
                arcimsStatus.setExtent(fext);
644
                drv.setFullExtent(fext);
645
                
646
                setSubfieldsInStatus();
647
                
648
                
649
                // drv.loadRecordSet();
650
                
651
                ArcImsVectorialAdapter oldadapter = new ArcImsVectorialAdapter(drv);
652
                VectorialEditableAdapter adapter = new VectorialEditableAdapter();
653
                
654
                String recordsetName = xml.getStringProperty("recordset-name");
655
                
656
                try {
657
                        adapter.setOriginalDataSource(drv.getRecordSet(recordsetName));
658
                } catch (com.hardcode.gdbms.engine.data.driver.DriverException e) {
659
                        logger.error("While setting original data source ", e);
660
                }
661
                adapter.setOriginalVectorialAdapter(oldadapter);
662
                
663
                setAdapter(adapter);
664

    
665
                drv.setAdapter(adapter);
666
                
667
                setInitialLegend();
668
                
669
                try {
670
                        setRecordset(((FMapFeatureArcImsDriver) getSource().getDriver()).getRecordSet());
671
                } catch (Exception e) {
672
                        logger.error("While setting data source ", e);
673
                }
674
                super.setXMLEntity(xml);
675
        }
676
        
677
        public XMLEntity getXMLEntity() throws XMLException {
678
                
679
                XMLEntity resp = super.getXMLEntity();
680
                
681
                // PluginServices.getMDIManager().addView(null);
682
                
683
                resp.putProperty("srs_abrev", getMapContext().getProjection().getAbrev());
684
                resp.putProperty("_host", host.toString());
685
                resp.putProperty("_service", service);
686
                resp.putProperty("layerQuery", layerQuery);
687
                return resp;
688
        }
689

    
690
        public String getSrsAbrev() {
691
                return srsAbrev;
692
        }
693

    
694
        public void setSrsAbrev(String srsAbrev) {
695
                this.srsAbrev = srsAbrev;
696
        }
697
        
698
        /**
699
         * The extCatalogYNomenclator needs this creator.
700
         * 
701
         * @param p a Map object with the following keys:
702
         * 
703
         * (key, object type returned)
704
         * ---------------------------
705
         * "host", String (with or without the servlet path)
706
         * "service_name", String (remote service name)
707
         * "srs", String (coordinate system)
708
         * "layer_id", String (*single* remote layer's ID)
709
         * "layer_name", String (local layer name)
710
         * 
711
         * @return a FRasterLyrArcIMS layer
712
         * @throws ConnectionException 
713
         */
714
        
715
        /*
716

717
        public FFeatureLyrArcIMS(Map m) throws ConnectionException {
718
                
719
                String _host = (String) m.get("host");
720
                
721
                try {
722
                        
723
                        String _layer_id = (String) m.get("layer_id");
724
                        String _service_name = (String) m.get("service_name");
725
                        String _layer_name = (String) m.get("layer_name");
726
                        String _srs = (String) m.get("srs");
727
                        
728
                        // ----------------------------------
729
                        
730
                        URL _true_host = ArcImsProtocolHandler.getUrlWithServlet(new URL(_host));
731
                        IProjection _true_srs = CRSFactory.getCRS(_srs);
732

733

734
                        FMapFeatureArcImsDriver _drv = new FMapFeatureArcImsDriver(_true_host.toString(),
735
                                        _service_name, _layer_id);
736
                        if (!(_drv.connect(myCanc))) throw new Exception();
737
                        ArcImsVectorialAdapter _oldadapter = new ArcImsVectorialAdapter(_drv);
738
                        VectorialEditableAdapter _adapter = new VectorialEditableAdapter();
739
                        _drv.setLayer(this);
740

741
                        ServiceInformation _si = _drv.getClient().getServiceInformation();
742
                        ServiceInformationLayerFeatures _silf = (ServiceInformationLayerFeatures)
743
                        _si.getLayerById(_layer_id);
744
                        
745
                        setProjectionInStatus(_true_srs.getAbrev());
746
                        setHostInStatus(_true_host);
747
                        setServiceInStatus(_service_name);
748

749
                        String _units = _si.getMapunits();
750
                        int _theDpi = _si.getScreen_dpi();
751
                        long _scale;
752
                        if (_silf.getMaxscale()!=-1) {
753
                                _scale = LayerScaleData.getTrueScaleFromRelativeScaleAndMapUnits(
754
                                                _silf.getMaxscale(), _units, _theDpi);
755
                                setMaxScale((double) _scale);
756
                        }
757
                        if (_silf.getMinscale()!=-1) {
758
                                _scale = LayerScaleData.getTrueScaleFromRelativeScaleAndMapUnits(
759
                                                _silf.getMinscale(), _units, _theDpi);
760
                                setMinScale((double) _scale);                        
761
                        }
762
                
763
                        setServiceInformationInStatus(_si);
764
                        Vector _ids = new Vector(); _ids.add(_layer_id);
765
                        setLayerIdsInStatus((Vector) _ids.clone());
766
                        setSubfieldsInStatus();
767

768
                        setHost(_true_host);
769
                        setService(_service_name);
770
                        setServiceType(ServiceInfoTags.vFEATURESERVICE);
771
                        setTransparency(0);
772
                        setLayerQuery(_layer_id);
773
                        setProjection(_true_srs);
774
                        setName(_layer_name);
775

776
                        Rectangle2D _fext = ((ArcImsFeatureClient)
777
                                        _drv.getClient()).getLayerExtent(getArcimsStatus());
778
                        _drv.setFullExtent(_fext);
779
                        // individualLayers[i].setF. setFullExtent(((ArcImsProtImageHandler) drv.getClient().getHandler()).getServiceExtent(srs, individualLayers[i].getArcimsStatus()));
780
                        
781
                        // ------ -------------
782
                        _drv.setAdapter(_adapter);
783
                        // adapter.setRecordSet(drv.getRecordSet());
784
                        _adapter.setOriginalDataSource(_drv.getRecordSet());
785
                        _adapter.setOriginalVectorialAdapter(_oldadapter);
786
                        _drv.declareTable();
787
                        
788
                        setSource(_adapter);
789
                        _adapter.setDriver(_drv);
790
                        
791
                        getSource().setDriver(_drv);
792
                        setInitialLegend();
793
                        setShapeType(_adapter.getShapeType());
794
                        setRecordset(_drv.getRecordSet());
795
                        // ------ -------------
796
                        
797
                        if ((_si.getFeaturecoordsys() == null) ||
798
                                        (_si.getFeaturecoordsys().equals(""))) {
799
                                _si.setFeaturecoordsys(_true_srs.getAbrev().substring(ServiceInfoTags.vINI_SRS.length()).trim());
800
                                logger.warn("Server provides no SRS. ");
801
                        }
802
                } catch (Exception e) {
803
                        throw new ConnectionException("Unable to connect to host " + _host, e);
804
                }
805
        }
806
        
807
        */
808
        
809
        public ImageIcon getTocImageIcon() {
810
                
811
                ImageIcon resp = null;
812
                try {
813
                        resp = createImageIcon("images/esrilogo.png");
814
                } catch (Exception ex) {
815
                }
816
                
817
                if (resp == null) {
818
                        return super.getTocImageIcon();
819
                } else {
820
                        return resp;
821
                }
822
        }
823
        
824
        protected ImageIcon createImageIcon(String path) {
825
                java.net.URL imgURL = createExtensionUrl(path);
826
                if (imgURL != null) {
827
                        return new ImageIcon(imgURL);
828
                } else {
829
                        logger.error("File not found: " + path);
830
                        return null;
831
                }
832
        }
833

    
834
        protected java.net.URL createExtensionUrl(String path) {
835
                return PluginServices.getPluginServices("es.prodevelop.cit.gvsig.arcims").getClassLoader().getResource(path);
836
                // return getClass().getClassLoader().getResource(path);
837
        }
838

    
839

    
840
        
841

    
842
}
843