001    /*
002    @license.text@
003     */
004    package biz.hammurapi.jms;
005    
006    import javax.jms.JMSException;
007    import javax.jms.QueueConnection;
008    import javax.jms.QueueConnectionFactory;
009    import javax.xml.transform.TransformerException;
010    
011    import org.apache.xpath.CachedXPathAPI;
012    import org.w3c.dom.Element;
013    import org.w3c.dom.Node;
014    
015    import biz.hammurapi.config.ConfigurationException;
016    import biz.hammurapi.config.Context;
017    import biz.hammurapi.config.JndiWrapper;
018    import biz.hammurapi.xml.dom.AbstractDomObject;
019    
020    
021    /**
022     * This class reads configuration from XML, looks up JMS queue connection factory in JNDI and obtains connection from the factory.
023     * Configuration:<BR/>
024     * Attribute: <code>jndi-name</code><BR>
025     * Nested elements: <code>environment-property</code> with attribute <code>name</code>, <code>user</code> and <code>password</code> elements for authentication.
026     * Example:<PRE><queueConnection type="biz.hammurapi.jms.QueueConnectionWrapper" jndi-name="QueueConnectionFactory"> 
027                <environment-property name="java.naming.factory.initial"><I>factory class</I></environment-property>
028                <environment-property name="java.naming.provider.url"><I>provider url</I></environment-property>
029                <user>usr</user>
030                <password>pwd</password>
031            </queueConnection>
032            </PRE>
033     * Environment properties are passed to the constructor of initial JNDI context.
034     * @author Pavel Vlasov
035     * @revision $Revision$
036     */
037    public class QueueConnectionWrapper extends JndiWrapper {
038    
039            private QueueConnection connection;
040    
041            /**
042             * Returns queue connection.
043             */
044            public Object getMaster() {
045                    return connection;
046            }
047    
048            /**
049             * Obstains connection factory from JNDI, gets connection and starts it.
050             */
051            public void start() throws ConfigurationException {             
052                    super.start();
053                    try {
054                            QueueConnectionFactory connectionFactory = (QueueConnectionFactory) super.getMaster();
055                                    
056                            if (user==null) {
057                                    connection = connectionFactory.createQueueConnection(); 
058                            } else {
059                                    connection = connectionFactory.createQueueConnection(user, password);
060                            }
061                                    
062                            connection.start();
063                    } catch (JMSException e) {
064                            throw new ConfigurationException("Could not obtain or start connection: "+e, e);
065                    }
066            }
067    
068            /**
069             * Stops connection.
070             */
071            public void stop() throws ConfigurationException {
072                    if (connection!=null) {
073                            try {
074                                    connection.stop();
075                                    connection=null;
076                            } catch (JMSException e) {
077                                    throw new ConfigurationException("Could not stop connection: "+e, e);
078                            }
079                    }
080            }
081    
082            public void setOwner(Object owner) {
083                    // Nothing
084            }
085            
086            private String user;
087            private String password;
088    
089            public void configure(Node configNode, Context context) throws ConfigurationException {
090                    super.configure(configNode, context);
091                    CachedXPathAPI cxpa=new CachedXPathAPI();
092                    
093                    try {
094                            user = AbstractDomObject.getElementText((Element) configNode, "user", cxpa);
095                            if (user!=null) {
096                                    password=AbstractDomObject.getElementText((Element) configNode, "password", cxpa);
097                            }
098                    } catch (TransformerException e) {
099                            throw new ConfigurationException("Could not read user name and password: "+e, e);
100                    }               
101            }
102    
103    }