View Javadoc

1   package org.seasar.remoting.rmi.connector;
2   
3   import java.lang.reflect.Method;
4   import java.net.MalformedURLException;
5   import java.net.URL;
6   import java.rmi.Naming;
7   import java.rmi.NotBoundException;
8   import java.rmi.RemoteException;
9   
10  import org.seasar.remoting.common.connector.impl.URLBasedConnector;
11  import org.seasar.remoting.common.url.URLStreamHandlerRegistry;
12  import org.seasar.remoting.common.url.UnopenableURLStreamHandler;
13  import org.seasar.remoting.rmi.adaptor.RMIAdaptor;
14  
15  /***
16   * RMIを使用してリモートメソッドの呼び出しを行うコネクタの実装クラス.
17   * 
18   * @author Kenichiro Murata
19   */
20  public class RMIConnector extends URLBasedConnector {
21      private RMIAdaptor adaptorStub;
22  
23      /***
24       * コンストラクタ.
25       */
26      public RMIConnector() {
27          URLStreamHandlerRegistry.registerHandler("rmi",
28                  new UnopenableURLStreamHandler(1099));
29      }
30  
31      /***
32       * @see org.seasar.remoting.common.connector.Connector#invoke(java.lang.String,
33       *      java.lang.reflect.Method, java.lang.Object[])
34       */
35      public Object invoke(String componentName, Method method, Object[] args)
36              throws RemoteException, Exception {
37          synchronized (this) {
38              if (this.adaptorStub == null) {
39                  this.lookup();
40              }
41          }
42  
43          return this.adaptorStub.invoke(componentName, method.getName(), args);
44      }
45  
46      /***
47       * diconファイルで設定されたbaseURLプロパティを使用して、
48       * RMIレジストリからRMIAdaptorのスタブクラスを取得します.
49       * 
50       * @throws RemoteException
51       *              レジストリへの問い合わせ時にスローされるRMIの例外
52       * @throws MalformedURLException
53       *              baseURLがrmiプロトコルではない場合の例外
54       * @throws NotBoundException
55       *              RMIレジストリにRMIAdaptorが未登録の場合の例外
56       */
57      public void lookup() throws RemoteException, MalformedURLException,
58              NotBoundException {
59          URL targetURL = new URL(this.baseURL, RMIAdaptor.EXPORT_NAME);
60  
61          this.adaptorStub = (RMIAdaptor) Naming.lookup(targetURL.toString());
62      }
63  }