Revision 11381 trunk/libraries/libRemoteServices/src/org/gvsig/remoteClient/wms/wms_1_1_1/WMSProtocolHandler1_1_1.java

View differences:

WMSProtocolHandler1_1_1.java
8 8
import java.io.FileNotFoundException;
9 9
import java.io.FileReader;
10 10
import java.io.IOException;
11
import java.io.StringReader;
11 12
import java.util.ArrayList;
12 13
import java.util.TreeMap;
13 14

  
......
23 24
 */
24 25
public class WMSProtocolHandler1_1_1 extends org.gvsig.remoteClient.wms.WMSProtocolHandler {
25 26
	private WMSLayer1_1_1 fakeRootLayer;
26
    
27

  
27 28
	public WMSProtocolHandler1_1_1()
28 29
	{
29 30
		this.version = "1.1.1";
30 31
		this.name = "WMS1.1.1";
31
		this.serviceInfo = new ServiceInformation(); 
32
		this.serviceInfo = new ServiceInformation();
32 33
		this.layers = new TreeMap();
33 34
	}
34
    
35

  
35 36
//------------------------------------------------------------------------------
36
// Parsing methods....    
37
//------------------------------------------------------------------------------    
37
// Parsing methods....
38
//------------------------------------------------------------------------------
38 39
/**
39 40
 * <p>Parse the xml data retrieved from the WMS, it will parse the WMS Capabilities</p>
40
 * 
41
 *
41 42
 */
42 43
    public void parse(File f)
43
    {      
44
    {
44 45
    	rootLayer = null;
45
    	FileReader reader = null;    	
46
    	FileReader reader = null;
46 47
    	try
47 48
    	{
48 49
    		reader = new FileReader(f);
49 50
    		BufferedReader br = new BufferedReader(reader);
50 51
    		char[] buffer = new char[100];
51 52
    		br.read(buffer);
52
    		StringBuffer st = new StringBuffer(new String(buffer));
53
    		String string = new String(buffer);
54

  
55
    		 // patch for ArcIMS + WMS connector > 9.0 bug
56
            int a = string.toLowerCase().indexOf("<?xml");
57
            if (a !=-1)
58
            	string = string.substring(a, string.length());
59
            // end patch
60

  
61
    		StringBuffer st = new StringBuffer(string);
53 62
    		String searchText = "encoding=\"";
54 63
    		int index = st.indexOf(searchText);
55 64
    		if (index>-1) {
......
61 70
    	} catch (IOException e) {
62 71
			e.printStackTrace();
63 72
		}
64
    	
73

  
65 74
    	int tag;
66 75
    	KXmlParser kxmlParser = null;
67 76
    	kxmlParser = new KXmlParser();
68 77
    	try
69 78
    	{
70
    		kxmlParser.setInput(new FileInputStream(f), encoding);
79
    		reader = new FileReader(f);
80
    		BufferedReader br = new BufferedReader(reader);
81

  
82
    		 // patch for ArcIMS + WMS connector > 9.0 bug
83
    		char[] buffer = new char[(int) f.length()];
84
    		br.read(buffer);
85
    		String string = new String(buffer);
86
    		int a = string.toLowerCase().indexOf("<?xml");
87
            if (a !=-1) {
88
            	string = string.substring(a, string.length());
89
            	kxmlParser.setInput(new StringReader(string));
90
            } else
91
            	// end patch
92
            	kxmlParser.setInput(new FileInputStream(f), encoding);
93

  
71 94
			kxmlParser.nextTag();
72
    		if ( kxmlParser.getEventType() != KXmlParser.END_DOCUMENT ) 
73
    		{    		
74
    			kxmlParser.require(KXmlParser.START_TAG, null, CapabilitiesTags.CAPABILITIES_ROOT1_1_1);    			
95
    		if ( kxmlParser.getEventType() != KXmlParser.END_DOCUMENT )
96
    		{
97
    			kxmlParser.require(KXmlParser.START_TAG, null, CapabilitiesTags.CAPABILITIES_ROOT1_1_1);
75 98
    			tag = kxmlParser.nextTag();
76 99
				 while(tag != KXmlParser.END_DOCUMENT)
77 100
				 {
78 101
                     switch(tag)
79 102
					 {
80
                         
103

  
81 104
						case KXmlParser.START_TAG:
82 105
							if (kxmlParser.getName().compareTo(CapabilitiesTags.SERVICE )==0)
83 106
							{
84 107
								parseServiceTag(kxmlParser);
85
							}	
108
							}
86 109
							else if (kxmlParser.getName().compareTo(CapabilitiesTags.CAPABILITY)==0)
87 110
							{
88 111
								parseCapabilityTag(kxmlParser);
89 112
							}
90 113
							break;
91
						case KXmlParser.END_TAG:							
114
						case KXmlParser.END_TAG:
92 115
							break;
93 116
						case KXmlParser.TEXT:
94
							//System.out.println("[TEXT]["+kxmlParser.getText()+"]");							
117
							//System.out.println("[TEXT]["+kxmlParser.getText()+"]");
95 118
						break;
96 119
					 }
97 120
    				 tag = kxmlParser.next();
......
102 125
    	catch(XmlPullParserException parser_ex){
103 126
    		parser_ex.printStackTrace();
104 127
    	}
105
   		catch (IOException ioe) {			
128
   		catch (IOException ioe) {
106 129
   			ioe.printStackTrace();
107 130
		} finally {
108
            
131

  
109 132
        }
110
   		// In the parsing process the layer has been filled  		
111
    } 
112
    
133
   		// In the parsing process the layer has been filled
134
    }
135

  
113 136
    /**
114 137
     * <p>Parses the Service Information </p>
115
     */    
116
    private void parseServiceTag(KXmlParser parser) throws IOException, XmlPullParserException 
138
     */
139
    private void parseServiceTag(KXmlParser parser) throws IOException, XmlPullParserException
117 140
    {
118 141
    	int currentTag;
119 142
    	boolean end = false;
120
    	
143

  
121 144
    	parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.SERVICE);
122 145
    	currentTag = parser.next();
123
    	
124
    	while (!end) 
146

  
147
    	while (!end)
125 148
    	{
126 149
			 switch(currentTag)
127 150
			 {
128 151
				case KXmlParser.START_TAG:
129 152
					if (parser.getName().compareTo(CapabilitiesTags.NAME)==0)
130 153
					{
131
						serviceInfo.name = parser.nextText(); 
132
					}	
154
						serviceInfo.name = parser.nextText();
155
					}
133 156
					else if (parser.getName().compareTo(CapabilitiesTags.TITLE)==0)
134 157
					{
135
						serviceInfo.title = parser.nextText(); 
158
						serviceInfo.title = parser.nextText();
136 159
					}
137 160
					else if (parser.getName().compareTo(CapabilitiesTags.ABSTRACT)==0)
138 161
					{
139
						serviceInfo.abstr = parser.nextText(); 
162
						serviceInfo.abstr = parser.nextText();
140 163
					}
141 164
					else if (parser.getName().compareTo(CapabilitiesTags.ONLINERESOURCE)==0)
142 165
					{
......
150 173
							(parser.getName().compareTo(CapabilitiesTags.CONTACTINFORMATION)==0))
151 174
					{
152 175
						parser.skipSubTree();
153
					}					
176
					}
154 177
					break;
155 178
				case KXmlParser.END_TAG:
156 179
					if (parser.getName().compareTo(CapabilitiesTags.SERVICE) == 0)
157 180
						end = true;
158 181
					break;
159
				case KXmlParser.TEXT:					
182
				case KXmlParser.TEXT:
160 183
				break;
161 184
			 }
162 185
             if (!end)
......
166 189
    }
167 190
    /**
168 191
     * <p>Parses the Capability Tag </p>
169
     */    
192
     */
170 193
    private void parseCapabilityTag(KXmlParser parser) throws IOException, XmlPullParserException
171
    { 	
194
    {
172 195
    	int currentTag;
173 196
    	boolean end = false;
174
 
197

  
175 198
    	parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.CAPABILITY);
176 199
    	currentTag = parser.next();
177
    	
178
    	while (!end) 
200

  
201
    	while (!end)
179 202
    	{
180 203
			 switch(currentTag)
181 204
			 {
182 205
				case KXmlParser.START_TAG:
183 206
					if (parser.getName().compareTo(CapabilitiesTags.REQUEST)==0)
184 207
					{
185
						parseRequestTag(parser); 
186
					}	
208
						parseRequestTag(parser);
209
					}
187 210
					else if (parser.getName().compareTo(CapabilitiesTags.EXCEPTION)==0)
188 211
					{
189 212
						//TODO:
......
193 216
					{
194 217
						WMSLayer1_1_1 lyr = new WMSLayer1_1_1();
195 218
						lyr.parse(parser, layers);
196
						
219

  
197 220
                        if (rootLayer == null)
198 221
                            rootLayer = lyr;
199 222
                        else {
......
206 229
                            }
207 230
                            rootLayer.getChildren().add(lyr);
208 231
                        }
209
			
232

  
210 233
                        if (lyr.getName()!=null)
211
						    layers.put(lyr.getName(), lyr); 
212
                                                
213
//                        Collection layerCollection = layers.values(); 
234
						    layers.put(lyr.getName(), lyr);
235

  
236
//                        Collection layerCollection = layers.values();
214 237
//                        Iterator iter = layerCollection.iterator();
215 238
//                        while (iter.hasNext())
216 239
//                        {
217
//                        	WMSLayer1_1_1 layer = (WMSLayer1_1_1)iter.next(); 
240
//                        	WMSLayer1_1_1 layer = (WMSLayer1_1_1)iter.next();
218 241
//    						//Add all the SRS that the layer supports to the WMSProtocolHandler if they dont exist already
219 242
//    						for (i=0;i<layer.getAllSrs().size();i++)
220
//    						{   							
243
//    						{
221 244
////    						    if (!layer.srs.contains(layer.getAllSrs().elementAt(i)))
222 245
////    						    {
223 246
////    						        this.srs.add(layer.getAllSrs().elementAt(i));
224 247
////    						    }
225
//    						}                        	
226
//                        }						
248
//    						}
249
//                        }
227 250
					}
228 251
					else if ((parser.getName().compareTo(CapabilitiesTags.VENDORSPECIFICCAPABILITIES)==0) ||
229 252
							(parser.getName().compareTo(CapabilitiesTags.USERDEFINEDSYMBOLIZATION )==0))
230
                            
253

  
231 254
					{
232 255
						parser.skipSubTree();
233
					}					
256
					}
234 257
					break;
235 258
				case KXmlParser.END_TAG:
236 259
					if (parser.getName().compareTo(CapabilitiesTags.CAPABILITY) == 0)
237 260
						end = true;
238 261
					break;
239
				case KXmlParser.TEXT:					
262
				case KXmlParser.TEXT:
240 263
				break;
241 264
			 }
242 265
			 if (!end)
243 266
				 currentTag = parser.next();
244 267
    	}
245
    	//parser.require(KXmlParser.END_TAG, null, CapabilitiesTags.CAPABILITY);    	
268
    	//parser.require(KXmlParser.END_TAG, null, CapabilitiesTags.CAPABILITY);
246 269
    }
247
    
270

  
248 271
    /**
249 272
     * <p>Parses the Request tag </p>
250
     */ 
273
     */
251 274
    private void parseRequestTag(KXmlParser parser) throws IOException, XmlPullParserException
252
    {	
275
    {
253 276
    	int currentTag;
254 277
    	boolean end = false;
255
    	
278

  
256 279
    	parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.REQUEST);
257 280
    	currentTag = parser.next();
258
    	
259
    	while (!end) 
281

  
282
    	while (!end)
260 283
    	{
261 284
			 switch(currentTag)
262 285
			 {
263 286
				case KXmlParser.START_TAG:
264 287
					if (parser.getName().compareTo(CapabilitiesTags.GETCAPABILITIES)==0)
265 288
					{
266
						serviceInfo.operations.put(CapabilitiesTags.GETCAPABILITIES, null); 
267
					}	
289
						serviceInfo.operations.put(CapabilitiesTags.GETCAPABILITIES, null);
290
					}
268 291
					else if (parser.getName().compareTo(CapabilitiesTags.GETMAP)==0)
269 292
					{
270 293
						// put a null to this key?
271 294
						// or leave it like it was with a CODE in a vector specifying this operation.
272
						// WMSProtocolHandler.GETMAP_OPERATION 
273
						serviceInfo.operations.put(CapabilitiesTags.GETMAP, null); 
295
						// WMSProtocolHandler.GETMAP_OPERATION
296
						serviceInfo.operations.put(CapabilitiesTags.GETMAP, null);
274 297
						parseGetMapTag(parser);
275 298
					}
276 299
					else if (parser.getName().compareTo(CapabilitiesTags.GETFEATUREINFO)==0)
......
278 301
						//serviceInfo.operations.put(WMSProtocolHandler.GETFEATUREINFO_OPERATION)
279 302
						serviceInfo.operations.put(CapabilitiesTags.GETFEATUREINFO, null);
280 303
						parseGetFeatureInfoTag(parser);
281
					}		
304
					}
282 305
					else if (parser.getName().compareTo(CapabilitiesTags.DESCRIBELAYER)==0)
283 306
					{
284 307
						//serviceInfo.operations.put(WMSProtocolHandler.DESCRIBELAYER_OPERATION)
285
						serviceInfo.operations.put(CapabilitiesTags.DESCRIBELAYER, null); 
286
					}		
308
						serviceInfo.operations.put(CapabilitiesTags.DESCRIBELAYER, null);
309
					}
287 310
					else if (parser.getName().compareTo(CapabilitiesTags.GETLEGENDGRAPHIC)==0)
288 311
					{
289 312
						serviceInfo.operations.put(CapabilitiesTags.GETLEGENDGRAPHIC, null);
......
294 317
					if (parser.getName().compareTo(CapabilitiesTags.REQUEST) == 0)
295 318
						end = true;
296 319
					break;
297
				case KXmlParser.TEXT:					
320
				case KXmlParser.TEXT:
298 321
				break;
299 322
			 }
300 323
			 if(!end)
301 324
				 currentTag = parser.next();
302 325
    	}
303 326
    	// TODO: does not get such a tag when arrives here!!!!!!
304
    	//parser.require(KXmlParser.END_TAG, null, CapabilitiesTags.REQUEST);    	
327
    	//parser.require(KXmlParser.END_TAG, null, CapabilitiesTags.REQUEST);
305 328
    }
306
    
329

  
307 330
    /**
308 331
     * <p>Parses the GetMap tag </p>
309
     */ 
332
     */
310 333
    private void parseGetMapTag(KXmlParser parser) throws IOException, XmlPullParserException
311
    {	
334
    {
312 335
    	int currentTag;
313 336
    	boolean end = false;
314
    	
337

  
315 338
    	parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.GETMAP);
316 339
    	currentTag = parser.next();
317
    	
318
    	while (!end) 
340

  
341
    	while (!end)
319 342
    	{
320 343
			 switch(currentTag)
321 344
			 {
......
323 346
					if (parser.getName().compareTo(CapabilitiesTags.FORMAT)==0)
324 347
					{
325 348
						serviceInfo.formats.add(parser.nextText());
326
					}	
349
					}
327 350
					else if (parser.getName().compareTo(CapabilitiesTags.DCPTYPE)==0)
328
					{			
351
					{
329 352
						currentTag = parser.nextTag();
330 353
						if(parser.getName().compareTo(CapabilitiesTags.HTTP)==0)
331 354
						{
......
343 366
								}
344 367
							}
345 368
						}
346
					}			
369
					}
347 370
					break;
348 371
				case KXmlParser.END_TAG:
349 372
					if (parser.getName().compareTo(CapabilitiesTags.GETMAP) == 0)
350 373
						end = true;
351 374
					break;
352
				case KXmlParser.TEXT:					
375
				case KXmlParser.TEXT:
353 376
				break;
354 377
			 }
355 378
			 if(!end)
356 379
				 currentTag = parser.next();
357
    	}	
358
    }    
359
    
380
    	}
381
    }
382

  
360 383
    /**
361 384
     * <p>Parses the GetFeatureInfoTag tag </p>
362
     */ 
385
     */
363 386
    private void parseGetFeatureInfoTag(KXmlParser parser) throws IOException, XmlPullParserException
364
    {	
387
    {
365 388
    	int currentTag;
366 389
    	boolean end = false;
367
    	
390

  
368 391
    	parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.GETFEATUREINFO);
369 392
    	currentTag = parser.next();
370
    	
371
    	while (!end) 
393

  
394
    	while (!end)
372 395
    	{
373 396
			 switch(currentTag)
374 397
			 {
......
378 401
						//TODO:
379 402
						// add the supported formats by the GetFeatureInfo request
380 403
						//serviceInfo.formats.add(parser.nextText());
381
					}	
404
					}
382 405
					else if (parser.getName().compareTo(CapabilitiesTags.DCPTYPE)==0)
383
					{			
406
					{
384 407
						currentTag = parser.nextTag();
385 408
						if(parser.getName().compareTo(CapabilitiesTags.HTTP)==0)
386 409
						{
......
398 421
								}
399 422
							}
400 423
						}
401
					}			
424
					}
402 425
					break;
403 426
				case KXmlParser.END_TAG:
404 427
					if (parser.getName().compareTo(CapabilitiesTags.GETFEATUREINFO) == 0)
405 428
						end = true;
406 429
					break;
407
				case KXmlParser.TEXT:					
430
				case KXmlParser.TEXT:
408 431
				break;
409 432
			 }
410 433
			 if(!end)
411 434
				 currentTag = parser.next();
412
    	}	
413
    }         
435
    	}
436
    }
414 437

  
415 438
    /**
416 439
     * <p>Parses the GetFeatureInfoTag tag </p>
417
     */ 
440
     */
418 441
    private void parseGetLegendGraphicTag(KXmlParser parser) throws IOException, XmlPullParserException
419
    {	
442
    {
420 443
    	int currentTag;
421 444
    	boolean end = false;
422
    	
445

  
423 446
    	parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.GETLEGENDGRAPHIC);
424 447
    	currentTag = parser.next();
425
    	
426
    	while (!end) 
448

  
449
    	while (!end)
427 450
    	{
428 451
			 switch(currentTag)
429 452
			 {
......
433 456
						//TODO:
434 457
						// add the supported formats by the GetLegendGraphic request
435 458
						//serviceInfo.formats.add(parser.nextText());
436
					}	
459
					}
437 460
					else if (parser.getName().compareTo(CapabilitiesTags.DCPTYPE)==0)
438
					{			
461
					{
439 462
						currentTag = parser.nextTag();
440 463
						if(parser.getName().compareTo(CapabilitiesTags.HTTP)==0)
441 464
						{
......
453 476
								}
454 477
							}
455 478
						}
456
					}			
479
					}
457 480
					break;
458 481
				case KXmlParser.END_TAG:
459 482
					if (parser.getName().compareTo(CapabilitiesTags.GETLEGENDGRAPHIC) == 0)
460 483
						end = true;
461 484
					break;
462
				case KXmlParser.TEXT:					
485
				case KXmlParser.TEXT:
463 486
				break;
464 487
			 }
465 488
			 if(!end)
466 489
				 currentTag = parser.next();
467
    	}	
468
    }    
469
    
470
    
490
    	}
491
    }
492

  
493

  
471 494
    private WMSLayer1_1_1 getFakeRootLayer(){
472 495
        if (fakeRootLayer == null){
473 496
            fakeRootLayer = new WMSLayer1_1_1();
......
485 508
        KXmlParser kxmlParser = new KXmlParser();
486 509
        try
487 510
        {
488
            kxmlParser.setInput(new ByteArrayInputStream(data), encoding);        
511
            kxmlParser.setInput(new ByteArrayInputStream(data), encoding);
489 512
            int tag;
490
            
513

  
491 514
            boolean end = false;
492 515
            tag = kxmlParser.nextTag();
493
            
516

  
494 517
            //Comentar temporalmente para subsanar el hecho de que SimonCit me devuelve las capabilities en un GetLegendGraphic!!!
495 518
            kxmlParser.require(KXmlParser.START_TAG, null, ExceptionTags.EXCEPTION_ROOT);
496
            
497
            while (!end) 
519

  
520
            while (!end)
498 521
            {
499 522
                switch(tag)
500 523
                {
......
506 529
                                errors.add(errorCode+errorMessage);
507 530
                            }
508 531
                            break;
509
                    case KXmlParser.END_TAG:   
532
                    case KXmlParser.END_TAG:
510 533
                            if (kxmlParser.getName().compareTo(ExceptionTags.EXCEPTION_ROOT) == 0)
511 534
                                end = true;
512
                            break; 
535
                            break;
513 536
                     }
514 537
                	if (!end)
515 538
                	{
......
521 544
            System.out.println(parser_ex.getMessage());
522 545
            parser_ex.printStackTrace();
523 546
        }
524
        catch (IOException ioe) {           
525
            ioe.printStackTrace();            
547
        catch (IOException ioe) {
548
            ioe.printStackTrace();
526 549
        }
527 550
        String message = errors.size()>0? "" : null;
528 551
        for (int i = 0; i < errors.size(); i++) {
......
530 553
        }
531 554
        return message;
532 555
    }
533
    
556

  
534 557
  }

Also available in: Unified diff