S2Remoting実装トライアル

仕事でS2Remotingを使用したいので、
ひがやすおさんのS2Remotingのイメージを参考にサンプル実装を試みる。

情報ソースはこちら。http://d.hatena.ne.jp/higayasuo/20040317#1079479707


ConnectorAdvice、Connector、Adaptorを作成すべし、ということで、
まずは、その連携イメージから。

ConnectorAdviceはConnectorに対し、コンポーネントの名前、メソッド名、引数を 渡して処理してもらいます。

ConnectorはAdaptorに対し、コンポーネントの名前、メソッド名、引数を 渡して処理してもらいます。

Adaptorは、自分が登録されているコンテナから指定されたコンポーネントを 取得し、seasar.beans.BeanDesc経由でメソッドを実行します。

ということなので、何も考えずに
ConnectorAdvice.invoke()->Connector.invoke()->Adaptor.invoke()という流れでしょうか。
#Adaptor.invoke()がリモートメソッドになる。


早速、ConnectorAdviceから。

1. ConnectorAdvice(S2RemotingInterceptor)

ちなみにS2のソースを見るとアスペクトの名称は、今はAdviceではなく、
Interceptorのようなので、名称はS2RemotingInterceptorとしてみる。

package sample.seasar.remoting.interceptor;

import org.aopalliance.intercept.MethodInvocation;
import org.seasar.framework.aop.interceptors.AbstractInterceptor;

import sample.seasar.remoting.Connector;

/**
 * @author murata
 */
public class S2RemotingInterceptor extends AbstractInterceptor
{
  private Connector connector;

  private String componentName;

  /**
   * @param connector
   *          The connector to set.
   */
  public void setConnector(Connector connector)
  {
    this.connector = connector;
  }

  /**
   * @param componentName
   *          The componentName to set.
   */
  public void setComponentName(String componentName)
  {
    this.componentName = componentName;
  }

  /*
   * (non-Javadoc)
   * 
   * @see org.aopalliance.intercept.MethodInterceptor#invoke(org.aopalliance.intercept.MethodInvocation)
   */
  public Object invoke(MethodInvocation invocation) throws Throwable
  {
    String methodName = invocation.getMethod().getName();
    Object[] args = invocation.getArguments();

    return this.connector.invoke(this.componentName, methodName, args);
  }
}