スキップしてメイン コンテンツに移動

DropboxのJava版APIで過去リビジョンのファイルを取得できない現象について

最近はソースや開発環境はDropbox配下に置き、マシンが変ろうともDropboxで同期させればおkということでなくてはならないDropboxですが、APIの正式版バージョン1が昨年10月に出たということで、使ってみました。

環境



  • Eclipse:Eclipse IDE for Java Developers Indigo Service Release 1

  • JDK:1.6.0_30

  • Dropbox SDKs:Java v1.2.2

WS000375

SDKと言いつつも、Javaに関して言えばjarファイルとソースが入っているだけなので、DropboxのサイトでAPP KEY/SECRETを入手して、jarをビルドパスに通してアクセストークンKEY/SECRETを入手すればDropboxへアクセスできます。

アクセストークン KEY/SECRETの取得はこちらを参考にしました。

・Dropbox Java API で遊ぶ - ザネリは列車を見送った
http://zaneli.hatenablog.com/entry/2011/12/10/123559

サンプルソース


Dropboxの魅力の一つとして、いくつか履歴を残してくれます。間違ってファイルを変更しても、履歴が残っている間なら復元が可能です。APIを使って過去リビジョンのファイルをダウンロードするサンプルソースを作成しました。test.txtファイルに関して変更した過去10件分のファイルをDropboxから取得しローカルへ保存するプログラムです。

public class GetOldFile {

private static final String APP_KEY = "あなたのAPPキー";
private static final String APP_SECRET = "あなたのAPPシークレット";

private static final String TOKEN_KEY = "あなたのアクセストークンキー";
private static final String TOKEN_SECRET = "あなたのアクセストークンシークレット";
/**
* @param args
*/
public static void main(String[] args) {
AppKeyPair appKeys =
new AppKeyPair(APP_KEY, APP_SECRET);
AccessTokenPair tokens =
new AccessTokenPair(TOKEN_KEY, TOKEN_SECRET);
WebAuthSession session =
new WebAuthSession(appKeys, AccessType.DROPBOX, tokens);
DropboxAPI<WebAuthSession> api =
new DropboxAPI<WebAuthSession>(session);

// Dropboxディレクトリ配下のパス
String path = "/develop/test.txt";

try {
// 10件分のファイル変更情報を取得
List<DropboxAPI.Entry> entries = api.revisions(path, 10);

for(DropboxAPI.Entry entry: entries) {
System.out.println(entry.modified + " - " + entry.rev);

FileOutputStream fos =
new FileOutputStream("D:/logs/" + entry.rev + ".txt", false);
// Dropboxよりリビジョンを指定してローカルへファイルを保存
api.getFile(path, entry.rev, fos, null);
fos.close();
}
} catch (DropboxException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}


ところが!ローカルに保存したファイルすべてが同じ内容でした。どれも最新版test.txt。Javadocを見ても、




・DropboxAPI
https://www.dropbox.com/static/developers/dropbox-java-sdk-1.2.2-docs/index.html




WS000376



getFileメソッドの使い方は間違っている気がしない。フォーラムで検索しようにも、英語でなんとキーワードを打てばよいのやら。。



ふと、SDK内のソースDropboxAPI.javaを開いてみました。



WS000377


getFileメソッドの中身はgetFileStreamメソッドが担っているということで、



WS000378



getFileStreamメソッド付近でパラメータの「rev」で検索すると、上図にもわかるようにヒットしない(青色マークされない)=実装されてない!ずこーー



実装後記



ということで、実装されるのを待ちましょうかね。iOS版の方には入っているみたいな記述をチラっと見たので、自分で中身を実装すれば取得できるかもしれませんが、少なくともJava版のこのバージョン1.2.2では、過去のファイルは取得できない作りということで。



あと、開発者が欲しがる機能として、Dropbox配下のファイルに変更があったらアプリ側に通知してくれるようなAPIがないそうです。もしくは、最近変更されたファイル一覧を取得できるAPI。フォーラムのある人によれば、ここは規模が小さいし実装おせーから仕方ねー。みたいなアドバイスもありましたw



じゃぁ、Dropboxへファイルを追加すると、メールを送ってくれたり、PDFに変更してくれたりするここのサービスは、どのように実装してるんでしょうかね?ファイルを総なめしてメタ情報を取得してるんでしょうか?




・Automate your Dropbox
http://dropboxautomator.wappwolf.com/




先日メールを飛ばすよう試してみましたが、思った動きをしませんでした。Dropboxを使ったアプリは開発者側にとってはまだまだ環境が揃っていないような印象を感じます。



ちなみに、変更履歴一覧は個人であれば取得できなくもありません。DropboxのWebサイトへログインして、



WS000380



イベントタブをクリック、ページの下の方に、



WS000381



「このフィードを購読」というRSSが配信されているので、このURLでXMLを解析等すれば変更情報を取得できますが、取得できもて10件~20件程度で、短期間に更新があっった場合は、



WS000382



こんな風にまとめられるので、扱い辛いです。



というわけで待ちましょうか。。


PR:仕事を便利にする!クラウド活用TIPS―いつでも、どこでも、クラウド仕事スタイル

コメント

このブログの人気の投稿

Javaでprivateなfieldやmethodにアクセスする

JUnitでテストしてると、privateなフィールドにアクセスして、値を参照したりセットしたりしたくなるわけですが、よく使うのでメモしておきます。 例えば、次のような対象のクラスがあるとします。 public class ParentClass { private String hoge = "ParentClass!!"; public void dispMsg() { System.out.println("dispMsg:" + hoge); } private void privateDispMsg(String msg) { System.out.println("dispMsg:" + msg); } }

GolangでWindows GUIアプリケーション

GUIアプリ作成の前提 社内ツールとしてexeで配布 開発環境はGoLandを使う 社内ツールとしてexeを配布ということであれば、Visual StudioでC#による開発だと思います。しかしながら、Go言語を習得したいのと、GoLandの補完機能が便利で、Android Studio使っていたこともあり、とっつきやすいという点からGo縛りでGUIアプリケーションを考えたいと思います。 lxn/walk Windows application library kit for Go. Windows向けしか考えていないので、まずこのライブラリなのですが、ボタンやコンボボックスが思ったように並ばなかったり、手軽にイメージボタンを配置したりなど、簡単にレイアウトを変更できない課題に直面しました。レイアウト作成だけで時間を取られてしまいます。そう言えば、Androidアプリ開発のときは、XMLでデザイン部分を切り離してたのを思い出して、今回の調査の運びとなりました。 fyne-io/fyne Cross platform native GUIs designed for Go based on Material Design. Supports: Linux, macOS, Windows, BSD, iOS and Android. walkと比べると、クロスプラットフォームで作成できるのですが、こちらもコードの中にデザインを書いていく形でした。 therecipe/qt therecipe/qt allows you to write Qt applications entirely in Go or JavaScript. Qt Creatorなるものがあるようで、デザイン部分を切り離せる印象はあるものの、最新のPCでもビルドに時間がかかるようで、学習コストもかかるという記事を見かけて断念しました。 どうしたものかとツイートしましたら、下記のようにご助言をいただいた。 同じ課題に対し色々試した結果、PWAのフルキャッシュドに落ち着いた。中身はGo+WASMで。 https://t.co/e60whDTV16 — のぼのぼ📡 (@nobonobo) July 21, 2020 PWA 早速調べてみました。Googleが進めているプロジェクトで、ネイティブアプリのよ

Eclipseの高速化メモ

Eclipseが重いと一言に言っても、いろいろな工程での話があると思いますが、過去記事のなども含めてこの記事にピックアップしておきたいと思います。以下はWindows環境での話です。