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}