1 package de.unixwork.uwproj; |
1 package de.unixwork.uwproj; |
2 |
2 |
3 import org.w3c.dom.Element; |
3 import org.w3c.dom.Element; |
4 import org.w3c.dom.Node; |
|
5 import org.w3c.dom.NodeList; |
|
6 |
4 |
7 import javax.xml.parsers.DocumentBuilderFactory; |
|
8 import java.io.File; |
|
9 import java.util.*; |
5 import java.util.*; |
10 import java.util.stream.Collectors; |
|
11 import java.util.stream.Stream; |
|
12 |
6 |
13 public class Project { |
7 public class Project { |
14 private final HashMap<String, List<Dependency>> namedDependencies = new HashMap<>(); |
8 private final HashMap<String, List<Dependency>> namedDependencies = new HashMap<>(); |
15 private final List<Dependency> dependencies = new LinkedList<>(); |
9 private final List<Dependency> dependencies = new LinkedList<>(); |
16 private final List<Target> targets = new LinkedList<>(); |
10 private final List<Target> targets = new LinkedList<>(); |
17 private final List<Option> options = new LinkedList<>(); |
11 private final List<Option> options = new LinkedList<>(); |
18 private final List<Feature> features = new LinkedList<>(); |
12 private final List<Feature> features = new LinkedList<>(); |
19 |
13 |
20 private final HashMap<String, ConfigVar> configVars = new HashMap<>(); |
|
21 private final List<ConfigVar> configVarsList = new LinkedList<>(); |
14 private final List<ConfigVar> configVarsList = new LinkedList<>(); |
22 |
15 |
23 private final Set<String> lang; |
16 private final Set<String> lang = new HashSet<>(); |
24 |
17 |
25 public Project(Element root) throws Exception { |
18 public Project(Element root) { |
26 NodeList dependency_nodes = root.getElementsByTagName("dependency"); |
19 Util.getChildElements(root).forEach(element -> { |
27 NodeList target_nodes = root.getElementsByTagName("target"); |
20 switch (element.getNodeName()) { |
28 NodeList config_nodes = root.getElementsByTagName("config"); |
21 case "config" -> Util.getChildElements(element).forEach(v -> { |
29 |
22 if (v.getNodeName().equals("var")) { |
30 for (int i = 0; i < config_nodes.getLength(); i++) { |
23 configVarsList.add(new ConfigVar(v)); |
31 NodeList cfgs = config_nodes.item(i).getChildNodes(); |
24 } |
32 for (int c = 0; c < cfgs.getLength(); c++) { |
25 }); |
33 Node node = cfgs.item(c); |
26 case "dependency" -> { |
34 if (node.getNodeType() == Node.ELEMENT_NODE) { |
27 final var dependency = new Dependency(element); |
35 if (node.getNodeName().equals("var")) { |
28 lang.addAll(dependency.getLang()); |
36 Optional.ofNullable(ConfigVar.parse((Element) node)).ifPresent(v -> { |
29 if (dependency.hasName()) { |
37 configVars.put(v.getVarName(), v); |
30 namedDependencies.computeIfAbsent(dependency.getId(), k -> new LinkedList<>()).add(dependency); |
38 configVarsList.add(v); |
31 } else { |
39 }); |
32 dependencies.add(dependency); |
40 } |
33 } |
41 } |
34 } |
|
35 case "target" -> { |
|
36 final var target = new Target(element); |
|
37 targets.add(target); |
|
38 features.addAll(target.getFeatures()); |
|
39 options.addAll(target.getOptions()); |
|
40 } |
42 } |
41 } |
|
42 }); |
|
43 |
|
44 // add default target, if no target was specified |
|
45 if (targets.isEmpty()) { |
|
46 targets.add(Target.defaultTarget()); |
43 } |
47 } |
44 |
48 |
45 for (int i = 0; i < dependency_nodes.getLength(); i++) { |
|
46 addDependency(Dependency.parse((Element) dependency_nodes.item(i))); |
|
47 } |
|
48 for (int i = 0; i < target_nodes.getLength(); i++) { |
|
49 targets.add(Target.parse(this, (Element) target_nodes.item(i))); |
|
50 } |
|
51 |
|
52 if (targets.isEmpty()) { |
|
53 createDefaultTarget(); |
|
54 } |
|
55 |
|
56 // create a list of all languages that are used |
|
57 lang = Stream.concat( |
|
58 namedDependencies.values().stream().flatMap(Collection::stream), |
|
59 dependencies.stream() |
|
60 ).flatMap(d -> d.getLang().stream()).collect(Collectors.toSet()); |
|
61 |
|
62 // check if some targets want all named dependencies |
49 // check if some targets want all named dependencies |
63 targets.stream().filter(Target::isAllDependencies).forEach(t -> { |
50 targets.stream().filter(Target::wantsAllDependencies) |
64 t.clearDependencies(); |
51 .forEach(t -> t.replaceAllDependencies(namedDependencies.keySet())); |
65 namedDependencies.keySet().forEach(t::addDependency); |
|
66 }); |
|
67 } |
|
68 |
|
69 private void createDefaultTarget() { |
|
70 var t = new Target(); |
|
71 t.setAllDependencies(true); |
|
72 t.setName("default"); |
|
73 addTarget(t); |
|
74 } |
52 } |
75 |
53 |
76 public List<NamedDependency> getNamedDependencies() { |
54 public List<NamedDependency> getNamedDependencies() { |
77 var ret = new LinkedList<NamedDependency>(); |
55 var ret = new LinkedList<NamedDependency>(); |
78 |
|
79 for (var entry : namedDependencies.entrySet()) { |
56 for (var entry : namedDependencies.entrySet()) { |
80 var d = new NamedDependency(); |
57 ret.add(new NamedDependency(entry.getKey(), entry.getValue())); |
81 d.setName(entry.getKey()); |
|
82 d.setSubdependencies(entry.getValue()); |
|
83 ret.add(d); |
|
84 } |
58 } |
85 return ret; |
59 return ret; |
86 } |
60 } |
87 |
61 |
88 public List<Dependency> getDependencies() { |
62 public List<Dependency> getDependencies() { |