2009/11/27

AppEngineでメール送受信とか

メール受信に関しては、http://d.hatena.ne.jp/hidemon/20091015/1255557396http://d.hatena.ne.jp/nowokay/20091024が参考になります。

送信に関してはhttp://codezine.jp/article/detail/3917に載っているコードがシンプルです。
送信時の注意点は、アプリケーションの開発者のアカウントか、アプリケーションにログイン注のGoogleアカウントしか送信者になれないこと。自分のアカウントを使いたくない場合は、別途Googleアカウントを取得し、それを開発者に加えます(http://code.google.com/intl/ja/appengine/docs/java/mail/overview.htmlここのメールメッセージの節参照)。

pos2witでは、実際に別のGoogleアカウントを取得して、それをアプリケーションの開発者に加え、送信者として設定してます。加えて、そのアカウントに返信されたメールをpos2witで処理するために、フィルタを設定してpos2witの指定アドレスに転送してます。折角メール受信機能があるんだから、APPID.appspotmail.com上のアドレスも送信者として指定できればいいのに。(6/20 追記: 数ヶ月前から、APPID.appspotmail.com上のアドレスも指定できることが確認できてます。英語のドキュメントにもそれが可能であることが触れられています。但し日本語のドキュメントにはまだその記述はありません。)

2009/11/23

NavigationToolbarのカスタマイズ

コーディングでスタイルを変える方法もあるけど、htmlが用意されているコンポーネントの場合は、それを上書きしてしまうことでもカスタマイズできる(但し動的な部分には向かない)。
以下はAjaxFllbackDefaultDataTableのナビゲータである、AjaxNavigationToolbarの例。 

(AjaxNavigationToolbar.html)
<wicket:panel>
<tr class="navigation">
<td wicket:id="span">
<div style="float: right;" class="navigatorLabel"><span wicket:id="navigatorLabel">[navigator-label]</span></div>
<div style="text-align: center;" class="navigator"><span wicket:id="navigator">[navigator]</span></div>
</td>
</tr>
</wicket:panel>

赤字の部分を書き換えて、本来ラベル(全何件のうち何件目から何件目かを表示)が左でナビゲータ(< < 1 2 3てやつ)が右なのを、それぞれ右、中央に変えてる。
このファイルをプロジェクトのsrc/org/apache/wicket/extensions/ajax/markup/html/repeater/data/table に置いておけば、本来のファイルより優先して読み込まれる。

Wicketのカスタマイズは、コードで、propertyファイルで(これには国際化も絡む)、html置き換え、と複数の方法があってもの凄く柔軟。反面どれでやればいいのかわかりにくいこともありそうだけど。

2009/11/22

AjaxFallbackDefaultDataTableのカラム幅指定(2)

やっぱり簡単な方法があった。
public Page(){
List<IColumn<Score>> columns = new ArrayList<IColumn<Score>>();
columns.add(new PropertyColumn<Score>(new Model<String>("打順"), "order"){
public String getCssClass() {
return "orderClass";
}

});
add(new AjaxFallbackDefaultDataTable<Score>(
"scores", columns
, new ScoreDataProvider(), 10
));


こんな感じで、カラムのgetCssClassをオーバーライドして適当な値を返せばthタグのclassとして出力されるので、スタイルシートで

th.orderClass{ width: 20%}

ってやっとけば幅を指定できる。前回のコードからわかるように、Columnは実際にはthやtdの下に位置するんだけど、getCssClassが返す結果はthやtdに反映される。
前回のと同じ結果ではないけど、はるかにシンプルにできるので、わざわざ前回のコンポーネント階層を辿るより全然良い。

2009/11/15

AjaxFallbackDefaultDataTableのカラム幅指定

AjaxFallbackDefaultDataTableが作ってくれるテーブルの、各カラムのサイズを指定したくていろいろ調べてみたけど、なかなか良い方法が見つからなかった。一応実現できたけど、むちゃくちゃ強引な気がする。

public Page(){
DataTable table = new AjaxFallbackDefaultDataTable( ... );

MarkupContainer headers = (MarkupContainer)get(table, "topToolbars/2/toolbar/headers");
if(headers != null){
get(headers, "1/header").add(new AttributeAppender("width", new Model("20%"), ""));
get(headers, "2/header").add(new AttributeAppender("width", new Model("20%"), ""));
get(headers, "3/header").add(new AttributeAppender("width", new Model("60%"), ""));
}
}

private static Component get(MarkupContainer root, String path){
String[] paths = path.split("\\/");
MarkupContainer current = root;
for(String p : paths){
Component c = current.get(p);
if(c == null) return null;
if(!(c instanceof MarkupContainer)) return null;
current = (MarkupContainer)c;
}
return current;
}

こんなんでいいのかね。

2009/11/04

Wicket勉強中(DropDownChoice)

Apache Wicketを再勉強中。DropDownChoiceを使う最もシンプルなコードを作ってみた。

public class Sample extends WebPage{
public Sample() {
Form form = new Form("form");
form.add(new DropDownChoice("result"
, new PropertyModel(this, "resultChoiceSelection")
, Arrays.asList("エラー", "安打", "二塁打", "三塁打", "ホームラン")
));
form.add(new Button("submit"));
add(form);
}
private String resultChoiceSelection;
}

PropertyModelの行削ったり、変わりにListModelだったりすると、submit時に例外が起こる。これってバグと言っていいと思うけどなぁ。