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