Revision 29649

View differences:

branches/v2_0_0_prep/libraries/libRemoteServices/src/org/gvsig/remoteClient/wcs/wcs_1_0_0/WCSCoverage1_0_0.java
1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2005 IVER T.I. and Generalitat Valenciana.
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., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 *
19
 * For more information, contact:
20
 *
21
 *  Generalitat Valenciana
22
 *   Conselleria d'Infraestructures i Transport
23
 *   Av. Blasco Ib??ez, 50
24
 *   46010 VALENCIA
25
 *   SPAIN
26
 *
27
 *      +34 963862235
28
 *   gvsig@gva.es
29
 *      www.gvsig.gva.es
30
 *
31
 *    or
32
 *
33
 *   IVER T.I. S.A
34
 *   Salamanca 50
35
 *   46005 Valencia
36
 *   Spain
37
 *
38
 *   +34 963163400
39
 *   dac@iver.es
40
 */
41
/**
42
 *
43
 */
44
package org.gvsig.remoteClient.wcs.wcs_1_0_0;
45

  
46

  
47
import java.io.IOException;
48

  
49
import org.gvsig.remoteClient.utils.BoundaryBox;
50
import org.gvsig.remoteClient.utils.DescribeCoverageTags;
51
import org.gvsig.remoteClient.wcs.WCSCoverage;
52
import org.kxml2.io.KXmlParser;
53
import org.xmlpull.v1.XmlPullParserException;
54

  
55
/**
56
 * @author jaume
57
 *
58
 */
59
public class WCSCoverage1_0_0 extends WCSCoverage{
60
	String axisDescriptionName;
61

  
62
	/* (non-Javadoc)
63
     * @see org.gvsig.remoteClient.wcs.WCSLayer#parse(org.kxml2.io.KXmlParser)
64
     */
65
    public void parse(KXmlParser parser) throws XmlPullParserException, IOException {
66
        int currentTag;
67
        String value;
68
        boolean end = false;
69

  
70
        parser.require(KXmlParser.START_TAG, null, DescribeCoverageTags.COVERAGE_OFFERING);
71
        currentTag = parser.next();
72

  
73
        while (!end)
74
        {
75
             switch(currentTag)
76
             {
77
                case KXmlParser.START_TAG:
78
                    if (parser.getName().compareTo(DescribeCoverageTags.NAME)==0)
79
                    {
80
                        value = parser.nextText();
81
                        if (value != null) setName(value);
82
                    } else if (parser.getName().compareTo(DescribeCoverageTags.LABEL)==0){
83
                        value = parser.nextText();
84
                        if (value != null) setTitle(value);
85
                    } else if (parser.getName().compareTo(DescribeCoverageTags.LONLAT_ENVELOPE)==0){
86
                    	BoundaryBox bBox = parseLonLatGMLEnvelope(parser);
87
                        bBox.setSrs(DescribeCoverageTags.WGS84);
88
                        addBBox(bBox);
89
                        setLonLatBox(bBox);
90
                    } else if (parser.getName().compareTo(DescribeCoverageTags.DOMAINSET) == 0) {
91
                    	parseDomainSet(parser);
92
                    } else if (parser.getName().compareTo(DescribeCoverageTags.RANGESET) == 0) {
93
                    	parseRangeSet(parser);
94
                    } else if (parser.getName().compareTo(DescribeCoverageTags.SUPPORTED_CRSS) == 0) {
95
                    	parseSupportedCRSS(parser);
96
                    } else if (parser.getName().compareTo(DescribeCoverageTags.SUPPORTED_FORMATS) == 0) {
97
                    	setNativeFormat(parser.getAttributeValue("", DescribeCoverageTags.NATIVE_FORMAT));
98
                    	parser.nextTag();
99
                    	parser.require(KXmlParser.START_TAG, null, DescribeCoverageTags.FORMATS);
100
                    	while (parser.getName().compareTo(DescribeCoverageTags.FORMATS) == 0) {
101
                    		String[] formats = parser.nextText().split(SEPARATOR);
102
                    		for (int i = 0; i < formats.length; i++) {
103
                    			addFormat(formats[i]);
104
                    		}
105
                    		parser.nextTag();
106
                    	}
107
                    } else if (parser.getName().compareTo(DescribeCoverageTags.SUPPORTED_INTERPOLATIONS) == 0) {
108
                    	boolean bInterpolationsEnd = false;
109
                    	int interpolationsTag = parser.next();
110
                    	while (!bInterpolationsEnd) {
111
                    		switch(interpolationsTag) {
112
	                    		case KXmlParser.START_TAG:
113
	                    			if (parser.getName().compareTo(DescribeCoverageTags.INTERPOLATION_METHOD)==0) {
114
	                    				addInterpolationMethod(parser.nextText());
115
	                    			}
116
	                    			break;
117
	                    		case KXmlParser.END_TAG:
118
	                    			if (parser.getName().compareTo(DescribeCoverageTags.SUPPORTED_INTERPOLATIONS) == 0)
119
	                    				bInterpolationsEnd = true;
120
	                    			break;
121
	                    		case KXmlParser.TEXT:
122
	                    			if (parser.getName()!=null)
123
	                    				System.out.println("[TAG]["+parser.getName()+"]\n[TEXT]["+parser.getText().trim()+"]");
124
	                    			break;
125
                    		}
126
                    		interpolationsTag = parser.next();
127
                    	}
128
                    } else {
129
                    	if (!parser.getName().equals("rangeSet")) // just a patch to avoid too much messages
130
                    		System.out.println("Skiped "+parser.getName());
131
                    }
132

  
133
                    break;
134
                case KXmlParser.END_TAG:
135
                    if (parser.getName().compareTo(DescribeCoverageTags.COVERAGE_OFFERING) == 0)
136
                        end = true;
137
                    break;
138
                case KXmlParser.TEXT:
139
                	if (parser.getName()!=null)
140
                		System.out.println("[TAG]["+parser.getName()+"]\n[TEXT]["+parser.getText().trim()+"]");
141
                	break;
142
             }
143
             currentTag = parser.next();
144
        }
145
    }
146

  
147
    private void parseSupportedCRSS(KXmlParser parser) throws XmlPullParserException, IOException {
148
    	int currentTag;
149
    	boolean end = false;
150

  
151
    	parser.require(KXmlParser.START_TAG, null, DescribeCoverageTags.SUPPORTED_CRSS);
152
    	currentTag = parser.next();
153

  
154
    	while (!end)
155
    	{
156
    		switch(currentTag)
157
    		{
158
	    		case KXmlParser.START_TAG:
159
	    			if (parser.getName().compareTo(DescribeCoverageTags.REQUEST_RESPONSE_CRSS)==0) {
160
	    				String[] values = parser.nextText().split(SEPARATOR);
161
	    				for (int i = 0; i < values.length; i++) {
162
							addSRSs(values[i]);
163
						}
164
	    			}
165
	    			else if (parser.getName().compareTo(DescribeCoverageTags.NATIVE_CRS) == 0) {
166
	    				setNativeSRS(parser.nextText());
167
	    			} else if (parser.getName().compareTo(DescribeCoverageTags.REQUEST_CRSS) == 0) {
168
	    				// TODO
169
                    	System.out.println("Skiped "+parser.getName());
170
	    			} else if (parser.getName().compareTo(DescribeCoverageTags.RESPONSE_CRSS) == 0) {
171
	    				// TODO
172
                    	System.out.println("Skiped "+parser.getName());
173
                    } else {
174
                    	System.out.println("Unrecognized "+parser.getName());
175
	    			}
176

  
177
	    			break;
178
	    		case KXmlParser.END_TAG:
179
	    			if (parser.getName().compareTo(DescribeCoverageTags.SUPPORTED_CRSS) == 0)
180
	    				return;//end = true;
181
	    			break;
182
	    		case KXmlParser.TEXT:
183
	    			if (parser.getName()!=null)
184
	    				System.out.println("[TAG]["+parser.getName()+"]\n[TEXT]["+parser.getText().trim()+"]");
185
	    			break;
186
    		}
187
    		currentTag = parser.next();
188
    	}
189
    }
190

  
191
	private void parseRangeSet(KXmlParser parser) throws XmlPullParserException, IOException {
192
		int currentTag;
193
        boolean end = false;
194

  
195
        parser.require(KXmlParser.START_TAG, null, DescribeCoverageTags.RANGESET);
196
        currentTag = parser.next();
197

  
198
        while (!end)
199
        {
200
             switch(currentTag)
201
             {
202
                case KXmlParser.START_TAG:
203
                    if (parser.getName().compareTo(DescribeCoverageTags.NAME)==0)
204
                    	setRangeSetName(parser.nextText());
205
                    else if (parser.getName().compareTo(DescribeCoverageTags.LABEL) == 0)
206
                    	setRangeSetLabel(parser.nextText());
207
                    else if (parser.getName().compareToIgnoreCase(DescribeCoverageTags.AXISDESCRIPTION) == 0) {
208
                    	// Reading all axe description
209
                    	int axisTag = parser.nextTag();
210
                    	boolean endAxe = false;
211
                    	while (!endAxe) {
212
                            switch(axisTag)
213
                            {
214
                               case KXmlParser.START_TAG:
215
                            	   if (parser.getName().compareTo(DescribeCoverageTags.AXISDESCRIPTION)==0) {
216
                            		   AxisDescription as = parseAxisDescription(parser);
217
                            		   axisPool.put(as.getName(), as);
218
                            		   axisDescriptionName = as.getName();
219
                            	   }
220
                            	   break;
221
                               case KXmlParser.END_TAG:
222
                                   if (parser.getName().compareToIgnoreCase(DescribeCoverageTags.AXISDESCRIPTION) == 0)
223
                                	   endAxe = true;
224
                                   break;
225
                               case KXmlParser.TEXT:
226
                            	   if (parser.getName()!=null)
227
                            		   System.out.println("[TAG]["+parser.getName()+"]\n[TEXT]["+parser.getText().trim()+"]");
228
                            	   break;
229
                            }
230
                            axisTag = parser.next();
231
                    	}
232
                    } else {
233
                    	System.out.println("Unrecognized "+parser.getName());
234
                    }
235
                    break;
236
                case KXmlParser.END_TAG:
237
                    if (parser.getName().compareTo(DescribeCoverageTags.RANGESET) == 0)
238
                        end = true;
239
                    break;
240
                case KXmlParser.TEXT:
241
                	if (parser.getName()!=null)
242
                		System.out.println("[TAG]["+parser.getName()+"]\n[TEXT]["+parser.getText().trim()+"]");
243
                	break;
244
             }
245
             currentTag = parser.next();
246
        }
247
	}
248

  
249
	private AxisDescription parseAxisDescription(KXmlParser parser) throws XmlPullParserException, IOException {
250
		int currentTag;
251
        boolean end = false;
252

  
253
        parser.require(KXmlParser.START_TAG, null, DescribeCoverageTags.AXISDESCRIPTION);
254
        AxisDescription as = new AxisDescription();
255
        currentTag = parser.next();
256

  
257
        while (!end)
258
        {
259
             switch(currentTag)
260
             {
261
                case KXmlParser.START_TAG:
262
                	if (parser.getName().compareTo(DescribeCoverageTags.NAME) == 0) {
263
                		as.setName(parser.nextText());
264
                	} else if (parser.getName().compareTo(DescribeCoverageTags.LABEL) == 0) {
265
                		as.setLabel(parser.nextText());
266
                	} else if (parser.getName().compareTo(DescribeCoverageTags.VALUES) == 0) {
267
                		int valuesTag = parser.nextTag();
268
                		boolean valuesEnd = false;
269
                		while (!valuesEnd) {
270
                			switch(valuesTag)	{
271
	                			case KXmlParser.START_TAG:
272
	                				if (parser.getName().compareTo(DescribeCoverageTags.SINGLEVALUE) == 0) {
273
	                					as.addSingleValues(parser.nextText());
274
	                				} else if (parser.getName().compareTo(DescribeCoverageTags.INTERVAL) == 0) {
275
	                					as.setInterval(parser.nextText());
276
	                				} else if (parser.getName().compareTo(DescribeCoverageTags.DEFAULT) == 0) {
277
	                					as.setDefaultValue(parser.nextText());
278
	                				}
279
	                				break;
280
	                			case KXmlParser.END_TAG:
281
	                				if (parser.getName().compareTo(DescribeCoverageTags.VALUES) == 0)
282
	                					valuesEnd = true;
283
	                				break;
284
	                			case KXmlParser.TEXT:
285
	                				if (parser.getName()!=null)
286
	                					System.out.println("[TAG]["+parser.getName()+"]\n[TEXT]["+parser.getText().trim()+"]");
287
	                				break;
288
	                			}
289
                			valuesTag = parser.next();
290
                		}
291
                	} else if (parser.getName().compareTo(DescribeCoverageTags.NULLVALUES)==0) {
292
                		// TODO
293
                		System.err.println("Missing NULL VALUE PARSING on WCS 1.0.0 Client");
294
                    } else {
295
                    	System.out.println("Unrecognized "+parser.getName());
296
                	}
297

  
298
                	break;
299
                case KXmlParser.END_TAG:
300
                    if (parser.getName().compareToIgnoreCase(DescribeCoverageTags.AXISDESCRIPTION) == 0)
301
                        end = true;
302
                    break;
303
                case KXmlParser.TEXT:
304
                	if (parser.getName()!=null)
305
                		System.out.println("[TAG]["+parser.getName()+"]\n[TEXT]["+parser.getText().trim()+"]");
306
                	break;
307
             }
308
             currentTag = parser.next();
309
        }
310
        return as;
311
	}
312

  
313
	private void parseDomainSet(KXmlParser parser) throws XmlPullParserException, IOException {
314
		int currentTag;
315
        boolean end = false;
316

  
317
        parser.require(KXmlParser.START_TAG, null, DescribeCoverageTags.DOMAINSET);
318
        currentTag = parser.next();
319

  
320
        while (!end)
321
        {
322
             switch(currentTag)
323
             {
324
                case KXmlParser.START_TAG:
325
                    if (parser.getName().compareTo(DescribeCoverageTags.SPATIALDOMAIN)==0)
326
                    {
327
                    	parseSpatialDomain(parser);
328
                    } else if (parser.getName().compareTo(DescribeCoverageTags.TEMPORALDOMAIN)==0) {
329
                    	parseTemporalDomain(parser);
330
                    }
331
                    break;
332
                case KXmlParser.END_TAG:
333
                    if (parser.getName().compareTo(DescribeCoverageTags.DOMAINSET) == 0)
334
                        end = true;
335
                    break;
336
                case KXmlParser.TEXT:
337
                	if (parser.getName()!=null)
338
                		System.out.println("[TAG]["+parser.getName()+"]\n[TEXT]["+parser.getText().trim()+"]");
339
                	break;
340
             }
341
             currentTag = parser.next();
342
        }
343
	}
344

  
345
	private void parseTemporalDomain(KXmlParser parser) throws XmlPullParserException, IOException {
346
		int currentTag;
347
        boolean end = false;
348

  
349
        parser.require(KXmlParser.START_TAG, null, DescribeCoverageTags.TEMPORALDOMAIN);
350
        currentTag = parser.next();
351

  
352
        while (!end)
353
        {
354
             switch(currentTag)
355
             {
356
                case KXmlParser.START_TAG:
357
                	if (parser.getName().compareTo(DescribeCoverageTags.GML_TIMEPOSITION) == 0) {
358
                		addTimePosition(parser.nextText());
359
                	} else if (parser.getName().compareTo(DescribeCoverageTags.TIMEPERIOD) == 0) {
360
                		boolean timePeriodEnd = false;
361
                		int timePeriodTag = parser.next();
362
                		String[] myTimePeriod = new String[3];
363
                		while (!timePeriodEnd) {
364
                			switch (timePeriodTag) {
365
                			case KXmlParser.START_TAG:
366
                				if (parser.getName().compareTo(DescribeCoverageTags.BEGINPOSITION) == 0) {
367
                					myTimePeriod[0] = parser.nextText();
368
                				} else if (parser.getName().compareTo(DescribeCoverageTags.ENDPOSITION) == 0) {
369
                					myTimePeriod[1] = parser.nextText();
370
                				} else if (parser.getName().compareTo(DescribeCoverageTags.TIMERESOLUTION) == 0) {
371
                					myTimePeriod[2] = parser.nextText();
372
                                } else {
373
                                	System.out.println("Unrecognized "+parser.getName());
374
                				}
375
                				break;
376
                			case KXmlParser.END_TAG:
377
                				if (parser.getName().compareTo(DescribeCoverageTags.TEMPORALDOMAIN) == 0)
378
                					end = true;
379
                				break;
380
                			case KXmlParser.TEXT:
381
                				if (parser.getName()!=null)
382
                					System.out.println("[TAG]["+parser.getName()+"]\n[TEXT]["+parser.getText().trim()+"]");
383
                				break;
384
                			}
385
                			timePeriodTag = parser.next();
386
                		}
387
                		super.timePeriod = "";
388
                		for (int i = 0; i < myTimePeriod.length-1; i++) {
389
                			if (myTimePeriod[i]!=null) {
390
                				super.timePeriod += myTimePeriod[i];
391
                			}
392
                			if (myTimePeriod[i+1]!=null) {
393
                				super.timePeriod += "/";
394
                			}
395
						}
396
                    } else {
397
                    	System.out.println("Unrecognized "+parser.getName());
398
                	}
399
                	break;
400
                case KXmlParser.END_TAG:
401
                    if (parser.getName().compareTo(DescribeCoverageTags.TEMPORALDOMAIN) == 0)
402
                        end = true;
403
                    break;
404
                case KXmlParser.TEXT:
405
                	if (parser.getName()!=null)
406
                		System.out.println("[TAG]["+parser.getName()+"]\n[TEXT]["+parser.getText().trim()+"]");
407
                	break;
408
             }
409
             currentTag = parser.next();
410
        }
411
	}
412

  
413
	private void parseSpatialDomain(KXmlParser parser) throws XmlPullParserException, IOException {
414
		int currentTag;
415
        boolean end = false;
416

  
417
        parser.require(KXmlParser.START_TAG, null, DescribeCoverageTags.SPATIALDOMAIN);
418
        currentTag = parser.next();
419

  
420
        while (!end)
421
        {
422
             switch(currentTag)
423
             {
424
                case KXmlParser.START_TAG:
425
                    if (parser.getName().compareTo(DescribeCoverageTags.GML_ENVELOPE)==0) {
426
                    	BoundaryBox bBox = parseGMLEnvelope(parser);
427
                    	addBBox(bBox);
428
                    } else if (parser.getName().compareTo(DescribeCoverageTags.GRID)==0) {
429
                    	parseGrid(parser);
430
                    } else if (parser.getName().compareTo(DescribeCoverageTags.RECTIFIEDGRID)==0) {
431
                    	parseRectifiedGrid(parser);
432
                    } else {
433
                    	System.out.println("Unrecognized "+parser.getName());
434
                    }
435
                    break;
436
                case KXmlParser.END_TAG:
437
                    if (parser.getName().compareTo(DescribeCoverageTags.SPATIALDOMAIN) == 0)
438
                        return;
439
                    break;
440
                case KXmlParser.TEXT:
441
                	if (parser.getName()!=null)
442
                		System.out.println("[TAG]["+parser.getName()+"]\n[TEXT]["+parser.getText().trim()+"]");
443
                	break;
444
             }
445
             currentTag = parser.next();
446
        }
447
 	}
448

  
449
	private void parseGrid(KXmlParser parser) throws XmlPullParserException, IOException {
450
		int currentTag;
451
		String value;
452
		boolean end = false;
453
		parser.require(KXmlParser.START_TAG, null, DescribeCoverageTags.GRID);
454
		rg = new RectifiedGrid(Integer.parseInt(parser.getAttributeValue("", DescribeCoverageTags.DIMENSION)));
455

  
456
		currentTag = parser.next();
457

  
458
		while (!end)
459
		{
460
			switch(currentTag)	{
461
			case KXmlParser.START_TAG:
462
				if (parser.getName().compareTo(DescribeCoverageTags.GML_LIMITS) == 0) {
463
					parser.nextTag();
464
					if (parser.getName().compareTo(DescribeCoverageTags.GML_GRIDENVELOPE)==0) {
465
						boolean gridEnd = false;
466
						int gridCurrentTag = parser.next();
467
						while (!gridEnd){
468
							switch (gridCurrentTag) {
469
							case KXmlParser.START_TAG:
470

  
471
								if (parser.getName().compareTo(DescribeCoverageTags.GML_LOW) == 0) {
472
									value = parser.nextText();
473
									String[] ss = value.split(SEPARATOR);
474
									int[] limits = new int[ss.length];
475
									for (int i = 0; i < limits.length; i++) {
476
										limits[i] = Integer.parseInt(ss[i]);
477
									}
478
									rg.addLowGridEnvelopLimit(limits);
479
								} else if (parser.getName().compareTo(DescribeCoverageTags.GML_HIGH) == 0) {
480
									value = parser.nextText();
481
									String[] ss = value.split(SEPARATOR);
482
									int[] limits = new int[ss.length];
483
									for (int i = 0; i < limits.length; i++) {
484
										limits[i] = Integer.parseInt(ss[i]);
485
									}
486
									rg.addHighGridEnvelopLimit(limits);
487
								} else {
488
									System.out.println("Unrecognized "+parser.getName());
489
								}
490
								break;
491
							case KXmlParser.END_TAG:
492
								if (parser.getName().compareTo(DescribeCoverageTags.GML_GRIDENVELOPE) == 0)
493
									gridEnd = true;
494
								break;
495
							case KXmlParser.TEXT:
496
								if (parser.getName()!=null)
497
									System.out.println("[TAG]["+parser.getName()+"]\n[TEXT]["+parser.getText().trim()+"]");
498
								break;
499
							}
500
							gridCurrentTag = parser.next();
501
						}
502
					}
503
				} else if (parser.getName().compareTo(DescribeCoverageTags.GML_AXISNAME)==0) {
504
					rg.addAxisName(parser.nextText());
505
				} else {
506
					System.out.println("Unrecognized "+parser.getName());
507
				}
508
				break;
509
			case KXmlParser.END_TAG:
510
				if (parser.getName().compareTo(DescribeCoverageTags.GRID) == 0)
511
					return;//end = true;
512
				break;
513
			case KXmlParser.TEXT:
514
				if (parser.getName()!=null)
515
					System.out.println("[TAG]["+parser.getName()+"]\n[TEXT]["+parser.getText().trim()+"]");
516
				break;
517
			}
518
			currentTag = parser.next();
519
		}
520
	}
521

  
522
	private void parseRectifiedGrid(KXmlParser parser) throws XmlPullParserException, IOException {
523
		int currentTag;
524
		String value;
525
		boolean end = false;
526
		parser.require(KXmlParser.START_TAG, null, DescribeCoverageTags.RECTIFIEDGRID);
527
		rg = new RectifiedGrid(Integer.parseInt(parser.getAttributeValue("", DescribeCoverageTags.DIMENSION)));
528

  
529
		// TODO maybe this is wrong
530
		rg.addToOffsetVector(new double[] { -1, -1});
531
		rg.addToOffsetVector(new double[] { -1, -1});
532

  
533
		currentTag = parser.next();
534

  
535
		while (!end)
536
		{
537
			switch(currentTag)
538
			{
539
			case KXmlParser.START_TAG:
540
				if (parser.getName().compareTo(DescribeCoverageTags.GML_LIMITS) == 0) {
541
					parser.nextTag();
542
					if (parser.getName().compareTo(DescribeCoverageTags.GML_GRIDENVELOPE)==0) {
543
						boolean gridEnd = false;
544
						int gridCurrentTag = parser.next();
545
						while (!gridEnd)
546
						{
547
							switch (gridCurrentTag) {
548
							case KXmlParser.START_TAG:
549

  
550
								if (parser.getName().compareTo(DescribeCoverageTags.GML_LOW) == 0) {
551
									value = parser.nextText();
552
									String[] ss = value.split(SEPARATOR);
553
									int[] limits = new int[ss.length];
554
									for (int i = 0; i < limits.length; i++) {
555
										limits[i] = Integer.parseInt(ss[i]);
556
									}
557
									rg.addLowGridEnvelopLimit(limits);
558
								} else if (parser.getName().compareTo(DescribeCoverageTags.GML_HIGH) == 0) {
559
									value = parser.nextText();
560
									String[] ss = value.split(SEPARATOR);
561
									int[] limits = new int[ss.length];
562
									for (int i = 0; i < limits.length; i++) {
563
										limits[i] = Integer.parseInt(ss[i]);
564
									}
565
									rg.addHighGridEnvelopLimit(limits);
566
								} else {
567
									System.out.println("Unrecognized "+parser.getName());
568
								}
569
								break;
570
							case KXmlParser.END_TAG:
571
								if (parser.getName().compareTo(DescribeCoverageTags.GML_GRIDENVELOPE) == 0)
572
									gridEnd = true;
573
								break;
574
							case KXmlParser.TEXT:
575
								if (parser.getName()!=null)
576
									System.out.println("[TAG]["+parser.getName()+"]\n[TEXT]["+parser.getText().trim()+"]");
577
								break;
578
							}
579
							gridCurrentTag = parser.next();
580
						}
581
					}
582
				} else if (parser.getName().compareTo(DescribeCoverageTags.GML_AXISNAME)==0) {
583
					rg.addAxisName(parser.nextText());
584
				} else if (parser.getName().compareTo(DescribeCoverageTags.GML_ORIGIN)==0) {
585
					parser.nextTag();
586
					if (parser.getName().compareTo(DescribeCoverageTags.GML_POS)==0) {
587
						value = parser.nextText();
588
						String[] ss = value.split(SEPARATOR);
589
						double[] ori = new double[ss.length];
590
						for (int i = 0; i < ori.length; i++) {
591
							ori[i] = Double.parseDouble(ss[i]);
592
						}
593
						rg.setOrigin(ori);
594
					}
595
				} else if (parser.getName().compareTo(DescribeCoverageTags.OFFSETVECTOR) == 0) {
596
					value = parser.nextText();
597
					String[] ss = value.split(SEPARATOR);
598
					double[] offset = new double[ss.length];
599
					for (int i = 0; i < offset.length; i++) {
600
						offset[i] = Double.parseDouble(ss[i]);
601
					}
602
					rg.addToOffsetVector(offset);
603
				} else {
604
					System.out.println("Unrecognized "+parser.getName());
605
				}
606
				break;
607
			case KXmlParser.END_TAG:
608
				if (parser.getName().compareTo(DescribeCoverageTags.RECTIFIEDGRID) == 0)
609
					end = true;
610
				break;
611
			case KXmlParser.TEXT:
612
				if (parser.getName()!=null)
613
					System.out.println("[TAG]["+parser.getName()+"]\n[TEXT]["+parser.getText().trim()+"]");
614
				break;
615
			}
616
			currentTag = parser.next();
617
		}
618
	}
619

  
620

  
621
	private BoundaryBox parseLonLatGMLEnvelope(KXmlParser parser) throws XmlPullParserException, IOException {
622
		BoundaryBox bBox = new BoundaryBox();
623
		int currentTag;
624
        String value;
625
        boolean end = false;
626

  
627
        parser.require(KXmlParser.START_TAG, null, DescribeCoverageTags.LONLAT_ENVELOPE);
628
        currentTag = parser.next();
629

  
630
        while (!end)
631
        {
632
             switch(currentTag)
633
             {
634
                case KXmlParser.START_TAG:
635
                    if (parser.getName().compareTo(DescribeCoverageTags.GML_POS)==0) {
636
                    	bBox.setSrs(DescribeCoverageTags.WGS84);
637
                    	String[] coordinates;
638
                    	double minx, miny, maxx, maxy;
639
                    	value = parser.nextText();
640
                    	coordinates = value.split(SEPARATOR);
641
                    	minx = Double.parseDouble(coordinates[0]);
642
                    	miny = Double.parseDouble(coordinates[1]);
643

  
644
                    	parser.nextTag();
645

  
646
                    	parser.require(KXmlParser.START_TAG, null, DescribeCoverageTags.GML_POS);
647
                    	value = parser.nextText();
648
                    	coordinates = value.split(SEPARATOR);
649
                    	maxx = Double.parseDouble(coordinates[0]);
650
                    	maxy = Double.parseDouble(coordinates[1]);
651

  
652
                    	bBox.setXmin(minx);
653
                    	bBox.setYmin(miny);
654
                    	bBox.setXmax(maxx);
655
                    	bBox.setYmax(maxy);
656
                    }
657
                    break;
658
                case KXmlParser.END_TAG:
659
                    if (parser.getName().compareTo(DescribeCoverageTags.LONLAT_ENVELOPE) == 0)
660
                        end = true;
661
                    break;
662
                case KXmlParser.TEXT:
663
                	if (parser.getName()!=null)
664
                		System.out.println("[TAG]["+parser.getName()+"]\n[TEXT]["+parser.getText().trim()+"]");
665
                	break;
666
             }
667
             currentTag = parser.next();
668
        }
669
        return bBox;
670
	}
671

  
672
	private BoundaryBox parseGMLEnvelope(KXmlParser parser) throws XmlPullParserException, IOException {
673
		BoundaryBox bBox = new BoundaryBox();
674
		int currentTag;
675
        String value;
676
        boolean end = false;
677

  
678
        parser.require(KXmlParser.START_TAG, null, DescribeCoverageTags.GML_ENVELOPE);
679
        bBox.setSrs(parser.getAttributeValue("", DescribeCoverageTags.SRSNAME));
680
        currentTag = parser.next();
681

  
682
        while (!end)
683
        {
684
             switch(currentTag)
685
             {
686
                case KXmlParser.START_TAG:
687
                	if (parser.getName().compareTo(DescribeCoverageTags.GML_POS)==0) {
688

  
689
                    	String[] coordinates;
690
                    	double minx, miny, maxx, maxy;
691
                    	value = parser.nextText();
692
                    	coordinates = value.split(SEPARATOR);
693
                    	minx = Double.parseDouble(coordinates[0]);
694
                    	miny = Double.parseDouble(coordinates[1]);
695

  
696
                    	parser.nextTag();
697
                    	//parser.nextTag();
698
                    	parser.require(KXmlParser.START_TAG, null, DescribeCoverageTags.GML_POS);
699
                    	value = parser.nextText();
700
                    	coordinates = value.split(SEPARATOR);
701
                    	maxx = Double.parseDouble(coordinates[0]);
702
                    	maxy = Double.parseDouble(coordinates[1]);
703

  
704
                    	bBox.setXmin(minx);
705
                    	bBox.setYmin(miny);
706
                    	bBox.setXmax(maxx);
707
                    	bBox.setYmax(maxy);
708
                    }
709
                    break;
710
                case KXmlParser.END_TAG:
711
                    if (parser.getName().compareTo(DescribeCoverageTags.GML_ENVELOPE) == 0)
712
                        end = true;
713
                    break;
714
                case KXmlParser.TEXT:
715
                	if (parser.getName()!=null)
716
                		System.out.println("[TAG]["+parser.getName()+"]\n[TEXT]["+parser.getText().trim()+"]");
717
                	break;
718
             }
719
             currentTag = parser.next();
720
        }
721

  
722
        return bBox;
723
	}
724
}
branches/v2_0_0_prep/libraries/libRemoteServices/src/org/gvsig/remoteClient/wcs/wcs_1_0_0/WCSProtocolHandler1_0_0.java
1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2005 IVER T.I. and Generalitat Valenciana.
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., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 *
19
 * For more information, contact:
20
 *
21
 *  Generalitat Valenciana
22
 *   Conselleria d'Infraestructures i Transport
23
 *   Av. Blasco Ib??ez, 50
24
 *   46010 VALENCIA
25
 *   SPAIN
26
 *
27
 *      +34 963862235
28
 *   gvsig@gva.es
29
 *      www.gvsig.gva.es
30
 *
31
 *    or
32
 *
33
 *   IVER T.I. S.A
34
 *   Salamanca 50
35
 *   46005 Valencia
36
 *   Spain
37
 *
38
 *   +34 963163400
39
 *   dac@iver.es
40
 */
41
package org.gvsig.remoteClient.wcs.wcs_1_0_0;
42

  
43
import java.io.File;
44
import java.io.IOException;
45

  
46
import org.gvsig.remoteClient.ogc.OGCServiceInformation;
47
import org.gvsig.remoteClient.utils.CapabilitiesTags;
48
import org.gvsig.remoteClient.utils.DescribeCoverageTags;
49
import org.gvsig.remoteClient.utils.EncodingXMLParser;
50
import org.gvsig.remoteClient.wcs.CoverageOfferingBrief;
51
import org.gvsig.remoteClient.wcs.WCSProtocolHandler;
52
import org.gvsig.remoteClient.wcs.WCSStatus;
53
import org.gvsig.remoteClient.wcs.request.WCSDescribeCoverageRequest;
54
import org.gvsig.remoteClient.wcs.request.WCSGetCoverageRequest;
55
import org.gvsig.remoteClient.wcs.wcs_1_0_0.request.WCSDescribeCoverageRequest1_0_0;
56
import org.gvsig.remoteClient.wcs.wcs_1_0_0.request.WCSGetCoverageRequest1_0_0;
57
import org.kxml2.io.KXmlParser;
58
import org.xmlpull.v1.XmlPullParserException;
59

  
60
/**
61
 * @author jaume
62
 *
63
 */
64
public class WCSProtocolHandler1_0_0 extends WCSProtocolHandler{
65

  
66
	public WCSProtocolHandler1_0_0() {
67
		this.version = "1.0.0";
68
		this.name = "WCS1.0.0";
69
		this.serviceInfo = new ServiceInformation();
70

  
71
	}
72

  
73
    /* (non-Javadoc)
74
     * @see org.gvsig.remoteClient.OGCProtocolHandler#parseCapabilities(java.io.File)
75
     */
76
    /**
77
     * <p>Parse the xml data retrieved from the WCS, it will parse the WCS Capabilities</p>
78
     *
79
     */
80
    public boolean parseCapabilities(File f)
81
    {
82
    	int tag;
83
    	EncodingXMLParser parser = null;
84
      	parser = new EncodingXMLParser();
85
    	try
86
    	{
87
    		parser.setInput(f);
88
    		parser.nextTag();
89

  
90
            if ( parser.getEventType() != KXmlParser.END_DOCUMENT )
91
            {
92
                parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.WCS_CAPABILITIES_ROOT1_0_0);
93
                tag = parser.nextTag();
94
                while(tag != KXmlParser.END_DOCUMENT)
95
                {
96
                    switch(tag)
97
                    {
98
                        case KXmlParser.START_TAG:
99
                            if (parser.getName().compareTo(CapabilitiesTags.SERVICE)==0)
100
                            {
101
                                parseServiceTag(parser);
102
                            }
103
                            else if (parser.getName().compareTo(CapabilitiesTags.CAPABILITY)==0)
104
                            {
105
                                parseCapabilityTag(parser);
106
                            }
107
                            else if (parser.getName().compareTo(CapabilitiesTags.WCS_CONTENTMETADATA)==0)
108
                            {
109
                            	parseContentMetadataTag(parser);
110
                            }
111
                            break;
112
                        case KXmlParser.END_TAG:
113
                            break;
114
                        case KXmlParser.TEXT:
115
                        	if (parser.getName()!=null)
116
                        		System.out.println("[TEXT]["+parser.getText().trim()+"]");
117
                            break;
118
                    }
119
                    tag = parser.next();
120
                }
121
                parser.require(KXmlParser.END_DOCUMENT, null, null);
122
            }
123
        }
124
        catch(XmlPullParserException parser_ex){
125
            System.out.println(parser_ex.getMessage());
126
            parser_ex.printStackTrace();
127
            return false;
128
        }
129
        catch (IOException ioe) {
130
            ioe.printStackTrace();
131
            return false;
132
        }
133
        return true;
134
    }
135

  
136
    /* (non-Javadoc)
137
     * @see org.gvsig.remoteClient.wcs.WCSProtocolHandler#parseDescribeCoverage(java.io.File)
138
     */
139
    public boolean parseDescribeCoverage(File f) {
140
    	int tag;
141
    	EncodingXMLParser parser = null;
142
      	parser = new EncodingXMLParser();
143
    	try
144
    	{
145
    		parser.setInput(f);
146
    		parser.nextTag();
147
            if (parser.getEventType() != KXmlParser.END_DOCUMENT){
148
                parser.require(KXmlParser.START_TAG, null, DescribeCoverageTags.COVERAGE_DESCRIPTION);
149
                tag = parser.nextTag();
150
                while (tag != KXmlParser.END_DOCUMENT){
151
                    switch (tag){
152
                        case KXmlParser.START_TAG:
153
                            if (parser.getName().compareTo(DescribeCoverageTags.COVERAGE_OFFERING)==0){
154
                                WCSCoverage1_0_0 lyr = new WCSCoverage1_0_0();
155
                                lyr.parse(parser);
156
                                if (lyr!=null){
157
                                    layerPool.put(lyr.getName(), lyr);
158
                                }
159
                            }
160
                            break;
161
                    }
162
                    tag = parser.next();
163
                }
164
                parser.require(KXmlParser.END_DOCUMENT, null, null);
165
            }
166
        } catch (XmlPullParserException e) {
167
            System.out.println(e.getMessage());
168
            e.printStackTrace();
169
            return false;
170
        }
171
        catch (IOException ioe) {
172
            ioe.printStackTrace();
173
            return false;
174
        }
175
        return true;
176
    }
177

  
178

  
179
    /**
180
     * <p>Parses the Capability Tag </p>
181
     */
182
    private void parseCapabilityTag(KXmlParser parser) throws IOException, XmlPullParserException
183
    {
184
        int currentTag;
185
        boolean end = false;
186

  
187
        parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.CAPABILITY);
188
        currentTag = parser.next();
189

  
190
        while (!end)
191
        {
192
             switch(currentTag)
193
             {
194
                case KXmlParser.START_TAG:
195
                    if (parser.getName().compareTo(CapabilitiesTags.REQUEST)==0)
196
                    {
197
                        parseRequestTag(parser);
198
                    }
199
                    else if (parser.getName().compareTo(CapabilitiesTags.EXCEPTION)==0)
200
                    {
201
                        //TODO Parse exception tags...
202
                    	parser.skipSubTree();
203
                    }
204
                    else if ((parser.getName().compareTo(CapabilitiesTags.VENDORSPECIFICCAPABILITIES)==0) ||
205
                            (parser.getName().compareTo(CapabilitiesTags.USERDEFINEDSYMBOLIZATION )==0))
206
                    {
207
                        parser.skipSubTree();
208
                    }
209
                    break;
210
                case KXmlParser.END_TAG:
211
                    if (parser.getName().compareTo(CapabilitiesTags.CAPABILITY) == 0)
212
                        end = true;
213
                    break;
214
                case KXmlParser.TEXT:
215
                break;
216
             }
217
             currentTag = parser.next();
218
        }
219
    }
220

  
221

  
222
    /**
223
     * <p>Parses the Service Information </p>
224
     */
225
    private void parseServiceTag(KXmlParser parser) throws IOException, XmlPullParserException
226
    {
227
        int currentTag;
228
        boolean end = false;
229

  
230
        parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.SERVICE);
231
        currentTag = parser.next();
232

  
233
        while (!end)
234
        {
235
             switch(currentTag)
236
             {
237
                case KXmlParser.START_TAG:
238
                    if (parser.getName().compareToIgnoreCase(CapabilitiesTags.NAME)==0)
239
                    {
240
                        serviceInfo.name = parser.nextText();
241
                    }
242
                    else if (parser.getName().compareTo(CapabilitiesTags.WCS_LABEL)==0)
243
                    {
244
                        serviceInfo.title = parser.nextText();
245
                    }
246
                    else if (parser.getName().compareTo(CapabilitiesTags.WCS_DESCRIPTION)==0)
247
                    {
248
                        serviceInfo.abstr = parser.nextText();
249
                    }
250
                    else if (parser.getName().compareTo(CapabilitiesTags.WCS_KEYWORDS)==0)
251
                    {
252
                        parser.skipSubTree();
253
                    }
254
                    else if (parser.getName().compareTo(CapabilitiesTags.ACCESSCONSTRAINTS)==0)
255
                    {
256
                        parser.skipSubTree();
257
                    }
258
                    else if (parser.getName().compareTo(CapabilitiesTags.FEES)==0)
259
                    {
260
                        parser.skipSubTree();
261
                    }
262

  
263
                    break;
264
                case KXmlParser.END_TAG:
265
                    if (parser.getName().compareTo(CapabilitiesTags.SERVICE) == 0)
266
                        end = true;
267
                    break;
268
                case KXmlParser.TEXT:
269
                break;
270
             }
271
             currentTag = parser.next();
272
        }
273
//      parser.require(KXmlParser.END_TAG, null, CapabilitiesTags.SERVICE);
274
    }
275

  
276
    /**
277
     * <p>Parses the Request tag </p>
278
     */
279
    private void parseRequestTag(KXmlParser parser) throws IOException, XmlPullParserException
280
    {
281
    	int currentTag;
282
    	boolean end = false;
283

  
284
    	parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.REQUEST);
285
    	currentTag = parser.next();
286

  
287
    	while (!end)
288
    	{
289
    		switch(currentTag)
290
    		{
291
    		case KXmlParser.START_TAG:
292
    			if (parser.getName().compareTo(CapabilitiesTags.GETCAPABILITIES)==0)
293
    			{
294
    				currentTag = parser.nextTag();
295
    				parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.DCPTYPE);
296
    				{
297
						currentTag = parser.nextTag();
298
						if(parser.getName().compareTo(CapabilitiesTags.HTTP)==0)
299
						{
300
							currentTag = parser.nextTag();
301
							if(parser.getName().compareTo(CapabilitiesTags.GET)==0)
302
							{
303
								currentTag = parser.nextTag();
304
								if (parser.getName().compareTo(CapabilitiesTags.ONLINERESOURCE)==0)
305
								{
306
									String value = new String();
307
									value = parser.getAttributeValue("", CapabilitiesTags.XLINK_HREF);
308
									if (value != null){
309
										serviceInfo.operations.put(value, null);
310
									}
311
								}
312
							}
313
						}
314
					}
315

  
316
    			}
317
    			else if (parser.getName().compareTo(CapabilitiesTags.DESCRIBECOVERAGE)==0)
318
    			{
319
    				currentTag = parser.nextTag();
320
    				parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.DCPTYPE);
321
    				{
322
						currentTag = parser.nextTag();
323
						if(parser.getName().compareTo(CapabilitiesTags.HTTP)==0)
324
						{
325
							currentTag = parser.nextTag();
326
							if(parser.getName().compareTo(CapabilitiesTags.GET)==0)
327
							{
328
								currentTag = parser.nextTag();
329
								if (parser.getName().compareTo(CapabilitiesTags.ONLINERESOURCE)==0)
330
								{
331
									String value = new String();
332
									value = parser.getAttributeValue("", CapabilitiesTags.XLINK_HREF);
333
									if (value != null){
334
										serviceInfo.operations.put(value, null);
335
									}
336
								}
337
							}
338
						}
339
					}
340
    			}
341
    			else if (parser.getName().compareTo(CapabilitiesTags.GETCOVERAGE)==0)
342
    			{
343
    				currentTag = parser.nextTag();
344
    				parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.DCPTYPE);
345
    				{
346
						currentTag = parser.nextTag();
347
						if(parser.getName().compareTo(CapabilitiesTags.HTTP)==0)
348
						{
349
							currentTag = parser.nextTag();
350
							if(parser.getName().compareTo(CapabilitiesTags.GET)==0)
351
							{
352
								currentTag = parser.nextTag();
353
								if (parser.getName().compareTo(CapabilitiesTags.ONLINERESOURCE)==0)
354
								{
355
									String value = new String();
356
									value = parser.getAttributeValue("", CapabilitiesTags.XLINK_HREF);
357
									if (value != null){
358
										serviceInfo.operations.put(value, null);
359
									}
360
								}
361
							}
362
						}
363
					}
364
    			}
365
    			break;
366
    		case KXmlParser.END_TAG:
367
    			if (parser.getName().compareTo(CapabilitiesTags.REQUEST) == 0)
368
    				end = true;
369
    			break;
370
    		case KXmlParser.TEXT:
371
    			break;
372
    		}
373
    		currentTag = parser.next();
374
    	}
375
    	// TODO: does not get such a tag when arrives here!!!!!!
376
    	//parser.require(KXmlParser.END_TAG, null, CapabilitiesTags.REQUEST);
377
    }
378

  
379
    private void parseContentMetadataTag(KXmlParser parser) throws XmlPullParserException, IOException {
380
    	int currentTag;
381
    	boolean end = false;
382

  
383
    	parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.WCS_CONTENTMETADATA);
384
    	currentTag = parser.next();
385

  
386
    	while (!end)
387
    	{
388
    		switch(currentTag)
389
    		{
390
    		case KXmlParser.START_TAG:
391
    			if (parser.getName().compareTo("wcs:"+CapabilitiesTags.WCS_COVERAGEOFFERINGBRIEF)==0) {
392
    				CoverageOfferingBrief cob = new CoverageOfferingBrief();
393
    				cob.parse(parser);
394
    				layerPool.put(cob.getName(), cob);
395
    			}
396
    			break;
397
    		case KXmlParser.END_TAG:
398
    			if (parser.getName().compareTo(CapabilitiesTags.WCS_CONTENTMETADATA) == 0)
399
    				end = true;
400
    			break;
401
    		case KXmlParser.TEXT:
402
    			break;
403
    		}
404
    		currentTag = parser.next();
405
    	}
406
    	// TODO: does not get such a tag when arrives here!!!!!!
407
    	//parser.require(KXmlParser.END_TAG, null, CapabilitiesTags.REQUEST);
408
    }
409

  
410
	public OGCServiceInformation getServiceInformation() {
411
		// TODO Auto-generated method stub
412
		return null;
413
	}
414

  
415
	/*
416
	 * (non-Javadoc)
417
	 * @see org.gvsig.remoteClient.wcs.WCSProtocolHandler#createDescribeCoverageRequest(org.gvsig.remoteClient.wcs.WCSStatus)
418
	 */
419
	public WCSDescribeCoverageRequest createDescribeCoverageRequest(
420
			WCSStatus status) {
421
		return new WCSDescribeCoverageRequest1_0_0(status, this);
422
	}
423

  
424
	/*
425
	 * (non-Javadoc)
426
	 * @see org.gvsig.remoteClient.wcs.WCSProtocolHandler#createGetCoverageRequest(org.gvsig.remoteClient.wcs.WCSStatus)
427
	 */
428
	public WCSGetCoverageRequest createGetCoverageRequest(WCSStatus status) {
429
		return new WCSGetCoverageRequest1_0_0(status, this);
430
	}
431
}
432

  
branches/v2_0_0_prep/libraries/libRemoteServices/src/org/gvsig/remoteclient/wcs/WCSProtocolHandlerFactory.java
1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2005 IVER T.I. and Generalitat Valenciana.
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., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 *
19
 * For more information, contact:
20
 *
21
 *  Generalitat Valenciana
22
 *   Conselleria d'Infraestructures i Transport
23
 *   Av. Blasco Ib??ez, 50
24
 *   46010 VALENCIA
25
 *   SPAIN
26
 *
27
 *      +34 963862235
28
 *   gvsig@gva.es
29
 *      www.gvsig.gva.es
30
 *
31
 *    or
32
 *
33
 *   IVER T.I. S.A
34
 *   Salamanca 50
35
 *   46005 Valencia
36
 *   Spain
37
 *
38
 *   +34 963163400
39
 *   dac@iver.es
40
 */
41
/*
42
 * $Id$
43
 * $Log$
44
 * Revision 1.4  2006-07-18 11:41:05  jaume
45
 * no hay nada nuevo pero el team synchronize est? pesado
46
 *
47
 * Revision 1.3  2006/04/25 06:47:50  jaume
48
 * clean up unnecessary imports
49
 *
50
 * Revision 1.2  2006/03/15 08:54:42  jaume
51
 * *** empty log message ***
52
 *
53
 * Revision 1.1.2.1  2006/03/08 09:08:31  jaume
54
 * *** empty log message ***
55
 *
56
 * Revision 1.1  2006/03/06 15:18:32  jaume
57
 * *** empty log message ***
58
 *
59
 */
60
package org.gvsig.remoteclient.wcs;
61

  
62
import java.io.DataInputStream;
63
import java.io.IOException;
64
import java.io.StringReader;
65
import java.net.ConnectException;
66
import java.net.URL;
67
import java.util.ArrayList;
68
import java.util.Iterator;
69

  
70
import org.gvsig.remoteclient.utils.CapabilitiesTags;
71
import org.kxml2.io.KXmlParser;
72
import org.xmlpull.v1.XmlPullParserException;
73

  
74
/**
75
 *
76
 * @author jaume dominguez faus
77
 *
78
 */
79
public class WCSProtocolHandlerFactory {
80

  
81
	public org.gvsig.remoteclient.wcs.WCSProtocolHandler wCSProtocolHandler;
82

  
83
	private static ArrayList supportedVersions = new ArrayList();
84

  
85
	static {
86
		supportedVersions.add("1.0.0");
87
	}
88

  
89
	/**
90
	 * M?todo que dada una respuesta de getCapabilities y un iterador sobre una
91
	 * coleccion de WCSClient's ordenada descendentemente devuelve el cliente
92
	 * cuya version es igual o inmediatamente inferior
93
	 *
94
	 * @param caps Capabilities con la respuesta del servidor
95
	 * @param clients Iterador de conjunto ordenado descendientemente
96
	 *
97
	 * @return cliente cuya version es igual o inmediatamente inferior
98
	 * @throws IllegalAccessException
99
	 * @throws InstantiationException
100
	 *
101
	 */
102
	private static String getDriverVersion(String version, Iterator clients) throws InstantiationException, IllegalAccessException {
103
		while (clients.hasNext()) {
104
			String clientVersion = (String)clients.next();
105
			int ret = version.compareTo(clientVersion);
106

  
107
			if (ret >= 0) {
108
				return clientVersion;
109
			}
110
		}
111
		return null;
112
	}
113

  
114
	/**
115
	 * Establece la versi?n con la que se comunicar? con el servidor y devuelve
116
	 * el objeto Capabilities obtenido con dicha versi?n
117
	 *
118
	 * @param host maquina con la que se negocia
119
	 *
120
	 * @return instancia de un cliente capaz de negociar con el host que se
121
	 *         pasa como par?metro
122
	 */
123
	public static WCSProtocolHandler negotiate(String host) throws ConnectException, IOException {
124

  
125
		if (supportedVersions.size() == 0)
126
		{
127
			return null;
128
		}
129

  
130
		try
131
		{
132
			String highestVersionSupportedByServer  = getSuitableWCSVersion(host,"");
133
			if (supportedVersions.contains(highestVersionSupportedByServer))
134
			{
135
				// we support the highest version supported by the server
136
				// this is the best case
137
				return createVersionDriver(highestVersionSupportedByServer);
138
			}
139
			else
140
			{
141
				// in case we dont support the highest version from the server
142
				// we start the negotiation process in which we have to get the higest version
143
				// the WCS supports and we are able to read.
144
				Iterator iVersion = supportedVersions.iterator();
145
				String wcsVersion;
146
				String gvSIGVersion;
147

  
148
				while (iVersion.hasNext()) {
149
					gvSIGVersion = (String)iVersion.next();
150
					wcsVersion = getSuitableWCSVersion(host,gvSIGVersion);
151
					//TODO:
152
					//compare with the version returned by the WMS!!!!!
153
					// send GetCapabilities and read the version to compare.
154
					int res = wcsVersion.compareTo(gvSIGVersion);
155

  
156
					if (res == 0) { //Si es la misma que nuestra version
157
						return createVersionDriver(gvSIGVersion);
158
					} else if (res > 0) { //Si es mayor que nuestra version
159
						throw new Exception("Server Version too high: " + wcsVersion);
160
					} else { //Si es menor que nuestra version
161
						//Obtenemos la primera version menor o igual que tengamos
162
						String lowerVersion = WCSProtocolHandlerFactory.getDriverVersion(wcsVersion, iVersion);
163

  
164
						if (lowerVersion == null) { //Si no hay ninguna
165
							throw new Exception("Lowest server version is " + wcsVersion);
166
						} else {
167
							if (lowerVersion.equals(wcsVersion)) {
168
								return createVersionDriver(lowerVersion);
169
							} else { //Si hay una version menor que la que retorno el servidor
170
								//iV = lower;
171
							}
172
						}
173
					}
174
				}
175
			}//case we had to start the negotiation process.
176
			return null; // if it did not find any suitable version.
177
		}
178
		catch(ConnectException conEx)
179
		{
180
			throw conEx;
181
		}
182
		catch(IOException ioEx)
183
		{
184
			throw ioEx;
185
		}
186
		catch(Exception e)
187
		{
188
//			e.printStackTrace();
189
			return null;
190
		}
191
	}
192

  
193
	/**
194
	 * Sends a GetCapabilities to the WCS server to get the version
195
	 * if the version parameter is null, the WCS will return the highest version supported
196
	 * if not it will return the lower highest version than the one requested.
197
	 * @param host
198
	 * @param version
199
	 * @return suitable version supported by the server
200
	 */
201
	private static String getSuitableWCSVersion(String host, String _version) throws ConnectException, IOException {
202
		String request = WCSProtocolHandler.buildCapabilitiesSuitableVersionRequest(host, _version);
203
		String version = new String();
204
		StringReader reader = null;
205
		//InputStreamReader reader;
206
		//InputStream is = null;
207
		DataInputStream dis = null;
208
		try {
209
			URL url = new URL(request);
210
			byte[] buffer = new byte[1024];//new byte[1024*256];
211
//			is = url.openStream();
212
//			reader = new InputStreamReader(is);
213
			//int numberOfBytes = is.read(buffer);
214
			//String readed = new String(buffer);
215
			dis = new DataInputStream(url.openStream());
216
			dis.readFully(buffer);
217

  
218
			reader = new StringReader(new String(buffer));
219
			KXmlParser kxmlParser = null;
220
			kxmlParser = new KXmlParser();
221
			kxmlParser.setInput(reader);
222
			kxmlParser.nextTag();
223
			if ( kxmlParser.getEventType() != KXmlParser.END_DOCUMENT ) {
224
				if ((kxmlParser.getName().compareTo(CapabilitiesTags.WCS_CAPABILITIES_ROOT1_0_0)==0)) {
225
					version = kxmlParser.getAttributeValue("", CapabilitiesTags.VERSION);
226
				}
227
			}
228
			// do not forget to close the Stream.
229
			reader.close();
230
			dis.close();
231
			return version;
232
		} catch(ConnectException conEx) {
233
			throw new ConnectException(conEx.getMessage());
234
		} catch(IOException ioEx) {
235
			throw new IOException(ioEx.getMessage());
236
		} catch(XmlPullParserException xmlEx) {
237
			xmlEx.printStackTrace();
238
			return "";
239
		} finally {
240
			if (reader != null) {
241
				try {
242
					reader.close();
243
				} catch(Exception ex) {
244
					ex.printStackTrace();
245
				}
246
			} if (dis != null) {
247
				try {
248
					dis.close();
249
				} catch(Exception ex){
250
					ex.printStackTrace();
251
				}
252
			}
253
		}
254
	}
255

  
256
	/**
257
	 * It creates an instance of a WCSDriver class.
258
	 *
259
	 * @param String, with the version of the driver to be created
260
	 * @return WCSDriver.
261
	 */
262
	private static WCSProtocolHandler createVersionDriver(String version) {
263
		try {
264
			Class driver;
265
			version = version.replace('.', '_');
266
			driver = Class.forName("org.gvsig.remoteclient.wcs.wcs_"+version+".WCSProtocolHandler" + version);
267
			return (WCSProtocolHandler)driver.newInstance();
268
		} catch (Exception e) {
269
			e.printStackTrace();
270
			//throw new Exception("WCSDriverFactory. Unknown driver version " + e);
271
			return null;
272
		}
273
	}
274

  
275

  
276
}
0 277

  
branches/v2_0_0_prep/libraries/libRemoteServices/src/org/gvsig/remoteclient/wcs/WCSCoverage.java
1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2005 IVER T.I. and Generalitat Valenciana.
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., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 *
19
 * For more information, contact:
20
 *
21
 *  Generalitat Valenciana
22
 *   Conselleria d'Infraestructures i Transport
23
 *   Av. Blasco Ib??ez, 50
24
 *   46010 VALENCIA
25
 *   SPAIN
26
 *
27
 *      +34 963862235
28
 *   gvsig@gva.es
29
 *      www.gvsig.gva.es
30
 *
31
 *    or
32
 *
33
 *   IVER T.I. S.A
34
 *   Salamanca 50
35
 *   46005 Valencia
36
 *   Spain
37
 *
38
 *   +34 963163400
39
 *   dac@iver.es
40
 */
41
/**
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff