com.casualsuperman.portent.InstanceLocator Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of generator Show documentation
Show all versions of generator Show documentation
The meat and potatoes of the Portent code generator
package com.casualsuperman.portent;
import com.casualsuperman.portent.exceptions.EnvironmentException;
import java.io.File;
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
public class InstanceLocator {
private final File root;
private final List templateTypes;
private Map> instances = null;
public InstanceLocator(File root, Set templateTypes) {
this.root = root;
this.templateTypes = new ArrayList<>(templateTypes);
// Longest to shortest
this.templateTypes.sort(Comparator.comparing(String::length).reversed());
}
public synchronized void discover() {
if (instances == null) {
this.instances = new ConcurrentHashMap<>();
try {
Files.walkFileTree(root.toPath(), new SimpleFileVisitor() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
String name = file.getFileName().toString();
for (String type : templateTypes) {
if (name.endsWith('.' + type)) {
instances.computeIfAbsent(type, t -> new ArrayList<>())
.add(new Instance(root, root.toPath().relativize(file)));
break;
}
}
return FileVisitResult.CONTINUE;
}
});
} catch (IOException ex) {
throw new EnvironmentException("failed to scan for instances", ex);
}
}
}
public Map> getTemplateInstances() {
if (instances == null) {
throw new IllegalStateException("must call discover() before getting instances");
}
return Collections.unmodifiableMap(instances);
}
}