Revision 32441

View differences:

branches/v2_0_0_prep/extensions/org.gvsig.arcims.feature.extension/src/main/java/org/gvsig/arcims/feature/fmap/datasource/ArcImsFeatureWizardData.java
1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 */
22

  
23
/*
24
 * AUTHORS (In addition to CIT):
25
 * 2010 Prodevelop S.L. main development
26
 * http://www.prodevelop.es
27
 */
28

  
29
package org.gvsig.arcims.feature.fmap.datasource;
30

  
31
import java.net.URL;
32
import java.util.TreeMap;
33

  
34
import org.cresques.cts.IProjection;
35
import org.gvsig.arcims.feature.fmap.drivers.ArcImsDriver;
36
import org.gvsig.arcims.feature.fmap.drivers.ArcImsVectorialAdapter;
37
import org.gvsig.arcims.feature.fmap.drivers.FMapFeatureArcImsDriver;
38
import org.gvsig.arcims.feature.fmap.layers.FFeatureLyrArcIMS;
39
import org.gvsig.arcims.feature.fmap.layers.FFeatureLyrArcIMSCollection;
40
import org.gvsig.fmap.mapcontext.layers.FLayer;
41
import org.gvsig.fmap.mapcontrol.MapControl;
42
import org.gvsig.remoteclient.arcims.ArcImsProtImageHandler;
43
import org.gvsig.remoteclient.arcims.ArcImsStatus;
44
import org.gvsig.remoteclient.arcims.utils.MyCancellable;
45
import org.gvsig.remoteclient.arcims.utils.ServiceInfoTags;
46
import org.gvsig.remoteclient.arcims.utils.ServiceInformation;
47
import org.gvsig.utils.swing.threads.DefaultCancellableMonitorable;
48
import org.slf4j.Logger;
49
import org.slf4j.LoggerFactory;
50

  
51
/**
52
 * This class implements a data source object, owned by the ArcImsWizard object.
53
 * It will create the ArcIMS layer and load some basic data.
54
 * 
55
 * @author jldominguez
56
 * 
57
 */
58
public class ArcImsFeatureWizardData {
59
	private static Logger logger = LoggerFactory
60
			.getLogger(ArcImsFeatureWizardData.class.getName());
61

  
62
	/**
63
	 * The graphic context in which a request is performed (ccord. system,
64
	 * view's dimension etc.)
65
	 */
66
	private ArcImsStatus status;
67
	private String testInfo;
68
	private String serviceType;	
69
	private boolean missingSrs = false;
70
	private MapControl mapControl;
71
	private MyCancellable myCanc;
72

  
73
	public ArcImsFeatureWizardData() {
74
		//TODO
75
	}
76

  
77
	/**
78
	 * 
79
	 * @param host
80
	 * @param service
81
	 * @param svcType
82
	 * @throws Exception
83
	 */
84
	public void setHostService(URL host, String service, String svcType)
85
			throws Exception {
86
		serviceType = svcType;
87

  
88
		boolean nogood = true;
89

  
90
		if (serviceType.compareToIgnoreCase(ServiceInfoTags.vFEATURESERVICE) == 0) {
91
			nogood = false;
92
			//TODO
93

  
94
			testInfo = "Connected successfully.";
95
		}
96

  
97
		if (nogood) {
98
			logger.error("Nothing done. Unable to find out serviceType ");
99
		}
100
	}
101

  
102
	/**
103
	 * 
104
	 * @param host
105
	 * @param service
106
	 * @param svcType
107
	 * @param lyr
108
	 * @throws Exception
109
	 */
110
	public void setHostService(URL host, String service, String svcType,
111
			FLayer lyr) throws Exception {
112
		serviceType = svcType;
113

  
114
		boolean nogood = true;
115

  
116
		if (serviceType.compareToIgnoreCase(ServiceInfoTags.vFEATURESERVICE) == 0) {
117
			nogood = false;
118

  
119
			//TODO
120

  
121
			testInfo = "Connected successfully.";
122
		}
123

  
124
		if (nogood) {
125
			logger.error("Nothing done. Unable to find out serviceType ");
126
		}
127
	}
128

  
129
	/**
130
	 * Get service type
131
	 * @return
132
	 */
133
	public String getServiceType() {
134
		return serviceType;
135
	}
136

  
137
	/**
138
	 * Set service type
139
	 * @param t
140
	 */
141
	public void setServiceType(String t) {
142
		serviceType = t;
143
	}
144

  
145
	
146

  
147
	/**
148
	 * Get status 
149
	 * @return
150
	 */
151
	public ArcImsStatus getStatus() {
152
		return status;
153
	}
154

  
155
	/**
156
	 * Set status
157
	 * @param s
158
	 */
159
	public void setStatus(ArcImsStatus s) {
160
		status = s;
161
	}
162

  
163
	/**
164
	 * Gets available layers from the current server and service
165
	 * 
166
	 * @return a TreeMap with available layers
167
	 */
168
	public TreeMap getLayers() {
169

  
170
		if (serviceType.compareToIgnoreCase(ServiceInfoTags.vFEATURESERVICE) == 0) {
171
			// TODo return layers availables
172
			return null;
173
		}
174

  
175
		logger
176
				.error("Null value returned. Unable to find out serviceType in method "
177
						+ "TreeMap getLayers()"
178
						+ ", class: "
179
						+ this.getClass().toString());
180

  
181
		return null;
182
	}
183

  
184
	/**
185
	 * 
186
	 * @return
187
	 */
188
	public String getTestInfo() {
189
		return testInfo;
190
	}
191

  
192
	/**
193
	 * This method is invoqued by the wizard's <tt>getLayer()</tt> method to
194
	 * create an ArcIMS feature layer.
195
	 * 
196
	 * @param host
197
	 *            server's URL
198
	 * @param service
199
	 *            service name
200
	 * @param sLayer
201
	 *            comma-separated list of selected layers
202
	 * @param name
203
	 *            new gvSIG layer's name
204
	 * @param srs
205
	 *            project's coordinate system
206
	 * @param sep
207
	 *            whether it'a grouped set of layers (false) or not (true)
208
	 * @return the new layer (of class FRasterLyrArcIMS, which is a subclass of
209
	 *         FRasterLyrArcIMS, which is a subclass of FLayer)
210
	 */
211
	public FFeatureLyrArcIMSCollection createArcImsFeatureLayer(String host,
212
			String service, String sLayer, String name, IProjection srs,
213
			boolean sep) throws Exception {
214

  
215
		// FIXME vsanjaime
216
		String[] selectedLayerIds = sLayer.split(",");
217
		int count = selectedLayerIds.length;
218

  
219
		FFeatureLyrArcIMS[] individualLayers = new FFeatureLyrArcIMS[count];
220

  
221
		String item;
222

  
223
		for (int i = 0; i < count; i++) {
224
			item = selectedLayerIds[i];
225

  
226
			FMapFeatureArcImsDriver drv = new FMapFeatureArcImsDriver(host,
227
					service, item);
228

  
229
			if (!(drv.connect(myCanc))) {
230
				throw new Exception();
231
			}
232

  
233
			ArcImsVectorialAdapter oldadapter = new ArcImsVectorialAdapter(drv);
234
			ArcImsVectorialEditableAdapter adapter = new ArcImsVectorialEditableAdapter();
235

  
236
			/* 1 */individualLayers[i] = new FFeatureLyrArcIMS(adapter);
237

  
238
			/* 2 */drv.setLayer(individualLayers[i]);
239

  
240
			ServiceInformation si = drv.getClient().getServiceInformation();
241
			ServiceInformationLayerFeatures silf = (ServiceInformationLayerFeatures) si
242
					.getLayerById(item);
243
			String lyrname = silf.getName();
244

  
245
			individualLayers[i].setProjectionInStatus(srs.getAbrev());
246
			individualLayers[i].setHostInStatus(new URL(host));
247
			individualLayers[i].setServiceInStatus(service);
248

  
249
			String units = si.getMapunits();
250
			int theDpi = si.getScreen_dpi();
251
			long scale;
252

  
253
			if (silf.getMaxscale() != -1) {
254
				scale = LayerScaleData
255
						.getTrueScaleFromRelativeScaleAndMapUnits(silf
256
								.getMaxscale(), units, theDpi);
257
				individualLayers[i].setMaxScale((double) scale);
258
			}
259

  
260
			if (silf.getMinscale() != -1) {
261
				scale = LayerScaleData
262
						.getTrueScaleFromRelativeScaleAndMapUnits(silf
263
								.getMinscale(), units, theDpi);
264
				individualLayers[i].setMinScale((double) scale);
265
			}
266

  
267
			individualLayers[i].setServiceInformationInStatus(si);
268

  
269
			Vector ids = new Vector();
270
			ids.add(item);
271
			individualLayers[i].setLayerIdsInStatus((Vector) ids.clone());
272
			individualLayers[i].setSubfieldsInStatus();
273

  
274
			/* 3 */
275
			// individualLayers[i].setLegend(new VectorialUniqueValueLegend());
276
			individualLayers[i].setHost(new URL(host));
277
			individualLayers[i].setService(service);
278
			individualLayers[i].setServiceType(ServiceInfoTags.vFEATURESERVICE);
279
			individualLayers[i].setTransparency(0);
280
			individualLayers[i].setLayerQuery(item);
281
			individualLayers[i].setProjection(srs);
282
			individualLayers[i].setName(lyrname);
283

  
284
			Rectangle2D fext = ((ArcImsFeatureClient) drv.getClient())
285
					.getLayerExtent(individualLayers[i].getArcimsStatus());
286
			drv.setFullExtent(fext);
287

  
288
			// individualLayers[i].setF. setFullExtent(((ArcImsProtImageHandler)
289
			// drv.getClient().getHandler()).getServiceExtent(srs,
290
			// individualLayers[i].getArcimsStatus()));
291

  
292
			// ------ -------------
293
			drv.setAdapter(adapter);
294

  
295
			// adapter.setRecordSet(drv.getRecordSet());
296
			adapter.setOriginalDataSource(drv.getRecordSet());
297
			adapter.setOriginalVectorialAdapter(oldadapter);
298
			drv.declareTable(individualLayers[i]);
299
			individualLayers[i].setInitialLegend();
300
			individualLayers[i].setShapeType(adapter.getShapeType());
301
			individualLayers[i].setRecordset(drv.getRecordSet());
302

  
303
			// ------ -------------
304
			if ((si.getFeaturecoordsys() == null)
305
					|| (si.getFeaturecoordsys().equals(""))) {
306
				missingSrs = true;
307
				si.setFeaturecoordsys(srs.getAbrev().substring(
308
						ServiceInfoTags.vINI_SRS.length()).trim());
309
				logger.warn("Server provides no SRS. ");
310
			} else {
311
				missingSrs = false;
312
			}
313
		}
314

  
315
		FFeatureLyrArcIMSCollection collection = new FFeatureLyrArcIMSCollection(
316
				mapControl.getMapContext(), null, sep);
317
		collection.setName(name);
318
		collection.setProjection(srs);
319

  
320
		for (int i = 0; i < count; i++) {
321
			collection.addLayer(individualLayers[i]);
322
		}
323

  
324
		return collection;
325
		return null;
326
	}
327

  
328
	/**
329
	 * Tells whether the SRS was missing on the server.
330
	 * 
331
	 * @return <tt>true</tt> if and only if the Srs was not provided by the
332
	 *         server.
333
	 */
334
	public boolean isMissingSrs() {
335
		return missingSrs;
336
	}
337

  
338
	/**
339
	 * set SRS
340
	 * @param missingSrs
341
	 */
342
	public void setMissingSrs(boolean missingSrs) {
343
		this.missingSrs = missingSrs;
344
	}
345

  
346
	/**
347
	 * set Mapcontrol
348
	 * @param mapControl
349
	 */
350
	public void setMapControl(MapControl mapControl) {
351
		this.mapControl = mapControl;
352
	}
353
}

Also available in: Unified diff