Revision 3798 trunk/libraries/libRemoteServices/src/org/gvsig/remoteClient/wms/WMSProtocolHandler.java

View differences:

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