Revision 3897

View differences:

org.gvsig.raster.wms/tags/org.gvsig.raster.wms-2.2.16/pom.xml
1
<?xml version="1.0" encoding="UTF-8"?>
2
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
3
	<modelVersion>4.0.0</modelVersion>
4
	<artifactId>org.gvsig.raster.wms</artifactId>
5
	<packaging>pom</packaging>
6
	<version>2.2.16</version>
7
	<name>${project.artifactId}</name>
8
	<description>wms client</description>
9
	<inceptionYear>2011</inceptionYear>
10
	
11
	<parent>
12
      <groupId>org.gvsig</groupId>
13
      <artifactId>org.gvsig.desktop</artifactId>
14
      <version>2.0.103</version>
15
  </parent>
16

  
17
        <properties>
18
            <!-- El plugin versions:use-latest-versions falla con scope import -->
19
            <!-- asi que toca usar el versions:update-properties que si que funciona -->
20
            <org.gvsig.raster.version>2.2.16</org.gvsig.raster.version>
21
        </properties>
22
    
23
    <repositories>
24
      <repository>
25
        <id>gvsig-public-http-repository</id>
26
        <name>gvSIG maven public HTTP repository</name>
27
        <url>http://devel.gvsig.org/m2repo/j2se</url>
28
        <releases>
29
          <enabled>true</enabled>
30
          <updatePolicy>daily</updatePolicy>
31
          <checksumPolicy>warn</checksumPolicy>
32
        </releases>
33
        <snapshots>
34
          <enabled>true</enabled>
35
          <updatePolicy>daily</updatePolicy>
36
          <checksumPolicy>warn</checksumPolicy>
37
        </snapshots>
38
      </repository>
39
    </repositories>
40
    
41
    <scm>
42
        <connection>scm:svn:https://devel.gvsig.org/svn/gvsig-raster/org.gvsig.raster.wms/tags/org.gvsig.raster.wms-2.2.16</connection>
43
        <developerConnection>scm:svn:https://devel.gvsig.org/svn/gvsig-raster/org.gvsig.raster.wms/tags/org.gvsig.raster.wms-2.2.16</developerConnection>
44
        <url>https://devel.gvsig.org/redmine/projects/gvsig-raster/repository/show/org.gvsig.raster.wms/tags/org.gvsig.raster.wms-2.2.16</url>
45
    </scm>
46
    
47
    <build>
48
        <plugins>
49
            <plugin>
50
                <groupId>org.apache.maven.plugins</groupId>
51
                <artifactId>maven-release-plugin</artifactId>
52
                <configuration>
53
                    <tagBase>https://devel.gvsig.org/svn/gvsig-raster/org.gvsig.raster.wms/tags/</tagBase>
54
                    <goals>deploy</goals>
55
                </configuration>
56
            </plugin>
57
        </plugins>
58
    </build>
59
    
60
    <dependencyManagement>
61
		<dependencies>
62
                        <dependency>
63
                                <groupId>org.gvsig</groupId>
64
                                <artifactId>org.gvsig.raster</artifactId>
65
                                <version>${org.gvsig.raster.version}</version>
66
                                <type>pom</type>
67
                                <scope>import</scope>
68
                        </dependency>
69

  
70
			<dependency>
71
				<groupId>org.gvsig</groupId>
72
				<artifactId>org.gvsig.raster.wms.io</artifactId>
73
				<version>2.2.16</version>
74
			</dependency>
75
			<dependency>
76
				<groupId>org.gvsig</groupId>
77
				<artifactId>org.gvsig.raster.wms.remoteclient</artifactId>
78
				<version>2.2.16</version>
79
			</dependency>
80
			<dependency>
81
				<groupId>org.gvsig</groupId>
82
				<artifactId>org.gvsig.raster.wms.app.wmsclient</artifactId>
83
				<version>2.2.16</version>
84
			</dependency>
85

  
86
		</dependencies>
87
	</dependencyManagement>
88

  
89
	<modules>
90
		<module>org.gvsig.raster.wms.remoteclient</module>
91
		<module>org.gvsig.raster.wms.io</module>
92
		<module>org.gvsig.raster.wms.app.wmsclient</module>
93
	</modules>
94
</project>
95

  
0 96

  
org.gvsig.raster.wms/tags/org.gvsig.raster.wms-2.2.16/org.gvsig.raster.wms.app.wmsclient/pom.xml
1
<?xml version="1.0" encoding="ISO-8859-1"?>
2

  
3
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4
    <modelVersion>4.0.0</modelVersion>
5
    <artifactId>org.gvsig.raster.wms.app.wmsclient</artifactId>
6
    <packaging>jar</packaging>
7
    <name>Formats: WMS support</name>
8
    <description>Web Map Service support</description>
9
	
10
    <parent>
11
        <groupId>org.gvsig</groupId>
12
        <artifactId>org.gvsig.raster.wms</artifactId>
13
        <version>2.2.16</version>
14
    </parent>
15
	
16
    <dependencies>
17
        <dependency>
18
            <groupId>org.gvsig</groupId>
19
            <artifactId>org.gvsig.raster.swing.api</artifactId>
20
            <scope>compile</scope>
21
        </dependency>
22
        <dependency>
23
            <groupId>org.gvsig</groupId>
24
            <artifactId>org.gvsig.raster.swing.impl</artifactId>
25
            <scope>runtime</scope>
26
        </dependency>
27
        <dependency>
28
            <groupId>org.gvsig</groupId>
29
            <artifactId>org.gvsig.raster.wms.io</artifactId>
30
            <scope>compile</scope>
31
        </dependency>
32
        <dependency>
33
            <groupId>org.gvsig</groupId>
34
            <artifactId>org.gvsig.raster.wms.remoteclient</artifactId>
35
            <scope>compile</scope>
36
        </dependency>
37
        <dependency>
38
            <groupId>org.gvsig</groupId>
39
            <artifactId>org.gvsig.remoteclient</artifactId>
40
            <scope>compile</scope>
41
        </dependency>
42
        <dependency>
43
            <groupId>org.gvsig</groupId>
44
            <artifactId>org.gvsig.app.mainplugin</artifactId>
45
            <scope>compile</scope>
46
        </dependency>
47
        <dependency>
48
            <groupId>org.gvsig</groupId>
49
            <artifactId>org.gvsig.raster.lib.api</artifactId>
50
            <scope>compile</scope>
51
        </dependency>
52
        <dependency>
53
            <groupId>org.gvsig</groupId>
54
            <artifactId>org.gvsig.raster.fmap</artifactId>
55
            <scope>compile</scope>
56
        </dependency>
57
        <dependency>
58
            <groupId>org.gvsig</groupId>
59
            <artifactId>org.gvsig.fmap.control</artifactId>
60
            <scope>compile</scope>
61
        </dependency>
62
        <dependency>
63
            <groupId>org.gvsig</groupId>
64
            <artifactId>org.gvsig.utils</artifactId>
65
            <scope>compile</scope>
66
        </dependency>
67
        <dependency>
68
            <groupId>org.gvsig</groupId>
69
            <artifactId>org.gvsig.ui</artifactId>
70
            <scope>compile</scope>
71
        </dependency>
72
        <dependency>
73
            <groupId>org.gvsig</groupId>
74
            <artifactId>org.gvsig.symbology.lib.api</artifactId>
75
            <scope>compile</scope>
76
        </dependency>
77
        <dependency>
78
            <groupId>org.gvsig</groupId>
79
            <artifactId>org.gvsig.metadata.lib.basic.api</artifactId>
80
            <scope>compile</scope>
81
        </dependency>
82
        <dependency>
83
            <groupId>org.gvsig</groupId>
84
            <artifactId>org.gvsig.raster.cache.lib.api</artifactId>
85
            <scope>compile</scope>
86
        </dependency>
87
		
88
        <dependency>
89
            <groupId>org.gvsig</groupId>
90
            <artifactId>org.gvsig.fmap.mapcontext.api</artifactId>
91
            <scope>compile</scope>
92
        </dependency>
93
        <dependency>
94
            <groupId>org.gvsig</groupId>
95
            <artifactId>org.gvsig.fmap.mapcontext.impl</artifactId>
96
            <scope>runtime</scope>
97
        </dependency>
98
        <dependency>
99
            <groupId>org.gvsig</groupId>
100
            <artifactId>org.gvsig.fmap.mapcontext.operation</artifactId>
101
            <scope>runtime</scope>
102
        </dependency>
103
        <dependency>
104
            <groupId>org.gvsig</groupId>
105
            <artifactId>org.gvsig.projection.api</artifactId>
106
            <scope>compile</scope>
107
        </dependency>
108
        <dependency>
109
            <groupId>org.gvsig</groupId>
110
            <artifactId>org.gvsig.projection.cresques.impl</artifactId>
111
            <scope>runtime</scope>
112
        </dependency>
113
        <dependency>
114
            <groupId>org.gvsig</groupId>
115
            <artifactId>org.gvsig.compat.api</artifactId>
116
            <scope>compile</scope>
117
        </dependency>
118
        <dependency>
119
            <groupId>org.gvsig</groupId>
120
            <artifactId>org.gvsig.compat.se</artifactId>
121
            <scope>compile</scope>
122
        </dependency>
123
        <dependency>
124
            <groupId>org.gvsig</groupId>
125
            <artifactId>org.gvsig.fmap.dal.api</artifactId>
126
            <scope>compile</scope>
127
        </dependency>
128
        <dependency>
129
            <groupId>org.gvsig</groupId>
130
            <artifactId>org.gvsig.fmap.dal.impl</artifactId>
131
            <scope>compile</scope>
132
        </dependency>
133
        <dependency>
134
            <groupId>org.gvsig</groupId>
135
            <artifactId>org.gvsig.fmap.dal.spi</artifactId>
136
            <scope>compile</scope>
137
        </dependency>
138
        <dependency>
139
            <groupId>org.gvsig</groupId>
140
            <artifactId>org.gvsig.fmap.geometry.api</artifactId>
141
            <scope>compile</scope>
142
        </dependency>
143
    <!--
144
        <dependency>
145
            <groupId>org.gvsig</groupId>
146
            <artifactId>org.gvsig.fmap.geometry.generalpath</artifactId>
147
            <scope>runtime</scope>
148
        </dependency>
149
        <dependency>
150
            <groupId>org.gvsig</groupId>
151
            <artifactId>org.gvsig.fmap.geometry.operation</artifactId>
152
            <scope>runtime</scope>
153
        </dependency>
154
    -->
155
    </dependencies>
156
	
157
    <properties>
158
        <gvsig.package.info.state>final</gvsig.package.info.state>
159
        <gvsig.package.info.dependencies>required: org.gvsig.raster.tilecache.app -ge 2, required: org.gvsig.raster.mainplugin -ge 2</gvsig.package.info.dependencies>
160
        <gvsig.package.info.poolURL>https://devel.gvsig.org/download/projects/Raster/pool</gvsig.package.info.poolURL>
161
        <gvsig.package.info.categories>OGC,Remote Services,Raster</gvsig.package.info.categories>
162
        <gvsig.package.info.official>true</gvsig.package.info.official>
163
    </properties>
164
</project>
0 165

  
org.gvsig.raster.wms/tags/org.gvsig.raster.wms-2.2.16/org.gvsig.raster.wms.app.wmsclient/buildNumber.properties
1
#Fri Oct 09 11:32:53 CEST 2015
2
buildNumber=71
0 3

  
org.gvsig.raster.wms/tags/org.gvsig.raster.wms-2.2.16/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.List;
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
	public void doAdd(FLayer layer) throws Exception {
63
		FLyrWMS aLayer = (FLyrWMS)layer;
64
		if (this.layer == null) {
65
			this.layer = new FLyrWMS();
66
			//this.layer.setXMLEntity(aLayer.getXMLEntity());
67
			return;
68
		}
69
		this.layer.getParameters().setLayerQuery( this.layer.getParameters().getLayerQuery() + ","+ aLayer.getParameters().getLayerQuery());
70
		List<RemoteWMSStyle> aStyles = aLayer.getParameters().getStyles();
71

  
72
		if (aStyles != null) {
73
			List<RemoteWMSStyle> myStyles = this.layer.getParameters().getStyles();
74
			if (myStyles == null) {
75
				this.layer.getParameters().setStyles(aStyles);
76
			} else {
77
				myStyles.addAll(aStyles);
78
				this.layer.getParameters().setStyles(myStyles);
79
			}
80
		}
81

  
82
		//revisar el fullextend para ajustarlo a todas las capas
83
		this.layer.getFullEnvelope().add(aLayer.getFullEnvelope());
84

  
85
	}
86

  
87

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

  
94
	}
95

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

  
103
	}
104

  
105
}
0 106

  
org.gvsig.raster.wms/tags/org.gvsig.raster.wms-2.2.16/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/tags/org.gvsig.raster.wms-2.2.16/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/tags/org.gvsig.raster.wms-2.2.16/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.Image;
28
import java.awt.Point;
29
import java.awt.Rectangle;
30
import java.awt.geom.AffineTransform;
31
import java.awt.geom.NoninvertibleTransformException;
32
import java.awt.geom.Point2D;
33
import java.awt.geom.Rectangle2D;
34
import java.awt.image.BufferedImage;
35
import java.lang.ref.WeakReference;
36
import java.util.ArrayList;
37
import java.util.HashMap;
38
import java.util.Iterator;
39
import java.util.List;
40
import java.util.Vector;
41
import java.util.prefs.Preferences;
42

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

  
46
import org.cresques.cts.ICoordTrans;
47
import org.cresques.cts.IProjection;
48
import org.gvsig.andami.PluginServices;
49
import org.gvsig.fmap.dal.DALLocator;
50
import org.gvsig.fmap.dal.DataManager;
51
import org.gvsig.fmap.dal.DataParameters;
52
import org.gvsig.fmap.dal.DataStore;
53
import org.gvsig.fmap.dal.DataStoreParameters;
54
import org.gvsig.fmap.dal.coverage.RasterLocator;
55
import org.gvsig.fmap.dal.coverage.RasterManager;
56
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
57
import org.gvsig.fmap.dal.coverage.datastruct.ViewPortData;
58
import org.gvsig.fmap.dal.coverage.exception.FilePaletteException;
59
import org.gvsig.fmap.dal.coverage.exception.InfoByPointException;
60
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
61
import org.gvsig.fmap.dal.coverage.exception.QueryException;
62
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
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.coverage.store.props.ColorInterpretation;
69
import org.gvsig.fmap.dal.exception.DataException;
70
import org.gvsig.fmap.dal.exception.InitializeException;
71
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
72
import org.gvsig.fmap.dal.exception.ReadException;
73
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
74
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
75
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
76
import org.gvsig.fmap.geom.GeometryLocator;
77
import org.gvsig.fmap.geom.GeometryManager;
78
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
79
import org.gvsig.fmap.geom.primitive.Envelope;
80
import org.gvsig.fmap.mapcontext.ViewPort;
81
import org.gvsig.fmap.mapcontext.exceptions.LoadLayerException;
82
import org.gvsig.fmap.mapcontext.exceptions.UnsupportedVersionLayerException;
83
import org.gvsig.fmap.mapcontext.layers.FLayer;
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.task.Cancellable;
105
import org.gvsig.tools.task.SimpleTaskStatus;
106
import org.gvsig.tools.task.TaskStatusManager;
107
import org.slf4j.Logger;
108
import org.slf4j.LoggerFactory;
109

  
110

  
111

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

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

  
205
	public void setDataStore(DataStore dataStore) throws LoadLayerException {
206
		this.dataStore = (RasterDataStore) dataStore;
207
		try {
208
			this.dataStore.isOpen();
209
			if(!isOpen())
210
				enableOpen();
211
		} catch (NotAvailableStateException e) {
212
			logger.error("Fallo el estado de open. Closed=" + isClosed() + " Awake=" + isAwake(), this, e);
213
		}
214
		setProjection(this.dataStore.getProjection());
215
	}
216

  
217
	/**
218
	 * It choose the best format to load different maps if the server
219
	 * supports it. This format could be png, because it supports
220
	 * transparency.
221
	 * @param formats
222
	 * Arraywith all the formats supported by the server
223
	 * @return
224
	 */
225
	@SuppressWarnings("unused")
226
	private String getGreatFormat(Vector<String> formats){
227
		for (int i = 0 ; i < formats.size() ; i++){
228
			String format = (String) formats.get(i);
229
			if (format.equals("image/jpg")){
230
				return format;
231
			}
232
			if (format.equals("image/jpeg")){
233
				return format;
234
			}
235
		}
236
		return (String)formats.get(0);
237
	}
238
	
239
	public static void registerPersistent() {
240
		PersistenceManager manager = ToolsLocator.getPersistenceManager();
241
		DynStruct definition = manager.getDefinition("FLyrWMS_Persistent");
242
		if( definition == null ) {
243
			if (manager.getDefinition(DefaultFLyrRaster.class) == null) {
244
				DefaultFLyrRaster.registerPersistence();
245
			}
246

  
247
			definition = manager.addDefinition(
248
					FLyrWMS.class,
249
					"FLyrWMS_Persistent",
250
					"FLyrWMS Persistent Definition",
251
					null, 
252
					null
253
			);
254
			
255
			definition.extend(PersistenceManager.PERSISTENCE_NAMESPACE, DefaultFLyrRaster.PERSISTENT_NAME);
256
		}
257

  
258
		DefaultFLyrRaster.registerPersistence(definition);
259
	}
260
	
261
	public void draw(BufferedImage image, Graphics2D g, ViewPort viewPort,
262
			Cancellable cancel, double scale) throws ReadException {
263
		TaskStatusManager manager = ToolsLocator.getTaskStatusManager();
264
		SimpleTaskStatus taskStatus = new RasterTaskStatus("Drawing " + getName() + "...", cancel);
265
		manager.add(taskStatus);
266
		taskStatus.setAutoremove(true);
267
		splitRequestCalculation(viewPort.getImageWidth(), viewPort.getImageHeight());
268
		
269
		if(!firstLoad) {
270
			try {
271
				initFilters();
272
				try {
273
					if(!isOpen())
274
						enableOpen();
275
				} catch (NotAvailableStateException e) {
276
					throw new ReadException("Fallo el estado de open. Closed=" + isClosed() + " Awake=" + isAwake(), e);
277
				}
278
			} catch (FilePaletteException e) {
279
				logger.error(e.getMessage(), this, e);
280
			}
281
			firstLoad = true;
282
		}
283
		
284
		enableStopped();
285
		
286
		if(recalcLevel) {
287
			double pixelSize = viewPort.getEnvelope().getLength(0) / (double)viewPort.getImageWidth();
288
			zoomLevel = dataStore.getNearestLevel(pixelSize);
289
		}
290
		recalcLevel = true;
291

  
292
		if (isWithinScale(scale)) {
293

  
294
			if(mustSplitRequest) {
295
				Point2D p = viewPort.getOffset();
296
				Rectangle r = new Rectangle((int) p.getX(), (int) p.getY(), viewPort.getImageWidth(), viewPort.getImageHeight());
297
				Tiling tiles = new Tiling(maxTileDrawWidth, maxTileDrawHeight, r);
298
				tiles.setAffineTransform((AffineTransform) viewPort.getAffineTransform().clone());
299

  
300
				for (int tileNr = 0; tileNr < tiles.getNumTiles(); tileNr++) {
301
					// drawing part
302
					try {
303
						ViewPort vp = tiles.getTileViewPort(viewPort, tileNr);
304
						drawTile(g, vp, taskStatus, scale);
305
					} catch (LoadLayerException e) {
306
						throw new ReadException(e.getMessage(), e);
307
					} catch (NoninvertibleTransformException e) {
308
						throw new ReadException(e.getMessage(), e);
309
					}
310
				}
311
			} else {
312
				try {
313
					drawTile(g, viewPort, taskStatus, scale);
314
				} catch (LoadLayerException e) {
315
					setAvailable(false);
316
					logger.error("Server error:" + e.getMessage(), e);
317
				}
318
			}
319
		}
320
		disableStopped();
321
	}
322
	
323
		
324
	/**
325
	 * This is the method used to draw a tile in a WMS mosaic layer.
326
	 * @throws LoadLayerException
327
	 * @throws ReadDriverException
328
	 * @return true when a tile has been painted
329
	 */
330
	private void drawTile(Graphics2D g, ViewPort vp, SimpleTaskStatus taskStatus, double scale) throws LoadLayerException, ReadException {
331
		// Compute the query geometry
332
		// 1. Check if it is within borders
333
		Envelope layerEnv = getFullEnvelope();
334
		Envelope vpEnv = vp.getAdjustedEnvelope();
335
		if (!vpEnv.intersects(layerEnv)) {
336
			return;
337
		}
338
		try {
339
			Rectangle2D vpRect = getRectable2DFromEnvelope(vpEnv);
340
			Rectangle2D layerRect = getRectable2DFromEnvelope(layerEnv);
341
			// 2. Intersect layer and viewport extents to get the area of interest
342
			Rectangle2D requestedRect = new Rectangle2D.Double(); 
343
			Rectangle2D.intersect(layerRect, vpRect, requestedRect);
344

  
345
			// 3. Compute image size in pixels from the requested Extent
346
			double scalex = vp.getAffineTransform().getScaleX();
347
			double scaley = vp.getAffineTransform().getScaleY();
348
			int wImg = (int) Math.ceil(Math.abs(requestedRect.getWidth() * scalex));
349
			int hImg = (int) Math.ceil(Math.abs(requestedRect.getHeight() * scaley));
350
			if ((wImg <= 0) || (hImg <= 0)) {
351
				return;
352
			}
353
			
354
			// 4. compute exactly the requested extent (from the rounded image size)
355
			// ensuring we are still within the layer extent
356
			double worldWidth = Math.abs((double)wImg/scalex);
357
			double worldHeigh = Math.abs((double)hImg/scaley);
358
			double worldX;
359
			if (requestedRect.getX()+worldWidth>layerEnv.getMaximum(0)) {
360
				// we've got outside of layer extent due to rounding
361
				worldX = layerEnv.getMaximum(0)-worldWidth;
362
			}
363
			else {
364
				worldX = requestedRect.getX();
365
			}
366
			double worldY;
367
			if (requestedRect.getY()+worldHeigh>layerEnv.getMaximum(1)) {  // FIXME: test with different CRSs
368
				worldY = layerEnv.getMaximum(1)-worldHeigh;
369
			}
370
			else {
371
				worldY = requestedRect.getMinY();
372
			}
373
			
374
			requestedRect.setRect(worldX, worldY, worldWidth, worldHeigh); 
375
			Envelope requestedEnvelope = geomManager.createEnvelope(requestedRect.getMinX(),
376
					requestedRect.getMinY(),
377
					requestedRect.getMaxX(),
378
					requestedRect.getMaxY(),
379
					SUBTYPES.GEOM2D);
380
			Extent requestedExtent = rManager.getDataStructFactory().createExtent(
381
					requestedEnvelope.getMinimum(0), 
382
					requestedEnvelope.getMaximum(1), 
383
					requestedEnvelope.getMaximum(0), 
384
					requestedEnvelope.getMinimum(1));
385

  
386
			// 5. compute the new AffineTransform (ViewPort class can do it for us
387
			// if we provide the image size, extent and offset)
388
			ViewPort auxVp = (ViewPort) vp.clone();
389
			Dimension sz = new Dimension(wImg, hImg);
390
			auxVp.setImageSize(sz);
391
			auxVp.setEnvelope(requestedEnvelope);
392

  
393
			
394
			// 6. compute tile offeset. It is the sum of the original viewport offset
395
			// plus the offset introduced by intersecting layer and viewport extents
396
			double offsetX = vp.getOffset().getX();
397
			if (requestedEnvelope.getMinimum(0)-vpEnv.getMinimum(0)>0) {
398
				offsetX = offsetX + (requestedEnvelope.getMinimum(0)-vpEnv.getMinimum(0))*auxVp.getAffineTransform().getScaleX();
399
			}
400
			double offsetY = vp.getOffset().getY(); // FIXME: test with different CRSs
401
			if (requestedEnvelope.getMaximum(1)-vpEnv.getMaximum(1)<0) {
402
				offsetY = offsetY + (requestedEnvelope.getMaximum(1)-vpEnv.getMaximum(1))*auxVp.getAffineTransform().getScaleY();
403
			}
404

  
405
			// 7. Compute again the AffineTransform considering also the offset
406
			auxVp.setOffset(new Point2D.Double(offsetX, offsetY));
407
			auxVp.refreshExtent(); // necessary after updating the offset
408

  
409
			ViewPortData vpData = rManager.getDataStructFactory().createViewPortData(auxVp.getProjection(), requestedExtent, sz);
410
			vpData.setMat(auxVp.getAffineTransform());
411
			vpData.setDPI((int)auxVp.getDPI());
412
			getParameters().setExtent(requestedRect);
413
			if(getParameters().isSizeFixed()) {
414
				getParameters().setWidth((int)getParameters().getFixedSize().getWidth());
415
				getParameters().setHeight((int)getParameters().getFixedSize().getHeight());
416
			} else {
417
				getParameters().setWidth(wImg);
418
				getParameters().setHeight(hImg);
419
			}
420
			if(getDataStore().getParameters() instanceof WMSDataParameters) {
421
				getRender().draw(g, vpData, taskStatus);
422
			} else {
423
				Extent vpExtent = rManager.getDataStructFactory().createExtent(
424
						vpEnv.getMinimum(0),
425
						vpEnv.getMaximum(1),
426
						vpEnv.getMaximum(0),
427
						vpEnv.getMinimum(1));
428
				ViewPortData vp2 = rManager.getDataStructFactory().createViewPortData(vp.getProjection(), vpExtent, vp.getImageSize() );
429
				vp2.setMat(vp.getAffineTransform());
430
				vp2.setDPI((int)vp.getDPI());
431
				getParameters().setExtent(vpExtent.toRectangle2D());
432
				getRender().drawTiledService(g, vp2, vp.getImageSize(), taskStatus);
433
			}
434
		} catch (ProcessInterruptedException e) {
435
		} catch (CloneNotSupportedException e) {
436
			drawingError(e);
437
		}
438
		catch (QueryException e) {
439
			drawingError(e);
440
		} catch (CreateEnvelopeException e) {
441
			drawingError(e);
442
		} finally {
443
			taskStatus.terminate();				
444
		}
445
	}
446
	
447
	private void drawingError(Exception e) {
448
		setAvailable(false);
449
		JOptionPane.showMessageDialog(null, "Problems drawing this layer:" + e.getMessage(), Messages.getText("Error"), JOptionPane.ERROR_MESSAGE);
450
		logger.info("Problems drawing this layer:" + e.getMessage(), e);
451
	}	
452

  
453
	/**
454
	 * @see com.iver.cit.gvsig.fmap.layers.FLayer#print(java.awt.Graphics2D,
455
	 * 		com.iver.cit.gvsig.fmap.ViewPort,
456
	 * 		com.iver.cit.gvsig.fmap.operations.Cancellable)
457
	 */
458
	public void print(Graphics2D g, ViewPort viewPort, Cancellable cancel, double scale, PrintRequestAttributeSet properties)
459
	throws ReadException {
460
		TaskStatusManager manager = ToolsLocator.getTaskStatusManager();
461
		SimpleTaskStatus taskStatus = new RasterTaskStatus("Printing " + getName() + "...", cancel);
462
		manager.add(taskStatus);
463
		taskStatus.setAutoremove(true);
464
		splitRequestCalculation(viewPort.getImageWidth(), viewPort.getImageHeight());
465

  
466
		if (isVisible() && isWithinScale(scale)){
467
			if (!mustSplitRequest) {
468
				draw(null, g, viewPort, cancel,scale);
469
			} else {
470
				Tiling tiles = new Tiling(maxTilePrintWidth, maxTilePrintHeight, g.getClipBounds());
471
				tiles.setAffineTransform((AffineTransform) viewPort.getAffineTransform().clone());
472
				for (int tileNr = 0; tileNr < tiles.getNumTiles(); tileNr++) {
473
					// Parte que dibuja
474
					try {
475
						ViewPort vp = tiles.getTileViewPort(viewPort, tileNr);
476
						drawTile(g, vp, taskStatus, scale);
477
					} catch (NoninvertibleTransformException e) {
478
						throw new ReadException(e.getMessage(), e);
479
					} catch (LoadLayerException e) {
480
						throw new ReadException(e.getMessage(), e);
481
					}
482
				}
483
			}
484
		}
485
		taskStatus.terminate();
486
	}
487

  
488
	public void _print(Graphics2D g, ViewPort viewPort, Cancellable cancel,
489
			double scale) throws ReadException {
490
		draw(null, g, viewPort, cancel,scale);
491
	}
492

  
493
	public HashMap<String, Object> getProperties() {
494
		HashMap<String, Object> info = new HashMap<String, Object>();
495
		String[] layerNames = getParameters().getLayerQuery().split(",");
496
		Vector<WMSLayerNode> layers = new Vector<WMSLayerNode>(layerNames.length);
497
		try {
498
			//explorer.connect(null);
499
			for (int i = 0; i < layerNames.length; i++) {
500
				layers.add(i, getExplorer().getLayer(layerNames[i]));
501
			}
502
			info.put("name", getName());
503
			info.put("selectedLayers", layers);
504
			info.put("host", getParameters().getURI());
505
			info.put("srs", getParameters().getSRSCode());
506
			info.put("format", getParameters().getFormat());
507
			info.put("infoformat", getParameters().getInfoFormat());
508
			info.put("wmsTransparency", new Boolean(getParameters().isWmsTransparent()));
509
			info.put("styles", getParameters().getStyles());
510
			info.put("dimensions", getParameters().getDimensions());
511
			info.put("fixedSize", getParameters().getFixedSize());
512
			return info;
513
		} catch (Exception e) {
514
			e.printStackTrace();
515
		}
516
		return null;
517
	}
518

  
519
	/**
520
	 * Creates the part of a OGC's MapContext document that would describe this
521
	 * layer(s).
522
	 * @param version, The desired version of the resulting document. (1.1.0)
523
	 * @return String containing the xml.
524
	 * @throws UnsupportedVersionLayerException
525
	 */
526
	@SuppressWarnings({ "unchecked", "rawtypes" })
527
	public String toMapContext(String mapContextVersion) {
528
		XmlBuilder xml = new XmlBuilder();
529
		
530
		String query = getParameters().getLayerQuery();
531
		String[] layerNames = query.split(",");
532
		List<RemoteWMSStyle> styleList = getParameters().getStyles();
533
		for (int i = 0; i < layerNames.length; i++) {
534
			WMSLayerNode layer = getExplorer().getLayer(layerNames[i]);
535
			HashMap xmlAttrs = new HashMap();
536

  
537
			// <Layer>
538
			xmlAttrs.put(WebMapContextTags.HIDDEN, !isVisible() + "");
539
			xmlAttrs.put(WebMapContextTags.QUERYABLE, getExplorer().isQueryable() + "");
540
			xml.openTag(WebMapContextTags.LAYER, xmlAttrs);
541
			xmlAttrs.clear();
542
			if (mapContextVersion.equals("1.1.0") || mapContextVersion.equals("1.0.0")) {
543
				// <Server>
544
				xmlAttrs.put(WebMapContextTags.SERVICE, WebMapContextTags.WMS);
545
				xmlAttrs.put(WebMapContextTags.VERSION, getExplorer().getVersion());
546
				xmlAttrs.put(WebMapContextTags.SERVER_TITLE, getExplorer().getServiceTitle());
547
				xml.openTag(WebMapContextTags.SERVER, xmlAttrs);
548
				xmlAttrs.clear();
549

  
550
				// <OnlineResource>
551
				xmlAttrs.put(WebMapContextTags.XLINK_TYPE, "simple");
552
				xmlAttrs.put(WebMapContextTags.XLINK_HREF, getParameters().getURI().toString());
553
				xml.writeTag(WebMapContextTags.ONLINE_RESOURCE, xmlAttrs);
554
				xmlAttrs.clear();
555
				// </OnlineResource>
556

  
557
				xml.closeTag();
558
				// </Server>
559

  
560
				// <Name>
561
				xml.writeTag(WebMapContextTags.NAME, layer.getName().trim());
562
				// </Name>
563

  
564
				// <Title>
565
				xml.writeTag(WebMapContextTags.TITLE, layer.getTitle().trim());
566
				//?xml.writeTag(WebMapContextTags.TITLE, getName().trim());
567
				// </Title>
568

  
569
				// <Abstract>
570
				if (layer.getAbstract() != null) {
571
					xml.writeTag(WebMapContextTags.ABSTRACT, layer.getAbstract());
572
					// </Abstract>
573
				}
574

  
575
				// <SRS> (a list of available SRS for the enclosing layer)
576
				String[] strings = (String[]) layer.getAllSrs().toArray(new String[0]);
577
				String mySRS = strings[0];
578
				for (int j = 1; j < strings.length; j++) {
579
					mySRS += ","+strings[j];
580
				}
581
				xml.writeTag(WebMapContextTags.SRS, mySRS);
582
				// </SRS>
583

  
584
				// <FormatList>
585
				xml.openTag(WebMapContextTags.FORMAT_LIST);
586
				strings = getExplorer().getFormats();
587
				for (int j = 0; j < strings.length; j++) {
588
					// <Format>
589
					String str = strings[j].trim();
590
					if (str.equals(getParameters().getFormat())) {
591
						xml.writeTag(WebMapContextTags.FORMAT, str, WebMapContextTags.CURRENT, "1");
592
					} else {
593
						xml.writeTag(WebMapContextTags.FORMAT, str);
594
						// </Format>
595
					}
596
				}
597
				xml.closeTag();
598
				// </FormatList>
599

  
600
				// <StyleList>
601
				xml.openTag(WebMapContextTags.STYLE_LIST);
602

  
603
				if (layer.getStyles().size() > 0) {
604
					for (int j = 0; j < layer.getStyles().size(); j++) {
605
						// <Style>
606
						RemoteWMSStyle st = layer.getStyles().get(j);
607
						if (st.getName().equals(styleList.get(i).getName())) {
608
							xmlAttrs.put(WebMapContextTags.CURRENT, "1");
609
						}
610
						xml.openTag(WebMapContextTags.STYLE, xmlAttrs);
611
						xmlAttrs.clear();
612

  
613
						// <Name>
614
						xml.writeTag(WebMapContextTags.NAME, st.getName());
615
						// </Name>
616

  
617
						// <Title>
618
						xml.writeTag(WebMapContextTags.TITLE, st.getTitle());
619
						// </Title>
620

  
621
						// <LegendURL width="180" format="image/gif" height="50">
622
						// <OnlineResource xlink:type="simple" xlink:href="http://globe.digitalearth.gov/globe/en/icons/colorbars/NATIONAL.gif"/>
623
						// </OnlineResource>
624
						// </LegendURL>
625
						xml.closeTag();
626
						// </Style>
627

  
628
					}
629

  
630
				} else {
631
					// Create fake style (for compatibility issues)
632
					xmlAttrs.put(WebMapContextTags.CURRENT, "1");
633
					// <Style>
634
					xml.openTag(WebMapContextTags.STYLE, xmlAttrs);
635
					xmlAttrs.clear();
636
					// <Name>
637
					xml.writeTag(WebMapContextTags.NAME, "default");
638
					// </Name>
639

  
640
					// <Title>
641
					xml.writeTag(WebMapContextTags.TITLE, "default");
642
					xml.closeTag();
643
				}
644
				// </StyleList>
645
				xml.closeTag();
646
				if (mapContextVersion.compareTo("1.0.0") > 0) {
647
					// <DimensionList>
648
					xml.openTag(WebMapContextTags.DIMENSION_LIST);
649
					// <Dimension>
650
					// </Dimension>
651
					xml.closeTag();
652
					// </DimensionList>
653
				}
654
			} else {
655
				xml.writeTag("ERROR", PluginServices.getText(this, "unsupported_map_context_version"));
656
			}
657
			// </Layer>
658
			xml.closeTag();
659
		}
660
		return xml.getXML();
661
	}
662

  
663
	public String getTocImageIcon() {
664
		return "icon-layer-wms";
665
	}
666

  
667
	public int[] getTileSize() {
668
		int[] size = {maxTileDrawWidth, maxTileDrawHeight};
669
		return size;
670
	}
671

  
672
	public boolean isTiled() {
673
		return mustSplitRequest;
674
	}
675
	
676
	private void splitRequestCalculation(int width, int height) {
677
            RasterDataStore store = this.getDataStore();
678
            if( store == null ) {
679
                String msg = "Can't get RasterDataStore associated to this layer ("+this.toString()+").";
680
                logger.warn(msg);
681
                throw new RuntimeException(msg);
682
            }
683
            mustSplitRequest = (!store.isTiled() && (width > maxTileDrawWidth || height > maxTileDrawHeight));
684
	}
685

  
686
	public ComposedLayer newComposedLayer() {
687
		Preferences prefs = Preferences.userRoot().node("gvsig.wms");
688

  
689
		/*
690
		 * from java.util.prefs import Preferences
691
		 * prefs = Preferences.userRoot().node("gvsig.wms")
692
		 * prefs.put("useComposedLayer","true")
693
		 */
694

  
695
		String str = prefs.get("useComposedLayer","false");
696
		Boolean useComposedLayer = Boolean.TRUE; // por defecto ya se usan
697
		try {
698
			useComposedLayer = Boolean.valueOf(str);
699
		} catch (Exception e) {
700

  
701
		}
702
		if (useComposedLayer.booleanValue()) {
703
			return new ComposedLayerWMS();
704
		} else {
705
			return null;
706
		}
707
	}
708

  
709
	/*
710
	 * Checks if can make a single petition for the two layers to the server
711
	 * @see com.iver.cit.gvsig.fmap.layers.ComposedLayerWMS#canAdd(com.iver.cit.gvsig.fmap.layers.FLayer)
712
	 */
713
	boolean isComposedLayerCompatible(FLayer layer) {
714
		FLyrWMS aLayer;
715

  
716
		if (!(layer instanceof FLyrWMS)) {
717
			return false;
718
		}
719
		aLayer = (FLyrWMS)layer;
720
		if (!getParameters().getURI().equals(aLayer.getParameters().getURI())) {
721
			return false;
722
		}
723
		
724
		WMSDataParameters p = getWMSParameters(getDataStore().getParameters()); 
725
				
726
		if (!p.getFormat().equals(aLayer.getParameters().getFormat())) {
727
			return false;
728
		}
729
		if (!p.getSRS().equals(aLayer.getParameters().getSRS())) {
730
			return false;
731
		}
732
		if (p.getInfoLayerQuery() != null) {
733
			if (!p.getInfoLayerQuery().equals(aLayer.getParameters().getInfoLayerQuery())) {
734
				return false;
735
			}
736
		}else if (p.getInfoLayerQuery() != null) {
737
			return false;
738
		}
739

  
740

  
741
		// isFixedSize es privado
742
		if ((getParameters().getFixedSize() != null) &&
743
				(aLayer.getParameters().getFixedSize() != null)) {
744
			if (getParameters().getFixedSize().equals(aLayer.getParameters().getFixedSize())) {
745
				return false;
746
			}
747
		} else if ((getParameters().getFixedSize() != null) != (aLayer.getParameters().getFixedSize() != null)) {
748
			return false;
749
		}
750

  
751
		// time elevation (dimensions)
752
		if ((p.getDimensions() != null) &&
753
				(aLayer.getParameters().getDimensions() != null)) {
754
			if (p.getDimensions().size() != aLayer.getParameters().getDimensions().size()) {
755
				return false;
756
			} else {
757
				Iterator<String> iter = p.getDimensions().iterator();
758
				while (iter.hasNext()) {
759
					if (!aLayer.getParameters().getDimensions().contains(iter.next())) {
760
						return false;
761
					}
762
				}
763
			}
764

  
765
		} else if ((p.getDimensions() != null) != (aLayer.getParameters().getDimensions() != null)) {
766
			return false;
767
		}
768

  
769
		return true;
770
	}
771

  
772
	public boolean isActionEnabled(int action) {
773
		switch (action) {
774
		case IRasterLayerActions.ZOOM_PIXEL_RESOLUTION:
775
		case IRasterLayerActions.FLYRASTER_BAR_TOOLS:
776
		case IRasterLayerActions.BANDS_FILE_LIST:
777
		case IRasterLayerActions.COLOR_TABLE:
778
		case IRasterLayerActions.GEOLOCATION:
779
		case IRasterLayerActions.PANSHARPENING:
780
		case IRasterLayerActions.SAVE_COLORINTERP:
781
		case IRasterLayerActions.SAVEAS:
782
		case IRasterLayerActions.BANDS_RGB:
783
		case IRasterLayerActions.ENHANCED:
784
		case IRasterLayerActions.STATS:
785
		case IRasterLayerActions.NODATA:
786
			return false;
787
		case IRasterLayerActions.REMOTE_ACTIONS:
788
			return true;
789
		}
790

  
791
		return super.isActionEnabled(action);
792
	}
793

  
794
	public ILegend getLegend() {
795
		if(getDataStore() != null) {
796
			Image img = getDataStore().getImageLegend();
797
			if(img != null)
798
				return new ImageLegend(img);
799
		}
800
		return null;
801
	}
802
	
803
	public boolean isRemote() {
804
		return true;
805
	}
806

  
807
	public boolean overviewsSupport() {
808
		return false;
809
	}
810

  
811
	protected void updateDrawVersion() {
812
		if (this.disableUpdateDrawVersion != null){
813

  
814
			Thread curThread = Thread.currentThread();
815

  
816
			Thread aThread;
817

  
818
			Iterator<WeakReference<Thread>> iter = this.disableUpdateDrawVersion.iterator();
819
			while (iter.hasNext()){
820
				aThread = (Thread) ((WeakReference<?>)iter.next()).get();
821
				if (aThread == null){
822
					iter.remove();
823
				} else if(aThread.equals(curThread)){
824
					return;
825
				}
826
			}
827
		}
828
		//		Exception ex = new Exception();
829
		//		ex.printStackTrace();
830
		super.updateDrawVersion();
831
	}
832

  
833
	protected void disableUpdateDrawVersion() {
834
		if (this.disableUpdateDrawVersion == null) {
835
			this.disableUpdateDrawVersion = new ArrayList<WeakReference<Thread>>();
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff