Revision 4181 org.gvsig.raster.wms/trunk/org.gvsig.raster.wms/org.gvsig.raster.wms.app.wmsclient/src/main/java/org/gvsig/raster/wms/app/wmsclient/layer/FLyrWMS.java

View differences:

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

  
23 23
package org.gvsig.raster.wms.app.wmsclient.layer;
24 24

  
25 25
import java.awt.Dimension;
......
33 33
import java.awt.geom.Rectangle2D;
34 34
import java.awt.image.BufferedImage;
35 35
import java.lang.ref.WeakReference;
36
import java.net.URI;
37
import java.net.URISyntaxException;
36 38
import java.util.ArrayList;
37 39
import java.util.HashMap;
38 40
import java.util.Iterator;
......
45 47

  
46 48
import org.cresques.cts.ICoordTrans;
47 49
import org.cresques.cts.IProjection;
50

  
48 51
import org.gvsig.andami.PluginServices;
49 52
import org.gvsig.fmap.dal.DALLocator;
50 53
import org.gvsig.fmap.dal.DataManager;
......
104 107
import org.gvsig.tools.task.Cancellable;
105 108
import org.gvsig.tools.task.SimpleTaskStatus;
106 109
import org.gvsig.tools.task.TaskStatusManager;
110

  
107 111
import org.slf4j.Logger;
108 112
import org.slf4j.LoggerFactory;
109 113

  
......
139 143
public class FLyrWMS extends DefaultFLyrRaster {
140 144
	public static final String           PERSISTENT_NAME           = "FLyrWMS_Persistent";
141 145
	public static final String           PERSISTENT_DESCRIPTION    = "FLyrWMS Persistent Definition";
142
	
146

  
143 147
	private static final GeometryManager geomManager               = GeometryLocator.getGeometryManager();
144 148
	private static final Logger          logger                    = LoggerFactory.getLogger(FLyrWMS.class);
145 149
	private boolean 					 mustSplitRequest          = false;
......
163 167
			logger.error("Fallo el estado de open. Closed=" + isClosed() + " Awake=" + isAwake(), this, e);
164 168
		}
165 169
	}
166
	
170

  
167 171
   public FLyrWMS(DataStoreParameters dataStoreParameters) throws Exception {
168 172
        this();
169 173
        //Create the explorer and connect
170 174
        DataManager dataManager = DALLocator.getDataManager();
171
        WMSServerExplorerParameters explorerParams = (WMSServerExplorerParameters) 
175
        WMSServerExplorerParameters explorerParams = (WMSServerExplorerParameters)
172 176
               dataManager.createServerExplorerParameters(WMSServerExplorer.NAME);
173
        explorerParams.setHost((String)dataStoreParameters.getDynValue("uri"));        
174
        WMSServerExplorer wmsServerExplorer = 
177
        explorerParams.setHost((String)dataStoreParameters.getDynValue("uri"));
178
        WMSServerExplorer wmsServerExplorer =
175 179
            (WMSServerExplorer) dataManager.openServerExplorer(WMSServerExplorer.NAME, explorerParams);
176 180
        wmsServerExplorer.connect(null, ((RemoteStoreParameters)dataStoreParameters).isDeletingCache());
177
        
181

  
178 182
        //Set the parameters
179 183
        setParameters((WMSDataParameters)dataStoreParameters);
180 184
        setExplorer(wmsServerExplorer);
181 185
    }
182
	
186

  
183 187
	public static DataStore createDataStore(String host, IProjection srs) throws InitializeException {
184 188
		DataManagerProviderServices dataman = (DataManagerProviderServices) DALLocator.getDataManager();
185 189
		RasterDataParameters params = null;
......
190 194
		} catch (ProviderNotRegisteredException e) {
191 195
			return null;
192 196
		}
193
		params.setURI(host);
197
		try {
198
            params.setURI(new URI(host));
199
        } catch (URISyntaxException e1) {
200
            throw new InitializeException("Can't create URI from "+host, e1);
201
        }
194 202
		params.setSRS(srs);
195
		
203

  
196 204
		try {
197 205
			return dataman.openStore(params.getDataStoreName(), params);
198 206
		} catch (ValidateDataParametersException e) {
......
235 243
		}
236 244
		return (String)formats.get(0);
237 245
	}
238
	
246

  
239 247
	public static void registerPersistent() {
240 248
		PersistenceManager manager = ToolsLocator.getPersistenceManager();
241 249
		DynStruct definition = manager.getDefinition("FLyrWMS_Persistent");
......
248 256
					FLyrWMS.class,
249 257
					"FLyrWMS_Persistent",
250 258
					"FLyrWMS Persistent Definition",
251
					null, 
259
					null,
252 260
					null
253 261
			);
254
			
262

  
255 263
			definition.extend(PersistenceManager.PERSISTENCE_NAMESPACE, DefaultFLyrRaster.PERSISTENT_NAME);
256 264
		}
257 265

  
258 266
		DefaultFLyrRaster.registerPersistence(definition);
259 267
	}
260
	
268

  
261 269
	public void draw(BufferedImage image, Graphics2D g, ViewPort viewPort,
262 270
			Cancellable cancel, double scale) throws ReadException {
263 271
		TaskStatusManager manager = ToolsLocator.getTaskStatusManager();
......
265 273
		manager.add(taskStatus);
266 274
		taskStatus.setAutoremove(true);
267 275
		splitRequestCalculation(viewPort.getImageWidth(), viewPort.getImageHeight());
268
		
276

  
269 277
		if(!firstLoad) {
270 278
			try {
271 279
				initFilters();
......
280 288
			}
281 289
			firstLoad = true;
282 290
		}
283
		
291

  
284 292
		enableStopped();
285
		
293

  
286 294
		if(recalcLevel) {
287 295
			double pixelSize = viewPort.getEnvelope().getLength(0) / (double)viewPort.getImageWidth();
288 296
			zoomLevel = dataStore.getNearestLevel(pixelSize);
......
319 327
		}
320 328
		disableStopped();
321 329
	}
322
	
323
		
330

  
331

  
324 332
	/**
325 333
	 * This is the method used to draw a tile in a WMS mosaic layer.
326 334
	 * @throws LoadLayerException
......
339 347
			Rectangle2D vpRect = getRectable2DFromEnvelope(vpEnv);
340 348
			Rectangle2D layerRect = getRectable2DFromEnvelope(layerEnv);
341 349
			// 2. Intersect layer and viewport extents to get the area of interest
342
			Rectangle2D requestedRect = new Rectangle2D.Double(); 
350
			Rectangle2D requestedRect = new Rectangle2D.Double();
343 351
			Rectangle2D.intersect(layerRect, vpRect, requestedRect);
344 352

  
345 353
			// 3. Compute image size in pixels from the requested Extent
......
350 358
			if ((wImg <= 0) || (hImg <= 0)) {
351 359
				return;
352 360
			}
353
			
361

  
354 362
			// 4. compute exactly the requested extent (from the rounded image size)
355 363
			// ensuring we are still within the layer extent
356 364
			double worldWidth = Math.abs((double)wImg/scalex);
......
370 378
			else {
371 379
				worldY = requestedRect.getMinY();
372 380
			}
373
			
374
			requestedRect.setRect(worldX, worldY, worldWidth, worldHeigh); 
381

  
382
			requestedRect.setRect(worldX, worldY, worldWidth, worldHeigh);
375 383
			Envelope requestedEnvelope = geomManager.createEnvelope(requestedRect.getMinX(),
376 384
					requestedRect.getMinY(),
377 385
					requestedRect.getMaxX(),
378 386
					requestedRect.getMaxY(),
379 387
					SUBTYPES.GEOM2D);
380 388
			Extent requestedExtent = rManager.getDataStructFactory().createExtent(
381
					requestedEnvelope.getMinimum(0), 
382
					requestedEnvelope.getMaximum(1), 
383
					requestedEnvelope.getMaximum(0), 
389
					requestedEnvelope.getMinimum(0),
390
					requestedEnvelope.getMaximum(1),
391
					requestedEnvelope.getMaximum(0),
384 392
					requestedEnvelope.getMinimum(1));
385 393

  
386 394
			// 5. compute the new AffineTransform (ViewPort class can do it for us
......
390 398
			auxVp.setImageSize(sz);
391 399
			auxVp.setEnvelope(requestedEnvelope);
392 400

  
393
			
401

  
394 402
			// 6. compute tile offeset. It is the sum of the original viewport offset
395 403
			// plus the offset introduced by intersecting layer and viewport extents
396 404
			double offsetX = vp.getOffset().getX();
......
440 448
		} catch (CreateEnvelopeException e) {
441 449
			drawingError(e);
442 450
		} finally {
443
			taskStatus.terminate();				
451
			taskStatus.terminate();
444 452
		}
445 453
	}
446
	
454

  
447 455
	private void drawingError(Exception e) {
448 456
		setAvailable(false);
449 457
		JOptionPane.showMessageDialog(null, "Problems drawing this layer:" + e.getMessage(), Messages.getText("Error"), JOptionPane.ERROR_MESSAGE);
450 458
		logger.info("Problems drawing this layer:" + e.getMessage(), e);
451
	}	
459
	}
452 460

  
453 461
	/**
454 462
	 * @see com.iver.cit.gvsig.fmap.layers.FLayer#print(java.awt.Graphics2D,
......
526 534
	@SuppressWarnings({ "unchecked", "rawtypes" })
527 535
	public String toMapContext(String mapContextVersion) {
528 536
		XmlBuilder xml = new XmlBuilder();
529
		
537

  
530 538
		String query = getParameters().getLayerQuery();
531 539
		String[] layerNames = query.split(",");
532 540
		List<RemoteWMSStyle> styleList = getParameters().getStyles();
......
672 680
	public boolean isTiled() {
673 681
		return mustSplitRequest;
674 682
	}
675
	
683

  
676 684
	private void splitRequestCalculation(int width, int height) {
677 685
            RasterDataStore store = this.getDataStore();
678 686
            if( store == null ) {
......
720 728
		if (!getParameters().getURI().equals(aLayer.getParameters().getURI())) {
721 729
			return false;
722 730
		}
723
		
724
		WMSDataParameters p = getWMSParameters(getDataStore().getParameters()); 
725
				
731

  
732
		WMSDataParameters p = getWMSParameters(getDataStore().getParameters());
733

  
726 734
		if (!p.getFormat().equals(aLayer.getParameters().getFormat())) {
727 735
			return false;
728 736
		}
......
799 807
		}
800 808
		return null;
801 809
	}
802
	
810

  
803 811
	public boolean isRemote() {
804 812
		return true;
805 813
	}
......
872 880
		}
873 881
		return null;
874 882
	}*/
875
	
883

  
876 884
	@Override
877 885
	public String getFileFormat() {
878 886
		return "WMS";
879 887
	}
880
	
888

  
881 889
	@Override
882 890
	public FLayer getFileLayer() throws RasterDriverException {
883 891
		/*if(getDataStore() instanceof DefaultRemoteRasterStore) {
884 892
			RemoteRasterProvider prov = (RemoteRasterProvider)((DefaultRemoteRasterStore)getDataStore()).getProvider(0);
885 893
			File file = null;
886
			
894

  
887 895
			if(getParameters().isSizeFixed()) {
888 896
				file = prov.getFileLayer();
889 897
			} else {
890 898
				file = prov.getLastRequest();
891 899
			}
892
				
900

  
893 901
			if(file == null)
894 902
				return null;
895
			
903

  
896 904
			try {
897 905
				return DefaultFLyrRaster.createLayer("tmp", file);
898 906
			} catch (LoadLayerException e) {
......
944 952
		return rAux;
945 953

  
946 954
	}
947
	
955

  
948 956
	public Extent getFullRasterExtent() {
949 957
		return getExtentFromEnvelope(getFullEnvelope());
950 958
	}
951
	
959

  
952 960
	public DynObjectSet getInfo(org.gvsig.fmap.geom.primitive.Point p, double tolerance) throws LoadLayerException, DataException {
953 961
		Point p1 = new Point((int)p.getX(), (int)p.getY());
954 962
		return getInfo(p1, tolerance, null, false);
......
969 977
			getParameters().setWidth(viewPort.getImageWidth());
970 978
			getParameters().setHeight(viewPort.getImageHeight());
971 979
		}
972
		
980

  
973 981
		CancelTaskImpl cancellable = new CancelTaskImpl(cancel);
974 982
		getParameters().setCancellable(cancellable);
975
		
983

  
976 984
		String fInfo;
977 985
		try {
978 986
			//Point2D pt = new Point2D.Double();
......
981 989
			/*} catch (NoninvertibleTransformException e) {
982 990
				return null;
983 991
			}*/
984
			
992

  
985 993
			Extent bbox = getExtentFromEnvelope(viewPort.getAdjustedEnvelope());
986
			fInfo = getDataStore().getInfoByPoint(p.getX(), 
987
					p.getY(), 
988
					bbox, 
989
					viewPort.getImageWidth(), 
990
					viewPort.getImageHeight(), 
994
			fInfo = getDataStore().getInfoByPoint(p.getX(),
995
					p.getY(),
996
					bbox,
997
					viewPort.getImageWidth(),
998
					viewPort.getImageHeight(),
991 999
					cancellable);
992 1000
		} catch (InfoByPointException e) {
993 1001
			throw new LoadLayerException("Error in getInfoByPoint", e);
994 1002
		}
995 1003
		return new DynObjectSetWMSInfo(fInfo, getParameters().getInfoFormat());
996 1004
	}
997
	
1005

  
998 1006
	private Extent getExtentFromEnvelope(Envelope env) {
999 1007
		double minx = env.getMinimum(0);
1000 1008
		double miny = env.getMinimum(1);
......
1006 1014
		Point2D lr = new Point2D.Double(maxx, miny);
1007 1015
		return rManager.getDataStructFactory().createExtent(ul, lr, ur, ll);
1008 1016
	}
1009
    
1017

  
1010 1018
    /**
1011 1019
     * Sets the data store parameters
1012 1020
     * @param params
......
1016 1024
    	if(params instanceof TileDataParameters) {
1017 1025
			((TileDataParameters)params).deleteCache(deleteCache);
1018 1026
		}
1019
    	
1027

  
1020 1028
    	DataManagerProviderServices dataman = (DataManagerProviderServices) DALLocator.getDataManager();
1021 1029
		try {
1022 1030
			DataStore dStore = dataman.openStore(params.getDataStoreName(), params);
1023 1031
			this.setDataStore(dStore);
1024
			
1032

  
1025 1033
			if(params instanceof WMSDataParameters) {
1026
				this.setName(((WMSDataParameters)params).getURI());
1034
				this.setName(((WMSDataParameters)params).getURI().getPath());
1027 1035
			}
1028
			
1036

  
1029 1037
			if(params instanceof TileDataParameters) {
1030 1038
				DataParameters p = ((TileDataParameters) params).getDataParameters();
1031 1039
				if(p instanceof WMSDataParameters) {
1032
					this.setName(((WMSDataParameters) p).getURI());
1040
					this.setName(((WMSDataParameters) p).getURI().getPath());
1033 1041
				}
1034 1042
			}
1035 1043
		} catch (ValidateDataParametersException e) {
......
1040 1048
			throw new InitializeException(e);
1041 1049
		}
1042 1050
    }
1043
    
1051

  
1044 1052
	public WMSDataParameters getParameters() {
1045 1053
		return getWMSParameters(getDataStore().getParameters());
1046 1054
    }
1047
    
1055

  
1048 1056
    /**
1049 1057
     * Gets <code>WMSDataParameters</code>
1050 1058
     * @param parameters
......
1055 1063
    	if(parameters instanceof WMSDataParameters) {
1056 1064
			params = (WMSDataParameters) parameters;
1057 1065
		}
1058
		
1066

  
1059 1067
		if(parameters instanceof TileDataParameters) {
1060 1068
			DataParameters p = ((TileDataParameters) parameters).getDataParameters();
1061 1069
			if(p instanceof WMSDataParameters) {
......
1064 1072
		}
1065 1073
		return params;
1066 1074
    }
1067
    
1075

  
1068 1076
    /**
1069 1077
	 * Assigns the flag to delete this layer from the cache
1070 1078
	 * @param selected
......
1072 1080
	public void deleteCache(boolean deleteCache) {
1073 1081
		this.deleteCache = deleteCache;
1074 1082
	}
1075
    
1083

  
1076 1084
    /**
1077 1085
     * Sets the explorer
1078 1086
     * @param explorer
......
1081 1089
    	if(getDataStore() != null)
1082 1090
    		getDataStore().setExplorer(explorer);
1083 1091
    }
1084
    
1092

  
1085 1093
    /**
1086 1094
     * Gets the explorer
1087 1095
     * @return
......
1096 1104
		}
1097 1105
    	return null;
1098 1106
    }
1099
    
1107

  
1100 1108
	public FLayer cloneLayer() throws Exception {
1101 1109
		RasterDataStore  ds = dataStore.cloneDataStore();
1102 1110
		FLyrWMS newLayer = new FLyrWMS();
......
1104 1112
		newLayer.setOpenRasterStore(ds);
1105 1113
		//newLayer.firstLoad = firstLoad;
1106 1114
		newLayer.setExplorer(getExplorer());
1107
		
1115

  
1108 1116
		List<RasterFilter> filters = getRender().getFilterList().getStatusCloned();
1109 1117

  
1110 1118
		//Hacemos una copia de las bandas a renderizar
......
1124 1132
		if(dataStore.getNoDataValue().isDefined())
1125 1133
			newLayer.setNoDataTransparent(true);
1126 1134
		newLayer.enableOpen();
1127
		
1135

  
1128 1136
		return newLayer;
1129 1137
	}
1130
	
1138

  
1131 1139
	@Override
1132 1140
	public boolean isInside(Point2D p) {
1133 1141
		// Don't call the data store isInside method, as the data store

Also available in: Unified diff