1
2
3
4
5 package org.apache.maven.plugin.lifecycle.io.xpp3;
6
7 import java.io.IOException;
8 import java.io.InputStream;
9 import java.io.Reader;
10 import java.text.DateFormat;
11 import java.util.ArrayList;
12 import java.util.Date;
13 import java.util.HashMap;
14 import java.util.HashSet;
15 import java.util.LinkedHashMap;
16 import java.util.List;
17 import java.util.Map;
18 import java.util.Properties;
19 import java.util.Set;
20 import org.apache.maven.api.annotations.Generated;
21 import org.apache.maven.internal.xml.XmlNodeBuilder;
22 import org.apache.maven.plugin.lifecycle.LifecycleConfiguration;
23 import org.apache.maven.plugin.lifecycle.Lifecycle;
24 import org.apache.maven.plugin.lifecycle.Phase;
25 import org.apache.maven.plugin.lifecycle.Execution;
26 import org.codehaus.plexus.util.ReaderFactory;
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 @Generated
33 public class LifecycleMappingsXpp3Reader
34 {
35 private boolean addDefaultEntities = true;
36
37 private final ContentTransformer contentTransformer;
38
39 public LifecycleMappingsXpp3Reader()
40 {
41 this( ( s, f ) -> s );
42 }
43
44 public LifecycleMappingsXpp3Reader( ContentTransformer contentTransformer )
45 {
46 this.contentTransformer = contentTransformer;
47 }
48
49
50
51
52
53
54
55
56
57
58
59
60 private boolean checkFieldWithDuplicate( XmlPullParser parser, String tagName, String alias, Set<String> parsed )
61 throws XmlPullParserException
62 {
63 if ( !( parser.getName().equals( tagName ) || parser.getName().equals( alias ) ) )
64 {
65 return false;
66 }
67 if ( !parsed.add( tagName ) )
68 {
69 throw new XmlPullParserException( "Duplicated tag: '" + tagName + "'", parser, null );
70 }
71 return true;
72 }
73
74
75
76
77
78
79
80
81
82
83
84
85 private void checkUnknownAttribute( XmlPullParser parser, String attribute, String tagName, boolean strict )
86 throws XmlPullParserException, IOException
87 {
88
89 if ( strict )
90 {
91 throw new XmlPullParserException( "Unknown attribute '" + attribute + "' for tag '" + tagName + "'", parser, null );
92 }
93 }
94
95
96
97
98
99
100
101
102
103
104 private void checkUnknownElement( XmlPullParser parser, boolean strict )
105 throws XmlPullParserException, IOException
106 {
107 if ( strict )
108 {
109 throw new XmlPullParserException( "Unrecognised tag: '" + parser.getName() + "'", parser, null );
110 }
111
112 for ( int unrecognizedTagCount = 1; unrecognizedTagCount > 0; )
113 {
114 int eventType = parser.next();
115 if ( eventType == XmlPullParser.START_TAG )
116 {
117 unrecognizedTagCount++;
118 }
119 else if ( eventType == XmlPullParser.END_TAG )
120 {
121 unrecognizedTagCount--;
122 }
123 }
124 }
125
126
127
128
129
130
131 public boolean getAddDefaultEntities()
132 {
133 return addDefaultEntities;
134 }
135
136
137
138
139
140
141
142
143
144
145
146 private boolean getBooleanValue( String s, String attribute, XmlPullParser parser )
147 throws XmlPullParserException
148 {
149 return getBooleanValue( s, attribute, parser, null );
150 }
151
152
153
154
155
156
157
158
159
160
161
162
163 private boolean getBooleanValue( String s, String attribute, XmlPullParser parser, String defaultValue )
164 throws XmlPullParserException
165 {
166 if ( s != null && s.length() != 0 )
167 {
168 return Boolean.valueOf( s ).booleanValue();
169 }
170 if ( defaultValue != null )
171 {
172 return Boolean.valueOf( defaultValue ).booleanValue();
173 }
174 return false;
175 }
176
177
178
179
180
181
182
183
184
185
186
187
188 private byte getByteValue( String s, String attribute, XmlPullParser parser, boolean strict )
189 throws XmlPullParserException
190 {
191 if ( s != null )
192 {
193 try
194 {
195 return Byte.valueOf( s ).byteValue();
196 }
197 catch ( NumberFormatException nfe )
198 {
199 if ( strict )
200 {
201 throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be a byte", parser, nfe );
202 }
203 }
204 }
205 return 0;
206 }
207
208
209
210
211
212
213
214
215
216
217
218 private char getCharacterValue( String s, String attribute, XmlPullParser parser )
219 throws XmlPullParserException
220 {
221 if ( s != null )
222 {
223 return s.charAt( 0 );
224 }
225 return 0;
226 }
227
228
229
230
231
232
233
234
235
236
237
238 private Date getDateValue( String s, String attribute, XmlPullParser parser )
239 throws XmlPullParserException
240 {
241 return getDateValue( s, attribute, null, parser );
242 }
243
244
245
246
247
248
249
250
251
252
253
254
255 private Date getDateValue( String s, String attribute, String dateFormat, XmlPullParser parser )
256 throws XmlPullParserException
257 {
258 if ( s != null )
259 {
260 String effectiveDateFormat = dateFormat;
261 if ( dateFormat == null )
262 {
263 effectiveDateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS";
264 }
265 if ( "long".equals( effectiveDateFormat ) )
266 {
267 try
268 {
269 return new java.util.Date( Long.parseLong( s ) );
270 }
271 catch ( NumberFormatException e )
272 {
273 throw new XmlPullParserException( e.getMessage(), parser, e );
274 }
275 }
276 else
277 {
278 try
279 {
280 DateFormat dateParser = new java.text.SimpleDateFormat( effectiveDateFormat, java.util.Locale.US );
281 return dateParser.parse( s );
282 }
283 catch ( java.text.ParseException e )
284 {
285 throw new XmlPullParserException( e.getMessage(), parser, e );
286 }
287 }
288 }
289 return null;
290 }
291
292
293
294
295
296
297
298
299
300
301
302
303 private double getDoubleValue( String s, String attribute, XmlPullParser parser, boolean strict )
304 throws XmlPullParserException
305 {
306 if ( s != null )
307 {
308 try
309 {
310 return Double.valueOf( s ).doubleValue();
311 }
312 catch ( NumberFormatException nfe )
313 {
314 if ( strict )
315 {
316 throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be a floating point number", parser, nfe );
317 }
318 }
319 }
320 return 0;
321 }
322
323
324
325
326
327
328
329
330
331
332
333
334 private float getFloatValue( String s, String attribute, XmlPullParser parser, boolean strict )
335 throws XmlPullParserException
336 {
337 if ( s != null )
338 {
339 try
340 {
341 return Float.valueOf( s ).floatValue();
342 }
343 catch ( NumberFormatException nfe )
344 {
345 if ( strict )
346 {
347 throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be a floating point number", parser, nfe );
348 }
349 }
350 }
351 return 0;
352 }
353
354
355
356
357
358
359
360
361
362
363
364 private int getIntegerValue( String s, String attribute, XmlPullParser parser, boolean strict )
365 throws XmlPullParserException
366 {
367 return getIntegerValue( s, attribute, parser, strict, 0 );
368 }
369
370
371
372
373
374
375
376
377
378
379
380
381 private int getIntegerValue( String s, String attribute, XmlPullParser parser, boolean strict, int defaultValue )
382 throws XmlPullParserException
383 {
384 if ( s != null )
385 {
386 try
387 {
388 return Integer.valueOf( s ).intValue();
389 }
390 catch ( NumberFormatException nfe )
391 {
392 if ( strict )
393 {
394 throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be an integer", parser, nfe );
395 }
396 }
397 }
398 return defaultValue;
399 }
400
401
402
403
404
405
406
407
408
409
410
411
412 private long getLongValue( String s, String attribute, XmlPullParser parser, boolean strict )
413 throws XmlPullParserException
414 {
415 if ( s != null )
416 {
417 try
418 {
419 return Long.valueOf( s ).longValue();
420 }
421 catch ( NumberFormatException nfe )
422 {
423 if ( strict )
424 {
425 throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be a long integer", parser, nfe );
426 }
427 }
428 }
429 return 0;
430 }
431
432
433
434
435
436
437
438
439
440
441
442
443 private String getRequiredAttributeValue( String s, String attribute, XmlPullParser parser, boolean strict )
444 throws XmlPullParserException
445 {
446 if ( s == null )
447 {
448 if ( strict )
449 {
450 throw new XmlPullParserException( "Missing required value for attribute '" + attribute + "'", parser, null );
451 }
452 }
453 return s;
454 }
455
456
457
458
459
460
461
462
463
464
465
466
467 private short getShortValue( String s, String attribute, XmlPullParser parser, boolean strict )
468 throws XmlPullParserException
469 {
470 if ( s != null )
471 {
472 try
473 {
474 return Short.valueOf( s ).shortValue();
475 }
476 catch ( NumberFormatException nfe )
477 {
478 if ( strict )
479 {
480 throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be a short integer", parser, nfe );
481 }
482 }
483 }
484 return 0;
485 }
486
487
488
489
490
491
492
493 private String getTrimmedValue( String s )
494 {
495 if ( s != null )
496 {
497 s = s.trim();
498 }
499 return s;
500 }
501
502
503
504
505
506
507
508
509 private String interpolatedTrimmed( String value, String context )
510 {
511 return getTrimmedValue( contentTransformer.transform( value, context ) );
512 }
513
514
515
516
517
518
519
520
521
522
523 private int nextTag( XmlPullParser parser )
524 throws IOException, XmlPullParserException
525 {
526 int eventType = parser.next();
527 if ( eventType == XmlPullParser.TEXT )
528 {
529 eventType = parser.next();
530 }
531 if ( eventType != XmlPullParser.START_TAG && eventType != XmlPullParser.END_TAG )
532 {
533 throw new XmlPullParserException( "expected START_TAG or END_TAG not " + XmlPullParser.TYPES[eventType], parser, null );
534 }
535 return eventType;
536 }
537
538
539
540
541
542
543
544
545
546
547
548 public LifecycleConfiguration read( Reader reader, boolean strict )
549 throws IOException, XmlPullParserException
550 {
551 XmlPullParser parser = addDefaultEntities ? new MXParser(EntityReplacementMap.defaultEntityReplacementMap) : new MXParser( );
552
553 parser.setInput( reader );
554
555
556 return read( parser, strict );
557 }
558
559
560
561
562
563
564
565
566
567
568 public LifecycleConfiguration read( Reader reader )
569 throws IOException, XmlPullParserException
570 {
571 return read( reader, true );
572 }
573
574
575
576
577
578
579
580
581
582
583
584 public LifecycleConfiguration read( InputStream in, boolean strict )
585 throws IOException, XmlPullParserException
586 {
587 return read( ReaderFactory.newXmlReader( in ), strict );
588 }
589
590
591
592
593
594
595
596
597
598
599 public LifecycleConfiguration read( InputStream in )
600 throws IOException, XmlPullParserException
601 {
602 return read( ReaderFactory.newXmlReader( in ) );
603 }
604
605
606
607
608
609
610
611
612
613
614
615 public LifecycleConfiguration read( XmlPullParser parser, boolean strict )
616 throws IOException, XmlPullParserException
617 {
618 LifecycleConfiguration lifecycleConfiguration = null;
619 int eventType = parser.getEventType();
620 boolean parsed = false;
621 while ( eventType != XmlPullParser.END_DOCUMENT )
622 {
623 if ( eventType == XmlPullParser.START_TAG )
624 {
625 if ( strict && ! "lifecycles".equals( parser.getName() ) )
626 {
627 throw new XmlPullParserException( "Expected root element 'lifecycles' but found '" + parser.getName() + "'", parser, null );
628 }
629 else if ( parsed )
630 {
631
632 throw new XmlPullParserException( "Duplicated tag: 'lifecycles'", parser, null );
633 }
634 lifecycleConfiguration = parseLifecycleConfiguration( parser, strict );
635 parsed = true;
636 }
637 eventType = parser.next();
638 }
639 if ( parsed )
640 {
641 return lifecycleConfiguration;
642 }
643 throw new XmlPullParserException( "Expected root element 'lifecycles' but found no element at all: invalid XML document", parser, null );
644 }
645
646 private LifecycleConfiguration parseLifecycleConfiguration( XmlPullParser parser, boolean strict )
647 throws IOException, XmlPullParserException
648 {
649 String tagName = parser.getName();
650 LifecycleConfiguration.Builder lifecycleConfiguration = LifecycleConfiguration.newBuilder( true );
651 for ( int i = parser.getAttributeCount() - 1; i >= 0; i-- )
652 {
653 String name = parser.getAttributeName( i );
654 String value = parser.getAttributeValue( i );
655 if ( name.indexOf( ':' ) >= 0 )
656 {
657
658 }
659 else if ( "xmlns".equals( name ) )
660 {
661
662 }
663 else
664 {
665 checkUnknownAttribute( parser, name, tagName, strict );
666 }
667 }
668 Set<String> parsed = new HashSet<>();
669 List<Lifecycle> lifecycles = new ArrayList<>();
670 while ( ( strict ? parser.nextTag() : nextTag( parser ) ) == XmlPullParser.START_TAG )
671 {
672 String childName = checkDuplicate( parser.getName(), parser, parsed );
673 switch ( childName )
674 {
675 case "lifecycle":
676 {
677 lifecycles.add( parseLifecycle( parser, strict ) );
678 break;
679 }
680 default:
681 {
682 checkUnknownElement( parser, strict );
683 break;
684 }
685 }
686 }
687 lifecycleConfiguration.lifecycles( lifecycles );
688 lifecycleConfiguration.modelEncoding( parser.getInputEncoding() );
689 return lifecycleConfiguration.build();
690 }
691
692 private Lifecycle parseLifecycle( XmlPullParser parser, boolean strict )
693 throws IOException, XmlPullParserException
694 {
695 String tagName = parser.getName();
696 Lifecycle.Builder lifecycle = Lifecycle.newBuilder( true );
697 for ( int i = parser.getAttributeCount() - 1; i >= 0; i-- )
698 {
699 String name = parser.getAttributeName( i );
700 String value = parser.getAttributeValue( i );
701 if ( name.indexOf( ':' ) >= 0 )
702 {
703
704 }
705 else
706 {
707 checkUnknownAttribute( parser, name, tagName, strict );
708 }
709 }
710 Set<String> parsed = new HashSet<>();
711 while ( ( strict ? parser.nextTag() : nextTag( parser ) ) == XmlPullParser.START_TAG )
712 {
713 String childName = checkDuplicate( parser.getName(), parser, parsed );
714 switch ( childName )
715 {
716 case "id":
717 {
718 lifecycle.id( interpolatedTrimmed( parser.nextText(), "id" ) );
719 break;
720 }
721 case "phases":
722 {
723 List<Phase> phases = new ArrayList<>();
724 while ( parser.nextTag() == XmlPullParser.START_TAG )
725 {
726 if ( "phase".equals( parser.getName() ) )
727 {
728 phases.add( parsePhase( parser, strict ) );
729 }
730 else
731 {
732 checkUnknownElement( parser, strict );
733 }
734 }
735 lifecycle.phases( phases );
736 break;
737 }
738 default:
739 {
740 checkUnknownElement( parser, strict );
741 break;
742 }
743 }
744 }
745 return lifecycle.build();
746 }
747
748 private Phase parsePhase( XmlPullParser parser, boolean strict )
749 throws IOException, XmlPullParserException
750 {
751 String tagName = parser.getName();
752 Phase.Builder phase = Phase.newBuilder( true );
753 for ( int i = parser.getAttributeCount() - 1; i >= 0; i-- )
754 {
755 String name = parser.getAttributeName( i );
756 String value = parser.getAttributeValue( i );
757 if ( name.indexOf( ':' ) >= 0 )
758 {
759
760 }
761 else
762 {
763 checkUnknownAttribute( parser, name, tagName, strict );
764 }
765 }
766 Set<String> parsed = new HashSet<>();
767 while ( ( strict ? parser.nextTag() : nextTag( parser ) ) == XmlPullParser.START_TAG )
768 {
769 String childName = checkDuplicate( parser.getName(), parser, parsed );
770 switch ( childName )
771 {
772 case "id":
773 {
774 phase.id( interpolatedTrimmed( parser.nextText(), "id" ) );
775 break;
776 }
777 case "executions":
778 {
779 List<Execution> executions = new ArrayList<>();
780 while ( parser.nextTag() == XmlPullParser.START_TAG )
781 {
782 if ( "execution".equals( parser.getName() ) )
783 {
784 executions.add( parseExecution( parser, strict ) );
785 }
786 else
787 {
788 checkUnknownElement( parser, strict );
789 }
790 }
791 phase.executions( executions );
792 break;
793 }
794 case "configuration":
795 {
796 phase.configuration( XmlNodeBuilder.build( parser, true ) );
797 break;
798 }
799 default:
800 {
801 checkUnknownElement( parser, strict );
802 break;
803 }
804 }
805 }
806 return phase.build();
807 }
808
809 private Execution parseExecution( XmlPullParser parser, boolean strict )
810 throws IOException, XmlPullParserException
811 {
812 String tagName = parser.getName();
813 Execution.Builder execution = Execution.newBuilder( true );
814 for ( int i = parser.getAttributeCount() - 1; i >= 0; i-- )
815 {
816 String name = parser.getAttributeName( i );
817 String value = parser.getAttributeValue( i );
818 if ( name.indexOf( ':' ) >= 0 )
819 {
820
821 }
822 else
823 {
824 checkUnknownAttribute( parser, name, tagName, strict );
825 }
826 }
827 Set<String> parsed = new HashSet<>();
828 while ( ( strict ? parser.nextTag() : nextTag( parser ) ) == XmlPullParser.START_TAG )
829 {
830 String childName = checkDuplicate( parser.getName(), parser, parsed );
831 switch ( childName )
832 {
833 case "configuration":
834 {
835 execution.configuration( XmlNodeBuilder.build( parser, true ) );
836 break;
837 }
838 case "goals":
839 {
840 List<String> goals = new ArrayList<>();
841 while ( parser.nextTag() == XmlPullParser.START_TAG )
842 {
843 if ( "goal".equals( parser.getName() ) )
844 {
845 goals.add( interpolatedTrimmed( parser.nextText(), "goals" ) );
846 }
847 else
848 {
849 checkUnknownElement( parser, strict );
850 }
851 }
852 execution.goals( goals );
853 break;
854 }
855 default:
856 {
857 checkUnknownElement( parser, strict );
858 break;
859 }
860 }
861 }
862 return execution.build();
863 }
864
865
866 private String checkDuplicate( String tagName, XmlPullParser parser, Set<String> parsed )
867 throws XmlPullParserException
868 {
869 switch ( tagName )
870 {
871 case "lifecycle":
872 break;
873 default:
874 if ( !parsed.add( tagName ) )
875 {
876 throw new XmlPullParserException( "Duplicated tag: '" + tagName + "'", parser, null );
877 }
878 }
879 return tagName;
880 }
881
882
883
884
885
886
887 public void setAddDefaultEntities( boolean addDefaultEntities )
888 {
889 this.addDefaultEntities = addDefaultEntities;
890 }
891
892 public static interface ContentTransformer
893 {
894
895
896
897
898
899
900
901 String transform( String source, String fieldName );
902 }
903
904 }