Statistics
| Revision:

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

History | View | Annotate | Download (12.4 KB)

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

    
3
import java.awt.geom.Rectangle2D;
4
import java.net.URL;
5
import java.util.TreeMap;
6
import java.util.Vector;
7

    
8
import com.iver.cit.gvsig.fmap.DriverException;
9
import com.iver.cit.gvsig.fmap.MapControl;
10
import com.iver.cit.gvsig.fmap.edition.VectorialEditableAdapter;
11
import com.iver.cit.gvsig.fmap.layers.FLayer;
12
import com.iver.utiles.swing.threads.DefaultCancellableMonitorable;
13

    
14
import es.prodevelop.cit.gvsig.arcims.fmap.drivers.ArcImsDriver;
15
import es.prodevelop.cit.gvsig.arcims.fmap.drivers.ArcImsVectorialAdapter;
16
import es.prodevelop.cit.gvsig.arcims.fmap.drivers.FMapRasterArcImsDriver;
17
import es.prodevelop.cit.gvsig.arcims.fmap.drivers.FMapFeatureArcImsDriver;
18
import es.prodevelop.cit.gvsig.arcims.fmap.layers.FFeatureLyrArcIMS;
19
import es.prodevelop.cit.gvsig.arcims.fmap.layers.FFeatureLyrArcIMSCollection;
20
import es.prodevelop.cit.gvsig.arcims.fmap.layers.FRasterLyrArcIMS;
21
import es.prodevelop.cit.gvsig.arcims.fmap.layers.LayerScaleData;
22

    
23
import org.gvsig.remoteClient.arcims.*;
24
import org.gvsig.remoteClient.arcims.utils.MyCancellable;
25
import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
26
import org.gvsig.remoteClient.arcims.utils.ServiceInformation;
27
import org.gvsig.remoteClient.arcims.utils.ServiceInformationLayerFeatures;
28
import org.apache.log4j.Logger;
29
import org.cresques.cts.IProjection;
30

    
31
/**
32
 * This class implements a data source object, owned by the ArcImsWizard
33
 * object. It will create the ArcIMS layer and load some basic data.
34
 * 
35
 * @author jldominguez
36
 * 
37
 */
38
public class ArcImsWizardData {
39
        
40
        private static Logger logger = Logger.getLogger(ArcImsWizardData.class.getName());
41

    
42
        /**
43
        * The graphic context in which a request is performed
44
        * (ccord. system, view's dimension etc.)
45
        */
46
        private ArcImsStatus status;
47
        private String testInfo;
48
        private String serviceType;
49
        private FMapRasterArcImsDriver arcImsImageDriver = null;
50
        private FMapFeatureArcImsDriver arcImsFeatureDriver = null;
51
        private boolean missingSrs = false;
52
        private MapControl mapControl;
53
        
54
        private MyCancellable myCanc;
55

    
56
        
57
        public ArcImsWizardData() {
58
                myCanc = new MyCancellable(new DefaultCancellableMonitorable());
59
        }
60
        
61
        public void setHostService(URL host, String service, String svcType) throws DriverException {
62
                
63
                serviceType = svcType;
64
                boolean nogood = true;
65
                
66
                if (serviceType.compareToIgnoreCase(ServiceInfoTags.vIMAGESERVICE) == 0) {
67
                        nogood = false;
68
                        arcImsImageDriver = new FMapRasterArcImsDriver(host.toString(), service, svcType);
69
                        // Send a getCapabilities request;
70
                        if (! arcImsImageDriver.connect(myCanc)) {
71
                                DriverException de = new DriverException("cant_connect");
72
                                logger.error("While trying to connect ", de);
73
                                throw de;
74
                        }
75
                        testInfo = "Connected successfully.";
76
                }
77
                if (serviceType.compareToIgnoreCase(ServiceInfoTags.vFEATURESERVICE) == 0) {
78
                        nogood = false;
79
                        arcImsFeatureDriver = new FMapFeatureArcImsDriver(host.toString(), service, svcType);
80
                        // Send a getCapabilities request;
81
                        if (! arcImsFeatureDriver.connect(myCanc)) {
82
                                DriverException de = new DriverException("cant_connect");
83
                                logger.error("While trying to connect ", de);
84
                                throw de;
85
                        }
86
                        testInfo = "Connected successfully.";
87
                }
88
                if (nogood) {
89
                        logger.error("Nothing done. Unable to find out serviceType ");
90
                }
91
        }
92
        
93
        public void setHostService(URL host, String service, String svcType, FLayer lyr) throws DriverException {
94
                
95
                serviceType = svcType;
96
                boolean nogood = true;
97
                
98
                if (serviceType.compareToIgnoreCase(ServiceInfoTags.vIMAGESERVICE) == 0) {
99
                        nogood = false;
100
                        
101
                        arcImsImageDriver =
102
                                (FMapRasterArcImsDriver) ((FRasterLyrArcIMS) lyr).getDriver();
103

    
104
                        // arcImsImageDriver = new FMapRasterArcImsDriver(host.toString(), service, svcType);
105
                        // Send a getCapabilities request;
106
                        if (! arcImsImageDriver.connect(myCanc)) {
107
                                DriverException de = new DriverException("cant_connect");
108
                                logger.error("While trying to connect ", de);
109
                                throw de;
110
                        }
111
                        testInfo = "Connected successfully.";
112
                }
113
                if (serviceType.compareToIgnoreCase(ServiceInfoTags.vFEATURESERVICE) == 0) {
114
                        nogood = false;
115
                        
116
                        // arcImsFeatureDriver = new FMapFeatureArcImsDriver(host.toString(), service, svcType);
117
                        arcImsFeatureDriver =
118
                                (FMapFeatureArcImsDriver) ((FFeatureLyrArcIMS) lyr).getSource().getDriver();
119

    
120
                        // Send a getCapabilities request;
121
                        if (! arcImsFeatureDriver.connect(myCanc)) {
122
                                DriverException de = new DriverException("cant_connect");
123
                                logger.error("While trying to connect ", de);
124
                                throw de;
125
                        }
126
                        testInfo = "Connected successfully.";
127
                }
128
                if (nogood) {
129
                        logger.error("Nothing done. Unable to find out serviceType ");
130
                }
131
        }
132

    
133
        
134

    
135
        public String getServiceType() { return serviceType; }
136
        public void setServiceType(String t) { serviceType = t; }
137
        
138
        public ArcImsDriver getDriver() {
139
                if (serviceType.compareToIgnoreCase(ServiceInfoTags.vFEATURESERVICE) == 0) {
140
                        return arcImsFeatureDriver;
141
                }
142
                if (serviceType.compareToIgnoreCase(ServiceInfoTags.vIMAGESERVICE) == 0) {
143
                        return arcImsImageDriver;
144
                }
145
                logger.error("Null value returned. Unable to find out serviceType ");
146
                return null;
147
        }
148
        
149
        public void setDriver(ArcImsDriver d) {
150
                boolean nogood = true;
151
                if (d instanceof FMapRasterArcImsDriver) {
152
                        arcImsImageDriver = (FMapRasterArcImsDriver) d;
153
                        nogood = false;
154
                }
155
                if (d instanceof FMapFeatureArcImsDriver) {
156
                        arcImsFeatureDriver = (FMapFeatureArcImsDriver) d;
157
                        nogood = false;
158
                }
159
                if (nogood) {
160
                        logger.error("Nothing done. Unable to find out serviceType ");
161
                }
162
        }
163
        
164
        public ArcImsStatus getStatus() { return status; }
165
        public void setStatus (ArcImsStatus s) { status = s; }
166
        
167
        /**
168
     * Gets available layers from the current server and service
169
     * 
170
     * @return a TreeMap with available layers
171
         */
172
        public TreeMap getLayers() {
173
                if (serviceType.compareToIgnoreCase(ServiceInfoTags.vFEATURESERVICE) == 0) {
174
                        return arcImsFeatureDriver.getLayers();
175
                }
176
                if (serviceType.compareToIgnoreCase(ServiceInfoTags.vIMAGESERVICE) == 0) {
177
                        return arcImsImageDriver.getLayers();
178
                }
179
                logger.error("Null value returned. Unable to find out serviceType in method " +
180
                                "TreeMap getLayers()" + ", class: "+ this.getClass().toString());
181
                return null;
182
                }
183

    
184
        /**
185
         * This method is invoqued by the wizard's <tt>getLayer()</tt> method
186
         * to create an ArcIMS raster layer.
187
         * 
188
         * @param host server's URL
189
         * @param service service name
190
         * @param sLayer comma-separated list of selected layers
191
         * @param name new gvSIG layer's name
192
         * @param srs project's coordinate system
193
         * @return the new layer (of class FRasterLyrArcIMS, which is a
194
         * subclass of _FLyrArcIMS which is a subclass of FLayer)
195
         */
196
        public FRasterLyrArcIMS createArcImsRasterLayer(String host, String service, String sLayer,
197
                        String name, IProjection srs, String imgFormat)
198
        throws  Exception {
199
                
200
                FMapRasterArcImsDriver drv = new FMapRasterArcImsDriver(host, service, this.serviceType);
201
                
202
                if (!drv.connect(myCanc))
203
                        throw new Exception();
204
        
205
                FRasterLyrArcIMS flyr = new FRasterLyrArcIMS();
206
                flyr.setDriver(drv);
207
                flyr.setHost(new URL(host));
208
                flyr.setService(service);
209
                flyr.setServiceType(this.serviceType);
210
                flyr.setServiceInformationInStatus(drv.getClient().getServiceInformation());
211

    
212
                ServiceInformation si = flyr.getArcimsStatus().getServiceInfo();
213
                if ((si.getFeaturecoordsys() == null) || (si.getFeaturecoordsys().equals(""))) {
214
                        missingSrs = true;
215
                        si.setFeaturecoordsys(srs.getAbrev().substring(ServiceInfoTags.vINI_SRS.length()).trim());
216
                        logger.warn("Server provides no SRS. ");
217
                } else {
218
                        missingSrs = false;
219
                }
220
                
221
                flyr.setFullExtent(((ArcImsProtImageHandler) drv.getClient().getHandler()).getServiceExtent(srs, flyr.getArcimsStatus()));
222
                
223
                // we *dont* use PNG always
224
                // flyr.setFormat("image/png");
225
                flyr.setFormat(imgFormat);
226
                flyr.setTransparency(0);
227
                flyr.setLayerQuery(sLayer);
228
                flyr.setProjection(srs);
229
                flyr.setName(name);
230
                // ----------- service info ---------------
231
                
232
                // flyr.getSource().getDriver();
233
                // ----------------- 1.0
234
                
235
                return flyr;
236
        }
237

    
238
        public String getTestInfo() {
239
                return testInfo;
240
        }
241
        
242
        /**
243
         * This method is invoqued by the wizard's <tt>getLayer()</tt> method
244
         * to create an ArcIMS feature layer.
245
         * 
246
         * @param host server's URL
247
         * @param service service name
248
         * @param sLayer comma-separated list of selected layers
249
         * @param name new gvSIG layer's name
250
         * @param srs project's coordinate system
251
         * @param sep whether it'a grouped set of layers (false) or not (true)
252
         * @return the new layer (of class FRasterLyrArcIMS, which is a
253
         * subclass of FRasterLyrArcIMS, which is a subclass of FLayer)
254
         */
255
        public FFeatureLyrArcIMSCollection createArcImsFeatureLayer(String host, String service, String sLayer, String name, IProjection srs, boolean sep)
256
        throws Exception {
257
                
258
                String[] selectedLayerIds = sLayer.split(",");
259
                int count = selectedLayerIds.length;
260
                
261
                FFeatureLyrArcIMS[] individualLayers = new FFeatureLyrArcIMS[count];
262
                
263
                String item;
264
                
265
                for (int i=0; i<count; i++) {
266
                        
267
                        item = selectedLayerIds[i];
268
                        FMapFeatureArcImsDriver drv = new FMapFeatureArcImsDriver(host, service, item);
269
                        if (!(drv.connect(myCanc))) throw new Exception();
270
                        
271
                        ArcImsVectorialAdapter oldadapter = new ArcImsVectorialAdapter(drv);
272
                        VectorialEditableAdapter adapter = new VectorialEditableAdapter();
273
                        
274
                        /* 1 */ individualLayers[i] = new FFeatureLyrArcIMS(adapter);
275
                        /* 2 */ drv.setLayer(individualLayers[i]);
276
                        
277
                        ServiceInformation si = drv.getClient().getServiceInformation();
278
                        ServiceInformationLayerFeatures silf = (ServiceInformationLayerFeatures) si.getLayerById(item);
279
                        String lyrname = silf.getName(); 
280

    
281
                        individualLayers[i].setProjectionInStatus(srs.getAbrev());
282
                        individualLayers[i].setHostInStatus(new URL(host));
283
                        individualLayers[i].setServiceInStatus(service);
284

    
285
                        String units = si.getMapunits();
286
                        int theDpi = si.getScreen_dpi();
287
                        long scale;
288
                        if (silf.getMaxscale()!=-1){
289
                                scale = LayerScaleData.getTrueScaleFromRelativeScaleAndMapUnits(silf.getMaxscale(), units, theDpi);
290
                                individualLayers[i].setMaxScale((double) scale);
291
                        }
292
                        if (silf.getMinscale()!=-1){
293
                                scale = LayerScaleData.getTrueScaleFromRelativeScaleAndMapUnits(silf.getMinscale(), units, theDpi);
294
                                individualLayers[i].setMinScale((double) scale);                        
295
                        }
296
                
297
                        individualLayers[i].setServiceInformationInStatus(si);
298
                        Vector ids = new Vector(); ids.add(item);
299
                        individualLayers[i].setLayerIdsInStatus((Vector) ids.clone());
300
                        individualLayers[i].setSubfieldsInStatus();
301
                        
302
                        
303
                        /* 3 */ 
304
                        // individualLayers[i].setLegend(new VectorialUniqueValueLegend());
305
                        
306
                        
307
                        individualLayers[i].setHost(new URL(host));
308
                        individualLayers[i].setService(service);
309
                        individualLayers[i].setServiceType(ServiceInfoTags.vFEATURESERVICE);
310
                        individualLayers[i].setTransparency(0);
311
                        individualLayers[i].setLayerQuery(item);
312
                        individualLayers[i].setProjection(srs);
313
                        individualLayers[i].setName(lyrname);
314

    
315
                        Rectangle2D fext = ((ArcImsFeatureClient) drv.getClient()).getLayerExtent(individualLayers[i].getArcimsStatus());
316
                        drv.setFullExtent(fext);
317
                        // individualLayers[i].setF. setFullExtent(((ArcImsProtImageHandler) drv.getClient().getHandler()).getServiceExtent(srs, individualLayers[i].getArcimsStatus()));
318
                        
319
                        // ------ -------------
320
                        drv.setAdapter(adapter);
321
                        // adapter.setRecordSet(drv.getRecordSet());
322
                        adapter.setOriginalDataSource(drv.getRecordSet());
323
                        adapter.setOriginalVectorialAdapter(oldadapter);
324
                        drv.declareTable();
325
                        individualLayers[i].setInitialLegend();
326
                        individualLayers[i].setShapeType(adapter.getShapeType());
327
                        individualLayers[i].setRecordset(drv.getRecordSet());
328
                        // ------ -------------
329
                        
330
                        if ((si.getFeaturecoordsys() == null) || (si.getFeaturecoordsys().equals(""))) {
331
                                missingSrs = true;
332
                                si.setFeaturecoordsys(srs.getAbrev().substring(ServiceInfoTags.vINI_SRS.length()).trim());
333
                                logger.warn("Server provides no SRS. ");
334
                        } else {
335
                                missingSrs = false;
336
                        }
337
                        
338
                }
339

    
340
                FFeatureLyrArcIMSCollection collection = new FFeatureLyrArcIMSCollection(mapControl.getMapContext(), null, sep);
341
                collection.setName(name);
342
                collection.setProjection(srs);
343
                for (int i=0; i<count; i++) {
344
                        collection.addLayer(individualLayers[i]);
345
                }
346
                return collection;
347
        }        
348

    
349
        /**
350
         * Tells whether the SRS was missing on the server.
351
         * 
352
         * @return <tt>true</tt> if and only if the Srs was not provided by the server.
353
         */
354
        public boolean isMissingSrs() {
355
                return missingSrs;
356
        }
357

    
358
        public void setMissingSrs(boolean missingSrs) {
359
                this.missingSrs = missingSrs;
360
        }
361

    
362
        public void setMapControl(MapControl mapControl) {
363
                this.mapControl = mapControl;
364
        }
365
        
366
}