001// =================== DO NOT EDIT THIS FILE ====================
002// Generated by Modello 2.7.0,
003// any modifications will be overwritten.
004// ==============================================================
005
006package org.codehaus.modello.test.features.io.dom4j;
007
008  //---------------------------------/
009 //- Imported classes and packages -/
010//---------------------------------/
011
012import java.io.IOException;
013import java.io.InputStream;
014import java.io.Reader;
015import java.net.URL;
016import java.text.DateFormat;
017import java.text.ParsePosition;
018import java.util.Date;
019import java.util.Iterator;
020import java.util.Locale;
021import org.codehaus.modello.test.features.Action;
022import org.codehaus.modello.test.features.AnnotationTest;
023import org.codehaus.modello.test.features.ArrayFeatures;
024import org.codehaus.modello.test.features.AssociationFeatures;
025import org.codehaus.modello.test.features.BaseClass;
026import org.codehaus.modello.test.features.BidiInList;
027import org.codehaus.modello.test.features.BidiInSet;
028import org.codehaus.modello.test.features.Bidirectional;
029import org.codehaus.modello.test.features.ContentTest;
030import org.codehaus.modello.test.features.DueTo;
031import org.codehaus.modello.test.features.Features;
032import org.codehaus.modello.test.features.File;
033import org.codehaus.modello.test.features.InterfacesFeature;
034import org.codehaus.modello.test.features.JavaFeatures;
035import org.codehaus.modello.test.features.NodeItem;
036import org.codehaus.modello.test.features.Reference;
037import org.codehaus.modello.test.features.SimpleInterface;
038import org.codehaus.modello.test.features.SimpleTypes;
039import org.codehaus.modello.test.features.SubClassLevel1;
040import org.codehaus.modello.test.features.SubClassLevel2;
041import org.codehaus.modello.test.features.SubClassLevel3;
042import org.codehaus.modello.test.features.SubInterface;
043import org.codehaus.modello.test.features.SuperThing;
044import org.codehaus.modello.test.features.Thing;
045import org.codehaus.modello.test.features.Thingy;
046import org.codehaus.modello.test.features.XdocFeatures;
047import org.codehaus.modello.test.features.XmlAttributes;
048import org.codehaus.modello.test.features.XmlContent;
049import org.codehaus.modello.test.features.XmlContentLong;
050import org.codehaus.modello.test.features.XmlContentLongWithAttributes;
051import org.codehaus.modello.test.features.XmlFeatures;
052import org.codehaus.modello.test.features.XmlFieldsOrder;
053import org.codehaus.modello.test.features.XmlFieldsOrderParent;
054import org.codehaus.modello.test.features.XmlFieldsOrderParent2;
055import org.codehaus.modello.test.features.XmlTransientFields;
056import org.codehaus.modello.test.features.XsdFeatures;
057import org.codehaus.modello.test.features.other.PackageNameFeature;
058import org.codehaus.modello.test.features.other.SubInterfaceInPackage;
059import org.codehaus.plexus.util.xml.Xpp3Dom;
060import org.dom4j.Attribute;
061import org.dom4j.Document;
062import org.dom4j.DocumentException;
063import org.dom4j.Element;
064import org.dom4j.Node;
065import org.dom4j.io.SAXReader;
066
067/**
068 * Class ModelloFeaturesTestDom4jReader.
069 * 
070 * @version $Revision$ $Date$
071 */
072@SuppressWarnings( "all" )
073public class ModelloFeaturesTestDom4jReader
074{
075
076      //-----------/
077     //- Methods -/
078    //-----------/
079
080    /**
081     * Method checkFieldWithDuplicate.
082     * 
083     * @param element a element object.
084     * @param parsed a parsed object.
085     * @param alias a alias object.
086     * @param tagName a tagName object.
087     * @throws DocumentException DocumentException if any.
088     * @return boolean
089     */
090    private boolean checkFieldWithDuplicate( Element element, String tagName, String alias, java.util.Set parsed )
091        throws DocumentException
092    {
093        if ( !( element.getName().equals( tagName ) || element.getName().equals( alias ) ) )
094        {
095            return false;
096        }
097        if ( !parsed.add( tagName ) )
098        {
099            throw new DocumentException( "Duplicated tag: '" + tagName + "'" );
100        }
101        return true;
102    } //-- boolean checkFieldWithDuplicate( Element, String, String, java.util.Set )
103
104    /**
105     * Method checkUnknownElement.
106     * 
107     * @param element a element object.
108     * @param strict a strict object.
109     * @throws DocumentException DocumentException if any.
110     */
111    private void checkUnknownElement( Element element, boolean strict )
112        throws DocumentException
113    {
114        if ( strict )
115        {
116            throw new DocumentException( "Unrecognised tag: '" + element.getName() + "'" );
117        }
118    } //-- void checkUnknownElement( Element, boolean )
119
120    /**
121     * Method getBooleanValue.
122     * 
123     * @param s a s object.
124     * @param attribute a attribute object.
125     * @return boolean
126     */
127    private boolean getBooleanValue( String s, String attribute )
128    {
129        if ( s != null )
130        {
131            return Boolean.valueOf( s ).booleanValue();
132        }
133        return false;
134    } //-- boolean getBooleanValue( String, String )
135
136    /**
137     * Method getByteValue.
138     * 
139     * @param s a s object.
140     * @param strict a strict object.
141     * @param attribute a attribute object.
142     * @throws DocumentException DocumentException if any.
143     * @return byte
144     */
145    private byte getByteValue( String s, String attribute, boolean strict )
146        throws DocumentException
147    {
148        if ( s != null )
149        {
150            try
151            {
152                return Byte.valueOf( s ).byteValue();
153            }
154            catch ( NumberFormatException nfe )
155            {
156                if ( strict )
157                {
158                    throw new DocumentException( "Unable to parse element '" + attribute + "', must be a byte", nfe );
159                }
160            }
161        }
162        return 0;
163    } //-- byte getByteValue( String, String, boolean )
164
165    /**
166     * Method getCharacterValue.
167     * 
168     * @param s a s object.
169     * @param attribute a attribute object.
170     * @return char
171     */
172    private char getCharacterValue( String s, String attribute )
173    {
174        if ( s != null )
175        {
176            return s.charAt( 0 );
177        }
178        return 0;
179    } //-- char getCharacterValue( String, String )
180
181    /**
182     * Method getDateValue.
183     * 
184     * @param s a s object.
185     * @param dateFormat a dateFormat object.
186     * @param attribute a attribute object.
187     * @throws DocumentException DocumentException if any.
188     * @return Date
189     */
190    private java.util.Date getDateValue( String s, String attribute, String dateFormat )
191        throws DocumentException
192    {
193        if ( s != null )
194        {
195            String effectiveDateFormat = dateFormat;
196            if ( dateFormat == null )
197            {
198                effectiveDateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS";
199            }
200            if ( "long".equals( effectiveDateFormat ) )
201            {
202                try
203                {
204                    return new java.util.Date( Long.parseLong( s ) );
205                }
206                catch ( NumberFormatException e )
207                {
208                    throw new DocumentException( e.getMessage(), e );
209                }
210            }
211            else
212            {
213                try
214                {
215                    DateFormat dateParser = new java.text.SimpleDateFormat( effectiveDateFormat, java.util.Locale.US );
216                    return dateParser.parse( s );
217                }
218                catch ( java.text.ParseException e )
219                {
220                    throw new DocumentException( e.getMessage(), e );
221                }
222            }
223        }
224        return null;
225    } //-- java.util.Date getDateValue( String, String, String )
226
227    /**
228     * Method getDoubleValue.
229     * 
230     * @param s a s object.
231     * @param strict a strict object.
232     * @param attribute a attribute object.
233     * @throws DocumentException DocumentException if any.
234     * @return double
235     */
236    private double getDoubleValue( String s, String attribute, boolean strict )
237        throws DocumentException
238    {
239        if ( s != null )
240        {
241            try
242            {
243                return Double.valueOf( s ).doubleValue();
244            }
245            catch ( NumberFormatException nfe )
246            {
247                if ( strict )
248                {
249                    throw new DocumentException( "Unable to parse element '" + attribute + "', must be a floating point number", nfe );
250                }
251            }
252        }
253        return 0;
254    } //-- double getDoubleValue( String, String, boolean )
255
256    /**
257     * Method getFloatValue.
258     * 
259     * @param s a s object.
260     * @param strict a strict object.
261     * @param attribute a attribute object.
262     * @throws DocumentException DocumentException if any.
263     * @return float
264     */
265    private float getFloatValue( String s, String attribute, boolean strict )
266        throws DocumentException
267    {
268        if ( s != null )
269        {
270            try
271            {
272                return Float.valueOf( s ).floatValue();
273            }
274            catch ( NumberFormatException nfe )
275            {
276                if ( strict )
277                {
278                    throw new DocumentException( "Unable to parse element '" + attribute + "', must be a floating point number", nfe );
279                }
280            }
281        }
282        return 0;
283    } //-- float getFloatValue( String, String, boolean )
284
285    /**
286     * Method getIntegerValue.
287     * 
288     * @param s a s object.
289     * @param strict a strict object.
290     * @param attribute a attribute object.
291     * @throws DocumentException DocumentException if any.
292     * @return int
293     */
294    private int getIntegerValue( String s, String attribute, boolean strict )
295        throws DocumentException
296    {
297        if ( s != null )
298        {
299            try
300            {
301                return Integer.valueOf( s ).intValue();
302            }
303            catch ( NumberFormatException nfe )
304            {
305                if ( strict )
306                {
307                    throw new DocumentException( "Unable to parse element '" + attribute + "', must be an integer", nfe );
308                }
309            }
310        }
311        return 0;
312    } //-- int getIntegerValue( String, String, boolean )
313
314    /**
315     * Method getLongValue.
316     * 
317     * @param s a s object.
318     * @param strict a strict object.
319     * @param attribute a attribute object.
320     * @throws DocumentException DocumentException if any.
321     * @return long
322     */
323    private long getLongValue( String s, String attribute, boolean strict )
324        throws DocumentException
325    {
326        if ( s != null )
327        {
328            try
329            {
330                return Long.valueOf( s ).longValue();
331            }
332            catch ( NumberFormatException nfe )
333            {
334                if ( strict )
335                {
336                    throw new DocumentException( "Unable to parse element '" + attribute + "', must be a long integer", nfe );
337                }
338            }
339        }
340        return 0;
341    } //-- long getLongValue( String, String, boolean )
342
343    /**
344     * Method getShortValue.
345     * 
346     * @param s a s object.
347     * @param strict a strict object.
348     * @param attribute a attribute object.
349     * @throws DocumentException DocumentException if any.
350     * @return short
351     */
352    private short getShortValue( String s, String attribute, boolean strict )
353        throws DocumentException
354    {
355        if ( s != null )
356        {
357            try
358            {
359                return Short.valueOf( s ).shortValue();
360            }
361            catch ( NumberFormatException nfe )
362            {
363                if ( strict )
364                {
365                    throw new DocumentException( "Unable to parse element '" + attribute + "', must be a short integer", nfe );
366                }
367            }
368        }
369        return 0;
370    } //-- short getShortValue( String, String, boolean )
371
372    /**
373     * Method getTrimmedValue.
374     * 
375     * @param s a s object.
376     * @return String
377     */
378    private String getTrimmedValue( String s )
379    {
380        if ( s != null )
381        {
382            s = s.trim();
383        }
384        return s;
385    } //-- String getTrimmedValue( String )
386
387    /**
388     * Method parseAction.
389     * 
390     * @param tagName a tagName object.
391     * @param strict a strict object.
392     * @param element a element object.
393     * @throws IOException IOException if any.
394     * @throws DocumentException DocumentException if any.
395     * @return Action
396     */
397    private Action parseAction( String tagName, Element element, boolean strict )
398        throws IOException, DocumentException
399    {
400        Action action = new Action();
401        if ( element.attributeValue( "dev" ) != null  )
402        {
403            action.setDev( getTrimmedValue( element.attributeValue( "dev" ) ) );
404        }
405        action.setAction( getTrimmedValue( element.getText() ) );
406        return action;
407    } //-- Action parseAction( String, Element, boolean )
408
409    /**
410     * Method parseAnnotationTest.
411     * 
412     * @param tagName a tagName object.
413     * @param strict a strict object.
414     * @param element a element object.
415     * @throws IOException IOException if any.
416     * @throws DocumentException DocumentException if any.
417     * @return AnnotationTest
418     */
419    private AnnotationTest parseAnnotationTest( String tagName, Element element, boolean strict )
420        throws IOException, DocumentException
421    {
422        AnnotationTest annotationTest = new AnnotationTest();
423        java.util.Set parsed = new java.util.HashSet();
424        for ( Iterator i = element.nodeIterator(); i.hasNext(); )
425        {
426            Node node = (Node) i.next();
427            if ( node.getNodeType() == Node.ELEMENT_NODE )
428            {
429                Element childElement = (Element) node;
430                if ( checkFieldWithDuplicate( childElement, "anyField", null, parsed ) )
431                {
432                    annotationTest.setAnyField( getTrimmedValue( childElement.getText() ) );
433                }
434                else
435                {
436                    checkUnknownElement( childElement, strict );
437                }
438            }
439        }
440        return annotationTest;
441    } //-- AnnotationTest parseAnnotationTest( String, Element, boolean )
442
443    /**
444     * Method parseArrayFeatures.
445     * 
446     * @param tagName a tagName object.
447     * @param strict a strict object.
448     * @param element a element object.
449     * @throws IOException IOException if any.
450     * @throws DocumentException DocumentException if any.
451     * @return ArrayFeatures
452     */
453    private ArrayFeatures parseArrayFeatures( String tagName, Element element, boolean strict )
454        throws IOException, DocumentException
455    {
456        ArrayFeatures arrayFeatures = new ArrayFeatures();
457        java.util.Set parsed = new java.util.HashSet();
458        for ( Iterator i = element.nodeIterator(); i.hasNext(); )
459        {
460            Node node = (Node) i.next();
461            if ( node.getNodeType() == Node.ELEMENT_NODE )
462            {
463                Element childElement = (Element) node;
464                checkUnknownElement( childElement, strict );
465            }
466        }
467        return arrayFeatures;
468    } //-- ArrayFeatures parseArrayFeatures( String, Element, boolean )
469
470    /**
471     * Method parseAssociationFeatures.
472     * 
473     * @param tagName a tagName object.
474     * @param strict a strict object.
475     * @param element a element object.
476     * @throws IOException IOException if any.
477     * @throws DocumentException DocumentException if any.
478     * @return AssociationFeatures
479     */
480    private AssociationFeatures parseAssociationFeatures( String tagName, Element element, boolean strict )
481        throws IOException, DocumentException
482    {
483        AssociationFeatures associationFeatures = new AssociationFeatures();
484        java.util.Set parsed = new java.util.HashSet();
485        for ( Iterator i = element.nodeIterator(); i.hasNext(); )
486        {
487            Node node = (Node) i.next();
488            if ( node.getNodeType() == Node.ELEMENT_NODE )
489            {
490                Element childElement = (Element) node;
491                if ( checkFieldWithDuplicate( childElement, "listReferences", null, parsed ) )
492                {
493                    java.util.List listReferences = new java.util.ArrayList/*<Reference>*/();
494                    associationFeatures.setListReferences( listReferences );
495                    for ( Iterator j = childElement.nodeIterator(); j.hasNext(); )
496                    {
497                        Node n = (Node) j.next();
498                        if ( n.getNodeType() == Node.ELEMENT_NODE )
499                        {
500                            Element listElement = (Element) n;
501                            if ( "listReference".equals( listElement.getName() ) )
502                            {
503                                listReferences.add( parseReference( "listReference", listElement, strict ) );
504                            }
505                            else
506                            {
507                            }
508                        }
509                    }
510                }
511                else if ( checkFieldWithDuplicate( childElement, "setReferences", null, parsed ) )
512                {
513                    java.util.Set setReferences = new java.util.HashSet/*<Reference>*/();
514                    associationFeatures.setSetReferences( setReferences );
515                    for ( Iterator j = childElement.nodeIterator(); j.hasNext(); )
516                    {
517                        Node n = (Node) j.next();
518                        if ( n.getNodeType() == Node.ELEMENT_NODE )
519                        {
520                            Element listElement = (Element) n;
521                            if ( "setReference".equals( listElement.getName() ) )
522                            {
523                                setReferences.add( parseReference( "setReference", listElement, strict ) );
524                            }
525                            else
526                            {
527                            }
528                        }
529                    }
530                }
531                else if ( checkFieldWithDuplicate( childElement, "listStrings", null, parsed ) )
532                {
533                    java.util.List listStrings = new java.util.ArrayList/*<String>*/();
534                    associationFeatures.setListStrings( listStrings );
535                    for ( Iterator j = childElement.nodeIterator(); j.hasNext(); )
536                    {
537                        Node n = (Node) j.next();
538                        if ( n.getNodeType() == Node.ELEMENT_NODE )
539                        {
540                            Element listElement = (Element) n;
541                            if ( "listString".equals( listElement.getName() ) )
542                            {
543                                listStrings.add( getTrimmedValue( listElement.getText() ) );
544                            }
545                            else
546                            {
547                            }
548                        }
549                    }
550                }
551                else if ( checkFieldWithDuplicate( childElement, "setStrings", null, parsed ) )
552                {
553                    java.util.Set setStrings = new java.util.HashSet/*<String>*/();
554                    associationFeatures.setSetStrings( setStrings );
555                    for ( Iterator j = childElement.nodeIterator(); j.hasNext(); )
556                    {
557                        Node n = (Node) j.next();
558                        if ( n.getNodeType() == Node.ELEMENT_NODE )
559                        {
560                            Element listElement = (Element) n;
561                            if ( "setString".equals( listElement.getName() ) )
562                            {
563                                setStrings.add( getTrimmedValue( listElement.getText() ) );
564                            }
565                            else
566                            {
567                            }
568                        }
569                    }
570                }
571                else if ( checkFieldWithDuplicate( childElement, "properties", null, parsed ) )
572                {
573                    for ( Iterator j = childElement.nodeIterator(); j.hasNext(); )
574                    {
575                        Node n = (Node) j.next();
576                        if ( n.getNodeType() == Node.ELEMENT_NODE )
577                        {
578                            Element listElement = (Element) n;
579                            String key = listElement.getName();
580                            String value = listElement.getText().trim();
581                            associationFeatures.addProperty( key, value );
582                        }
583                    }
584                }
585                else if ( checkFieldWithDuplicate( childElement, "bidi", null, parsed ) )
586                {
587                    associationFeatures.setBidi( parseBidirectional( "bidi", childElement, strict ) );
588                }
589                else if ( checkFieldWithDuplicate( childElement, "listOfBidis", null, parsed ) )
590                {
591                    java.util.List listOfBidis = new java.util.ArrayList/*<BidiInList>*/();
592                    associationFeatures.setListOfBidis( listOfBidis );
593                    for ( Iterator j = childElement.nodeIterator(); j.hasNext(); )
594                    {
595                        Node n = (Node) j.next();
596                        if ( n.getNodeType() == Node.ELEMENT_NODE )
597                        {
598                            Element listElement = (Element) n;
599                            if ( "listOfBidi".equals( listElement.getName() ) )
600                            {
601                                listOfBidis.add( parseBidiInList( "listOfBidi", listElement, strict ) );
602                            }
603                            else
604                            {
605                            }
606                        }
607                    }
608                }
609                else if ( checkFieldWithDuplicate( childElement, "setOfBidis", null, parsed ) )
610                {
611                    java.util.Set setOfBidis = new java.util.HashSet/*<BidiInSet>*/();
612                    associationFeatures.setSetOfBidis( setOfBidis );
613                    for ( Iterator j = childElement.nodeIterator(); j.hasNext(); )
614                    {
615                        Node n = (Node) j.next();
616                        if ( n.getNodeType() == Node.ELEMENT_NODE )
617                        {
618                            Element listElement = (Element) n;
619                            if ( "setOfBidi".equals( listElement.getName() ) )
620                            {
621                                setOfBidis.add( parseBidiInSet( "setOfBidi", listElement, strict ) );
622                            }
623                            else
624                            {
625                            }
626                        }
627                    }
628                }
629                else
630                {
631                    checkUnknownElement( childElement, strict );
632                }
633            }
634        }
635        return associationFeatures;
636    } //-- AssociationFeatures parseAssociationFeatures( String, Element, boolean )
637
638    /**
639     * Method parseBaseClass.
640     * 
641     * @param tagName a tagName object.
642     * @param strict a strict object.
643     * @param element a element object.
644     * @throws IOException IOException if any.
645     * @throws DocumentException DocumentException if any.
646     * @return BaseClass
647     */
648    private BaseClass parseBaseClass( String tagName, Element element, boolean strict )
649        throws IOException, DocumentException
650    {
651        BaseClass baseClass = new BaseClass();
652        if ( element.attributeValue( "baseAttribute" ) != null  )
653        {
654            baseClass.setBaseAttribute( getIntegerValue( getTrimmedValue( element.attributeValue( "baseAttribute" ) ), "baseAttribute", strict ) );
655        }
656        java.util.Set parsed = new java.util.HashSet();
657        for ( Iterator i = element.nodeIterator(); i.hasNext(); )
658        {
659            Node node = (Node) i.next();
660            if ( node.getNodeType() == Node.ELEMENT_NODE )
661            {
662                Element childElement = (Element) node;
663                if ( checkFieldWithDuplicate( childElement, "baseElement", null, parsed ) )
664                {
665                    baseClass.setBaseElement( getIntegerValue( getTrimmedValue( childElement.getText() ), "baseElement", strict ) );
666                }
667                else
668                {
669                    checkUnknownElement( childElement, strict );
670                }
671            }
672        }
673        return baseClass;
674    } //-- BaseClass parseBaseClass( String, Element, boolean )
675
676    /**
677     * Method parseBidiInList.
678     * 
679     * @param tagName a tagName object.
680     * @param strict a strict object.
681     * @param element a element object.
682     * @throws IOException IOException if any.
683     * @throws DocumentException DocumentException if any.
684     * @return BidiInList
685     */
686    private BidiInList parseBidiInList( String tagName, Element element, boolean strict )
687        throws IOException, DocumentException
688    {
689        BidiInList bidiInList = new BidiInList();
690        java.util.Set parsed = new java.util.HashSet();
691        for ( Iterator i = element.nodeIterator(); i.hasNext(); )
692        {
693            Node node = (Node) i.next();
694            if ( node.getNodeType() == Node.ELEMENT_NODE )
695            {
696                Element childElement = (Element) node;
697                if ( checkFieldWithDuplicate( childElement, "parent", null, parsed ) )
698                {
699                    bidiInList.setParent( parseAssociationFeatures( "parent", childElement, strict ) );
700                }
701                else
702                {
703                    checkUnknownElement( childElement, strict );
704                }
705            }
706        }
707        return bidiInList;
708    } //-- BidiInList parseBidiInList( String, Element, boolean )
709
710    /**
711     * Method parseBidiInSet.
712     * 
713     * @param tagName a tagName object.
714     * @param strict a strict object.
715     * @param element a element object.
716     * @throws IOException IOException if any.
717     * @throws DocumentException DocumentException if any.
718     * @return BidiInSet
719     */
720    private BidiInSet parseBidiInSet( String tagName, Element element, boolean strict )
721        throws IOException, DocumentException
722    {
723        BidiInSet bidiInSet = new BidiInSet();
724        java.util.Set parsed = new java.util.HashSet();
725        for ( Iterator i = element.nodeIterator(); i.hasNext(); )
726        {
727            Node node = (Node) i.next();
728            if ( node.getNodeType() == Node.ELEMENT_NODE )
729            {
730                Element childElement = (Element) node;
731                if ( checkFieldWithDuplicate( childElement, "parent", null, parsed ) )
732                {
733                    bidiInSet.setParent( parseAssociationFeatures( "parent", childElement, strict ) );
734                }
735                else
736                {
737                    checkUnknownElement( childElement, strict );
738                }
739            }
740        }
741        return bidiInSet;
742    } //-- BidiInSet parseBidiInSet( String, Element, boolean )
743
744    /**
745     * Method parseBidirectional.
746     * 
747     * @param tagName a tagName object.
748     * @param strict a strict object.
749     * @param element a element object.
750     * @throws IOException IOException if any.
751     * @throws DocumentException DocumentException if any.
752     * @return Bidirectional
753     */
754    private Bidirectional parseBidirectional( String tagName, Element element, boolean strict )
755        throws IOException, DocumentException
756    {
757        Bidirectional bidirectional = new Bidirectional();
758        java.util.Set parsed = new java.util.HashSet();
759        for ( Iterator i = element.nodeIterator(); i.hasNext(); )
760        {
761            Node node = (Node) i.next();
762            if ( node.getNodeType() == Node.ELEMENT_NODE )
763            {
764                Element childElement = (Element) node;
765                if ( checkFieldWithDuplicate( childElement, "parent", null, parsed ) )
766                {
767                    bidirectional.setParent( parseAssociationFeatures( "parent", childElement, strict ) );
768                }
769                else
770                {
771                    checkUnknownElement( childElement, strict );
772                }
773            }
774        }
775        return bidirectional;
776    } //-- Bidirectional parseBidirectional( String, Element, boolean )
777
778    /**
779     * Method parseContentTest.
780     * 
781     * @param tagName a tagName object.
782     * @param strict a strict object.
783     * @param element a element object.
784     * @throws IOException IOException if any.
785     * @throws DocumentException DocumentException if any.
786     * @return ContentTest
787     */
788    private ContentTest parseContentTest( String tagName, Element element, boolean strict )
789        throws IOException, DocumentException
790    {
791        ContentTest contentTest = new ContentTest();
792        if ( element.attributeValue( "attr" ) != null  )
793        {
794            contentTest.setAttr( getTrimmedValue( element.attributeValue( "attr" ) ) );
795        }
796        if ( element.attributeValue( "attr2" ) != null  )
797        {
798            contentTest.setAttr2( getIntegerValue( getTrimmedValue( element.attributeValue( "attr2" ) ), "attr2", strict ) );
799        }
800        contentTest.setContent( getTrimmedValue( element.getText() ) );
801        return contentTest;
802    } //-- ContentTest parseContentTest( String, Element, boolean )
803
804    /**
805     * Method parseDueTo.
806     * 
807     * @param tagName a tagName object.
808     * @param strict a strict object.
809     * @param element a element object.
810     * @throws IOException IOException if any.
811     * @throws DocumentException DocumentException if any.
812     * @return DueTo
813     */
814    private DueTo parseDueTo( String tagName, Element element, boolean strict )
815        throws IOException, DocumentException
816    {
817        DueTo dueTo = new DueTo();
818        if ( element.attributeValue( "name" ) != null  )
819        {
820            dueTo.setName( getTrimmedValue( element.attributeValue( "name" ) ) );
821        }
822        if ( element.attributeValue( "email" ) != null  )
823        {
824            dueTo.setEmail( getTrimmedValue( element.attributeValue( "email" ) ) );
825        }
826        java.util.Set parsed = new java.util.HashSet();
827        for ( Iterator i = element.nodeIterator(); i.hasNext(); )
828        {
829            Node node = (Node) i.next();
830            if ( node.getNodeType() == Node.ELEMENT_NODE )
831            {
832                Element childElement = (Element) node;
833                checkUnknownElement( childElement, strict );
834            }
835        }
836        return dueTo;
837    } //-- DueTo parseDueTo( String, Element, boolean )
838
839    /**
840     * Method parseFeatures.
841     * 
842     * @param tagName a tagName object.
843     * @param strict a strict object.
844     * @param element a element object.
845     * @throws IOException IOException if any.
846     * @throws DocumentException DocumentException if any.
847     * @return Features
848     */
849    private Features parseFeatures( String tagName, Element element, boolean strict )
850        throws IOException, DocumentException
851    {
852        Features features = new Features();
853        if ( strict )
854        {
855            if ( !element.getName().equals( tagName ) )
856            {
857                throw new DocumentException( "Error parsing model: root element tag is '" + element.getName() + "' instead of '" + tagName + "'" );
858            }
859        }
860        java.util.Set parsed = new java.util.HashSet();
861        for ( Iterator i = element.nodeIterator(); i.hasNext(); )
862        {
863            Node node = (Node) i.next();
864            if ( node.getNodeType() == Node.ELEMENT_NODE )
865            {
866                Element childElement = (Element) node;
867                if ( checkFieldWithDuplicate( childElement, "versionField", null, parsed ) )
868                {
869                    features.setVersionField( getTrimmedValue( childElement.getText() ) );
870                }
871                else if ( checkFieldWithDuplicate( childElement, "comment", null, parsed ) )
872                {
873                    features.setComment( getTrimmedValue( childElement.getText() ) );
874                }
875                else if ( checkFieldWithDuplicate( childElement, "description", null, parsed ) )
876                {
877                    features.setDescription( getTrimmedValue( childElement.getText() ) );
878                }
879                else if ( checkFieldWithDuplicate( childElement, "required", null, parsed ) )
880                {
881                    features.setRequired( getTrimmedValue( childElement.getText() ) );
882                }
883                else if ( checkFieldWithDuplicate( childElement, "identifier", null, parsed ) )
884                {
885                    features.setIdentifier( getTrimmedValue( childElement.getText() ) );
886                }
887                else if ( checkFieldWithDuplicate( childElement, "identifierPart2", null, parsed ) )
888                {
889                    features.setIdentifierPart2( parseReference( "identifierPart2", childElement, strict ) );
890                }
891                else if ( checkFieldWithDuplicate( childElement, "simpleTypes", null, parsed ) )
892                {
893                    features.setSimpleTypes( parseSimpleTypes( "simpleTypes", childElement, strict ) );
894                }
895                else if ( checkFieldWithDuplicate( childElement, "defaultValues", null, parsed ) )
896                {
897                    features.setDefaultValues( parseSimpleTypes( "defaultValues", childElement, strict ) );
898                }
899                else if ( checkFieldWithDuplicate( childElement, "arrays", null, parsed ) )
900                {
901                    features.setArrays( parseArrayFeatures( "arrays", childElement, strict ) );
902                }
903                else if ( checkFieldWithDuplicate( childElement, "associationFeatures", null, parsed ) )
904                {
905                    features.setAssociationFeatures( parseAssociationFeatures( "associationFeatures", childElement, strict ) );
906                }
907                else if ( checkFieldWithDuplicate( childElement, "javaFeatures", null, parsed ) )
908                {
909                    features.setJavaFeatures( parseJavaFeatures( "javaFeatures", childElement, strict ) );
910                }
911                else if ( checkFieldWithDuplicate( childElement, "xmlFeatures", null, parsed ) )
912                {
913                    features.setXmlFeatures( parseXmlFeatures( "xmlFeatures", childElement, strict ) );
914                }
915                else if ( checkFieldWithDuplicate( childElement, "xdocFeatures", null, parsed ) )
916                {
917                    features.setXdocFeatures( parseXdocFeatures( "xdocFeatures", childElement, strict ) );
918                }
919                else if ( checkFieldWithDuplicate( childElement, "node", null, parsed ) )
920                {
921                    features.setNode( parseNodeItem( "node", childElement, strict ) );
922                }
923                else if ( checkFieldWithDuplicate( childElement, "cloneable", null, parsed ) )
924                {
925                    features.setCloneable( parseThing( "cloneable", childElement, strict ) );
926                }
927                else if ( checkFieldWithDuplicate( childElement, "file", null, parsed ) )
928                {
929                    features.setFile( parseFile( "file", childElement, strict ) );
930                }
931                else if ( checkFieldWithDuplicate( childElement, "action", null, parsed ) )
932                {
933                    features.setAction( parseAction( "action", childElement, strict ) );
934                }
935                else
936                {
937                    checkUnknownElement( childElement, strict );
938                }
939            }
940        }
941        return features;
942    } //-- Features parseFeatures( String, Element, boolean )
943
944    /**
945     * Method parseFile.
946     * 
947     * @param tagName a tagName object.
948     * @param strict a strict object.
949     * @param element a element object.
950     * @throws IOException IOException if any.
951     * @throws DocumentException DocumentException if any.
952     * @return File
953     */
954    private File parseFile( String tagName, Element element, boolean strict )
955        throws IOException, DocumentException
956    {
957        File file = new File();
958        java.util.Set parsed = new java.util.HashSet();
959        for ( Iterator i = element.nodeIterator(); i.hasNext(); )
960        {
961            Node node = (Node) i.next();
962            if ( node.getNodeType() == Node.ELEMENT_NODE )
963            {
964                Element childElement = (Element) node;
965                if ( checkFieldWithDuplicate( childElement, "file", null, parsed ) )
966                {
967                    file.setFile( getTrimmedValue( childElement.getText() ) );
968                }
969                else
970                {
971                    checkUnknownElement( childElement, strict );
972                }
973            }
974        }
975        return file;
976    } //-- File parseFile( String, Element, boolean )
977
978    /**
979     * Method parseInterfacesFeature.
980     * 
981     * @param tagName a tagName object.
982     * @param strict a strict object.
983     * @param element a element object.
984     * @throws IOException IOException if any.
985     * @throws DocumentException DocumentException if any.
986     * @return InterfacesFeature
987     */
988    private InterfacesFeature parseInterfacesFeature( String tagName, Element element, boolean strict )
989        throws IOException, DocumentException
990    {
991        InterfacesFeature interfacesFeature = new InterfacesFeature();
992        java.util.Set parsed = new java.util.HashSet();
993        for ( Iterator i = element.nodeIterator(); i.hasNext(); )
994        {
995            Node node = (Node) i.next();
996            if ( node.getNodeType() == Node.ELEMENT_NODE )
997            {
998                Element childElement = (Element) node;
999                if ( checkFieldWithDuplicate( childElement, "id", null, parsed ) )
1000                {
1001                    interfacesFeature.setId( getTrimmedValue( childElement.getText() ) );
1002                }
1003                else
1004                {
1005                    checkUnknownElement( childElement, strict );
1006                }
1007            }
1008        }
1009        return interfacesFeature;
1010    } //-- InterfacesFeature parseInterfacesFeature( String, Element, boolean )
1011
1012    /**
1013     * Method parseJavaFeatures.
1014     * 
1015     * @param tagName a tagName object.
1016     * @param strict a strict object.
1017     * @param element a element object.
1018     * @throws IOException IOException if any.
1019     * @throws DocumentException DocumentException if any.
1020     * @return JavaFeatures
1021     */
1022    private JavaFeatures parseJavaFeatures( String tagName, Element element, boolean strict )
1023        throws IOException, DocumentException
1024    {
1025        JavaFeatures javaFeatures = new JavaFeatures();
1026        java.util.Set parsed = new java.util.HashSet();
1027        for ( Iterator i = element.nodeIterator(); i.hasNext(); )
1028        {
1029            Node node = (Node) i.next();
1030            if ( node.getNodeType() == Node.ELEMENT_NODE )
1031            {
1032                Element childElement = (Element) node;
1033                if ( checkFieldWithDuplicate( childElement, "interfaces", null, parsed ) )
1034                {
1035                    javaFeatures.setInterfaces( parseInterfacesFeature( "interfaces", childElement, strict ) );
1036                }
1037                else if ( checkFieldWithDuplicate( childElement, "packageName", null, parsed ) )
1038                {
1039                    javaFeatures.setPackageName( parsePackageNameFeature( "packageName", childElement, strict ) );
1040                }
1041                else if ( checkFieldWithDuplicate( childElement, "base", null, parsed ) )
1042                {
1043                    javaFeatures.setBase( parseBaseClass( "base", childElement, strict ) );
1044                }
1045                else if ( checkFieldWithDuplicate( childElement, "subClass", null, parsed ) )
1046                {
1047                    javaFeatures.setSubClass( parseSubClassLevel1( "subClass", childElement, strict ) );
1048                }
1049                else if ( checkFieldWithDuplicate( childElement, "subClass2", null, parsed ) )
1050                {
1051                    javaFeatures.setSubClass2( parseSubClassLevel2( "subClass2", childElement, strict ) );
1052                }
1053                else if ( checkFieldWithDuplicate( childElement, "subClass3", null, parsed ) )
1054                {
1055                    javaFeatures.setSubClass3( parseSubClassLevel3( "subClass3", childElement, strict ) );
1056                }
1057                else if ( checkFieldWithDuplicate( childElement, "annotation", null, parsed ) )
1058                {
1059                    javaFeatures.setAnnotation( parseAnnotationTest( "annotation", childElement, strict ) );
1060                }
1061                else
1062                {
1063                    checkUnknownElement( childElement, strict );
1064                }
1065            }
1066        }
1067        return javaFeatures;
1068    } //-- JavaFeatures parseJavaFeatures( String, Element, boolean )
1069
1070    /**
1071     * Method parseNodeItem.
1072     * 
1073     * @param tagName a tagName object.
1074     * @param strict a strict object.
1075     * @param element a element object.
1076     * @throws IOException IOException if any.
1077     * @throws DocumentException DocumentException if any.
1078     * @return NodeItem
1079     */
1080    private NodeItem parseNodeItem( String tagName, Element element, boolean strict )
1081        throws IOException, DocumentException
1082    {
1083        NodeItem nodeItem = new NodeItem();
1084        java.util.Set parsed = new java.util.HashSet();
1085        for ( Iterator i = element.nodeIterator(); i.hasNext(); )
1086        {
1087            Node node = (Node) i.next();
1088            if ( node.getNodeType() == Node.ELEMENT_NODE )
1089            {
1090                Element childElement = (Element) node;
1091                if ( checkFieldWithDuplicate( childElement, "value", null, parsed ) )
1092                {
1093                    nodeItem.setValue( getTrimmedValue( childElement.getText() ) );
1094                }
1095                else if ( checkFieldWithDuplicate( childElement, "child", null, parsed ) )
1096                {
1097                    nodeItem.setChild( parseNodeItem( "child", childElement, strict ) );
1098                }
1099                else
1100                {
1101                    checkUnknownElement( childElement, strict );
1102                }
1103            }
1104        }
1105        return nodeItem;
1106    } //-- NodeItem parseNodeItem( String, Element, boolean )
1107
1108    /**
1109     * Method parsePackageNameFeature.
1110     * 
1111     * @param tagName a tagName object.
1112     * @param strict a strict object.
1113     * @param element a element object.
1114     * @throws IOException IOException if any.
1115     * @throws DocumentException DocumentException if any.
1116     * @return PackageNameFeature
1117     */
1118    private PackageNameFeature parsePackageNameFeature( String tagName, Element element, boolean strict )
1119        throws IOException, DocumentException
1120    {
1121        PackageNameFeature packageNameFeature = new PackageNameFeature();
1122        java.util.Set parsed = new java.util.HashSet();
1123        for ( Iterator i = element.nodeIterator(); i.hasNext(); )
1124        {
1125            Node node = (Node) i.next();
1126            if ( node.getNodeType() == Node.ELEMENT_NODE )
1127            {
1128                Element childElement = (Element) node;
1129                if ( checkFieldWithDuplicate( childElement, "reference", null, parsed ) )
1130                {
1131                    packageNameFeature.setReference( parseReference( "reference", childElement, strict ) );
1132                }
1133                else
1134                {
1135                    checkUnknownElement( childElement, strict );
1136                }
1137            }
1138        }
1139        return packageNameFeature;
1140    } //-- PackageNameFeature parsePackageNameFeature( String, Element, boolean )
1141
1142    /**
1143     * Method parseReference.
1144     * 
1145     * @param tagName a tagName object.
1146     * @param strict a strict object.
1147     * @param element a element object.
1148     * @throws IOException IOException if any.
1149     * @throws DocumentException DocumentException if any.
1150     * @return Reference
1151     */
1152    private Reference parseReference( String tagName, Element element, boolean strict )
1153        throws IOException, DocumentException
1154    {
1155        Reference reference = new Reference();
1156        java.util.Set parsed = new java.util.HashSet();
1157        for ( Iterator i = element.nodeIterator(); i.hasNext(); )
1158        {
1159            Node node = (Node) i.next();
1160            if ( node.getNodeType() == Node.ELEMENT_NODE )
1161            {
1162                Element childElement = (Element) node;
1163                if ( checkFieldWithDuplicate( childElement, "id", "key", parsed ) )
1164                {
1165                    reference.setId( getTrimmedValue( childElement.getText() ) );
1166                }
1167                else
1168                {
1169                    checkUnknownElement( childElement, strict );
1170                }
1171            }
1172        }
1173        return reference;
1174    } //-- Reference parseReference( String, Element, boolean )
1175
1176    /**
1177     * Method parseSimpleTypes.
1178     * 
1179     * @param tagName a tagName object.
1180     * @param strict a strict object.
1181     * @param element a element object.
1182     * @throws IOException IOException if any.
1183     * @throws DocumentException DocumentException if any.
1184     * @return SimpleTypes
1185     */
1186    private SimpleTypes parseSimpleTypes( String tagName, Element element, boolean strict )
1187        throws IOException, DocumentException
1188    {
1189        SimpleTypes simpleTypes = new SimpleTypes();
1190        java.util.Set parsed = new java.util.HashSet();
1191        for ( Iterator i = element.nodeIterator(); i.hasNext(); )
1192        {
1193            Node node = (Node) i.next();
1194            if ( node.getNodeType() == Node.ELEMENT_NODE )
1195            {
1196                Element childElement = (Element) node;
1197                if ( checkFieldWithDuplicate( childElement, "primitiveBoolean", null, parsed ) )
1198                {
1199                    simpleTypes.setPrimitiveBoolean( getBooleanValue( getTrimmedValue( childElement.getText() ), "primitiveBoolean" ) );
1200                }
1201                else if ( checkFieldWithDuplicate( childElement, "primitiveChar", null, parsed ) )
1202                {
1203                    simpleTypes.setPrimitiveChar( getCharacterValue( getTrimmedValue( childElement.getText() ), "primitiveChar" ) );
1204                }
1205                else if ( checkFieldWithDuplicate( childElement, "primitiveByte", null, parsed ) )
1206                {
1207                    simpleTypes.setPrimitiveByte( getByteValue( getTrimmedValue( childElement.getText() ), "primitiveByte", strict ) );
1208                }
1209                else if ( checkFieldWithDuplicate( childElement, "primitiveShort", null, parsed ) )
1210                {
1211                    simpleTypes.setPrimitiveShort( getShortValue( getTrimmedValue( childElement.getText() ), "primitiveShort", strict ) );
1212                }
1213                else if ( checkFieldWithDuplicate( childElement, "primitiveInt", null, parsed ) )
1214                {
1215                    simpleTypes.setPrimitiveInt( getIntegerValue( getTrimmedValue( childElement.getText() ), "primitiveInt", strict ) );
1216                }
1217                else if ( checkFieldWithDuplicate( childElement, "primitiveLong", null, parsed ) )
1218                {
1219                    simpleTypes.setPrimitiveLong( getLongValue( getTrimmedValue( childElement.getText() ), "primitiveLong", strict ) );
1220                }
1221                else if ( checkFieldWithDuplicate( childElement, "primitiveFloat", null, parsed ) )
1222                {
1223                    simpleTypes.setPrimitiveFloat( getFloatValue( getTrimmedValue( childElement.getText() ), "primitiveFloat", strict ) );
1224                }
1225                else if ( checkFieldWithDuplicate( childElement, "primitiveDouble", null, parsed ) )
1226                {
1227                    simpleTypes.setPrimitiveDouble( getDoubleValue( getTrimmedValue( childElement.getText() ), "primitiveDouble", strict ) );
1228                }
1229                else if ( checkFieldWithDuplicate( childElement, "objectString", null, parsed ) )
1230                {
1231                    simpleTypes.setObjectString( getTrimmedValue( childElement.getText() ) );
1232                }
1233                else if ( checkFieldWithDuplicate( childElement, "objectDate", null, parsed ) )
1234                {
1235                    String dateFormat = null;
1236                    simpleTypes.setObjectDate( getDateValue( getTrimmedValue( childElement.getText() ), "objectDate", dateFormat ) );
1237                }
1238                else if ( checkFieldWithDuplicate( childElement, "primitiveBooleanNoDefault", null, parsed ) )
1239                {
1240                    simpleTypes.setPrimitiveBooleanNoDefault( getBooleanValue( getTrimmedValue( childElement.getText() ), "primitiveBooleanNoDefault" ) );
1241                }
1242                else if ( checkFieldWithDuplicate( childElement, "primitiveCharNoDefault", null, parsed ) )
1243                {
1244                    simpleTypes.setPrimitiveCharNoDefault( getCharacterValue( getTrimmedValue( childElement.getText() ), "primitiveCharNoDefault" ) );
1245                }
1246                else if ( checkFieldWithDuplicate( childElement, "primitiveByteNoDefault", null, parsed ) )
1247                {
1248                    simpleTypes.setPrimitiveByteNoDefault( getByteValue( getTrimmedValue( childElement.getText() ), "primitiveByteNoDefault", strict ) );
1249                }
1250                else if ( checkFieldWithDuplicate( childElement, "primitiveShortNoDefault", null, parsed ) )
1251                {
1252                    simpleTypes.setPrimitiveShortNoDefault( getShortValue( getTrimmedValue( childElement.getText() ), "primitiveShortNoDefault", strict ) );
1253                }
1254                else if ( checkFieldWithDuplicate( childElement, "primitiveIntNoDefault", null, parsed ) )
1255                {
1256                    simpleTypes.setPrimitiveIntNoDefault( getIntegerValue( getTrimmedValue( childElement.getText() ), "primitiveIntNoDefault", strict ) );
1257                }
1258                else if ( checkFieldWithDuplicate( childElement, "primitiveLongNoDefault", null, parsed ) )
1259                {
1260                    simpleTypes.setPrimitiveLongNoDefault( getLongValue( getTrimmedValue( childElement.getText() ), "primitiveLongNoDefault", strict ) );
1261                }
1262                else if ( checkFieldWithDuplicate( childElement, "primitiveFloatNoDefault", null, parsed ) )
1263                {
1264                    simpleTypes.setPrimitiveFloatNoDefault( getFloatValue( getTrimmedValue( childElement.getText() ), "primitiveFloatNoDefault", strict ) );
1265                }
1266                else if ( checkFieldWithDuplicate( childElement, "primitiveDoubleNoDefault", null, parsed ) )
1267                {
1268                    simpleTypes.setPrimitiveDoubleNoDefault( getDoubleValue( getTrimmedValue( childElement.getText() ), "primitiveDoubleNoDefault", strict ) );
1269                }
1270                else if ( checkFieldWithDuplicate( childElement, "objectStringNoDefault", null, parsed ) )
1271                {
1272                    simpleTypes.setObjectStringNoDefault( getTrimmedValue( childElement.getText() ) );
1273                }
1274                else if ( checkFieldWithDuplicate( childElement, "objectDateNoDefault", null, parsed ) )
1275                {
1276                    String dateFormat = null;
1277                    simpleTypes.setObjectDateNoDefault( getDateValue( getTrimmedValue( childElement.getText() ), "objectDateNoDefault", dateFormat ) );
1278                }
1279                else if ( checkFieldWithDuplicate( childElement, "dom", null, parsed ) )
1280                {
1281                    simpleTypes.setDom( writeElementToXpp3Dom( childElement ) );
1282                }
1283                else if ( checkFieldWithDuplicate( childElement, "content", null, parsed ) )
1284                {
1285                    simpleTypes.setContent( parseContentTest( "content", childElement, strict ) );
1286                }
1287                else
1288                {
1289                    checkUnknownElement( childElement, strict );
1290                }
1291            }
1292        }
1293        return simpleTypes;
1294    } //-- SimpleTypes parseSimpleTypes( String, Element, boolean )
1295
1296    /**
1297     * Method parseSubClassLevel1.
1298     * 
1299     * @param tagName a tagName object.
1300     * @param strict a strict object.
1301     * @param element a element object.
1302     * @throws IOException IOException if any.
1303     * @throws DocumentException DocumentException if any.
1304     * @return SubClassLevel1
1305     */
1306    private SubClassLevel1 parseSubClassLevel1( String tagName, Element element, boolean strict )
1307        throws IOException, DocumentException
1308    {
1309        SubClassLevel1 subClassLevel1 = new SubClassLevel1();
1310        if ( element.attributeValue( "subAttribute1" ) != null  )
1311        {
1312            subClassLevel1.setSubAttribute1( getLongValue( getTrimmedValue( element.attributeValue( "subAttribute1" ) ), "subAttribute1", strict ) );
1313        }
1314        if ( element.attributeValue( "baseAttribute" ) != null  )
1315        {
1316            subClassLevel1.setBaseAttribute( getIntegerValue( getTrimmedValue( element.attributeValue( "baseAttribute" ) ), "baseAttribute", strict ) );
1317        }
1318        java.util.Set parsed = new java.util.HashSet();
1319        for ( Iterator i = element.nodeIterator(); i.hasNext(); )
1320        {
1321            Node node = (Node) i.next();
1322            if ( node.getNodeType() == Node.ELEMENT_NODE )
1323            {
1324                Element childElement = (Element) node;
1325                if ( checkFieldWithDuplicate( childElement, "subElement1", null, parsed ) )
1326                {
1327                    subClassLevel1.setSubElement1( getLongValue( getTrimmedValue( childElement.getText() ), "subElement1", strict ) );
1328                }
1329                else if ( checkFieldWithDuplicate( childElement, "baseElement", null, parsed ) )
1330                {
1331                    subClassLevel1.setBaseElement( getIntegerValue( getTrimmedValue( childElement.getText() ), "baseElement", strict ) );
1332                }
1333                else
1334                {
1335                    checkUnknownElement( childElement, strict );
1336                }
1337            }
1338        }
1339        return subClassLevel1;
1340    } //-- SubClassLevel1 parseSubClassLevel1( String, Element, boolean )
1341
1342    /**
1343     * Method parseSubClassLevel2.
1344     * 
1345     * @param tagName a tagName object.
1346     * @param strict a strict object.
1347     * @param element a element object.
1348     * @throws IOException IOException if any.
1349     * @throws DocumentException DocumentException if any.
1350     * @return SubClassLevel2
1351     */
1352    private SubClassLevel2 parseSubClassLevel2( String tagName, Element element, boolean strict )
1353        throws IOException, DocumentException
1354    {
1355        SubClassLevel2 subClassLevel2 = new SubClassLevel2();
1356        if ( element.attributeValue( "subAttribute2" ) != null  )
1357        {
1358            subClassLevel2.setSubAttribute2( getFloatValue( getTrimmedValue( element.attributeValue( "subAttribute2" ) ), "subAttribute2", strict ) );
1359        }
1360        if ( element.attributeValue( "subAttribute1" ) != null  )
1361        {
1362            subClassLevel2.setSubAttribute1( getLongValue( getTrimmedValue( element.attributeValue( "subAttribute1" ) ), "subAttribute1", strict ) );
1363        }
1364        if ( element.attributeValue( "baseAttribute" ) != null  )
1365        {
1366            subClassLevel2.setBaseAttribute( getIntegerValue( getTrimmedValue( element.attributeValue( "baseAttribute" ) ), "baseAttribute", strict ) );
1367        }
1368        java.util.Set parsed = new java.util.HashSet();
1369        for ( Iterator i = element.nodeIterator(); i.hasNext(); )
1370        {
1371            Node node = (Node) i.next();
1372            if ( node.getNodeType() == Node.ELEMENT_NODE )
1373            {
1374                Element childElement = (Element) node;
1375                if ( checkFieldWithDuplicate( childElement, "subElement2", null, parsed ) )
1376                {
1377                    subClassLevel2.setSubElement2( getFloatValue( getTrimmedValue( childElement.getText() ), "subElement2", strict ) );
1378                }
1379                else if ( checkFieldWithDuplicate( childElement, "subElement1", null, parsed ) )
1380                {
1381                    subClassLevel2.setSubElement1( getLongValue( getTrimmedValue( childElement.getText() ), "subElement1", strict ) );
1382                }
1383                else if ( checkFieldWithDuplicate( childElement, "baseElement", null, parsed ) )
1384                {
1385                    subClassLevel2.setBaseElement( getIntegerValue( getTrimmedValue( childElement.getText() ), "baseElement", strict ) );
1386                }
1387                else
1388                {
1389                    checkUnknownElement( childElement, strict );
1390                }
1391            }
1392        }
1393        return subClassLevel2;
1394    } //-- SubClassLevel2 parseSubClassLevel2( String, Element, boolean )
1395
1396    /**
1397     * Method parseSubClassLevel3.
1398     * 
1399     * @param tagName a tagName object.
1400     * @param strict a strict object.
1401     * @param element a element object.
1402     * @throws IOException IOException if any.
1403     * @throws DocumentException DocumentException if any.
1404     * @return SubClassLevel3
1405     */
1406    private SubClassLevel3 parseSubClassLevel3( String tagName, Element element, boolean strict )
1407        throws IOException, DocumentException
1408    {
1409        SubClassLevel3 subClassLevel3 = new SubClassLevel3();
1410        if ( element.attributeValue( "subAttribute3" ) != null  )
1411        {
1412            subClassLevel3.setSubAttribute3( getDoubleValue( getTrimmedValue( element.attributeValue( "subAttribute3" ) ), "subAttribute3", strict ) );
1413        }
1414        if ( element.attributeValue( "subAttribute2" ) != null  )
1415        {
1416            subClassLevel3.setSubAttribute2( getFloatValue( getTrimmedValue( element.attributeValue( "subAttribute2" ) ), "subAttribute2", strict ) );
1417        }
1418        if ( element.attributeValue( "subAttribute1" ) != null  )
1419        {
1420            subClassLevel3.setSubAttribute1( getLongValue( getTrimmedValue( element.attributeValue( "subAttribute1" ) ), "subAttribute1", strict ) );
1421        }
1422        if ( element.attributeValue( "baseAttribute" ) != null  )
1423        {
1424            subClassLevel3.setBaseAttribute( getIntegerValue( getTrimmedValue( element.attributeValue( "baseAttribute" ) ), "baseAttribute", strict ) );
1425        }
1426        java.util.Set parsed = new java.util.HashSet();
1427        for ( Iterator i = element.nodeIterator(); i.hasNext(); )
1428        {
1429            Node node = (Node) i.next();
1430            if ( node.getNodeType() == Node.ELEMENT_NODE )
1431            {
1432                Element childElement = (Element) node;
1433                if ( checkFieldWithDuplicate( childElement, "subElement3", null, parsed ) )
1434                {
1435                    subClassLevel3.setSubElement3( getDoubleValue( getTrimmedValue( childElement.getText() ), "subElement3", strict ) );
1436                }
1437                else if ( checkFieldWithDuplicate( childElement, "subElement2", null, parsed ) )
1438                {
1439                    subClassLevel3.setSubElement2( getFloatValue( getTrimmedValue( childElement.getText() ), "subElement2", strict ) );
1440                }
1441                else if ( checkFieldWithDuplicate( childElement, "subElement1", null, parsed ) )
1442                {
1443                    subClassLevel3.setSubElement1( getLongValue( getTrimmedValue( childElement.getText() ), "subElement1", strict ) );
1444                }
1445                else if ( checkFieldWithDuplicate( childElement, "baseElement", null, parsed ) )
1446                {
1447                    subClassLevel3.setBaseElement( getIntegerValue( getTrimmedValue( childElement.getText() ), "baseElement", strict ) );
1448                }
1449                else
1450                {
1451                    checkUnknownElement( childElement, strict );
1452                }
1453            }
1454        }
1455        return subClassLevel3;
1456    } //-- SubClassLevel3 parseSubClassLevel3( String, Element, boolean )
1457
1458    /**
1459     * Method parseSuperThing.
1460     * 
1461     * @param tagName a tagName object.
1462     * @param strict a strict object.
1463     * @param element a element object.
1464     * @throws IOException IOException if any.
1465     * @throws DocumentException DocumentException if any.
1466     * @return SuperThing
1467     */
1468    private SuperThing parseSuperThing( String tagName, Element element, boolean strict )
1469        throws IOException, DocumentException
1470    {
1471        SuperThing superThing = new SuperThing();
1472        java.util.Set parsed = new java.util.HashSet();
1473        for ( Iterator i = element.nodeIterator(); i.hasNext(); )
1474        {
1475            Node node = (Node) i.next();
1476            if ( node.getNodeType() == Node.ELEMENT_NODE )
1477            {
1478                Element childElement = (Element) node;
1479                checkUnknownElement( childElement, strict );
1480            }
1481        }
1482        return superThing;
1483    } //-- SuperThing parseSuperThing( String, Element, boolean )
1484
1485    /**
1486     * Method parseThing.
1487     * 
1488     * @param tagName a tagName object.
1489     * @param strict a strict object.
1490     * @param element a element object.
1491     * @throws IOException IOException if any.
1492     * @throws DocumentException DocumentException if any.
1493     * @return Thing
1494     */
1495    private Thing parseThing( String tagName, Element element, boolean strict )
1496        throws IOException, DocumentException
1497    {
1498        Thing thing = new Thing();
1499        java.util.Set parsed = new java.util.HashSet();
1500        for ( Iterator i = element.nodeIterator(); i.hasNext(); )
1501        {
1502            Node node = (Node) i.next();
1503            if ( node.getNodeType() == Node.ELEMENT_NODE )
1504            {
1505                Element childElement = (Element) node;
1506                if ( checkFieldWithDuplicate( childElement, "someBoolean", null, parsed ) )
1507                {
1508                    thing.setSomeBoolean( getBooleanValue( getTrimmedValue( childElement.getText() ), "someBoolean" ) );
1509                }
1510                else if ( checkFieldWithDuplicate( childElement, "someChar", null, parsed ) )
1511                {
1512                    thing.setSomeChar( getCharacterValue( getTrimmedValue( childElement.getText() ), "someChar" ) );
1513                }
1514                else if ( checkFieldWithDuplicate( childElement, "someByte", null, parsed ) )
1515                {
1516                    thing.setSomeByte( getByteValue( getTrimmedValue( childElement.getText() ), "someByte", strict ) );
1517                }
1518                else if ( checkFieldWithDuplicate( childElement, "someShort", null, parsed ) )
1519                {
1520                    thing.setSomeShort( getShortValue( getTrimmedValue( childElement.getText() ), "someShort", strict ) );
1521                }
1522                else if ( checkFieldWithDuplicate( childElement, "someInt", null, parsed ) )
1523                {
1524                    thing.setSomeInt( getIntegerValue( getTrimmedValue( childElement.getText() ), "someInt", strict ) );
1525                }
1526                else if ( checkFieldWithDuplicate( childElement, "someLong", null, parsed ) )
1527                {
1528                    thing.setSomeLong( getLongValue( getTrimmedValue( childElement.getText() ), "someLong", strict ) );
1529                }
1530                else if ( checkFieldWithDuplicate( childElement, "someFloat", null, parsed ) )
1531                {
1532                    thing.setSomeFloat( getFloatValue( getTrimmedValue( childElement.getText() ), "someFloat", strict ) );
1533                }
1534                else if ( checkFieldWithDuplicate( childElement, "someDouble", null, parsed ) )
1535                {
1536                    thing.setSomeDouble( getDoubleValue( getTrimmedValue( childElement.getText() ), "someDouble", strict ) );
1537                }
1538                else if ( checkFieldWithDuplicate( childElement, "someString", null, parsed ) )
1539                {
1540                    thing.setSomeString( getTrimmedValue( childElement.getText() ) );
1541                }
1542                else if ( checkFieldWithDuplicate( childElement, "someDate", null, parsed ) )
1543                {
1544                    String dateFormat = null;
1545                    thing.setSomeDate( getDateValue( getTrimmedValue( childElement.getText() ), "someDate", dateFormat ) );
1546                }
1547                else if ( checkFieldWithDuplicate( childElement, "someDom", null, parsed ) )
1548                {
1549                    thing.setSomeDom( writeElementToXpp3Dom( childElement ) );
1550                }
1551                else if ( checkFieldWithDuplicate( childElement, "someProperties", null, parsed ) )
1552                {
1553                    for ( Iterator j = childElement.nodeIterator(); j.hasNext(); )
1554                    {
1555                        Node n = (Node) j.next();
1556                        if ( n.getNodeType() == Node.ELEMENT_NODE )
1557                        {
1558                            Element listElement = (Element) n;
1559                            String key = listElement.getName();
1560                            String value = listElement.getText().trim();
1561                            thing.addSomeProperty( key, value );
1562                        }
1563                    }
1564                }
1565                else if ( checkFieldWithDuplicate( childElement, "someStringList", null, parsed ) )
1566                {
1567                    java.util.List someStringList = new java.util.ArrayList/*<String>*/();
1568                    thing.setSomeStringList( someStringList );
1569                    for ( Iterator j = childElement.nodeIterator(); j.hasNext(); )
1570                    {
1571                        Node n = (Node) j.next();
1572                        if ( n.getNodeType() == Node.ELEMENT_NODE )
1573                        {
1574                            Element listElement = (Element) n;
1575                            if ( "someStringList".equals( listElement.getName() ) )
1576                            {
1577                                someStringList.add( getTrimmedValue( listElement.getText() ) );
1578                            }
1579                            else
1580                            {
1581                            }
1582                        }
1583                    }
1584                }
1585                else if ( checkFieldWithDuplicate( childElement, "someStringSet", null, parsed ) )
1586                {
1587                    java.util.Set someStringSet = new java.util.HashSet/*<String>*/();
1588                    thing.setSomeStringSet( someStringSet );
1589                    for ( Iterator j = childElement.nodeIterator(); j.hasNext(); )
1590                    {
1591                        Node n = (Node) j.next();
1592                        if ( n.getNodeType() == Node.ELEMENT_NODE )
1593                        {
1594                            Element listElement = (Element) n;
1595                            if ( "someStringSet".equals( listElement.getName() ) )
1596                            {
1597                                someStringSet.add( getTrimmedValue( listElement.getText() ) );
1598                            }
1599                            else
1600                            {
1601                            }
1602                        }
1603                    }
1604                }
1605                else if ( checkFieldWithDuplicate( childElement, "deepThingy", null, parsed ) )
1606                {
1607                    thing.setDeepThingy( parseThingy( "deepThingy", childElement, strict ) );
1608                }
1609                else if ( checkFieldWithDuplicate( childElement, "deepThingyList", null, parsed ) )
1610                {
1611                    java.util.List deepThingyList = new java.util.ArrayList/*<Thingy>*/();
1612                    thing.setDeepThingyList( deepThingyList );
1613                    for ( Iterator j = childElement.nodeIterator(); j.hasNext(); )
1614                    {
1615                        Node n = (Node) j.next();
1616                        if ( n.getNodeType() == Node.ELEMENT_NODE )
1617                        {
1618                            Element listElement = (Element) n;
1619                            if ( "deepThingyList".equals( listElement.getName() ) )
1620                            {
1621                                deepThingyList.add( parseThingy( "deepThingyList", listElement, strict ) );
1622                            }
1623                            else
1624                            {
1625                            }
1626                        }
1627                    }
1628                }
1629                else if ( checkFieldWithDuplicate( childElement, "deepThingySet", null, parsed ) )
1630                {
1631                    java.util.Set deepThingySet = new java.util.HashSet/*<Thingy>*/();
1632                    thing.setDeepThingySet( deepThingySet );
1633                    for ( Iterator j = childElement.nodeIterator(); j.hasNext(); )
1634                    {
1635                        Node n = (Node) j.next();
1636                        if ( n.getNodeType() == Node.ELEMENT_NODE )
1637                        {
1638                            Element listElement = (Element) n;
1639                            if ( "deepThingySet".equals( listElement.getName() ) )
1640                            {
1641                                deepThingySet.add( parseThingy( "deepThingySet", listElement, strict ) );
1642                            }
1643                            else
1644                            {
1645                            }
1646                        }
1647                    }
1648                }
1649                else if ( checkFieldWithDuplicate( childElement, "shallowThingy", null, parsed ) )
1650                {
1651                    thing.setShallowThingy( parseThingy( "shallowThingy", childElement, strict ) );
1652                }
1653                else if ( checkFieldWithDuplicate( childElement, "shallowThingyList", null, parsed ) )
1654                {
1655                    java.util.List shallowThingyList = new java.util.ArrayList/*<Thingy>*/();
1656                    thing.setShallowThingyList( shallowThingyList );
1657                    for ( Iterator j = childElement.nodeIterator(); j.hasNext(); )
1658                    {
1659                        Node n = (Node) j.next();
1660                        if ( n.getNodeType() == Node.ELEMENT_NODE )
1661                        {
1662                            Element listElement = (Element) n;
1663                            if ( "shallowThingyList".equals( listElement.getName() ) )
1664                            {
1665                                shallowThingyList.add( parseThingy( "shallowThingyList", listElement, strict ) );
1666                            }
1667                            else
1668                            {
1669                            }
1670                        }
1671                    }
1672                }
1673                else if ( checkFieldWithDuplicate( childElement, "shallowThingySet", null, parsed ) )
1674                {
1675                    java.util.Set shallowThingySet = new java.util.HashSet/*<Thingy>*/();
1676                    thing.setShallowThingySet( shallowThingySet );
1677                    for ( Iterator j = childElement.nodeIterator(); j.hasNext(); )
1678                    {
1679                        Node n = (Node) j.next();
1680                        if ( n.getNodeType() == Node.ELEMENT_NODE )
1681                        {
1682                            Element listElement = (Element) n;
1683                            if ( "shallowThingySet".equals( listElement.getName() ) )
1684                            {
1685                                shallowThingySet.add( parseThingy( "shallowThingySet", listElement, strict ) );
1686                            }
1687                            else
1688                            {
1689                            }
1690                        }
1691                    }
1692                }
1693                else
1694                {
1695                    checkUnknownElement( childElement, strict );
1696                }
1697            }
1698        }
1699        return thing;
1700    } //-- Thing parseThing( String, Element, boolean )
1701
1702    /**
1703     * Method parseThingy.
1704     * 
1705     * @param tagName a tagName object.
1706     * @param strict a strict object.
1707     * @param element a element object.
1708     * @throws IOException IOException if any.
1709     * @throws DocumentException DocumentException if any.
1710     * @return Thingy
1711     */
1712    private Thingy parseThingy( String tagName, Element element, boolean strict )
1713        throws IOException, DocumentException
1714    {
1715        Thingy thingy = new Thingy();
1716        thingy.setSomeContent( getTrimmedValue( element.getText() ) );
1717        return thingy;
1718    } //-- Thingy parseThingy( String, Element, boolean )
1719
1720    /**
1721     * Method parseXdocFeatures.
1722     * 
1723     * @param tagName a tagName object.
1724     * @param strict a strict object.
1725     * @param element a element object.
1726     * @throws IOException IOException if any.
1727     * @throws DocumentException DocumentException if any.
1728     * @return XdocFeatures
1729     */
1730    private XdocFeatures parseXdocFeatures( String tagName, Element element, boolean strict )
1731        throws IOException, DocumentException
1732    {
1733        XdocFeatures xdocFeatures = new XdocFeatures();
1734        java.util.Set parsed = new java.util.HashSet();
1735        for ( Iterator i = element.nodeIterator(); i.hasNext(); )
1736        {
1737            Node node = (Node) i.next();
1738            if ( node.getNodeType() == Node.ELEMENT_NODE )
1739            {
1740                Element childElement = (Element) node;
1741                if ( checkFieldWithDuplicate( childElement, "field", null, parsed ) )
1742                {
1743                    xdocFeatures.setField( getTrimmedValue( childElement.getText() ) );
1744                }
1745                else if ( checkFieldWithDuplicate( childElement, "xdocSeparatorNone", null, parsed ) )
1746                {
1747                    xdocFeatures.setXdocSeparatorNone( getTrimmedValue( childElement.getText() ) );
1748                }
1749                else if ( checkFieldWithDuplicate( childElement, "xdocSeparatorBlank", null, parsed ) )
1750                {
1751                    xdocFeatures.setXdocSeparatorBlank( getTrimmedValue( childElement.getText() ) );
1752                }
1753                else
1754                {
1755                    checkUnknownElement( childElement, strict );
1756                }
1757            }
1758        }
1759        return xdocFeatures;
1760    } //-- XdocFeatures parseXdocFeatures( String, Element, boolean )
1761
1762    /**
1763     * Method parseXmlAttributes.
1764     * 
1765     * @param tagName a tagName object.
1766     * @param strict a strict object.
1767     * @param element a element object.
1768     * @throws IOException IOException if any.
1769     * @throws DocumentException DocumentException if any.
1770     * @return XmlAttributes
1771     */
1772    private XmlAttributes parseXmlAttributes( String tagName, Element element, boolean strict )
1773        throws IOException, DocumentException
1774    {
1775        XmlAttributes xmlAttributes = new XmlAttributes();
1776        if ( element.attributeValue( "primitiveBoolean" ) != null  )
1777        {
1778            xmlAttributes.setPrimitiveBoolean( getBooleanValue( getTrimmedValue( element.attributeValue( "primitiveBoolean" ) ), "primitiveBoolean" ) );
1779        }
1780        if ( element.attributeValue( "primitiveChar" ) != null  )
1781        {
1782            xmlAttributes.setPrimitiveChar( getCharacterValue( getTrimmedValue( element.attributeValue( "primitiveChar" ) ), "primitiveChar" ) );
1783        }
1784        if ( element.attributeValue( "primitiveByte" ) != null  )
1785        {
1786            xmlAttributes.setPrimitiveByte( getByteValue( getTrimmedValue( element.attributeValue( "primitiveByte" ) ), "primitiveByte", strict ) );
1787        }
1788        if ( element.attributeValue( "primitiveShort" ) != null  )
1789        {
1790            xmlAttributes.setPrimitiveShort( getShortValue( getTrimmedValue( element.attributeValue( "primitiveShort" ) ), "primitiveShort", strict ) );
1791        }
1792        if ( element.attributeValue( "primitiveInt" ) != null  )
1793        {
1794            xmlAttributes.setPrimitiveInt( getIntegerValue( getTrimmedValue( element.attributeValue( "primitiveInt" ) ), "primitiveInt", strict ) );
1795        }
1796        if ( element.attributeValue( "primitiveLong" ) != null  )
1797        {
1798            xmlAttributes.setPrimitiveLong( getLongValue( getTrimmedValue( element.attributeValue( "primitiveLong" ) ), "primitiveLong", strict ) );
1799        }
1800        if ( element.attributeValue( "primitiveFloat" ) != null  )
1801        {
1802            xmlAttributes.setPrimitiveFloat( getFloatValue( getTrimmedValue( element.attributeValue( "primitiveFloat" ) ), "primitiveFloat", strict ) );
1803        }
1804        if ( element.attributeValue( "primitiveDouble" ) != null  )
1805        {
1806            xmlAttributes.setPrimitiveDouble( getDoubleValue( getTrimmedValue( element.attributeValue( "primitiveDouble" ) ), "primitiveDouble", strict ) );
1807        }
1808        if ( element.attributeValue( "objectString" ) != null  )
1809        {
1810            xmlAttributes.setObjectString( getTrimmedValue( element.attributeValue( "objectString" ) ) );
1811        }
1812        if ( element.attributeValue( "objectDate" ) != null  )
1813        {
1814            String dateFormat = null;
1815            xmlAttributes.setObjectDate( getDateValue( getTrimmedValue( element.attributeValue( "objectDate" ) ), "objectDate", dateFormat ) );
1816        }
1817        if ( element.attributeValue( "tag-name" ) != null  )
1818        {
1819            xmlAttributes.setAttribute( getTrimmedValue( element.attributeValue( "tag-name" ) ) );
1820        }
1821        java.util.Set parsed = new java.util.HashSet();
1822        for ( Iterator i = element.nodeIterator(); i.hasNext(); )
1823        {
1824            Node node = (Node) i.next();
1825            if ( node.getNodeType() == Node.ELEMENT_NODE )
1826            {
1827                Element childElement = (Element) node;
1828                checkUnknownElement( childElement, strict );
1829            }
1830        }
1831        return xmlAttributes;
1832    } //-- XmlAttributes parseXmlAttributes( String, Element, boolean )
1833
1834    /**
1835     * Method parseXmlContent.
1836     * 
1837     * @param tagName a tagName object.
1838     * @param strict a strict object.
1839     * @param element a element object.
1840     * @throws IOException IOException if any.
1841     * @throws DocumentException DocumentException if any.
1842     * @return XmlContent
1843     */
1844    private XmlContent parseXmlContent( String tagName, Element element, boolean strict )
1845        throws IOException, DocumentException
1846    {
1847        XmlContent xmlContent = new XmlContent();
1848        java.util.Set parsed = new java.util.HashSet();
1849        for ( Iterator i = element.nodeIterator(); i.hasNext(); )
1850        {
1851            Node node = (Node) i.next();
1852            if ( node.getNodeType() == Node.ELEMENT_NODE )
1853            {
1854                Element childElement = (Element) node;
1855                if ( checkFieldWithDuplicate( childElement, "content.long", null, parsed ) )
1856                {
1857                    xmlContent.setLongContent( parseXmlContentLong( "content.long", childElement, strict ) );
1858                }
1859                else if ( checkFieldWithDuplicate( childElement, "content.long-with-attributes", null, parsed ) )
1860                {
1861                    xmlContent.setLongContentWithAttributes( parseXmlContentLongWithAttributes( "content.long-with-attributes", childElement, strict ) );
1862                }
1863                else
1864                {
1865                    checkUnknownElement( childElement, strict );
1866                }
1867            }
1868        }
1869        return xmlContent;
1870    } //-- XmlContent parseXmlContent( String, Element, boolean )
1871
1872    /**
1873     * Method parseXmlContentLong.
1874     * 
1875     * @param tagName a tagName object.
1876     * @param strict a strict object.
1877     * @param element a element object.
1878     * @throws IOException IOException if any.
1879     * @throws DocumentException DocumentException if any.
1880     * @return XmlContentLong
1881     */
1882    private XmlContentLong parseXmlContentLong( String tagName, Element element, boolean strict )
1883        throws IOException, DocumentException
1884    {
1885        XmlContentLong xmlContentLong = new XmlContentLong();
1886        xmlContentLong.setContent( getLongValue( getTrimmedValue( element.getText() ), "content", strict ) );
1887        return xmlContentLong;
1888    } //-- XmlContentLong parseXmlContentLong( String, Element, boolean )
1889
1890    /**
1891     * Method parseXmlContentLongWithAttributes.
1892     * 
1893     * @param tagName a tagName object.
1894     * @param strict a strict object.
1895     * @param element a element object.
1896     * @throws IOException IOException if any.
1897     * @throws DocumentException DocumentException if any.
1898     * @return XmlContentLongWithAttributes
1899     */
1900    private XmlContentLongWithAttributes parseXmlContentLongWithAttributes( String tagName, Element element, boolean strict )
1901        throws IOException, DocumentException
1902    {
1903        XmlContentLongWithAttributes xmlContentLongWithAttributes = new XmlContentLongWithAttributes();
1904        if ( element.attributeValue( "attr" ) != null  )
1905        {
1906            xmlContentLongWithAttributes.setAttr( getTrimmedValue( element.attributeValue( "attr" ) ) );
1907        }
1908        if ( element.attributeValue( "attr2" ) != null  )
1909        {
1910            xmlContentLongWithAttributes.setAttr2( getIntegerValue( getTrimmedValue( element.attributeValue( "attr2" ) ), "attr2", strict ) );
1911        }
1912        xmlContentLongWithAttributes.setContent( getLongValue( getTrimmedValue( element.getText() ), "content", strict ) );
1913        return xmlContentLongWithAttributes;
1914    } //-- XmlContentLongWithAttributes parseXmlContentLongWithAttributes( String, Element, boolean )
1915
1916    /**
1917     * Method parseXmlFeatures.
1918     * 
1919     * @param tagName a tagName object.
1920     * @param strict a strict object.
1921     * @param element a element object.
1922     * @throws IOException IOException if any.
1923     * @throws DocumentException DocumentException if any.
1924     * @return XmlFeatures
1925     */
1926    private XmlFeatures parseXmlFeatures( String tagName, Element element, boolean strict )
1927        throws IOException, DocumentException
1928    {
1929        XmlFeatures xmlFeatures = new XmlFeatures();
1930        if ( element.attributeValue( "tag-name.attribute" ) != null  )
1931        {
1932            xmlFeatures.setFieldNameAttribute( getTrimmedValue( element.attributeValue( "tag-name.attribute" ) ) );
1933        }
1934        java.util.Set parsed = new java.util.HashSet();
1935        for ( Iterator i = element.nodeIterator(); i.hasNext(); )
1936        {
1937            Node node = (Node) i.next();
1938            if ( node.getNodeType() == Node.ELEMENT_NODE )
1939            {
1940                Element childElement = (Element) node;
1941                if ( checkFieldWithDuplicate( childElement, "attributes", null, parsed ) )
1942                {
1943                    xmlFeatures.setAttributes( parseXmlAttributes( "attributes", childElement, strict ) );
1944                }
1945                else if ( checkFieldWithDuplicate( childElement, "attributesDefault", null, parsed ) )
1946                {
1947                    xmlFeatures.setAttributesDefault( parseXmlAttributes( "attributesDefault", childElement, strict ) );
1948                }
1949                else if ( checkFieldWithDuplicate( childElement, "content", null, parsed ) )
1950                {
1951                    xmlFeatures.setContent( parseXmlContent( "content", childElement, strict ) );
1952                }
1953                else if ( checkFieldWithDuplicate( childElement, "fieldTrim", null, parsed ) )
1954                {
1955                    xmlFeatures.setFieldTrim( getTrimmedValue( childElement.getText() ) );
1956                }
1957                else if ( checkFieldWithDuplicate( childElement, "fieldNoTrim", null, parsed ) )
1958                {
1959                    xmlFeatures.setFieldNoTrim( childElement.getText() );
1960                }
1961                else if ( checkFieldWithDuplicate( childElement, "dom", null, parsed ) )
1962                {
1963                    xmlFeatures.setDom( writeElementToXpp3Dom( childElement ) );
1964                }
1965                else if ( checkFieldWithDuplicate( childElement, "domNoTrim", null, parsed ) )
1966                {
1967                    xmlFeatures.setDomNoTrim( writeElementToXpp3Dom( childElement ) );
1968                }
1969                else if ( checkFieldWithDuplicate( childElement, "tag-name", null, parsed ) )
1970                {
1971                    xmlFeatures.setFieldName( getTrimmedValue( childElement.getText() ) );
1972                }
1973                else if ( checkFieldWithDuplicate( childElement, "dateXmlFormat", null, parsed ) )
1974                {
1975                    String dateFormat = "yyyy-MM-dd'T'HH:mm:ss";
1976                    xmlFeatures.setDateXmlFormat( getDateValue( getTrimmedValue( childElement.getText() ), "dateXmlFormat", dateFormat ) );
1977                }
1978                else if ( checkFieldWithDuplicate( childElement, "dateLong", null, parsed ) )
1979                {
1980                    String dateFormat = "long";
1981                    xmlFeatures.setDateLong( getDateValue( getTrimmedValue( childElement.getText() ), "dateLong", dateFormat ) );
1982                }
1983                else if ( "xmlItemsStyleFlat".equals( childElement.getName() ) )
1984                {
1985                    Element listElement = childElement;
1986                    java.util.List xmlItemsStyleFlats = xmlFeatures.getXmlItemsStyleFlats();
1987                    if ( xmlItemsStyleFlats == null )
1988                    {
1989                        xmlItemsStyleFlats = new java.util.ArrayList/*<Reference>*/();
1990                        xmlFeatures.setXmlItemsStyleFlats( xmlItemsStyleFlats );
1991                    }
1992                    xmlItemsStyleFlats.add( parseReference( "xmlItemsStyleFlat", listElement, strict ) );
1993                }
1994                else if ( checkFieldWithDuplicate( childElement, "xmlAssociationTagNames", null, parsed ) )
1995                {
1996                    java.util.List xmlAssociationTagNames = new java.util.ArrayList/*<Reference>*/();
1997                    xmlFeatures.setXmlAssociationTagNames( xmlAssociationTagNames );
1998                    for ( Iterator j = childElement.nodeIterator(); j.hasNext(); )
1999                    {
2000                        Node n = (Node) j.next();
2001                        if ( n.getNodeType() == Node.ELEMENT_NODE )
2002                        {
2003                            Element listElement = (Element) n;
2004                            if ( "association.tag-name".equals( listElement.getName() ) )
2005                            {
2006                                xmlAssociationTagNames.add( parseReference( "association.tag-name", listElement, strict ) );
2007                            }
2008                            else
2009                            {
2010                            }
2011                        }
2012                    }
2013                }
2014                else if ( checkFieldWithDuplicate( childElement, "field.tag-names", null, parsed ) )
2015                {
2016                    java.util.List xmlTagNameAssociation = new java.util.ArrayList/*<Reference>*/();
2017                    xmlFeatures.setXmlTagNameAssociation( xmlTagNameAssociation );
2018                    for ( Iterator j = childElement.nodeIterator(); j.hasNext(); )
2019                    {
2020                        Node n = (Node) j.next();
2021                        if ( n.getNodeType() == Node.ELEMENT_NODE )
2022                        {
2023                            Element listElement = (Element) n;
2024                            if ( "field.tag-name".equals( listElement.getName() ) )
2025                            {
2026                                xmlTagNameAssociation.add( parseReference( "field.tag-name", listElement, strict ) );
2027                            }
2028                            else
2029                            {
2030                            }
2031                        }
2032                    }
2033                }
2034                else if ( checkFieldWithDuplicate( childElement, "field.tag-name", null, parsed ) )
2035                {
2036                    java.util.List xmlTagNameAssociationTagNames = new java.util.ArrayList/*<Reference>*/();
2037                    xmlFeatures.setXmlTagNameAssociationTagNames( xmlTagNameAssociationTagNames );
2038                    for ( Iterator j = childElement.nodeIterator(); j.hasNext(); )
2039                    {
2040                        Node n = (Node) j.next();
2041                        if ( n.getNodeType() == Node.ELEMENT_NODE )
2042                        {
2043                            Element listElement = (Element) n;
2044                            if ( "association.tag-name".equals( listElement.getName() ) )
2045                            {
2046                                xmlTagNameAssociationTagNames.add( parseReference( "association.tag-name", listElement, strict ) );
2047                            }
2048                            else
2049                            {
2050                            }
2051                        }
2052                    }
2053                }
2054                else if ( "association.tag-name".equals( childElement.getName() ) )
2055                {
2056                    Element listElement = childElement;
2057                    java.util.List xmlFlatAssociationTagNames = xmlFeatures.getXmlFlatAssociationTagNames();
2058                    if ( xmlFlatAssociationTagNames == null )
2059                    {
2060                        xmlFlatAssociationTagNames = new java.util.ArrayList/*<Reference>*/();
2061                        xmlFeatures.setXmlFlatAssociationTagNames( xmlFlatAssociationTagNames );
2062                    }
2063                    xmlFlatAssociationTagNames.add( parseReference( "association.tag-name", listElement, strict ) );
2064                }
2065                else if ( checkFieldWithDuplicate( childElement, "explodeProperties", null, parsed ) )
2066                {
2067                    for ( Iterator j = childElement.nodeIterator(); j.hasNext(); )
2068                    {
2069                        Node n = (Node) j.next();
2070                        if ( n.getNodeType() == Node.ELEMENT_NODE )
2071                        {
2072                            Element listElement = (Element) n;
2073                            if ( "explodeProperty".equals( listElement.getName() ) )
2074                            {
2075                                String key = null;
2076                                String value = null;
2077                                //explode mode.
2078                                for ( Iterator k = listElement.nodeIterator(); k.hasNext(); )
2079                                {
2080                                    Node nd = (Node) k.next();
2081                                    if ( nd.getNodeType() == Node.ELEMENT_NODE )
2082                                    {
2083                                        Element propertyElement = (Element) nd;
2084                                        if ( "key".equals( propertyElement.getName() ) )
2085                                        {
2086                                            key = propertyElement.getText();
2087                                        }
2088                                        else if ( "value".equals( propertyElement.getName() ) )
2089                                        {
2090                                            value = propertyElement.getText().trim();
2091                                        }
2092                                        else
2093                                        {
2094                                        }
2095                                    }
2096                                }
2097                                xmlFeatures.addExplodeProperty( key, value );
2098                            }
2099                        }
2100                    }
2101                }
2102                else if ( checkFieldWithDuplicate( childElement, "inlineProperties", null, parsed ) )
2103                {
2104                    for ( Iterator j = childElement.nodeIterator(); j.hasNext(); )
2105                    {
2106                        Node n = (Node) j.next();
2107                        if ( n.getNodeType() == Node.ELEMENT_NODE )
2108                        {
2109                            Element listElement = (Element) n;
2110                            String key = listElement.getName();
2111                            String value = listElement.getText().trim();
2112                            xmlFeatures.addInlineProperty( key, value );
2113                        }
2114                    }
2115                }
2116                else if ( checkFieldWithDuplicate( childElement, "xmlTransientFields", null, parsed ) )
2117                {
2118                    xmlFeatures.setXmlTransientFields( parseXmlTransientFields( "xmlTransientFields", childElement, strict ) );
2119                }
2120                else if ( checkFieldWithDuplicate( childElement, "xmlFieldsOrder", null, parsed ) )
2121                {
2122                    xmlFeatures.setXmlFieldsOrder( parseXmlFieldsOrder( "xmlFieldsOrder", childElement, strict ) );
2123                }
2124                else if ( checkFieldWithDuplicate( childElement, "xsdFeatures", null, parsed ) )
2125                {
2126                    xmlFeatures.setXsdFeatures( parseXsdFeatures( "xsdFeatures", childElement, strict ) );
2127                }
2128                else
2129                {
2130                    checkUnknownElement( childElement, strict );
2131                }
2132            }
2133        }
2134        return xmlFeatures;
2135    } //-- XmlFeatures parseXmlFeatures( String, Element, boolean )
2136
2137    /**
2138     * Method parseXmlFieldsOrder.
2139     * 
2140     * @param tagName a tagName object.
2141     * @param strict a strict object.
2142     * @param element a element object.
2143     * @throws IOException IOException if any.
2144     * @throws DocumentException DocumentException if any.
2145     * @return XmlFieldsOrder
2146     */
2147    private XmlFieldsOrder parseXmlFieldsOrder( String tagName, Element element, boolean strict )
2148        throws IOException, DocumentException
2149    {
2150        XmlFieldsOrder xmlFieldsOrder = new XmlFieldsOrder();
2151        java.util.Set parsed = new java.util.HashSet();
2152        for ( Iterator i = element.nodeIterator(); i.hasNext(); )
2153        {
2154            Node node = (Node) i.next();
2155            if ( node.getNodeType() == Node.ELEMENT_NODE )
2156            {
2157                Element childElement = (Element) node;
2158                if ( checkFieldWithDuplicate( childElement, "field1", null, parsed ) )
2159                {
2160                    xmlFieldsOrder.setField1( getTrimmedValue( childElement.getText() ) );
2161                }
2162                else if ( checkFieldWithDuplicate( childElement, "field-2", null, parsed ) )
2163                {
2164                    xmlFieldsOrder.setField( getTrimmedValue( childElement.getText() ) );
2165                }
2166                else if ( checkFieldWithDuplicate( childElement, "field3", null, parsed ) )
2167                {
2168                    xmlFieldsOrder.setField3( getTrimmedValue( childElement.getText() ) );
2169                }
2170                else if ( checkFieldWithDuplicate( childElement, "field4", null, parsed ) )
2171                {
2172                    xmlFieldsOrder.setField4( getTrimmedValue( childElement.getText() ) );
2173                }
2174                else if ( checkFieldWithDuplicate( childElement, "field5", null, parsed ) )
2175                {
2176                    xmlFieldsOrder.setField5( getTrimmedValue( childElement.getText() ) );
2177                }
2178                else if ( checkFieldWithDuplicate( childElement, "field6", null, parsed ) )
2179                {
2180                    xmlFieldsOrder.setField6( getTrimmedValue( childElement.getText() ) );
2181                }
2182                else if ( checkFieldWithDuplicate( childElement, "field7", null, parsed ) )
2183                {
2184                    xmlFieldsOrder.setField7( getTrimmedValue( childElement.getText() ) );
2185                }
2186                else
2187                {
2188                    checkUnknownElement( childElement, strict );
2189                }
2190            }
2191        }
2192        return xmlFieldsOrder;
2193    } //-- XmlFieldsOrder parseXmlFieldsOrder( String, Element, boolean )
2194
2195    /**
2196     * Method parseXmlFieldsOrderParent.
2197     * 
2198     * @param tagName a tagName object.
2199     * @param strict a strict object.
2200     * @param element a element object.
2201     * @throws IOException IOException if any.
2202     * @throws DocumentException DocumentException if any.
2203     * @return XmlFieldsOrderParent
2204     */
2205    private XmlFieldsOrderParent parseXmlFieldsOrderParent( String tagName, Element element, boolean strict )
2206        throws IOException, DocumentException
2207    {
2208        XmlFieldsOrderParent xmlFieldsOrderParent = new XmlFieldsOrderParent();
2209        java.util.Set parsed = new java.util.HashSet();
2210        for ( Iterator i = element.nodeIterator(); i.hasNext(); )
2211        {
2212            Node node = (Node) i.next();
2213            if ( node.getNodeType() == Node.ELEMENT_NODE )
2214            {
2215                Element childElement = (Element) node;
2216                if ( checkFieldWithDuplicate( childElement, "field-2", null, parsed ) )
2217                {
2218                    xmlFieldsOrderParent.setField( getTrimmedValue( childElement.getText() ) );
2219                }
2220                else if ( checkFieldWithDuplicate( childElement, "field4", null, parsed ) )
2221                {
2222                    xmlFieldsOrderParent.setField4( getTrimmedValue( childElement.getText() ) );
2223                }
2224                else if ( checkFieldWithDuplicate( childElement, "field5", null, parsed ) )
2225                {
2226                    xmlFieldsOrderParent.setField5( getTrimmedValue( childElement.getText() ) );
2227                }
2228                else if ( checkFieldWithDuplicate( childElement, "field7", null, parsed ) )
2229                {
2230                    xmlFieldsOrderParent.setField7( getTrimmedValue( childElement.getText() ) );
2231                }
2232                else
2233                {
2234                    checkUnknownElement( childElement, strict );
2235                }
2236            }
2237        }
2238        return xmlFieldsOrderParent;
2239    } //-- XmlFieldsOrderParent parseXmlFieldsOrderParent( String, Element, boolean )
2240
2241    /**
2242     * Method parseXmlFieldsOrderParent2.
2243     * 
2244     * @param tagName a tagName object.
2245     * @param strict a strict object.
2246     * @param element a element object.
2247     * @throws IOException IOException if any.
2248     * @throws DocumentException DocumentException if any.
2249     * @return XmlFieldsOrderParent2
2250     */
2251    private XmlFieldsOrderParent2 parseXmlFieldsOrderParent2( String tagName, Element element, boolean strict )
2252        throws IOException, DocumentException
2253    {
2254        XmlFieldsOrderParent2 xmlFieldsOrderParent2 = new XmlFieldsOrderParent2();
2255        java.util.Set parsed = new java.util.HashSet();
2256        for ( Iterator i = element.nodeIterator(); i.hasNext(); )
2257        {
2258            Node node = (Node) i.next();
2259            if ( node.getNodeType() == Node.ELEMENT_NODE )
2260            {
2261                Element childElement = (Element) node;
2262                if ( checkFieldWithDuplicate( childElement, "field-2", null, parsed ) )
2263                {
2264                    xmlFieldsOrderParent2.setField( getTrimmedValue( childElement.getText() ) );
2265                }
2266                else
2267                {
2268                    checkUnknownElement( childElement, strict );
2269                }
2270            }
2271        }
2272        return xmlFieldsOrderParent2;
2273    } //-- XmlFieldsOrderParent2 parseXmlFieldsOrderParent2( String, Element, boolean )
2274
2275    /**
2276     * Method parseXmlTransientFields.
2277     * 
2278     * @param tagName a tagName object.
2279     * @param strict a strict object.
2280     * @param element a element object.
2281     * @throws IOException IOException if any.
2282     * @throws DocumentException DocumentException if any.
2283     * @return XmlTransientFields
2284     */
2285    private XmlTransientFields parseXmlTransientFields( String tagName, Element element, boolean strict )
2286        throws IOException, DocumentException
2287    {
2288        XmlTransientFields xmlTransientFields = new XmlTransientFields();
2289        java.util.Set parsed = new java.util.HashSet();
2290        for ( Iterator i = element.nodeIterator(); i.hasNext(); )
2291        {
2292            Node node = (Node) i.next();
2293            if ( node.getNodeType() == Node.ELEMENT_NODE )
2294            {
2295                Element childElement = (Element) node;
2296                if ( checkFieldWithDuplicate( childElement, "persistentField", null, parsed ) )
2297                {
2298                    xmlTransientFields.setPersistentField( getTrimmedValue( childElement.getText() ) );
2299                }
2300                else
2301                {
2302                    checkUnknownElement( childElement, strict );
2303                }
2304            }
2305        }
2306        return xmlTransientFields;
2307    } //-- XmlTransientFields parseXmlTransientFields( String, Element, boolean )
2308
2309    /**
2310     * Method parseXsdFeatures.
2311     * 
2312     * @param tagName a tagName object.
2313     * @param strict a strict object.
2314     * @param element a element object.
2315     * @throws IOException IOException if any.
2316     * @throws DocumentException DocumentException if any.
2317     * @return XsdFeatures
2318     */
2319    private XsdFeatures parseXsdFeatures( String tagName, Element element, boolean strict )
2320        throws IOException, DocumentException
2321    {
2322        XsdFeatures xsdFeatures = new XsdFeatures();
2323        if ( element.attributeValue( "attribute" ) != null  )
2324        {
2325            xsdFeatures.setAttribute( getTrimmedValue( element.attributeValue( "attribute" ) ) );
2326        }
2327        java.util.Set parsed = new java.util.HashSet();
2328        for ( Iterator i = element.nodeIterator(); i.hasNext(); )
2329        {
2330            Node node = (Node) i.next();
2331            if ( node.getNodeType() == Node.ELEMENT_NODE )
2332            {
2333                Element childElement = (Element) node;
2334                checkUnknownElement( childElement, strict );
2335            }
2336        }
2337        return xsdFeatures;
2338    } //-- XsdFeatures parseXsdFeatures( String, Element, boolean )
2339
2340    /**
2341     * Method read.
2342     * 
2343     * @param reader a reader object.
2344     * @param strict a strict object.
2345     * @throws IOException IOException if any.
2346     * @throws DocumentException DocumentException if any.
2347     * @return Features
2348     */
2349    public Features read( Reader reader, boolean strict )
2350        throws IOException, DocumentException
2351    {
2352        SAXReader parser = new SAXReader();
2353        Document document = parser.read( reader );
2354        return read( document, strict );
2355    } //-- Features read( Reader, boolean )
2356
2357    /**
2358     * Method read.
2359     * 
2360     * @param reader a reader object.
2361     * @throws IOException IOException if any.
2362     * @throws DocumentException DocumentException if any.
2363     * @return Features
2364     */
2365    public Features read( Reader reader )
2366        throws IOException, DocumentException
2367    {
2368        return read( reader, true );
2369    } //-- Features read( Reader )
2370
2371    /**
2372     * Method read.
2373     * 
2374     * @param stream a stream object.
2375     * @param strict a strict object.
2376     * @throws IOException IOException if any.
2377     * @throws DocumentException DocumentException if any.
2378     * @return Features
2379     */
2380    public Features read( InputStream stream, boolean strict )
2381        throws IOException, DocumentException
2382    {
2383        SAXReader parser = new SAXReader();
2384        Document document = parser.read( stream );
2385        return read( document, strict );
2386    } //-- Features read( InputStream, boolean )
2387
2388    /**
2389     * Method read.
2390     * 
2391     * @param stream a stream object.
2392     * @throws IOException IOException if any.
2393     * @throws DocumentException DocumentException if any.
2394     * @return Features
2395     */
2396    public Features read( InputStream stream )
2397        throws IOException, DocumentException
2398    {
2399        return read( stream, true );
2400    } //-- Features read( InputStream )
2401
2402    /**
2403     * Method read.
2404     * 
2405     * @param url a url object.
2406     * @param strict a strict object.
2407     * @throws IOException IOException if any.
2408     * @throws DocumentException DocumentException if any.
2409     * @return Features
2410     */
2411    public Features read( URL url, boolean strict )
2412        throws IOException, DocumentException
2413    {
2414        SAXReader parser = new SAXReader();
2415        Document document = parser.read( url );
2416        return read( document, strict );
2417    } //-- Features read( URL, boolean )
2418
2419    /**
2420     * Method read.
2421     * 
2422     * @param url a url object.
2423     * @throws IOException IOException if any.
2424     * @throws DocumentException DocumentException if any.
2425     * @return Features
2426     */
2427    public Features read( URL url )
2428        throws IOException, DocumentException
2429    {
2430        return read( url, true );
2431    } //-- Features read( URL )
2432
2433    /**
2434     * Method read.
2435     * 
2436     * @param document a document object.
2437     * @param strict a strict object.
2438     * @throws IOException IOException if any.
2439     * @throws DocumentException DocumentException if any.
2440     * @return Features
2441     */
2442    private Features read( Document document, boolean strict )
2443        throws IOException, DocumentException
2444    {
2445        String encoding = document.getXMLEncoding();
2446        Features features = parseFeatures( "features-demo", document.getRootElement(), strict );
2447        features.setModelEncoding( encoding );
2448        return features;
2449    } //-- Features read( Document, boolean )
2450
2451    /**
2452     * Method writeElementToXpp3Dom.
2453     * 
2454     * @param element a element object.
2455     * @return Xpp3Dom
2456     */
2457    private Xpp3Dom writeElementToXpp3Dom( Element element )
2458    {
2459        Xpp3Dom xpp3Dom = new Xpp3Dom( element.getName() );
2460        if ( element.elements().isEmpty() && element.getText() != null )
2461        {
2462            xpp3Dom.setValue( element.getText() );
2463        }
2464        for ( Iterator i = element.attributeIterator(); i.hasNext(); )
2465        {
2466            Attribute attribute = (Attribute) i.next();
2467            xpp3Dom.setAttribute( attribute.getName(), attribute.getValue() );
2468        }
2469        for ( Iterator i = element.elementIterator(); i.hasNext(); )
2470        {
2471            Element child = (Element) i.next();
2472            xpp3Dom.addChild( writeElementToXpp3Dom( child ) );
2473        }
2474        return xpp3Dom;
2475    } //-- Xpp3Dom writeElementToXpp3Dom( Element )
2476
2477}