Statistics
| Revision:

svn-gvsig-desktop / trunk / libraries / libArcIMS_old / src / org / gvsig / remoteClient / arcims / styling / renderers / ArcImsRendererFactory.java @ 11865

History | View | Annotate | Download (17.1 KB)

1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2006 Prodevelop 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
 *   Prodevelop Integraci?n de Tecnolog?as SL
34
 *   Conde Salvatierra de ?lava , 34-10
35
 *   46004 Valencia
36
 *   Spain
37
 *
38
 *   +34 963 510 612
39
 *   +34 963 510 968
40
 *   gis@prodevelop.es
41
 *   http://www.prodevelop.es
42
 */
43

    
44
/**
45
 *
46
 */
47
package org.gvsig.remoteClient.arcims.styling.renderers;
48

    
49
import org.apache.log4j.Logger;
50

    
51
import org.gvsig.remoteClient.arcims.exceptions.ArcImsException;
52
import org.gvsig.remoteClient.arcims.styling.symbols.ArcImsSymbolFactory;
53
import org.gvsig.remoteClient.arcims.styling.symbols.IArcIMSSymbol;
54
import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
55

    
56
import org.kxml2.io.KXmlParser;
57

    
58
import org.xmlpull.v1.XmlPullParserException;
59

    
60
import java.io.IOException;
61

    
62
import java.util.ArrayList;
63

    
64

    
65
/**
66
 * @author jsanz
67
 *
68
 */
69
public class ArcImsRendererFactory {
70
    private static Logger logger = Logger.getLogger(ArcImsRendererFactory.class.getName());
71
    private int featType;
72

    
73
    /**
74
     * Constructor to set the type of features the instance has to suppose
75
     * @param mfeatType
76
     */
77
    public ArcImsRendererFactory(int mfeatType) {
78
        this.featType = mfeatType;
79
    }
80

    
81
    /**
82
     * @return Returns the featType.
83
     */
84
    public int getFeatType() {
85
        return featType;
86
    }
87

    
88
    /**
89
     * @param featType The featType to set.
90
     */
91
    public void setFeatType(int featType) {
92
        this.featType = featType;
93
    }
94

    
95
    public Renderer getRenderer(KXmlParser parser) throws ArcImsException {
96
        logger.debug("Start GetRenderer with " + parser.getName());
97

    
98
        Renderer render = null;
99

    
100
        //                  int depth = parser.getDepth();
101
        //                  logger.debug("XML depth = "+depth);
102

    
103
        //                        logger.debug("START =" + parser.getName());
104
        if (parser.getName().equals(ServiceInfoTags.tGROUPRENDERER)) {
105
            render = (GroupRenderer) parseGroupRenderer(parser);
106
        } else if (parser.getName().equals(ServiceInfoTags.tSIMPLERENDERER)) {
107
            render = (SimpleRenderer) parseSimpleRenderer(parser);
108
        } else if (parser.getName()
109
                             .equals(ServiceInfoTags.tSCALEDEPENDENTRENDERER)) {
110
            render = (ScaleDependentRenderer) parseScaleDependentRenderer(parser);
111
        } else if (parser.getName().equals(ServiceInfoTags.tVALUEMAPRENDERER)) {
112
            render = (ValueMapRenderer) parseValueMapRenderer(parser);
113
        } else if (parser.getName().equals(ServiceInfoTags.tSIMPLELABELRENDERER)) {
114
            render = (SimpleLabelRenderer) parseSimpleLabelRenderer(parser);
115
        } else if (parser.getName()
116
                             .equals(ServiceInfoTags.tVALUEMAPLABELRENDERER)) {
117
            render = (ValueMapLabelRenderer) parseValueMapLabelRenderer(parser);
118
        }
119

    
120
        return render;
121
    }
122

    
123
    /**
124
     * This method returns a SimpleRenderer
125
     * @param parser
126
     * @return
127
     * @throws ArcImsException
128
     */
129
    private SimpleRenderer parseSimpleRenderer(KXmlParser parser)
130
        throws ArcImsException {
131
        logger.debug("Start parsing SimpleRenderer");
132

    
133
        IArcIMSSymbol symbol = null;
134
        String startTag = parser.getName();
135
        int depth = parser.getDepth();
136

    
137
        try {
138
            int currentTag;
139
            boolean end = false;
140
            currentTag = parser.next();
141

    
142
            while (!end) {
143
                switch (currentTag) {
144
                case KXmlParser.START_TAG:
145

    
146
                    //If parser starts a Renderer, call getRenderer method
147
                    if (ArcImsSymbolFactory.isSymbol(parser.getName())) {
148
                        symbol = ArcImsSymbolFactory.parseSymbol(parser,
149
                                featType);
150
                    }
151

    
152
                    break;
153

    
154
                case KXmlParser.END_TAG:
155

    
156
                    if (parser.getName().equals(startTag) &&
157
                            (parser.getDepth() == depth)) {
158
                        end = true;
159
                    }
160

    
161
                    break;
162

    
163
                case KXmlParser.TEXT:
164
                    break;
165
                }
166

    
167
                if (!end) {
168
                    currentTag = parser.next();
169
                }
170
            }
171
        } catch (XmlPullParserException e) {
172
            logger.error(e.getMessage(), e);
173
            throw new ArcImsException("arcims_symbology_error");
174
        } catch (IOException e) {
175
            logger.error(e.getMessage(), e);
176
            throw new ArcImsException("arcims_symbology_error");
177
        }
178

    
179
        if (symbol != null) {
180
            return new SimpleRenderer(symbol);
181
        } else {
182
            return null;
183
        }
184
    }
185

    
186
    /**
187
     * This parser will return a GroupRenderer
188
     * @param parser
189
     * @return
190
     * @throws ArcImsException
191
     */
192
    private GroupRenderer parseGroupRenderer(KXmlParser parser)
193
        throws ArcImsException {
194
        logger.debug("Start parsing GroupRenderer");
195

    
196
        GroupRenderer render = new GroupRenderer();
197
        String startTag = parser.getName();
198

    
199
        try {
200
            int currentTag;
201
            boolean end = false;
202
            currentTag = parser.next();
203

    
204
            while (!end) {
205
                switch (currentTag) {
206
                case KXmlParser.START_TAG:
207

    
208
                    //If parser starts a Renderer, call getRenderer method
209
                    if (isRenderer(parser.getName())) {
210
                        render.addRender(getRenderer(parser));
211
                    }
212

    
213
                    break;
214

    
215
                case KXmlParser.END_TAG:
216

    
217
                    if (parser.getName().equals(startTag)) {
218
                        ; //&& parser.getDepth()==depth);
219
                    }
220

    
221
                    end = true;
222

    
223
                    break;
224

    
225
                case KXmlParser.TEXT:
226
                    break;
227
                }
228

    
229
                if (!end) {
230
                    currentTag = parser.next();
231
                }
232
            }
233
        } catch (XmlPullParserException e) {
234
            logger.error(e.getMessage(), e);
235
            throw new ArcImsException("arcims_symbology_error");
236
        } catch (IOException e) {
237
            logger.error(e.getMessage(), e);
238
            throw new ArcImsException("arcims_symbology_error");
239
        }
240

    
241
        return render;
242
    }
243

    
244
    /**
245
     * A ScaleDependentRenderer is a type of GroupRenderer with scale limits
246
     * @param parser
247
     * @return
248
     * @throws ArcImsException
249
     */
250
    private ScaleDependentRenderer parseScaleDependentRenderer(
251
        KXmlParser parser) throws ArcImsException {
252
        logger.debug("Start parsing ScaleDependentRenderer");
253

    
254
        ScaleDependentRenderer render = null;
255
        String startTag = parser.getName();
256

    
257
        try {
258
            //We are at SCALEDEPENDENTRENDERER tag, so we have to get it attributes
259
            String lower = parser.getAttributeValue("", ServiceInfoTags.aLOWER);
260
            String upper = parser.getAttributeValue("", ServiceInfoTags.UPPER);
261

    
262
            //Now we can create the renderer and start parsing inside this tag
263
            render = new ScaleDependentRenderer(lower, upper);
264

    
265
            //Start parsing
266
            int currentTag;
267
            boolean end = false;
268
            currentTag = parser.next();
269

    
270
            while (!end) {
271
                switch (currentTag) {
272
                case KXmlParser.START_TAG:
273

    
274
                    //If parser starts a Renderer, call getRenderer method
275
                    if (isRenderer(parser.getName())) {
276
                        Renderer innerRender = getRenderer(parser);
277
                        render.addRender(innerRender);
278
                    }
279

    
280
                    break;
281

    
282
                case KXmlParser.END_TAG:
283

    
284
                    if (parser.getName().equals(startTag)) {
285
                        ; //&& parser.getDepth()==depth);
286
                    }
287

    
288
                    end = true;
289

    
290
                    break;
291

    
292
                case KXmlParser.TEXT:
293
                    break;
294
                }
295

    
296
                if (!end) {
297
                    currentTag = parser.next();
298
                }
299
            }
300
        } catch (XmlPullParserException e) {
301
            logger.error(e.getMessage(), e);
302
            throw new ArcImsException("arcims_symbology_error");
303
        } catch (IOException e) {
304
            logger.error(e.getMessage(), e);
305
            throw new ArcImsException("arcims_symbology_error");
306
        }
307

    
308
        return render;
309
    }
310

    
311
    private ValueMapRenderer parseValueMapRenderer(KXmlParser parser)
312
        throws ArcImsException {
313
        logger.debug("Start parsing ValueMapRenderer");
314

    
315
        ValueMapRenderer render = null;
316
        String startTag = parser.getName();
317
        int depth = parser.getDepth();
318

    
319
        try {
320
            //We are at VALUEMAPRENDER tag, so we have to get it attributes
321
            String lookupfield = parser.getAttributeValue("",
322
                    ServiceInfoTags.aLOOKUPFIELD);
323

    
324
            //Now we can create the renderer and start parsing inside this tag
325
            logger.debug("Creating ValueMapRenderer (" + lookupfield + ")");
326
            render = new ValueMapRenderer(lookupfield);
327

    
328
            ArrayList values = render.getValues();
329
            TypeValueMap tvm = null;
330
            IArcIMSSymbol symb = null;
331

    
332
            //Start parsing inner tags (EXACT, RANGE or OTHER)
333
            int currentTag;
334
            boolean end = false;
335
            currentTag = parser.next();
336

    
337
            while (!end) {
338
                switch (currentTag) {
339
                case KXmlParser.START_TAG:
340

    
341
                    //
342
                    if (parser.getName().equals(ServiceInfoTags.tEXACT)) {
343
                        // Get the parameters
344
                        String label = parser.getAttributeValue("",
345
                                ServiceInfoTags.aLABEL);
346
                        String value = parser.getAttributeValue("",
347
                                ServiceInfoTags.VALUE);
348
                        String method = parser.getAttributeValue("",
349
                                ServiceInfoTags.aMETHOD);
350

    
351
                        // Create the ExactValueMap object
352
                        logger.debug("Creating ExactValueMap");
353
                        tvm = new ExactValueMap();
354

    
355
                        if (label != null) {
356
                            tvm.setLabel(label);
357
                        }
358

    
359
                        if (value != null) {
360
                            ((ExactValueMap) tvm).setValue(value);
361
                        }
362

    
363
                        if (method != null) {
364
                            ((ExactValueMap) tvm).setMethod(method);
365
                        }
366
                    }
367

    
368
                    if (parser.getName().equals(ServiceInfoTags.tRANGE)) {
369
                        // Get the parameters
370
                        String lower = parser.getAttributeValue("",
371
                                ServiceInfoTags.aLOWER);
372
                        String upper = parser.getAttributeValue("",
373
                                ServiceInfoTags.UPPER);
374
                        String equality = parser.getAttributeValue("",
375
                                ServiceInfoTags.aEQUALITY);
376
                        String label = parser.getAttributeValue("",
377
                                ServiceInfoTags.aLABEL);
378

    
379
                        // Create the RangeValueMap object
380
                        if ((lower != null) && (upper != null)) {
381
                            logger.debug("Creating RangeValueMap");
382
                            tvm = new RangeValueMap(lower, upper);
383

    
384
                            if (equality != null) {
385
                                ((RangeValueMap) tvm).setEquality(equality);
386
                            }
387

    
388
                            if (label != null) {
389
                                tvm.setLabel(label);
390
                            }
391
                        }
392
                    }
393

    
394
                    if (parser.getName().equals(ServiceInfoTags.tOTHER)) {
395
                        // Get the parameters
396
                        String label = parser.getAttributeValue("",
397
                                ServiceInfoTags.aLABEL);
398

    
399
                        // Create the Other object
400
                        logger.debug("Creating OtherValueMap");
401
                        tvm = new OtherValueMap();
402

    
403
                        if (label != null) {
404
                            tvm.setLabel(label);
405
                        }
406
                    }
407

    
408
                    break;
409

    
410
                case KXmlParser.END_TAG:
411

    
412
                    if (parser.getName().equals(startTag) &&
413
                            (parser.getDepth() == depth)) {
414
                        end = true;
415
                    }
416

    
417
                    break;
418

    
419
                case KXmlParser.TEXT:
420
                    break;
421
                }
422

    
423
                /*
424
                 *  Once the exits the switch statement we can add
425
                 *  the TypeValueMap into the arraylist of values
426
                 */
427
                if (tvm != null) {
428
                    /*
429
                     * Create and assign the symbol definition passing the parser
430
                     */
431
                    parser.nextTag();
432

    
433
                    if (ArcImsSymbolFactory.isSymbol(parser.getName())) {
434
                        symb = ArcImsSymbolFactory.parseSymbol(parser, featType);
435
                    }
436

    
437
                    if (symb != null) {
438
                        tvm.setSymbol(symb);
439
                    }
440

    
441
                    // Pass the TypeValueMap to the arraylist of values
442
                    values.add(tvm);
443
                }
444

    
445
                // Erase the references
446
                symb = null;
447
                tvm = null;
448

    
449
                /*
450
                 * If end continue as false, get the next tag of the XML
451
                 */
452
                if (!end) {
453
                    currentTag = parser.next();
454
                }
455
            }
456
        } catch (XmlPullParserException e) {
457
            logger.error(e.getMessage(), e);
458
            throw new ArcImsException("arcims_symbology_error");
459
        } catch (IOException e) {
460
            logger.error(e.getMessage(), e);
461
            throw new ArcImsException("arcims_symbology_error");
462
        }
463

    
464
        return render;
465
    }
466

    
467
    private SimpleLabelRenderer parseSimpleLabelRenderer(KXmlParser parser)
468
        throws ArcImsException {
469
        logger.debug("Start parsing SimpleLabelRenderer");
470

    
471
        SimpleRenderer render = null;
472
        SimpleLabelRenderer render2 = null;
473

    
474
        String field = parser.getAttributeValue("", ServiceInfoTags.aSFIELD);
475
        String rotational = parser.getAttributeValue("",
476
                ServiceInfoTags.aROTATIONALANGLES);
477

    
478
        render = parseSimpleRenderer(parser);
479

    
480
        if ((render != null) && (field != null)) {
481
            render2 = new SimpleLabelRenderer(field, render.getSymbol());
482

    
483
            if (rotational != null) {
484
                render2.setRotationalangles(rotational);
485
            }
486
        }
487

    
488
        return render2;
489
    }
490

    
491
    private ValueMapLabelRenderer parseValueMapLabelRenderer(KXmlParser parser)
492
        throws ArcImsException {
493
        logger.debug("Start parsing ValueMapLabelRenderer");
494

    
495
        ValueMapRenderer render = null;
496
        ValueMapLabelRenderer render2 = null;
497

    
498
        String labelfield = parser.getAttributeValue("",
499
                ServiceInfoTags.aLABELFIELD);
500
        String rotational = parser.getAttributeValue("",
501
                ServiceInfoTags.aROTATIONALANGLES);
502

    
503
        /*
504
         * As this render is a type of a ValueMapRenderer, we can use this method and afterwards
505
         * get the parameters and values
506
         */
507
        render = parseValueMapRenderer(parser);
508

    
509
        if ((render != null) && (labelfield != null)) {
510
            render2 = new ValueMapLabelRenderer(labelfield,
511
                    render.getLookupfield());
512

    
513
            if (rotational != null) {
514
                render2.setRotationalangles(rotational);
515
            }
516

    
517
            if (render.getValues() != null) {
518
                render2.setValues(render.getValues());
519
            }
520
        }
521

    
522
        return render2;
523
    }
524

    
525
    /**
526
     * Tests if a TAG is one of the ArcIMS renderers
527
     * @param name
528
     * @return
529
     */
530
    public static boolean isRenderer(String name) {
531
        int l = ServiceInfoTags.RENDERERS.length;
532

    
533
        for (int i = 0; i < l; i++) {
534
            if (name.equals(ServiceInfoTags.RENDERERS[i])) {
535
                return true;
536
            }
537
        }
538

    
539
        return false;
540
    }
541
}