Sep 23, 2005

[Library] JavaSVN にチャレンジ

JavaSVN とは

Java から Subversion にアクセスできるライブラリ。 Subversion のクライアントを Pure Java で実装しているツワモノ。 お馴染み Eclipse 用 Subversion Plugin の Subclipse でも内部で利用されている。

JavaSVN
http://tmate.org/svn/
JavaSVN サンプルコード
http://tmate.org/svn/kb/examples/index.php
類似のツールに JSVN があるが、JSVN はネイティブの svn コマンドを呼び出すだけなので使いづらい。

JavaSVN の実行環境構築

  1. JavaSVN (ganymed.jar, javasvn.jar, javasvn-cli.jar, javasvn-javahl.jar) をクラスパスに追加する

サンプルコード

package jp.in_vitro.codelets.javasvn;

import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNNodeKind;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;
import org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl;
import org.tmatesoft.svn.core.io.SVNRepository;
import org.tmatesoft.svn.core.io.SVNRepositoryFactory;
import org.tmatesoft.svn.core.wc.SVNWCUtil;

public class Codelet {

    public Codelet() {
        super();
    }

    public static void main(final String[] args) throws SVNException {

        String url = "http://example.com/repos/";
        String username = "myname";
        String password = "mypassword";

        Codelet me = new Codelet();
        me.initializeJavaSVN();
        SVNRepository repository = me.prepareSVNRepository(url, username,
                password);
        me.printInfo(repository, "projects/");
        me.printInfo(repository, "projects/pom.xml");

        repository.closeSession();
    }

    protected void initializeJavaSVN() {
        DAVRepositoryFactory.setup();
        SVNRepositoryFactoryImpl.setup();
    }

    protected void printInfo(final SVNRepository repository, final String path)
            throws SVNException {

        SVNNodeKind nodeKind = repository.checkPath(path, -1);
        if (nodeKind == SVNNodeKind.NONE) {
            System.out.println("NONE");
        } else if (nodeKind == SVNNodeKind.UNKNOWN) {
            System.out.println("UNKNOWN");
        } else if (nodeKind == SVNNodeKind.DIR) {
            Map properties = new HashMap();
            List children = new ArrayList();
            repository.getDir(path, -1, properties, children);

            System.out.println("*** properties ***");
            for (Object key : properties.keySet()) {
                System.out.println("" + key + " - " + properties.get(key));
            }
            System.out.println("*** children ***");
            for (Object child : children) {
                System.out.println("" + child);
            }

        } else if (nodeKind == SVNNodeKind.FILE) {
            Map properties = new HashMap();
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            repository.getFile(path, -1, properties, baos);

            System.out.println("*** properties ***");
            for (Object key : properties.keySet()) {
                System.out.println("" + key + " - " + properties.get(key));
            }
        }

    }

    protected SVNRepository prepareSVNRepository(final String url,
            final String username, final String password) throws SVNException {

        SVNRepository repository = SVNRepositoryFactory.create(SVNURL
                .parseURIEncoded(url));

        ISVNAuthenticationManager authenticationManager = SVNWCUtil
                .createDefaultAuthenticationManager(username, password);
        repository.setAuthenticationManager(authenticationManager);

        return repository;
    }
}