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