org.locationtech.geogig.plumbing.ResolveGeogigDir.java Source code

Java tutorial

Introduction

Here is the source code for org.locationtech.geogig.plumbing.ResolveGeogigDir.java

Source

/* Copyright (c) 2012-2016 Boundless and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Distribution License v1.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/org/documents/edl-v10.html
 *
 * Contributors:
 * Gabriel Roldan (Boundless) - initial implementation
 */
package org.locationtech.geogig.plumbing;

import java.io.File;
import java.io.IOException;
import java.net.URL;

import org.eclipse.jdt.annotation.Nullable;
import org.locationtech.geogig.repository.AbstractGeoGigOp;
import org.locationtech.geogig.repository.Platform;

import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import com.google.common.base.Throwables;

/**
 * Resolves the location of the {@code .geogig} repository directory relative to the
 * {@link Platform#pwd() current directory}.
 * <p>
 * The location can be a either the current directory, a parent of it, or {@code null} if no
 * {@code .geogig} directory is found.
 * 
 * @deprecated use {@link ResolveGeogigURI} instead
 */
@Deprecated
public class ResolveGeogigDir extends AbstractGeoGigOp<Optional<URL>> {

    private Platform platform;

    public ResolveGeogigDir() {
        //
    }

    public ResolveGeogigDir(Platform platform) {
        this.platform = platform;
    }

    public static Optional<URL> lookup(final File directory) {
        try {
            return Optional.fromNullable(lookupGeogigDirectory(directory));
        } catch (IOException e) {
            throw Throwables.propagate(e);
        }
    }

    @Override
    protected Platform platform() {
        return this.platform == null ? super.platform() : this.platform;
    }

    /**
     * @return the location of the {@code .geogig} repository environment directory or {@code null}
     *         if not inside a working directory
     * @see org.locationtech.geogig.repository.AbstractGeoGigOp#call()
     */
    @Override
    protected Optional<URL> _call() {
        File pwd = platform().pwd();
        Optional<URL> repoLocation = ResolveGeogigDir.lookup(pwd);
        return repoLocation;
    }

    public Optional<File> getFile() {
        Optional<URL> url = call();
        if (url.isPresent()) {
            try {
                if ("file".equalsIgnoreCase(url.get().getProtocol())) {
                    return Optional.of(new File(url.get().toURI()));
                }
            } catch (Exception e) {
                throw Throwables.propagate(e);
            }
        }
        return Optional.absent();
    }

    /**
     * @param file the directory to search
     * @return the location of the {@code .geogig} repository environment directory or {@code null}
     *         if not inside a working directory
     */
    private static URL lookupGeogigDirectory(@Nullable File file) throws IOException {
        if (file == null) {
            return null;
        }
        if (file.isDirectory()) {
            if (file.getName().equals(".geogig")) {
                return file.toURI().toURL();
            }
            File[] contents = file.listFiles();
            Preconditions.checkNotNull(contents,
                    "Either '%s' is not a directory or an I/O error ocurred listing its contents",
                    file.getAbsolutePath());
            for (File dir : contents) {
                if (dir.isDirectory() && dir.getName().equals(".geogig")) {
                    return lookupGeogigDirectory(dir);
                }
            }
        }
        return lookupGeogigDirectory(file.getParentFile());
    }

}