Newer
Older
gitbucket_jkp / src / main / java / editorconfig / JGitResource.java
@KOUNOIKE Yuusuke KOUNOIKE Yuusuke on 22 Apr 2018 3 KB Support EditorConfig for online browser/editor.
package editorconfig;

import org.ec4j.core.Resource;
import org.ec4j.core.ResourcePath;
import org.ec4j.core.model.Ec4jPath;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.ObjectReader;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevTree;
import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.treewalk.TreeWalk;

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.nio.charset.StandardCharsets;

public class JGitResource implements Resource {
    private final Repository repo;
    private final String revStr;

    Ec4jPath path;

    private static String removeInitialSlash(Ec4jPath path) {
        return Ec4jPath.Ec4jPaths.root().relativize(path).toString();
    }

    public JGitResource(Git git, String revStr, String path){
        if (!path.startsWith("/")){
            path = "/" + path;
        }
        this.repo= git.getRepository();
        this.path = Ec4jPath.Ec4jPaths.of(path);
        this.revStr = revStr;
    }

    public JGitResource(Repository repo, String revStr, String path){
        if (!path.startsWith("/")){
            path = "/" + path;
        }
        this.repo = repo;
        this.path = Ec4jPath.Ec4jPaths.of(path);
        this.revStr = revStr;
    }


    public JGitResource(Repository repo, String revStr, Ec4jPath path){
        this.repo = repo;
        this.path = path;
        this.revStr = revStr;
    }

    private RevTree getRevTree() throws IOException {
        ObjectReader reader = repo.newObjectReader();
        try {
            RevWalk revWalk = new RevWalk(reader);
            ObjectId id = repo.resolve(revStr);
            RevCommit commit = revWalk.parseCommit(id);
            return commit.getTree();
        } finally {
            reader.close();
        }
    }

    @Override
    public boolean exists() {
        ObjectReader reader = repo.newObjectReader();
        try {
            TreeWalk treeWalk = TreeWalk.forPath(reader, removeInitialSlash(path), getRevTree());
            if (treeWalk != null){
                return true;
            }
            else {
                return false;
            }
        } catch (IOException e) {
            return false;
        } finally {
            reader.close();
        }
    }

    @Override
    public ResourcePath getParent() {
        Ec4jPath parent = path.getParentPath();
        return parent == null ? null : new JGitResourcePath(repo, revStr, path.getParentPath());
    }

    @Override
    public Ec4jPath getPath() {
        return path;
    }

    @Override
    public RandomReader openRandomReader() throws IOException {
        return Resources.StringRandomReader.ofReader(openReader());
    }

    @Override
    public Reader openReader() throws IOException {
        ObjectReader reader = repo.newObjectReader();
        try {
            TreeWalk treeWalk = TreeWalk.forPath(reader, removeInitialSlash(path), getRevTree());
            return new InputStreamReader(reader.open(treeWalk.getObjectId(0)).openStream(), StandardCharsets.UTF_8);
        } finally {
            reader.close();
        }
    }

    @Override
    public boolean equals(Object obj){
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        JGitResource other = (JGitResource) obj;
        if (!repo.equals(other.repo) || !revStr.equals(other.revStr) || !path.equals(other.path)){
            return false;
        }
        return true;
    }

    @Override
    public String toString(){
        return "JGitResouce(Repo:" + repo.getDirectory() + ", revStr:" + revStr + ", path:" + path.toString() + ")";
    }
}