001    /**
002     *
003     * Copyright 2004 Hiram Chirino
004     *
005     * Licensed under the Apache License, Version 2.0 (the "License");
006     * you may not use this file except in compliance with the License.
007     * You may obtain a copy of the License at
008     *
009     * http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     *
017     **/
018    package org.activemq.ra;
019    
020    import java.io.PrintWriter;
021    import java.util.Iterator;
022    import java.util.Set;
023    
024    import javax.jms.JMSException;
025    import javax.resource.ResourceException;
026    import javax.resource.spi.ConnectionManager;
027    import javax.resource.spi.ConnectionRequestInfo;
028    import javax.resource.spi.ManagedConnection;
029    import javax.resource.spi.ManagedConnectionFactory;
030    import javax.resource.spi.ResourceAdapter;
031    import javax.resource.spi.ResourceAdapterAssociation;
032    import javax.security.auth.Subject;
033    
034    /**
035     * @version $Revision: 1.1.1.1 $
036     * 
037     * @todo Must override equals and hashCode (JCA spec 16.4) 
038     */
039    public class ActiveMQManagedConnectionFactory implements
040            ManagedConnectionFactory, ResourceAdapterAssociation {
041    
042        private ActiveMQResourceAdapter adapter;
043        private PrintWriter logWriter;
044        private ActiveMQConnectionRequestInfo info = new ActiveMQConnectionRequestInfo();
045        
046        public void setResourceAdapter(ResourceAdapter adapter) throws ResourceException {
047            this.adapter = (ActiveMQResourceAdapter) adapter;
048            ActiveMQConnectionRequestInfo baseInfo = this.adapter.getInfo().copy();
049            if( info.getClientid()==null ) 
050                info.setClientid(baseInfo.getClientid());
051            if( info.getPassword()==null )
052                info.setPassword(baseInfo.getPassword());
053            if( info.getServerUrl()==null )
054                info.setServerUrl(baseInfo.getServerUrl());
055            if( info.getUseInboundSession()==null )
056                info.setUseInboundSession(baseInfo.getUseInboundSession());
057            if( info.getUserName()==null )
058                info.setUserName(baseInfo.getUserName());
059        }
060    
061        public ResourceAdapter getResourceAdapter() {
062            return adapter;
063        }
064    
065        /**
066         * @see javax.resource.spi.ManagedConnectionFactory#createConnectionFactory(javax.resource.spi.ConnectionManager)
067         */
068        public Object createConnectionFactory(ConnectionManager manager) throws ResourceException {
069            return new ActiveMQConnectionFactory(this, manager, info);
070        }
071    
072        /**
073         * This is used when not running in an app server.  For now we are creating a
074         * ConnectionFactory that has our SimpleConnectionManager implementation but
075         * it may be a better idea to not support this.  The JMS api will have many quirks
076         * the user may not expect when running through the resource adapter.
077         *
078         * @see javax.resource.spi.ManagedConnectionFactory#createConnectionFactory()
079         */
080        public Object createConnectionFactory() throws ResourceException {
081            return new ActiveMQConnectionFactory(this, new SimpleConnectionManager(), info);
082        }
083    
084        /**
085         * @see javax.resource.spi.ManagedConnectionFactory#createManagedConnection(javax.security.auth.Subject,
086         *      javax.resource.spi.ConnectionRequestInfo)
087         */
088        public ManagedConnection createManagedConnection(Subject subject, ConnectionRequestInfo info) throws ResourceException {
089            try {
090                ActiveMQConnectionRequestInfo amqInfo = (ActiveMQConnectionRequestInfo)info;
091                return new ActiveMQManagedConnection(subject, adapter.makeConnection(amqInfo), amqInfo);
092            } catch (JMSException e) {
093                throw new ResourceException("Could not create connection.", e);
094            }
095        }
096    
097        /**
098         * @see javax.resource.spi.ManagedConnectionFactory#matchManagedConnections(java.util.Set,
099                *      javax.security.auth.Subject,
100                *      javax.resource.spi.ConnectionRequestInfo)
101         */
102        public ManagedConnection matchManagedConnections(Set connections, Subject subject, ConnectionRequestInfo info) throws ResourceException {
103            Iterator iterator = connections.iterator();
104            while (iterator.hasNext()) {
105                ActiveMQManagedConnection c = (ActiveMQManagedConnection) iterator.next();
106                if (c.matches(subject, info)) {
107                    try {
108                        c.associate(subject, (ActiveMQConnectionRequestInfo) info);
109                        return c;
110                    } catch (JMSException e) {
111                        throw new ResourceException(e);
112                    }
113                }
114            }
115            return null;
116        }
117    
118        /**
119         * @see javax.resource.spi.ManagedConnectionFactory#setLogWriter(java.io.PrintWriter)
120         */
121        public void setLogWriter(PrintWriter logWriter) throws ResourceException {
122            this.logWriter = logWriter;
123        }
124    
125        /**
126         * @see javax.resource.spi.ManagedConnectionFactory#getLogWriter()
127         */
128        public PrintWriter getLogWriter() throws ResourceException {
129            return logWriter;
130        }
131    
132        ///////////////////////////////////////////////////////////////////////////
133        //
134        // Bean setters and getters.
135        //
136        ///////////////////////////////////////////////////////////////////////////
137        
138        public String getClientid() {
139            return info.getClientid();
140        }
141    
142        public String getPassword() {
143            return info.getPassword();
144        }
145    
146        public String getServerUrl() {
147            return info.getServerUrl();
148        }
149    
150        public String getUserName() {
151            return info.getUserName();
152        }
153    
154        public void setClientid(String clientid) {
155            info.setClientid(clientid);
156        }
157    
158        public void setPassword(String password) {
159            info.setPassword(password);
160        }
161    
162        public void setServerUrl(String url) {
163            info.setServerUrl(url);
164        }
165    
166        public void setUserName(String userid) {
167            info.setUserName(userid);
168        }
169    
170        public Boolean getUseInboundSession() {
171            return info.getUseInboundSession();
172        }
173    
174        public void setUseInboundSession(Boolean useInboundSession) {
175            info.setUseInboundSession(useInboundSession);
176        }
177    }