拡張seamコンポーネント


どのフレームワークにも、拡張性という非常に重要な機能が必要です.JBoss Seamはこの点で最高の点数を得た.理由はとても簡単です.The main goal, to introduce consistent programming model that will make various frameworks to work together, is not just promoted for application developer, but also used through-out Seam itself.したがって、コンポーネントモデルの使用方法を理解し、内部原理を迅速に理解することで、組み込みコンポーネントの拡張を容易に開始できます.
まず、コンポーネント開発の流れを理解する必要があります.Seamプログラムはcontext listenerによって開始され,context listenerは構成に従ってInitializationオブジェクトをインスタンス化することによって生成される.これらの構成は、1、WEB-INF/components.xmlと使用を推奨しないWEB-INF/events.xml 2、servlet context、classpathルートディレクトリの下のseam.properties 3、@Nameで注記されたSeamコンポーネント
次に、依存マネージャは、コンポーネント依存関係を評価することによって、ロードするコンポーネントを決定します.
ここで、Seamは別の注釈——@Installを使用する.コンポーネントと依存するコンポーネントをロードするかどうかを指定するだけでなく、プロファイルで上書きすることもできます.コンポーネントの優先度も指定します.2つのコンポーネントが同じ名前で存在し、同時に存在する場合、依存マネージャはより優先度の高いものをロードします.
ここでの優先度は、予め定義された整数定数で指定される:1、BUILT_IN[0]は内蔵コンポーネント2、FRAMEWORK[10]はSeamからのフレーム3、APPLICATION[20]を継承するために使用され、デフォルトの優先度はプログラム内のコンポーネント4、DEPLOYMENT[30]はparticular deploymentに複写されたコンポーネント5、MOCK[40]はテストで使用されたオブジェクトに使用される
次の2つの注記は、1、@BypassInterceptors:Seamをクラスまたはメソッドで無効にする2、@Startupを対応するscopeでコンポーネントを初期化し、有効にするコンポーネントの導入中のより多くの制御機能を提供します.
以上のセクションを理解することで、Seamに組み込まれたコンポーネントでもサードパーティが提供するフレームワークでもプログラムでも、任意のコンポーネントを拡張できます.
拡張Identityオブジェクト
例として、カスタムJAASログインモジュールをサポートできるように、組み込まれたIdentityオブジェクトを拡張する方法を示します.As example I’ll show you how to extend built-in identity object to support custom JAAS Login Module that requires custom callback handler to be used to obtain/provide further information. This particular implementation adds functionality to support NTLM as other authentication method (together with customized jCIFS library) and NTLM support iself is not part of this code snapshot.
 
@Name(”org.jboss.seam.security.identity”)
@Scope(SESSION)
@Install(precedence = APPLICATION)
@BypassInterceptors
@Startup
public class NTLMIdentity extends Identity {

//
// custom code
//

@Override
public String login() {
    try {
       retrieveNTLMAuthenticationDetails();
    } catch (LoginException le) {
       log.error(”Unable to retrieve NTLM authentication details!”, le);
       return null;
    }
}

@Override
protected CallbackHandler getDefaultCallbackHandler() {
     return new CallbackHandler() {
       public void handle(Callback[] callbacks)
          throws IOException, UnsupportedCallbackException {
          for (int i = 0; i < callbacks.length; i++) {
            if (callbacks[i] instanceof NameCallback) {
              ((NameCallback) callbacks[i]).setName(getUsername());
            } else if (callbacks[i] instanceof PasswordCallback) {
              ((PasswordCallback) callbacks[i]).setPassword(getPassword() != null ?
                  getPassword().toCharArray() : null);
            } else if (callbacks[i] instanceof SFSIdentityCallbackHandler) {
               processSFSCallbackHandler((SFSIdentityCallbackHandler) callbacks[i]);
            } else {
               throw new UnsupportedCallbackException(callbacks[i], “Unsupported callback”);
            }
         }
       }
     };
   }

   //
   // custom code
   //
}


 
 
 
 
ここで@Name注記は、Seamに内蔵されているIdentityコンポーネント名を上書きし、彼にBUILT_を与えます.INより高い優先度.プログラムを実行するとInstance()はNTLMIdentityオブジェクトを呼び出します.