Statistics
| Revision:

root / trunk / libraries / libRemoteServices / src / org / gvsig / remoteClient / wms / WMSProtocolHandler.java @ 3345

History | View | Annotate | Download (6.74 KB)

1 3323 ldiaz
2
package org.gvsig.remoteClient.wms;
3
4
import java.io.BufferedOutputStream;
5
import java.io.DataOutputStream;
6
import java.io.File;
7
import java.io.FileOutputStream;
8
import java.io.InputStream;
9
import java.net.URL;
10
import java.util.TreeMap;
11
import java.util.Vector;
12
13
/**
14
 * <p> Abstract class that represents handlers to comunicate via WMS protocol.
15
 * </p>
16
 *
17
 */
18
public abstract class WMSProtocolHandler {
19
20
        // procotol handler name
21
    protected String name;
22
    // protocol handler version
23
    protected String version;
24
    //host of the WMS to conenct
25
    protected String host;
26
    // port number of the comunication channel of the WMS to connect
27
    protected String port;
28
    //WMS metadata
29
    protected ServiceInformation serviceInfo;
30
    public TreeMap layers;
31 3341 ldiaz
    public Vector srs;
32
33 3323 ldiaz
34
    // abstract methods to implement by the handlers that implement
35
    // the connection to a WMS with certain version.
36
    //    public abstract String getName();
37
    //    public abstract String getVersion();
38
39
    /**
40
     * parses the data retrieved by the WMS in XML format.
41
     * It will be mostly the WMS Capabilities, but the implementation
42
     * will be placed in the handler implementing certain version of the protocol.
43
     *
44
     */
45
    public abstract void parse(File f);
46
47
    public String getName() {
48
            return name;
49
    }
50
51
    public String getVersion() {
52
            return version;
53
    }
54
55
    public ServiceInformation getServiceInformation() {
56
        return serviceInfo;
57
    }
58
    public String getHost ()
59
    {
60
            return host;
61
    }
62
    public void setHost(String _host)
63
    {
64
            host = _host;
65
    }
66
    public String getPort()
67
    {
68
            return port;
69
    }
70
    public void setPort(String _port)
71
    {
72
            port = _port;
73
    }
74
75
    /**
76
     * <p>Builds a GetMap request that is sent to the WMS
77
     * the response (image) will be redirect to the
78
     * WMS client</p>
79
     */
80
81 3345 ldiaz
    public byte[] getMap(WMSStatus status) {
82
        return null;
83 3323 ldiaz
    }
84
85
        /**
86
         * <p>Builds a GetCapabilities request that is sent to the WMS
87
         * the response will be parse to extract the data needed by the
88
         * WMS client</p>
89
         */
90
    public void getCapabilities()
91
    {
92 3345 ldiaz
            URL request = null;
93 3323 ldiaz
                try
94
                {
95 3345 ldiaz
                        request = new URL(buildCapabilitiesRequest());
96 3323 ldiaz
                }
97
                catch(Exception e)
98
                {
99
                        // TODO something about the exceptionsssss....!!!
100
                }
101
102
                   File f = null;
103
                   f = new File("tochangethis.txt");
104
105
            if (!f.exists())
106
            {
107
                    try
108
                    {
109
                            DataOutputStream dos = new DataOutputStream( new BufferedOutputStream(new FileOutputStream(f)));
110
                            byte[] buffer = new byte[1024*256];
111 3345 ldiaz
                            InputStream is = request.openStream();
112 3323 ldiaz
                            long readed = 0;
113
                            for (int i = is.read(buffer); i>0; i = is.read(buffer)){
114
                                    dos.write(buffer, 0, i);
115
                                    readed += i;
116
                            }
117
                            dos.close();
118
                    }
119
                    catch(Exception e)
120
                    {}
121
            }
122
            parse(f);
123
            //return parse(f);
124
    }
125
126
/**
127
 * <p>It will send a GetFeatureInfo request to the WMS
128
 * Parsing the response and redirecting the info to the WMS client</p>
129
 */
130
    public String getFeatureInfo()
131
    {
132
            return null;
133
    }
134
135 3345 ldiaz
    /**
136
     * Builds the GetCapabilitiesRequest according to the OGC WMS Specifications
137
     */
138
    private String buildCapabilitiesRequest()
139
    {
140
                String req = new String();
141
142
                req = req + getHost() + "REQUEST=GetCapabilities&SERVICE=WMS&";
143
                req = req + "VERSION=" + getVersion();
144
                req += ("&EXCEPTIONS=XML");
145
                return req;
146
    }
147
148
    /**
149
     * Builds the GetMapRequest according to the OGC WMS Specifications
150
     */
151
    private String buildMapRequest(WMSStatus status)
152
    {
153
                String req = new String();
154
155
                req = req + getHost() + "REQUEST=GetMap&SERVICE=WMS&";
156
                req = req + "VERSION=" + getVersion() + "&";
157
                req = req + getPartialQuery(status);
158
       if (status.getExceptionFormat() != null) {
159
            req += ("&EXCEPTIONS=" + status.getExceptionFormat());
160
        } else {
161
            req += ("&EXCEPTIONS=XML");
162
        }
163
                return req;
164
    }
165
166
    /**
167
     * Gets the part of the OGC request that share GetMap and GetFeatureInfo
168
     * @return String request
169
     */
170
    public String getPartialQuery(WMSStatus status)
171
    {
172
173
174
        String req = "LAYERS=" + status.getLayerNames() + "&STYLES=" +
175
                                status.getStyles() + "&SRS=" + status.getSrs() +
176
            "&BBOX=" + status.getExtent() + "&WIDTH=" + status.getWidth() +
177
            "&HEIGHT=" + status.getHeight() + "&FORMAT=" + status.getFormat();
178
179
//        if (status.getTransparency()) {
180
//            req += "&TRANSPARENT=TRUE";
181
//        }
182
//
183
//        if (status.getBGColor() != null) {
184
//            req += ("&COLOR=" + status.getBGColor());
185
//        }
186
//
187
//        if (time != null) {
188
//            req += ("&TIME=" + time);
189
//        }
190
//
191
//        if (elevation != -1) {
192
//            req += ("&ELEVATION=" + elevation);
193
//        }
194
195
        return req.replaceAll(" ", "%20");
196
    }
197
198
199
200 3323 ldiaz
    public void close() {
201
        // your code here
202
    }
203
204
    /**
205
     * Inner class that represents the description of the WMS metadata.
206
     * The first part of the capabilities will return the service information
207
     * from the WMS, this class will hold this information.
208
     *
209
     */
210
    public class ServiceInformation {
211
212
        public String online_resource;
213
        public String version;
214
        public String name;
215
        public String scope;
216
        public String title;
217
        public String abstr;
218
        public String keywords;
219
        public String fees;
220
        public String operationsInfo;
221
        public String personname;
222
        public String organization;
223
        public String function;
224
        public String addresstype;
225
        public String address;
226
        public String place;
227
        public String province;
228
        public String postcode;
229
        public String country;
230
        public String phone;
231
        public String fax;
232
        public String email;
233
        public Vector formats;
234
235
        public ServiceInformation()
236
        {
237
                online_resource = new String();
238
            version = new String();
239
            name = new String();
240
            scope = new String();
241
            title = new String();
242
            abstr = new String();
243
            keywords = new String();
244
            fees = new String();
245
            operationsInfo = new String();
246
            personname = new String();
247
            organization = new String();
248
            function = new String();
249
            addresstype = new String();
250
            address = new String();
251
            place = new String();
252
            province = new String();
253
            postcode = new String();
254
            country = new String();
255
            phone = new String();
256
            fax = new String();
257
            email = new String();
258
            formats = new Vector();
259
        }
260
     }
261
 }