001    /*
002     * Copyright (C) The Apache Software Foundation. All rights reserved.
003     *
004     * This software is published under the terms of the Apache Software License
005     * version 1.1, a copy of which has been included with this distribution in
006     * the LICENSE file.
007     * 
008     * $Id: XACapableAdapter.java 155459 2005-02-26 13:24:44Z dirkv $
009     */
010    package org.apache.commons.messenger;
011    
012    import javax.jms.Session;
013    import javax.jms.XASession;
014    import javax.transaction.Transaction;
015    import javax.transaction.xa.XAResource;
016    
017    import org.apache.commons.logging.Log;
018    import org.apache.commons.logging.LogFactory;
019    
020    /** 
021     * <p><code>XACapableAdapter</code> is an adapter that implements
022     * XACapable for a given Messenger 
023     * </p>
024     *
025     * @author <a href="mailto:jstrachan@apache.org">James Strachan</a>
026     * @version $Revision: 155459 $
027     */
028    public class XACapableAdapter implements XACapable {
029    
030        /** Logger */
031        private static final Log log = LogFactory.getLog(XACapableAdapter.class);
032        
033            private Messenger messenger;
034            
035            public XACapableAdapter(Messenger messenger) {
036                    this.messenger = messenger;
037            }
038        
039        // XACapable interface
040        //-------------------------------------------------------------------------
041            
042            public void enlistResources(Transaction transaction) throws Exception {
043                    XAResource resource = getXAResource();
044                    if (resource != null) {
045                            transaction.enlistResource(resource);
046                    }
047            }
048    
049            public void delistResources(Transaction transaction, int flag) throws Exception {
050                    XAResource resource = getXAResource();
051                    if (resource != null) {
052                            transaction.delistResource(resource, flag);
053                    }
054            }
055    
056        // Implementation methods
057        //-------------------------------------------------------------------------
058        
059        /**
060         * @return the XAResource associated with this Messenger if one exists
061         */
062            protected XAResource getXAResource() throws Exception {
063                    Session session = messenger.getSession();
064                    if (session instanceof XASession) {
065                            XASession xaSession = (XASession) session;
066                            return xaSession.getXAResource();
067                    }
068                    else {
069                            log.warn(
070                                    "Messenger: " + messenger 
071                                    + " cannot take part in an XA transaction as it does not have an XASession."
072                                    + " session: " + session 
073                            );
074                    }
075                    return null;
076            }
077    }