001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    
018    package org.apache.commons.proxy.provider.remoting;
019    
020    import org.apache.commons.proxy.ObjectProvider;
021    import org.apache.commons.proxy.ProxyUtils;
022    import org.apache.commons.proxy.exception.ObjectProviderException;
023    
024    import javax.naming.InitialContext;
025    import javax.naming.NamingException;
026    import javax.rmi.PortableRemoteObject;
027    import java.lang.reflect.InvocationTargetException;
028    import java.lang.reflect.Method;
029    import java.util.Properties;
030    
031    /**
032     * Provides a reference to a session bean by looking up the home object and calling (via reflection) the no-argument
033     * create() method.  This will work for both local and remote session beans.
034     *
035     * @author James Carman
036     * @since 1.0
037     */
038    public class SessionBeanProvider implements ObjectProvider
039    {
040    //----------------------------------------------------------------------------------------------------------------------
041    // Fields
042    //----------------------------------------------------------------------------------------------------------------------
043        private final String jndiName;
044        private final Class homeInterface;
045        private final Properties properties;
046    
047    //----------------------------------------------------------------------------------------------------------------------
048    // Constructors
049    //----------------------------------------------------------------------------------------------------------------------
050    
051        public SessionBeanProvider( String jndiName, Class homeInterface )
052        {
053            this.jndiName = jndiName;
054            this.homeInterface = homeInterface;
055            this.properties = null;
056        }
057    
058        public SessionBeanProvider( String jndiName, Class homeInterface, Properties properties )
059        {
060            this.jndiName = jndiName;
061            this.homeInterface = homeInterface;
062            this.properties = properties;
063        }
064    
065    //----------------------------------------------------------------------------------------------------------------------
066    // ObjectProvider Implementation
067    //----------------------------------------------------------------------------------------------------------------------
068    
069        public Object getObject()
070        {
071            try
072            {
073                final InitialContext initialContext = properties == null ? new InitialContext() :
074                                                      new InitialContext( properties );
075                Object homeObject = PortableRemoteObject.narrow( initialContext.lookup( jndiName ), homeInterface );
076                final Method createMethod = homeObject.getClass().getMethod( "create", ProxyUtils.EMPTY_ARGUMENT_TYPES );
077                return createMethod.invoke( homeObject, ProxyUtils.EMPTY_ARGUMENTS );
078            }
079            catch( NoSuchMethodException e )
080            {
081                throw new ObjectProviderException(
082                        "Unable to find no-arg create() method on home interface " + homeInterface.getName() + ".", e );
083            }
084            catch( IllegalAccessException e )
085            {
086                throw new ObjectProviderException(
087                        "No-arg create() method on home interface " + homeInterface.getName() + " is not accessible.",
088                        e ); // Should never happen!
089            }
090            catch( NamingException e )
091            {
092                throw new ObjectProviderException( "Unable to lookup EJB home object in JNDI.", e );
093            }
094            catch( InvocationTargetException e )
095            {
096                throw new ObjectProviderException(
097                        "No-arg create() method on home interface " + homeInterface.getName() + " threw an exception.", e );
098            }
099        }
100    }
101