« ApacheとSubversionの両方をビルドする | Main | JackrabbitでSSL通信 »

2010.10.04

JavaでWebDAVクライアントを実装してみる

JavaでWebDAVクライアントの実装を試みてみることに。ただし、目的は「並列アップロード」(笑)。並列ダウンロードは、ブラウザなどを使うことで対応できるかと思いますので(^^; (並列アップロードも工夫すれば既存のもので簡単に実現できると思いますが)。

で、何かライブラリがあるかなぁ・・・と思って調べていたところ、Java用のWebDAVクライアントライブラリとしては、以下のようなものがあるようです。
Apache Jackrabbit
webdavclient4j
Jakarta Slide

Jakarta Slideは既に2007年に引退しているとのことで、WebDAVクライアントを使いたいのであれば、Jackrabbitを検討してみて欲しい、とのこと。ということで、Jackrabbitを試してみることにしました。

・・・ただ、かなり、資料が少ないようですね(苦笑)。まぁ、WebDAVクライアントなんて、作ろうと思う人はあまりいないでしょうしねぇ・・・。参考資料としては、Jackrabbit Wiki WebDAVあたりでしょうか。

Jackrabbitのダウンロードページから、「standalone版」をダウンロード(今回は、jackrabbit-standalone-2.1.1.jar)し、Eclipseに取り込んでクラスパスに追加。依存ライブラリなどを取り込んだ状態のjarファイルで、ファイルサイズは30MBを超えていますが、まぁ、気にしない(笑)。

細かいことは気にせず、とりあえず指定したフォルダのファイル一覧を取得する場合、以下のような感じになるようです(Basic認証で保護されていると仮定)。

HostConfiguration hostConfig = new HostConfiguration();
hostConfig.setHost("example.com");
HttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager();
HttpConnectionManagerParams params = new HttpConnectionManagerParams();
int maxHostConnections = 20;
params.setMaxConnectionsPerHost(hostConfig, maxHostConnections);
connectionManager.setParams(params);

HttpClient client = new HttpClient(connectionManager);
Credentials creds = new UsernamePasswordCredentials("userid", "password");
client.getState().setCredentials(AuthScope.ANY, creds);
client.setHostConfiguration(hostConfig);

// ファイル一覧を取得する。
DavMethod pFind = new PropFindMethod("http://example.com/dav/", DavConstants.PROPFIND_ALL_PROP, DavConstants.DEPTH_1);
client.executeMethod(pFind);

MultiStatus multiStatus = pFind.getResponseBodyAsMultiStatus();
MultiStatusResponse[] responses = multiStatus.getResponses();
MultiStatusResponse currResponse;
List<?> files = new ArrayList();
for (int i=0; i<responses.length; i++) {
  currResponse = responses[i];
  System.out.println(currResponse.getHref());
}

細かいところまではまだ調べていませんが、内部的にはCommons HttpClientが使用されているようです。

|

« ApacheとSubversionの両方をビルドする | Main | JackrabbitでSSL通信 »

Java」カテゴリの記事

Comments

こちらのサンプルを拝見し、試してみたところ、
jackrabbit.log_IS_UNDEFINEDのログファイルが
吐かれてしまうのですが、もし、対応策をご存知でしたら
教えていただけないでしょうか?
宜しくお願いします。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail.php?qid=1355427173

Posted by: kookoo | 2011.02.11 at 20:41

log4j.properties の設定で抑制することができるようです。手っ取り早い方法としては、rootLoggerのログ出力レベルをINFO以上にすることでしょうか。

rootLoggerをdebugにした状態のままでjackrabbitのログ出力のみを抑制する場合は、log4j.propertiesで適切な設定を行うことになるかと思います(動作確認したわけではありませんが、 org.apache.jackrabbit あたりを指定することになるのではないかと)。

Posted by: syo | 2011.02.11 at 21:47

早速ありがとうございます。試してみて、結果をまたお知らせいたします。
jackRabbitの情報は少ないので、とても参考になります。

Posted by: kookoo | 2011.02.12 at 07:42

下記をlog4j.propertiesに記載しました。
■log4j.properties
log4j.rootLogger=debug, stdout, file
log4j.logger.org.apache.jackrabbit=INFO,stdout
log4j.debug=true
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy.MM.dd HH:mm:ss,SSS},%F:%L,%p,%m%n

■log4jのデバッグログ
log4j: Parsing for [root] with value=[error, stdout].
log4j: Level token is [error].
log4j: Category root set to ERROR
log4j: Parsing appender named "stdout".
log4j: Parsing layout options for "stdout".
log4j: Setting property [conversionPattern] to [%d{yyyy.MM.dd HH:mm:ss,SSS},%F:%L,%p,%m%n].
log4j: End of parsing for "stdout".
log4j: Setting property [target] to [System.out].
log4j: Parsed "stdout" options.
log4j: Parsing for [org.apache.jackrabbit] with value=[INFO,stdout].
log4j: Level token is [INFO].
log4j: Category org.apache.jackrabbit set to INFO
log4j: Parsing appender named "stdout".
log4j: Appender "stdout" was already parsed.
log4j: Handling log4j.additivity.org.apache.jackrabbit=[null]
log4j: Finished configuring.


しかし、やはり、jackrabbit.log_IS_UNDEFINEDとjetty.log_IS_UNDEFINEDの2つのファイルが出力されてしまいます。
jackrabbitはslf4jを使用しているようですが、それも関係あるのでしょうか?
http://www.docjar.com/html/api/org/apache/jackrabbit/webdav/client/methods/PropFindMethod.java.html

何か対応策をご存知でしょうか?

Posted by: kookoo | 2011.02.14 at 11:42

slf4j( http://www.slf4j.org )は使ったことないのですが、commons-loggingと同様のラッパーライブラリのようですね。logback( http://logback.qos.ch/ )と組み合わせて使うことが一般的とのことで、logback.xml(あるいはlogback-test.xml)でログ出力の設定を行うようです。

実際にどのような風に設定を行うのかまでは調べきれておりませんが、logbackの設定が関係しているのではないかと思われます。

Posted by: syo | 2011.02.14 at 21:02

logbackの設定が関係しているということを教えていただいたので、
下記のlogback.xmlを置いたところ、ファイル出力は、されなくなりました。
ありがとうございました。


System.out

%d{yyyy.MM.dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n






Posted by: kookoo | 2011.02.15 at 12:37

すいません、XMLファイルの内容がうまく投稿できませんでした。
logback.xmlにch.qos.logback.core.ConsoleAppenderを指定したら
ファイル出力されなくなりました。

Posted by: kookoo | 2011.02.15 at 12:40

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/3959/49618117

Listed below are links to weblogs that reference JavaでWebDAVクライアントを実装してみる:

« ApacheとSubversionの両方をビルドする | Main | JackrabbitでSSL通信 »