Maybeと多分が恋に落ちたら、産まれてくる子はきっとMaven(2)

【前回までのあらすじ】
弓矢やフックショットで気絶させた後にゾーラになって攻撃をしなければ
ならないのに手際が悪くて逆に復活したグヨーグに飲み込まれてダメージを
食らいまくって死んでしまい戦意を喪失した俺氏はTumblr APIのラッパー
ライブラリの使い方を調べる為に昔作ったbaseWindowクラスを復活させたが……


というところでようやくOAuth認証絡みのコーディングに入った。
入ったはいいけれども、なんかうまくいかない(´・ω・`)

はてなハイクの時のコードを眺めつつ色々と試す。
まずscopeは要らないというかないようだ。

色々ぐぐってる途中で「callbackURLは”http://localhost”を
使ってるぜ、HAHAhaha…」みたいな英文を読んだ気がするので
それに倣った。

なんやかんややってるうちにAuthenticationURLを取り出せた(`・ω・´)
ブラウザでそのURLへ行くと認可ページ。よっしゃ。

そして認可するとhttp://localhostに飛ぶけど、うちの環境では
何も動かしていないのでnot foundになる…当たり前か…うーむ(´・ω・`)

( ゚Д゚)ハッ
callbackURLに”oob”を指定されたらPINが表示されるようになるんじゃね(・∀・)?

やってみた。

返ってきたのは無慈悲なエラーメッセージ……_| ̄|○
‘Out-of-band (“oob”) callbacks are not supported by this implementation.’

だからxAuthオンリーとかなんだな(´・ω・`)


さてと、どうしたものかと考える。
Servlet用ではあるがOAuth認証のプロセスは一緒の筈であるFoto-Haikingで使用した
はてな認証のコードを眺める。

( ゚Д゚)ピコーン!
ユーザーに”oauth_verifier”をコピペしてもらえばいいだけじゃん(・∀・)
つまり、PINの代わりに”oauth_verifier”を受け取ってアクセストークンを
取得するというなんとも美しくない方法である。
“oauth_token”はAuthenticationURLにくっついてるのを使う。

実際の運用的にこれはどうなのかはさておき、この方法でアクセストークンを
取得出来るか試してみる。

キタ━━ヽ( ゚∀゚)ノヽ(゚∀゚ )ノ━━ !!!!! って当たり前か(ノ∀`)

まあ色々な問題とか考えなければならないことは沢山あるけれども、今の目標は
jumblrを使ってTumblr APIを利用することなので、取り敢えずこの件は措いておく。

以下のコードは修正したbaseWindow.javaとFunction.javaでしか動かないので
意味はないけれど、こんな感じのコードで行けた。

getOAuthRequestTokenのコードはscribe-javaをインポートしたプロジェクト。

private static String snl = System.getProperty("line.separator");
private static String dnl = snl + snl ;
private TumblrApi tumblrapi= new TumblrApi();
public String getOAuthRequestToken(String[] args){
	String returnData  ="getOAuthRequestToken:" + dnl;

	OAuthService service = new ServiceBuilder().provider(tumblrapi)
			.apiKey([consumerkey]).apiSecret([consumersecret])
			.callback("http://localhost/").build();
		
	Token reqToken = service.getRequestToken();
		
	while(reqToken.getToken().indexOf("+") >=0 ){
		reqToken = service.getRequestToken();
	}
		
 	returnData += "AuthenticationURL: " +snl+service.getAuthorizationUrl(reqToken) +snl 
 			+"reqToken"+snl+reqToken ;
		
	return returnData;
}

getAccessTokenのコードはjumblrをインポートしたプロジェクト。
統合していないので不明だけど、jumblrはscribe-javaを内部で
使用してるので、統合する場合はscribe-javaは不要?

public String getAccessToken(String[] args) {
	Verifier v = new Verifier(args[0]);
	OAuthService service = new ServiceBuilder().provider(tumblrapi)
			.apiKey([consumerkey]).apiSecret([consumersecret])
			.callback("http://localhost/").build();

	//arg[1]はoauth_token arg[2] req_Secret
	Token tempToken =new  Token(args[1], args[2]);
	Token accessToken = service.getAccessToken(tempToken, v);
		
	return accessToken.toString();
}


アクセストークンがようやく手に入ったのでこれでjumblrが使える(・∀・)
意気揚々とjumblrClientを生成し、アクセストークンをセットしuser()メソッドを実行(`・ω・´)

エラーが2つ……_| ̄|○

java.lang.NoClassDefFoundError: com/google/gson/JsonSyntaxExceptionはともかく
InvocationTargetExceptionってなんだべ(´・ω・`)?

ぐぐる。

J2SEに含まれるクラスのひとつ。パッケージも含めたクラス名はjava.lang.reflect.InvocationTargetException。
例外の一種。
Methodクラスのinvoke()メソッドが投げる例外。 (中略)

InvocationTargetException例外にとって本当の例外は「Caused by」な例外となるため、getCause()メソッドで本当の例外を取得することができる。
InvocationTargetException

んー(´・ω・`) つまりはjava.lang.NoClassDefFoundErrorの方が原因か?
これはまあクラスが見つからなかったんだろうけど、俺のコードで
このcom.google.gsonパッケージなんて使ってたっけ?

gsonってjsonを使うクラスだっけか。
Method.invoke()で発生するということはFunction.javaの方で
発生しているはずだけどもjsonなんて使ってないし…

ということは使ってるのはjumblrだなぁとGithubでソースを見ると
確かにgsonを使っている……つまりそれはエクスポートしたjumblrが
依存ライブラリを含んでいない……

即ちあの作成方法は間違いということか…_| ̄|○
改めてjarファイルのサイズを見てみたらどう見ても
依存ライブラリが入っているようなサイズではなかった …(ヽ’ω`)


ここでふと疑問が浮かぶ。同じ方法で作ったscribeライブラリは
なんで問題なく動いたんだろうかと。
依存ライブラリを持ってなかったんだろうかと。

eclipse内にgitからインポートしたプロジェクトを覗いてみると
依存ライブラリは2つあった。junitとcommon-codecが。
junitはテストだから通常実行で呼び出すことは無いと思うが、
encode絡みでcommon-codecは呼び出している筈…なのに何故
エラーが起きてないのか…?

頭の中で青いジャージを着た男のギター演奏に合わせて
赤いジャージを着た男が手を交差させて踊ってる…(´・ω・`)

実はこの辺の記憶が曖昧なのだけれども、ローカルに依存ライブラリである
common-codecを持っていたのでeclipseがそれを検知したか、scribe-java
プラグインを追加した時になんかあったか……ローカルのファイルがパスに
指定されていたような気もするけど、今試したらm2フォルダのローカルリポジトリを
参照しているのでうーん…(´・ω・`)

全ての問題が解決した後で色々とぐぐってて以下のエントリを読む。
【Java】ClassNotFoundException と NoClassDefFoundError の違い
ErrorとExceptionの違いに気づいてなかったことに気づいた(ノ∀`)

何はともあれ、Mavenの方でbuildしないといけないという結論に達した。


と、だらだら書いていたら長くなりすぎたので続く(´・ω・`)