Statistics
| Revision:

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

History | View | Annotate | Download (24.1 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.v02.FSymbol;
43
import com.iver.cit.gvsig.fmap.crs.CRSFactory;
44
import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
45
import com.iver.cit.gvsig.fmap.edition.VectorialEditableAdapter;
46
import com.iver.cit.gvsig.fmap.layers.FBitSet;
47
import com.iver.cit.gvsig.fmap.layers.FLyrText;
48
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
49
import com.iver.cit.gvsig.fmap.layers.LegendListener;
50
import com.iver.cit.gvsig.fmap.layers.XMLException;
51
import com.iver.cit.gvsig.fmap.layers.layerOperations.InfoByPoint;
52
import com.iver.cit.gvsig.fmap.operations.Cancel;
53
import com.iver.cit.gvsig.fmap.rendering.Legend;
54
import com.iver.cit.gvsig.fmap.rendering.LegendChangedEvent;
55
import com.iver.cit.gvsig.fmap.rendering.VectorialLegend;
56
import com.iver.utiles.XMLEntity;
57
import com.iver.utiles.connections.ConnectionException;
58
import com.iver.utiles.swing.threads.Cancellable;
59
import com.iver.utiles.swing.threads.DefaultCancellableMonitorable;
60

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
291
        /**
292
         * 
293
         */
294
        public void print(Graphics2D g, ViewPort viewPort, Cancellable cancel,
295
                        double scale) throws DriverException {
296

    
297
                draw(null, g, viewPort, cancel, scale);
298
        }
299

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

    
329
                String resp = getFormattedFieldsFromSetFeatures(fbs);
330
                System.err.println(resp); //TODO BORRAR ESTO
331
                return resp;
332
        }
333
        
334

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

    
350
        // TODO: move this to another class:
351
        private String getFormattedFieldsFromFeature(int j) {
352

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

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

    
397

    
398
        public void setInitialLegend() {
399

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

    
408
                        if (initialleg != null) {
409

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

    
444
        // Classifiable
445
        public int getShapeType() throws DriverException {
446
                FMapFeatureArcImsDriver drv = (FMapFeatureArcImsDriver) getSource().getDriver();
447
                return drv.getShapeType();
448
        }
449

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

    
458
                protected double minX = 0D, minY = 0D, maxX = 0D, maxY = 0D;
459
        }
460

    
461
        public void setServiceInformationInStatus(ServiceInformation si) {
462
                this.arcimsStatus.setServiceInformation(si);
463
        }
464

    
465
        public ArcImsVectStatus getArcimsStatus() {
466
                return arcimsStatus;
467
        }
468

    
469
        public void setArcimsStatus(ArcImsVectStatus arcimsStatus) {
470
                this.arcimsStatus = arcimsStatus;
471
        }
472

    
473
        public boolean isFirstLoad() {
474
                return firstLoad;
475
        }
476

    
477
        public void setFirstLoad(boolean firstLoad) {
478
                this.firstLoad = firstLoad;
479
        }
480

    
481
        public URL getHost() {
482
                return host;
483
        }
484

    
485
        public void setHost(URL host) {
486
                this.host = host;
487
        }
488

    
489
        public String getLayerQuery() {
490
                return layerQuery;
491
        }
492

    
493
        public void setLayerQuery(String lQuery) {
494
                this.layerQuery = lQuery;
495
                if (layerQuery.substring(0, 1).compareTo(",") == 0)
496
                        layerQuery = layerQuery.substring(1);
497
        }
498

    
499
        public String getService() {
500
                return service;
501
        }
502

    
503
        public void setService(String service) {
504
                this.service = service;
505
        }
506

    
507
        public String getServiceType() {
508
                return serviceType;
509
        }
510

    
511
        public void setServiceType(String serviceType) {
512
                this.serviceType = serviceType;
513
        }
514

    
515
        public String getSRS() {
516
                return SRS;
517
        }
518

    
519
        public void setSRS(String srs) {
520
                SRS = srs;
521
        }
522

    
523
        public boolean getArcImsTransparency() {
524
                return arcImsTransparency;
525
        }
526

    
527
        public void setArcImsTransparency(boolean arcImsTransparency) {
528
                this.arcImsTransparency = arcImsTransparency;
529
        }
530

    
531
        public int getTransparency() {
532
                return transparency;
533
        }
534

    
535
        public void setTransparency(int transparency) {
536
                this.transparency = transparency;
537
        }
538

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

    
563
        public void setLayerIdsInStatus(Vector idsv) {
564
                arcimsStatus.setLayerIds(idsv);
565
        }
566

    
567
        public void setProjectionInStatus(String abbrev_srs) {
568
                arcimsStatus.setSrs(abbrev_srs);
569
        }
570

    
571
        public void setHostInStatus(URL url) {
572
                arcimsStatus.setServer(url.toString());
573
        }
574

    
575
        public void setServiceInStatus(String srv) {
576
                arcimsStatus.setService(srv);
577
        }
578

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

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

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

    
683
        public String getSrsAbrev() {
684
                return srsAbrev;
685
        }
686

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

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

726

727
                        FMapFeatureArcImsDriver _drv = new FMapFeatureArcImsDriver(_true_host.toString(),
728
                                        _service_name, _layer_id);
729
                        if (!(_drv.connect(myCanc))) throw new Exception();
730
                        ArcImsVectorialAdapter _oldadapter = new ArcImsVectorialAdapter(_drv);
731
                        VectorialEditableAdapter _adapter = new VectorialEditableAdapter();
732
                        _drv.setLayer(this);
733

734
                        ServiceInformation _si = _drv.getClient().getServiceInformation();
735
                        ServiceInformationLayerFeatures _silf = (ServiceInformationLayerFeatures)
736
                        _si.getLayerById(_layer_id);
737
                        
738
                        setProjectionInStatus(_true_srs.getAbrev());
739
                        setHostInStatus(_true_host);
740
                        setServiceInStatus(_service_name);
741

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

761
                        setHost(_true_host);
762
                        setService(_service_name);
763
                        setServiceType(ServiceInfoTags.vFEATURESERVICE);
764
                        setTransparency(0);
765
                        setLayerQuery(_layer_id);
766
                        setProjection(_true_srs);
767
                        setName(_layer_name);
768

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

    
803
}
804