View Javadoc

1   /*
2    * $Id$
3    */
4   
5   package com.javaforge.bobber.archetype.model.io.xpp3;
6   
7     //---------------------------------/
8    //- Imported classes and packages -/
9   //---------------------------------/
10  
11  import com.javaforge.bobber.archetype.model.BobberArchetype;
12  import com.javaforge.bobber.archetype.model.Template;
13  import com.javaforge.bobber.archetype.model.Variable;
14  import java.io.IOException;
15  import java.io.InputStream;
16  import java.io.Reader;
17  import java.text.DateFormat;
18  import java.util.Locale;
19  import org.codehaus.plexus.util.ReaderFactory;
20  import org.codehaus.plexus.util.xml.pull.MXParser;
21  import org.codehaus.plexus.util.xml.pull.XmlPullParser;
22  import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
23  
24  /**
25   * Class BobberArchetypeXpp3Reader.
26   * 
27   * @version $Revision$ $Date$
28   */
29  public class BobberArchetypeXpp3Reader {
30  
31  
32        //--------------------------/
33       //- Class/Member Variables -/
34      //--------------------------/
35  
36      /**
37       * If set the parser will be loaded with all single characters
38       * from the XHTML specification.
39       * The entities used:
40       * <ul>
41       * <li>http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent</li>
42       * <li>http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent</li>
43       * <li>http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent</li>
44       * </ul>
45       */
46      private boolean addDefaultEntities = true;
47  
48  
49        //-----------/
50       //- Methods -/
51      //-----------/
52  
53      /**
54       * Returns the state of the "add default entities" flag.
55       * 
56       * @return boolean
57       */
58      public boolean getAddDefaultEntities()
59      {
60          return addDefaultEntities;
61      } //-- boolean getAddDefaultEntities() 
62  
63      /**
64       * Method getBooleanValue.
65       * 
66       * @param s
67       * @param parser
68       * @param attribute
69       * @throws XmlPullParserException
70       * @return boolean
71       */
72      public boolean getBooleanValue(String s, String attribute, XmlPullParser parser)
73          throws XmlPullParserException
74      {
75          return getBooleanValue( s, attribute, parser, null );
76      } //-- boolean getBooleanValue(String, String, XmlPullParser) 
77  
78      /**
79       * Method getBooleanValue.
80       * 
81       * @param s
82       * @param defaultValue
83       * @param parser
84       * @param attribute
85       * @throws XmlPullParserException
86       * @return boolean
87       */
88      public boolean getBooleanValue(String s, String attribute, XmlPullParser parser, String defaultValue)
89          throws XmlPullParserException
90      {
91          if ( s != null && s.length() != 0 )
92          {
93              return Boolean.valueOf( s ).booleanValue();
94          }
95          if ( defaultValue != null )
96          {
97              return Boolean.valueOf( defaultValue ).booleanValue();
98          }
99          return false;
100     } //-- boolean getBooleanValue(String, String, XmlPullParser, String) 
101 
102     /**
103      * Method getCharacterValue.
104      * 
105      * @param s
106      * @param parser
107      * @param attribute
108      * @throws XmlPullParserException
109      * @return char
110      */
111     public char getCharacterValue(String s, String attribute, XmlPullParser parser)
112         throws XmlPullParserException
113     {
114         if ( s != null )
115         {
116             return s.charAt( 0 );
117         }
118         return 0;
119     } //-- char getCharacterValue(String, String, XmlPullParser) 
120 
121     /**
122      * Method getDateValue.
123      * 
124      * @param s
125      * @param parser
126      * @param attribute
127      * @throws XmlPullParserException
128      * @return java.util.Date
129      */
130     public java.util.Date getDateValue(String s, String attribute, XmlPullParser parser)
131         throws XmlPullParserException
132     {
133         return getDateValue( s, attribute, null, parser );
134     } //-- java.util.Date getDateValue(String, String, XmlPullParser) 
135 
136     /**
137      * Method getDateValue.
138      * 
139      * @param s
140      * @param parser
141      * @param dateFormat
142      * @param attribute
143      * @throws XmlPullParserException
144      * @return java.util.Date
145      */
146     public java.util.Date getDateValue(String s, String attribute, String dateFormat, XmlPullParser parser)
147         throws XmlPullParserException
148     {
149         if ( s != null )
150         {
151             if ( dateFormat == null )
152             {
153                 return new java.util.Date( Long.valueOf( s ).longValue() );
154             }
155             else
156             {
157                 DateFormat dateParser = new java.text.SimpleDateFormat( dateFormat, Locale.US );
158                 try
159                 {
160                     return dateParser.parse( s );
161                 }
162                 catch ( java.text.ParseException e )
163                 {
164                     throw new XmlPullParserException( e.getMessage() );
165                 }
166             }
167         }
168         return null;
169     } //-- java.util.Date getDateValue(String, String, String, XmlPullParser) 
170 
171     /**
172      * Method getDoubleValue.
173      * 
174      * @param s
175      * @param strict
176      * @param parser
177      * @param attribute
178      * @throws XmlPullParserException
179      * @return double
180      */
181     public double getDoubleValue(String s, String attribute, XmlPullParser parser, boolean strict)
182         throws XmlPullParserException
183     {
184         if ( s != null )
185         {
186             try
187             {
188                 return Double.valueOf( s ).doubleValue();
189             }
190             catch ( NumberFormatException e )
191             {
192                 if ( strict )
193                 {
194                     throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be a floating point number", parser, null );
195                 }
196             }
197         }
198         return 0;
199     } //-- double getDoubleValue(String, String, XmlPullParser, boolean) 
200 
201     /**
202      * Method getFloatValue.
203      * 
204      * @param s
205      * @param strict
206      * @param parser
207      * @param attribute
208      * @throws XmlPullParserException
209      * @return float
210      */
211     public float getFloatValue(String s, String attribute, XmlPullParser parser, boolean strict)
212         throws XmlPullParserException
213     {
214         if ( s != null )
215         {
216             try
217             {
218                 return Float.valueOf( s ).floatValue();
219             }
220             catch ( NumberFormatException e )
221             {
222                 if ( strict )
223                 {
224                     throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be a floating point number", parser, null );
225                 }
226             }
227         }
228         return 0;
229     } //-- float getFloatValue(String, String, XmlPullParser, boolean) 
230 
231     /**
232      * Method getIntegerValue.
233      * 
234      * @param s
235      * @param strict
236      * @param parser
237      * @param attribute
238      * @throws XmlPullParserException
239      * @return int
240      */
241     public int getIntegerValue(String s, String attribute, XmlPullParser parser, boolean strict)
242         throws XmlPullParserException
243     {
244         if ( s != null )
245         {
246             try
247             {
248                 return Integer.valueOf( s ).intValue();
249             }
250             catch ( NumberFormatException e )
251             {
252                 if ( strict )
253                 {
254                     throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be an integer", parser, null );
255                 }
256             }
257         }
258         return 0;
259     } //-- int getIntegerValue(String, String, XmlPullParser, boolean) 
260 
261     /**
262      * Method getLongValue.
263      * 
264      * @param s
265      * @param strict
266      * @param parser
267      * @param attribute
268      * @throws XmlPullParserException
269      * @return long
270      */
271     public long getLongValue(String s, String attribute, XmlPullParser parser, boolean strict)
272         throws XmlPullParserException
273     {
274         if ( s != null )
275         {
276             try
277             {
278                 return Long.valueOf( s ).longValue();
279             }
280             catch ( NumberFormatException e )
281             {
282                 if ( strict )
283                 {
284                     throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be a long integer", parser, null );
285                 }
286             }
287         }
288         return 0;
289     } //-- long getLongValue(String, String, XmlPullParser, boolean) 
290 
291     /**
292      * Method getRequiredAttributeValue.
293      * 
294      * @param s
295      * @param strict
296      * @param parser
297      * @param attribute
298      * @throws XmlPullParserException
299      * @return String
300      */
301     public String getRequiredAttributeValue(String s, String attribute, XmlPullParser parser, boolean strict)
302         throws XmlPullParserException
303     {
304         if ( s == null )
305         {
306             if ( strict )
307             {
308                 throw new XmlPullParserException( "Missing required value for attribute '" + attribute + "'", parser, null );
309             }
310         }
311         return s;
312     } //-- String getRequiredAttributeValue(String, String, XmlPullParser, boolean) 
313 
314     /**
315      * Method getShortValue.
316      * 
317      * @param s
318      * @param strict
319      * @param parser
320      * @param attribute
321      * @throws XmlPullParserException
322      * @return short
323      */
324     public short getShortValue(String s, String attribute, XmlPullParser parser, boolean strict)
325         throws XmlPullParserException
326     {
327         if ( s != null )
328         {
329             try
330             {
331                 return Short.valueOf( s ).shortValue();
332             }
333             catch ( NumberFormatException e )
334             {
335                 if ( strict )
336                 {
337                     throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be a short integer", parser, null );
338                 }
339             }
340         }
341         return 0;
342     } //-- short getShortValue(String, String, XmlPullParser, boolean) 
343 
344     /**
345      * Method getTrimmedValue.
346      * 
347      * @param s
348      * @return String
349      */
350     public String getTrimmedValue(String s)
351     {
352         if ( s != null )
353         {
354             s = s.trim();
355         }
356         return s;
357     } //-- String getTrimmedValue(String) 
358 
359     /**
360      * Method parseBobberArchetype.
361      * 
362      * @param tagName
363      * @param strict
364      * @param parser
365      * @throws IOException
366      * @throws XmlPullParserException
367      * @return BobberArchetype
368      */
369     private BobberArchetype parseBobberArchetype(String tagName, XmlPullParser parser, boolean strict)
370         throws IOException, XmlPullParserException
371     {
372         BobberArchetype bobberArchetype = new BobberArchetype();
373         java.util.Set parsed = new java.util.HashSet();
374         int eventType = parser.getEventType();
375         boolean foundRoot = false;
376         while ( eventType != XmlPullParser.END_DOCUMENT )
377         {
378             if ( eventType == XmlPullParser.START_TAG )
379             {
380                 if ( parser.getName().equals( tagName ) )
381                 {
382                     foundRoot = true;
383                 }
384                 else if ( parser.getName().equals( "id" )  )
385                 {
386                     if ( parsed.contains( "id" ) )
387                     {
388                         throw new XmlPullParserException( "Duplicated tag: '" + parser.getName() + "'", parser, null );
389                     }
390                     parsed.add( "id" );
391                     bobberArchetype.setId( getTrimmedValue( parser.nextText()) );
392                 }
393                 else if ( parser.getName().equals( "allowPartial" )  )
394                 {
395                     if ( parsed.contains( "allowPartial" ) )
396                     {
397                         throw new XmlPullParserException( "Duplicated tag: '" + parser.getName() + "'", parser, null );
398                     }
399                     parsed.add( "allowPartial" );
400                     bobberArchetype.setAllowPartial( getBooleanValue( getTrimmedValue( parser.nextText()), "allowPartial", parser, "false" ) );
401                 }
402                 else if ( parser.getName().equals( "variables" )  )
403                 {
404                     if ( parsed.contains( "variables" ) )
405                     {
406                         throw new XmlPullParserException( "Duplicated tag: '" + parser.getName() + "'", parser, null );
407                     }
408                     parsed.add( "variables" );
409                     java.util.List variables = new java.util.ArrayList();
410                     bobberArchetype.setVariables( variables );
411                     while ( parser.nextTag() == XmlPullParser.START_TAG )
412                     {
413                         if ( parser.getName().equals( "variable" ) )
414                         {
415                             variables.add( parseVariable( "variable", parser, strict ) );
416                         }
417                         else if ( strict )
418                         {
419                             throw new XmlPullParserException( "Unrecognised association: '" + parser.getName() + "'", parser, null );
420                         }
421                         else
422                         {
423                             // swallow up to end tag since this is not valid
424                             while ( parser.next() != XmlPullParser.END_TAG ) {}
425                         }
426                     }
427                 }
428                 else if ( parser.getName().equals( "templates" )  )
429                 {
430                     if ( parsed.contains( "templates" ) )
431                     {
432                         throw new XmlPullParserException( "Duplicated tag: '" + parser.getName() + "'", parser, null );
433                     }
434                     parsed.add( "templates" );
435                     java.util.List templates = new java.util.ArrayList();
436                     bobberArchetype.setTemplates( templates );
437                     while ( parser.nextTag() == XmlPullParser.START_TAG )
438                     {
439                         if ( parser.getName().equals( "template" ) )
440                         {
441                             templates.add( parseTemplate( "template", parser, strict ) );
442                         }
443                         else if ( strict )
444                         {
445                             throw new XmlPullParserException( "Unrecognised association: '" + parser.getName() + "'", parser, null );
446                         }
447                         else
448                         {
449                             // swallow up to end tag since this is not valid
450                             while ( parser.next() != XmlPullParser.END_TAG ) {}
451                         }
452                     }
453                 }
454                 else if ( !foundRoot && strict )
455                 {
456                     throw new XmlPullParserException( "Unrecognised tag: '" + parser.getName() + "'", parser, null );
457                 }
458             }
459             eventType = parser.next();
460         }
461         return bobberArchetype;
462     } //-- BobberArchetype parseBobberArchetype(String, XmlPullParser, boolean) 
463 
464     /**
465      * Method parseTemplate.
466      * 
467      * @param tagName
468      * @param strict
469      * @param parser
470      * @throws IOException
471      * @throws XmlPullParserException
472      * @return Template
473      */
474     private Template parseTemplate(String tagName, XmlPullParser parser, boolean strict)
475         throws IOException, XmlPullParserException
476     {
477         Template template = new Template();
478         java.util.Set parsed = new java.util.HashSet();
479         while ( parser.nextTag() == XmlPullParser.START_TAG )
480         {
481             if ( parser.getName().equals( "file" )  )
482             {
483                 if ( parsed.contains( "file" ) )
484                 {
485                     throw new XmlPullParserException( "Duplicated tag: '" + parser.getName() + "'", parser, null );
486                 }
487                 parsed.add( "file" );
488                 template.setFile( getTrimmedValue( parser.nextText()) );
489             }
490             else if ( parser.getName().equals( "output" )  )
491             {
492                 if ( parsed.contains( "output" ) )
493                 {
494                     throw new XmlPullParserException( "Duplicated tag: '" + parser.getName() + "'", parser, null );
495                 }
496                 parsed.add( "output" );
497                 template.setOutput( getTrimmedValue( parser.nextText()) );
498             }
499             else if ( parser.getName().equals( "dependsOnVar" )  )
500             {
501                 if ( parsed.contains( "dependsOnVar" ) )
502                 {
503                     throw new XmlPullParserException( "Duplicated tag: '" + parser.getName() + "'", parser, null );
504                 }
505                 parsed.add( "dependsOnVar" );
506                 template.setDependsOnVar( getTrimmedValue( parser.nextText()) );
507             }
508             else
509             {
510                 if ( strict )
511                 {
512                     throw new XmlPullParserException( "Unrecognised tag: '" + parser.getName() + "'", parser, null );
513                 }
514                 else
515                 {
516                     // swallow up to end tag since this is not valid
517                     while ( parser.next() != XmlPullParser.END_TAG ) {}
518                 }
519             }
520         }
521         return template;
522     } //-- Template parseTemplate(String, XmlPullParser, boolean) 
523 
524     /**
525      * Method parseVariable.
526      * 
527      * @param tagName
528      * @param strict
529      * @param parser
530      * @throws IOException
531      * @throws XmlPullParserException
532      * @return Variable
533      */
534     private Variable parseVariable(String tagName, XmlPullParser parser, boolean strict)
535         throws IOException, XmlPullParserException
536     {
537         Variable variable = new Variable();
538         java.util.Set parsed = new java.util.HashSet();
539         while ( parser.nextTag() == XmlPullParser.START_TAG )
540         {
541             if ( parser.getName().equals( "name" )  )
542             {
543                 if ( parsed.contains( "name" ) )
544                 {
545                     throw new XmlPullParserException( "Duplicated tag: '" + parser.getName() + "'", parser, null );
546                 }
547                 parsed.add( "name" );
548                 variable.setName( getTrimmedValue( parser.nextText()) );
549             }
550             else if ( parser.getName().equals( "description" )  )
551             {
552                 if ( parsed.contains( "description" ) )
553                 {
554                     throw new XmlPullParserException( "Duplicated tag: '" + parser.getName() + "'", parser, null );
555                 }
556                 parsed.add( "description" );
557                 variable.setDescription( getTrimmedValue( parser.nextText()) );
558             }
559             else if ( parser.getName().equals( "defvalue" )  )
560             {
561                 if ( parsed.contains( "defvalue" ) )
562                 {
563                     throw new XmlPullParserException( "Duplicated tag: '" + parser.getName() + "'", parser, null );
564                 }
565                 parsed.add( "defvalue" );
566                 variable.setDefvalue( getTrimmedValue( parser.nextText()) );
567             }
568             else if ( parser.getName().equals( "variables" )  )
569             {
570                 if ( parsed.contains( "variables" ) )
571                 {
572                     throw new XmlPullParserException( "Duplicated tag: '" + parser.getName() + "'", parser, null );
573                 }
574                 parsed.add( "variables" );
575                 java.util.List variables = new java.util.ArrayList();
576                 variable.setVariables( variables );
577                 while ( parser.nextTag() == XmlPullParser.START_TAG )
578                 {
579                     if ( parser.getName().equals( "variable" ) )
580                     {
581                         variables.add( parseVariable( "variable", parser, strict ) );
582                     }
583                     else if ( strict )
584                     {
585                         throw new XmlPullParserException( "Unrecognised association: '" + parser.getName() + "'", parser, null );
586                     }
587                     else
588                     {
589                         // swallow up to end tag since this is not valid
590                         while ( parser.next() != XmlPullParser.END_TAG ) {}
591                     }
592                 }
593             }
594             else
595             {
596                 if ( strict )
597                 {
598                     throw new XmlPullParserException( "Unrecognised tag: '" + parser.getName() + "'", parser, null );
599                 }
600                 else
601                 {
602                     // swallow up to end tag since this is not valid
603                     while ( parser.next() != XmlPullParser.END_TAG ) {}
604                 }
605             }
606         }
607         return variable;
608     } //-- Variable parseVariable(String, XmlPullParser, boolean) 
609 
610     /**
611      * @see ReaderFactory#newXmlReader
612      * 
613      * @param reader
614      * @param strict
615      * @throws IOException
616      * @throws XmlPullParserException
617      * @return BobberArchetype
618      */
619     public BobberArchetype read(Reader reader, boolean strict)
620         throws IOException, XmlPullParserException
621     {
622         XmlPullParser parser = new MXParser();
623         
624         parser.setInput( reader );
625         
626         if ( addDefaultEntities ) 
627         {
628             // ----------------------------------------------------------------------
629             // Latin 1 entities
630             // ----------------------------------------------------------------------
631             
632             parser.defineEntityReplacementText( "nbsp", "\u00a0" ); 
633             parser.defineEntityReplacementText( "iexcl", "\u00a1" ); 
634             parser.defineEntityReplacementText( "cent", "\u00a2" ); 
635             parser.defineEntityReplacementText( "pound", "\u00a3" ); 
636             parser.defineEntityReplacementText( "curren", "\u00a4" ); 
637             parser.defineEntityReplacementText( "yen", "\u00a5" ); 
638             parser.defineEntityReplacementText( "brvbar", "\u00a6" ); 
639             parser.defineEntityReplacementText( "sect", "\u00a7" ); 
640             parser.defineEntityReplacementText( "uml", "\u00a8" ); 
641             parser.defineEntityReplacementText( "copy", "\u00a9" ); 
642             parser.defineEntityReplacementText( "ordf", "\u00aa" ); 
643             parser.defineEntityReplacementText( "laquo", "\u00ab" ); 
644             parser.defineEntityReplacementText( "not", "\u00ac" ); 
645             parser.defineEntityReplacementText( "shy", "\u00ad" ); 
646             parser.defineEntityReplacementText( "reg", "\u00ae" ); 
647             parser.defineEntityReplacementText( "macr", "\u00af" ); 
648             parser.defineEntityReplacementText( "deg", "\u00b0" ); 
649             parser.defineEntityReplacementText( "plusmn", "\u00b1" ); 
650             parser.defineEntityReplacementText( "sup2", "\u00b2" ); 
651             parser.defineEntityReplacementText( "sup3", "\u00b3" ); 
652             parser.defineEntityReplacementText( "acute", "\u00b4" ); 
653             parser.defineEntityReplacementText( "micro", "\u00b5" ); 
654             parser.defineEntityReplacementText( "para", "\u00b6" ); 
655             parser.defineEntityReplacementText( "middot", "\u00b7" ); 
656             parser.defineEntityReplacementText( "cedil", "\u00b8" ); 
657             parser.defineEntityReplacementText( "sup1", "\u00b9" ); 
658             parser.defineEntityReplacementText( "ordm", "\u00ba" ); 
659             parser.defineEntityReplacementText( "raquo", "\u00bb" ); 
660             parser.defineEntityReplacementText( "frac14", "\u00bc" ); 
661             parser.defineEntityReplacementText( "frac12", "\u00bd" ); 
662             parser.defineEntityReplacementText( "frac34", "\u00be" ); 
663             parser.defineEntityReplacementText( "iquest", "\u00bf" ); 
664             parser.defineEntityReplacementText( "Agrave", "\u00c0" ); 
665             parser.defineEntityReplacementText( "Aacute", "\u00c1" ); 
666             parser.defineEntityReplacementText( "Acirc", "\u00c2" ); 
667             parser.defineEntityReplacementText( "Atilde", "\u00c3" ); 
668             parser.defineEntityReplacementText( "Auml", "\u00c4" ); 
669             parser.defineEntityReplacementText( "Aring", "\u00c5" ); 
670             parser.defineEntityReplacementText( "AElig", "\u00c6" ); 
671             parser.defineEntityReplacementText( "Ccedil", "\u00c7" ); 
672             parser.defineEntityReplacementText( "Egrave", "\u00c8" ); 
673             parser.defineEntityReplacementText( "Eacute", "\u00c9" ); 
674             parser.defineEntityReplacementText( "Ecirc", "\u00ca" ); 
675             parser.defineEntityReplacementText( "Euml", "\u00cb" ); 
676             parser.defineEntityReplacementText( "Igrave", "\u00cc" ); 
677             parser.defineEntityReplacementText( "Iacute", "\u00cd" ); 
678             parser.defineEntityReplacementText( "Icirc", "\u00ce" ); 
679             parser.defineEntityReplacementText( "Iuml", "\u00cf" ); 
680             parser.defineEntityReplacementText( "ETH", "\u00d0" ); 
681             parser.defineEntityReplacementText( "Ntilde", "\u00d1" ); 
682             parser.defineEntityReplacementText( "Ograve", "\u00d2" ); 
683             parser.defineEntityReplacementText( "Oacute", "\u00d3" ); 
684             parser.defineEntityReplacementText( "Ocirc", "\u00d4" ); 
685             parser.defineEntityReplacementText( "Otilde", "\u00d5" ); 
686             parser.defineEntityReplacementText( "Ouml", "\u00d6" ); 
687             parser.defineEntityReplacementText( "times", "\u00d7" ); 
688             parser.defineEntityReplacementText( "Oslash", "\u00d8" ); 
689             parser.defineEntityReplacementText( "Ugrave", "\u00d9" ); 
690             parser.defineEntityReplacementText( "Uacute", "\u00da" ); 
691             parser.defineEntityReplacementText( "Ucirc", "\u00db" ); 
692             parser.defineEntityReplacementText( "Uuml", "\u00dc" ); 
693             parser.defineEntityReplacementText( "Yacute", "\u00dd" ); 
694             parser.defineEntityReplacementText( "THORN", "\u00de" ); 
695             parser.defineEntityReplacementText( "szlig", "\u00df" ); 
696             parser.defineEntityReplacementText( "agrave", "\u00e0" ); 
697             parser.defineEntityReplacementText( "aacute", "\u00e1" ); 
698             parser.defineEntityReplacementText( "acirc", "\u00e2" ); 
699             parser.defineEntityReplacementText( "atilde", "\u00e3" ); 
700             parser.defineEntityReplacementText( "auml", "\u00e4" ); 
701             parser.defineEntityReplacementText( "aring", "\u00e5" ); 
702             parser.defineEntityReplacementText( "aelig", "\u00e6" ); 
703             parser.defineEntityReplacementText( "ccedil", "\u00e7" ); 
704             parser.defineEntityReplacementText( "egrave", "\u00e8" ); 
705             parser.defineEntityReplacementText( "eacute", "\u00e9" ); 
706             parser.defineEntityReplacementText( "ecirc", "\u00ea" ); 
707             parser.defineEntityReplacementText( "euml", "\u00eb" ); 
708             parser.defineEntityReplacementText( "igrave", "\u00ec" ); 
709             parser.defineEntityReplacementText( "iacute", "\u00ed" ); 
710             parser.defineEntityReplacementText( "icirc", "\u00ee" ); 
711             parser.defineEntityReplacementText( "iuml", "\u00ef" ); 
712             parser.defineEntityReplacementText( "eth", "\u00f0" ); 
713             parser.defineEntityReplacementText( "ntilde", "\u00f1" ); 
714             parser.defineEntityReplacementText( "ograve", "\u00f2" ); 
715             parser.defineEntityReplacementText( "oacute", "\u00f3" ); 
716             parser.defineEntityReplacementText( "ocirc", "\u00f4" ); 
717             parser.defineEntityReplacementText( "otilde", "\u00f5" ); 
718             parser.defineEntityReplacementText( "ouml", "\u00f6" ); 
719             parser.defineEntityReplacementText( "divide", "\u00f7" ); 
720             parser.defineEntityReplacementText( "oslash", "\u00f8" ); 
721             parser.defineEntityReplacementText( "ugrave", "\u00f9" ); 
722             parser.defineEntityReplacementText( "uacute", "\u00fa" ); 
723             parser.defineEntityReplacementText( "ucirc", "\u00fb" ); 
724             parser.defineEntityReplacementText( "uuml", "\u00fc" ); 
725             parser.defineEntityReplacementText( "yacute", "\u00fd" ); 
726             parser.defineEntityReplacementText( "thorn", "\u00fe" ); 
727             parser.defineEntityReplacementText( "yuml", "\u00ff" ); 
728             
729             // ----------------------------------------------------------------------
730             // Special entities
731             // ----------------------------------------------------------------------
732             
733             parser.defineEntityReplacementText( "OElig", "\u0152" ); 
734             parser.defineEntityReplacementText( "oelig", "\u0153" ); 
735             parser.defineEntityReplacementText( "Scaron", "\u0160" ); 
736             parser.defineEntityReplacementText( "scaron", "\u0161" ); 
737             parser.defineEntityReplacementText( "Yuml", "\u0178" ); 
738             parser.defineEntityReplacementText( "circ", "\u02c6" ); 
739             parser.defineEntityReplacementText( "tilde", "\u02dc" ); 
740             parser.defineEntityReplacementText( "ensp", "\u2002" ); 
741             parser.defineEntityReplacementText( "emsp", "\u2003" ); 
742             parser.defineEntityReplacementText( "thinsp", "\u2009" ); 
743             parser.defineEntityReplacementText( "zwnj", "\u200c" ); 
744             parser.defineEntityReplacementText( "zwj", "\u200d" ); 
745             parser.defineEntityReplacementText( "lrm", "\u200e" ); 
746             parser.defineEntityReplacementText( "rlm", "\u200f" ); 
747             parser.defineEntityReplacementText( "ndash", "\u2013" ); 
748             parser.defineEntityReplacementText( "mdash", "\u2014" ); 
749             parser.defineEntityReplacementText( "lsquo", "\u2018" ); 
750             parser.defineEntityReplacementText( "rsquo", "\u2019" ); 
751             parser.defineEntityReplacementText( "sbquo", "\u201a" ); 
752             parser.defineEntityReplacementText( "ldquo", "\u201c" ); 
753             parser.defineEntityReplacementText( "rdquo", "\u201d" ); 
754             parser.defineEntityReplacementText( "bdquo", "\u201e" ); 
755             parser.defineEntityReplacementText( "dagger", "\u2020" ); 
756             parser.defineEntityReplacementText( "Dagger", "\u2021" ); 
757             parser.defineEntityReplacementText( "permil", "\u2030" ); 
758             parser.defineEntityReplacementText( "lsaquo", "\u2039" ); 
759             parser.defineEntityReplacementText( "rsaquo", "\u203a" ); 
760             parser.defineEntityReplacementText( "euro", "\u20ac" ); 
761             
762             // ----------------------------------------------------------------------
763             // Symbol entities
764             // ----------------------------------------------------------------------
765             
766             parser.defineEntityReplacementText( "fnof", "\u0192" ); 
767             parser.defineEntityReplacementText( "Alpha", "\u0391" ); 
768             parser.defineEntityReplacementText( "Beta", "\u0392" ); 
769             parser.defineEntityReplacementText( "Gamma", "\u0393" ); 
770             parser.defineEntityReplacementText( "Delta", "\u0394" ); 
771             parser.defineEntityReplacementText( "Epsilon", "\u0395" ); 
772             parser.defineEntityReplacementText( "Zeta", "\u0396" ); 
773             parser.defineEntityReplacementText( "Eta", "\u0397" ); 
774             parser.defineEntityReplacementText( "Theta", "\u0398" ); 
775             parser.defineEntityReplacementText( "Iota", "\u0399" ); 
776             parser.defineEntityReplacementText( "Kappa", "\u039a" ); 
777             parser.defineEntityReplacementText( "Lambda", "\u039b" ); 
778             parser.defineEntityReplacementText( "Mu", "\u039c" ); 
779             parser.defineEntityReplacementText( "Nu", "\u039d" ); 
780             parser.defineEntityReplacementText( "Xi", "\u039e" ); 
781             parser.defineEntityReplacementText( "Omicron", "\u039f" ); 
782             parser.defineEntityReplacementText( "Pi", "\u03a0" ); 
783             parser.defineEntityReplacementText( "Rho", "\u03a1" ); 
784             parser.defineEntityReplacementText( "Sigma", "\u03a3" ); 
785             parser.defineEntityReplacementText( "Tau", "\u03a4" ); 
786             parser.defineEntityReplacementText( "Upsilon", "\u03a5" ); 
787             parser.defineEntityReplacementText( "Phi", "\u03a6" ); 
788             parser.defineEntityReplacementText( "Chi", "\u03a7" ); 
789             parser.defineEntityReplacementText( "Psi", "\u03a8" ); 
790             parser.defineEntityReplacementText( "Omega", "\u03a9" ); 
791             parser.defineEntityReplacementText( "alpha", "\u03b1" ); 
792             parser.defineEntityReplacementText( "beta", "\u03b2" ); 
793             parser.defineEntityReplacementText( "gamma", "\u03b3" ); 
794             parser.defineEntityReplacementText( "delta", "\u03b4" ); 
795             parser.defineEntityReplacementText( "epsilon", "\u03b5" ); 
796             parser.defineEntityReplacementText( "zeta", "\u03b6" ); 
797             parser.defineEntityReplacementText( "eta", "\u03b7" ); 
798             parser.defineEntityReplacementText( "theta", "\u03b8" ); 
799             parser.defineEntityReplacementText( "iota", "\u03b9" ); 
800             parser.defineEntityReplacementText( "kappa", "\u03ba" ); 
801             parser.defineEntityReplacementText( "lambda", "\u03bb" ); 
802             parser.defineEntityReplacementText( "mu", "\u03bc" ); 
803             parser.defineEntityReplacementText( "nu", "\u03bd" ); 
804             parser.defineEntityReplacementText( "xi", "\u03be" ); 
805             parser.defineEntityReplacementText( "omicron", "\u03bf" ); 
806             parser.defineEntityReplacementText( "pi", "\u03c0" ); 
807             parser.defineEntityReplacementText( "rho", "\u03c1" ); 
808             parser.defineEntityReplacementText( "sigmaf", "\u03c2" ); 
809             parser.defineEntityReplacementText( "sigma", "\u03c3" ); 
810             parser.defineEntityReplacementText( "tau", "\u03c4" ); 
811             parser.defineEntityReplacementText( "upsilon", "\u03c5" ); 
812             parser.defineEntityReplacementText( "phi", "\u03c6" ); 
813             parser.defineEntityReplacementText( "chi", "\u03c7" ); 
814             parser.defineEntityReplacementText( "psi", "\u03c8" ); 
815             parser.defineEntityReplacementText( "omega", "\u03c9" ); 
816             parser.defineEntityReplacementText( "thetasym", "\u03d1" ); 
817             parser.defineEntityReplacementText( "upsih", "\u03d2" ); 
818             parser.defineEntityReplacementText( "piv", "\u03d6" ); 
819             parser.defineEntityReplacementText( "bull", "\u2022" ); 
820             parser.defineEntityReplacementText( "hellip", "\u2026" ); 
821             parser.defineEntityReplacementText( "prime", "\u2032" ); 
822             parser.defineEntityReplacementText( "Prime", "\u2033" ); 
823             parser.defineEntityReplacementText( "oline", "\u203e" ); 
824             parser.defineEntityReplacementText( "frasl", "\u2044" ); 
825             parser.defineEntityReplacementText( "weierp", "\u2118" ); 
826             parser.defineEntityReplacementText( "image", "\u2111" ); 
827             parser.defineEntityReplacementText( "real", "\u211c" ); 
828             parser.defineEntityReplacementText( "trade", "\u2122" ); 
829             parser.defineEntityReplacementText( "alefsym", "\u2135" ); 
830             parser.defineEntityReplacementText( "larr", "\u2190" ); 
831             parser.defineEntityReplacementText( "uarr", "\u2191" ); 
832             parser.defineEntityReplacementText( "rarr", "\u2192" ); 
833             parser.defineEntityReplacementText( "darr", "\u2193" ); 
834             parser.defineEntityReplacementText( "harr", "\u2194" ); 
835             parser.defineEntityReplacementText( "crarr", "\u21b5" ); 
836             parser.defineEntityReplacementText( "lArr", "\u21d0" ); 
837             parser.defineEntityReplacementText( "uArr", "\u21d1" ); 
838             parser.defineEntityReplacementText( "rArr", "\u21d2" ); 
839             parser.defineEntityReplacementText( "dArr", "\u21d3" ); 
840             parser.defineEntityReplacementText( "hArr", "\u21d4" ); 
841             parser.defineEntityReplacementText( "forall", "\u2200" ); 
842             parser.defineEntityReplacementText( "part", "\u2202" ); 
843             parser.defineEntityReplacementText( "exist", "\u2203" ); 
844             parser.defineEntityReplacementText( "empty", "\u2205" ); 
845             parser.defineEntityReplacementText( "nabla", "\u2207" ); 
846             parser.defineEntityReplacementText( "isin", "\u2208" ); 
847             parser.defineEntityReplacementText( "notin", "\u2209" ); 
848             parser.defineEntityReplacementText( "ni", "\u220b" ); 
849             parser.defineEntityReplacementText( "prod", "\u220f" ); 
850             parser.defineEntityReplacementText( "sum", "\u2211" ); 
851             parser.defineEntityReplacementText( "minus", "\u2212" ); 
852             parser.defineEntityReplacementText( "lowast", "\u2217" ); 
853             parser.defineEntityReplacementText( "radic", "\u221a" ); 
854             parser.defineEntityReplacementText( "prop", "\u221d" ); 
855             parser.defineEntityReplacementText( "infin", "\u221e" ); 
856             parser.defineEntityReplacementText( "ang", "\u2220" ); 
857             parser.defineEntityReplacementText( "and", "\u2227" ); 
858             parser.defineEntityReplacementText( "or", "\u2228" ); 
859             parser.defineEntityReplacementText( "cap", "\u2229" ); 
860             parser.defineEntityReplacementText( "cup", "\u222a" ); 
861             parser.defineEntityReplacementText( "int", "\u222b" ); 
862             parser.defineEntityReplacementText( "there4", "\u2234" ); 
863             parser.defineEntityReplacementText( "sim", "\u223c" ); 
864             parser.defineEntityReplacementText( "cong", "\u2245" ); 
865             parser.defineEntityReplacementText( "asymp", "\u2248" ); 
866             parser.defineEntityReplacementText( "ne", "\u2260" ); 
867             parser.defineEntityReplacementText( "equiv", "\u2261" ); 
868             parser.defineEntityReplacementText( "le", "\u2264" ); 
869             parser.defineEntityReplacementText( "ge", "\u2265" ); 
870             parser.defineEntityReplacementText( "sub", "\u2282" ); 
871             parser.defineEntityReplacementText( "sup", "\u2283" ); 
872             parser.defineEntityReplacementText( "nsub", "\u2284" ); 
873             parser.defineEntityReplacementText( "sube", "\u2286" ); 
874             parser.defineEntityReplacementText( "supe", "\u2287" ); 
875             parser.defineEntityReplacementText( "oplus", "\u2295" ); 
876             parser.defineEntityReplacementText( "otimes", "\u2297" ); 
877             parser.defineEntityReplacementText( "perp", "\u22a5" ); 
878             parser.defineEntityReplacementText( "sdot", "\u22c5" ); 
879             parser.defineEntityReplacementText( "lceil", "\u2308" ); 
880             parser.defineEntityReplacementText( "rceil", "\u2309" ); 
881             parser.defineEntityReplacementText( "lfloor", "\u230a" ); 
882             parser.defineEntityReplacementText( "rfloor", "\u230b" ); 
883             parser.defineEntityReplacementText( "lang", "\u2329" ); 
884             parser.defineEntityReplacementText( "rang", "\u232a" ); 
885             parser.defineEntityReplacementText( "loz", "\u25ca" ); 
886             parser.defineEntityReplacementText( "spades", "\u2660" ); 
887             parser.defineEntityReplacementText( "clubs", "\u2663" ); 
888             parser.defineEntityReplacementText( "hearts", "\u2665" ); 
889             parser.defineEntityReplacementText( "diams", "\u2666" ); 
890             
891         }
892         
893         parser.next();
894         return parseBobberArchetype( "archetype", parser, strict );
895     } //-- BobberArchetype read(Reader, boolean) 
896 
897     /**
898      * @see ReaderFactory#newXmlReader
899      * 
900      * @param reader
901      * @throws IOException
902      * @throws XmlPullParserException
903      * @return BobberArchetype
904      */
905     public BobberArchetype read(Reader reader)
906         throws IOException, XmlPullParserException
907     {
908         return read( reader, true );
909     } //-- BobberArchetype read(Reader) 
910 
911     /**
912      * Method read.
913      * 
914      * @param in
915      * @param strict
916      * @throws IOException
917      * @throws XmlPullParserException
918      * @return BobberArchetype
919      */
920     public BobberArchetype read(InputStream in, boolean strict)
921         throws IOException, XmlPullParserException
922     {
923         Reader reader = ReaderFactory.newXmlReader( in );
924         
925         return read( reader, strict );
926     } //-- BobberArchetype read(InputStream, boolean) 
927 
928     /**
929      * Method read.
930      * 
931      * @param in
932      * @throws IOException
933      * @throws XmlPullParserException
934      * @return BobberArchetype
935      */
936     public BobberArchetype read(InputStream in)
937         throws IOException, XmlPullParserException
938     {
939         Reader reader = ReaderFactory.newXmlReader( in );
940         
941         return read( reader );
942     } //-- BobberArchetype read(InputStream) 
943 
944     /**
945      * Sets the state of the "add default entities" flag.
946      * 
947      * @param addDefaultEntities
948      */
949     public void setAddDefaultEntities(boolean addDefaultEntities)
950     {
951         this.addDefaultEntities = addDefaultEntities;
952     } //-- void setAddDefaultEntities(boolean) 
953 
954 
955 }