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; } } }