ProjectAres/PGM/src/main/java/tc/oc/pgm/map/MapSource.java

129 lines
3.9 KiB
Java

package tc.oc.pgm.map;
import java.io.IOException;
import java.net.URL;
import java.nio.file.FileVisitOption;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.logging.Logger;
import javax.annotation.Nullable;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import tc.oc.commons.core.util.Utils;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
public class MapSource implements Comparable<MapSource> {
private final String key;
private final @Nullable URL url;
private final Path path;
private final int maxDepth;
private final Set<Path> onlyPaths;
private final Set<Path> excludedPaths;
private final int priority; // Lowest priority source wins a map name conflict
private final boolean globalIncludes;
public MapSource(String key, Path path, @Nullable URL url, int maxDepth, Set<Path> onlyPaths, Set<Path> excludedPaths, int priority, boolean globalIncludes) {
this.globalIncludes = globalIncludes;
checkArgument(path.isAbsolute());
this.key = key;
this.url = url;
this.path = checkNotNull(path);
this.maxDepth = maxDepth;
this.onlyPaths = checkNotNull(onlyPaths);
this.excludedPaths = checkNotNull(excludedPaths);
this.priority = priority;
}
@Override
public String toString() {
return getClass().getSimpleName() +
"{key=" + key +
" path=" + getPath().toString() +
"}";
}
@Override
public int hashCode() {
return key.hashCode();
}
@Override
public boolean equals(Object obj) {
return Utils.equals(MapSource.class, this, obj, that -> this.key().equals(that.key));
}
@Override
public int compareTo(MapSource o) {
return Integer.compare(priority, o.priority);
}
public String key() {
return key;
}
public boolean hasPriorityOver(MapSource o) {
return compareTo(o) < 0;
}
public boolean globalIncludes() {
return globalIncludes;
}
public Path getPath() {
return path;
}
public @Nullable URL getUrl() {
return url;
}
protected Set<Path> getRootPaths() {
if(onlyPaths.isEmpty()) {
return Collections.singleton(Paths.get(""));
} else {
return onlyPaths;
}
}
protected boolean isExcluded(Path path) {
path = getPath().relativize(path);
for(Path excludedPath : excludedPaths) {
if(path.startsWith(excludedPath)) return true;
}
return false;
}
public Set<Path> getMapFolders(final Logger logger) throws IOException {
final Set<Path> mapFolders = new HashSet<>();
for(Path root : getRootPaths()) {
int depth = "".equals(root.toString()) ? 0 : Iterables.size(root);
Files.walkFileTree(getPath().resolve(root), ImmutableSet.of(FileVisitOption.FOLLOW_LINKS), maxDepth - depth, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
if(!isExcluded(dir)) {
if(MapFolder.isMapFolder(dir)) {
mapFolders.add(dir);
}
return FileVisitResult.CONTINUE;
} else {
logger.fine("Skipping excluded path " + dir);
return FileVisitResult.SKIP_SUBTREE;
}
}
});
}
return mapFolders;
}
}