Search in sources :

Example 56 with BeanContext

use of org.apache.openejb.BeanContext in project tomee by apache.

the class MdbPoolContainer method invoke.

public Object invoke(final Object instance, final Method method, final InterfaceType type, Object... args) throws SystemException, ApplicationException {
    if (args == null) {
        args = NO_ARGS;
    }
    // get the context data
    final ThreadContext callContext = ThreadContext.getThreadContext();
    final BeanContext deployInfo = callContext.getBeanContext();
    final MdbCallContext mdbCallContext = callContext.get(MdbCallContext.class);
    if (mdbCallContext == null) {
        throw new IllegalStateException("beforeDelivery was not called");
    }
    // verify the delivery method passed to beforeDeliver is the same method that was invoked
    if (!mdbCallContext.deliveryMethod.getName().equals(method.getName()) || !Arrays.deepEquals(mdbCallContext.deliveryMethod.getParameterTypes(), method.getParameterTypes())) {
        throw new IllegalStateException("Delivery method specified in beforeDelivery is not the delivery method called");
    }
    // remember the return value or exception so it can be logged
    Object returnValue = null;
    OpenEJBException openEjbException = null;
    final Operation oldOperation = callContext.getCurrentOperation();
    callContext.setCurrentOperation(type == InterfaceType.TIMEOUT ? Operation.TIMEOUT : Operation.BUSINESS);
    try {
        if (logger.isDebugEnabled()) {
            logger.info("invoking method " + method.getName() + " on " + deployInfo.getDeploymentID());
        }
        // determine the target method on the bean instance class
        final Method targetMethod = deployInfo.getMatchingBeanMethod(method);
        callContext.set(Method.class, targetMethod);
        // invoke the target method
        returnValue = _invoke(instance, targetMethod, args, deployInfo, type, mdbCallContext, callContext);
        return returnValue;
    } catch (final ApplicationException | SystemException e) {
        openEjbException = e;
        throw e;
    } finally {
        callContext.setCurrentOperation(oldOperation);
        // Log the invocation results
        if (logger.isDebugEnabled()) {
            if (openEjbException == null) {
                logger.debug("finished invoking method " + method.getName() + ". Return value:" + returnValue);
            } else {
                final Throwable exception = openEjbException.getRootCause() != null ? openEjbException.getRootCause() : openEjbException;
                logger.debug("finished invoking method " + method.getName() + " with exception " + exception);
            }
        }
    }
}
Also used : BeanContext(org.apache.openejb.BeanContext) OpenEJBException(org.apache.openejb.OpenEJBException) EjbTransactionUtil.handleApplicationException(org.apache.openejb.core.transaction.EjbTransactionUtil.handleApplicationException) ApplicationException(org.apache.openejb.ApplicationException) EjbTransactionUtil.handleSystemException(org.apache.openejb.core.transaction.EjbTransactionUtil.handleSystemException) SystemException(org.apache.openejb.SystemException) ThreadContext(org.apache.openejb.core.ThreadContext) Operation(org.apache.openejb.core.Operation) Method(java.lang.reflect.Method)

Example 57 with BeanContext

use of org.apache.openejb.BeanContext in project tomee by apache.

the class ManagedContainer method unregisterEntityManagers.

private void unregisterEntityManagers(final Instance instance, final ThreadContext callContext) {
    if (entityManagerRegistry == null) {
        return;
    }
    if (instance == null) {
        return;
    }
    final BeanContext beanContext = callContext.getBeanContext();
    // register them
    entityManagerRegistry.removeEntityManagers((String) beanContext.getDeploymentID(), instance.primaryKey);
}
Also used : BeanContext(org.apache.openejb.BeanContext)

Example 58 with BeanContext

use of org.apache.openejb.BeanContext in project tomee by apache.

the class ManagedContainer method removeEJBObject.

protected Object removeEJBObject(final BeanContext beanContext, final Object primKey, final Class callInterface, final Method callMethod, Object[] args, final InterfaceType interfaceType) throws OpenEJBException {
    if (primKey == null) {
        throw new NullPointerException("primKey is null");
    }
    final ThreadContext callContext = new ThreadContext(beanContext, primKey);
    final ThreadContext oldCallContext = ThreadContext.enter(callContext);
    try {
        // Security check
        final boolean internalRemove = BeanContext.Removable.class == callMethod.getDeclaringClass();
        if (!internalRemove) {
            checkAuthorization(callMethod, interfaceType);
        }
        // If a bean managed transaction is active, the bean can not be removed
        if (interfaceType.isComponent()) {
            final Instance instance = checkedOutInstances.get(primKey);
            /**
             * According to EJB 3.0 "4.4.4 Restrictions for Transactions" any remove methods
             * from home or component interfaces must not be allowed if the bean instance is
             * in a transaction.  Unfortunately, the Java EE 5 TCK has tests that ignore the
             * restrictions in 4.4.4 and expect beans in transactions can be removed via their
             * home or component interface.   The test to see if the bean instance implements
             * javax.ejb.SessionBean is a workaround for passing the TCK while the tests in
             * question can be challenged or the spec can be changed/updated.
             */
            if (instance != null && instance.bean instanceof SessionBean) {
                throw new ApplicationException(new RemoveException("A stateful EJB enrolled in a transaction can not be removed"));
            }
        }
        // Start transaction
        final TransactionPolicy txPolicy = EjbTransactionUtil.createTransactionPolicy(callContext.getBeanContext().getTransactionType(callMethod, interfaceType), callContext);
        Object returnValue = null;
        boolean retain = false;
        Instance instance = null;
        Method runMethod = null;
        try {
            // Obtain instance
            instance = obtainInstance(primKey, callContext);
            // Resume previous Bean transaction if there was one
            if (txPolicy instanceof BeanTransactionPolicy) {
                // Resume previous Bean transaction if there was one
                final SuspendedTransaction suspendedTransaction = instance.getBeanTransaction();
                if (suspendedTransaction != null) {
                    instance.setBeanTransaction(null);
                    final BeanTransactionPolicy beanTxEnv = (BeanTransactionPolicy) txPolicy;
                    beanTxEnv.resumeUserTransaction(suspendedTransaction);
                }
            }
            if (!internalRemove) {
                // Register the entity managers
                registerEntityManagers(instance, callContext);
                // Register for synchronization callbacks
                registerSessionSynchronization(instance, callContext);
                // Setup for remove invocation
                callContext.setCurrentOperation(Operation.REMOVE);
                callContext.setCurrentAllowedStates(null);
                callContext.setInvokedInterface(callInterface);
                runMethod = beanContext.getMatchingBeanMethod(callMethod);
                callContext.set(Method.class, runMethod);
                // Do not pass arguments on home.remove(remote) calls
                final Class<?> declaringClass = callMethod.getDeclaringClass();
                if (declaringClass.equals(EJBHome.class) || declaringClass.equals(EJBLocalHome.class)) {
                    args = new Object[] {};
                }
                // Initialize interceptor stack
                final List<InterceptorData> interceptors = beanContext.getMethodInterceptors(runMethod);
                final InterceptorStack interceptorStack = new InterceptorStack(instance.bean, runMethod, Operation.REMOVE, interceptors, instance.interceptors);
                // Invoke
                if (args == null) {
                    returnValue = interceptorStack.invoke();
                } else {
                    returnValue = interceptorStack.invoke(args);
                }
            }
        } catch (final InvalidateReferenceException e) {
            throw new ApplicationException(e.getRootCause());
        } catch (final Throwable e) {
            if (interfaceType.isBusiness()) {
                retain = beanContext.retainIfExeption(runMethod);
                handleException(callContext, txPolicy, e);
            } else {
                try {
                    handleException(callContext, txPolicy, e);
                } catch (final ApplicationException ae) {
                // Don't throw application exceptions for non-business interface removes
                }
            }
        } finally {
            if (!retain) {
                try {
                    callContext.setCurrentOperation(Operation.PRE_DESTROY);
                    final List<InterceptorData> callbackInterceptors = beanContext.getCallbackInterceptors();
                    final InterceptorStack interceptorStack = new InterceptorStack(instance.bean, null, Operation.PRE_DESTROY, callbackInterceptors, instance.interceptors);
                    interceptorStack.invoke();
                } catch (final Throwable callbackException) {
                    final String logMessage = "An unexpected exception occured while invoking the preDestroy method on the removed Stateful SessionBean instance; " + callbackException.getClass().getName() + " " + callbackException.getMessage();
                    /* [1] Log the exception or error */
                    logger.error(logMessage);
                } finally {
                    callContext.setCurrentOperation(Operation.REMOVE);
                }
                // todo destroy extended persistence contexts
                discardInstance(callContext);
            }
            // Commit transaction
            afterInvoke(callContext, txPolicy, instance);
        }
        return returnValue;
    } finally {
        ThreadContext.exit(oldCallContext);
    }
}
Also used : BeanTransactionPolicy(org.apache.openejb.core.transaction.BeanTransactionPolicy) SystemInstance(org.apache.openejb.loader.SystemInstance) EJBHome(javax.ejb.EJBHome) ThreadContext(org.apache.openejb.core.ThreadContext) JtaTransactionPolicy(org.apache.openejb.core.transaction.JtaTransactionPolicy) TransactionPolicy(org.apache.openejb.core.transaction.TransactionPolicy) BeanTransactionPolicy(org.apache.openejb.core.transaction.BeanTransactionPolicy) Method(java.lang.reflect.Method) SuspendedTransaction(org.apache.openejb.core.transaction.BeanTransactionPolicy.SuspendedTransaction) SessionBean(javax.ejb.SessionBean) EJBLocalHome(javax.ejb.EJBLocalHome) BeanContext(org.apache.openejb.BeanContext) InvalidateReferenceException(org.apache.openejb.InvalidateReferenceException) ApplicationException(org.apache.openejb.ApplicationException) RemoveException(javax.ejb.RemoveException) InterceptorData(org.apache.openejb.core.interceptor.InterceptorData) InterceptorStack(org.apache.openejb.core.interceptor.InterceptorStack)

Example 59 with BeanContext

use of org.apache.openejb.BeanContext in project tomee by apache.

the class ManagedContainer method deploy.

@Override
public synchronized void deploy(final BeanContext beanContext) throws OpenEJBException {
    final Map<Method, MethodType> methods = getLifecycleMethodsOfInterface(beanContext);
    deploymentsById.put(beanContext.getDeploymentID(), beanContext);
    beanContext.setContainer(this);
    final Data data = new Data(new Index<>(methods));
    beanContext.setContainerData(data);
    // Create stats interceptor
    if (StatsInterceptor.isStatsActivated()) {
        final StatsInterceptor stats = new StatsInterceptor(beanContext.getBeanClass());
        beanContext.addFirstSystemInterceptor(stats);
        final MBeanServer server = LocalMBeanServer.get();
        final ObjectNameBuilder jmxName = new ObjectNameBuilder("openejb.management");
        jmxName.set("J2EEServer", "openejb");
        jmxName.set("J2EEApplication", null);
        jmxName.set("EJBModule", beanContext.getModuleID());
        jmxName.set("StatelessSessionBean", beanContext.getEjbName());
        jmxName.set("j2eeType", "");
        jmxName.set("name", beanContext.getEjbName());
        // register the invocation stats interceptor
        try {
            final ObjectName objectName = jmxName.set("j2eeType", "Invocations").build();
            if (server.isRegistered(objectName)) {
                server.unregisterMBean(objectName);
            }
            server.registerMBean(new ManagedMBean(stats), objectName);
            data.jmxNames.add(objectName);
        } catch (final Exception e) {
            logger.error("Unable to register MBean ", e);
        }
    }
    try {
        final Context context = beanContext.getJndiEnc();
        context.bind("comp/EJBContext", sessionContext);
    } catch (final NamingException e) {
        throw new OpenEJBException("Failed to bind EJBContext", e);
    }
    beanContext.set(EJBContext.class, this.sessionContext);
}
Also used : SessionContext(javax.ejb.SessionContext) BeanContext(org.apache.openejb.BeanContext) Context(javax.naming.Context) EJBContext(javax.ejb.EJBContext) InstanceContext(org.apache.openejb.core.InstanceContext) ThreadContext(org.apache.openejb.core.ThreadContext) OpenEJBException(org.apache.openejb.OpenEJBException) StatsInterceptor(org.apache.openejb.monitoring.StatsInterceptor) InterceptorData(org.apache.openejb.core.interceptor.InterceptorData) Method(java.lang.reflect.Method) NamingException(javax.naming.NamingException) InvalidateReferenceException(org.apache.openejb.InvalidateReferenceException) EJBAccessException(javax.ejb.EJBAccessException) RemoveException(javax.ejb.RemoveException) OpenEJBException(org.apache.openejb.OpenEJBException) RemoteException(java.rmi.RemoteException) EJBException(javax.ejb.EJBException) SystemException(org.apache.openejb.SystemException) NoSuchObjectException(java.rmi.NoSuchObjectException) EntityManagerAlreadyRegisteredException(org.apache.openejb.persistence.EntityManagerAlreadyRegisteredException) ApplicationException(org.apache.openejb.ApplicationException) OpenEJBRuntimeException(org.apache.openejb.OpenEJBRuntimeException) ObjectName(javax.management.ObjectName) ObjectNameBuilder(org.apache.openejb.monitoring.ObjectNameBuilder) NamingException(javax.naming.NamingException) ManagedMBean(org.apache.openejb.monitoring.ManagedMBean) MBeanServer(javax.management.MBeanServer) LocalMBeanServer(org.apache.openejb.monitoring.LocalMBeanServer)

Example 60 with BeanContext

use of org.apache.openejb.BeanContext in project tomee by apache.

the class ManagedContainer method getLifecycleMethodsOfInterface.

private Map<Method, MethodType> getLifecycleMethodsOfInterface(final BeanContext beanContext) {
    final Map<Method, MethodType> methods = new HashMap<>();
    try {
        methods.put(BeanContext.Removable.class.getDeclaredMethod("$$remove"), MethodType.REMOVE);
    } catch (final NoSuchMethodException e) {
        throw new IllegalStateException("Internal code change: BeanContext.Removable.$$remove() method was deleted", e);
    }
    final List<Method> removeMethods = beanContext.getRemoveMethods();
    for (final Method removeMethod : removeMethods) {
        methods.put(removeMethod, MethodType.REMOVE);
        for (final Class businessLocal : beanContext.getBusinessLocalInterfaces()) {
            try {
                final Method method = businessLocal.getMethod(removeMethod.getName());
                methods.put(method, MethodType.REMOVE);
            } catch (final NoSuchMethodException ignore) {
            // no-op
            }
        }
        for (final Class businessRemote : beanContext.getBusinessRemoteInterfaces()) {
            try {
                final Method method = businessRemote.getMethod(removeMethod.getName());
                methods.put(method, MethodType.REMOVE);
            } catch (final NoSuchMethodException ignore) {
            // no-op
            }
        }
    }
    final Class legacyRemote = beanContext.getRemoteInterface();
    if (legacyRemote != null) {
        try {
            final Method method = legacyRemote.getMethod("remove");
            methods.put(method, MethodType.REMOVE);
        } catch (final NoSuchMethodException ignore) {
        // no-op
        }
    }
    final Class legacyLocal = beanContext.getLocalInterface();
    if (legacyLocal != null) {
        try {
            final Method method = legacyLocal.getMethod("remove");
            methods.put(method, MethodType.REMOVE);
        } catch (final NoSuchMethodException ignore) {
        // no-op
        }
    }
    final Class businessLocalHomeInterface = beanContext.getBusinessLocalInterface();
    if (businessLocalHomeInterface != null) {
        for (final Method method : BeanContext.BusinessLocalHome.class.getMethods()) {
            if (method.getName().startsWith("create")) {
                methods.put(method, MethodType.CREATE);
            } else if (method.getName().equals("remove")) {
                methods.put(method, MethodType.REMOVE);
            }
        }
    }
    final Class businessLocalBeanHomeInterface = beanContext.getBusinessLocalBeanInterface();
    if (businessLocalBeanHomeInterface != null) {
        for (final Method method : BeanContext.BusinessLocalBeanHome.class.getMethods()) {
            if (method.getName().startsWith("create")) {
                methods.put(method, MethodType.CREATE);
            } else if (method.getName().equals("remove")) {
                methods.put(method, MethodType.REMOVE);
            }
        }
    }
    final Class businessRemoteHomeInterface = beanContext.getBusinessRemoteInterface();
    if (businessRemoteHomeInterface != null) {
        for (final Method method : BeanContext.BusinessRemoteHome.class.getMethods()) {
            if (method.getName().startsWith("create")) {
                methods.put(method, MethodType.CREATE);
            } else if (method.getName().equals("remove")) {
                methods.put(method, MethodType.REMOVE);
            }
        }
    }
    final Class homeInterface = beanContext.getHomeInterface();
    if (homeInterface != null) {
        for (final Method method : homeInterface.getMethods()) {
            if (method.getName().startsWith("create")) {
                methods.put(method, MethodType.CREATE);
            } else if (method.getName().equals("remove")) {
                methods.put(method, MethodType.REMOVE);
            }
        }
    }
    final Class localHomeInterface = beanContext.getLocalHomeInterface();
    if (localHomeInterface != null) {
        for (final Method method : localHomeInterface.getMethods()) {
            if (method.getName().startsWith("create")) {
                methods.put(method, MethodType.CREATE);
            } else if (method.getName().equals("remove")) {
                methods.put(method, MethodType.REMOVE);
            }
        }
    }
    return methods;
}
Also used : BeanContext(org.apache.openejb.BeanContext) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) HashMap(java.util.HashMap) Method(java.lang.reflect.Method)

Aggregations

BeanContext (org.apache.openejb.BeanContext)198 OpenEJBException (org.apache.openejb.OpenEJBException)40 ThreadContext (org.apache.openejb.core.ThreadContext)40 Method (java.lang.reflect.Method)38 ContainerSystem (org.apache.openejb.spi.ContainerSystem)28 ArrayList (java.util.ArrayList)27 AppContext (org.apache.openejb.AppContext)26 TransactionPolicy (org.apache.openejb.core.transaction.TransactionPolicy)26 NamingException (javax.naming.NamingException)24 InterceptorData (org.apache.openejb.core.interceptor.InterceptorData)23 Context (javax.naming.Context)22 ApplicationException (org.apache.openejb.ApplicationException)20 HashMap (java.util.HashMap)19 EJBLocalObject (javax.ejb.EJBLocalObject)18 EJBObject (javax.ejb.EJBObject)18 SystemException (org.apache.openejb.SystemException)18 OpenEJBRuntimeException (org.apache.openejb.OpenEJBRuntimeException)17 ModuleContext (org.apache.openejb.ModuleContext)16 EjbTransactionUtil.createTransactionPolicy (org.apache.openejb.core.transaction.EjbTransactionUtil.createTransactionPolicy)16 FinderException (javax.ejb.FinderException)14