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 |
} |