View Javadoc
1   // =================== DO NOT EDIT THIS FILE ====================
2   // Generated by Modello 2.1.2,
3   // any modifications will be overwritten.
4   // ==============================================================
5   
6   package org.apache.maven.doxia.site.io.xpp3;
7   
8     //---------------------------------/
9    //- Imported classes and packages -/
10  //---------------------------------/
11  
12  import java.io.IOException;
13  import java.io.InputStream;
14  import java.io.Reader;
15  import java.text.DateFormat;
16  import org.apache.maven.doxia.site.Banner;
17  import org.apache.maven.doxia.site.Body;
18  import org.apache.maven.doxia.site.Image;
19  import org.apache.maven.doxia.site.LinkItem;
20  import org.apache.maven.doxia.site.Logo;
21  import org.apache.maven.doxia.site.Menu;
22  import org.apache.maven.doxia.site.MenuItem;
23  import org.apache.maven.doxia.site.PublishDate;
24  import org.apache.maven.doxia.site.SiteModel;
25  import org.apache.maven.doxia.site.Skin;
26  import org.apache.maven.doxia.site.Version;
27  import org.codehaus.plexus.util.ReaderFactory;
28  import org.codehaus.plexus.util.xml.pull.EntityReplacementMap;
29  import org.codehaus.plexus.util.xml.pull.MXParser;
30  import org.codehaus.plexus.util.xml.pull.XmlPullParser;
31  import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
32  
33  /**
34   * Class SiteXpp3Reader.
35   * 
36   * @version $Revision$ $Date$
37   */
38  @SuppressWarnings( "all" )
39  public class SiteXpp3Reader
40  {
41  
42        //--------------------------/
43       //- Class/Member Variables -/
44      //--------------------------/
45  
46      /**
47       * If set the parser will be loaded with all single characters
48       * from the XHTML specification.
49       * The entities used:
50       * <ul>
51       * <li>http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent</li>
52       * <li>http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent</li>
53       * <li>http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent</li>
54       * </ul>
55       */
56      private boolean addDefaultEntities = true;
57  
58      /**
59       * Field contentTransformer.
60       */
61      public final ContentTransformer contentTransformer;
62  
63  
64        //----------------/
65       //- Constructors -/
66      //----------------/
67  
68      public SiteXpp3Reader()
69      {
70          this( new ContentTransformer()
71          {
72              public String transform( String source, String fieldName )
73              {
74                  return source;
75              }
76          } );
77      } //-- org.apache.maven.doxia.site.io.xpp3.SiteXpp3Reader()
78  
79      public SiteXpp3Reader(ContentTransformer contentTransformer)
80      {
81          this.contentTransformer = contentTransformer;
82      } //-- org.apache.maven.doxia.site.io.xpp3.SiteXpp3Reader(ContentTransformer)
83  
84  
85        //-----------/
86       //- Methods -/
87      //-----------/
88  
89      /**
90       * Method checkFieldWithDuplicate.
91       * 
92       * @param parser a parser object.
93       * @param parsed a parsed object.
94       * @param alias a alias object.
95       * @param tagName a tagName object.
96       * @throws XmlPullParserException XmlPullParserException if
97       * any.
98       * @return boolean
99       */
100     private boolean checkFieldWithDuplicate( XmlPullParser parser, String tagName, String alias, java.util.Set parsed )
101         throws XmlPullParserException
102     {
103         if ( !( parser.getName().equals( tagName ) || parser.getName().equals( alias ) ) )
104         {
105             return false;
106         }
107         if ( !parsed.add( tagName ) )
108         {
109             throw new XmlPullParserException( "Duplicated tag: '" + tagName + "'", parser, null );
110         }
111         return true;
112     } //-- boolean checkFieldWithDuplicate( XmlPullParser, String, String, java.util.Set )
113 
114     /**
115      * Method checkUnknownAttribute.
116      * 
117      * @param parser a parser object.
118      * @param strict a strict object.
119      * @param tagName a tagName object.
120      * @param attribute a attribute object.
121      * @throws XmlPullParserException XmlPullParserException if
122      * any.
123      * @throws IOException IOException if any.
124      */
125     private void checkUnknownAttribute( XmlPullParser parser, String attribute, String tagName, boolean strict )
126         throws XmlPullParserException, IOException
127     {
128         // strictXmlAttributes = true for model: if strict == true, not only elements are checked but attributes too
129         if ( strict )
130         {
131             throw new XmlPullParserException( "Unknown attribute '" + attribute + "' for tag '" + tagName + "'", parser, null );
132         }
133     } //-- void checkUnknownAttribute( XmlPullParser, String, String, boolean )
134 
135     /**
136      * Method checkUnknownElement.
137      * 
138      * @param parser a parser object.
139      * @param strict a strict object.
140      * @throws XmlPullParserException XmlPullParserException if
141      * any.
142      * @throws IOException IOException if any.
143      */
144     private void checkUnknownElement( XmlPullParser parser, boolean strict )
145         throws XmlPullParserException, IOException
146     {
147         if ( strict )
148         {
149             throw new XmlPullParserException( "Unrecognised tag: '" + parser.getName() + "'", parser, null );
150         }
151 
152         for ( int unrecognizedTagCount = 1; unrecognizedTagCount > 0; )
153         {
154             int eventType = parser.next();
155             if ( eventType == XmlPullParser.START_TAG )
156             {
157                 unrecognizedTagCount++;
158             }
159             else if ( eventType == XmlPullParser.END_TAG )
160             {
161                 unrecognizedTagCount--;
162             }
163         }
164     } //-- void checkUnknownElement( XmlPullParser, boolean )
165 
166     /**
167      * Returns the state of the "add default entities" flag.
168      * 
169      * @return boolean
170      */
171     public boolean getAddDefaultEntities()
172     {
173         return addDefaultEntities;
174     } //-- boolean getAddDefaultEntities()
175 
176     /**
177      * Method getBooleanValue.
178      * 
179      * @param s a s object.
180      * @param parser a parser object.
181      * @param attribute a attribute object.
182      * @throws XmlPullParserException XmlPullParserException if
183      * any.
184      * @return boolean
185      */
186     private boolean getBooleanValue( String s, String attribute, XmlPullParser parser )
187         throws XmlPullParserException
188     {
189         return getBooleanValue( s, attribute, parser, null );
190     } //-- boolean getBooleanValue( String, String, XmlPullParser )
191 
192     /**
193      * Method getBooleanValue.
194      * 
195      * @param s a s object.
196      * @param defaultValue a defaultValue object.
197      * @param parser a parser object.
198      * @param attribute a attribute object.
199      * @throws XmlPullParserException XmlPullParserException if
200      * any.
201      * @return boolean
202      */
203     private boolean getBooleanValue( String s, String attribute, XmlPullParser parser, String defaultValue )
204         throws XmlPullParserException
205     {
206         if ( s != null && s.length() != 0 )
207         {
208             return Boolean.valueOf( s ).booleanValue();
209         }
210         if ( defaultValue != null )
211         {
212             return Boolean.valueOf( defaultValue ).booleanValue();
213         }
214         return false;
215     } //-- boolean getBooleanValue( String, String, XmlPullParser, String )
216 
217     /**
218      * Method getByteValue.
219      * 
220      * @param s a s object.
221      * @param strict a strict object.
222      * @param parser a parser object.
223      * @param attribute a attribute object.
224      * @throws XmlPullParserException XmlPullParserException if
225      * any.
226      * @return byte
227      */
228     private byte getByteValue( String s, String attribute, XmlPullParser parser, boolean strict )
229         throws XmlPullParserException
230     {
231         if ( s != null )
232         {
233             try
234             {
235                 return Byte.valueOf( s ).byteValue();
236             }
237             catch ( NumberFormatException nfe )
238             {
239                 if ( strict )
240                 {
241                     throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be a byte", parser, nfe );
242                 }
243             }
244         }
245         return 0;
246     } //-- byte getByteValue( String, String, XmlPullParser, boolean )
247 
248     /**
249      * Method getCharacterValue.
250      * 
251      * @param s a s object.
252      * @param parser a parser object.
253      * @param attribute a attribute object.
254      * @throws XmlPullParserException XmlPullParserException if
255      * any.
256      * @return char
257      */
258     private char getCharacterValue( String s, String attribute, XmlPullParser parser )
259         throws XmlPullParserException
260     {
261         if ( s != null )
262         {
263             return s.charAt( 0 );
264         }
265         return 0;
266     } //-- char getCharacterValue( String, String, XmlPullParser )
267 
268     /**
269      * Method getDateValue.
270      * 
271      * @param s a s object.
272      * @param parser a parser object.
273      * @param attribute a attribute object.
274      * @throws XmlPullParserException XmlPullParserException if
275      * any.
276      * @return Date
277      */
278     private java.util.Date getDateValue( String s, String attribute, XmlPullParser parser )
279         throws XmlPullParserException
280     {
281         return getDateValue( s, attribute, null, parser );
282     } //-- java.util.Date getDateValue( String, String, XmlPullParser )
283 
284     /**
285      * Method getDateValue.
286      * 
287      * @param s a s object.
288      * @param parser a parser object.
289      * @param dateFormat a dateFormat object.
290      * @param attribute a attribute object.
291      * @throws XmlPullParserException XmlPullParserException if
292      * any.
293      * @return Date
294      */
295     private java.util.Date getDateValue( String s, String attribute, String dateFormat, XmlPullParser parser )
296         throws XmlPullParserException
297     {
298         if ( s != null )
299         {
300             String effectiveDateFormat = dateFormat;
301             if ( dateFormat == null )
302             {
303                 effectiveDateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS";
304             }
305             if ( "long".equals( effectiveDateFormat ) )
306             {
307                 try
308                 {
309                     return new java.util.Date( Long.parseLong( s ) );
310                 }
311                 catch ( NumberFormatException e )
312                 {
313                     throw new XmlPullParserException( e.getMessage(), parser, e );
314                 }
315             }
316             else
317             {
318                 try
319                 {
320                     DateFormat dateParser = new java.text.SimpleDateFormat( effectiveDateFormat, java.util.Locale.US );
321                     return dateParser.parse( s );
322                 }
323                 catch ( java.text.ParseException e )
324                 {
325                     throw new XmlPullParserException( e.getMessage(), parser, e );
326                 }
327             }
328         }
329         return null;
330     } //-- java.util.Date getDateValue( String, String, String, XmlPullParser )
331 
332     /**
333      * Method getDoubleValue.
334      * 
335      * @param s a s object.
336      * @param strict a strict object.
337      * @param parser a parser object.
338      * @param attribute a attribute object.
339      * @throws XmlPullParserException XmlPullParserException if
340      * any.
341      * @return double
342      */
343     private double getDoubleValue( String s, String attribute, XmlPullParser parser, boolean strict )
344         throws XmlPullParserException
345     {
346         if ( s != null )
347         {
348             try
349             {
350                 return Double.valueOf( s ).doubleValue();
351             }
352             catch ( NumberFormatException nfe )
353             {
354                 if ( strict )
355                 {
356                     throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be a floating point number", parser, nfe );
357                 }
358             }
359         }
360         return 0;
361     } //-- double getDoubleValue( String, String, XmlPullParser, boolean )
362 
363     /**
364      * Method getFloatValue.
365      * 
366      * @param s a s object.
367      * @param strict a strict object.
368      * @param parser a parser object.
369      * @param attribute a attribute object.
370      * @throws XmlPullParserException XmlPullParserException if
371      * any.
372      * @return float
373      */
374     private float getFloatValue( String s, String attribute, XmlPullParser parser, boolean strict )
375         throws XmlPullParserException
376     {
377         if ( s != null )
378         {
379             try
380             {
381                 return Float.valueOf( s ).floatValue();
382             }
383             catch ( NumberFormatException nfe )
384             {
385                 if ( strict )
386                 {
387                     throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be a floating point number", parser, nfe );
388                 }
389             }
390         }
391         return 0;
392     } //-- float getFloatValue( String, String, XmlPullParser, boolean )
393 
394     /**
395      * Method getIntegerValue.
396      * 
397      * @param s a s object.
398      * @param strict a strict object.
399      * @param parser a parser object.
400      * @param attribute a attribute object.
401      * @throws XmlPullParserException XmlPullParserException if
402      * any.
403      * @return int
404      */
405     private int getIntegerValue( String s, String attribute, XmlPullParser parser, boolean strict )
406         throws XmlPullParserException
407     {
408         if ( s != null )
409         {
410             try
411             {
412                 return Integer.valueOf( s ).intValue();
413             }
414             catch ( NumberFormatException nfe )
415             {
416                 if ( strict )
417                 {
418                     throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be an integer", parser, nfe );
419                 }
420             }
421         }
422         return 0;
423     } //-- int getIntegerValue( String, String, XmlPullParser, boolean )
424 
425     /**
426      * Method getLongValue.
427      * 
428      * @param s a s object.
429      * @param strict a strict object.
430      * @param parser a parser object.
431      * @param attribute a attribute object.
432      * @throws XmlPullParserException XmlPullParserException if
433      * any.
434      * @return long
435      */
436     private long getLongValue( String s, String attribute, XmlPullParser parser, boolean strict )
437         throws XmlPullParserException
438     {
439         if ( s != null )
440         {
441             try
442             {
443                 return Long.valueOf( s ).longValue();
444             }
445             catch ( NumberFormatException nfe )
446             {
447                 if ( strict )
448                 {
449                     throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be a long integer", parser, nfe );
450                 }
451             }
452         }
453         return 0;
454     } //-- long getLongValue( String, String, XmlPullParser, boolean )
455 
456     /**
457      * Method getRequiredAttributeValue.
458      * 
459      * @param s a s object.
460      * @param strict a strict object.
461      * @param parser a parser object.
462      * @param attribute a attribute object.
463      * @throws XmlPullParserException XmlPullParserException if
464      * any.
465      * @return String
466      */
467     private String getRequiredAttributeValue( String s, String attribute, XmlPullParser parser, boolean strict )
468         throws XmlPullParserException
469     {
470         if ( s == null )
471         {
472             if ( strict )
473             {
474                 throw new XmlPullParserException( "Missing required value for attribute '" + attribute + "'", parser, null );
475             }
476         }
477         return s;
478     } //-- String getRequiredAttributeValue( String, String, XmlPullParser, boolean )
479 
480     /**
481      * Method getShortValue.
482      * 
483      * @param s a s object.
484      * @param strict a strict object.
485      * @param parser a parser object.
486      * @param attribute a attribute object.
487      * @throws XmlPullParserException XmlPullParserException if
488      * any.
489      * @return short
490      */
491     private short getShortValue( String s, String attribute, XmlPullParser parser, boolean strict )
492         throws XmlPullParserException
493     {
494         if ( s != null )
495         {
496             try
497             {
498                 return Short.valueOf( s ).shortValue();
499             }
500             catch ( NumberFormatException nfe )
501             {
502                 if ( strict )
503                 {
504                     throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be a short integer", parser, nfe );
505                 }
506             }
507         }
508         return 0;
509     } //-- short getShortValue( String, String, XmlPullParser, boolean )
510 
511     /**
512      * Method getTrimmedValue.
513      * 
514      * @param s a s object.
515      * @return String
516      */
517     private String getTrimmedValue( String s )
518     {
519         if ( s != null )
520         {
521             s = s.trim();
522         }
523         return s;
524     } //-- String getTrimmedValue( String )
525 
526     /**
527      * Method interpolatedTrimmed.
528      * 
529      * @param value a value object.
530      * @param context a context object.
531      * @return String
532      */
533     private String interpolatedTrimmed( String value, String context )
534     {
535         return getTrimmedValue( contentTransformer.transform( value, context ) );
536     } //-- String interpolatedTrimmed( String, String )
537 
538     /**
539      * Method nextTag.
540      * 
541      * @param parser a parser object.
542      * @throws IOException IOException if any.
543      * @throws XmlPullParserException XmlPullParserException if
544      * any.
545      * @return int
546      */
547     private int nextTag( XmlPullParser parser )
548         throws IOException, XmlPullParserException
549     {
550         int eventType = parser.next();
551         if ( eventType == XmlPullParser.TEXT )
552         {
553             eventType = parser.next();
554         }
555         if ( eventType != XmlPullParser.START_TAG && eventType != XmlPullParser.END_TAG )
556         {
557             throw new XmlPullParserException( "expected START_TAG or END_TAG not " + XmlPullParser.TYPES[eventType], parser, null );
558         }
559         return eventType;
560     } //-- int nextTag( XmlPullParser )
561 
562     /**
563      * Method read.
564      * 
565      * @param parser a parser object.
566      * @param strict a strict object.
567      * @throws IOException IOException if any.
568      * @throws XmlPullParserException XmlPullParserException if
569      * any.
570      * @return SiteModel
571      */
572     public SiteModel read( XmlPullParser parser, boolean strict )
573         throws IOException, XmlPullParserException
574     {
575         SiteModel siteModel = null;
576         int eventType = parser.getEventType();
577         boolean parsed = false;
578         while ( eventType != XmlPullParser.END_DOCUMENT )
579         {
580             if ( eventType == XmlPullParser.START_TAG )
581             {
582                 if ( strict && ! "site".equals( parser.getName() ) )
583                 {
584                     throw new XmlPullParserException( "Expected root element 'site' but found '" + parser.getName() + "'", parser, null );
585                 }
586                 else if ( parsed )
587                 {
588                     // fallback, already expected a XmlPullParserException due to invalid XML
589                     throw new XmlPullParserException( "Duplicated tag: 'site'", parser, null );
590                 }
591                 siteModel = parseSiteModel( parser, strict );
592                 siteModel.setModelEncoding( parser.getInputEncoding() );
593                 parsed = true;
594             }
595             eventType = parser.next();
596         }
597         if ( parsed )
598         {
599             return siteModel;
600         }
601         throw new XmlPullParserException( "Expected root element 'site' but found no element at all: invalid XML document", parser, null );
602     } //-- SiteModel read( XmlPullParser, boolean )
603 
604     /**
605      * @see ReaderFactory#newXmlReader
606      * 
607      * @param reader a reader object.
608      * @param strict a strict object.
609      * @throws IOException IOException if any.
610      * @throws XmlPullParserException XmlPullParserException if
611      * any.
612      * @return SiteModel
613      */
614     public SiteModel read( Reader reader, boolean strict )
615         throws IOException, XmlPullParserException
616     {
617         XmlPullParser parser = addDefaultEntities ? new MXParser(EntityReplacementMap.defaultEntityReplacementMap) : new MXParser( );
618 
619         parser.setInput( reader );
620 
621 
622         return read( parser, strict );
623     } //-- SiteModel read( Reader, boolean )
624 
625     /**
626      * @see ReaderFactory#newXmlReader
627      * 
628      * @param reader a reader object.
629      * @throws IOException IOException if any.
630      * @throws XmlPullParserException XmlPullParserException if
631      * any.
632      * @return SiteModel
633      */
634     public SiteModel read( Reader reader )
635         throws IOException, XmlPullParserException
636     {
637         return read( reader, true );
638     } //-- SiteModel read( Reader )
639 
640     /**
641      * Method read.
642      * 
643      * @param in a in object.
644      * @param strict a strict object.
645      * @throws IOException IOException if any.
646      * @throws XmlPullParserException XmlPullParserException if
647      * any.
648      * @return SiteModel
649      */
650     public SiteModel read( InputStream in, boolean strict )
651         throws IOException, XmlPullParserException
652     {
653         return read( ReaderFactory.newXmlReader( in ), strict );
654     } //-- SiteModel read( InputStream, boolean )
655 
656     /**
657      * Method read.
658      * 
659      * @param in a in object.
660      * @throws IOException IOException if any.
661      * @throws XmlPullParserException XmlPullParserException if
662      * any.
663      * @return SiteModel
664      */
665     public SiteModel read( InputStream in )
666         throws IOException, XmlPullParserException
667     {
668         return read( ReaderFactory.newXmlReader( in ) );
669     } //-- SiteModel read( InputStream )
670 
671     /**
672      * Method parseBanner.
673      * 
674      * @param parser a parser object.
675      * @param strict a strict object.
676      * @throws IOException IOException if any.
677      * @throws XmlPullParserException XmlPullParserException if
678      * any.
679      * @return Banner
680      */
681     private Banner parseBanner( XmlPullParser parser, boolean strict )
682         throws IOException, XmlPullParserException
683     {
684         String tagName = parser.getName();
685         Banner banner = new Banner();
686         for ( int i = parser.getAttributeCount() - 1; i >= 0; i-- )
687         {
688             String name = parser.getAttributeName( i );
689             String value = parser.getAttributeValue( i );
690 
691             if ( name.indexOf( ':' ) >= 0 )
692             {
693                 // just ignore attributes with non-default namespace (for example: xmlns:xsi)
694             }
695             else if ( "name".equals( name ) )
696             {
697                 banner.setName( interpolatedTrimmed( value, "name" ) );
698             }
699             else if ( "href".equals( name ) )
700             {
701                 banner.setHref( interpolatedTrimmed( value, "href" ) );
702             }
703             else if ( "target".equals( name ) )
704             {
705                 banner.setTarget( interpolatedTrimmed( value, "target" ) );
706             }
707             else
708             {
709                 checkUnknownAttribute( parser, name, tagName, strict );
710             }
711         }
712         java.util.Set parsed = new java.util.HashSet();
713         while ( ( strict ? parser.nextTag() : nextTag( parser ) ) == XmlPullParser.START_TAG )
714         {
715             if ( checkFieldWithDuplicate( parser, "image", null, parsed ) )
716             {
717                 banner.setImage( parseImage( parser, strict ) );
718             }
719             else
720             {
721                 checkUnknownElement( parser, strict );
722             }
723         }
724         return banner;
725     } //-- Banner parseBanner( XmlPullParser, boolean )
726 
727     /**
728      * Method parseBody.
729      * 
730      * @param parser a parser object.
731      * @param strict a strict object.
732      * @throws IOException IOException if any.
733      * @throws XmlPullParserException XmlPullParserException if
734      * any.
735      * @return Body
736      */
737     private Body parseBody( XmlPullParser parser, boolean strict )
738         throws IOException, XmlPullParserException
739     {
740         String tagName = parser.getName();
741         Body body = new Body();
742         for ( int i = parser.getAttributeCount() - 1; i >= 0; i-- )
743         {
744             String name = parser.getAttributeName( i );
745             String value = parser.getAttributeValue( i );
746 
747             if ( name.indexOf( ':' ) >= 0 )
748             {
749                 // just ignore attributes with non-default namespace (for example: xmlns:xsi)
750             }
751             else
752             {
753                 checkUnknownAttribute( parser, name, tagName, strict );
754             }
755         }
756         java.util.Set parsed = new java.util.HashSet();
757         while ( ( strict ? parser.nextTag() : nextTag( parser ) ) == XmlPullParser.START_TAG )
758         {
759             if ( checkFieldWithDuplicate( parser, "head", null, parsed ) )
760             {
761                 body.setHead( interpolatedTrimmed( parser.nextText(), "head" ) );
762             }
763             else if ( checkFieldWithDuplicate( parser, "links", null, parsed ) )
764             {
765                 java.util.List<LinkItem> links = new java.util.ArrayList<LinkItem>();
766                 while ( parser.nextTag() == XmlPullParser.START_TAG )
767                 {
768                     if ( "item".equals( parser.getName() ) )
769                     {
770                         links.add( parseLinkItem( parser, strict ) );
771                     }
772                     else
773                     {
774                         checkUnknownElement( parser, strict );
775                     }
776                 }
777                 body.setLinks( links );
778             }
779             else if ( checkFieldWithDuplicate( parser, "breadcrumbs", null, parsed ) )
780             {
781                 java.util.List<LinkItem> breadcrumbs = new java.util.ArrayList<LinkItem>();
782                 while ( parser.nextTag() == XmlPullParser.START_TAG )
783                 {
784                     if ( "item".equals( parser.getName() ) )
785                     {
786                         breadcrumbs.add( parseLinkItem( parser, strict ) );
787                     }
788                     else
789                     {
790                         checkUnknownElement( parser, strict );
791                     }
792                 }
793                 body.setBreadcrumbs( breadcrumbs );
794             }
795             else if ( "menu".equals( parser.getName() ) )
796             {
797                 java.util.List<Menu> menus = body.getMenus();
798                 if ( menus == null )
799                 {
800                     menus = new java.util.ArrayList<Menu>();
801                 }
802                 menus.add( parseMenu( parser, strict ) );
803                 body.setMenus( menus );
804             }
805             else if ( checkFieldWithDuplicate( parser, "footer", null, parsed ) )
806             {
807                 body.setFooter( interpolatedTrimmed( parser.nextText(), "footer" ) );
808             }
809             else
810             {
811                 checkUnknownElement( parser, strict );
812             }
813         }
814         return body;
815     } //-- Body parseBody( XmlPullParser, boolean )
816 
817     /**
818      * Method parseImage.
819      * 
820      * @param parser a parser object.
821      * @param strict a strict object.
822      * @throws IOException IOException if any.
823      * @throws XmlPullParserException XmlPullParserException if
824      * any.
825      * @return Image
826      */
827     private Image parseImage( XmlPullParser parser, boolean strict )
828         throws IOException, XmlPullParserException
829     {
830         String tagName = parser.getName();
831         Image image = new Image();
832         for ( int i = parser.getAttributeCount() - 1; i >= 0; i-- )
833         {
834             String name = parser.getAttributeName( i );
835             String value = parser.getAttributeValue( i );
836 
837             if ( name.indexOf( ':' ) >= 0 )
838             {
839                 // just ignore attributes with non-default namespace (for example: xmlns:xsi)
840             }
841             else if ( "src".equals( name ) )
842             {
843                 image.setSrc( interpolatedTrimmed( value, "src" ) );
844             }
845             else if ( "position".equals( name ) )
846             {
847                 image.setPosition( interpolatedTrimmed( value, "position" ) );
848             }
849             else if ( "alt".equals( name ) )
850             {
851                 image.setAlt( interpolatedTrimmed( value, "alt" ) );
852             }
853             else if ( "width".equals( name ) )
854             {
855                 image.setWidth( interpolatedTrimmed( value, "width" ) );
856             }
857             else if ( "height".equals( name ) )
858             {
859                 image.setHeight( interpolatedTrimmed( value, "height" ) );
860             }
861             else if ( "style".equals( name ) )
862             {
863                 image.setStyle( interpolatedTrimmed( value, "style" ) );
864             }
865             else
866             {
867                 checkUnknownAttribute( parser, name, tagName, strict );
868             }
869         }
870         java.util.Set parsed = new java.util.HashSet();
871         while ( ( strict ? parser.nextTag() : nextTag( parser ) ) == XmlPullParser.START_TAG )
872         {
873             checkUnknownElement( parser, strict );
874         }
875         return image;
876     } //-- Image parseImage( XmlPullParser, boolean )
877 
878     /**
879      * Method parseLinkItem.
880      * 
881      * @param parser a parser object.
882      * @param strict a strict object.
883      * @throws IOException IOException if any.
884      * @throws XmlPullParserException XmlPullParserException if
885      * any.
886      * @return LinkItem
887      */
888     private LinkItem parseLinkItem( XmlPullParser parser, boolean strict )
889         throws IOException, XmlPullParserException
890     {
891         String tagName = parser.getName();
892         LinkItem linkItem = new LinkItem();
893         for ( int i = parser.getAttributeCount() - 1; i >= 0; i-- )
894         {
895             String name = parser.getAttributeName( i );
896             String value = parser.getAttributeValue( i );
897 
898             if ( name.indexOf( ':' ) >= 0 )
899             {
900                 // just ignore attributes with non-default namespace (for example: xmlns:xsi)
901             }
902             else if ( "name".equals( name ) )
903             {
904                 linkItem.setName( interpolatedTrimmed( value, "name" ) );
905             }
906             else if ( "href".equals( name ) )
907             {
908                 linkItem.setHref( interpolatedTrimmed( value, "href" ) );
909             }
910             else if ( "target".equals( name ) )
911             {
912                 linkItem.setTarget( interpolatedTrimmed( value, "target" ) );
913             }
914             else
915             {
916                 checkUnknownAttribute( parser, name, tagName, strict );
917             }
918         }
919         java.util.Set parsed = new java.util.HashSet();
920         while ( ( strict ? parser.nextTag() : nextTag( parser ) ) == XmlPullParser.START_TAG )
921         {
922             if ( checkFieldWithDuplicate( parser, "image", null, parsed ) )
923             {
924                 linkItem.setImage( parseImage( parser, strict ) );
925             }
926             else
927             {
928                 checkUnknownElement( parser, strict );
929             }
930         }
931         return linkItem;
932     } //-- LinkItem parseLinkItem( XmlPullParser, boolean )
933 
934     /**
935      * Method parseLogo.
936      * 
937      * @param parser a parser object.
938      * @param strict a strict object.
939      * @throws IOException IOException if any.
940      * @throws XmlPullParserException XmlPullParserException if
941      * any.
942      * @return Logo
943      */
944     private Logo parseLogo( XmlPullParser parser, boolean strict )
945         throws IOException, XmlPullParserException
946     {
947         String tagName = parser.getName();
948         Logo logo = new Logo();
949         for ( int i = parser.getAttributeCount() - 1; i >= 0; i-- )
950         {
951             String name = parser.getAttributeName( i );
952             String value = parser.getAttributeValue( i );
953 
954             if ( name.indexOf( ':' ) >= 0 )
955             {
956                 // just ignore attributes with non-default namespace (for example: xmlns:xsi)
957             }
958             else if ( "name".equals( name ) )
959             {
960                 logo.setName( interpolatedTrimmed( value, "name" ) );
961             }
962             else if ( "href".equals( name ) )
963             {
964                 logo.setHref( interpolatedTrimmed( value, "href" ) );
965             }
966             else if ( "target".equals( name ) )
967             {
968                 logo.setTarget( interpolatedTrimmed( value, "target" ) );
969             }
970             else
971             {
972                 checkUnknownAttribute( parser, name, tagName, strict );
973             }
974         }
975         java.util.Set parsed = new java.util.HashSet();
976         while ( ( strict ? parser.nextTag() : nextTag( parser ) ) == XmlPullParser.START_TAG )
977         {
978             if ( checkFieldWithDuplicate( parser, "image", null, parsed ) )
979             {
980                 logo.setImage( parseImage( parser, strict ) );
981             }
982             else
983             {
984                 checkUnknownElement( parser, strict );
985             }
986         }
987         return logo;
988     } //-- Logo parseLogo( XmlPullParser, boolean )
989 
990     /**
991      * Method parseMenu.
992      * 
993      * @param parser a parser object.
994      * @param strict a strict object.
995      * @throws IOException IOException if any.
996      * @throws XmlPullParserException XmlPullParserException if
997      * any.
998      * @return Menu
999      */
1000     private Menu parseMenu( XmlPullParser parser, boolean strict )
1001         throws IOException, XmlPullParserException
1002     {
1003         String tagName = parser.getName();
1004         Menu menu = new Menu();
1005         for ( int i = parser.getAttributeCount() - 1; i >= 0; i-- )
1006         {
1007             String name = parser.getAttributeName( i );
1008             String value = parser.getAttributeValue( i );
1009 
1010             if ( name.indexOf( ':' ) >= 0 )
1011             {
1012                 // just ignore attributes with non-default namespace (for example: xmlns:xsi)
1013             }
1014             else if ( "name".equals( name ) )
1015             {
1016                 menu.setName( interpolatedTrimmed( value, "name" ) );
1017             }
1018             else if ( "inherit".equals( name ) )
1019             {
1020                 menu.setInherit( interpolatedTrimmed( value, "inherit" ) );
1021             }
1022             else if ( "inheritAsRef".equals( name ) )
1023             {
1024                 menu.setInheritAsRef( getBooleanValue( interpolatedTrimmed( value, "inheritAsRef" ), "inheritAsRef", parser, "false" ) );
1025             }
1026             else if ( "ref".equals( name ) )
1027             {
1028                 menu.setRef( interpolatedTrimmed( value, "ref" ) );
1029             }
1030             else
1031             {
1032                 checkUnknownAttribute( parser, name, tagName, strict );
1033             }
1034         }
1035         java.util.Set parsed = new java.util.HashSet();
1036         while ( ( strict ? parser.nextTag() : nextTag( parser ) ) == XmlPullParser.START_TAG )
1037         {
1038             if ( checkFieldWithDuplicate( parser, "image", null, parsed ) )
1039             {
1040                 menu.setImage( parseImage( parser, strict ) );
1041             }
1042             else if ( "item".equals( parser.getName() ) )
1043             {
1044                 java.util.List<MenuItem> items = menu.getItems();
1045                 if ( items == null )
1046                 {
1047                     items = new java.util.ArrayList<MenuItem>();
1048                 }
1049                 items.add( parseMenuItem( parser, strict ) );
1050                 menu.setItems( items );
1051             }
1052             else
1053             {
1054                 checkUnknownElement( parser, strict );
1055             }
1056         }
1057         return menu;
1058     } //-- Menu parseMenu( XmlPullParser, boolean )
1059 
1060     /**
1061      * Method parseMenuItem.
1062      * 
1063      * @param parser a parser object.
1064      * @param strict a strict object.
1065      * @throws IOException IOException if any.
1066      * @throws XmlPullParserException XmlPullParserException if
1067      * any.
1068      * @return MenuItem
1069      */
1070     private MenuItem parseMenuItem( XmlPullParser parser, boolean strict )
1071         throws IOException, XmlPullParserException
1072     {
1073         String tagName = parser.getName();
1074         MenuItem menuItem = new MenuItem();
1075         for ( int i = parser.getAttributeCount() - 1; i >= 0; i-- )
1076         {
1077             String name = parser.getAttributeName( i );
1078             String value = parser.getAttributeValue( i );
1079 
1080             if ( name.indexOf( ':' ) >= 0 )
1081             {
1082                 // just ignore attributes with non-default namespace (for example: xmlns:xsi)
1083             }
1084             else if ( "collapse".equals( name ) )
1085             {
1086                 menuItem.setCollapse( getBooleanValue( interpolatedTrimmed( value, "collapse" ), "collapse", parser, "false" ) );
1087             }
1088             else if ( "ref".equals( name ) )
1089             {
1090                 menuItem.setRef( interpolatedTrimmed( value, "ref" ) );
1091             }
1092             else if ( "name".equals( name ) )
1093             {
1094                 menuItem.setName( interpolatedTrimmed( value, "name" ) );
1095             }
1096             else if ( "href".equals( name ) )
1097             {
1098                 menuItem.setHref( interpolatedTrimmed( value, "href" ) );
1099             }
1100             else if ( "target".equals( name ) )
1101             {
1102                 menuItem.setTarget( interpolatedTrimmed( value, "target" ) );
1103             }
1104             else
1105             {
1106                 checkUnknownAttribute( parser, name, tagName, strict );
1107             }
1108         }
1109         java.util.Set parsed = new java.util.HashSet();
1110         while ( ( strict ? parser.nextTag() : nextTag( parser ) ) == XmlPullParser.START_TAG )
1111         {
1112             if ( "item".equals( parser.getName() ) )
1113             {
1114                 java.util.List<MenuItem> items = menuItem.getItems();
1115                 if ( items == null )
1116                 {
1117                     items = new java.util.ArrayList<MenuItem>();
1118                 }
1119                 items.add( parseMenuItem( parser, strict ) );
1120                 menuItem.setItems( items );
1121             }
1122             else if ( checkFieldWithDuplicate( parser, "image", null, parsed ) )
1123             {
1124                 menuItem.setImage( parseImage( parser, strict ) );
1125             }
1126             else
1127             {
1128                 checkUnknownElement( parser, strict );
1129             }
1130         }
1131         return menuItem;
1132     } //-- MenuItem parseMenuItem( XmlPullParser, boolean )
1133 
1134     /**
1135      * Method parsePublishDate.
1136      * 
1137      * @param parser a parser object.
1138      * @param strict a strict object.
1139      * @throws IOException IOException if any.
1140      * @throws XmlPullParserException XmlPullParserException if
1141      * any.
1142      * @return PublishDate
1143      */
1144     private PublishDate parsePublishDate( XmlPullParser parser, boolean strict )
1145         throws IOException, XmlPullParserException
1146     {
1147         String tagName = parser.getName();
1148         PublishDate publishDate = new PublishDate();
1149         for ( int i = parser.getAttributeCount() - 1; i >= 0; i-- )
1150         {
1151             String name = parser.getAttributeName( i );
1152             String value = parser.getAttributeValue( i );
1153 
1154             if ( name.indexOf( ':' ) >= 0 )
1155             {
1156                 // just ignore attributes with non-default namespace (for example: xmlns:xsi)
1157             }
1158             else if ( "position".equals( name ) )
1159             {
1160                 publishDate.setPosition( interpolatedTrimmed( value, "position" ) );
1161             }
1162             else if ( "format".equals( name ) )
1163             {
1164                 publishDate.setFormat( interpolatedTrimmed( value, "format" ) );
1165             }
1166             else if ( "timezone".equals( name ) )
1167             {
1168                 publishDate.setTimezone( interpolatedTrimmed( value, "timezone" ) );
1169             }
1170             else
1171             {
1172                 checkUnknownAttribute( parser, name, tagName, strict );
1173             }
1174         }
1175         java.util.Set parsed = new java.util.HashSet();
1176         while ( ( strict ? parser.nextTag() : nextTag( parser ) ) == XmlPullParser.START_TAG )
1177         {
1178             checkUnknownElement( parser, strict );
1179         }
1180         return publishDate;
1181     } //-- PublishDate parsePublishDate( XmlPullParser, boolean )
1182 
1183     /**
1184      * Method parseSiteModel.
1185      * 
1186      * @param parser a parser object.
1187      * @param strict a strict object.
1188      * @throws IOException IOException if any.
1189      * @throws XmlPullParserException XmlPullParserException if
1190      * any.
1191      * @return SiteModel
1192      */
1193     private SiteModel parseSiteModel( XmlPullParser parser, boolean strict )
1194         throws IOException, XmlPullParserException
1195     {
1196         String tagName = parser.getName();
1197         SiteModel siteModel = new SiteModel();
1198         for ( int i = parser.getAttributeCount() - 1; i >= 0; i-- )
1199         {
1200             String name = parser.getAttributeName( i );
1201             String value = parser.getAttributeValue( i );
1202 
1203             if ( name.indexOf( ':' ) >= 0 )
1204             {
1205                 // just ignore attributes with non-default namespace (for example: xmlns:xsi)
1206             }
1207             else if ( "xmlns".equals( name ) )
1208             {
1209                 // ignore xmlns attribute in root class, which is a reserved attribute name
1210             }
1211             else if ( "name".equals( name ) )
1212             {
1213                 siteModel.setName( interpolatedTrimmed( value, "name" ) );
1214             }
1215             else if ( "combine.self".equals( name ) )
1216             {
1217                 siteModel.setCombineSelf( interpolatedTrimmed( value, "combine.self" ) );
1218             }
1219             else
1220             {
1221                 checkUnknownAttribute( parser, name, tagName, strict );
1222             }
1223         }
1224         java.util.Set parsed = new java.util.HashSet();
1225         while ( ( strict ? parser.nextTag() : nextTag( parser ) ) == XmlPullParser.START_TAG )
1226         {
1227             if ( checkFieldWithDuplicate( parser, "bannerLeft", null, parsed ) )
1228             {
1229                 siteModel.setBannerLeft( parseBanner( parser, strict ) );
1230             }
1231             else if ( checkFieldWithDuplicate( parser, "bannerRight", null, parsed ) )
1232             {
1233                 siteModel.setBannerRight( parseBanner( parser, strict ) );
1234             }
1235             else if ( checkFieldWithDuplicate( parser, "publishDate", null, parsed ) )
1236             {
1237                 siteModel.setPublishDate( parsePublishDate( parser, strict ) );
1238             }
1239             else if ( checkFieldWithDuplicate( parser, "version", null, parsed ) )
1240             {
1241                 siteModel.setVersion( parseVersion( parser, strict ) );
1242             }
1243             else if ( checkFieldWithDuplicate( parser, "edit", null, parsed ) )
1244             {
1245                 siteModel.setEdit( interpolatedTrimmed( parser.nextText(), "edit" ) );
1246             }
1247             else if ( checkFieldWithDuplicate( parser, "poweredBy", null, parsed ) )
1248             {
1249                 java.util.List<Logo> poweredBy = new java.util.ArrayList<Logo>();
1250                 while ( parser.nextTag() == XmlPullParser.START_TAG )
1251                 {
1252                     if ( "logo".equals( parser.getName() ) )
1253                     {
1254                         poweredBy.add( parseLogo( parser, strict ) );
1255                     }
1256                     else
1257                     {
1258                         checkUnknownElement( parser, strict );
1259                     }
1260                 }
1261                 siteModel.setPoweredBy( poweredBy );
1262             }
1263             else if ( checkFieldWithDuplicate( parser, "skin", null, parsed ) )
1264             {
1265                 siteModel.setSkin( parseSkin( parser, strict ) );
1266             }
1267             else if ( checkFieldWithDuplicate( parser, "body", null, parsed ) )
1268             {
1269                 siteModel.setBody( parseBody( parser, strict ) );
1270             }
1271             else if ( checkFieldWithDuplicate( parser, "custom", null, parsed ) )
1272             {
1273                 siteModel.setCustom( org.codehaus.plexus.util.xml.Xpp3DomBuilder.build( parser, true ) );
1274             }
1275             else
1276             {
1277                 checkUnknownElement( parser, strict );
1278             }
1279         }
1280         return siteModel;
1281     } //-- SiteModel parseSiteModel( XmlPullParser, boolean )
1282 
1283     /**
1284      * Method parseSkin.
1285      * 
1286      * @param parser a parser object.
1287      * @param strict a strict object.
1288      * @throws IOException IOException if any.
1289      * @throws XmlPullParserException XmlPullParserException if
1290      * any.
1291      * @return Skin
1292      */
1293     private Skin parseSkin( XmlPullParser parser, boolean strict )
1294         throws IOException, XmlPullParserException
1295     {
1296         String tagName = parser.getName();
1297         Skin skin = new Skin();
1298         for ( int i = parser.getAttributeCount() - 1; i >= 0; i-- )
1299         {
1300             String name = parser.getAttributeName( i );
1301             String value = parser.getAttributeValue( i );
1302 
1303             if ( name.indexOf( ':' ) >= 0 )
1304             {
1305                 // just ignore attributes with non-default namespace (for example: xmlns:xsi)
1306             }
1307             else
1308             {
1309                 checkUnknownAttribute( parser, name, tagName, strict );
1310             }
1311         }
1312         java.util.Set parsed = new java.util.HashSet();
1313         while ( ( strict ? parser.nextTag() : nextTag( parser ) ) == XmlPullParser.START_TAG )
1314         {
1315             if ( checkFieldWithDuplicate( parser, "groupId", null, parsed ) )
1316             {
1317                 skin.setGroupId( interpolatedTrimmed( parser.nextText(), "groupId" ) );
1318             }
1319             else if ( checkFieldWithDuplicate( parser, "artifactId", null, parsed ) )
1320             {
1321                 skin.setArtifactId( interpolatedTrimmed( parser.nextText(), "artifactId" ) );
1322             }
1323             else if ( checkFieldWithDuplicate( parser, "version", null, parsed ) )
1324             {
1325                 skin.setVersion( interpolatedTrimmed( parser.nextText(), "version" ) );
1326             }
1327             else
1328             {
1329                 checkUnknownElement( parser, strict );
1330             }
1331         }
1332         return skin;
1333     } //-- Skin parseSkin( XmlPullParser, boolean )
1334 
1335     /**
1336      * Method parseVersion.
1337      * 
1338      * @param parser a parser object.
1339      * @param strict a strict object.
1340      * @throws IOException IOException if any.
1341      * @throws XmlPullParserException XmlPullParserException if
1342      * any.
1343      * @return Version
1344      */
1345     private Version parseVersion( XmlPullParser parser, boolean strict )
1346         throws IOException, XmlPullParserException
1347     {
1348         String tagName = parser.getName();
1349         Version version = new Version();
1350         for ( int i = parser.getAttributeCount() - 1; i >= 0; i-- )
1351         {
1352             String name = parser.getAttributeName( i );
1353             String value = parser.getAttributeValue( i );
1354 
1355             if ( name.indexOf( ':' ) >= 0 )
1356             {
1357                 // just ignore attributes with non-default namespace (for example: xmlns:xsi)
1358             }
1359             else if ( "position".equals( name ) )
1360             {
1361                 version.setPosition( interpolatedTrimmed( value, "position" ) );
1362             }
1363             else
1364             {
1365                 checkUnknownAttribute( parser, name, tagName, strict );
1366             }
1367         }
1368         java.util.Set parsed = new java.util.HashSet();
1369         while ( ( strict ? parser.nextTag() : nextTag( parser ) ) == XmlPullParser.START_TAG )
1370         {
1371             checkUnknownElement( parser, strict );
1372         }
1373         return version;
1374     } //-- Version parseVersion( XmlPullParser, boolean )
1375 
1376     /**
1377      * Sets the state of the "add default entities" flag.
1378      * 
1379      * @param addDefaultEntities a addDefaultEntities object.
1380      */
1381     public void setAddDefaultEntities( boolean addDefaultEntities )
1382     {
1383         this.addDefaultEntities = addDefaultEntities;
1384     } //-- void setAddDefaultEntities( boolean )
1385 
1386     public static interface ContentTransformer
1387 {
1388     /**
1389      * Interpolate the value read from the xpp3 document
1390      * @param source The source value
1391      * @param fieldName A description of the field being interpolated. The implementation may use this to
1392      *                           log stuff.
1393      * @return The interpolated value.
1394      */
1395     String transform( String source, String fieldName );
1396 }
1397 
1398 }