1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.model.transform;
20
21 import java.util.List;
22 import java.util.function.BiFunction;
23 import org.apache.maven.model.transform.pull.NodeBufferingParser;
24 import org.codehaus.plexus.util.xml.pull.XmlPullParser;
25
26
27
28
29
30
31
32
33 public class ReactorDependencyXMLFilter extends NodeBufferingParser {
34 private final BiFunction<String, String, String> reactorVersionMapper;
35
36 public ReactorDependencyXMLFilter(
37 XmlPullParser xmlPullParser, BiFunction<String, String, String> reactorVersionMapper) {
38 super(xmlPullParser, "dependency");
39 this.reactorVersionMapper = reactorVersionMapper;
40 }
41
42 protected void process(List<Event> buffer) {
43
44 String dependencyWhitespace = "";
45 boolean hasVersion = false;
46 String groupId = null;
47 String artifactId = null;
48 String tagName = null;
49 for (int i = 0; i < buffer.size(); i++) {
50 Event event = buffer.get(i);
51 if (event.event == START_TAG) {
52 tagName = event.name;
53 hasVersion |= "version".equals(tagName);
54 } else if (event.event == TEXT) {
55 if (event.text.matches("\\s+")) {
56 if (dependencyWhitespace.isEmpty()) {
57 dependencyWhitespace = event.text;
58 }
59 } else if ("groupId".equals(tagName)) {
60 groupId = nullSafeAppend(groupId, event.text);
61 } else if ("artifactId".equals(tagName)) {
62 artifactId = nullSafeAppend(artifactId, event.text);
63 }
64 } else if (event.event == END_TAG && "dependency".equals(event.name)) {
65 String version = reactorVersionMapper.apply(groupId, artifactId);
66 if (!hasVersion && version != null) {
67 int pos = buffer.get(i - 1).event == TEXT ? i - 1 : i;
68 Event e = new Event();
69 e.event = TEXT;
70 e.text = dependencyWhitespace;
71 buffer.add(pos++, e);
72 e = new Event();
73 e.event = START_TAG;
74 e.namespace = buffer.get(0).namespace;
75 e.prefix = buffer.get(0).prefix;
76 e.name = "version";
77 buffer.add(pos++, e);
78 e = new Event();
79 e.event = TEXT;
80 e.text = version;
81 buffer.add(pos++, e);
82 e = new Event();
83 e.event = END_TAG;
84 e.name = "version";
85 e.namespace = buffer.get(0).namespace;
86 e.prefix = buffer.get(0).prefix;
87 buffer.add(pos++, e);
88 }
89 break;
90 }
91 }
92 buffer.forEach(this::pushEvent);
93 }
94 }