001package co.codewizards.cloudstore.core.repo.local; 002 003import static co.codewizards.cloudstore.core.oio.OioFileFactory.*; 004import static java.util.Objects.*; 005 006import java.util.ArrayList; 007import java.util.Collection; 008import java.util.Collections; 009import java.util.List; 010import java.util.UUID; 011 012import co.codewizards.cloudstore.core.oio.File; 013 014public final class LocalRepoHelper { 015 016 private LocalRepoHelper() { } 017 018 /** 019 * Gets the local root containing the given {@code file}. 020 * <p> 021 * If {@code file} itself is the root of a repository, it is returned directly. 022 * <p> 023 * If {@code file} is a directory or file inside the repository, the parent-directory 024 * being the repository's root is returned. 025 * <p> 026 * If {@code file} is not contained in any repository, <code>null</code> is returned. 027 * 028 * @param file the directory or file for which to search the repository's local root. Must not be <code>null</code>. 029 * @return the repository's local root. Is <code>null</code>, if {@code file} is not located inside a repository. 030 */ 031 public static File getLocalRootContainingFile(final File file) { 032 File parentFile = requireNonNull(file, "file"); 033 while (parentFile != null) { 034 final File parentMetaDir = createFile(parentFile, LocalRepoManager.META_DIR_NAME); 035 if (parentMetaDir.exists()) 036 return parentFile; 037 038 parentFile = parentFile.getParentFile(); 039 } 040 return null; 041 } 042 043 public static Collection<File> getLocalRootsContainedInDirectory(File directory) { 044 requireNonNull(directory, "directory"); 045 directory = directory.getAbsoluteFile(); 046 047 if (! directory.isDirectory()) 048 return Collections.emptyList(); 049 050 final String containerPath = directory.getPath() + java.io.File.separator; 051 052 final List<File> result = new ArrayList<File>(); 053 final LocalRepoRegistry localRepoRegistry = LocalRepoRegistryImpl.getInstance(); 054 for (final UUID repositoryId : localRepoRegistry.getRepositoryIds()) { 055 final File localRoot = localRepoRegistry.getLocalRoot(repositoryId); 056 if (localRoot == null) 057 continue; 058 059 if (directory.equals(localRoot)) 060 result.add(localRoot); 061 else { 062 final String localRootPath = localRoot.getAbsolutePath(); 063 if (localRootPath.startsWith(containerPath)) 064 result.add(localRoot); 065 } 066 } 067 return Collections.unmodifiableList(result); 068 } 069}