com.github.tankist88.carpenter.generator.dto.PackageTree Maven / Gradle / Ivy
package com.github.tankist88.carpenter.generator.dto;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
public class PackageTree {
private static final String DELIMETER = "\\.";
private Node root;
private Comparator packageComparator;
public PackageTree() {
this(null);
}
public PackageTree(Comparator packageComparator) {
this.packageComparator = packageComparator;
this.root = new Node<>(null, null, packageComparator);
}
public void addPackage(String element) {
String[] packages = element.split(DELIMETER);
Node prevNode = root;
for (String p : packages) {
Node node = searchNode(p, prevNode);
prevNode = node == null ? addChild(prevNode, p) : node;
}
}
private Node addChild(Node node, String value) {
return node.addChild(value, packageComparator);
}
private Node searchNode(String value, Node node) {
if (value.equals(node.getValue())) return node;
if (node.getChilds().size() == 0) return null;
for (Node c : node.getChilds()) {
if (value.equals(c.getValue())) return c;
}
return null;
}
private Node searchNodeRecursive(String value, Node node) {
if (value.equals(node.getValue())) return node;
if (node.getChilds().size() == 0) return null;
for (Node c : node.getChilds()) {
Node res = searchNodeRecursive(value, c);
if (res != null) return res;
}
return null;
}
private List> getNodesWithoutChilds(Node node) {
List> result = new ArrayList<>();
for (Node n : node.getChilds()) {
if (n.getChilds().size() == 0) {
result.add(n);
} else {
result.addAll(getNodesWithoutChilds(n));
}
}
return result;
}
private String getPackage(Node node) {
StringBuilder sb = new StringBuilder();
if (node.getValue() != null) {
sb.insert(0, node.getValue());
}
if (node.getParent() != null && node.getParent().getValue() != null) {
sb.insert(0, ".");
sb.insert(0, getPackage(node.getParent()));
}
return sb.toString();
}
public List toList() {
List res = new ArrayList<>();
for (Node node : getNodesWithoutChilds(root)) {
res.add(getPackage(node));
}
return res;
}
public List cutOne() {
List res = new ArrayList<>();
for (Node node : getNodesWithoutChilds(root)) {
int familySize = node.getParent().getChilds().size();
String packageStr = familySize > 1 ? getPackage(node.getParent()) + ".*;" : getPackage(node);
if (!res.contains(packageStr)) res.add(packageStr);
}
return res;
}
}