01: /*
02: * Copyright 2002-2007 the original author or authors.
03: *
04: * Licensed under the Apache License, Version 2.0 (the "License");
05: * you may not use this file except in compliance with the License.
06: * You may obtain a copy of the License at
07: *
08: * http://www.apache.org/licenses/LICENSE-2.0
09: *
10: * Unless required by applicable law or agreed to in writing, software
11: * distributed under the License is distributed on an "AS IS" BASIS,
12: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13: * See the License for the specific language governing permissions and
14: * limitations under the License.
15: */
16:
17: package org.springframework.remoting.rmi;
18:
19: import javax.naming.NamingException;
20:
21: import org.springframework.aop.framework.ProxyFactory;
22: import org.springframework.beans.factory.BeanClassLoaderAware;
23: import org.springframework.beans.factory.FactoryBean;
24: import org.springframework.util.ClassUtils;
25:
26: /**
27: * Factory bean for RMI proxies from JNDI.
28: *
29: * <p>Typically used for RMI-IIOP (CORBA), but can also be used for EJB home objects
30: * (for example, a Stateful Session Bean home). In contrast to a plain JNDI lookup,
31: * this accessor also performs narrowing through {@link javax.rmi.PortableRemoteObject}.
32: *
33: * <p>With conventional RMI services, this invoker is typically used with the RMI
34: * service interface. Alternatively, this invoker can also proxy a remote RMI service
35: * with a matching non-RMI business interface, i.e. an interface that mirrors the RMI
36: * service methods but does not declare RemoteExceptions. In the latter case,
37: * RemoteExceptions thrown by the RMI stub will automatically get converted to
38: * Spring's unchecked RemoteAccessException.
39: *
40: * <p>The JNDI environment can be specified as "jndiEnvironment" property,
41: * or be configured in a <code>jndi.properties</code> file or as system properties.
42: * For example:
43: *
44: * <pre class="code"><property name="jndiEnvironment">
45: * <props>
46: * <prop key="java.naming.factory.initial">com.sun.jndi.cosnaming.CNCtxFactory</prop>
47: * <prop key="java.naming.provider.url">iiop://localhost:1050</prop>
48: * </props>
49: * </property></pre>
50: *
51: * @author Juergen Hoeller
52: * @since 1.1
53: * @see #setServiceInterface
54: * @see #setJndiName
55: * @see #setJndiTemplate
56: * @see #setJndiEnvironment
57: * @see #setJndiName
58: * @see JndiRmiServiceExporter
59: * @see org.springframework.remoting.RemoteAccessException
60: * @see java.rmi.RemoteException
61: * @see java.rmi.Remote
62: * @see javax.rmi.PortableRemoteObject#narrow
63: */
64: public class JndiRmiProxyFactoryBean extends JndiRmiClientInterceptor
65: implements FactoryBean, BeanClassLoaderAware {
66:
67: private ClassLoader beanClassLoader = ClassUtils
68: .getDefaultClassLoader();
69:
70: private Object serviceProxy;
71:
72: public void setBeanClassLoader(ClassLoader classLoader) {
73: this .beanClassLoader = classLoader;
74: }
75:
76: public void afterPropertiesSet() throws NamingException {
77: super .afterPropertiesSet();
78: if (getServiceInterface() == null) {
79: throw new IllegalArgumentException(
80: "Property 'serviceInterface' is required");
81: }
82: this .serviceProxy = new ProxyFactory(getServiceInterface(),
83: this ).getProxy(this .beanClassLoader);
84: }
85:
86: public Object getObject() {
87: return this .serviceProxy;
88: }
89:
90: public Class getObjectType() {
91: return getServiceInterface();
92: }
93:
94: public boolean isSingleton() {
95: return true;
96: }
97:
98: }
|