1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 package org.apache.maven.tools.plugin.extractor.model.io.xpp3;
25
26
27
28
29
30 import java.io.IOException;
31 import java.io.InputStream;
32 import java.io.Reader;
33 import java.text.DateFormat;
34 import org.apache.maven.tools.plugin.extractor.model.Component;
35 import org.apache.maven.tools.plugin.extractor.model.LifecycleExecution;
36 import org.apache.maven.tools.plugin.extractor.model.Mojo;
37 import org.apache.maven.tools.plugin.extractor.model.Parameter;
38 import org.apache.maven.tools.plugin.extractor.model.PluginMetadata;
39 import org.codehaus.plexus.util.xml.XmlStreamReader;
40 import org.codehaus.plexus.util.xml.pull.EntityReplacementMap;
41 import org.codehaus.plexus.util.xml.pull.MXParser;
42 import org.codehaus.plexus.util.xml.pull.XmlPullParser;
43 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
44
45
46
47
48
49
50 @SuppressWarnings( "all" )
51 public class PluginMetadataXpp3Reader
52 {
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68 private boolean addDefaultEntities = true;
69
70
71
72
73 public final ContentTransformer contentTransformer;
74
75
76
77
78
79
80 public PluginMetadataXpp3Reader()
81 {
82 this( new ContentTransformer()
83 {
84 public String transform( String source, String fieldName )
85 {
86 return source;
87 }
88 } );
89 }
90
91 public PluginMetadataXpp3Reader(ContentTransformer contentTransformer)
92 {
93 this.contentTransformer = contentTransformer;
94 }
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112 private boolean checkFieldWithDuplicate( XmlPullParser parser, String tagName, String alias, java.util.Set<String> parsed )
113 throws XmlPullParserException
114 {
115 if ( !( parser.getName().equals( tagName ) || parser.getName().equals( alias ) ) )
116 {
117 return false;
118 }
119 if ( !parsed.add( tagName ) )
120 {
121 throw new XmlPullParserException( "Duplicated tag: '" + tagName + "'", parser, null );
122 }
123 return true;
124 }
125
126
127
128
129
130
131
132
133
134
135
136
137 private void checkUnknownAttribute( XmlPullParser parser, String attribute, String tagName, boolean strict )
138 throws XmlPullParserException, IOException
139 {
140
141 if ( strict )
142 {
143 throw new XmlPullParserException( "Unknown attribute '" + attribute + "' for tag '" + tagName + "'", parser, null );
144 }
145 }
146
147
148
149
150
151
152
153
154
155
156 private void checkUnknownElement( XmlPullParser parser, boolean strict )
157 throws XmlPullParserException, IOException
158 {
159 if ( strict )
160 {
161 throw new XmlPullParserException( "Unrecognised tag: '" + parser.getName() + "'", parser, null );
162 }
163
164 for ( int unrecognizedTagCount = 1; unrecognizedTagCount > 0; )
165 {
166 int eventType = parser.next();
167 if ( eventType == XmlPullParser.START_TAG )
168 {
169 unrecognizedTagCount++;
170 }
171 else if ( eventType == XmlPullParser.END_TAG )
172 {
173 unrecognizedTagCount--;
174 }
175 }
176 }
177
178
179
180
181
182
183 public boolean getAddDefaultEntities()
184 {
185 return addDefaultEntities;
186 }
187
188
189
190
191
192
193
194
195
196
197
198 private boolean getBooleanValue( String s, String attribute, XmlPullParser parser )
199 throws XmlPullParserException
200 {
201 return getBooleanValue( s, attribute, parser, null );
202 }
203
204
205
206
207
208
209
210
211
212
213
214
215 private boolean getBooleanValue( String s, String attribute, XmlPullParser parser, String defaultValue )
216 throws XmlPullParserException
217 {
218 if ( s != null && s.length() != 0 )
219 {
220 return Boolean.valueOf( s ).booleanValue();
221 }
222 if ( defaultValue != null )
223 {
224 return Boolean.valueOf( defaultValue ).booleanValue();
225 }
226 return false;
227 }
228
229
230
231
232
233
234
235
236
237
238
239
240 private byte getByteValue( String s, String attribute, XmlPullParser parser, boolean strict )
241 throws XmlPullParserException
242 {
243 if ( s != null )
244 {
245 try
246 {
247 return Byte.valueOf( s ).byteValue();
248 }
249 catch ( NumberFormatException nfe )
250 {
251 if ( strict )
252 {
253 throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be a byte", parser, nfe );
254 }
255 }
256 }
257 return 0;
258 }
259
260
261
262
263
264
265
266
267
268
269
270 private char getCharacterValue( String s, String attribute, XmlPullParser parser )
271 throws XmlPullParserException
272 {
273 if ( s != null )
274 {
275 return s.charAt( 0 );
276 }
277 return 0;
278 }
279
280
281
282
283
284
285
286
287
288
289
290 private java.util.Date getDateValue( String s, String attribute, XmlPullParser parser )
291 throws XmlPullParserException
292 {
293 return getDateValue( s, attribute, null, parser );
294 }
295
296
297
298
299
300
301
302
303
304
305
306
307 private java.util.Date getDateValue( String s, String attribute, String dateFormat, XmlPullParser parser )
308 throws XmlPullParserException
309 {
310 if ( s != null )
311 {
312 String effectiveDateFormat = dateFormat;
313 if ( dateFormat == null )
314 {
315 effectiveDateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS";
316 }
317 if ( "long".equals( effectiveDateFormat ) )
318 {
319 try
320 {
321 return new java.util.Date( Long.parseLong( s ) );
322 }
323 catch ( NumberFormatException e )
324 {
325 throw new XmlPullParserException( e.getMessage(), parser, e );
326 }
327 }
328 else
329 {
330 try
331 {
332 DateFormat dateParser = new java.text.SimpleDateFormat( effectiveDateFormat, java.util.Locale.US );
333 return dateParser.parse( s );
334 }
335 catch ( java.text.ParseException e )
336 {
337 throw new XmlPullParserException( e.getMessage(), parser, e );
338 }
339 }
340 }
341 return null;
342 }
343
344
345
346
347
348
349
350
351
352
353
354
355 private double getDoubleValue( String s, String attribute, XmlPullParser parser, boolean strict )
356 throws XmlPullParserException
357 {
358 if ( s != null )
359 {
360 try
361 {
362 return Double.valueOf( s ).doubleValue();
363 }
364 catch ( NumberFormatException nfe )
365 {
366 if ( strict )
367 {
368 throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be a floating point number", parser, nfe );
369 }
370 }
371 }
372 return 0;
373 }
374
375
376
377
378
379
380
381
382
383
384
385
386 private float getFloatValue( String s, String attribute, XmlPullParser parser, boolean strict )
387 throws XmlPullParserException
388 {
389 if ( s != null )
390 {
391 try
392 {
393 return Float.valueOf( s ).floatValue();
394 }
395 catch ( NumberFormatException nfe )
396 {
397 if ( strict )
398 {
399 throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be a floating point number", parser, nfe );
400 }
401 }
402 }
403 return 0;
404 }
405
406
407
408
409
410
411
412
413
414
415
416
417 private int getIntegerValue( String s, String attribute, XmlPullParser parser, boolean strict )
418 throws XmlPullParserException
419 {
420 if ( s != null )
421 {
422 try
423 {
424 return Integer.valueOf( s ).intValue();
425 }
426 catch ( NumberFormatException nfe )
427 {
428 if ( strict )
429 {
430 throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be an integer", parser, nfe );
431 }
432 }
433 }
434 return 0;
435 }
436
437
438
439
440
441
442
443
444
445
446
447
448 private long getLongValue( String s, String attribute, XmlPullParser parser, boolean strict )
449 throws XmlPullParserException
450 {
451 if ( s != null )
452 {
453 try
454 {
455 return Long.valueOf( s ).longValue();
456 }
457 catch ( NumberFormatException nfe )
458 {
459 if ( strict )
460 {
461 throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be a long integer", parser, nfe );
462 }
463 }
464 }
465 return 0;
466 }
467
468
469
470
471
472
473
474
475
476
477
478
479 private String getRequiredAttributeValue( String s, String attribute, XmlPullParser parser, boolean strict )
480 throws XmlPullParserException
481 {
482 if ( s == null )
483 {
484 if ( strict )
485 {
486 throw new XmlPullParserException( "Missing required value for attribute '" + attribute + "'", parser, null );
487 }
488 }
489 return s;
490 }
491
492
493
494
495
496
497
498
499
500
501
502
503 private short getShortValue( String s, String attribute, XmlPullParser parser, boolean strict )
504 throws XmlPullParserException
505 {
506 if ( s != null )
507 {
508 try
509 {
510 return Short.valueOf( s ).shortValue();
511 }
512 catch ( NumberFormatException nfe )
513 {
514 if ( strict )
515 {
516 throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be a short integer", parser, nfe );
517 }
518 }
519 }
520 return 0;
521 }
522
523
524
525
526
527
528
529 private String getTrimmedValue( String s )
530 {
531 if ( s != null )
532 {
533 s = s.trim();
534 }
535 return s;
536 }
537
538
539
540
541
542
543
544
545 private String interpolatedTrimmed( String value, String context )
546 {
547 return getTrimmedValue( contentTransformer.transform( value, context ) );
548 }
549
550
551
552
553
554
555
556
557
558
559 private int nextTag( XmlPullParser parser )
560 throws IOException, XmlPullParserException
561 {
562 int eventType = parser.next();
563 if ( eventType == XmlPullParser.TEXT )
564 {
565 eventType = parser.next();
566 }
567 if ( eventType != XmlPullParser.START_TAG && eventType != XmlPullParser.END_TAG )
568 {
569 throw new XmlPullParserException( "expected START_TAG or END_TAG not " + XmlPullParser.TYPES[eventType], parser, null );
570 }
571 return eventType;
572 }
573
574
575
576
577
578
579
580
581
582
583
584 public PluginMetadata read( XmlPullParser parser, boolean strict )
585 throws IOException, XmlPullParserException
586 {
587 PluginMetadata pluginMetadata = null;
588 int eventType = parser.getEventType();
589 boolean parsed = false;
590 while ( eventType != XmlPullParser.END_DOCUMENT )
591 {
592 if ( eventType == XmlPullParser.START_TAG )
593 {
594 if ( strict && ! "pluginMetadata".equals( parser.getName() ) )
595 {
596 throw new XmlPullParserException( "Expected root element 'pluginMetadata' but found '" + parser.getName() + "'", parser, null );
597 }
598 else if ( parsed )
599 {
600
601 throw new XmlPullParserException( "Duplicated tag: 'pluginMetadata'", parser, null );
602 }
603 pluginMetadata = parsePluginMetadata( parser, strict );
604 pluginMetadata.setModelEncoding( parser.getInputEncoding() );
605 parsed = true;
606 }
607 eventType = parser.next();
608 }
609 if ( parsed )
610 {
611 return pluginMetadata;
612 }
613 throw new XmlPullParserException( "Expected root element 'pluginMetadata' but found no element at all: invalid XML document", parser, null );
614 }
615
616
617
618
619
620
621
622
623
624
625
626 public PluginMetadata read( Reader reader, boolean strict )
627 throws IOException, XmlPullParserException
628 {
629 XmlPullParser parser = addDefaultEntities ? new MXParser(EntityReplacementMap.defaultEntityReplacementMap) : new MXParser( );
630
631 parser.setInput( reader );
632
633
634 return read( parser, strict );
635 }
636
637
638
639
640
641
642
643
644
645
646 public PluginMetadata read( Reader reader )
647 throws IOException, XmlPullParserException
648 {
649 return read( reader, true );
650 }
651
652
653
654
655
656
657
658
659
660
661
662 public PluginMetadata read( InputStream in, boolean strict )
663 throws IOException, XmlPullParserException
664 {
665 return read( new XmlStreamReader( in ), strict );
666 }
667
668
669
670
671
672
673
674
675
676
677 public PluginMetadata read( InputStream in )
678 throws IOException, XmlPullParserException
679 {
680 return read( new XmlStreamReader( in ) );
681 }
682
683
684
685
686
687
688
689
690
691
692
693 private Component parseComponent( XmlPullParser parser, boolean strict )
694 throws IOException, XmlPullParserException
695 {
696 String tagName = parser.getName();
697 Component component = new Component();
698 for ( int i = parser.getAttributeCount() - 1; i >= 0; i-- )
699 {
700 String name = parser.getAttributeName( i );
701 String value = parser.getAttributeValue( i );
702
703 if ( name.indexOf( ':' ) >= 0 )
704 {
705
706 }
707 else
708 {
709 checkUnknownAttribute( parser, name, tagName, strict );
710 }
711 }
712 java.util.Set<String> parsed = new java.util.HashSet<String>();
713 while ( ( strict ? parser.nextTag() : nextTag( parser ) ) == XmlPullParser.START_TAG )
714 {
715 if ( checkFieldWithDuplicate( parser, "role", null, parsed ) )
716 {
717 component.setRole( interpolatedTrimmed( parser.nextText(), "role" ) );
718 }
719 else if ( checkFieldWithDuplicate( parser, "hint", null, parsed ) )
720 {
721 component.setHint( interpolatedTrimmed( parser.nextText(), "hint" ) );
722 }
723 else
724 {
725 checkUnknownElement( parser, strict );
726 }
727 }
728 return component;
729 }
730
731
732
733
734
735
736
737
738
739
740
741 private LifecycleExecution parseLifecycleExecution( XmlPullParser parser, boolean strict )
742 throws IOException, XmlPullParserException
743 {
744 String tagName = parser.getName();
745 LifecycleExecution lifecycleExecution = new LifecycleExecution();
746 for ( int i = parser.getAttributeCount() - 1; i >= 0; i-- )
747 {
748 String name = parser.getAttributeName( i );
749 String value = parser.getAttributeValue( i );
750
751 if ( name.indexOf( ':' ) >= 0 )
752 {
753
754 }
755 else
756 {
757 checkUnknownAttribute( parser, name, tagName, strict );
758 }
759 }
760 java.util.Set<String> parsed = new java.util.HashSet<String>();
761 while ( ( strict ? parser.nextTag() : nextTag( parser ) ) == XmlPullParser.START_TAG )
762 {
763 if ( checkFieldWithDuplicate( parser, "lifecycle", null, parsed ) )
764 {
765 lifecycleExecution.setLifecycle( interpolatedTrimmed( parser.nextText(), "lifecycle" ) );
766 }
767 else if ( checkFieldWithDuplicate( parser, "phase", null, parsed ) )
768 {
769 lifecycleExecution.setPhase( interpolatedTrimmed( parser.nextText(), "phase" ) );
770 }
771 else if ( checkFieldWithDuplicate( parser, "goal", null, parsed ) )
772 {
773 lifecycleExecution.setGoal( interpolatedTrimmed( parser.nextText(), "goal" ) );
774 }
775 else
776 {
777 checkUnknownElement( parser, strict );
778 }
779 }
780 return lifecycleExecution;
781 }
782
783
784
785
786
787
788
789
790
791
792
793 private Mojo parseMojo( XmlPullParser parser, boolean strict )
794 throws IOException, XmlPullParserException
795 {
796 String tagName = parser.getName();
797 Mojo mojo = new Mojo();
798 for ( int i = parser.getAttributeCount() - 1; i >= 0; i-- )
799 {
800 String name = parser.getAttributeName( i );
801 String value = parser.getAttributeValue( i );
802
803 if ( name.indexOf( ':' ) >= 0 )
804 {
805
806 }
807 else
808 {
809 checkUnknownAttribute( parser, name, tagName, strict );
810 }
811 }
812 java.util.Set<String> parsed = new java.util.HashSet<String>();
813 while ( ( strict ? parser.nextTag() : nextTag( parser ) ) == XmlPullParser.START_TAG )
814 {
815 if ( checkFieldWithDuplicate( parser, "goal", null, parsed ) )
816 {
817 mojo.setGoal( interpolatedTrimmed( parser.nextText(), "goal" ) );
818 }
819 else if ( checkFieldWithDuplicate( parser, "phase", null, parsed ) )
820 {
821 mojo.setPhase( interpolatedTrimmed( parser.nextText(), "phase" ) );
822 }
823 else if ( checkFieldWithDuplicate( parser, "aggregator", null, parsed ) )
824 {
825 mojo.setAggregator( getBooleanValue( interpolatedTrimmed( parser.nextText(), "aggregator" ), "aggregator", parser, "false" ) );
826 }
827 else if ( checkFieldWithDuplicate( parser, "requiresDependencyResolution", null, parsed ) )
828 {
829 mojo.setRequiresDependencyResolution( interpolatedTrimmed( parser.nextText(), "requiresDependencyResolution" ) );
830 }
831 else if ( checkFieldWithDuplicate( parser, "requiresProject", null, parsed ) )
832 {
833 mojo.setRequiresProject( getBooleanValue( interpolatedTrimmed( parser.nextText(), "requiresProject" ), "requiresProject", parser, "false" ) );
834 }
835 else if ( checkFieldWithDuplicate( parser, "requiresReports", null, parsed ) )
836 {
837 mojo.setRequiresReports( getBooleanValue( interpolatedTrimmed( parser.nextText(), "requiresReports" ), "requiresReports", parser, "false" ) );
838 }
839 else if ( checkFieldWithDuplicate( parser, "requiresOnline", null, parsed ) )
840 {
841 mojo.setRequiresOnline( getBooleanValue( interpolatedTrimmed( parser.nextText(), "requiresOnline" ), "requiresOnline", parser, "false" ) );
842 }
843 else if ( checkFieldWithDuplicate( parser, "inheritByDefault", null, parsed ) )
844 {
845 mojo.setInheritByDefault( getBooleanValue( interpolatedTrimmed( parser.nextText(), "inheritByDefault" ), "inheritByDefault", parser, "false" ) );
846 }
847 else if ( checkFieldWithDuplicate( parser, "requiresDirectInvocation", null, parsed ) )
848 {
849 mojo.setRequiresDirectInvocation( getBooleanValue( interpolatedTrimmed( parser.nextText(), "requiresDirectInvocation" ), "requiresDirectInvocation", parser, "false" ) );
850 }
851 else if ( checkFieldWithDuplicate( parser, "execution", null, parsed ) )
852 {
853 mojo.setExecution( parseLifecycleExecution( parser, strict ) );
854 }
855 else if ( checkFieldWithDuplicate( parser, "components", null, parsed ) )
856 {
857 java.util.List<Component> components = new java.util.ArrayList<Component>();
858 while ( parser.nextTag() == XmlPullParser.START_TAG )
859 {
860 if ( "component".equals( parser.getName() ) )
861 {
862 components.add( parseComponent( parser, strict ) );
863 }
864 else
865 {
866 checkUnknownElement( parser, strict );
867 }
868 }
869 mojo.setComponents( components );
870 }
871 else if ( checkFieldWithDuplicate( parser, "parameters", null, parsed ) )
872 {
873 java.util.List<Parameter> parameters = new java.util.ArrayList<Parameter>();
874 while ( parser.nextTag() == XmlPullParser.START_TAG )
875 {
876 if ( "parameter".equals( parser.getName() ) )
877 {
878 parameters.add( parseParameter( parser, strict ) );
879 }
880 else
881 {
882 checkUnknownElement( parser, strict );
883 }
884 }
885 mojo.setParameters( parameters );
886 }
887 else if ( checkFieldWithDuplicate( parser, "description", null, parsed ) )
888 {
889 mojo.setDescription( interpolatedTrimmed( parser.nextText(), "description" ) );
890 }
891 else if ( checkFieldWithDuplicate( parser, "deprecated", null, parsed ) )
892 {
893 mojo.setDeprecation( interpolatedTrimmed( parser.nextText(), "deprecated" ) );
894 }
895 else if ( checkFieldWithDuplicate( parser, "since", null, parsed ) )
896 {
897 mojo.setSince( interpolatedTrimmed( parser.nextText(), "since" ) );
898 }
899 else if ( checkFieldWithDuplicate( parser, "call", null, parsed ) )
900 {
901 mojo.setCall( interpolatedTrimmed( parser.nextText(), "call" ) );
902 }
903 else
904 {
905 checkUnknownElement( parser, strict );
906 }
907 }
908 return mojo;
909 }
910
911
912
913
914
915
916
917
918
919
920
921 private Parameter parseParameter( XmlPullParser parser, boolean strict )
922 throws IOException, XmlPullParserException
923 {
924 String tagName = parser.getName();
925 Parameter parameter = new Parameter();
926 for ( int i = parser.getAttributeCount() - 1; i >= 0; i-- )
927 {
928 String name = parser.getAttributeName( i );
929 String value = parser.getAttributeValue( i );
930
931 if ( name.indexOf( ':' ) >= 0 )
932 {
933
934 }
935 else
936 {
937 checkUnknownAttribute( parser, name, tagName, strict );
938 }
939 }
940 java.util.Set<String> parsed = new java.util.HashSet<String>();
941 while ( ( strict ? parser.nextTag() : nextTag( parser ) ) == XmlPullParser.START_TAG )
942 {
943 if ( checkFieldWithDuplicate( parser, "name", null, parsed ) )
944 {
945 parameter.setName( interpolatedTrimmed( parser.nextText(), "name" ) );
946 }
947 else if ( checkFieldWithDuplicate( parser, "alias", null, parsed ) )
948 {
949 parameter.setAlias( interpolatedTrimmed( parser.nextText(), "alias" ) );
950 }
951 else if ( checkFieldWithDuplicate( parser, "property", null, parsed ) )
952 {
953 parameter.setProperty( interpolatedTrimmed( parser.nextText(), "property" ) );
954 }
955 else if ( checkFieldWithDuplicate( parser, "required", null, parsed ) )
956 {
957 parameter.setRequired( getBooleanValue( interpolatedTrimmed( parser.nextText(), "required" ), "required", parser, "false" ) );
958 }
959 else if ( checkFieldWithDuplicate( parser, "readonly", null, parsed ) )
960 {
961 parameter.setReadonly( getBooleanValue( interpolatedTrimmed( parser.nextText(), "readonly" ), "readonly", parser, "false" ) );
962 }
963 else if ( checkFieldWithDuplicate( parser, "expression", null, parsed ) )
964 {
965 parameter.setExpression( interpolatedTrimmed( parser.nextText(), "expression" ) );
966 }
967 else if ( checkFieldWithDuplicate( parser, "defaultValue", null, parsed ) )
968 {
969 parameter.setDefaultValue( interpolatedTrimmed( parser.nextText(), "defaultValue" ) );
970 }
971 else if ( checkFieldWithDuplicate( parser, "type", null, parsed ) )
972 {
973 parameter.setType( interpolatedTrimmed( parser.nextText(), "type" ) );
974 }
975 else if ( checkFieldWithDuplicate( parser, "description", null, parsed ) )
976 {
977 parameter.setDescription( interpolatedTrimmed( parser.nextText(), "description" ) );
978 }
979 else if ( checkFieldWithDuplicate( parser, "deprecated", null, parsed ) )
980 {
981 parameter.setDeprecation( interpolatedTrimmed( parser.nextText(), "deprecated" ) );
982 }
983 else if ( checkFieldWithDuplicate( parser, "since", null, parsed ) )
984 {
985 parameter.setSince( interpolatedTrimmed( parser.nextText(), "since" ) );
986 }
987 else
988 {
989 checkUnknownElement( parser, strict );
990 }
991 }
992 return parameter;
993 }
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005 private PluginMetadata parsePluginMetadata( XmlPullParser parser, boolean strict )
1006 throws IOException, XmlPullParserException
1007 {
1008 String tagName = parser.getName();
1009 PluginMetadata pluginMetadata = new PluginMetadata();
1010 for ( int i = parser.getAttributeCount() - 1; i >= 0; i-- )
1011 {
1012 String name = parser.getAttributeName( i );
1013 String value = parser.getAttributeValue( i );
1014
1015 if ( name.indexOf( ':' ) >= 0 )
1016 {
1017
1018 }
1019 else if ( "xmlns".equals( name ) )
1020 {
1021
1022 }
1023 else
1024 {
1025 checkUnknownAttribute( parser, name, tagName, strict );
1026 }
1027 }
1028 java.util.Set<String> parsed = new java.util.HashSet<String>();
1029 while ( ( strict ? parser.nextTag() : nextTag( parser ) ) == XmlPullParser.START_TAG )
1030 {
1031 if ( checkFieldWithDuplicate( parser, "mojos", null, parsed ) )
1032 {
1033 java.util.List<Mojo> mojos = new java.util.ArrayList<Mojo>();
1034 while ( parser.nextTag() == XmlPullParser.START_TAG )
1035 {
1036 if ( "mojo".equals( parser.getName() ) )
1037 {
1038 mojos.add( parseMojo( parser, strict ) );
1039 }
1040 else
1041 {
1042 checkUnknownElement( parser, strict );
1043 }
1044 }
1045 pluginMetadata.setMojos( mojos );
1046 }
1047 else
1048 {
1049 checkUnknownElement( parser, strict );
1050 }
1051 }
1052 return pluginMetadata;
1053 }
1054
1055
1056
1057
1058
1059
1060 public void setAddDefaultEntities( boolean addDefaultEntities )
1061 {
1062 this.addDefaultEntities = addDefaultEntities;
1063 }
1064
1065 public static interface ContentTransformer
1066 {
1067
1068
1069
1070
1071
1072
1073
1074 String transform( String source, String fieldName );
1075 }
1076
1077 }