SiNBLOG

140文字に入らないことを、極稀に書くBlog

Slim3 Source Code Reading No5に参加してきた!

Slim3 Source Code Reading #5 - ChugokuGTUG

に参加してきました!


今回も@ttyokoyama 殿と2人だったので、まったりと進みました。
まぁ、他の方が参加していても、まったり進むのですがw

T.Yokoyamaのブログ: Slim3 Source Code Reading #5


まずは、Memcacheについて読んだのですが、結論としてはよく分からない・・・。
昔はリトライ処理があったようなのですが、今はLowLevelAPIにdelegateしているだけです。
しかし、getの時だけ何かしている・・・
中身のソースはLowLevelAPIと似たような雰囲気があるので、微妙に何かが違うのかなぁと思いつつ読んでみましたが、よく分からない・・・。

MemcacheDelegate#getInternal()
Google Code Archive - Long-term storage for Google Code Project Hosting.

AsyncMemcacheServiceImpl#doGet()
ログイン - Google アカウント


後は、Deserializeする時の処理が少し違うかなぁという印象です。
S3MemcacheSerialization#deserialize()
Google Code Archive - Long-term storage for Google Code Project Hosting.

MemcacheSerialization#deserialize()
http://code.google.com/p/googleappengine/source/browse/trunk/java/src/main/com/google/appengine/api/memcache/MemcacheSerialization.java


Javaに精通していない私が見ても、なんか違うが何の意味があるのかは分からない・・・。
とりあえず、迷宮入りしました・・・。


次はGoogleアカウントを利用したユーザ認証を行いました。
これはSlim3とは直接関係なかったのですが、横山殿に便利だよ!と言われ、教えてもらいましたw
ちょっと前にtwitter4jを使ってoauthでの認証を行ったのですが、googleも同じような感じなのかなぁと思っていたわけです。
Slim3でtwitter4jを使ってTwitterアカウントにサインインする - SinDiary
しかし、違った!


import org.slim3.controller.Controller;
import org.slim3.controller.Navigation;

import com.google.appengine.api.users.User;
import com.google.appengine.api.users.UserService;
import com.google.appengine.api.users.UserServiceFactory;

public class IndexController extends Controller {

@Override
public Navigation run() throws Exception {
UserService userService = UserServiceFactory.getUserService();
User user = userService.getCurrentUser();

if (user != null) {
requestScope("nickname", user.getNickname());
requestScope("email",user.getEmail());
return forward("index.jsp");
} else {
return redirect(userService.createLoginURL(basePath));
}
}
}

これだけでした!
userService.getCurrentUser()で、googleアカウントにログインしている場合は、Userが返ってきます。
userService.createLoginURL()に渡しているのは、CallbackURLです。
返ってきた時には既に認証が終わっています。
いったいどうやってるのかはさっぱり分かりませんが、これだけでできます。

ただ、twitterのようにアプリケーションの承認がないので、googleアカウントにログインした状態で、このWebサイトを踏むとメアドなんかを抜くことができるのは、ちとあれか?と思ったりはしますね。
まぁ、メアドは公開情報なので、そこまで神経質になることもないかもしれませんが。
googleのサービスとかだとIDが見えるので、メアドも分かりますしね。
まぁ、appengine上で動いているということは、googleの手の上にいると同じ!
悪質なサイトがあれば、華麗にgoogleアカウントごと停止してくれることでしょうw


そして、最後はAutomatic Valuesです。
GoogleUserの話をしていた時に、ごりごりslim3のソースを検索して偶然発見したので、読んでみたというこのAutomaticValues
改めて公式を見ると普通に載っています。

Automatic Values - Slim3

Modelのフィールドにアノテーションを指定することで、モデル保存時に自動的にプロパティを設定してくれるというものです。

このアノテーションを指定すると、ModelMeta#prePut()にロジックが生成されます。
今までModelMeta#prePut()には、何をしたらロジックが生成されるのか?を悩んでいたわけですが、ついに念願のロジックが生成されました!

例として、公式のチュートリアルに適用するとこんな感じです。

Before


@Model(schemaVersion = 1)
public class Tweet implements Serializable {

private static final long serialVersionUID = 1L;

@Attribute(primaryKey = true)
private Key key;

@Attribute(version = true)
private Long version;

private String content;

private Date createdDate = new Date();

....

After


@Model(schemaVersion = 1)
public class Tweet implements Serializable {

private static final long serialVersionUID = 1L;

@Attribute(primaryKey = true)
private Key key;

@Attribute(version = true)
private Long version;

private String content;

@Attribute(listener = CreationDate.class)
private Date createdDate;

....

これで、作成時に現在日時が設定されます。
中身を見ると、こんな感じです。
Google Code Archive - Long-term storage for Google Code Project Hosting.


public class CreationDate implements AttributeListener {

public Date prePut(Date value) {
if (value != null) {
return value;
}
return new Date();

}

}


更新日時を設定するような時は、ModificationDateを使います。
Google Code Archive - Long-term storage for Google Code Project Hosting.


public class ModificationDate implements AttributeListener {

public Date prePut(Date value) {
return new Date();

}

}

日時の他には、先程出てきたGoogleアカウントそのものと、Emailのみのものがあります。
例えば、Emailはこんな感じです。
Google Code Archive - Long-term storage for Google Code Project Hosting.


public class CreationEmail implements AttributeListener {

public String prePut(String value) {
if (value != null) {
return value;
}
UserService us = UserServiceFactory.getUserService();
User user = us.getCurrentUser();
if (user != null) {
return user.getEmail();
}
return null;
}

}

以上で、今回は終わりです!
次回は、FileUploadの中を適当に読んでいく?予定です!


後、時折思うのですが、Slim3公式の文中のソースのリンクがきれているのは、何故なのだろう・・・?

http://slim3demo.appspot.com/upload/

http://slim3demos.appspot.com/upload/

上が貼ってあるリンクで、下が正しいリンク。
「s」が足らない!