Statistics
| Revision:

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

History | View | Annotate | Download (24.4 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 org.apache.log4j.Logger;
21
import org.cresques.cts.ICoordTrans;
22
import org.cresques.cts.IProjection;
23
import org.gvsig.remoteClient.arcims.ArcImsClientP;
24
import org.gvsig.remoteClient.arcims.ArcImsFeatureClient;
25
import org.gvsig.remoteClient.arcims.ArcImsProtocolHandler;
26
import org.gvsig.remoteClient.arcims.ArcImsVectStatus;
27
import org.gvsig.remoteClient.arcims.exceptions.ArcImsException;
28
import org.gvsig.remoteClient.arcims.utils.FieldInformation;
29
import org.gvsig.remoteClient.arcims.utils.MyCancellable;
30
import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
31
import org.gvsig.remoteClient.arcims.utils.ServiceInformation;
32
import org.gvsig.remoteClient.arcims.utils.ServiceInformationLayerFeatures;
33
import org.gvsig.remoteClient.utils.Utilities;
34

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

    
62
import es.prodevelop.cit.gvsig.arcims.fmap.drivers.ArcImsInMemoryAttsTableDriver;
63
import es.prodevelop.cit.gvsig.arcims.fmap.drivers.ArcImsVectorialAdapter;
64
import es.prodevelop.cit.gvsig.arcims.fmap.drivers.FMapFeatureArcImsDriver;
65

    
66
public class FFeatureLyrArcIMS extends FLyrVect implements InfoByPoint, LegendListener {
67
        // ClassifiableVectorial, Selectable, AlphanumericData, VectorialData,
68
        // Labelable, SingleLayer, RandomVectorialData {
69

    
70
        private static Logger logger = Logger.getLogger(FFeatureLyrArcIMS.class.getName());
71

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

    
91
        // from ancestor FLyrVect:
92
        // private VectorialAdapter source;
93
        // private SelectableDataSource sds; --> is created like this --> new SelectableDataSource(source.getRecordSet()) 
94

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

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

143
                try {
144
                        legend.setDataSource(getRecordset());
145

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

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

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

    
185
                if (!isVisible()) return;
186
                if (!isWithinScale(scale)) return;
187

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

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

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

    
295
        /**
296
         * 
297
         */
298
        public void print(Graphics2D g, ViewPort viewPort, Cancellable cancel,
299
                        double scale) throws DriverException {
300

    
301
                draw(null, g, viewPort, cancel, scale);
302
        }
303

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

    
333
                String resp = getFormattedFieldsFromSetFeatures(fbs);
334
                System.err.println(resp); //TODO BORRAR ESTO
335
                return resp;
336
        }
337
        
338

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

    
354
        // TODO: move this to another class:
355
        private String getFormattedFieldsFromFeature(int j) {
356

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

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

    
401

    
402
        public void setInitialLegend() {
403

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

    
412
                        if (initialleg != null) {
413

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

    
448
        // Classifiable
449
        public int getShapeType() throws DriverException {
450
                FMapFeatureArcImsDriver drv = (FMapFeatureArcImsDriver) getSource().getDriver();
451
                return drv.getShapeType();
452
        }
453

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

    
462
                protected double minX = 0D, minY = 0D, maxX = 0D, maxY = 0D;
463
        }
464

    
465
        public void setServiceInformationInStatus(ServiceInformation si) {
466
                this.arcimsStatus.setServiceInformation(si);
467
        }
468

    
469
        public ArcImsVectStatus getArcimsStatus() {
470
                return arcimsStatus;
471
        }
472

    
473
        public void setArcimsStatus(ArcImsVectStatus arcimsStatus) {
474
                this.arcimsStatus = arcimsStatus;
475
        }
476

    
477
        public boolean isFirstLoad() {
478
                return firstLoad;
479
        }
480

    
481
        public void setFirstLoad(boolean firstLoad) {
482
                this.firstLoad = firstLoad;
483
        }
484

    
485
        public URL getHost() {
486
                return host;
487
        }
488

    
489
        public void setHost(URL host) {
490
                this.host = host;
491
        }
492

    
493
        public String getLayerQuery() {
494
                return layerQuery;
495
        }
496

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

    
503
        public String getService() {
504
                return service;
505
        }
506

    
507
        public void setService(String service) {
508
                this.service = service;
509
        }
510

    
511
        public String getServiceType() {
512
                return serviceType;
513
        }
514

    
515
        public void setServiceType(String serviceType) {
516
                this.serviceType = serviceType;
517
        }
518

    
519
        public String getSRS() {
520
                return SRS;
521
        }
522

    
523
        public void setSRS(String srs) {
524
                SRS = srs;
525
        }
526

    
527
        public boolean getArcImsTransparency() {
528
                return arcImsTransparency;
529
        }
530

    
531
        public void setArcImsTransparency(boolean arcImsTransparency) {
532
                this.arcImsTransparency = arcImsTransparency;
533
        }
534

    
535
        public int getTransparency() {
536
                return transparency;
537
        }
538

    
539
        public void setTransparency(int transparency) {
540
                this.transparency = transparency;
541
        }
542

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

    
567
        public void setLayerIdsInStatus(Vector idsv) {
568
                arcimsStatus.setLayerIds(idsv);
569
        }
570

    
571
        public void setProjectionInStatus(String abbrev_srs) {
572
                arcimsStatus.setSrs(abbrev_srs);
573
        }
574

    
575
        public void setHostInStatus(URL url) {
576
                arcimsStatus.setServer(url.toString());
577
        }
578

    
579
        public void setServiceInStatus(String srv) {
580
                arcimsStatus.setService(srv);
581
        }
582

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

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

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

    
687
        public String getSrsAbrev() {
688
                return srsAbrev;
689
        }
690

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

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

730

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

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

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

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

773
                        Rectangle2D _fext = ((ArcImsFeatureClient)
774
                                        _drv.getClient()).getLayerExtent(getArcimsStatus());
775
                        _drv.setFullExtent(_fext);
776
                        // individualLayers[i].setF. setFullExtent(((ArcImsProtImageHandler) drv.getClient().getHandler()).getServiceExtent(srs, individualLayers[i].getArcimsStatus()));
777
                        
778
                        // ------ -------------
779
                        _drv.setAdapter(_adapter);
780
                        // adapter.setRecordSet(drv.getRecordSet());
781
                        _adapter.setOriginalDataSource(_drv.getRecordSet());
782
                        _adapter.setOriginalVectorialAdapter(_oldadapter);
783
                        _drv.declareTable();
784
                        
785
                        setSource(_adapter);
786
                        _adapter.setDriver(_drv);
787
                        
788
                        getSource().setDriver(_drv);
789
                        setInitialLegend();
790
                        setShapeType(_adapter.getShapeType());
791
                        setRecordset(_drv.getRecordSet());
792
                        // ------ -------------
793
                        
794
                        if ((_si.getFeaturecoordsys() == null) ||
795
                                        (_si.getFeaturecoordsys().equals(""))) {
796
                                _si.setFeaturecoordsys(_true_srs.getAbrev().substring(ServiceInfoTags.vINI_SRS.length()).trim());
797
                                logger.warn("Server provides no SRS. ");
798
                        }
799
                } catch (Exception e) {
800
                        throw new ConnectionException("Unable to connect to host " + _host, e);
801
                }
802
        }
803
        
804
        */
805
        
806

    
807
}
808