2005年05月01日

WebObjects 5.2.4に関する情報がアップされました

TigerでTiger? - Apple、J2SE 5.0やWebObjectsをアップデート
http://pcweb.mycom.co.jp/news/2005/04/30/001.html


記事によると、Mac OS X Server 10.4(Tiger)に同梱されているWebObjects Deploymentは5.2.4で、さらにJava2 SE 5.0(Tiger)もインストール済みとのこと。デフォルトのjavaは1.4.7。

また、Apple社のサイトには5.2.4のAPIリファレンスも公開されており、Developer版も間もなく公開されると期待できます。


WebObjects Overview(Tiger)



WebObjects 5.2.4 API Reference(Tiger)



WebObjects 5.2.4 API Deferences(Tiger)





J2SE 5.0 API Reference(Tiger)



Deploying Applications(Tiger)



なお、5.2.3のAPI Referenceはこれに伴い以下に移動しています。

WebObject 5.2.3 API Reference


ついでに

WebObjects Document Revision List



WebObjects Document Legacy Document



WebObject 5.1 Developer Documentation



WebObject 5.0 Developer Documentation



WebObject 4.5 Developer Documentation



WebObject 4.0 Developer Documentation



WebObject 3.5 Developer Documentation



WebObject 3.1 Developer Documentation

posted by 永遠製作所 at 19:47| Comment(0) | TrackBack(0) | WebObjects | このブログの読者になる | 更新情報をチェックする

2005年04月29日

失敗:ログアウトを記録しようとして……

失敗から学ぼうシリーズ:つまらない失敗体験でも、記録に残しておけば教訓として残り、つぎに同じ失敗をしないだろう。いやもし同じ失敗をしても、記録を読めばすぐに解決できるだろう。という企画です。
--
WebObjectsでログイン・ログアウトを行うアプリケーションを開発中です。ログイン・ログアウトをログ情報として記録して、後に統計や不具合対応などに利用しようとしてデータベースに保存することにしました。

ただ、Webアプリケーションの特徴としてログインユーザーの情報をセッション情報として保持しますが、長時間アクセスがなかった場合に、自動的にセッションを終了させてしまう必要があります。そしてWebObjectsではこの処理は自動的に実行されます(セッションタイムアウト)。

さて、セッションタイムアウトで終了した時には、ログアウト処理は明示的に呼び出されないため、実行されません。そこでセッションタイムアウト時に呼ばれる処理のなかでログアウトを記録する処理を実行しないといけません。

これらを以下のように実装しました。ファイルSession.java中。

protected boolean isLogedOut = false;
public void logout() {
EEUserLog.createLogForLogout( loginUser );
isLogedOut = true;
}
public void terminate(){
if ( isLogedOut ) {
} else {
EEUserLog.createLogForTimeout( loginUser );
}
}


logout()は、明示的にログアウトしたときに、WOComponentから呼び出します。terminate()はセッションを終了する時に呼び出します。明示的に終了する時には以下のように呼び出します。


public class LogoutPage extends WOComponent {

public LogoutPage(WOContext context) {
super(context);
}

public void sleep() {
((Session)session()).logout();
session().terminate();
}
}


terminate()はまた、セッションタイムアウト時には自動的に呼び出されます。これで完璧なはずでした。


が、問題発生。まず、このアプリケーションを運用環境で実行時にスケジュールの設定をしました。これは、深夜など普段人が使っていない時間帯に自動的にアプリケーション再起動を行う設定です。ところが、設置2日目にログインしようとするとインスタンスが見つからないエラーです。ですが、lsofなどで見るとアプリケーションのプロセスは存在しているみたいです。killで殺して再起動すると使えます。翌日も同じ。試しにスケジュールを切ると一応何日も使えます。その状態でJavaMonitorで見ると、なんとセッション数が異常に多い。

セッションが終わっていないみたいです。そうです、上記コードはこう書かないといけなかったんです。

public void terminate(){
if ( isLogedOut ) {
} else {
EEUserLog.createLogForTimeout( loginUser );
}
super.terminate();
}


フレームワークのメソッドをオーバーライドしたのに親クラスのメソッドを呼び出していないので本来必要な処理が呼び出されていなかったんです。

間抜けなぽかミスですが、1行追加で無事終了。
posted by 永遠製作所 at 19:05| Comment(0) | TrackBack(0) | WebObjects | このブログの読者になる | 更新情報をチェックする

2005年04月23日

PKを表示する。

WebObjectsでPrimary Keyを設定すると、通常不可視属性となる。が、値の自動設定などはシステムに任せたいが、その値を表示したい場合がある。この場合、不可視となっている値を表示させる必要があり一工夫必要である。以下にその方法を示す。

そのPrimary KeyをもつEOEnterpriseObjectのCustom Classを使っている場合には、そのクラス中に以下を実装することで実現できる。


public Number getCodeNo()
{
EOEditingContext ec = this.editingContext();
if ( ec == null ) {
return null;
}
EOGlobalID gid = ec.globalIDForObject( this );
if ( gid.isTemporary() ) {
return null;
}
EOKeyGlobalID kGid = (EOKeyGlobalID)gid;
NSArray keyValues = kGid.keyValuesArray();
if ( keyValues.count() != 1 ||
          !(keyValues.objectAtIndex(0) instanceof Integer) ) {
return null;
}
return (Integer)keyValues.objectAtIndex(0);
}


未保存であったり、EditingContextに挿入される以前にはPKは未設定であるので取得できない。また、本コードではInteger型以外のPKには未対応であり、複数キーを設定している場合にも使用できない。

なお、この方法は以前、technologic arts社のMLでkawano氏が紹介していたものである。
posted by 永遠製作所 at 16:41| Comment(0) | TrackBack(0) | WebObjects | このブログの読者になる | 更新情報をチェックする