package com.cadrlife.devsearch.agent.service.filesystem;
import com.cadrlife.devsearch.agent.service.RepoService;
import com.cadrlife.devsearch.domain.Project;
import com.google.common.base.Throwables;
import com.google.common.collect.ImmutableList;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.Arrays;
import java.util.List;
public class FileSystemService extends RepoService {
private static final Logger LOG = LoggerFactory.getLogger(FileSystemService.class);
private final List<String> ignoreNames;
private String path;
public FileSystemService(String path, String[] ignoreNames) {
this.path = path;
this.ignoreNames = Arrays.asList(ignoreNames);
}
@Override
public List <Project> findAllProjects() {
return findProjectsByName(getRepoName());
}
@Override
public void updateProject(File rootFile, Project projectName) {
Path source = Paths.get(path);
try {
Files.walkFileTree(source, new CopyDirectory(source, rootFile.toPath()));
} catch (IOException e) {
Throwables.propagate(e);
}
}
@Override
public String getSourceType() {
return "filesystem";
}
class CopyDirectory extends SimpleFileVisitor<Path> {
private Path source;
private Path target;
public CopyDirectory(Path source, Path target) {
this.source = source;
this.target = target;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attributes)
throws IOException {
if (shouldSkip(file)) {
return FileVisitResult.SKIP_SUBTREE;
}
System.out.println("Copying " + source.relativize(file));
Files.copy(file, target.resolve(source.relativize(file)), StandardCopyOption.REPLACE_EXISTING);
return FileVisitResult.CONTINUE;
}
private boolean shouldSkip(Path file) {
String filename = file.getFileName().toString();
String extension = com.google.common.io.Files.getFileExtension(filename).toLowerCase();
return ignoreNames.contains(filename) || ignoreNames.contains("*." + extension);
}
@Override
public FileVisitResult preVisitDirectory(Path directory,
BasicFileAttributes attributes) throws IOException {
Path targetDirectory = target.resolve(source.relativize(directory));
if (shouldSkip(directory)) {
return FileVisitResult.SKIP_SUBTREE;
}
System.out.println("Copying " + source.relativize(directory));
if (Files.exists(targetDirectory) && !Files.isDirectory(targetDirectory)) {
Files.delete(targetDirectory);
}
Files.createDirectories(targetDirectory);
return FileVisitResult.CONTINUE;
}
}
}