Revision 2468

View differences:

org.gvsig.raster.wms_deprecated/tags/tagdate_11102013_11_26/org.gvsig.raster.wms/org.gvsig.raster.wms.app.wmsclient/buildNumber.properties
1
#maven.buildNumber.plugin properties file
2
#Wed May 15 12:25:34 CEST 2013
3
buildNumber=45
0 4

  
org.gvsig.raster.wms_deprecated/tags/tagdate_11102013_11_26/org.gvsig.raster.wms/org.gvsig.raster.wms.app.wmsclient/src/main/assembly/gvsig-plugin-package.xml
1
<assembly>
2
  <id>gvsig-plugin-package</id>
3
  <formats>
4
    <format>zip</format>
5
  </formats>
6
  <baseDirectory>${project.artifactId}</baseDirectory>
7
  <includeBaseDirectory>true</includeBaseDirectory>
8
  <files>
9
    <file>
10
      <source>target/${project.artifactId}-${project.version}.jar</source>
11
      <outputDirectory>lib</outputDirectory>
12
    </file>
13
    <file>
14
      <source>target/package.info</source>
15
    </file>
16
  </files>
17

  
18
  <fileSets>
19
    <fileSet>
20
      <directory>src/main/resources-plugin</directory>
21
      <outputDirectory>.</outputDirectory>
22
    </fileSet>
23
  </fileSets>
24

  
25

  
26
  <dependencySets>
27
    <dependencySet>
28
      <useProjectArtifact>false</useProjectArtifact>
29
	  <useTransitiveDependencies>false</useTransitiveDependencies>
30
      <outputDirectory>lib</outputDirectory>
31
      <includes> 
32
				<include>org.gvsig:org.gvsig.raster.wms.app.wmsclient:jar</include>
33
				<include>org.gvsig:org.gvsig.raster.wms.io:jar</include>
34
	  </includes>
35
	</dependencySet>
36
  </dependencySets>
37
</assembly>
0 38

  
org.gvsig.raster.wms_deprecated/tags/tagdate_11102013_11_26/org.gvsig.raster.wms/org.gvsig.raster.wms.app.wmsclient/src/main/java/org/gvsig/raster/wms/app/wmsclient/layer/ComposedLayerWMS.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
package org.gvsig.raster.wms.app.wmsclient.layer;
23

  
24
import java.awt.Graphics2D;
25
import java.awt.image.BufferedImage;
26
import java.util.Vector;
27

  
28
import org.gvsig.compat.print.PrintAttributes;
29
import org.gvsig.fmap.dal.exception.ReadException;
30
import org.gvsig.fmap.mapcontext.ViewPort;
31
import org.gvsig.fmap.mapcontext.layers.FLayer;
32
import org.gvsig.fmap.mapcontext.layers.operations.ComposedLayer;
33
import org.gvsig.raster.wms.io.RemoteWMSStyle;
34
import org.gvsig.tools.task.Cancellable;
35

  
36

  
37
/**
38
 * Group WMS layers to make a single request to the
39
 * server for all layers.
40
 *
41
 * It is posible only if almost all params are the same. For this
42
 * comparasion, ComposedLayerWMS uses the method
43
 * {@link org.gvsig.wms.fmap.layers.FLyrWMS#isComposedLayerCompatible(com.iver.cit.gvsig.fmap.layers.FLayer)}
44
 *
45
 *
46
 * @see com.iver.cit.gvsig.fmap.layers.layerOperations.ComposedLayer
47
 * @see org.gvsig.wms.fmap.layers.FLyrWMS
48
 */
49
public class ComposedLayerWMS extends ComposedLayer {
50
	private FLyrWMS layer=null;
51

  
52
	/* (non-Javadoc)
53
	 * @see com.iver.cit.gvsig.fmap.layers.layerOperations.ComposedLayer#canAdd(com.iver.cit.gvsig.fmap.layers.FLayer)
54
	 */
55
	public boolean canAdd(FLayer layer) {
56
		if (this.layer != null) {
57
			return this.layer.isComposedLayerCompatible(layer);
58
		}
59
		return false;
60
	}
61

  
62
	/* (non-Javadoc)
63
	 * @see com.iver.cit.gvsig.fmap.layers.layerOperations.ComposedLayer#doAdd(com.iver.cit.gvsig.fmap.layers.FLayer)
64
	 */
65
	public void doAdd(FLayer layer) throws Exception {
66
		FLyrWMS aLayer = (FLyrWMS)layer;
67
		if (this.layer == null) {
68
			this.layer = new FLyrWMS();
69
			//this.layer.setXMLEntity(aLayer.getXMLEntity());
70
			return;
71
		}
72
		this.layer.getParameters().setLayerQuery( this.layer.getParameters().getLayerQuery() + ","+ aLayer.getParameters().getLayerQuery());
73
		Vector<RemoteWMSStyle> aStyles = aLayer.getParameters().getStyles();
74

  
75
		if (aStyles != null) {
76
			Vector<RemoteWMSStyle> myStyles = this.layer.getParameters().getStyles();
77
			if (myStyles == null) {
78
				this.layer.getParameters().setStyles(aStyles);
79
			} else {
80
				myStyles.addAll(aStyles);
81
				this.layer.getParameters().setStyles(myStyles);
82
			}
83
		}
84

  
85
		//revisar el fullextend para ajustarlo a todas las capas
86
		this.layer.getFullEnvelope().add(aLayer.getFullEnvelope());
87

  
88
	}
89

  
90

  
91
	@Override
92
	protected void doDraw(BufferedImage image, Graphics2D g, ViewPort viewPort,
93
			Cancellable cancel, double scale)
94
			throws ReadException {
95
		this.layer.draw(image, g, viewPort, cancel, scale);
96

  
97
	}
98

  
99
	@Override
100
	protected void doPrint(Graphics2D g, ViewPort viewPort,
101
			Cancellable cancel,
102
			double scale,
103
			PrintAttributes properties) throws ReadException {
104
		this.layer.print(g, viewPort, cancel, scale, properties);
105

  
106
	}
107

  
108
}
0 109

  
org.gvsig.raster.wms_deprecated/tags/tagdate_11102013_11_26/org.gvsig.raster.wms/org.gvsig.raster.wms.app.wmsclient/src/main/java/org/gvsig/raster/wms/app/wmsclient/layer/DynObjectIteratorWMSInfo.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
package org.gvsig.raster.wms.app.wmsclient.layer;
23

  
24
import java.util.ArrayList;
25

  
26
import org.gvsig.fmap.dal.feature.Feature;
27
import org.gvsig.tools.dispose.DisposableIterator;
28
import org.gvsig.tools.dynobject.DynObject;
29
import org.gvsig.tools.dynobject.DynObjectSet;
30

  
31
/**
32
 * {@link DynObject} implementation to facade a iterator of a WMTSInfo
33
 * and allow to be used as a {@link DynObjectSet} iterator.
34
 * 
35
 * @author Nacho Brodin (nachobrodin@gmail.com)
36
 * @version $Id$
37
 * 
38
 */
39
public class DynObjectIteratorWMSInfo implements DisposableIterator {
40

  
41
    private ArrayList<Object> infoList = new ArrayList<Object>();
42
    private int               index    = -1;
43

  
44
    /**
45
     * Creates a new DynObjects iterator facade over a feature iterator.
46
     * Each WMTSInfo will be returned through a new or reused
47
     * {@link DynObjectWMTSInfo} which allows the {@link Feature} to be
48
     * used like a DynObject.
49
     * 
50
     * @param featureIterator
51
     *            to facade
52
     * @param featureFacade
53
     *            if not null this object will be reused as the facade for the
54
     *            Feature objects of the feature iterator
55
     */
56
    public DynObjectIteratorWMSInfo(Object info) {
57
        this.infoList.add(info);
58
        index = 0;
59
    }
60
    
61
    public void addObject(Object info) {
62
    	this.infoList.add(info);
63
    	if(index == -1)
64
    		index = 0;
65
    }
66

  
67
    public synchronized void dispose() {
68
    	this.infoList.clear();
69
    	index = -1;
70
    }
71

  
72
    public synchronized boolean hasNext() {
73
        return (infoList.size() == 0 || index >= infoList.size()) ? false : true;
74
    }
75

  
76
    public synchronized Object next() {
77
        Object o = infoList.get(index);
78
        index ++;
79
        return o;
80
    }
81

  
82
    public synchronized void remove() {
83
    	if(index < infoList.size() && index >= 0) {
84
    		index --;
85
    		infoList.remove(index);
86
    	}
87
    }
88
    
89
    public long getSize() {
90
        return infoList.size();
91
    }
92
}
0 93

  
org.gvsig.raster.wms_deprecated/tags/tagdate_11102013_11_26/org.gvsig.raster.wms/org.gvsig.raster.wms.app.wmsclient/src/main/java/org/gvsig/raster/wms/app/wmsclient/layer/DynObjectSetWMSInfo.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
package org.gvsig.raster.wms.app.wmsclient.layer;
23

  
24
import org.gvsig.fmap.dal.feature.FeatureSet;
25
import org.gvsig.tools.ToolsLocator;
26
import org.gvsig.tools.dispose.DisposableIterator;
27
import org.gvsig.tools.dynobject.DynClass;
28
import org.gvsig.tools.dynobject.DynObject;
29
import org.gvsig.tools.dynobject.DynObjectManager;
30
import org.gvsig.tools.dynobject.DynObjectSet;
31
import org.gvsig.tools.exception.BaseException;
32
import org.gvsig.tools.observer.Observable;
33
import org.gvsig.tools.observer.Observer;
34
import org.gvsig.tools.observer.impl.BaseWeakReferencingObservable;
35
import org.gvsig.tools.visitor.Visitor;
36

  
37
/**
38
 * {@link DynObject} implementation to facade of a {@link FeatureSet} and allow
39
 * to be used as a {@link DynObjectSet}.
40
 * 
41
 * @author Nacho Brodin (nachobrodin@gmail.com)
42
 * @version $Id$
43
 */
44
public class DynObjectSetWMSInfo extends BaseWeakReferencingObservable
45
    implements DynObjectSet, Observer {
46
	//public static final int             TYPE_TEXT = 0;
47
	//public static final int             TYPE_HTML = 1;
48
	//public static final int             TYPE_XML  = 2;
49
	private DynObjectIteratorWMSInfo    ite       = null;
50
	private DynObject                   dynObject = null;
51
	private String                      type      = "text/plain";
52
	
53
	public static void registerDynClass() {
54
		DynObjectManager manager = ToolsLocator.getDynObjectManager();
55
    	DynClass dynClass = manager.add("WMSInfoByPoint", "WMS InfoByPoint");
56
    	dynClass.setNamespace("InfoByPoint");
57
    	dynClass.addDynFieldString("info");
58
	}
59
	
60
    /**
61
     * Creates a new facade over a given info, with fast dynobject
62
     * iteration.
63
     */
64
    public DynObjectSetWMSInfo(String txt, String type) {
65
    	DynObjectManager manager = ToolsLocator.getDynObjectManager();
66
    	dynObject = manager.createDynObject("WMSInfoByPoint");
67
    	dynObject.setDynValue("info", txt);
68
    	ite = new DynObjectIteratorWMSInfo(dynObject);
69
    	this.type = type;
70
    	/*if(type == TYPE_HTML)
71
    		this.type = "text/html";
72
    	if(type == TYPE_XML)
73
    		this.type = "text/xml";
74
    	if(type == TYPE_TEXT)
75
    		this.type = "text/plain";*/
76
    }
77

  
78
    public String getTypeInfo() {
79
    	return this.type;
80
    }
81
    
82
    public String getInfoElement() {
83
    	return (String)dynObject.getDynValue("info");
84
    }
85
    
86
    public void dispose() {
87

  
88
    }
89

  
90
    public void accept(final Visitor visitor, long firstValueIndex) throws BaseException {
91
    	while(ite.hasNext()) {
92
    		visitor.visit(ite.next());
93
    	}
94
    }
95

  
96
    public void accept(final Visitor visitor) throws BaseException {
97
    	while(ite.hasNext()) {
98
    		visitor.visit(ite.next());
99
    	}
100
    }
101

  
102
    public long getSize() throws BaseException {
103
       return ite.getSize();
104
    }
105

  
106
    public DisposableIterator iterator(long index) throws BaseException {
107
        return iterator();
108
    }
109

  
110
    public DisposableIterator iterator() throws BaseException {
111
    	return ite;
112
    }
113

  
114
    public boolean isEmpty() throws BaseException {
115
    	return (getSize() == 0);
116
    }
117

  
118
    public boolean isDeleteEnabled() {
119
    	return true;
120
    }
121

  
122
    public void delete(DynObject dynObject) throws BaseException {
123

  
124
    }
125

  
126
    public boolean isUpdateEnabled() {
127
    	return true;
128
    }
129

  
130
    public void update(DynObject dynObject) throws BaseException {
131
    	System.out.println();
132
    }
133

  
134
    public void update(Observable observable, Object notification) {
135
    	System.out.println();
136
    }
137
}
0 138

  
org.gvsig.raster.wms_deprecated/tags/tagdate_11102013_11_26/org.gvsig.raster.wms/org.gvsig.raster.wms.app.wmsclient/src/main/java/org/gvsig/raster/wms/app/wmsclient/layer/FLyrWMS.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
package org.gvsig.raster.wms.app.wmsclient.layer;
24

  
25
import java.awt.Dimension;
26
import java.awt.Graphics2D;
27
import java.awt.Point;
28
import java.awt.Rectangle;
29
import java.awt.geom.AffineTransform;
30
import java.awt.geom.NoninvertibleTransformException;
31
import java.awt.geom.Point2D;
32
import java.awt.geom.Rectangle2D;
33
import java.awt.image.BufferedImage;
34
import java.lang.ref.WeakReference;
35
import java.util.ArrayList;
36
import java.util.HashMap;
37
import java.util.Iterator;
38
import java.util.List;
39
import java.util.Vector;
40
import java.util.prefs.Preferences;
41

  
42
import javax.print.attribute.PrintRequestAttributeSet;
43
import javax.swing.JOptionPane;
44

  
45
import org.cresques.cts.ICoordTrans;
46
import org.cresques.cts.IProjection;
47
import org.gvsig.andami.PluginServices;
48
import org.gvsig.fmap.dal.DALLocator;
49
import org.gvsig.fmap.dal.DataManager;
50
import org.gvsig.fmap.dal.DataParameters;
51
import org.gvsig.fmap.dal.DataStore;
52
import org.gvsig.fmap.dal.DataStoreParameters;
53
import org.gvsig.fmap.dal.coverage.RasterLocator;
54
import org.gvsig.fmap.dal.coverage.RasterManager;
55
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
56
import org.gvsig.fmap.dal.coverage.datastruct.ViewPortData;
57
import org.gvsig.fmap.dal.coverage.exception.FilePaletteException;
58
import org.gvsig.fmap.dal.coverage.exception.InfoByPointException;
59
import org.gvsig.fmap.dal.coverage.exception.InvalidSetViewException;
60
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
61
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
62
import org.gvsig.fmap.dal.coverage.exception.RemoteServiceException;
63
import org.gvsig.fmap.dal.coverage.grid.RasterFilter;
64
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
65
import org.gvsig.fmap.dal.coverage.store.parameter.RasterDataParameters;
66
import org.gvsig.fmap.dal.coverage.store.parameter.RemoteStoreParameters;
67
import org.gvsig.fmap.dal.coverage.store.parameter.TileDataParameters;
68
import org.gvsig.fmap.dal.exception.DataException;
69
import org.gvsig.fmap.dal.exception.InitializeException;
70
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
71
import org.gvsig.fmap.dal.exception.ReadException;
72
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
73
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
74
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
75
import org.gvsig.fmap.geom.GeometryLocator;
76
import org.gvsig.fmap.geom.GeometryManager;
77
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
78
import org.gvsig.fmap.geom.primitive.Envelope;
79
import org.gvsig.fmap.mapcontext.ViewPort;
80
import org.gvsig.fmap.mapcontext.exceptions.LoadLayerException;
81
import org.gvsig.fmap.mapcontext.exceptions.UnsupportedVersionLayerException;
82
import org.gvsig.fmap.mapcontext.layers.FLayer;
83
import org.gvsig.fmap.mapcontext.layers.FLyrDefault;
84
import org.gvsig.fmap.mapcontext.layers.Tiling;
85
import org.gvsig.fmap.mapcontext.layers.operations.ComposedLayer;
86
import org.gvsig.fmap.mapcontext.rendering.legend.ILegend;
87
import org.gvsig.gui.beans.Messages;
88
import org.gvsig.raster.fmap.layers.DefaultFLyrRaster;
89
import org.gvsig.raster.fmap.layers.IRasterLayerActions;
90
import org.gvsig.raster.fmap.layers.NotAvailableStateException;
91
import org.gvsig.raster.fmap.legend.ImageLegend;
92
import org.gvsig.raster.util.CancelTaskImpl;
93
import org.gvsig.raster.wms.app.wmsclient.wmc.WebMapContextTags;
94
import org.gvsig.raster.wms.app.wmsclient.wmc.XmlBuilder;
95
import org.gvsig.raster.wms.io.RemoteWMSStyle;
96
import org.gvsig.raster.wms.io.WMSDataParameters;
97
import org.gvsig.raster.wms.io.WMSLayerNode;
98
import org.gvsig.raster.wms.io.WMSServerExplorer;
99
import org.gvsig.raster.wms.io.WMSServerExplorerParameters;
100
import org.gvsig.tools.ToolsLocator;
101
import org.gvsig.tools.dynobject.DynObjectSet;
102
import org.gvsig.tools.dynobject.DynStruct;
103
import org.gvsig.tools.persistence.PersistenceManager;
104
import org.gvsig.tools.persistence.PersistentState;
105
import org.gvsig.tools.persistence.exception.PersistenceException;
106
import org.gvsig.tools.task.Cancellable;
107
import org.gvsig.tools.task.SimpleTaskStatus;
108
import org.gvsig.tools.task.TaskStatusManager;
109
import org.slf4j.Logger;
110
import org.slf4j.LoggerFactory;
111

  
112

  
113

  
114
/**
115
 * FMap's WMS Layer class.
116
 *
117
 * Las capas WMS son tileadas para descargarlas del servidor. Esto quiere decir que
118
 * est?n formadas por multiples ficheros raster. Por esto la fuente de datos raster (IRasterDatasource)
119
 * de la capa FLyrWMS es un objeto de tipo CompositeDataset. Este objeto est? compuesto por un array
120
 * bidimensional de MultiRasterDataset. Cada uno de los MultiRasterDataset corresponde con un tile
121
 * salvado en disco. Estos MultiRasterDataset se crean cada vez que se repinta ya que en WMS a cada
122
 * zoom varian los ficheros fuente. La secuencia de creaci?n de un CompositeDataset ser?a la siguiente:
123
 * <UL>
124
 * <LI>Se hace una petici?n de dibujado por parte del usuario llamando al m?todo draw de FLyrWMS</LI>
125
 * <LI>Se tilea la petici?n</LI>
126
 * <LI>Cada tile se dibuja abriendo una FLyerRaster para ese tile</LI>
127
 * <LI>Si es el primer dibujado se guarda una referencia en la capa WMS a las propiedades de renderizado, orden de bandas,
128
 * transparencia, filtros aplicados, ...</LI>
129
 * <LI>Si no es el primer dibujado se asignan las propiedades de renderizado cuya referencia se guarda en la capa WMS</LI>
130
 * <LI>Se guarda el MultiRasterDataset de cada tile</LI>
131
 * <LI>Al acabar todos los tiles creamos un CompositeDataset con los MultiRasterDataset de todos los tiles</LI>
132
 * <LI>Asignamos a la capa la referencia de las propiedades de renderizado que tenemos almacenadas. De esta forma si hay
133
 * alguna modificaci?n desde el cuadro de propiedades ser? efectiva sobre los tiles que se dibujan.</LI>
134
 * </UL>
135
 *
136
 *
137
 * @author Jaume Dominguez Faus
138
 *
139
 */
140
@SuppressWarnings("deprecation")
141
public class FLyrWMS extends DefaultFLyrRaster {
142
	public static final String           PERSISTENT_NAME           = "FLyrWMS_Persistent";
143
	public static final String           PERSISTENT_DESCRIPTION    = "FLyrWMS Persistent Definition";
144
	private static final int             MAX_RETRY_TIMES           = 5;
145
	
146
	private static final GeometryManager geomManager               = GeometryLocator.getGeometryManager();
147
	private static final Logger          logger                    = LoggerFactory.getLogger(FLyrWMS.class);
148
	private boolean 					 isPrinting                = false;
149
	private boolean 					 mustTileDraw              = false;
150
	private boolean 					 mustTilePrint             = true;
151
	private final int 					 maxTileDrawWidth          = 1023;
152
	private final int 					 maxTileDrawHeight         = 1023;
153
	private final int 					 maxTilePrintWidth         = 1023;
154
	private final int 					 maxTilePrintHeight        = 1023;
155
	private List<WeakReference<Thread>>	 disableUpdateDrawVersion;
156
	private Envelope					 fullEnvelope              = null;
157
	private int                          callCount;
158
	private boolean						 firstLoad                 = false;
159
	private RasterManager                rManager                  = RasterLocator.getManager();
160
	private DataStoreParameters          params                    = null;
161
	private WMSServerExplorer            explorer                  = null;
162
	private boolean                      deleteCache               = false;
163

  
164
	public FLyrWMS() {
165
		super();
166
		this.updateDrawVersion();
167
		try {
168
			enableAwake();
169
		} catch (NotAvailableStateException e) {
170
			logger.error("Fallo el estado de open. Closed=" + isClosed() + " Awake=" + isAwake(), this, e);
171
		}
172
	}
173
	
174
   public FLyrWMS(DataStoreParameters dataStoreParameters) throws Exception {
175
        this();
176
        //Create the explorer and connect
177
        DataManager dataManager = DALLocator.getDataManager();
178
        WMSServerExplorerParameters explorerParams = (WMSServerExplorerParameters) 
179
               dataManager.createServerExplorerParameters(WMSServerExplorer.NAME);
180
        explorerParams.setHost((String)dataStoreParameters.getDynValue("uri"));        
181
        WMSServerExplorer wmsServerExplorer = 
182
            (WMSServerExplorer) dataManager.openServerExplorer(WMSServerExplorer.NAME, explorerParams);
183
        wmsServerExplorer.connect(null, ((RemoteStoreParameters)dataStoreParameters).isDeletingCache());
184
        
185
        //Set the parameters
186
        setParameters((WMSDataParameters)dataStoreParameters);
187
        setExplorer(wmsServerExplorer);
188
    }
189
	
190
	public static DataStore createDataStore(String host, IProjection srs) throws InitializeException {
191
		DataManagerProviderServices dataman = (DataManagerProviderServices) DALLocator.getDataManager();
192
		RasterDataParameters params = null;
193
		try {
194
			params = (RasterDataParameters)dataman.createServerExplorerParameters(WMSServerExplorer.NAME);
195
		} catch (InitializeException e) {
196
			return null;
197
		} catch (ProviderNotRegisteredException e) {
198
			return null;
199
		}
200
		params.setURI(host);
201
		params.setSRS(srs);
202
		
203
		try {
204
			return dataman.openStore(params.getDataStoreName(), params);
205
		} catch (ValidateDataParametersException e) {
206
			throw new InitializeException(e);
207
		} catch (ProviderNotRegisteredException e) {
208
			throw new InitializeException(e);
209
		}
210
	}
211

  
212
	/*
213
	 * (non-Javadoc)
214
	 * @see org.gvsig.fmap.mapcontext.layers.operations.SingleLayer#setDataStore(org.gvsig.fmap.dal.DataStore)
215
	 */
216
	public void setDataStore(DataStore dataStore) throws LoadLayerException {
217
		this.dataStore = (RasterDataStore) dataStore;
218
		try {
219
			this.dataStore.isOpen();
220
			if(!isOpen())
221
				enableOpen();
222
		} catch (NotAvailableStateException e) {
223
			logger.error("Fallo el estado de open. Closed=" + isClosed() + " Awake=" + isAwake(), this, e);
224
		}
225
		setProjection(this.dataStore.getProjection());
226
	}
227

  
228
	/**
229
	 * It choose the best format to load different maps if the server
230
	 * supports it. This format could be png, because it supports
231
	 * transparency.
232
	 * @param formats
233
	 * Arraywith all the formats supported by the server
234
	 * @return
235
	 */
236
	@SuppressWarnings("unused")
237
	private String getGreatFormat(Vector<String> formats){
238
		for (int i = 0 ; i < formats.size() ; i++){
239
			String format = (String) formats.get(i);
240
			if (format.equals("image/jpg")){
241
				return format;
242
			}
243
			if (format.equals("image/jpeg")){
244
				return format;
245
			}
246
		}
247
		return (String)formats.get(0);
248
	}
249

  
250
	/*
251
	 * (non-Javadoc)
252
	 * @see org.gvsig.raster.fmap.layers.DefaultFLyrRaster#loadFromState(org.gvsig.tools.persistence.PersistentState)
253
	 */
254
	@Override
255
	public void loadFromState(PersistentState state)
256
	throws PersistenceException {
257
		String host = state.getString("host");
258
		getParameters();
259
		((WMSServerExplorerParameters)explorer.getParameters()).setHost(host);
260

  
261
		if(!explorer.isHostReachable()) {
262
			loadLayer = false;
263
			super.loadFromState(state);
264
			return;
265
		}
266

  
267
		try {
268
			explorer.connect(new CancelTaskImpl(), true);
269
		} catch (Exception e) {
270
			loadLayer = false;
271
			super.loadFromState(state);
272
			return;
273
		}
274
		
275
		loadLayer = true;
276

  
277
		super.loadFromState(state);
278
		params = getDataStore().getParameters();
279
		this.fullEnvelope = (Envelope) state.get("fullEnvelope");
280
		getParameters().setName((String)state.get("name"));
281
		//En servicios WMS nunca se carga con tabla de color ya que esta cambia para cada petici?n 
282
		//y adem?s no puede ser cambiada por el usuario
283
		this.colorTableLoadedFromProject = null;
284
	}
285

  
286
	/*
287
	 * (non-Javadoc)
288
	 * @see org.gvsig.raster.fmap.layers.DefaultFLyrRaster#saveToState(org.gvsig.tools.persistence.PersistentState)
289
	 */
290
	@Override
291
	public void saveToState(PersistentState state) throws PersistenceException {
292
		super.saveToState(state);
293
		state.set("fullEnvelope", this.fullEnvelope);
294
		state.set("host", getParameters().getURI());
295
		state.set("name", getName());
296
	}
297

  
298
	public static void registerPersistent() {
299
		PersistenceManager manager = ToolsLocator.getPersistenceManager();
300
		DynStruct definition = manager.getDefinition(PERSISTENT_NAME);
301
		if( definition == null ) {
302
			if (manager.getDefinition(FLyrDefault.class) == null) {
303
				FLyrDefault.registerPersistent();
304
			}
305

  
306
			definition = manager.addDefinition(
307
					FLyrWMS.class,
308
					PERSISTENT_NAME,
309
					PERSISTENT_DESCRIPTION,
310
					null, 
311
					null
312
			);
313
			
314
			definition.extend(PersistenceManager.PERSISTENCE_NAMESPACE, "FLyrDefault");
315
		}
316

  
317
		DefaultFLyrRaster.registerPersistence(definition);
318
		definition.addDynFieldObject("fullEnvelope").setClassOfValue(Envelope.class).setMandatory(false);
319
		definition.addDynFieldString("host").setMandatory(false);
320
		definition.addDynFieldString("name").setMandatory(false);
321
	}
322
	
323
	/*
324
	 * (non-Javadoc)
325
	 * @see org.gvsig.raster.fmap.layers.DefaultFLyrRaster#draw(java.awt.image.BufferedImage, java.awt.Graphics2D, org.gvsig.fmap.mapcontext.ViewPort, org.gvsig.tools.task.Cancellable, double)
326
	 */
327
	public void draw(BufferedImage image, Graphics2D g, ViewPort viewPort,
328
			Cancellable cancel, double scale) throws ReadException {
329
		TaskStatusManager manager = ToolsLocator.getTaskStatusManager();
330
		SimpleTaskStatus taskStatus = new RasterTaskStatus("Drawing " + getName() + "...", cancel);
331
		manager.add(taskStatus);
332
		taskStatus.setAutoremove(true);
333
		
334
		if(!firstLoad) {
335
			try {
336
				initFilters();
337
			} catch (FilePaletteException e) {
338
				logger.error(e.getMessage(), this, e);
339
			}
340
			firstLoad = true;
341
		}
342
		
343
		callCount = 0;  
344
		
345
		enableStopped();
346
		
347
		if(recalcLevel) {
348
			double pixelSize = viewPort.getEnvelope().getLength(0) / (double)viewPort.getImageWidth();
349
			zoomLevel = dataStore.getNearestLevel(pixelSize);
350
		}
351
		recalcLevel = true;
352

  
353
		if (isWithinScale(scale)) {
354

  
355
			if(mustTileDraw) {
356
				Point2D p = viewPort.getOffset();
357
				Rectangle r = new Rectangle((int) p.getX(), (int) p.getY(), viewPort.getImageWidth(), viewPort.getImageHeight());
358
				Tiling tiles = new Tiling(maxTileDrawWidth, maxTileDrawHeight, r);
359
				tiles.setAffineTransform((AffineTransform) viewPort.getAffineTransform().clone());
360

  
361
				for (int tileNr = 0; tileNr < tiles.getNumTiles(); tileNr++) {
362
					// drawing part
363
					try {
364
						ViewPort vp = tiles.getTileViewPort(viewPort, tileNr);
365
						drawTile(g, vp, taskStatus, scale);
366
					} catch (LoadLayerException e) {
367
						throw new ReadException(e.getMessage(), e);
368
					} catch (NoninvertibleTransformException e) {
369
						throw new ReadException(e.getMessage(), e);
370
					}
371
				}
372
			} else {
373
				try {
374
					drawTile(g, viewPort, taskStatus, scale);
375
				} catch (LoadLayerException e) {
376
					setAvailable(false);
377
					logger.error("Server error:" + e.getMessage(), e);
378
				}
379
			}
380
		}
381
		disableStopped();
382
	}
383
	
384
		
385
	/**
386
	 * This is the method used to draw a tile in a WMS mosaic layer.
387
	 * @throws LoadLayerException
388
	 * @throws ReadDriverException
389
	 * @return true when a tile has been painted
390
	 */
391
	private void drawTile(Graphics2D g, ViewPort vp, SimpleTaskStatus taskStatus, double scale) throws LoadLayerException, ReadException {
392
		callCount++;
393
	
394
		// Compute the query geometry
395
		// 1. Check if it is within borders
396
		Envelope envelope = getFullEnvelope();
397
		Envelope vpEnv = vp.getAdjustedExtent();
398
		if (!vpEnv.intersects(envelope)) {
399
			return;
400
		}
401

  
402
		// 2. Compute extent to be requested.
403
		Rectangle2D bBox = new Rectangle2D.Double();
404
		Rectangle2D.intersect(getRectable2DFromEnvelope(vpEnv),
405
				getRectable2DFromEnvelope(envelope), bBox);
406

  
407
		// 3. Compute size in pixels
408
		double scalex = vp.getAffineTransform().getScaleX();
409
		double scaley = vp.getAffineTransform().getScaleY();
410
		int wImg = (int) Math.ceil(Math.abs(bBox.getWidth() * scalex) + 1);
411
		int hImg = (int) Math.ceil(Math.abs(bBox.getHeight() * scaley) + 1);
412

  
413
		Dimension sz = new Dimension(wImg, hImg);
414

  
415
		if ((wImg <= 0) || (hImg <= 0)) {
416
			return;
417
		}
418

  
419
		try {
420
			
421
			Rectangle2D extent = new Rectangle2D.Double();
422
			Rectangle2D.Double vpExtent = this.getRectable2DFromEnvelope(vpEnv);
423
			Rectangle2D.intersect(vpExtent, bBox, extent);
424
			
425
			Extent ex = rManager.getDataStructFactory().createExtent(
426
					vp.getAdjustedEnvelope().getMinimum(0), 
427
					vp.getAdjustedEnvelope().getMaximum(1), 
428
					vp.getAdjustedEnvelope().getMaximum(0), 
429
					vp.getAdjustedEnvelope().getMinimum(1));
430
			ViewPortData vpData = rManager.getDataStructFactory().createViewPortData(vp.getProjection(), ex, sz );
431
			vpData.setMat(vp.getAffineTransform());
432

  
433
			try {
434
				getParameters().setExtent(bBox);
435
				if(getParameters().isSizeFixed()) {
436
					getParameters().setWidth((int)getParameters().getFixedSize().getWidth());
437
					getParameters().setHeight((int)getParameters().getFixedSize().getHeight());
438
				} else {
439
					getParameters().setWidth(wImg);
440
					getParameters().setHeight(hImg);
441
				}
442
				
443
				if(params instanceof WMSDataParameters) {
444
					getRender().draw(g, vpData, taskStatus);
445
				} else {
446
					Envelope adjustedExtent = vp.getAdjustedExtent();
447
					Extent e = rManager.getDataStructFactory().createExtent(adjustedExtent.getLowerCorner().getX(),
448
							adjustedExtent.getUpperCorner().getY(), adjustedExtent.getUpperCorner().getX(),
449
							adjustedExtent.getLowerCorner().getY());
450
					ViewPortData vp2 = rManager.getDataStructFactory().createViewPortData(vp.getProjection(), e, vp.getImageSize() );
451
					vp2.setMat(vp.getAffineTransform());
452
					getParameters().setExtent(ex.toRectangle2D());
453
					getRender().drawTiledService(g, vp2, vp.getImageSize(), taskStatus);
454
				}
455
				//this.updateDrawVersion();
456
			} catch (RasterDriverException e) {
457
				setAvailable(false);
458
				JOptionPane.showMessageDialog(null, "Problems drawing this layer:" + e.getMessage(), Messages.getText("Error"), JOptionPane.ERROR_MESSAGE);
459
				logger.info("Problems drawing this layer:" + e.getMessage(), e);
460
			} catch (InvalidSetViewException e) {
461
				throw new RemoteServiceException("Problems drawing this layer: " + e.getMessage(), e);
462
			} catch (ProcessInterruptedException e) {
463
			} finally {
464
				taskStatus.terminate();				
465
			}
466

  
467
		} catch (RemoteServiceException e) {
468
			if (!taskStatus.isCancellationRequested()) {
469
				if (callCount < MAX_RETRY_TIMES) {
470
					logger.warn("\n[ FLyrWMS.drawFixedSize() ]  Failed in trying " + callCount + "/" + MAX_RETRY_TIMES + ")\n"); // mess code
471
					drawTile(g, vp, taskStatus, scale);
472
				} else {
473
					if (!isPrinting) {
474
						this.setVisible(false);
475
					}
476
					logger.error("Server error:" + e.getMessage(), e);
477
				}
478
			}
479
		}
480
		callCount--;
481
		return;
482
	}
483

  
484
	/**
485
	 * @see com.iver.cit.gvsig.fmap.layers.FLayer#print(java.awt.Graphics2D,
486
	 * 		com.iver.cit.gvsig.fmap.ViewPort,
487
	 * 		com.iver.cit.gvsig.fmap.operations.Cancellable)
488
	 */
489
	public void print(Graphics2D g, ViewPort viewPort, Cancellable cancel, double scale, PrintRequestAttributeSet properties)
490
	throws ReadException {
491
		TaskStatusManager manager = ToolsLocator.getTaskStatusManager();
492
		SimpleTaskStatus taskStatus = new RasterTaskStatus("Printing " + getName() + "...", cancel);
493
		manager.add(taskStatus);
494
		taskStatus.setAutoremove(true);
495

  
496
		if (isVisible() && isWithinScale(scale)){
497
			isPrinting = true;
498
			if (!mustTilePrint) {
499
				draw(null, g, viewPort, cancel,scale);
500
			} else {
501
				Tiling tiles = new Tiling(maxTilePrintWidth, maxTilePrintHeight, g.getClipBounds());
502
				tiles.setAffineTransform((AffineTransform) viewPort.getAffineTransform().clone());
503
				for (int tileNr = 0; tileNr < tiles.getNumTiles(); tileNr++) {
504
					// Parte que dibuja
505
					try {
506
						ViewPort vp = tiles.getTileViewPort(viewPort, tileNr);
507
						drawTile(g, vp, taskStatus, scale);
508
					} catch (NoninvertibleTransformException e) {
509
						throw new ReadException(e.getMessage(), e);
510
					} catch (LoadLayerException e) {
511
						throw new ReadException(e.getMessage(), e);
512
					}
513
				}
514
			}
515
			isPrinting = false;
516
		}
517
		taskStatus.terminate();
518
	}
519

  
520
	public void _print(Graphics2D g, ViewPort viewPort, Cancellable cancel,
521
			double scale) throws ReadException {
522
		draw(null, g, viewPort, cancel,scale);
523
	}
524

  
525
	/**
526
	 * Inserta la extensi?n total de la capa.
527
	 *
528
	 * @param fullExtent
529
	 *            Rectangulo.
530
	 */
531
	public void setFullExtent(Rectangle2D fullExtent) {
532
		this.setFullEnvelope(this.getEnvelopeFromRectable2D(fullExtent));
533
	}
534

  
535
	/**
536
	 * Inserta la extensi๏ฟฝn total de la capa en la proyeccion original.
537
	 *
538
	 * @param fullExtent
539
	 *            Rect๏ฟฝngulo.
540
	 */
541
	public void setFullEnvelope(Envelope envelope) {
542
		Envelope cur = this.getFullEnvelope();
543
		if (cur == envelope) {
544
			return;
545
		}
546
		if (cur != null && cur.equals(envelope)) {
547
			return;
548
		}
549

  
550
		this.fullEnvelope = envelope;
551
		this.updateDrawVersion();
552
	}
553

  
554
	public HashMap<String, Object> getProperties() {
555
		HashMap<String, Object> info = new HashMap<String, Object>();
556
		String[] layerNames = getParameters().getLayerQuery().split(",");
557
		Vector<WMSLayerNode> layers = new Vector<WMSLayerNode>(layerNames.length);
558
		try {
559
			//explorer.connect(null);
560
			for (int i = 0; i < layerNames.length; i++) {
561
				layers.add(i, explorer.getLayer(layerNames[i]));
562
			}
563
			info.put("name", getName());
564
			info.put("selectedLayers", layers);
565
			info.put("host", getParameters().getURI());
566
			info.put("srs", getParameters().getSRSCode());
567
			info.put("format", getParameters().getFormat());
568
			info.put("wmsTransparency", new Boolean(getParameters().isWmsTransparent()));
569
			info.put("styles", getParameters().getStyles());
570
			info.put("dimensions", getParameters().getDimensions());
571
			info.put("fixedSize", getParameters().getFixedSize());
572
			return info;
573
		} /*catch (WMSException e) {
574
			JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(), PluginServices.getText(null, "connect_error"));
575
		}*/ catch (Exception e) {
576
			e.printStackTrace();
577
		}
578
		return null;
579
	}
580

  
581
	/**
582
	 * Creates the part of a OGC's MapContext document that would describe this
583
	 * layer(s).
584
	 * @param version, The desired version of the resulting document. (1.1.0)
585
	 * @return String containing the xml.
586
	 * @throws UnsupportedVersionLayerException
587
	 */
588
	@SuppressWarnings("unchecked")
589
	public String toMapContext(String mapContextVersion) {
590
		XmlBuilder xml = new XmlBuilder();
591
		
592
		String query = getParameters().getLayerQuery();
593
		String[] layerNames = query.split(",");
594
		String[] styleNames = (String[]) getParameters().getStyles().toArray(new String[0]);
595
		for (int i = 0; i < layerNames.length; i++) {
596
			WMSLayerNode layer = explorer.getLayer(layerNames[i]);
597
			HashMap xmlAttrs = new HashMap();
598

  
599
			// <Layer>
600
			xmlAttrs.put(WebMapContextTags.HIDDEN, !isVisible() + "");
601
			xmlAttrs.put(WebMapContextTags.QUERYABLE, explorer.isQueryable() + "");
602
			xml.openTag(WebMapContextTags.LAYER, xmlAttrs);
603
			xmlAttrs.clear();
604
			if (mapContextVersion.equals("1.1.0") || mapContextVersion.equals("1.0.0")) {
605
				// <Server>
606
				xmlAttrs.put(WebMapContextTags.SERVICE, WebMapContextTags.WMS);
607
				xmlAttrs.put(WebMapContextTags.VERSION, explorer.getVersion());
608
				xmlAttrs.put(WebMapContextTags.SERVER_TITLE, explorer.getServiceTitle());
609
				xml.openTag(WebMapContextTags.SERVER, xmlAttrs);
610
				xmlAttrs.clear();
611

  
612
				// <OnlineResource>
613
				xmlAttrs.put(WebMapContextTags.XLINK_TYPE, "simple");
614
				xmlAttrs.put(WebMapContextTags.XLINK_HREF, getParameters().getURI().toString());
615
				xml.writeTag(WebMapContextTags.ONLINE_RESOURCE, xmlAttrs);
616
				xmlAttrs.clear();
617
				// </OnlineResource>
618

  
619
				xml.closeTag();
620
				// </Server>
621

  
622
				// <Name>
623
				xml.writeTag(WebMapContextTags.NAME, layer.getName().trim());
624
				// </Name>
625

  
626
				// <Title>
627
				xml.writeTag(WebMapContextTags.TITLE, layer.getTitle().trim());
628
				//?xml.writeTag(WebMapContextTags.TITLE, getName().trim());
629
				// </Title>
630

  
631
				// <Abstract>
632
				if (layer.getAbstract() != null) {
633
					xml.writeTag(WebMapContextTags.ABSTRACT, layer.getAbstract());
634
					// </Abstract>
635
				}
636

  
637
				// <SRS> (a list of available SRS for the enclosing layer)
638
				String[] strings = (String[]) layer.getAllSrs().toArray(new String[0]);
639
				String mySRS = strings[0];
640
				for (int j = 1; j < strings.length; j++) {
641
					mySRS += ","+strings[j];
642
				}
643
				xml.writeTag(WebMapContextTags.SRS, mySRS);
644
				// </SRS>
645

  
646
				// <FormatList>
647
				xml.openTag(WebMapContextTags.FORMAT_LIST);
648
				strings = explorer.getFormats();
649
				for (int j = 0; j < strings.length; j++) {
650
					// <Format>
651
					String str = strings[j].trim();
652
					if (str.equals(getParameters().getFormat())) {
653
						xml.writeTag(WebMapContextTags.FORMAT, str, WebMapContextTags.CURRENT, "1");
654
					} else {
655
						xml.writeTag(WebMapContextTags.FORMAT, str);
656
						// </Format>
657
					}
658
				}
659
				xml.closeTag();
660
				// </FormatList>
661

  
662
				// <StyleList>
663
				xml.openTag(WebMapContextTags.STYLE_LIST);
664

  
665
				if (layer.getStyles().size() > 0) {
666
					for (int j = 0; j < layer.getStyles().size(); j++) {
667
						// <Style>
668
						RemoteWMSStyle st = layer.getStyles().get(j);
669
						if (st.getName().equals(styleNames[i])) {
670
							xmlAttrs.put(WebMapContextTags.CURRENT, "1");
671
						}
672
						xml.openTag(WebMapContextTags.STYLE, xmlAttrs);
673
						xmlAttrs.clear();
674

  
675
						// <Name>
676
						xml.writeTag(WebMapContextTags.NAME, st.getName());
677
						// </Name>
678

  
679
						// <Title>
680
						xml.writeTag(WebMapContextTags.TITLE, st.getTitle());
681
						// </Title>
682

  
683
						// <LegendURL width="180" format="image/gif" height="50">
684
						// <OnlineResource xlink:type="simple" xlink:href="http://globe.digitalearth.gov/globe/en/icons/colorbars/NATIONAL.gif"/>
685
						// </OnlineResource>
686
						// </LegendURL>
687
						xml.closeTag();
688
						// </Style>
689

  
690
					}
691

  
692
				} else {
693
					// Create fake style (for compatibility issues)
694
					xmlAttrs.put(WebMapContextTags.CURRENT, "1");
695
					// <Style>
696
					xml.openTag(WebMapContextTags.STYLE, xmlAttrs);
697
					xmlAttrs.clear();
698
					// <Name>
699
					xml.writeTag(WebMapContextTags.NAME, "default");
700
					// </Name>
701

  
702
					// <Title>
703
					xml.writeTag(WebMapContextTags.TITLE, "default");
704
					xml.closeTag();
705
				}
706
				// </StyleList>
707
				xml.closeTag();
708
				if (mapContextVersion.compareTo("1.0.0") > 0) {
709
					// <DimensionList>
710
					xml.openTag(WebMapContextTags.DIMENSION_LIST);
711
					// <Dimension>
712
					// </Dimension>
713
					xml.closeTag();
714
					// </DimensionList>
715
				}
716
			} else {
717
				xml.writeTag("ERROR", PluginServices.getText(this, "unsupported_map_context_version"));
718
			}
719
			// </Layer>
720
			xml.closeTag();
721
		}
722
		return xml.getXML();
723
	}
724

  
725
	public String getTocImageIcon() {
726
		return "icon-layer-wms";
727
	}
728

  
729
	/*
730
	 *  (non-Javadoc)
731
	 * @see com.iver.cit.gvsig.fmap.layers.RasterOperations#getTileSize()
732
	 */
733
	public int[] getTileSize() {
734
		int[] size = {maxTileDrawWidth, maxTileDrawHeight};
735
		return size;
736
	}
737

  
738
	/*
739
	 *  (non-Javadoc)
740
	 * @see com.iver.cit.gvsig.fmap.layers.RasterOperations#isTiled()
741
	 */
742
	public boolean isTiled() {
743
		return mustTileDraw;
744
	}
745

  
746
	/* (non-Javadoc)
747
	 * @see com.iver.cit.gvsig.fmap.layers.FLayer#newComposedLayer()
748
	 */
749
	public ComposedLayer newComposedLayer() {
750
		Preferences prefs = Preferences.userRoot().node("gvsig.wms");
751

  
752
		/*
753
		 * from java.util.prefs import Preferences
754
		 * prefs = Preferences.userRoot().node("gvsig.wms")
755
		 * prefs.put("useComposedLayer","true")
756
		 */
757

  
758
		String str = prefs.get("useComposedLayer","false");
759
		Boolean useComposedLayer = Boolean.TRUE; // por defecto ya se usan
760
		try {
761
			useComposedLayer = Boolean.valueOf(str);
762
		} catch (Exception e) {
763

  
764
		}
765
		if (useComposedLayer.booleanValue()) {
766
			return new ComposedLayerWMS();
767
		} else {
768
			return null;
769
		}
770
	}
771

  
772
	/*
773
	 * Checks if can make a single petition for the two layers to the server
774
	 * @see com.iver.cit.gvsig.fmap.layers.ComposedLayerWMS#canAdd(com.iver.cit.gvsig.fmap.layers.FLayer)
775
	 */
776
	boolean isComposedLayerCompatible(FLayer layer) {
777
		FLyrWMS aLayer;
778

  
779
		if (!(layer instanceof FLyrWMS)) {
780
			return false;
781
		}
782
		aLayer = (FLyrWMS)layer;
783
		if (!getParameters().getURI().equals(aLayer.getParameters().getURI())) {
784
			return false;
785
		}
786
		
787
		WMSDataParameters p = params instanceof WMSDataParameters ? (WMSDataParameters)params : 
788
			params instanceof TileDataParameters ? (WMSDataParameters)((TileDataParameters) params).getDataParameters() : null;
789
		
790
		if (!p.getFormat().equals(aLayer.getParameters().getFormat())) {
791
			return false;
792
		}
793
		if (!p.getSRS().equals(aLayer.getParameters().getSRS())) {
794
			return false;
795
		}
796
		if (p.getInfoLayerQuery() != null) {
797
			if (!p.getInfoLayerQuery().equals(aLayer.getParameters().getInfoLayerQuery())) {
798
				return false;
799
			}
800
		}else if (p.getInfoLayerQuery() != null) {
801
			return false;
802
		}
803

  
804

  
805
		// isFixedSize es privado
806
		if ((getParameters().getFixedSize() != null) &&
807
				(aLayer.getParameters().getFixedSize() != null)) {
808
			if (getParameters().getFixedSize().equals(aLayer.getParameters().getFixedSize())) {
809
				return false;
810
			}
811
		} else if ((getParameters().getFixedSize() != null) != (aLayer.getParameters().getFixedSize() != null)) {
812
			return false;
813
		}
814

  
815
		// time elevation (dimensions)
816
		if ((p.getDimensions() != null) &&
817
				(aLayer.getParameters().getDimensions() != null)) {
818
			if (p.getDimensions().size() != aLayer.getParameters().getDimensions().size()) {
819
				return false;
820
			} else {
821
				Iterator<String> iter = p.getDimensions().iterator();
822
				while (iter.hasNext()) {
823
					if (!aLayer.getParameters().getDimensions().contains(iter.next())) {
824
						return false;
825
					}
826
				}
827
			}
828

  
829
		} else if ((p.getDimensions() != null) != (aLayer.getParameters().getDimensions() != null)) {
830
			return false;
831
		}
832

  
833
		return true;
834
	}
835

  
836
	/*
837
	 * (non-Javadoc)
838
	 * @see org.gvsig.fmap.raster.layers.FLyrRasterSE#isActionEnabled(int)
839
	 */
840
	public boolean isActionEnabled(int action) {
841
		switch (action) {
842
		case IRasterLayerActions.ZOOM_PIXEL_RESOLUTION:
843
		case IRasterLayerActions.FLYRASTER_BAR_TOOLS:
844
		case IRasterLayerActions.BANDS_FILE_LIST:
845
		case IRasterLayerActions.COLOR_TABLE:
846
		case IRasterLayerActions.GEOLOCATION:
847
		case IRasterLayerActions.PANSHARPENING:
848
		case IRasterLayerActions.SAVE_COLORINTERP:
849
		case IRasterLayerActions.SAVEAS:
850
		case IRasterLayerActions.BANDS_RGB:
851
		case IRasterLayerActions.ENHANCED:
852
		case IRasterLayerActions.STATS:
853
		case IRasterLayerActions.NODATA:
854
			return false;
855
		case IRasterLayerActions.REMOTE_ACTIONS:
856
			return true;
857
		}
858

  
859
		return super.isActionEnabled(action);
860
	}
861

  
862
	/*
863
	 * (non-Javadoc)
864
	 * @see org.gvsig.fmap.raster.layers.FLyrRasterSE#getLegend()
865
	 */
866
	public ILegend getLegend() {
867
		if(getDataStore() != null)
868
			return new ImageLegend(getDataStore().getImageLegend());
869
		return null;
870
	}
871
	
872
	/*
873
	 * (non-Javadoc)
874
	 * @see org.gvsig.raster.fmap.layers.FLyrRaster#isRemote()
875
	 */
876
	public boolean isRemote() {
877
		return true;
878
	}
879

  
880
	/*
881
	 * (non-Javadoc)
882
	 * @see org.gvsig.fmap.raster.layers.FLyrRasterSE#overviewsSupport()
883
	 */
884
	public boolean overviewsSupport() {
885
		return false;
886
	}
887

  
888
	protected void updateDrawVersion() {
889
		if (this.disableUpdateDrawVersion != null){
890

  
891
			Thread curThread = Thread.currentThread();
892

  
893
			Thread aThread;
894

  
895
			Iterator<WeakReference<Thread>> iter = this.disableUpdateDrawVersion.iterator();
896
			while (iter.hasNext()){
897
				aThread = (Thread) ((WeakReference<?>)iter.next()).get();
898
				if (aThread == null){
899
					iter.remove();
900
				} else if(aThread.equals(curThread)){
901
					return;
902
				}
903
			}
904
		}
905
		//		Exception ex = new Exception();
906
		//		ex.printStackTrace();
907
		super.updateDrawVersion();
908
	}
909

  
910
	protected void disableUpdateDrawVersion() {
911
		if (this.disableUpdateDrawVersion == null) {
912
			this.disableUpdateDrawVersion = new ArrayList<WeakReference<Thread>>();
913
		}
914
		this.disableUpdateDrawVersion.add(new WeakReference<Thread>(Thread.currentThread()));
915
	}
916

  
917
	protected void enableUpdateDrawVersion() {
918
		if (this.disableUpdateDrawVersion == null){
919
			return;
920
		}
921
		Thread curThread = Thread.currentThread();
922
		Thread aThread;
923

  
924
		Iterator<WeakReference<Thread>> iter = this.disableUpdateDrawVersion.iterator();
925
		while (iter.hasNext()) {
926
			aThread = (Thread) ((WeakReference<?>)iter.next()).get();
927
			if (aThread == null) {
928
				iter.remove();
929
			} else if(aThread.equals(curThread)) {
930
				iter.remove();
931
				break;
932
			}
933
		}
934

  
935
	}
936

  
937
	private Rectangle2D.Double getRectable2DFromEnvelope(Envelope env) {
938
		return new Rectangle2D.Double(env.getMinimum(0), env.getMinimum(1), env
939
				.getLength(0), env.getLength(1));
940
	}
941

  
942
	private Envelope getEnvelopeFromRectable2D(Rectangle2D rect) {
943
		try {
944
			return geomManager.createEnvelope(rect.getMinX(), rect.getMinY(),
945
					rect.getMaxX(), rect.getMaxY(),
946
					SUBTYPES.GEOM2D);
947
		} catch (CreateEnvelopeException e) {
948
			logger.error("Error creating the envelope", e);
949
		}
950
		return null;
951
	}
952
	
953
	/*
954
	 * (non-Javadoc)
955
	 * @see org.gvsig.raster.fmap.layers.FLyrRaster#getFileFormat()
956
	 */
957
	@Override
958
	public String getFileFormat() {
959
		return "WMS";
960
	}
961
	
962
	/*
963
	 * (non-Javadoc)
964
	 * @see org.gvsig.raster.fmap.layers.DefaultFLyrRaster#getFileLayer()
965
	 */
966
	@Override
967
	public FLayer getFileLayer() throws RasterDriverException {
968
		/*if(getDataStore() instanceof DefaultRemoteRasterStore) {
969
			RemoteRasterProvider prov = (RemoteRasterProvider)((DefaultRemoteRasterStore)getDataStore()).getProvider(0);
970
			File file = null;
971
			
972
			if(getParameters().isSizeFixed()) {
973
				file = prov.getFileLayer();
974
			} else {
975
				file = prov.getLastRequest();
976
			}
977
				
978
			if(file == null)
979
				return null;
980
			
981
			try {
982
				return DefaultFLyrRaster.createLayer("tmp", file);
983
			} catch (LoadLayerException e) {
984
				throw new RasterDriverException(e.getMessage(), e);
985
			}
986
		}*/
987
		return null;
988
	}
989

  
990
	/**
991
	 * Devuelve el envelope en la proyeccion de la vista
992
	 */
993
	public Envelope getFullEnvelope() {
994
		Envelope rAux;
995
		rAux = this.fullEnvelope;
996

  
997
		// Esto es para cuando se crea una capa nueva con el fullExtent de ancho
998
		// y alto 0.
999
		if (rAux == null || rAux.getMaximum(0) - rAux.getMinimum(0) == 0
1000
				&& rAux.getMaximum(1) - rAux.getMinimum(1) == 0) {
1001
			try {
1002
				rAux = geomManager.createEnvelope(0, 0, 100, 100, SUBTYPES.GEOM2D);
1003
			} catch (CreateEnvelopeException e) {
1004
				logger.error("Error creating the envelope", e);
1005
			}
1006
		}
1007
		// Si existe reproyecci?n, reproyectar el extent
1008
		ICoordTrans ct = getCoordTrans();
1009
		if (ct != null) {
1010
			Point2D pt1 = new Point2D.Double(rAux.getMinimum(0), rAux
1011
					.getMinimum(1));
1012
			Point2D pt2 = new Point2D.Double(rAux.getMaximum(0), rAux
1013
					.getMaximum(1));
1014
			pt1 = ct.convert(pt1, null);
1015
			pt2 = ct.convert(pt2, null);
1016
			try {
1017
				rAux = geomManager.createEnvelope(pt1.getX(), pt1.getY(), pt2
1018
						.getX(), pt2.getY(), SUBTYPES.GEOM2D);
1019
			} catch (CreateEnvelopeException e) {
1020
				logger.error("Error creating the envelope", e);
1021
			}// new
1022
			// Rectangle2D.Double();
1023
		}
1024
		return rAux;
1025

  
1026
	}
1027
	
1028
	/*
1029
	 * (non-Javadoc)
1030
	 * @see org.gvsig.raster.fmap.layers.FLyrRaster#getFullRasterExtent()
1031
	 */
1032
	public Extent getFullRasterExtent() {
1033
		return getExtentFromEnvelope(getFullEnvelope());
1034
	}
1035
	
1036
	public DynObjectSet getInfo(org.gvsig.fmap.geom.primitive.Point p, double tolerance) throws LoadLayerException, DataException {
1037
		Point p1 = new Point((int)p.getX(), (int)p.getY());
1038
		return getInfo(p1, tolerance, null, false);
1039
	}
1040

  
1041
	@Override
1042
	public DynObjectSet getInfo(Point p, double tolerance, Cancellable cancel,
1043
			boolean fast) throws LoadLayerException, DataException {
1044

  
1045
		//try {
1046
		ViewPort viewPort = getMapContext().getViewPort();
1047

  
1048
		getParameters().setExtent(this.getRectable2DFromEnvelope(viewPort.getAdjustedEnvelope()));
1049
		if(getParameters().isSizeFixed()) {
1050
			getParameters().setWidth((int)getParameters().getFixedSize().getWidth());
1051
			getParameters().setHeight((int)getParameters().getFixedSize().getHeight());
1052
		} else {
1053
			getParameters().setWidth(viewPort.getImageWidth());
1054
			getParameters().setHeight(viewPort.getImageHeight());
1055
		}
1056
		
1057
		CancelTaskImpl cancellable = new CancelTaskImpl(cancel);
1058
		getParameters().setCancellable(cancellable);
1059
		
1060
		String fInfo;
1061
		try {
1062
			//Point2D pt = new Point2D.Double();
1063
			//try {
1064
				//viewPort.getAffineTransform().transform(p, pt);
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff