001: /*
002: * JBoss, Home of Professional Open Source.
003: * Copyright 2006, Red Hat Middleware LLC, and individual contributors
004: * as indicated by the @author tags. See the copyright.txt file in the
005: * distribution for a full listing of individual contributors.
006: *
007: * This is free software; you can redistribute it and/or modify it
008: * under the terms of the GNU Lesser General Public License as
009: * published by the Free Software Foundation; either version 2.1 of
010: * the License, or (at your option) any later version.
011: *
012: * This software is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public
018: * License along with this software; if not, write to the Free
019: * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
021: */
022: package org.jboss.proxy.ejb;
023:
024: import java.io.Externalizable;
025: import java.lang.reflect.Method;
026: import javax.ejb.EJBHome;
027: import javax.ejb.EJBObject;
028: import javax.naming.InitialContext;
029: import javax.naming.NamingException;
030:
031: import org.jboss.invocation.Invocation;
032: import org.jboss.invocation.InvocationKey;
033: import org.jboss.invocation.InvocationContext;
034: import org.jboss.proxy.Interceptor;
035:
036: /**
037: * The base EJB behavior interceptor.
038: *
039: * @author <a href="mailto:marc.fleury@jboss.org">Marc Fleury</a>
040: * @author Scott.Stark@jboss.org
041: * @version $Revision: 57209 $
042: */
043: public abstract class GenericEJBInterceptor extends Interceptor
044: implements Externalizable {
045: /** Serial Version Identifier. @since 1.3 */
046: private static final long serialVersionUID = 3844706474734439975L;
047:
048: // Static method references
049: protected static final Method TO_STRING;
050: protected static final Method HASH_CODE;
051: protected static final Method EQUALS;
052: protected static final Method GET_PRIMARY_KEY;
053: protected static final Method GET_HANDLE;
054: protected static final Method GET_EJB_HOME;
055: protected static final Method IS_IDENTICAL;
056:
057: /** Initialize the static variables. */
058: static {
059: try {
060: // Get the methods from Object
061: Class[] empty = {};
062: Class type = Object.class;
063:
064: TO_STRING = type.getMethod("toString", empty);
065: HASH_CODE = type.getMethod("hashCode", empty);
066: EQUALS = type.getMethod("equals", new Class[] { type });
067:
068: // Get the methods from EJBObject
069: type = EJBObject.class;
070:
071: GET_PRIMARY_KEY = type.getMethod("getPrimaryKey", empty);
072: GET_HANDLE = type.getMethod("getHandle", empty);
073: GET_EJB_HOME = type.getMethod("getEJBHome", empty);
074: IS_IDENTICAL = type.getMethod("isIdentical",
075: new Class[] { type });
076: } catch (Exception e) {
077: e.printStackTrace();
078: throw new ExceptionInInitializerError(e);
079: }
080: }
081:
082: /**
083: * A public, no-args constructor for externalization to work.
084: */
085: public GenericEJBInterceptor() {
086: // For externalization to work
087: }
088:
089: protected EJBHome getEJBHome(Invocation invocation)
090: throws NamingException {
091: // Look to the context for the home
092: InvocationContext ctx = invocation.getInvocationContext();
093: EJBHome home = (EJBHome) ctx.getValue(InvocationKey.EJB_HOME);
094: // If there is no home use the legacy lookup method
095: if (home == null) {
096: String jndiName = (String) ctx
097: .getValue(InvocationKey.JNDI_NAME);
098: InitialContext iniCtx = new InitialContext();
099: home = (EJBHome) iniCtx.lookup(jndiName);
100: }
101: return home;
102: }
103: }
|