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