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