Statistics
| Revision:

gvsig-tools / org.gvsig.tools / library / trunk / org.gvsig.tools / org.gvsig.tools.lib / src / main / java / org / gvsig / tools / dynobject / impl / DynClassImportHelper.java @ 130

History | View | Annotate | Download (19.4 KB)

1
package org.gvsig.tools.dynobject.impl;
2

    
3
import java.io.IOException;
4
import java.io.InputStream;
5
import java.util.ArrayList;
6
import java.util.HashMap;
7
import java.util.Iterator;
8
import java.util.List;
9
import java.util.Map;
10

    
11
import org.gvsig.tools.ToolsLocator;
12
import org.gvsig.tools.dataTypes.CoercionException;
13
import org.gvsig.tools.dynobject.DynClass;
14
import org.gvsig.tools.dynobject.DynField;
15
import org.gvsig.tools.dynobject.DynObjectManager;
16
import org.gvsig.tools.dynobject.DynObjectValueItem;
17
import org.gvsig.tools.dynobject.exception.DynFieldIsNotAContainerException;
18
import org.xmlpull.v1.XmlPullParser;
19
import org.xmlpull.v1.XmlPullParserException;
20
import org.xmlpull.v1.XmlPullParserFactory;
21

    
22
public class DynClassImportHelper {
23

    
24
        private static final String VERSION_VALUE = "1.0.0";
25
        
26
        private static final String DEFINITIONS_TAG = "definitions";
27
        private static final String VERSION_TAG = "version";
28
        private static final String CLASSES_TAG = "classes";
29
        
30
        private static final String CLASS_TAG = "class";
31
        private static final String CLASS_NAME_TAG = "name";
32
        private static final String CLASS_NAMESPACE_TAG = "namespace";
33
        private static final String CLASS_DESCRIPTION_TAG = "description";
34
        private static final String CLASS_SUPERCLASSNAMES_TAG = "superClassNames";
35
        private static final String CLASS_SUPERCLASSNAME_TAG = "superClassName";
36
        private static final String CLASS_EXTENDS_TAG = "extends";
37
        private static final String CLASS_EXTENDS_CLASS_TAG = "class";
38
        private static final String CLASS_FIELDS_TAG = "fields";
39
        
40
        private static final String FIELD_TAG = "field";
41
        private static final String FIELD_NAME_TAG = "name";
42
        private static final String FIELD_DESCRIPTION_TAG = "description";
43
        private static final String FIELD_SUBTYPE_TAG = "subtype";
44
        private static final String FIELD_TYPE_TAG = "type";
45
        private static final String FIELD_ISMANDATORY_TAG = "mandatory";
46
        private static final String FIELD_ISPERSISTENT_TAG = "persistent";
47
        private static final String FIELD_MINVALUE_TAG = "minValue";
48
        private static final String FIELD_MAXVALUE_TAG = "maxValue";
49
        private static final String FIELD_CLASSOFVALUE_TAG = "classOfValue";
50
        private static final String FIELD_DEFAULTVALUE_TAG = "defaultValue";
51
//        private static final String FIELD_TYPEOFAVALILABLEVALUES_TAG = "typeOfAvailableValues";
52
        private static final String FIELD_AVALILABLEVALUES_TAG = "availableValues";
53
        private static final String FIELD_GROUP_TAG = "group";
54
        private static final String FIELD_ORDER_TAG = "order";
55
        private static final String FIELD_HIDDEN_TAG = "hidden";
56

    
57
        private static final String VALUEITEM_TAG = "valueItem";
58
        private static final String VALUEITEM_LABEL_TAG = "label";
59
        private static final String VALUEITEM_VALUE_TAG = "value";
60

    
61

    
62
        private String getNullWhenEmptyString(String value) {
63
                if( value!= null ) {
64
                        if( value.trim().length()==0) {
65
                                return null;
66
                        }
67
                }
68
                return value;
69
                
70
        }
71
        private String nextText(XmlPullParser parser) throws XmlPullParserException, IOException {
72
                return getNullWhenEmptyString(parser.nextText());
73
        }
74
        
75
        private String getAttributeValue(XmlPullParser parser, int i) throws XmlPullParserException, IOException {
76
                return getNullWhenEmptyString(parser.getAttributeValue(i));
77
        }
78

    
79
        public Map importDefinitions(InputStream resource, ClassLoader loader, String defaultNamespace) throws XmlPullParserException, IOException {
80

    
81
                XmlPullParserFactory factory = XmlPullParserFactory.newInstance(
82
                                ToolsLocator.getInstance().getXmlPullParserFactoryClassNames(),
83
                                null);
84

    
85
                XmlPullParser parser = factory.newPullParser();
86
                
87
                parser.setInput(resource, null);
88
                
89
                return importDefinitions(parser, loader, defaultNamespace);
90
        }
91
        
92
        public Map importDefinitions(XmlPullParser parser, ClassLoader loader, String defaultNamespace) throws XmlPullParserException, IOException {
93
                Map dynClasses = new HashMap();
94
                String version = null;
95
                
96
                if( loader == null ) {
97
                        loader = this.getClass().getClassLoader();
98
                }
99
                parser.nextTag();
100
                parser.require(XmlPullParser.START_TAG, null, DEFINITIONS_TAG);
101
                for( int i=0;i<parser.getAttributeCount(); i++) {
102
                        String name = parser.getAttributeName(i);
103
                        if( name.equalsIgnoreCase(VERSION_TAG) ) {
104
                                version = this.getAttributeValue(parser, i);
105
                        } else {
106
                                throw new WrongVersionException(parser);
107
                        }
108
                }
109
                parser.nextTag();
110
                if( parser.getName().equalsIgnoreCase(VERSION_TAG) ) {
111
                        parser.require(XmlPullParser.START_TAG, null, VERSION_TAG);
112
                        version = parser.nextText();
113
                        if (!version.trim().equals(VERSION_VALUE) ) {
114
                                throw new UnsupportedClassVersionError();
115
                        }
116
                        parser.require(XmlPullParser.END_TAG, "", VERSION_TAG);
117
                        parser.nextTag();
118
                }
119
                
120
                parser.require(XmlPullParser.START_TAG, "", CLASSES_TAG);
121
                parser.nextTag();
122
                while ( !( parser.getEventType() == XmlPullParser.END_TAG && 
123
                                   parser.getName().equals(CLASSES_TAG))) {
124
                        checkEndDocument(parser);
125
                        DynClass dynClass = importDynClass(parser, loader, defaultNamespace, dynClasses);
126
                        if( dynClasses.get(dynClass.getFullName())!=null ) {
127
                                throw new DuplicateDynClassException(parser, dynClass.getFullName());
128
                        }
129
                        dynClasses.put(dynClass.getFullName(), dynClass);
130
                }
131
                parser.require(XmlPullParser.END_TAG, "", CLASSES_TAG);
132
                parser.nextTag();
133

    
134
                parser.require(XmlPullParser.END_TAG, "", DEFINITIONS_TAG);
135
                parser.next();
136

    
137
                parser.require(XmlPullParser.END_DOCUMENT, null, null);
138
                return dynClasses;
139
        }
140

    
141
        private DynClass importDynClass(XmlPullParser parser, ClassLoader loader, String defaultNamespace, Map classes) throws XmlPullParserException, IOException {
142
                DynObjectManager manager = ToolsLocator.getDynObjectManager();
143
                DynClass dynClass; 
144
                List superClasses = new ArrayList();
145
                Map values = new HashMap();
146
                
147
                parser.require(XmlPullParser.START_TAG, null, CLASS_TAG);
148
                //
149
                // Collect class attributes from tag attributes
150
                //
151
                for( int i=0; i<parser.getAttributeCount(); i++ ) {
152
                        values.put(parser.getAttributeName(i), this.getAttributeValue(parser, i));
153
                }
154
                parser.nextTag();
155

    
156
                while ( !( parser.getEventType() == XmlPullParser.END_TAG && 
157
                                   parser.getName().equals(CLASSES_TAG))) {
158
                        checkEndDocument(parser);
159

    
160
                        parser.require(XmlPullParser.START_TAG, null, null);
161
                        String tagName = parser.getName();
162
                        if( tagName.equalsIgnoreCase(CLASS_DESCRIPTION_TAG)) {
163
                                values.put(CLASS_DESCRIPTION_TAG, this.nextText(parser));
164

    
165
                        } else if( tagName.equalsIgnoreCase(CLASS_NAME_TAG)) {
166
                                values.put(CLASS_NAME_TAG, this.nextText(parser));
167
                                
168
                        } else if( tagName.equalsIgnoreCase(CLASS_NAMESPACE_TAG)) {
169
                                values.put(CLASS_NAMESPACE_TAG, this.nextText(parser));
170

    
171
                        } else if( tagName.equalsIgnoreCase(CLASS_SUPERCLASSNAMES_TAG) ) {
172
                                parser.nextTag();
173
                                while ( !( parser.getEventType() == XmlPullParser.END_TAG && 
174
                                                   parser.getName().equals(CLASS_SUPERCLASSNAMES_TAG))) {
175
                                        checkEndDocument(parser);
176
                                        parser.require(XmlPullParser.START_TAG, "", CLASS_SUPERCLASSNAME_TAG);
177
                                        superClasses.add( new SuperClass(defaultNamespace, this.nextText(parser)));
178
                                        parser.require(XmlPullParser.END_TAG, null, CLASS_SUPERCLASSNAME_TAG);
179
                                        parser.nextTag();
180
                                }
181
                                
182
                        } else if( tagName.equalsIgnoreCase(CLASS_EXTENDS_TAG) ) { 
183
                                parser.nextTag();
184
                                while ( !( parser.getEventType() == XmlPullParser.END_TAG && 
185
                                                   parser.getName().equals(CLASS_EXTENDS_TAG))) {
186
                                        checkEndDocument(parser);
187
                                        superClasses.add( importSuperClass(parser, defaultNamespace) );
188
                                        parser.nextTag();
189
                                }
190
                        } else {
191
                                break;
192
                        }
193
                        parser.require(XmlPullParser.END_TAG, null, tagName);
194
                        parser.nextTag();
195
                }
196
                parser.require(XmlPullParser.START_TAG, null, CLASS_FIELDS_TAG);
197
                parser.nextTag();
198

    
199
                //
200
                // Create dynclass
201
                //
202
                if( values.get(CLASS_NAME_TAG) == null ) {
203
                        throw new BadDefinitionFormatException(parser);
204
                }
205
                if( values.get(CLASS_NAMESPACE_TAG)==null ) {
206
                        values.put(CLASS_NAMESPACE_TAG, defaultNamespace);
207
                }
208
                dynClass = manager.createDynClass(
209
                        (String)values.get(CLASS_NAMESPACE_TAG),
210
                        (String)values.get(CLASS_NAME_TAG),
211
                        (String)values.get(CLASS_DESCRIPTION_TAG)
212
                );
213
                for( int i=0; i<superClasses.size(); i++) {
214
                        SuperClass superClass = (SuperClass) superClasses.get(i);
215
                        if( superClass.name == null ) {
216
                                throw new BadDefinitionFormatException(parser);
217
                        }
218
                        DynClass superDynClass = (DynClass) classes.get(DefaultDynObjectManager.getFullName(superClass.namespace, superClass.name));
219
                        if( superDynClass==null ) {
220
                                superDynClass = ToolsLocator.getDynObjectManager().get(superClass.namespace, superClass.name);
221
                                if( superDynClass==null ) {
222
                                        throw new CantLocateDynClassException(parser,DefaultDynObjectManager.getFullName(superClass.namespace, superClass.name));
223
                                }
224
                        }
225
                        dynClass.extend(superDynClass);
226
                }
227

    
228
                //
229
                // Parse and load fields of dynclass
230
                //
231
                while ( !( parser.getEventType() == XmlPullParser.END_TAG && 
232
                                   parser.getName().equals(CLASS_FIELDS_TAG))) {
233
                        checkEndDocument(parser);
234
            importDynField(parser, dynClass, loader);
235
                    parser.nextTag();
236
                }
237
                parser.require(XmlPullParser.END_TAG, null, CLASS_FIELDS_TAG);
238
                parser.nextTag();
239

    
240
                parser.require(XmlPullParser.END_TAG, null, CLASS_TAG);
241
                parser.nextTag();
242
                return dynClass;
243
        }
244
        
245
        private class SuperClass {
246
                String namespace;
247
                String name;
248
                
249
                SuperClass(String namespace, String name) {
250
                        this.namespace = namespace;
251
                        this.name = name;
252
                }
253
        }
254
        
255
        private SuperClass importSuperClass(XmlPullParser parser, String defaultNamespace) throws XmlPullParserException, IOException {
256
                SuperClass superClass = new SuperClass(defaultNamespace, null);
257

    
258
                parser.require(XmlPullParser.START_TAG, null, CLASS_EXTENDS_CLASS_TAG);
259
                for( int i=0; i<parser.getAttributeCount(); i++) {
260
                        String name = parser.getAttributeName(i);
261
                        if( name.equalsIgnoreCase(CLASS_NAME_TAG)) {
262
                                superClass.name = this.getAttributeValue(parser, i);
263
                        } else if( name.equalsIgnoreCase(CLASS_NAMESPACE_TAG)) {
264
                                        superClass.namespace = this.getAttributeValue(parser, i);
265
                        } else {
266
                                throw new BadDefinitionFormatException(parser);
267
                        }
268
                }
269
                if( superClass.name == null) {
270
                        superClass.name = this.nextText(parser);
271
                } else {
272
                        parser.nextTag();
273
                }
274
                parser.require(XmlPullParser.END_TAG, null, CLASS_EXTENDS_CLASS_TAG);
275
                return superClass;
276
        }
277

    
278
        
279
        private void importDynField(XmlPullParser parser, DynClass dynClass, ClassLoader loader) throws XmlPullParserException, IOException {
280
                DynField field;
281
                List availableValues = new ArrayList();
282
                Map values = new HashMap();
283

    
284
                parser.require(XmlPullParser.START_TAG, null, FIELD_TAG);
285
                //
286
                // Collect field attributes from tag attributes
287
                //
288
                for( int i=0; i<parser.getAttributeCount(); i++ ) {
289
                        values.put(parser.getAttributeName(i), this.getAttributeValue(parser, i));
290
                }
291
                parser.nextTag();
292

    
293
                //
294
                // Collect field attributes from tags
295
                //
296
                while ( !( parser.getEventType() == XmlPullParser.END_TAG && 
297
                                   parser.getName().equals(FIELD_TAG))) {
298
                        checkEndDocument(parser);
299

    
300
                        parser.require(XmlPullParser.START_TAG, null, null);
301
                        String name = parser.getName();
302
                        if( name.equalsIgnoreCase(FIELD_NAME_TAG)) {
303
                                values.put(FIELD_NAME_TAG, this.nextText(parser));
304
                                
305
                        } else if( name.equalsIgnoreCase(FIELD_DESCRIPTION_TAG)) {
306
                                values.put(FIELD_DESCRIPTION_TAG, this.nextText(parser));
307

    
308
                        } else if( name.equalsIgnoreCase(FIELD_TYPE_TAG)) {
309
                                values.put(FIELD_TYPE_TAG, this.nextText(parser));
310
                                
311
                        } else if( name.equalsIgnoreCase(FIELD_SUBTYPE_TAG)) {
312
                                values.put(FIELD_SUBTYPE_TAG, this.nextText(parser));
313
                                
314
                        } else if( name.equalsIgnoreCase(FIELD_GROUP_TAG)) {
315
                                values.put(FIELD_GROUP_TAG, this.nextText(parser));
316
                                
317
                        } else if( name.equalsIgnoreCase(FIELD_ORDER_TAG)) {
318
                                values.put(FIELD_ORDER_TAG, this.nextText(parser));
319
                                
320
                        } else if( name.equalsIgnoreCase(FIELD_ISMANDATORY_TAG)) {
321
                                values.put(FIELD_ISMANDATORY_TAG, this.nextText(parser));
322
                                
323
                        } else if( name.equalsIgnoreCase(FIELD_ISPERSISTENT_TAG)) {
324
                                values.put(FIELD_ISPERSISTENT_TAG, this.nextText(parser));
325
                                
326
                        } else if( name.equalsIgnoreCase(FIELD_MINVALUE_TAG)) {
327
                                values.put(FIELD_MINVALUE_TAG, this.nextText(parser));
328
                                
329
                        } else if( name.equalsIgnoreCase(FIELD_MAXVALUE_TAG)) {
330
                                values.put(FIELD_MAXVALUE_TAG, this.nextText(parser));
331
                                
332
                        } else if( name.equalsIgnoreCase(FIELD_CLASSOFVALUE_TAG)) {
333
                                values.put(FIELD_CLASSOFVALUE_TAG, this.nextText(parser));
334
                                
335
                        } else if( name.equalsIgnoreCase(FIELD_DEFAULTVALUE_TAG)) {
336
                                values.put(FIELD_DEFAULTVALUE_TAG, this.nextText(parser));
337
                                
338
                        } else if( name.equalsIgnoreCase(FIELD_AVALILABLEVALUES_TAG)) {
339
                                parser.nextTag();
340
                                while ( !( parser.getEventType() == XmlPullParser.END_TAG && 
341
                                                   parser.getName().equals(FIELD_AVALILABLEVALUES_TAG))) {
342
                                        checkEndDocument(parser);
343
                                        availableValues.add(importValueItem(parser));
344
                                        parser.nextTag();
345
                                }
346
                                
347
                        } else {
348
                                break;
349
                        }
350
                        parser.require(XmlPullParser.END_TAG, null, name);
351
                        parser.nextTag();
352
                }
353
                parser.require(XmlPullParser.END_TAG, null, FIELD_TAG);
354

    
355
                
356
                if( values.get(FIELD_NAME_TAG)==null ) {
357
                        throw new BadDefinitionFormatException(parser);
358
                }
359

    
360
                //
361
                // Create the field
362
                //
363
                field = dynClass.addDynField((String)values.get(FIELD_NAME_TAG));
364
                
365
                //
366
                // Load values in the field
367
                //
368
                Iterator names = values.keySet().iterator();
369
                while( names.hasNext() ) {
370
                        String name = (String) names.next();
371
                        String value = (String)values.get(name);
372
                        if( value == null ) {
373
                                continue;
374
                        }
375
                        if( name.equalsIgnoreCase(FIELD_DESCRIPTION_TAG)) {
376
                                field.setDescription(value);
377

    
378
                        } else if( name.equalsIgnoreCase(FIELD_TYPE_TAG)) {
379
                                field.setType( ToolsLocator.getDataTypesManager().getType(value) );
380
                                
381
                        } else if( name.equalsIgnoreCase(FIELD_SUBTYPE_TAG)) {
382
                                field.setSubtype(value);
383
                                
384
                        } else if( name.equalsIgnoreCase(FIELD_GROUP_TAG)) {
385
                                field.setGroup(value);
386
                                
387
                        } else if( name.equalsIgnoreCase(FIELD_ORDER_TAG)) {
388
                                field.setOrder( Integer.parseInt(value));
389
                                
390
                        } else if( name.equalsIgnoreCase(FIELD_ISMANDATORY_TAG)) {
391
                                field.setMandatory(Boolean.parseBoolean(value));
392
                                
393
                        } else if( name.equalsIgnoreCase(FIELD_ISPERSISTENT_TAG)) {
394
                                 field.setPersistent(Boolean.parseBoolean(value));
395
                                
396
                        } else if( name.equalsIgnoreCase(FIELD_CLASSOFVALUE_TAG)) {
397
                                try {
398
                                        field.setClassOfValue( Class.forName(value, true, loader) );
399
                                } catch (DynFieldIsNotAContainerException e) {
400
                                        throw new IncompatibleAttributeValueException(parser, FIELD_NAME_TAG);
401
                                } catch (ClassNotFoundException e) {
402
                                        throw new CantLocateClassException(parser, FIELD_NAME_TAG);
403
                                }
404
                                
405
                        } else if( name.equalsIgnoreCase(FIELD_MINVALUE_TAG)) {
406
                                // Do nothing
407
                                
408
                        } else if( name.equalsIgnoreCase(FIELD_MAXVALUE_TAG)) {
409
                                // Do nothing
410
                                
411
                        } else if( name.equalsIgnoreCase(FIELD_DEFAULTVALUE_TAG)) {
412
                                // Do nothing
413
                                
414
                        } else if( name.equalsIgnoreCase(FIELD_AVALILABLEVALUES_TAG)) {
415
                                // Do nothing
416

    
417
                        } else if( name.equalsIgnoreCase(FIELD_NAME_TAG)) {
418
                                // Do nothing
419

    
420
                        } else {
421
                                throw new BadDefinitionFormatException(parser);
422
                        }
423
                }
424

    
425
                try {
426
                        //
427
                        // Coerce the the min/max/default/available values to the type of
428
                        // the field
429
                        //
430
                        for (int i = 0; i < availableValues.size(); i++) {
431
                                PairValueLabel pair = (PairValueLabel) availableValues.get(i);
432
                                if (pair.label == null) {
433
                                        if (pair.value == null) {
434
                                                pair.label = "null";
435
                                        } else {
436
                                                pair.label = pair.value.toString();
437
                                        }
438
                                }
439
                                availableValues.set(i, new DynObjectValueItem(field.coerce(pair.value), pair.label));
440
                        }
441
                        field.setAvailableValues(availableValues);
442
                        field.setMaxValue(field.coerce(values.get(FIELD_MAXVALUE_TAG)));
443
                        field.setMinValue(field.coerce(values.get(FIELD_MINVALUE_TAG)));
444
                        field.setDefaultDynValue(field.coerce(values.get(FIELD_DEFAULTVALUE_TAG)));
445
                } catch (CoercionException e) {
446
                        throw new ParseCoerceException(e, parser);
447
                }
448
        }
449

    
450
        private class PairValueLabel {
451
                String label=null;
452
                String value=null;
453
        }
454
        
455
        private PairValueLabel importValueItem(XmlPullParser parser) throws XmlPullParserException, IOException {
456
                PairValueLabel pair = new PairValueLabel();
457
                
458
                if( parser.getName().equalsIgnoreCase(VALUEITEM_TAG)) {
459
                        parser.require(XmlPullParser.START_TAG, null, VALUEITEM_TAG);
460
                        for( int i=0; i<parser.getAttributeCount(); i++) {
461
                                String name = parser.getAttributeName(i);
462
                                if( name.equalsIgnoreCase(VALUEITEM_LABEL_TAG)) {
463
                                        pair.label = this.getAttributeValue(parser,i);
464
                                } else if( name.equalsIgnoreCase(VALUEITEM_VALUE_TAG)) {
465
                                        pair.value = this.getAttributeValue(parser,i);
466
                                } else {
467
                                        throw new BadDefinitionFormatException(parser);
468
                                }
469
                        }
470
                        parser.nextTag();
471
        
472
                        while ( !( parser.getEventType() == XmlPullParser.END_TAG && 
473
                                           parser.getName().equals(VALUEITEM_TAG))) {
474
                                checkEndDocument(parser);
475
                                parser.require(XmlPullParser.START_TAG, null, null);
476
                                String name = parser.getName();
477
                                if( name.equalsIgnoreCase(VALUEITEM_LABEL_TAG)) {
478
                                        pair.label = this.nextText(parser);
479
                                } else if( name.equalsIgnoreCase(VALUEITEM_VALUE_TAG)) {
480
                                        pair.value = this.nextText(parser);
481
                                } else {
482
                                        break;
483
                                }
484
                                parser.require(XmlPullParser.END_TAG, null, name);
485
                                parser.nextTag();
486
                        }
487
                        parser.require(XmlPullParser.END_TAG, null, VALUEITEM_TAG);
488
                } else {
489
                        parser.require(XmlPullParser.START_TAG, null, VALUEITEM_VALUE_TAG);
490
                        for( int i=0; i<parser.getAttributeCount(); i++) {
491
                                String name = parser.getAttributeName(i);
492
                                if( name.equalsIgnoreCase(VALUEITEM_LABEL_TAG)) {
493
                                        pair.label = parser.getAttributeValue(i);
494
                                } else {
495
                                        throw new BadDefinitionFormatException(parser);
496
                                }
497
                        }
498
                        pair.value = parser.nextText();
499
                        parser.require(XmlPullParser.END_TAG, null, VALUEITEM_VALUE_TAG);
500
                }
501
                return pair;
502
        }
503
        
504
        private void checkEndDocument(XmlPullParser parser) throws XmlPullParserException {
505
                if (parser.getEventType() == XmlPullParser.END_DOCUMENT) {
506
                        throw new BadDefinitionFormatException(parser);
507
                }
508

    
509
        }
510

    
511
        
512
        public static abstract class ImportDynClassesException extends RuntimeException {
513

    
514
                /**
515
                 * 
516
                 */
517
                private static final long serialVersionUID = 3346283395112730192L; 
518
        }
519
        
520
        public static class DuplicateDynClassException extends ImportDynClassesException { 
521
                /**
522
                 * 
523
                 */
524
                private static final long serialVersionUID = 3653024321140806121L;
525

    
526
                public DuplicateDynClassException(XmlPullParser parser, String name) { }
527
        }
528
        
529
        public static class BadDefinitionFormatException extends ImportDynClassesException { 
530
                /**
531
                 * 
532
                 */
533
                private static final long serialVersionUID = -808282903423455613L;
534

    
535
                public BadDefinitionFormatException(XmlPullParser parser) { }
536
        }
537
        
538
        public static class CantLocateClassException extends ImportDynClassesException { 
539
                /**
540
                 * 
541
                 */
542
                private static final long serialVersionUID = 5733585544096433612L;
543

    
544
                public CantLocateClassException(XmlPullParser parser, String tagname) { }
545
        }
546

    
547
        public static class CantLocateDynClassException extends ImportDynClassesException { 
548

    
549
                /**
550
                 * 
551
                 */
552
                private static final long serialVersionUID = 6286170415562358806L;
553

    
554
                public CantLocateDynClassException(XmlPullParser parser, String tagname) { }
555
        }
556

    
557
        public static class IncompatibleAttributeValueException extends ImportDynClassesException { 
558
                /**
559
                 * 
560
                 */
561
                private static final long serialVersionUID = 2646530094487375049L;
562

    
563
                public IncompatibleAttributeValueException(XmlPullParser parser, String tagname) { }
564
        }
565

    
566
        public static class ParseCoerceException extends ImportDynClassesException { 
567

    
568
                /**
569
                 * 
570
                 */
571
                private static final long serialVersionUID = 1447718822981628834L;
572

    
573
                public ParseCoerceException(Throwable cause, XmlPullParser parser) { }
574
        }
575

    
576
        public static class WrongVersionException extends ImportDynClassesException { 
577

    
578
                private static final long serialVersionUID = 6620589308398698367L;
579

    
580
                public WrongVersionException(XmlPullParser parser) { }
581
        }
582

    
583

    
584
}