-
Notifications
You must be signed in to change notification settings - Fork 12
/
ProjectRootBuilder.java
64 lines (56 loc) · 2.4 KB
/
ProjectRootBuilder.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package org.ndx.aadarchi.sequence.generator.javaparser;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
import java.util.stream.Collectors;
import org.apache.commons.vfs2.FileObject;
import org.ndx.aadarchi.base.utils.FileResolver;
import org.ndx.aadarchi.sequence.generator.SequenceGeneratorException;
import com.github.javaparser.ParserConfiguration;
import com.github.javaparser.symbolsolver.JavaSymbolSolver;
import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver;
import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
import com.github.javaparser.symbolsolver.utils.SymbolSolverCollectionStrategy;
import com.github.javaparser.utils.ProjectRoot;
import com.pivovarit.function.ThrowingFunction;
import com.structurizr.model.Container;
public class ProjectRootBuilder {
private static final Logger logger = Logger.getLogger(ProjectRootBuilder.class.getName());
private List<String> files;
private FileResolver fileResolver;
public ProjectRootBuilder(FileResolver fileResolver, Map<String, Container> pathsToContainers) {
this.fileResolver = fileResolver;
this.files = new ArrayList<>(pathsToContainers.keySet());
}
public ProjectRoot build(Container container) {
ProjectRoot projectRoot = null;
if(files.isEmpty()) {
throw new SequenceGeneratorException(String.format("Unable to parse source for %s, as it is linked to no source path", container));
}
List<Path> paths = files.stream()
.map(ThrowingFunction.unchecked(file -> fileResolver.fileAsUrltoPath(file)))
.map(FileObject::getPath)
.collect(Collectors.toList());
Path initialPath = paths.get(0);
CombinedTypeSolver typeSolver = new CombinedTypeSolver(
new JavaParserTypeSolver(initialPath)
// new ReflectionTypeSolver()
);
for(Path p : paths) {
typeSolver.add(new JavaParserTypeSolver(p));
}
typeSolver.add(new ReflectionTypeSolver());
projectRoot = new SymbolSolverCollectionStrategy(
new ParserConfiguration()
.setSymbolResolver(new JavaSymbolSolver(typeSolver))
).collect(initialPath);
// Now we have a big map of paths as string. Let's inject them
for(int index=1; index<paths.size(); index++) {
projectRoot.addSourceRoot(paths.get(index));
}
return projectRoot;
}
}