Statistics
| Revision:

gvsig-raster / org.gvsig.raster / branches / org.gvsig.raster.2.4 / org.gvsig.raster.wms2 / org.gvsig.raster.wms2.provider / src / main / java / org / gvsig / raster / wms / provider / DefaultWMSRasterServerExplorer.java @ 8688

History | View | Annotate | Download (9.61 KB)

1
/* gvSIG. Desktop Geographic Information System.
2
 *
3
 * Copyright ? 2007-2016 gvSIG Association
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
18
 * MA  02110-1301, USA.
19
 *
20
 * For any additional information, do not hesitate to contact us
21
 * at info AT gvsig.com, or visit our website www.gvsig.com.
22
 */
23
package org.gvsig.raster.wms.provider;
24

    
25
import java.io.IOException;
26
import java.net.ConnectException;
27
import java.net.URL;
28
import java.util.ArrayList;
29
import java.util.Collection;
30
import java.util.HashSet;
31
import java.util.Iterator;
32
import java.util.List;
33
import java.util.Set;
34
import java.util.TreeMap;
35
import java.util.Vector;
36

    
37
import javax.swing.tree.TreeNode;
38

    
39
import org.cresques.cts.IProjection;
40
import org.slf4j.Logger;
41
import org.slf4j.LoggerFactory;
42

    
43
import org.gvsig.fmap.crs.CRSFactory;
44
import org.gvsig.fmap.dal.DataServerExplorer;
45
import org.gvsig.fmap.dal.DataServerExplorerParameters;
46
import org.gvsig.fmap.dal.DataStoreParameters;
47
import org.gvsig.fmap.dal.NewDataStoreParameters;
48
import org.gvsig.fmap.dal.exception.DataException;
49
import org.gvsig.fmap.dal.exception.InitializeException;
50
import org.gvsig.fmap.dal.spi.AbstractDataServerExplorer;
51
import org.gvsig.fmap.dal.spi.DataServerExplorerProviderServices;
52
import org.gvsig.remoteclient.wms.WMSClient;
53
import org.gvsig.remoteclient.wms.WMSLayer;
54
import org.gvsig.remoteclient.wms.WMSStatus;
55
import org.gvsig.remoteclient.wms.WMSStyle;
56
import org.gvsig.tools.ToolsLocator;
57
import org.gvsig.tools.i18n.I18nManager;
58
import org.gvsig.tools.util.InformationBuilder;
59
import org.gvsig.tools.util.ToolsUtilLocator;
60

    
61

    
62
/**
63
 * @author fdiaz
64
 *
65
 */
66
public class DefaultWMSRasterServerExplorer extends AbstractDataServerExplorer implements WMSRasterServerExplorer {
67

    
68
    private static final Logger logger =
69
        LoggerFactory.getLogger(DefaultWMSRasterServerExplorer.class);
70

    
71
    private URL service = null;
72
    private boolean override = false;
73

    
74
    //WMS Parameters
75
    private WMSStatus status = null;
76
    private WMSClient wmsClient = null;
77

    
78
    private WMSLayerNode layerNode = null;
79

    
80
    protected DefaultWMSRasterServerExplorer(DataServerExplorerParameters parameters,
81
        DataServerExplorerProviderServices providerServices) throws InitializeException {
82
        super(parameters, providerServices);
83
        // TODO Auto-generated constructor stub
84

    
85
        this.service = (URL)(parameters.getDynValue(WMSRasterServerExplorerParameters.WMS_SERVICE_PARAMETER_NAME));
86
        this.override = (Boolean)(parameters.getDynValue(WMSRasterServerExplorerParameters.WMS_OVERRIDE_CAPABILITIES_PARAMETER_NAME));
87
        if (wmsClient == null){
88
            try {
89
                wmsClient = new WMSClient(service.toString());
90
                if (status == null){
91
                    status = new WMSStatus();
92
                }
93

    
94
                wmsClient.getCapabilities(status, this.override, null);
95
            } catch (ConnectException e) {
96
                throw new InitializeException("Not possible to connect with " + service, e);
97
            } catch (IOException e) {
98
                throw new InitializeException("Not possible to connect with " + service, e);
99
            }
100
        }
101

    
102
    }
103

    
104
    @Override
105
    public String getProviderName() {
106
        return WMSRasterProvider.NAME;
107
    }
108

    
109
    @Override
110
    public boolean canAdd() {
111
        return false;
112
    }
113

    
114
    @Override
115
    public boolean canAdd(String storeName) throws DataException {
116
        return false;
117
    }
118

    
119
    @Override
120
    public List<WMSRasterProviderParameters> list() throws DataException {
121
        List<WMSRasterProviderParameters> result = new ArrayList<WMSRasterProviderParameters>();
122
        @SuppressWarnings("unchecked")
123
        TreeMap<String, WMSLayer> wmsLayersMap = wmsClient.getLayers();
124

    
125
        Collection<WMSLayer> values = wmsLayersMap.values();
126

    
127
        for (Iterator<WMSLayer> iterator = values.iterator(); iterator.hasNext();) {
128
            WMSLayer wmsLayer = (WMSLayer) iterator.next();
129

    
130
            WMSRasterProviderParameters params =  new WMSRasterProviderParameters();
131
            params.setService(this.service);
132
            List<String> paramLayers = new ArrayList<String>();
133
            paramLayers.add(wmsLayer.getName());
134
            params.setLayers(paramLayers);
135

    
136
            @SuppressWarnings("unchecked")
137
            ArrayList<WMSStyle> styles = wmsLayer.getStyles();
138
            if (styles != null && styles.size() > 0) {
139
                List<String> paramStyles = new ArrayList<String>();
140
                paramStyles.add(((WMSStyle) (styles.get(0))).getName());
141
                params.setStyles(paramStyles);
142
            }
143

    
144
            @SuppressWarnings("unchecked")
145
            Vector<String> formats = wmsClient.getFormats();
146
            if(formats!=null && formats.size()>0){
147
                params.setFormat((String)(formats.get(0)));
148
            }
149

    
150
            @SuppressWarnings("unchecked")
151
            Vector<String> infoFormats = wmsClient.getInfoFormats();
152
            if(infoFormats!=null && infoFormats.size()>0){
153
                params.setInfoFormat((String)infoFormats.get(0));
154
            }
155

    
156
            @SuppressWarnings("unchecked")
157
            Vector<String> allSrs = wmsLayer.getAllSrs();
158
            if(allSrs!=null && allSrs.size()>0){
159
                int i=0;
160
                while(i<allSrs.size()){
161
                    String srs = allSrs.get(i);
162
                    if(isValidSrs(srs)){
163
                        params.setCRS(srs);
164
                        break;
165
                    }
166
                    i++;
167
                }
168
                if(i>=allSrs.size()){
169
                    throw new IllegalArgumentException(this.getProviderName()
170
                            + ": The server does not provide any valid srs.'");
171
                }
172
            }
173

    
174
            result.add(params);
175
        }
176

    
177
        return result;
178
    }
179

    
180
    @Override
181
    public List<WMSRasterProviderParameters> list(int mode) throws DataException {
182
        if(mode!=DataServerExplorer.MODE_RASTER){
183
            return null;
184
        }
185
        return list();
186
    }
187

    
188
    @Override
189
    public boolean add(String provider, NewDataStoreParameters parameters, boolean overwrite) throws DataException {
190
        return false;
191
    }
192

    
193
    @Override
194
    public void remove(DataStoreParameters parameters) throws DataException {
195
        throw new UnsupportedOperationException("Can't remove a WMS provider.");
196

    
197
    }
198

    
199
    @Override
200
    public NewDataStoreParameters getAddParameters(String storeName) throws DataException {
201
        return null;
202
    }
203

    
204
    @Override
205
    public List<String> getDataStoreProviderNames() {
206
        List<String> x = new ArrayList<String>();
207
        x.add(WMSRasterProvider.NAME);
208
        return x;
209
    }
210

    
211
    /**
212
     * @param params
213
     * @return formats
214
     */
215
    @SuppressWarnings("unchecked")
216
    public List<String> getFormats(){
217
        return new ArrayList<String>(wmsClient.getFormats());
218
    }
219

    
220
    /**
221
     * @return info formats
222
     */
223
    @SuppressWarnings("unchecked")
224
    public List<String> getInfoFormats(){
225
        return new ArrayList<String>(wmsClient.getInfoFormats());
226
    }
227

    
228
    /**
229
     * @param params
230
     * @return list of available srs for the params
231
     */
232
    @SuppressWarnings("unchecked")
233
    public List<String> getSrss(WMSRasterProviderParameters params){
234
        List<String> layers = params.getLayers();
235
        Set<String> setSrs = new HashSet<String>();
236
        for (Iterator<String> iterator = layers.iterator(); iterator.hasNext();) {
237
            String name = (String) iterator.next();
238
            WMSLayer wmsLayer = wmsClient.getLayer(name);
239
            Vector<String> allSrs = wmsLayer.getAllSrs();
240
            for (Iterator<String> iterator2 = allSrs.iterator(); iterator2.hasNext();) {
241
                String srs = iterator2.next();
242
                if(isValidSrs(srs)){
243
                    setSrs.add(srs);
244
                }
245
            }
246
        }
247
        return new ArrayList<String>(setSrs);
248
    }
249

    
250
    private boolean isValidSrs(String srs){
251
        try{
252
            IProjection crs=CRSFactory.getCRS(srs);
253
            if(crs!=null){
254
                return true;
255
            }
256
        }catch(Exception e){
257
            logger.info("Can't get crs from: '"+srs+"' code", e);
258
            return false;
259
        }
260
        return false;
261
    }
262

    
263
    public TreeNode getTreeNode(){
264
        if(layerNode == null) {
265
            layerNode = new DefaultWMSLayerNode(this.wmsClient.getRootLayer(), null);
266
        }
267
        return layerNode;
268
    }
269

    
270
    public String getInfoString(){
271
        I18nManager i18nManager = ToolsLocator.getI18nManager();
272

    
273
        InformationBuilder builder = ToolsUtilLocator.getToolsUtilManager().createInformationBuilder();
274

    
275
        builder.title().labelkey(i18nManager.getTranslation("_service_information"));
276

    
277
        builder.property().labelkey("_server").value(service.toString());
278

    
279
        builder.property().labelkey("_server_type").value("WMS "+ wmsClient.getVersion());
280
        builder.property().labelkey("_server_title").value(wmsClient.getServiceInformation().title);
281
        builder.property().labelkey("_server_sumary").value(wmsClient.getServiceInformation().abstr);
282

    
283
        return builder.toString();
284
    }
285

    
286

    
287
}