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