2007 年 1 月 18 日 19 時 8 分

NullSecurityHandler クラス


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


SecurityHandshake クラスは、種類を決定した後、
その本処理を SecurityHandler に委託する。

RFB で定義されている認証手法は 2 つ。
セキュリティ無しと、VNC 認証だ。

これらを SecurityHandler を実装したクラスとして表現し、
SecurityHandshake に渡せるようにすれば、
セキュリティハンドシェイクの実装を完全に分離できる。

まずは、セキュリティ無しのほうから。

========== NullSecurityHandler.java ==========

package jp.loafer.rfb.server;

import java.io.IOException;

import jp.loafer.rfb.RFBContext;
import jp.loafer.rfb.RFBHandler;
import jp.loafer.rfb.io.RFBInputStream;
import jp.loafer.rfb.io.RFBOutputStream;
import jp.loafer.rfb.message.SecurityResultMessage;

/**
* サーバ側の認証なしセキュリティ処理。
* @author kes
*/
public class NullSecurityHandler implements SecurityHandler {

    /**
     * {@link NullSecurityHandler} のインスタンスを作成。
     */
    public NullSecurityHandler() {
        // 特になし
    }
   
    /**
     * @see SecurityHandler#getType()
     */
    public int getType() {
        return SecurityHandler.NONE;
    }

    /**
     * @see RFBHandler#execute(RFBContext, RFBInputStream, RFBOutputStream)
     */
    public void execute(RFBContext context, RFBInputStream in,
            RFBOutputStream out) throws IOException {

        // RFB 3.8 以上の場合は SecurityResult で成功を返す
        if (context.getVersion() >= 3008) {

            SecurityResultMessage result
                    = new SecurityResultMessage(SecurityResultMessage.STATUS_OK);
            out.writeMessage(context, result);
            out.flush();
        }

    }

}

========== end of NullSecurityHandler.java ==========

セキュリティ無しとは言うものの、
RFB 3.8 以降では SecurityResult の返答が必須である。
これは常に成功するのでそれほど難しくはない。

この NullSecurityHandler を使えば、
セキュリティ無しのセキュリティハンドシェイクを、
以下のように簡潔に書く事ができるようになる。

    // RFBContext context;
    // RFBInputStream in;
    // RFBOutputStream out;

    SecurityHandler handler
            = new NullSecurityHandler();
    SecurityHandshake handshake
            = new SecurityHandshake(handler);
    handshake.execute(context, in, out);   

楽なだけでなく、コードがすっきりする。

余談だが、どうも Java のコードを Eclipse で書いていると、
インタフェースやクラスを細分化し、
個々のクラスのコード量を少なくしたい衝動に駆られる。

しかしながら、C# のコードを Visual Studio で書いていても、
Java ほどはその欲求は起こらず、
ついつい、長く大きなクラスを書いてしまっている。

設計思想的には、Java も C# も同じ方法が通用するので、
言語的な差異が原因とは考えられない。
これは IDE が自分に与えている影響なのだろうか。

IDE 上では一切操作せず、画面を眺めながら、
紙と鉛筆で構想を練っている段階であっても、
なぜか、設計や考え方にも影響を及ぼしているようだ。

自分にとって IDE は、開発の効率化やデバッグだけでない、
なにか不思議な影響を与えるものなのである。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.