Hatena::ブログ(Diary)

日記

2005-01-09 (日)

CanCam2005年02月号の蛯原友里ちゃん

[][] CanCam 02 月号 エビちゃんベストセレクション 18 05:55

CanCam から,お気に入りの蛯原友里ちゃんを紹介しようというこのコーナー.

今日も「海外ブランドショッピング 『6大都市現地プライス』 大調査 BOOK」から P185 の友里ちゃん.

大調査 BOOK からのセレクションも今日でお終い.最後を飾るのは柔らかい表情の友里ちゃん.優しげでいい感じです♪

そんなわけで (どんなわけで?),やっぱり CanCam 買うしか!!

[][][] 出演予定 TV 番組 05:50

この近辺 (どこ?) で話題のモデルが出演するテレビ番組を分かるだけ掲載します.

新規分は赤字で (レギュラー除く).直近分は太字で.

山田優
01/10 (月) 18:55〜19:54 TBS関口宏東京フレンドパーク 2」
01/15 (土) 19:00〜19:57 CX 「脳内エステ IQ サプリ」
押切もえ
01/10 (月) 10:20〜11:15 TBSホノルルマラソン」
徳澤直子
01/11 (火) 05:25〜08:00 CX 「めざましテレビ
蛯原友里
01/14 (金) 23:15〜00:10 ANB特命係長・只野仁

[][] Re:S2RemotingRMI実装 05:05

早速、id:koichikさんのURLBasedConnectorを利用しようと思ったのですが、URLクラスはプロトコルrmiだと
java.net.MalformedURLException: unknown protocol: rmi
となり使えないようです。知りませんでした。
「ken’s memo」−「S2RemotingのRMI実装」

ぐはぁっ,そんな問題が...

そんなわけで (どんなわけで?),こんなの作ってみました.

まずは URLStreamHandlerHandlerレジストリ

package org.seasar.remoting.url;

import java.net.URL;
import java.net.URLStreamHandler;
import java.net.URLStreamHandlerFactory;
import java.util.HashMap;
import java.util.Map;

public class URLStreamHandlerRegistry implements URLStreamHandlerFactory {
    protected static final Map registry = new HashMap();

    static {
        URL.setURLStreamHandlerFactory(new URLStreamHandlerRegistry());
    }

    private URLStreamHandlerRegistry() {
    }

    public URLStreamHandler createURLStreamHandler(final String protocol) {
        return (URLStreamHandler) registry.get(protocol);
    }

    public static void registerHandler(final String protocol, final URLStreamHandler handler) {
        registry.put(protocol, handler);
    }
}

そしてデフォルトのポート番号を持ち,openConnection() することのできない汎用の URLStreamHandler

package org.seasar.remoting.url;

import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLStreamHandler;

public class UnopenableURLStreamHandler extends URLStreamHandler {
    protected final int defaultPort;

    public UnopenableURLStreamHandler(final int defaultPort) {
        this.defaultPort = defaultPort;
    }

    protected URLConnection openConnection(final URL url) throws IOException {
        throw new UnsupportedOperationException();
    }

    protected void setURL(final URL url, final String protocol, final String host, int port,
            final String authority, final String userInfo, final String path, final String query,
            final String ref) {
        if (port == -1) {
            port = defaultPort;
        }
        super.setURL(url, protocol, host, port, authority, userInfo, path, query, ref);
    }
}

軽くテスト.

package org.seasar.remoting.url;

import java.net.MalformedURLException;
import java.net.URL;

import junit.framework.TestCase;

public class UnopenableURLStreamHandlerTest extends TestCase {
    public UnopenableURLStreamHandlerTest() {
        super();
    }

    public UnopenableURLStreamHandlerTest(String name) {
        super(name);
    }

    public void test() throws MalformedURLException {
        URLStreamHandlerRegistry.registerHandler("rmi", new UnopenableURLStreamHandler(1099));
        
        URL url = new URL("rmi://localhost/test");
        assertEquals("rmi", url.getProtocol());
        assertEquals(1099, url.getPort());
        assertEquals("localhost", url.getHost());
        assertEquals("/test", url.getPath());
        
        new URL("http://host/test");
        try {
            new URL("foo://host/hoge");
            fail();
        }
        catch (MalformedURLException ignore) {
        }
    }
}

これで,RMIConnector (?) で

public class RMIConnector extends URLBasedConnector {
    static {
        URLStreamHandlerRegistry.registerHandler("rmi", new UnopenableURLStreamHandler(1099));
    }
    ・・・
}

と使うことが出来ます.

S2Remoting 0.0.3 に含めます.

[][][] Inter 3 - 2 Sampdoria 04:04

\(^o^)/ \(^o^)/ \(^o^)/ \(^o^)/ \(^o^)/

後半 43 分まで 0 - 2,敗色濃厚な状況から大逆転勝利!!!!

らしいです.すげー!! すごすぎるぜ!!!!

[][] S2Remoting 0.0.2 リリース 01:01

S2Remoting の 0.0.2 をリリースしました.Seasar Wiki からダウンロードすることが出来ます.

http://seasar.satin.jp/wiki/index.php?Sandbox%2FS2Remoting


変更点は,URLBasedConnector#setBaseURL(URL)引数String に変更したことです.

これは,URL だと dicon ファイルに記述するのがとても面倒なためです.

<component class="XxxConnector">
    <property name="baseURL">
        new java.net.URL("http://host/context/")
    </property>
</component>

でも,

<component class="XxxConnector">
    <property name="baseURL">
        <component class="java.net.URL">
            <arg>"http://host/context/"</arg>
        </component>
    </property>
</component>

でも,どっちにしても面倒.String であれば,

<component class="XxxConnector">
    <property name="baseURL">
        "http://host/context/"
    </property>
</component>

と書けるので,ちょっとだけラクチンです♪

議論なしで勝手に決めてしまってすみません.>リモーティング関連プロダクト開発者の皆様.

[][] S2TestCase 22:55

S2.1.8 の S2TestCase#setUpContainer() なんですが...

    protected void setUpContainer() throws Throwable {
        container_ = new S2ContainerImpl();
        servletContext_ = new MockServletContextImpl("s2jsf-example");
        request_ = servletContext_.createRequest("/hello.html");
        response_ = new MockHttpServletResponseImpl(request_);
        servletConfig_ = new MockServletConfigImpl();
        servletConfig_.setServletContext(servletContext_);
        servlet_ = new MockServlet();
        servlet_.init(servletConfig_);
        container_.setServletContext(servletContext_);
        container_.setRequest(request_);
        container_.setResponse(response_);
    }

servletContextrequest の設定がいかにも S2JSF 用になっているのはいかがなものかと.(^^;

必ずしも Web アプリケーションのテストをするとは限らないと思うので,setUpContainer() で無条件にこの辺りが設定されるのはちょっといやーんな感じがします.S2WebTestCase とかだったら理解できるのですけど.

これは S2.1.0 からずっとなので,今更ではありますが.

[][] TransactionManager#suspend() 22:44

またしても id:taedium さんとひがさんのやりとりから.昨年から taedium さんの日記はネタの宝庫でありがたい限りです.

If the thread is not associated with any transaction, a null object reference is returned; otherwise, a valid Transaction object is returned.

# higayasuo 『(中略) 3.2.3は、仕様がおかしいと思うんですよ。Transactionを開始してないのに、suspendするって。(以下略)』
「taediumの日記」−「Java Transaction API (JTA) specification を読んでみる」より

別に仕様がおかしいというほどではないような.

妥当でない状況で呼び出された場合の振る舞いとして,例外をスローするのではなく null を返すようにと決められているだけですよね.例えば java.util.Collection#remove(Object) でコレクションに要素がなくても例外がスローされないのとあまり変わらないのではないかと.

このような仕様になっている理由は利便性でしょう.S2Tx にはサポートがありませんが,EJB 的な NotSupportedInterceptor を実装する場合...

    public Object invoke(final MethodInvocation invocation) throws Throwable {
        final Transaction tx = suspend();
        try {
            return invocation.proceed();
        }
        finally {
            if (tx != null) {
                resume(tx);
            }
        }
    }

というように,ノーチェックで TransactionManager#suspend() を呼び出しても大丈夫になります.まぁ,チェックしても大した手間ではありませんけど.実際 RequiresNewInterceptor はチェックしてますしね.

個人的には,ここは仕様通り実装すべきではないかなぁと思います.

taichitaichitaichitaichi 2005/01/10 13:15 S2TestCaseは僕も、ちょっとオカシイナ…と。思います。
もう1つ、S2TestCaseメソッド多すぎませんかねぇ…。

higayasuohigayasuo 2005/01/10 16:26 良くないと思うところはどんどん直して良いよ。
インターフェースが変わるなら、blogやMLで聞いてみる必要があるけど。

koichikkoichik 2005/01/10 16:30 太一さん:では善処の方向で.(^^; <S2TestCase#setUpContainer()
メソッドが多いという事については Java が多重継承 (mix-in) できませんからねぇ.多重継承できるなら DataSet なんかのサポートとかを切り出したり出来ますけど... こういうところは悩ましいですね.