001: /**
002: * EasyBeans
003: * Copyright (C) 2006 Bull S.A.S.
004: * Contact: easybeans@ow2.org
005: *
006: * This library is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU Lesser General Public
008: * License as published by the Free Software Foundation; either
009: * version 2.1 of the License, or any later version.
010: *
011: * This library is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * Lesser General Public License for more details.
015: *
016: * You should have received a copy of the GNU Lesser General Public
017: * License along with this library; if not, write to the Free Software
018: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
019: * USA
020: *
021: * --------------------------------------------------------------------------
022: * $Id: EJBLocalHomeInvocationHandler.java 2010 2007-10-26 13:19:08Z benoitf $
023: * --------------------------------------------------------------------------
024: */package org.ow2.easybeans.proxy.client;
025:
026: import java.lang.reflect.Method;
027: import java.lang.reflect.Proxy;
028:
029: import javax.ejb.RemoveException;
030:
031: /**
032: * Object acting as the proxy for EJB Local Home calls.
033: * @author Florent Benoit
034: */
035: public class EJBLocalHomeInvocationHandler extends
036: LocalCallInvocationHandler {
037:
038: /**
039: * UID for serialization.
040: */
041: private static final long serialVersionUID = -7113041945135321801L;
042:
043: /**
044: * Build a new Invocation handler.
045: * @param embeddedID the Embedded server ID.
046: * @param containerId the id of the container that will be called on the
047: * remote side.
048: * @param factoryName the name of the remote factory.
049: * @param useID true if all instance build with this ref are unique
050: * (stateful), false if it references the same object (stateless)
051: */
052: public EJBLocalHomeInvocationHandler(final Integer embeddedID,
053: final String containerId, final String factoryName,
054: final boolean useID) {
055: super (embeddedID, containerId, factoryName, useID);
056: }
057:
058: /**
059: * Processes a method invocation on a proxy instance and returns the result.
060: * This method will be invoked on an invocation handler when a method is
061: * invoked on a proxy instance that it is associated with.
062: * @param proxy the proxy instance that the method was invoked on
063: * @param method the <code>Method</code> instance corresponding to the
064: * interface method invoked on the proxy instance. The declaring
065: * class of the <code>Method</code> object will be the interface
066: * that the method was declared in, which may be a superinterface of
067: * the proxy interface that the proxy class inherits the method
068: * through.
069: * @param args an array of objects containing the values of the arguments
070: * passed in the method invocation on the proxy instance, or
071: * <code>null</code> if interface method takes no arguments.
072: * Arguments of primitive types are wrapped in instances of the
073: * appropriate primitive wrapper class, such as
074: * <code>java.lang.Integer</code> or <code>java.lang.Boolean</code>.
075: * @return the value to return from the method invocation on the proxy
076: * instance.
077: * @throws Exception the exception to throw from the method invocation on
078: * the proxy instance.
079: */
080: @Override
081: public Object invoke(final Object proxy, final Method method,
082: final Object[] args) throws Exception {
083:
084: // Create ?
085: if (method != null) {
086: if (method.getName().startsWith("create")) {
087: // Return class (interface)
088: Class<?> itfClass = method.getReturnType();
089:
090: // Build handler
091: LocalCallInvocationHandler handler = new LocalCallInvocationHandler(
092: getEmbeddedID(), getContainerId(),
093: getFactoryName(), isUsingID());
094: // set the interface class
095: handler.setInterfaceClass(itfClass);
096:
097: // Get current classloader
098: ClassLoader classLoader = Thread.currentThread()
099: .getContextClassLoader();
100:
101: // Return proxy
102: Object beanProxy = Proxy.newProxyInstance(classLoader,
103: new Class[] { itfClass }, handler);
104:
105: // create the id for stateful bean
106: beanProxy.toString();
107:
108: // return the proxy built
109: return beanProxy;
110: }
111: }
112: // remove method ?
113: if (method.getName().equals("remove")) {
114: throw new RemoveException(
115: "Only 2.1 entity beans can use the remove(primary key) method.");
116: }
117: return super.invoke(proxy, method, args);
118: }
119:
120: }
|