Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * JBoss, Home of Professional Open Source.
   * Copyright (c) 2011, Red Hat, Inc., and individual contributors
   * as indicated by the @author tags. See the copyright.txt file in the
   * distribution for a full listing of individual contributors.
   *
   * This is free software; you can redistribute it and/or modify it
   * under the terms of the GNU Lesser General Public License as
   * published by the Free Software Foundation; either version 2.1 of
  * the License, or (at your option) any later version.
  *
  * This software is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this software; if not, write to the Free
  * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
  */
 package org.jboss.as.ejb3.inflow;
 
 
 import static java.security.AccessController.doPrivileged;
 import static org.jboss.as.ejb3.inflow.ContextClassLoaderActions.contextClassLoader;

Author(s):
Carlo de Wolf
 
     private final MessageEndpointService service;
     private final Object delegate;
     private final XAResource xaRes;
     private final AtomicBoolean released = new AtomicBoolean(false);
 
     private Transaction currentTx;
     private ClassLoader previousClassLoader;
     private Transaction previousTx;
 
     MessageEndpointInvocationHandler(final MessageEndpointService servicefinal Object delegatefinal XAResource xaResource) {
         this. = service;
         this. = delegate;
         this. = xaResource;
     }
 
     @Override
     public void afterDelivery() throws ResourceException {
         final TransactionManager tm = getTransactionManager();
         try {
             if ( != null) {
                 if (.getStatus() == .)
                     tm.rollback();
                 else
                     tm.commit();
                  = null;
             }
             if ( != null) {
                 tm.resume();
                  = null;
             }
         } catch (InvalidTransactionException e) {
             throw new LocalTransactionException(e);
         } catch (HeuristicMixedException e) {
             throw new LocalTransactionException(e);
         } catch (SystemException e) {
             throw new LocalTransactionException(e);
         } catch (HeuristicRollbackException e) {
             throw new LocalTransactionException(e);
         } catch (RollbackException e) {
             throw new LocalTransactionException(e);
         } finally {
              = null;
         }
     }
 
     @Override
     public void beforeDelivery(Method methodthrows NoSuchMethodExceptionResourceException {
         // JCA 1.6 FR 13.5.6
         // The application server must set the thread context class loader to the endpoint
         // application class loader during the beforeDelivery call.
        try {
            final TransactionManager tm = getTransactionManager();
            // TODO: in violation of JCA 1.6 FR 13.5.9?
             = tm.suspend();
            boolean isTransacted = .isDeliveryTransacted(method);
            if (isTransacted) {
                tm.begin();
                 = tm.getTransaction();
                if ( != null)
                    .enlistResource();
            }
        }
        catch(Throwable t) {
            throw new ApplicationServerInternalException(t);
        }
    }
    @Override
    protected boolean doEquals(Object obj) {
        if (!(obj instanceof MessageEndpointInvocationHandler))
            return false;
        return .equals(((MessageEndpointInvocationHandlerobj).);
    }
    @Override
    protected Object doInvoke(Object proxyMethod methodObject[] argsthrows Throwable {
        // Are we still usable?
        if (.get())
            throw new UnavailableException("Message endpoint " + this + " has already been released");
        // TODO: check for concurrent invocation
        if (method.getDeclaringClass().equals(MessageEndpoint.class))
            return handle(methodargs);
        // TODO: Option A
        try {
            return method.invoke(args);
        }
        catch (InvocationTargetException e) {
            throw e.getCause();
        }
    }
    @Override
    public int hashCode() {
        return .hashCode();
    }
    protected final ClassLoader getApplicationClassLoader() {
    }
    protected final TransactionManager getTransactionManager() {
        return .getTransactionManager();
    }
    @Override
    public void release() {
        if (.getAndSet(true))
            throw new IllegalStateException("Message endpoint " + this + " has already been released");
        // TODO: tidy up outstanding delivery
        .release();
    }
New to GrepCode? Check out our FAQ X