Revision 3798 trunk/libraries/libRemoteServices/src/org/gvsig/remoteClient/wms/WMSProtocolHandler.java
WMSProtocolHandler.java | ||
---|---|---|
1 | 1 |
|
2 | 2 |
package org.gvsig.remoteClient.wms; |
3 | 3 |
|
4 |
import java.io.DataOutputStream;
|
|
4 |
import java.io.ByteArrayInputStream;
|
|
5 | 5 |
import java.io.File; |
6 |
import java.io.FileOutputStream; |
|
7 |
import java.io.FileReader; |
|
8 | 6 |
import java.io.IOException; |
9 | 7 |
import java.io.InputStream; |
8 |
import java.io.InputStreamReader; |
|
9 |
import java.io.Reader; |
|
10 |
import java.io.StringReader; |
|
10 | 11 |
import java.net.URL; |
11 | 12 |
import java.net.URLConnection; |
13 |
import java.util.ArrayList; |
|
12 | 14 |
import java.util.TreeMap; |
13 | 15 |
import java.util.Vector; |
14 | 16 |
|
15 | 17 |
import org.gvsig.remoteClient.exceptions.ServerErrorException; |
16 | 18 |
import org.gvsig.remoteClient.exceptions.WMSException; |
19 |
import org.gvsig.remoteClient.utils.CapabilitiesTags; |
|
20 |
import org.gvsig.remoteClient.utils.ExceptionTags; |
|
17 | 21 |
import org.gvsig.remoteClient.utils.Utilities; |
18 | 22 |
import org.kxml2.io.KXmlParser; |
23 |
import org.xmlpull.v1.XmlPullParserException; |
|
19 | 24 |
|
25 |
import com.iver.andami.PluginServices; |
|
26 |
|
|
20 | 27 |
/** |
21 | 28 |
* <p> Abstract class that represents handlers to comunicate via WMS protocol. |
22 | 29 |
* </p> |
... | ... | |
161 | 168 |
} |
162 | 169 |
} |
163 | 170 |
|
164 |
/** |
|
165 |
* Parses a WMS exception XML document. |
|
166 |
* @param imageBytes |
|
167 |
* @return |
|
171 |
/* (non-Javadoc) |
|
172 |
* @see org.gvsig.remoteClient.wms.WMSProtocolHandler#parseException(byte[]) |
|
168 | 173 |
*/ |
169 |
protected abstract String parseException(byte[] imageBytes) ; |
|
174 |
protected String parseException(byte[] data) { |
|
175 |
ArrayList errors = new ArrayList(); |
|
176 |
KXmlParser kxmlParser = new KXmlParser(); |
|
177 |
Reader reader = new InputStreamReader(new ByteArrayInputStream(data)); |
|
178 |
try |
|
179 |
{ |
|
180 |
kxmlParser.setInput(reader); |
|
181 |
kxmlParser.nextTag(); |
|
182 |
int tag; |
|
183 |
if ( kxmlParser.getEventType() != KXmlParser.END_DOCUMENT ) |
|
184 |
{ |
|
185 |
kxmlParser.require(KXmlParser.START_TAG, null, ExceptionTags.EXCEPTION_ROOT); |
|
186 |
tag = kxmlParser.nextTag(); |
|
187 |
while(tag != KXmlParser.END_DOCUMENT) |
|
188 |
{ |
|
189 |
switch(tag) |
|
190 |
{ |
|
191 |
case KXmlParser.START_TAG: |
|
192 |
if (kxmlParser.getName().compareTo(ExceptionTags.SERVICE_EXCEPTION)==0){ |
|
193 |
String errorCode = kxmlParser.getAttributeValue("", ExceptionTags.CODE); |
|
194 |
errorCode = (errorCode != null) ? "["+errorCode+"] " : ""; |
|
195 |
String errorMessage = kxmlParser.nextText(); |
|
196 |
errors.add(errorCode+errorMessage); |
|
197 |
} |
|
198 |
break; |
|
199 |
case KXmlParser.END_TAG: |
|
200 |
break; |
|
201 |
|
|
202 |
} |
|
203 |
tag = kxmlParser.nextTag(); |
|
204 |
} |
|
205 |
//kxmlParser.require(KXmlParser.END_DOCUMENT, null, null); |
|
206 |
} |
|
207 |
} |
|
208 |
catch(XmlPullParserException parser_ex){ |
|
209 |
System.out.println(parser_ex.getMessage()); |
|
210 |
parser_ex.printStackTrace(); |
|
211 |
} |
|
212 |
catch (IOException ioe) { |
|
213 |
ioe.printStackTrace(); |
|
214 |
} |
|
215 |
String message = errors.size()>0? "" : null; |
|
216 |
for (int i = 0; i < errors.size(); i++) { |
|
217 |
message += (String) errors.get(i)+"\n"; |
|
218 |
} |
|
219 |
return message; |
|
220 |
} |
|
170 | 221 |
|
171 | 222 |
/** |
172 | 223 |
* <p>Builds a GetCapabilities request that is sent to the WMS |
... | ... | |
202 | 253 |
public String getFeatureInfo(WMSStatus status, int x, int y, int featureCount) |
203 | 254 |
{ |
204 | 255 |
URL request = null; |
205 |
StringBuffer output = new StringBuffer(); |
|
256 |
StringBuffer output = new StringBuffer(); |
|
257 |
String outputFormat = new String(); |
|
258 |
String ServiceException = "ServiceExceptionReport"; |
|
206 | 259 |
try |
207 | 260 |
{ |
208 | 261 |
//TODO: |
209 | 262 |
//pass this buildXXXRequest to the WMSProtocolHandlerXXX: The request can depend on the WMS version. |
210 | 263 |
request = new URL(buildGetFeatureInfoRequest(status, x, y)); |
264 |
|
|
265 |
//TODO: |
|
266 |
//see which output format is being requested. |
|
211 | 267 |
} |
212 | 268 |
catch(Exception e) |
213 | 269 |
{ |
... | ... | |
216 | 272 |
|
217 | 273 |
try |
218 | 274 |
{ |
275 |
StringBuffer sb = new StringBuffer(); |
|
276 |
sb.append("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>"); |
|
277 |
|
|
219 | 278 |
System.out.println(request.toString()); |
220 |
File f = new File("featureInfo.xml"); |
|
221 |
DataOutputStream dos = new DataOutputStream(new FileOutputStream(f)); |
|
222 |
|
|
223 |
byte[] buffer = new byte[1024*256]; |
|
224 |
InputStream is = request.openStream(); |
|
225 |
//long readed = 0; |
|
226 |
for (int i = is.read(buffer); i>0; i = is.read(buffer)){ |
|
227 |
dos.write(buffer, 0, i); |
|
228 |
output.append(buffer); |
|
229 |
//readed += i; |
|
230 |
} |
|
231 |
dos.close(); |
|
279 |
//File f = new File("featureInfo.xml"); |
|
280 |
//DataOutputStream dos = new DataOutputStream(new FileOutputStream(f)); |
|
281 |
byte[] buffer = new byte[1024*256]; |
|
282 |
InputStream is = request.openStream(); |
|
283 |
outputFormat = request.openConnection().getContentType(); |
|
232 | 284 |
|
233 |
StringBuffer sb = new StringBuffer(); |
|
234 |
sb.append("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>"); |
|
235 |
int tag; |
|
236 |
KXmlParser kxmlParser = null; |
|
237 |
kxmlParser = new KXmlParser(); |
|
238 |
kxmlParser.setInput(new FileReader(f)); |
|
239 |
tag = kxmlParser.nextTag(); |
|
240 |
if ( kxmlParser.getEventType() != KXmlParser.END_DOCUMENT ) |
|
241 |
{ |
|
242 |
//tag = kxmlParser.nextTag(); |
|
243 |
while(tag != KXmlParser.END_DOCUMENT) |
|
244 |
{ |
|
245 |
switch(tag) |
|
285 |
if ( (outputFormat == null) || (outputFormat.indexOf("xml") != -1)) |
|
286 |
{ |
|
287 |
for (int i = is.read(buffer); i>0; i = is.read(buffer)){ |
|
288 |
//dos.write(buffer, 0, i); |
|
289 |
output.append(buffer); |
|
290 |
} |
|
291 |
//dos.close(); |
|
292 |
is.close(); |
|
293 |
|
|
294 |
int tag; |
|
295 |
KXmlParser kxmlParser = null; |
|
296 |
kxmlParser = new KXmlParser(); |
|
297 |
//kxmlParser.setInput(new FileReader(f)); |
|
298 |
kxmlParser.setInput(new StringReader(output.toString())); |
|
299 |
tag = kxmlParser.nextTag(); |
|
300 |
if ( kxmlParser.getEventType() != KXmlParser.END_DOCUMENT ) |
|
301 |
{ |
|
302 |
while(tag != KXmlParser.END_DOCUMENT) |
|
246 | 303 |
{ |
247 |
case KXmlParser.START_TAG: |
|
248 |
sb.append("<" + kxmlParser.getName() + ">\n"); |
|
304 |
switch(tag) |
|
305 |
{ |
|
306 |
case KXmlParser.START_TAG: |
|
307 |
if (kxmlParser.getName().compareTo(ServiceException)==0) |
|
308 |
return parseException( output.toString().getBytes()); |
|
309 |
else |
|
310 |
sb.append("<" + kxmlParser.getName() + ">\n"); |
|
311 |
break; |
|
312 |
case KXmlParser.END_TAG: |
|
313 |
sb.append("</" + kxmlParser.getName() + ">\n"); |
|
314 |
break; |
|
315 |
case KXmlParser.TEXT: |
|
316 |
sb.append(kxmlParser.getText()); |
|
249 | 317 |
break; |
250 |
case KXmlParser.END_TAG: |
|
251 |
sb.append("</" + kxmlParser.getName() + ">\n"); |
|
252 |
break; |
|
253 |
case KXmlParser.TEXT: |
|
254 |
sb.append(kxmlParser.getText()); |
|
255 |
break; |
|
256 |
} |
|
257 |
tag = kxmlParser.next(); |
|
258 |
} |
|
259 |
} |
|
260 |
System.out.println(sb.toString()); |
|
261 |
return sb.toString(); |
|
262 |
//return output.toString() ; |
|
263 |
} |
|
318 |
} |
|
319 |
tag = kxmlParser.next(); |
|
320 |
} |
|
321 |
} |
|
322 |
//System.out.println(sb.toString()); |
|
323 |
return sb.toString(); |
|
324 |
} |
|
325 |
else |
|
326 |
{ |
|
327 |
sb.append("<INFO>").append(PluginServices.getText(this, "info_format_not_supported")).append("</INFO>"); |
|
328 |
return sb.toString(); |
|
329 |
} |
|
330 |
} |
|
264 | 331 |
catch(Exception e) |
265 | 332 |
{ |
266 | 333 |
e.printStackTrace(); |
267 |
return null;
|
|
334 |
return "";
|
|
268 | 335 |
} |
269 | 336 |
} |
270 | 337 |
|
... | ... | |
454 | 521 |
fax = new String(); |
455 | 522 |
email = new String(); |
456 | 523 |
formats = new Vector(); |
457 |
operations = new Vector(); |
|
524 |
operations = new Vector();
|
|
458 | 525 |
} |
526 |
public boolean isQueryable() |
|
527 |
{ |
|
528 |
if (operations.contains( CapabilitiesTags.GETFEATUREINFO )) |
|
529 |
return true; |
|
530 |
else |
|
531 |
return false; |
|
532 |
} |
|
459 | 533 |
} |
460 | 534 |
} |
Also available in: Unified diff