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 }