Skip to content

Commit 92f62cc

Browse files
authored
refactor: move module graph creator out of MavenModule (#7)
1 parent 3de9aaf commit 92f62cc

File tree

14 files changed

+10465
-785
lines changed

14 files changed

+10465
-785
lines changed
Lines changed: 29 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,49 @@
11
package io.github.algomaster99.maven_module_graph;
22

3-
import org.apache.maven.model.Dependency;
43
import org.apache.maven.model.Model;
5-
import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
6-
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
7-
8-
import java.io.FileReader;
9-
import java.io.IOException;
104
import java.nio.file.Path;
11-
import java.util.ArrayDeque;
125
import java.util.ArrayList;
136
import java.util.HashMap;
147
import java.util.List;
158
import java.util.Map;
16-
import java.util.Queue;
179

1810
public class MavenModule {
1911
private final MavenModule parent;
2012

21-
private final Model self;
13+
private final Model actualModel;
14+
15+
private final String groupId;
16+
17+
private final String artifactId;
18+
19+
private final String version;
2220

2321
private final Path fileSystemPath;
2422

2523
private final List<MavenModule> submodules = new ArrayList<>();
2624

27-
private static final Map<Object, Object> properties = new HashMap<>();
25+
private final Map<Object, Object> properties = new HashMap<>();
2826

29-
private MavenModule(Model self, Path fileSystemPath, MavenModule parent) {
30-
this.self = self;
27+
public MavenModule(Model actualModel, String groupId, String artifactId, String version, Map<Object, Object> properties, Path fileSystemPath, MavenModule parent) {
28+
this.actualModel = actualModel;
29+
this.groupId = groupId;
30+
this.artifactId = artifactId;
31+
this.version = version;
32+
this.properties.putAll(properties);
3133
this.fileSystemPath = fileSystemPath;
3234
this.parent = parent;
3335
}
3436

35-
public static Map<Object, Object> getProperties() {
37+
public Map<Object, Object> getProperties() {
3638
return properties;
3739
}
3840

3941
public void addSubmodule(MavenModule child) {
4042
submodules.add(child);
4143
}
4244

43-
public Model getSelf() {
44-
return self;
45+
public Model getActualModel() {
46+
return actualModel;
4547
}
4648

4749
public List<MavenModule> getSubmodules() {
@@ -56,19 +58,6 @@ public MavenModule getParent() {
5658
return parent;
5759
}
5860

59-
public MavenModule findSubmodule(String artifactIdOfModule) {
60-
Queue<MavenModule> queue = new ArrayDeque<>();
61-
queue.add(topLevelParent());
62-
while (!queue.isEmpty()) {
63-
MavenModule module = queue.poll();
64-
if (module.getSelf().getArtifactId().equals(artifactIdOfModule)) {
65-
return module;
66-
}
67-
queue.addAll(module.getSubmodules());
68-
}
69-
return null;
70-
}
71-
7261
public MavenModule topLevelParent() {
7362
if (parent == null) {
7463
return this;
@@ -88,53 +77,23 @@ public boolean equals(Object obj) {
8877
return false;
8978
}
9079
MavenModule that = (MavenModule) obj;
91-
return self.equals(that.self);
80+
return actualModel.equals(that.actualModel);
9281
}
9382

9483
@Override
9584
public int hashCode() {
96-
return self.hashCode();
85+
return actualModel.hashCode();
9786
}
9887

99-
public static MavenModule createMavenModuleGraph(Path projectRoot, MavenModule parent) throws IOException, XmlPullParserException {
100-
Path rootPom = projectRoot.resolve("pom.xml");
101-
MavenXpp3Reader reader = new MavenXpp3Reader();
102-
Model rootModel = reader.read(new FileReader(rootPom.toFile()));
103-
104-
properties.putAll(rootModel.getProperties());
105-
106-
MavenModule root = new MavenModule(rootModel, projectRoot.toAbsolutePath(), parent);
107-
108-
List<String> submodules = rootModel.getModules();
109-
110-
rootModel.getProfiles().forEach(profile -> {
111-
submodules.addAll(profile.getModules());
112-
});
113-
114-
for (String module : submodules) {
115-
Path modulePath = projectRoot.resolve(module);
116-
MavenXpp3Reader moduleReader = new MavenXpp3Reader();
117-
Model moduleModel = moduleReader.read(
118-
new FileReader(modulePath.resolve("pom.xml").toFile()));
119-
MavenModule mavenModule = new MavenModule(moduleModel, modulePath, root);
120-
if (moduleModel.getModules() != null) {
121-
List<String> childModules = moduleModel.getModules();
122-
moduleModel.getProfiles().forEach(profile -> {
123-
childModules.addAll(profile.getModules());
124-
});
125-
List<MavenModule> children = childModules.stream()
126-
.map(childModule -> {
127-
try {
128-
return createMavenModuleGraph(modulePath.resolve(childModule), mavenModule);
129-
} catch (IOException | XmlPullParserException e) {
130-
throw new RuntimeException(e);
131-
}
132-
})
133-
.toList();
134-
children.forEach(mavenModule::addSubmodule);
135-
}
136-
root.addSubmodule(mavenModule);
137-
}
138-
return root;
88+
public String getGroupId() {
89+
return groupId;
90+
}
91+
92+
public String getArtifactId() {
93+
return artifactId;
94+
}
95+
96+
public String getVersion() {
97+
return version;
13998
}
14099
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package io.github.algomaster99.maven_module_graph;
2+
3+
public interface MavenModuleVisitor {
4+
void visit(MavenModule module, int level);
5+
}

src/main/java/io/github/algomaster99/maven_module_graph/ModuleGraph.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import java.io.IOException;
77
import java.nio.file.Path;
8+
import java.util.HashMap;
89
import java.util.concurrent.Callable;
910

1011
import static io.github.algomaster99.maven_module_graph.Utility.printToFile;
@@ -64,7 +65,7 @@ private static class Json {
6465
@Override
6566
public Integer call() throws XmlPullParserException, IOException {
6667
validate();
67-
MavenModule moduleGraphRoot = MavenModule.createMavenModuleGraph(project, null);
68+
MavenModule moduleGraphRoot = Utility.createMavenModuleGraph(project, null, new HashMap<>());
6869
if (plainText != null) {
6970
printToFile(moduleGraphRoot, plainText.plainText, plainText.indent);
7071
}

src/main/java/io/github/algomaster99/maven_module_graph/Utility.java

Lines changed: 58 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,116 +1,99 @@
11
package io.github.algomaster99.maven_module_graph;
22

3-
import com.fasterxml.jackson.core.util.DefaultIndenter;
4-
import com.fasterxml.jackson.core.util.DefaultPrettyPrinter;
5-
import com.fasterxml.jackson.databind.ObjectMapper;
6-
import com.fasterxml.jackson.databind.node.ArrayNode;
7-
import com.fasterxml.jackson.databind.node.ObjectNode;
8-
3+
import io.github.algomaster99.maven_module_graph.visitor.JsonVisitor;
4+
import io.github.algomaster99.maven_module_graph.visitor.MavenModuleProcessor;
5+
import io.github.algomaster99.maven_module_graph.visitor.PlainTextVisitor;
6+
import org.apache.maven.model.Model;
7+
import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
8+
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
9+
10+
import java.io.FileReader;
911
import java.io.IOException;
1012
import java.nio.file.Files;
1113
import java.nio.file.Path;
14+
import java.util.ArrayList;
1215
import java.util.List;
1316
import java.util.Map;
14-
import java.util.Stack;
1517
import java.util.regex.Matcher;
1618
import java.util.regex.Pattern;
1719

1820
public class Utility {
1921
private Utility() {
2022
}
2123

22-
public static void printToFile(MavenModule root, Path plainText, int indent) {
23-
StringBuilder sb = new StringBuilder();
24-
Stack<Pair<Integer, MavenModule>> levelToModule = new Stack<>();
25-
levelToModule.add(Pair.of(0, root));
26-
27-
String indentString = " ".repeat(indent);
28-
29-
while (!levelToModule.isEmpty()) {
30-
Pair<Integer, MavenModule> current = levelToModule.pop();
31-
int level = current.first();
32-
sb.append(indentString.repeat(level));
33-
34-
MavenModule currentModule = current.second();
35-
sb.append(String.format("%s:%s:%s", getGroupId(currentModule), currentModule.getSelf().getArtifactId(), getVersion(currentModule)));
36-
List<MavenModule> children = currentModule.getSubmodules();
37-
for (MavenModule child : children) {
38-
levelToModule.add(Pair.of(level + 1, child));
39-
}
40-
sb.append("\n");
24+
public static MavenModule createMavenModuleGraph(Path projectRoot, MavenModule parent, Map<Object, Object> properties) throws IOException, XmlPullParserException {
25+
Path rootPom = projectRoot.resolve("pom.xml");
26+
Model rootModel = readPomModel(rootPom);
27+
28+
properties.putAll(rootModel.getProperties());
29+
30+
String rootGroupId = parseProperty(getGroupId(rootModel), properties);
31+
String rootArtifactId = rootModel.getArtifactId();
32+
String rootVersion = parseProperty(getVersion(rootModel), properties);
33+
34+
MavenModule root = new MavenModule(rootModel, rootGroupId, rootArtifactId, rootVersion, properties, projectRoot.toAbsolutePath(), parent);
35+
36+
List<String> submodules = getAllModules(rootModel);
37+
38+
for (String module : submodules) {
39+
Path modulePath = projectRoot.resolve(module);
40+
MavenModule mavenModule = createMavenModuleGraph(modulePath, root, properties);
41+
root.addSubmodule(mavenModule);
4142
}
4243

43-
// Write to file
44+
return root;
45+
}
46+
47+
private static Model readPomModel(Path pomPath) throws IOException, XmlPullParserException {
48+
MavenXpp3Reader reader = new MavenXpp3Reader();
49+
return reader.read(new FileReader(pomPath.toFile()));
50+
}
51+
52+
private static List<String> getAllModules(Model model) {
53+
List<String> modules = new ArrayList<>(model.getModules());
54+
model.getProfiles().forEach(profile -> modules.addAll(profile.getModules()));
55+
return modules;
56+
}
57+
58+
public static void printToFile(MavenModule root, Path plainText, int indent) {
59+
PlainTextVisitor plainTextVisitor = new PlainTextVisitor(indent);
60+
MavenModuleProcessor.process(root, plainTextVisitor);
61+
4462
try {
45-
Files.writeString(plainText, sb.toString());
63+
Files.writeString(plainText, plainTextVisitor.getResult());
4664
} catch (IOException e) {
4765
e.printStackTrace();
4866
}
4967
}
5068

5169
public static void printToJson(MavenModule root, Path jsonPath, int indent) {
52-
ObjectMapper mapper = new ObjectMapper();
53-
ObjectNode rootNode = convertToJson(mapper, root, 0);
54-
70+
JsonVisitor jsonVisitor = new JsonVisitor(indent);
71+
MavenModuleProcessor.process(root, jsonVisitor);
5572
try {
56-
if (indent > 0) {
57-
DefaultPrettyPrinter.Indenter indenter = new DefaultIndenter(" ".repeat(indent), DefaultIndenter.SYS_LF);
58-
DefaultPrettyPrinter printer = new DefaultPrettyPrinter();
59-
printer.indentObjectsWith(indenter);
60-
printer.indentArraysWith(indenter);
61-
Files.writeString(jsonPath, mapper.writer(printer).writeValueAsString(rootNode));
62-
} else {
63-
Files.writeString(jsonPath, mapper.writeValueAsString(rootNode));
64-
}
73+
jsonVisitor.writeToFile(jsonPath);
6574
} catch (IOException e) {
6675
e.printStackTrace();
6776
}
6877
}
6978

70-
private static ObjectNode convertToJson(ObjectMapper mapper, MavenModule module, int depth) {
71-
ObjectNode jsonNode = mapper.createObjectNode();
72-
jsonNode.put("depth", depth);
73-
jsonNode.put("groupId", getGroupId(module));
74-
jsonNode.put("artifactId", module.getSelf().getArtifactId());
75-
jsonNode.put("version", getVersion(module));
76-
77-
// Add children with incremented depth
78-
List<MavenModule> submodules = module.getSubmodules();
79-
if (!submodules.isEmpty()) {
80-
ArrayNode childrenArray = jsonNode.putArray("submodules");
81-
for (MavenModule child : submodules) {
82-
childrenArray.add(convertToJson(mapper, child, depth + 1));
83-
}
84-
}
85-
86-
return jsonNode;
87-
}
88-
89-
private static String getGroupId(MavenModule module) {
90-
String groupId = module.getSelf().getGroupId();
79+
private static String getGroupId(Model module) {
80+
String groupId = module.getGroupId();
9181
if (groupId == null) {
92-
if (module.getSelf().getParent() != null) {
93-
return module.getSelf().getParent().getGroupId();
94-
}
95-
if (module.getSelf().getParent() != null) {
96-
return getGroupId(module.getParent());
82+
if (module.getParent() != null) {
83+
return module.getParent().getGroupId();
9784
}
9885
}
9986
return groupId;
10087
}
10188

102-
private static String getVersion(MavenModule module) {
103-
String version = module.getSelf().getVersion();
104-
Map<Object, Object> properties = MavenModule.getProperties();
89+
private static String getVersion(Model module) {
90+
String version = module.getVersion();
10591
if (version == null) {
106-
if (module.getSelf().getParent() != null) {
107-
return parseProperty(module.getSelf().getParent().getVersion(), properties);
108-
}
109-
if (module.getSelf().getParent() != null) {
110-
return parseProperty(getVersion(module.getParent()), properties);
92+
if (module.getParent() != null) {
93+
return module.getParent().getVersion();
11194
}
11295
}
113-
return parseProperty(version, properties);
96+
return version;
11497
}
11598

11699
private static String parseProperty(String value, Map<Object, Object> properties) {

0 commit comments

Comments
 (0)