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}