001// =================== DO NOT EDIT THIS FILE ====================
002// Generated by Modello 1.8.3,
003// any modifications will be overwritten.
004// ==============================================================
005
006package org.apache.maven.settings.io.xpp3;
007
008  //---------------------------------/
009 //- Imported classes and packages -/
010//---------------------------------/
011
012import java.io.IOException;
013import java.io.InputStream;
014import java.io.Reader;
015import java.text.DateFormat;
016import org.apache.maven.settings.Activation;
017import org.apache.maven.settings.ActivationFile;
018import org.apache.maven.settings.ActivationOS;
019import org.apache.maven.settings.ActivationProperty;
020import org.apache.maven.settings.IdentifiableBase;
021import org.apache.maven.settings.Mirror;
022import org.apache.maven.settings.Profile;
023import org.apache.maven.settings.Proxy;
024import org.apache.maven.settings.Repository;
025import org.apache.maven.settings.RepositoryBase;
026import org.apache.maven.settings.RepositoryPolicy;
027import org.apache.maven.settings.Server;
028import org.apache.maven.settings.Settings;
029import org.apache.maven.settings.TrackableBase;
030import org.codehaus.plexus.util.ReaderFactory;
031import org.codehaus.plexus.util.xml.pull.EntityReplacementMap;
032import org.codehaus.plexus.util.xml.pull.MXParser;
033import org.codehaus.plexus.util.xml.pull.XmlPullParser;
034import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
035
036/**
037 * Class SettingsXpp3Reader.
038 * 
039 * @version $Revision$ $Date$
040 */
041@SuppressWarnings( "all" )
042public class SettingsXpp3Reader
043{
044
045      //--------------------------/
046     //- Class/Member Variables -/
047    //--------------------------/
048
049    /**
050     * If set the parser will be loaded with all single characters
051     * from the XHTML specification.
052     * The entities used:
053     * <ul>
054     * <li>http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent</li>
055     * <li>http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent</li>
056     * <li>http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent</li>
057     * </ul>
058     */
059    private boolean addDefaultEntities = true;
060
061    /**
062     * Field contentTransformer.
063     */
064    public final ContentTransformer contentTransformer;
065
066
067      //----------------/
068     //- Constructors -/
069    //----------------/
070
071    public SettingsXpp3Reader()
072    {
073        this( new ContentTransformer()
074        {
075            public String transform( String source, String fieldName )
076            {
077                return source;
078            }
079        } );
080    } //-- org.apache.maven.settings.io.xpp3.SettingsXpp3Reader()
081
082    public SettingsXpp3Reader(ContentTransformer contentTransformer)
083    {
084        this.contentTransformer = contentTransformer;
085    } //-- org.apache.maven.settings.io.xpp3.SettingsXpp3Reader(ContentTransformer)
086
087
088      //-----------/
089     //- Methods -/
090    //-----------/
091
092    /**
093     * Method checkFieldWithDuplicate.
094     * 
095     * @param parser
096     * @param parsed
097     * @param alias
098     * @param tagName
099     * @throws XmlPullParserException
100     * @return boolean
101     */
102    private boolean checkFieldWithDuplicate( XmlPullParser parser, String tagName, String alias, java.util.Set parsed )
103        throws XmlPullParserException
104    {
105        if ( !( parser.getName().equals( tagName ) || parser.getName().equals( alias ) ) )
106        {
107            return false;
108        }
109        if ( !parsed.add( tagName ) )
110        {
111            throw new XmlPullParserException( "Duplicated tag: '" + tagName + "'", parser, null );
112        }
113        return true;
114    } //-- boolean checkFieldWithDuplicate( XmlPullParser, String, String, java.util.Set )
115
116    /**
117     * Method checkUnknownAttribute.
118     * 
119     * @param parser
120     * @param strict
121     * @param tagName
122     * @param attribute
123     * @throws XmlPullParserException
124     * @throws IOException
125     */
126    private void checkUnknownAttribute( XmlPullParser parser, String attribute, String tagName, boolean strict )
127        throws XmlPullParserException, IOException
128    {
129        // strictXmlAttributes = true for model: if strict == true, not only elements are checked but attributes too
130        if ( strict )
131        {
132            throw new XmlPullParserException( "Unknown attribute '" + attribute + "' for tag '" + tagName + "'", parser, null );
133        }
134    } //-- void checkUnknownAttribute( XmlPullParser, String, String, boolean )
135
136    /**
137     * Method checkUnknownElement.
138     * 
139     * @param parser
140     * @param strict
141     * @throws XmlPullParserException
142     * @throws IOException
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
180     * @param parser
181     * @param attribute
182     * @throws XmlPullParserException
183     * @return boolean
184     */
185    private boolean getBooleanValue( String s, String attribute, XmlPullParser parser )
186        throws XmlPullParserException
187    {
188        return getBooleanValue( s, attribute, parser, null );
189    } //-- boolean getBooleanValue( String, String, XmlPullParser )
190
191    /**
192     * Method getBooleanValue.
193     * 
194     * @param s
195     * @param defaultValue
196     * @param parser
197     * @param attribute
198     * @throws XmlPullParserException
199     * @return boolean
200     */
201    private boolean getBooleanValue( String s, String attribute, XmlPullParser parser, String defaultValue )
202        throws XmlPullParserException
203    {
204        if ( s != null && s.length() != 0 )
205        {
206            return Boolean.valueOf( s ).booleanValue();
207        }
208        if ( defaultValue != null )
209        {
210            return Boolean.valueOf( defaultValue ).booleanValue();
211        }
212        return false;
213    } //-- boolean getBooleanValue( String, String, XmlPullParser, String )
214
215    /**
216     * Method getByteValue.
217     * 
218     * @param s
219     * @param strict
220     * @param parser
221     * @param attribute
222     * @throws XmlPullParserException
223     * @return byte
224     */
225    private byte getByteValue( String s, String attribute, XmlPullParser parser, boolean strict )
226        throws XmlPullParserException
227    {
228        if ( s != null )
229        {
230            try
231            {
232                return Byte.valueOf( s ).byteValue();
233            }
234            catch ( NumberFormatException nfe )
235            {
236                if ( strict )
237                {
238                    throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be a byte", parser, nfe );
239                }
240            }
241        }
242        return 0;
243    } //-- byte getByteValue( String, String, XmlPullParser, boolean )
244
245    /**
246     * Method getCharacterValue.
247     * 
248     * @param s
249     * @param parser
250     * @param attribute
251     * @throws XmlPullParserException
252     * @return char
253     */
254    private char getCharacterValue( String s, String attribute, XmlPullParser parser )
255        throws XmlPullParserException
256    {
257        if ( s != null )
258        {
259            return s.charAt( 0 );
260        }
261        return 0;
262    } //-- char getCharacterValue( String, String, XmlPullParser )
263
264    /**
265     * Method getDateValue.
266     * 
267     * @param s
268     * @param parser
269     * @param attribute
270     * @throws XmlPullParserException
271     * @return Date
272     */
273    private java.util.Date getDateValue( String s, String attribute, XmlPullParser parser )
274        throws XmlPullParserException
275    {
276        return getDateValue( s, attribute, null, parser );
277    } //-- java.util.Date getDateValue( String, String, XmlPullParser )
278
279    /**
280     * Method getDateValue.
281     * 
282     * @param s
283     * @param parser
284     * @param dateFormat
285     * @param attribute
286     * @throws XmlPullParserException
287     * @return Date
288     */
289    private java.util.Date getDateValue( String s, String attribute, String dateFormat, XmlPullParser parser )
290        throws XmlPullParserException
291    {
292        if ( s != null )
293        {
294            String effectiveDateFormat = dateFormat;
295            if ( dateFormat == null )
296            {
297                effectiveDateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS";
298            }
299            if ( "long".equals( effectiveDateFormat ) )
300            {
301                try
302                {
303                    return new java.util.Date( Long.parseLong( s ) );
304                }
305                catch ( NumberFormatException e )
306                {
307                    throw new XmlPullParserException( e.getMessage(), parser, e );
308                }
309            }
310            else
311            {
312                try
313                {
314                    DateFormat dateParser = new java.text.SimpleDateFormat( effectiveDateFormat, java.util.Locale.US );
315                    return dateParser.parse( s );
316                }
317                catch ( java.text.ParseException e )
318                {
319                    throw new XmlPullParserException( e.getMessage(), parser, e );
320                }
321            }
322        }
323        return null;
324    } //-- java.util.Date getDateValue( String, String, String, XmlPullParser )
325
326    /**
327     * Method getDoubleValue.
328     * 
329     * @param s
330     * @param strict
331     * @param parser
332     * @param attribute
333     * @throws XmlPullParserException
334     * @return double
335     */
336    private double getDoubleValue( String s, String attribute, XmlPullParser parser, boolean strict )
337        throws XmlPullParserException
338    {
339        if ( s != null )
340        {
341            try
342            {
343                return Double.valueOf( s ).doubleValue();
344            }
345            catch ( NumberFormatException nfe )
346            {
347                if ( strict )
348                {
349                    throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be a floating point number", parser, nfe );
350                }
351            }
352        }
353        return 0;
354    } //-- double getDoubleValue( String, String, XmlPullParser, boolean )
355
356    /**
357     * Method getFloatValue.
358     * 
359     * @param s
360     * @param strict
361     * @param parser
362     * @param attribute
363     * @throws XmlPullParserException
364     * @return float
365     */
366    private float getFloatValue( String s, String attribute, XmlPullParser parser, boolean strict )
367        throws XmlPullParserException
368    {
369        if ( s != null )
370        {
371            try
372            {
373                return Float.valueOf( s ).floatValue();
374            }
375            catch ( NumberFormatException nfe )
376            {
377                if ( strict )
378                {
379                    throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be a floating point number", parser, nfe );
380                }
381            }
382        }
383        return 0;
384    } //-- float getFloatValue( String, String, XmlPullParser, boolean )
385
386    /**
387     * Method getIntegerValue.
388     * 
389     * @param s
390     * @param strict
391     * @param parser
392     * @param attribute
393     * @throws XmlPullParserException
394     * @return int
395     */
396    private int getIntegerValue( String s, String attribute, XmlPullParser parser, boolean strict )
397        throws XmlPullParserException
398    {
399        if ( s != null )
400        {
401            try
402            {
403                return Integer.valueOf( s ).intValue();
404            }
405            catch ( NumberFormatException nfe )
406            {
407                if ( strict )
408                {
409                    throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be an integer", parser, nfe );
410                }
411            }
412        }
413        return 0;
414    } //-- int getIntegerValue( String, String, XmlPullParser, boolean )
415
416    /**
417     * Method getLongValue.
418     * 
419     * @param s
420     * @param strict
421     * @param parser
422     * @param attribute
423     * @throws XmlPullParserException
424     * @return long
425     */
426    private long getLongValue( String s, String attribute, XmlPullParser parser, boolean strict )
427        throws XmlPullParserException
428    {
429        if ( s != null )
430        {
431            try
432            {
433                return Long.valueOf( s ).longValue();
434            }
435            catch ( NumberFormatException nfe )
436            {
437                if ( strict )
438                {
439                    throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be a long integer", parser, nfe );
440                }
441            }
442        }
443        return 0;
444    } //-- long getLongValue( String, String, XmlPullParser, boolean )
445
446    /**
447     * Method getRequiredAttributeValue.
448     * 
449     * @param s
450     * @param strict
451     * @param parser
452     * @param attribute
453     * @throws XmlPullParserException
454     * @return String
455     */
456    private String getRequiredAttributeValue( String s, String attribute, XmlPullParser parser, boolean strict )
457        throws XmlPullParserException
458    {
459        if ( s == null )
460        {
461            if ( strict )
462            {
463                throw new XmlPullParserException( "Missing required value for attribute '" + attribute + "'", parser, null );
464            }
465        }
466        return s;
467    } //-- String getRequiredAttributeValue( String, String, XmlPullParser, boolean )
468
469    /**
470     * Method getShortValue.
471     * 
472     * @param s
473     * @param strict
474     * @param parser
475     * @param attribute
476     * @throws XmlPullParserException
477     * @return short
478     */
479    private short getShortValue( String s, String attribute, XmlPullParser parser, boolean strict )
480        throws XmlPullParserException
481    {
482        if ( s != null )
483        {
484            try
485            {
486                return Short.valueOf( s ).shortValue();
487            }
488            catch ( NumberFormatException nfe )
489            {
490                if ( strict )
491                {
492                    throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be a short integer", parser, nfe );
493                }
494            }
495        }
496        return 0;
497    } //-- short getShortValue( String, String, XmlPullParser, boolean )
498
499    /**
500     * Method getTrimmedValue.
501     * 
502     * @param s
503     * @return String
504     */
505    private String getTrimmedValue( String s )
506    {
507        if ( s != null )
508        {
509            s = s.trim();
510        }
511        return s;
512    } //-- String getTrimmedValue( String )
513
514    /**
515     * Method interpolatedTrimmed.
516     * 
517     * @param value
518     * @param context
519     * @return String
520     */
521    private String interpolatedTrimmed( String value, String context )
522    {
523        return getTrimmedValue( contentTransformer.transform( value, context ) );
524    } //-- String interpolatedTrimmed( String, String )
525
526    /**
527     * Method nextTag.
528     * 
529     * @param parser
530     * @throws IOException
531     * @throws XmlPullParserException
532     * @return int
533     */
534    private int nextTag( XmlPullParser parser )
535        throws IOException, XmlPullParserException
536    {
537        int eventType = parser.next();
538        if ( eventType == XmlPullParser.TEXT )
539        {
540            eventType = parser.next();
541        }
542        if ( eventType != XmlPullParser.START_TAG && eventType != XmlPullParser.END_TAG )
543        {
544            throw new XmlPullParserException( "expected START_TAG or END_TAG not " + XmlPullParser.TYPES[eventType], parser, null );
545        }
546        return eventType;
547    } //-- int nextTag( XmlPullParser )
548
549    /**
550     * @see ReaderFactory#newXmlReader
551     * 
552     * @param reader
553     * @param strict
554     * @throws IOException
555     * @throws XmlPullParserException
556     * @return Settings
557     */
558    public Settings read( Reader reader, boolean strict )
559        throws IOException, XmlPullParserException
560    {
561        XmlPullParser parser = addDefaultEntities ? new MXParser(EntityReplacementMap.defaultEntityReplacementMap) : new MXParser( );
562
563        parser.setInput( reader );
564
565
566        return read( parser, strict );
567    } //-- Settings read( Reader, boolean )
568
569    /**
570     * @see ReaderFactory#newXmlReader
571     * 
572     * @param reader
573     * @throws IOException
574     * @throws XmlPullParserException
575     * @return Settings
576     */
577    public Settings read( Reader reader )
578        throws IOException, XmlPullParserException
579    {
580        return read( reader, true );
581    } //-- Settings read( Reader )
582
583    /**
584     * Method read.
585     * 
586     * @param in
587     * @param strict
588     * @throws IOException
589     * @throws XmlPullParserException
590     * @return Settings
591     */
592    public Settings read( InputStream in, boolean strict )
593        throws IOException, XmlPullParserException
594    {
595        return read( ReaderFactory.newXmlReader( in ), strict );
596    } //-- Settings read( InputStream, boolean )
597
598    /**
599     * Method read.
600     * 
601     * @param in
602     * @throws IOException
603     * @throws XmlPullParserException
604     * @return Settings
605     */
606    public Settings read( InputStream in )
607        throws IOException, XmlPullParserException
608    {
609        return read( ReaderFactory.newXmlReader( in ) );
610    } //-- Settings read( InputStream )
611
612    /**
613     * Method parseActivation.
614     * 
615     * @param parser
616     * @param strict
617     * @throws IOException
618     * @throws XmlPullParserException
619     * @return Activation
620     */
621    private Activation parseActivation( XmlPullParser parser, boolean strict )
622        throws IOException, XmlPullParserException
623    {
624        String tagName = parser.getName();
625        Activation activation = new Activation();
626        for ( int i = parser.getAttributeCount() - 1; i >= 0; i-- )
627        {
628            String name = parser.getAttributeName( i );
629            String value = parser.getAttributeValue( i );
630
631            if ( name.indexOf( ':' ) >= 0 )
632            {
633                // just ignore attributes with non-default namespace (for example: xmlns:xsi)
634            }
635            else
636            {
637                checkUnknownAttribute( parser, name, tagName, strict );
638            }
639        }
640        java.util.Set parsed = new java.util.HashSet();
641        while ( ( strict ? parser.nextTag() : nextTag( parser ) ) == XmlPullParser.START_TAG )
642        {
643            if ( checkFieldWithDuplicate( parser, "activeByDefault", null, parsed ) )
644            {
645                activation.setActiveByDefault( getBooleanValue( interpolatedTrimmed( parser.nextText(), "activeByDefault" ), "activeByDefault", parser, "false" ) );
646            }
647            else if ( checkFieldWithDuplicate( parser, "jdk", null, parsed ) )
648            {
649                activation.setJdk( interpolatedTrimmed( parser.nextText(), "jdk" ) );
650            }
651            else if ( checkFieldWithDuplicate( parser, "os", null, parsed ) )
652            {
653                activation.setOs( parseActivationOS( parser, strict ) );
654            }
655            else if ( checkFieldWithDuplicate( parser, "property", null, parsed ) )
656            {
657                activation.setProperty( parseActivationProperty( parser, strict ) );
658            }
659            else if ( checkFieldWithDuplicate( parser, "file", null, parsed ) )
660            {
661                activation.setFile( parseActivationFile( parser, strict ) );
662            }
663            else
664            {
665                checkUnknownElement( parser, strict );
666            }
667        }
668        return activation;
669    } //-- Activation parseActivation( XmlPullParser, boolean )
670
671    /**
672     * Method parseActivationFile.
673     * 
674     * @param parser
675     * @param strict
676     * @throws IOException
677     * @throws XmlPullParserException
678     * @return ActivationFile
679     */
680    private ActivationFile parseActivationFile( XmlPullParser parser, boolean strict )
681        throws IOException, XmlPullParserException
682    {
683        String tagName = parser.getName();
684        ActivationFile activationFile = new ActivationFile();
685        for ( int i = parser.getAttributeCount() - 1; i >= 0; i-- )
686        {
687            String name = parser.getAttributeName( i );
688            String value = parser.getAttributeValue( i );
689
690            if ( name.indexOf( ':' ) >= 0 )
691            {
692                // just ignore attributes with non-default namespace (for example: xmlns:xsi)
693            }
694            else
695            {
696                checkUnknownAttribute( parser, name, tagName, strict );
697            }
698        }
699        java.util.Set parsed = new java.util.HashSet();
700        while ( ( strict ? parser.nextTag() : nextTag( parser ) ) == XmlPullParser.START_TAG )
701        {
702            if ( checkFieldWithDuplicate( parser, "missing", null, parsed ) )
703            {
704                activationFile.setMissing( interpolatedTrimmed( parser.nextText(), "missing" ) );
705            }
706            else if ( checkFieldWithDuplicate( parser, "exists", null, parsed ) )
707            {
708                activationFile.setExists( interpolatedTrimmed( parser.nextText(), "exists" ) );
709            }
710            else
711            {
712                checkUnknownElement( parser, strict );
713            }
714        }
715        return activationFile;
716    } //-- ActivationFile parseActivationFile( XmlPullParser, boolean )
717
718    /**
719     * Method parseActivationOS.
720     * 
721     * @param parser
722     * @param strict
723     * @throws IOException
724     * @throws XmlPullParserException
725     * @return ActivationOS
726     */
727    private ActivationOS parseActivationOS( XmlPullParser parser, boolean strict )
728        throws IOException, XmlPullParserException
729    {
730        String tagName = parser.getName();
731        ActivationOS activationOS = new ActivationOS();
732        for ( int i = parser.getAttributeCount() - 1; i >= 0; i-- )
733        {
734            String name = parser.getAttributeName( i );
735            String value = parser.getAttributeValue( i );
736
737            if ( name.indexOf( ':' ) >= 0 )
738            {
739                // just ignore attributes with non-default namespace (for example: xmlns:xsi)
740            }
741            else
742            {
743                checkUnknownAttribute( parser, name, tagName, strict );
744            }
745        }
746        java.util.Set parsed = new java.util.HashSet();
747        while ( ( strict ? parser.nextTag() : nextTag( parser ) ) == XmlPullParser.START_TAG )
748        {
749            if ( checkFieldWithDuplicate( parser, "name", null, parsed ) )
750            {
751                activationOS.setName( interpolatedTrimmed( parser.nextText(), "name" ) );
752            }
753            else if ( checkFieldWithDuplicate( parser, "family", null, parsed ) )
754            {
755                activationOS.setFamily( interpolatedTrimmed( parser.nextText(), "family" ) );
756            }
757            else if ( checkFieldWithDuplicate( parser, "arch", null, parsed ) )
758            {
759                activationOS.setArch( interpolatedTrimmed( parser.nextText(), "arch" ) );
760            }
761            else if ( checkFieldWithDuplicate( parser, "version", null, parsed ) )
762            {
763                activationOS.setVersion( interpolatedTrimmed( parser.nextText(), "version" ) );
764            }
765            else
766            {
767                checkUnknownElement( parser, strict );
768            }
769        }
770        return activationOS;
771    } //-- ActivationOS parseActivationOS( XmlPullParser, boolean )
772
773    /**
774     * Method parseActivationProperty.
775     * 
776     * @param parser
777     * @param strict
778     * @throws IOException
779     * @throws XmlPullParserException
780     * @return ActivationProperty
781     */
782    private ActivationProperty parseActivationProperty( XmlPullParser parser, boolean strict )
783        throws IOException, XmlPullParserException
784    {
785        String tagName = parser.getName();
786        ActivationProperty activationProperty = new ActivationProperty();
787        for ( int i = parser.getAttributeCount() - 1; i >= 0; i-- )
788        {
789            String name = parser.getAttributeName( i );
790            String value = parser.getAttributeValue( i );
791
792            if ( name.indexOf( ':' ) >= 0 )
793            {
794                // just ignore attributes with non-default namespace (for example: xmlns:xsi)
795            }
796            else
797            {
798                checkUnknownAttribute( parser, name, tagName, strict );
799            }
800        }
801        java.util.Set parsed = new java.util.HashSet();
802        while ( ( strict ? parser.nextTag() : nextTag( parser ) ) == XmlPullParser.START_TAG )
803        {
804            if ( checkFieldWithDuplicate( parser, "name", null, parsed ) )
805            {
806                activationProperty.setName( interpolatedTrimmed( parser.nextText(), "name" ) );
807            }
808            else if ( checkFieldWithDuplicate( parser, "value", null, parsed ) )
809            {
810                activationProperty.setValue( interpolatedTrimmed( parser.nextText(), "value" ) );
811            }
812            else
813            {
814                checkUnknownElement( parser, strict );
815            }
816        }
817        return activationProperty;
818    } //-- ActivationProperty parseActivationProperty( XmlPullParser, boolean )
819
820    /**
821     * Method parseIdentifiableBase.
822     * 
823     * @param parser
824     * @param strict
825     * @throws IOException
826     * @throws XmlPullParserException
827     * @return IdentifiableBase
828     */
829    private IdentifiableBase parseIdentifiableBase( XmlPullParser parser, boolean strict )
830        throws IOException, XmlPullParserException
831    {
832        String tagName = parser.getName();
833        IdentifiableBase identifiableBase = new IdentifiableBase();
834        for ( int i = parser.getAttributeCount() - 1; i >= 0; i-- )
835        {
836            String name = parser.getAttributeName( i );
837            String value = parser.getAttributeValue( i );
838
839            if ( name.indexOf( ':' ) >= 0 )
840            {
841                // just ignore attributes with non-default namespace (for example: xmlns:xsi)
842            }
843            else
844            {
845                checkUnknownAttribute( parser, name, tagName, strict );
846            }
847        }
848        java.util.Set parsed = new java.util.HashSet();
849        while ( ( strict ? parser.nextTag() : nextTag( parser ) ) == XmlPullParser.START_TAG )
850        {
851            if ( checkFieldWithDuplicate( parser, "id", null, parsed ) )
852            {
853                identifiableBase.setId( interpolatedTrimmed( parser.nextText(), "id" ) );
854            }
855            else
856            {
857                checkUnknownElement( parser, strict );
858            }
859        }
860        return identifiableBase;
861    } //-- IdentifiableBase parseIdentifiableBase( XmlPullParser, boolean )
862
863    /**
864     * Method parseMirror.
865     * 
866     * @param parser
867     * @param strict
868     * @throws IOException
869     * @throws XmlPullParserException
870     * @return Mirror
871     */
872    private Mirror parseMirror( XmlPullParser parser, boolean strict )
873        throws IOException, XmlPullParserException
874    {
875        String tagName = parser.getName();
876        Mirror mirror = new Mirror();
877        for ( int i = parser.getAttributeCount() - 1; i >= 0; i-- )
878        {
879            String name = parser.getAttributeName( i );
880            String value = parser.getAttributeValue( i );
881
882            if ( name.indexOf( ':' ) >= 0 )
883            {
884                // just ignore attributes with non-default namespace (for example: xmlns:xsi)
885            }
886            else
887            {
888                checkUnknownAttribute( parser, name, tagName, strict );
889            }
890        }
891        java.util.Set parsed = new java.util.HashSet();
892        while ( ( strict ? parser.nextTag() : nextTag( parser ) ) == XmlPullParser.START_TAG )
893        {
894            if ( checkFieldWithDuplicate( parser, "mirrorOf", null, parsed ) )
895            {
896                mirror.setMirrorOf( interpolatedTrimmed( parser.nextText(), "mirrorOf" ) );
897            }
898            else if ( checkFieldWithDuplicate( parser, "name", null, parsed ) )
899            {
900                mirror.setName( interpolatedTrimmed( parser.nextText(), "name" ) );
901            }
902            else if ( checkFieldWithDuplicate( parser, "url", null, parsed ) )
903            {
904                mirror.setUrl( interpolatedTrimmed( parser.nextText(), "url" ) );
905            }
906            else if ( checkFieldWithDuplicate( parser, "layout", null, parsed ) )
907            {
908                mirror.setLayout( interpolatedTrimmed( parser.nextText(), "layout" ) );
909            }
910            else if ( checkFieldWithDuplicate( parser, "mirrorOfLayouts", null, parsed ) )
911            {
912                mirror.setMirrorOfLayouts( interpolatedTrimmed( parser.nextText(), "mirrorOfLayouts" ) );
913            }
914            else if ( checkFieldWithDuplicate( parser, "id", null, parsed ) )
915            {
916                mirror.setId( interpolatedTrimmed( parser.nextText(), "id" ) );
917            }
918            else
919            {
920                checkUnknownElement( parser, strict );
921            }
922        }
923        return mirror;
924    } //-- Mirror parseMirror( XmlPullParser, boolean )
925
926    /**
927     * Method parseProfile.
928     * 
929     * @param parser
930     * @param strict
931     * @throws IOException
932     * @throws XmlPullParserException
933     * @return Profile
934     */
935    private Profile parseProfile( XmlPullParser parser, boolean strict )
936        throws IOException, XmlPullParserException
937    {
938        String tagName = parser.getName();
939        Profile profile = new Profile();
940        for ( int i = parser.getAttributeCount() - 1; i >= 0; i-- )
941        {
942            String name = parser.getAttributeName( i );
943            String value = parser.getAttributeValue( i );
944
945            if ( name.indexOf( ':' ) >= 0 )
946            {
947                // just ignore attributes with non-default namespace (for example: xmlns:xsi)
948            }
949            else
950            {
951                checkUnknownAttribute( parser, name, tagName, strict );
952            }
953        }
954        java.util.Set parsed = new java.util.HashSet();
955        while ( ( strict ? parser.nextTag() : nextTag( parser ) ) == XmlPullParser.START_TAG )
956        {
957            if ( checkFieldWithDuplicate( parser, "activation", null, parsed ) )
958            {
959                profile.setActivation( parseActivation( parser, strict ) );
960            }
961            else if ( checkFieldWithDuplicate( parser, "properties", null, parsed ) )
962            {
963                while ( parser.nextTag() == XmlPullParser.START_TAG )
964                {
965                    String key = parser.getName();
966                    String value = parser.nextText().trim();
967                    profile.addProperty( key, value );
968                }
969            }
970            else if ( checkFieldWithDuplicate( parser, "repositories", null, parsed ) )
971            {
972                java.util.List repositories = new java.util.ArrayList/*<Repository>*/();
973                profile.setRepositories( repositories );
974                while ( parser.nextTag() == XmlPullParser.START_TAG )
975                {
976                    if ( "repository".equals( parser.getName() ) )
977                    {
978                        repositories.add( parseRepository( parser, strict ) );
979                    }
980                    else
981                    {
982                        checkUnknownElement( parser, strict );
983                    }
984                }
985            }
986            else if ( checkFieldWithDuplicate( parser, "pluginRepositories", null, parsed ) )
987            {
988                java.util.List pluginRepositories = new java.util.ArrayList/*<Repository>*/();
989                profile.setPluginRepositories( pluginRepositories );
990                while ( parser.nextTag() == XmlPullParser.START_TAG )
991                {
992                    if ( "pluginRepository".equals( parser.getName() ) )
993                    {
994                        pluginRepositories.add( parseRepository( parser, strict ) );
995                    }
996                    else
997                    {
998                        checkUnknownElement( parser, strict );
999                    }
1000                }
1001            }
1002            else if ( checkFieldWithDuplicate( parser, "id", null, parsed ) )
1003            {
1004                profile.setId( interpolatedTrimmed( parser.nextText(), "id" ) );
1005            }
1006            else
1007            {
1008                checkUnknownElement( parser, strict );
1009            }
1010        }
1011        return profile;
1012    } //-- Profile parseProfile( XmlPullParser, boolean )
1013
1014    /**
1015     * Method parseProxy.
1016     * 
1017     * @param parser
1018     * @param strict
1019     * @throws IOException
1020     * @throws XmlPullParserException
1021     * @return Proxy
1022     */
1023    private Proxy parseProxy( XmlPullParser parser, boolean strict )
1024        throws IOException, XmlPullParserException
1025    {
1026        String tagName = parser.getName();
1027        Proxy proxy = new Proxy();
1028        for ( int i = parser.getAttributeCount() - 1; i >= 0; i-- )
1029        {
1030            String name = parser.getAttributeName( i );
1031            String value = parser.getAttributeValue( i );
1032
1033            if ( name.indexOf( ':' ) >= 0 )
1034            {
1035                // just ignore attributes with non-default namespace (for example: xmlns:xsi)
1036            }
1037            else
1038            {
1039                checkUnknownAttribute( parser, name, tagName, strict );
1040            }
1041        }
1042        java.util.Set parsed = new java.util.HashSet();
1043        while ( ( strict ? parser.nextTag() : nextTag( parser ) ) == XmlPullParser.START_TAG )
1044        {
1045            if ( checkFieldWithDuplicate( parser, "active", null, parsed ) )
1046            {
1047                proxy.setActive( getBooleanValue( interpolatedTrimmed( parser.nextText(), "active" ), "active", parser, "true" ) );
1048            }
1049            else if ( checkFieldWithDuplicate( parser, "protocol", null, parsed ) )
1050            {
1051                proxy.setProtocol( interpolatedTrimmed( parser.nextText(), "protocol" ) );
1052            }
1053            else if ( checkFieldWithDuplicate( parser, "username", null, parsed ) )
1054            {
1055                proxy.setUsername( interpolatedTrimmed( parser.nextText(), "username" ) );
1056            }
1057            else if ( checkFieldWithDuplicate( parser, "password", null, parsed ) )
1058            {
1059                proxy.setPassword( interpolatedTrimmed( parser.nextText(), "password" ) );
1060            }
1061            else if ( checkFieldWithDuplicate( parser, "port", null, parsed ) )
1062            {
1063                proxy.setPort( getIntegerValue( interpolatedTrimmed( parser.nextText(), "port" ), "port", parser, strict ) );
1064            }
1065            else if ( checkFieldWithDuplicate( parser, "host", null, parsed ) )
1066            {
1067                proxy.setHost( interpolatedTrimmed( parser.nextText(), "host" ) );
1068            }
1069            else if ( checkFieldWithDuplicate( parser, "nonProxyHosts", null, parsed ) )
1070            {
1071                proxy.setNonProxyHosts( interpolatedTrimmed( parser.nextText(), "nonProxyHosts" ) );
1072            }
1073            else if ( checkFieldWithDuplicate( parser, "id", null, parsed ) )
1074            {
1075                proxy.setId( interpolatedTrimmed( parser.nextText(), "id" ) );
1076            }
1077            else
1078            {
1079                checkUnknownElement( parser, strict );
1080            }
1081        }
1082        return proxy;
1083    } //-- Proxy parseProxy( XmlPullParser, boolean )
1084
1085    /**
1086     * Method parseRepository.
1087     * 
1088     * @param parser
1089     * @param strict
1090     * @throws IOException
1091     * @throws XmlPullParserException
1092     * @return Repository
1093     */
1094    private Repository parseRepository( XmlPullParser parser, boolean strict )
1095        throws IOException, XmlPullParserException
1096    {
1097        String tagName = parser.getName();
1098        Repository repository = new Repository();
1099        for ( int i = parser.getAttributeCount() - 1; i >= 0; i-- )
1100        {
1101            String name = parser.getAttributeName( i );
1102            String value = parser.getAttributeValue( i );
1103
1104            if ( name.indexOf( ':' ) >= 0 )
1105            {
1106                // just ignore attributes with non-default namespace (for example: xmlns:xsi)
1107            }
1108            else
1109            {
1110                checkUnknownAttribute( parser, name, tagName, strict );
1111            }
1112        }
1113        java.util.Set parsed = new java.util.HashSet();
1114        while ( ( strict ? parser.nextTag() : nextTag( parser ) ) == XmlPullParser.START_TAG )
1115        {
1116            if ( checkFieldWithDuplicate( parser, "releases", null, parsed ) )
1117            {
1118                repository.setReleases( parseRepositoryPolicy( parser, strict ) );
1119            }
1120            else if ( checkFieldWithDuplicate( parser, "snapshots", null, parsed ) )
1121            {
1122                repository.setSnapshots( parseRepositoryPolicy( parser, strict ) );
1123            }
1124            else if ( checkFieldWithDuplicate( parser, "id", null, parsed ) )
1125            {
1126                repository.setId( interpolatedTrimmed( parser.nextText(), "id" ) );
1127            }
1128            else if ( checkFieldWithDuplicate( parser, "name", null, parsed ) )
1129            {
1130                repository.setName( interpolatedTrimmed( parser.nextText(), "name" ) );
1131            }
1132            else if ( checkFieldWithDuplicate( parser, "url", null, parsed ) )
1133            {
1134                repository.setUrl( interpolatedTrimmed( parser.nextText(), "url" ) );
1135            }
1136            else if ( checkFieldWithDuplicate( parser, "layout", null, parsed ) )
1137            {
1138                repository.setLayout( interpolatedTrimmed( parser.nextText(), "layout" ) );
1139            }
1140            else
1141            {
1142                checkUnknownElement( parser, strict );
1143            }
1144        }
1145        return repository;
1146    } //-- Repository parseRepository( XmlPullParser, boolean )
1147
1148    /**
1149     * Method parseRepositoryBase.
1150     * 
1151     * @param parser
1152     * @param strict
1153     * @throws IOException
1154     * @throws XmlPullParserException
1155     * @return RepositoryBase
1156     */
1157    private RepositoryBase parseRepositoryBase( XmlPullParser parser, boolean strict )
1158        throws IOException, XmlPullParserException
1159    {
1160        String tagName = parser.getName();
1161        RepositoryBase repositoryBase = new RepositoryBase();
1162        for ( int i = parser.getAttributeCount() - 1; i >= 0; i-- )
1163        {
1164            String name = parser.getAttributeName( i );
1165            String value = parser.getAttributeValue( i );
1166
1167            if ( name.indexOf( ':' ) >= 0 )
1168            {
1169                // just ignore attributes with non-default namespace (for example: xmlns:xsi)
1170            }
1171            else
1172            {
1173                checkUnknownAttribute( parser, name, tagName, strict );
1174            }
1175        }
1176        java.util.Set parsed = new java.util.HashSet();
1177        while ( ( strict ? parser.nextTag() : nextTag( parser ) ) == XmlPullParser.START_TAG )
1178        {
1179            if ( checkFieldWithDuplicate( parser, "id", null, parsed ) )
1180            {
1181                repositoryBase.setId( interpolatedTrimmed( parser.nextText(), "id" ) );
1182            }
1183            else if ( checkFieldWithDuplicate( parser, "name", null, parsed ) )
1184            {
1185                repositoryBase.setName( interpolatedTrimmed( parser.nextText(), "name" ) );
1186            }
1187            else if ( checkFieldWithDuplicate( parser, "url", null, parsed ) )
1188            {
1189                repositoryBase.setUrl( interpolatedTrimmed( parser.nextText(), "url" ) );
1190            }
1191            else if ( checkFieldWithDuplicate( parser, "layout", null, parsed ) )
1192            {
1193                repositoryBase.setLayout( interpolatedTrimmed( parser.nextText(), "layout" ) );
1194            }
1195            else
1196            {
1197                checkUnknownElement( parser, strict );
1198            }
1199        }
1200        return repositoryBase;
1201    } //-- RepositoryBase parseRepositoryBase( XmlPullParser, boolean )
1202
1203    /**
1204     * Method parseRepositoryPolicy.
1205     * 
1206     * @param parser
1207     * @param strict
1208     * @throws IOException
1209     * @throws XmlPullParserException
1210     * @return RepositoryPolicy
1211     */
1212    private RepositoryPolicy parseRepositoryPolicy( XmlPullParser parser, boolean strict )
1213        throws IOException, XmlPullParserException
1214    {
1215        String tagName = parser.getName();
1216        RepositoryPolicy repositoryPolicy = new RepositoryPolicy();
1217        for ( int i = parser.getAttributeCount() - 1; i >= 0; i-- )
1218        {
1219            String name = parser.getAttributeName( i );
1220            String value = parser.getAttributeValue( i );
1221
1222            if ( name.indexOf( ':' ) >= 0 )
1223            {
1224                // just ignore attributes with non-default namespace (for example: xmlns:xsi)
1225            }
1226            else
1227            {
1228                checkUnknownAttribute( parser, name, tagName, strict );
1229            }
1230        }
1231        java.util.Set parsed = new java.util.HashSet();
1232        while ( ( strict ? parser.nextTag() : nextTag( parser ) ) == XmlPullParser.START_TAG )
1233        {
1234            if ( checkFieldWithDuplicate( parser, "enabled", null, parsed ) )
1235            {
1236                repositoryPolicy.setEnabled( getBooleanValue( interpolatedTrimmed( parser.nextText(), "enabled" ), "enabled", parser, "true" ) );
1237            }
1238            else if ( checkFieldWithDuplicate( parser, "updatePolicy", null, parsed ) )
1239            {
1240                repositoryPolicy.setUpdatePolicy( interpolatedTrimmed( parser.nextText(), "updatePolicy" ) );
1241            }
1242            else if ( checkFieldWithDuplicate( parser, "checksumPolicy", null, parsed ) )
1243            {
1244                repositoryPolicy.setChecksumPolicy( interpolatedTrimmed( parser.nextText(), "checksumPolicy" ) );
1245            }
1246            else
1247            {
1248                checkUnknownElement( parser, strict );
1249            }
1250        }
1251        return repositoryPolicy;
1252    } //-- RepositoryPolicy parseRepositoryPolicy( XmlPullParser, boolean )
1253
1254    /**
1255     * Method parseServer.
1256     * 
1257     * @param parser
1258     * @param strict
1259     * @throws IOException
1260     * @throws XmlPullParserException
1261     * @return Server
1262     */
1263    private Server parseServer( XmlPullParser parser, boolean strict )
1264        throws IOException, XmlPullParserException
1265    {
1266        String tagName = parser.getName();
1267        Server server = new Server();
1268        for ( int i = parser.getAttributeCount() - 1; i >= 0; i-- )
1269        {
1270            String name = parser.getAttributeName( i );
1271            String value = parser.getAttributeValue( i );
1272
1273            if ( name.indexOf( ':' ) >= 0 )
1274            {
1275                // just ignore attributes with non-default namespace (for example: xmlns:xsi)
1276            }
1277            else
1278            {
1279                checkUnknownAttribute( parser, name, tagName, strict );
1280            }
1281        }
1282        java.util.Set parsed = new java.util.HashSet();
1283        while ( ( strict ? parser.nextTag() : nextTag( parser ) ) == XmlPullParser.START_TAG )
1284        {
1285            if ( checkFieldWithDuplicate( parser, "username", null, parsed ) )
1286            {
1287                server.setUsername( interpolatedTrimmed( parser.nextText(), "username" ) );
1288            }
1289            else if ( checkFieldWithDuplicate( parser, "password", null, parsed ) )
1290            {
1291                server.setPassword( interpolatedTrimmed( parser.nextText(), "password" ) );
1292            }
1293            else if ( checkFieldWithDuplicate( parser, "privateKey", null, parsed ) )
1294            {
1295                server.setPrivateKey( interpolatedTrimmed( parser.nextText(), "privateKey" ) );
1296            }
1297            else if ( checkFieldWithDuplicate( parser, "passphrase", null, parsed ) )
1298            {
1299                server.setPassphrase( interpolatedTrimmed( parser.nextText(), "passphrase" ) );
1300            }
1301            else if ( checkFieldWithDuplicate( parser, "filePermissions", null, parsed ) )
1302            {
1303                server.setFilePermissions( interpolatedTrimmed( parser.nextText(), "filePermissions" ) );
1304            }
1305            else if ( checkFieldWithDuplicate( parser, "directoryPermissions", null, parsed ) )
1306            {
1307                server.setDirectoryPermissions( interpolatedTrimmed( parser.nextText(), "directoryPermissions" ) );
1308            }
1309            else if ( checkFieldWithDuplicate( parser, "configuration", null, parsed ) )
1310            {
1311                server.setConfiguration( org.codehaus.plexus.util.xml.Xpp3DomBuilder.build( parser, true ) );
1312            }
1313            else if ( checkFieldWithDuplicate( parser, "id", null, parsed ) )
1314            {
1315                server.setId( interpolatedTrimmed( parser.nextText(), "id" ) );
1316            }
1317            else
1318            {
1319                checkUnknownElement( parser, strict );
1320            }
1321        }
1322        return server;
1323    } //-- Server parseServer( XmlPullParser, boolean )
1324
1325    /**
1326     * Method parseSettings.
1327     * 
1328     * @param parser
1329     * @param strict
1330     * @throws IOException
1331     * @throws XmlPullParserException
1332     * @return Settings
1333     */
1334    private Settings parseSettings( XmlPullParser parser, boolean strict )
1335        throws IOException, XmlPullParserException
1336    {
1337        String tagName = parser.getName();
1338        Settings settings = new Settings();
1339        for ( int i = parser.getAttributeCount() - 1; i >= 0; i-- )
1340        {
1341            String name = parser.getAttributeName( i );
1342            String value = parser.getAttributeValue( i );
1343
1344            if ( name.indexOf( ':' ) >= 0 )
1345            {
1346                // just ignore attributes with non-default namespace (for example: xmlns:xsi)
1347            }
1348            else if ( "xmlns".equals( name ) )
1349            {
1350                // ignore xmlns attribute in root class, which is a reserved attribute name
1351            }
1352            else
1353            {
1354                checkUnknownAttribute( parser, name, tagName, strict );
1355            }
1356        }
1357        java.util.Set parsed = new java.util.HashSet();
1358        while ( ( strict ? parser.nextTag() : nextTag( parser ) ) == XmlPullParser.START_TAG )
1359        {
1360            if ( checkFieldWithDuplicate( parser, "localRepository", null, parsed ) )
1361            {
1362                settings.setLocalRepository( interpolatedTrimmed( parser.nextText(), "localRepository" ) );
1363            }
1364            else if ( checkFieldWithDuplicate( parser, "interactiveMode", null, parsed ) )
1365            {
1366                settings.setInteractiveMode( getBooleanValue( interpolatedTrimmed( parser.nextText(), "interactiveMode" ), "interactiveMode", parser, "true" ) );
1367            }
1368            else if ( checkFieldWithDuplicate( parser, "usePluginRegistry", null, parsed ) )
1369            {
1370                settings.setUsePluginRegistry( getBooleanValue( interpolatedTrimmed( parser.nextText(), "usePluginRegistry" ), "usePluginRegistry", parser, "false" ) );
1371            }
1372            else if ( checkFieldWithDuplicate( parser, "offline", null, parsed ) )
1373            {
1374                settings.setOffline( getBooleanValue( interpolatedTrimmed( parser.nextText(), "offline" ), "offline", parser, "false" ) );
1375            }
1376            else if ( checkFieldWithDuplicate( parser, "proxies", null, parsed ) )
1377            {
1378                java.util.List proxies = new java.util.ArrayList/*<Proxy>*/();
1379                settings.setProxies( proxies );
1380                while ( parser.nextTag() == XmlPullParser.START_TAG )
1381                {
1382                    if ( "proxy".equals( parser.getName() ) )
1383                    {
1384                        proxies.add( parseProxy( parser, strict ) );
1385                    }
1386                    else
1387                    {
1388                        checkUnknownElement( parser, strict );
1389                    }
1390                }
1391            }
1392            else if ( checkFieldWithDuplicate( parser, "servers", null, parsed ) )
1393            {
1394                java.util.List servers = new java.util.ArrayList/*<Server>*/();
1395                settings.setServers( servers );
1396                while ( parser.nextTag() == XmlPullParser.START_TAG )
1397                {
1398                    if ( "server".equals( parser.getName() ) )
1399                    {
1400                        servers.add( parseServer( parser, strict ) );
1401                    }
1402                    else
1403                    {
1404                        checkUnknownElement( parser, strict );
1405                    }
1406                }
1407            }
1408            else if ( checkFieldWithDuplicate( parser, "mirrors", null, parsed ) )
1409            {
1410                java.util.List mirrors = new java.util.ArrayList/*<Mirror>*/();
1411                settings.setMirrors( mirrors );
1412                while ( parser.nextTag() == XmlPullParser.START_TAG )
1413                {
1414                    if ( "mirror".equals( parser.getName() ) )
1415                    {
1416                        mirrors.add( parseMirror( parser, strict ) );
1417                    }
1418                    else
1419                    {
1420                        checkUnknownElement( parser, strict );
1421                    }
1422                }
1423            }
1424            else if ( checkFieldWithDuplicate( parser, "profiles", null, parsed ) )
1425            {
1426                java.util.List profiles = new java.util.ArrayList/*<Profile>*/();
1427                settings.setProfiles( profiles );
1428                while ( parser.nextTag() == XmlPullParser.START_TAG )
1429                {
1430                    if ( "profile".equals( parser.getName() ) )
1431                    {
1432                        profiles.add( parseProfile( parser, strict ) );
1433                    }
1434                    else
1435                    {
1436                        checkUnknownElement( parser, strict );
1437                    }
1438                }
1439            }
1440            else if ( checkFieldWithDuplicate( parser, "activeProfiles", null, parsed ) )
1441            {
1442                java.util.List activeProfiles = new java.util.ArrayList/*<String>*/();
1443                settings.setActiveProfiles( activeProfiles );
1444                while ( parser.nextTag() == XmlPullParser.START_TAG )
1445                {
1446                    if ( "activeProfile".equals( parser.getName() ) )
1447                    {
1448                        activeProfiles.add( interpolatedTrimmed( parser.nextText(), "activeProfiles" ) );
1449                    }
1450                    else
1451                    {
1452                        checkUnknownElement( parser, strict );
1453                    }
1454                }
1455            }
1456            else if ( checkFieldWithDuplicate( parser, "pluginGroups", null, parsed ) )
1457            {
1458                java.util.List pluginGroups = new java.util.ArrayList/*<String>*/();
1459                settings.setPluginGroups( pluginGroups );
1460                while ( parser.nextTag() == XmlPullParser.START_TAG )
1461                {
1462                    if ( "pluginGroup".equals( parser.getName() ) )
1463                    {
1464                        pluginGroups.add( interpolatedTrimmed( parser.nextText(), "pluginGroups" ) );
1465                    }
1466                    else
1467                    {
1468                        checkUnknownElement( parser, strict );
1469                    }
1470                }
1471            }
1472            else
1473            {
1474                checkUnknownElement( parser, strict );
1475            }
1476        }
1477        return settings;
1478    } //-- Settings parseSettings( XmlPullParser, boolean )
1479
1480    /**
1481     * Method parseTrackableBase.
1482     * 
1483     * @param parser
1484     * @param strict
1485     * @throws IOException
1486     * @throws XmlPullParserException
1487     * @return TrackableBase
1488     */
1489    private TrackableBase parseTrackableBase( XmlPullParser parser, boolean strict )
1490        throws IOException, XmlPullParserException
1491    {
1492        String tagName = parser.getName();
1493        TrackableBase trackableBase = new TrackableBase();
1494        for ( int i = parser.getAttributeCount() - 1; i >= 0; i-- )
1495        {
1496            String name = parser.getAttributeName( i );
1497            String value = parser.getAttributeValue( i );
1498
1499            if ( name.indexOf( ':' ) >= 0 )
1500            {
1501                // just ignore attributes with non-default namespace (for example: xmlns:xsi)
1502            }
1503            else
1504            {
1505                checkUnknownAttribute( parser, name, tagName, strict );
1506            }
1507        }
1508        java.util.Set parsed = new java.util.HashSet();
1509        while ( ( strict ? parser.nextTag() : nextTag( parser ) ) == XmlPullParser.START_TAG )
1510        {
1511            checkUnknownElement( parser, strict );
1512        }
1513        return trackableBase;
1514    } //-- TrackableBase parseTrackableBase( XmlPullParser, boolean )
1515
1516    /**
1517     * Method read.
1518     * 
1519     * @param parser
1520     * @param strict
1521     * @throws IOException
1522     * @throws XmlPullParserException
1523     * @return Settings
1524     */
1525    private Settings read( XmlPullParser parser, boolean strict )
1526        throws IOException, XmlPullParserException
1527    {
1528        int eventType = parser.getEventType();
1529        while ( eventType != XmlPullParser.END_DOCUMENT )
1530        {
1531            if ( eventType == XmlPullParser.START_TAG )
1532            {
1533                if ( strict && ! "settings".equals( parser.getName() ) )
1534                {
1535                    throw new XmlPullParserException( "Expected root element 'settings' but found '" + parser.getName() + "'", parser, null );
1536                }
1537                Settings settings = parseSettings( parser, strict );
1538                settings.setModelEncoding( parser.getInputEncoding() );
1539                return settings;
1540            }
1541            eventType = parser.next();
1542        }
1543        throw new XmlPullParserException( "Expected root element 'settings' but found no element at all: invalid XML document", parser, null );
1544    } //-- Settings read( XmlPullParser, boolean )
1545
1546    /**
1547     * Sets the state of the "add default entities" flag.
1548     * 
1549     * @param addDefaultEntities
1550     */
1551    public void setAddDefaultEntities( boolean addDefaultEntities )
1552    {
1553        this.addDefaultEntities = addDefaultEntities;
1554    } //-- void setAddDefaultEntities( boolean )
1555
1556    public static interface ContentTransformer
1557{
1558    /**
1559     * Interpolate the value read from the xpp3 document
1560     * @param source The source value
1561     * @param fieldName A description of the field being interpolated. The implementation may use this to
1562     *                           log stuff.
1563     * @return The interpolated value.
1564     */
1565    String transform( String source, String fieldName );
1566}
1567
1568}