You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by nm...@apache.org on 2008/01/05 17:58:57 UTC

svn commit: r609175 - in /activemq/activemq-cpp/trunk/src: main/ main/activemq/cmsutil/ test/ test/activemq/cmsutil/

Author: nmittler
Date: Sat Jan  5 08:58:56 2008
New Revision: 609175

URL: http://svn.apache.org/viewvc?rev=609175&view=rev
Log:
AMQCPP-152 - Adding classes for support of CmsTemplate

Added:
    activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/
    activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/CmsAccessor.h
    activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/CmsDestinationAccessor.h
    activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/DestinationResolver.h
    activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/DynamicDestinationResolver.cpp
    activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/DynamicDestinationResolver.h
    activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/ResourceLifecycleManager.cpp
    activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/ResourceLifecycleManager.h
    activemq/activemq-cpp/trunk/src/test/activemq/cmsutil/
    activemq/activemq-cpp/trunk/src/test/activemq/cmsutil/DummySession.h
    activemq/activemq-cpp/trunk/src/test/activemq/cmsutil/DynamicDestinationResolverTest.cpp
    activemq/activemq-cpp/trunk/src/test/activemq/cmsutil/DynamicDestinationResolverTest.h
Modified:
    activemq/activemq-cpp/trunk/src/main/Makefile.am
    activemq/activemq-cpp/trunk/src/test/Makefile.am

Modified: activemq/activemq-cpp/trunk/src/main/Makefile.am
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/main/Makefile.am?rev=609175&r1=609174&r2=609175&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/src/main/Makefile.am (original)
+++ activemq/activemq-cpp/trunk/src/main/Makefile.am Sat Jan  5 08:58:56 2008
@@ -22,6 +22,8 @@
     activemq/util/PrimitiveMap.cpp \
     activemq/util/LongSequenceGenerator.cpp \
     activemq/util/URISupport.cpp \
+    activemq/cmsutil/DynamicDestinationResolver.cpp \
+    activemq/cmsutil/ResourceLifecycleManager.cpp \
     activemq/core/ActiveMQConsumer.cpp \
     activemq/core/ActiveMQConnection.cpp \
     activemq/core/ActiveMQSession.cpp \
@@ -87,6 +89,11 @@
     activemq/core/ActiveMQSessionExecutor.h \
     activemq/core/DispatchData.h \
     activemq/core/Dispatcher.h \
+    activemq/cmsutil/CmsAccessor.h \
+    activemq/cmsutil/CmsDestinationAccessor.h \
+    activemq/cmsutil/DestinationResolver.h \
+    activemq/cmsutil/DynamicDestinationResolver.h \
+    activemq/cmsutil/ResourceLifecycleManager.h \
     activemq/support/LibraryInit.h \
     activemq/support/InitDirector.h \
     activemq/io/LoggingInputStream.h \

Added: activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/CmsAccessor.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/CmsAccessor.h?rev=609175&view=auto
==============================================================================
--- activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/CmsAccessor.h (added)
+++ activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/CmsAccessor.h Sat Jan  5 08:58:56 2008
@@ -0,0 +1,153 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef _ACTIVEMQ_CMSUTIL_CMSACCESSOR_H_
+#define _ACTIVEMQ_CMSUTIL_CMSACCESSOR_H_
+
+#include <cms/ConnectionFactory.h>
+
+namespace activemq {
+namespace cmsutil {
+
+    /**
+     * Base class for {@link activemq.cms.CmsTemplate} and other
+     * CMS-accessing gateway helpers, defining common properties such as the
+     * CMS {@link ConnectionFactory} to operate on. The subclass
+     * {@link activemq.cms.CmsDestinationAccessor}
+     * adds further, destination-related properties.
+     *
+     * <p>Not intended to be used directly.
+     * 
+     * @see activemq.cms.CmsDestinationAccessor
+     * @see activemq.cms.CmsTemplate
+     */
+    class CmsAccessor {
+    
+    private:
+    
+        cms::ConnectionFactory* connectionFactory;
+    
+        bool sessionTransacted;
+    
+        int sessionAcknowledgeMode;
+    
+    public:
+        
+        CmsAccessor() {
+            sessionTransacted = false;
+            sessionAcknowledgeMode = cms::Session::AUTO_ACKNOWLEDGE;
+        }
+        
+        virtual ~CmsAccessor() {            
+        }
+    
+        /**
+         * Set the ConnectionFactory to use for obtaining CMS Connections.
+         */
+        virtual void setConnectionFactory(ConnectionFactory* connectionFactory) {
+            this->connectionFactory = connectionFactory;
+        }
+    
+        /**
+         * Return the ConnectionFactory that this accessor uses for
+         * obtaining CMS Connections.
+         */
+        virtual const ConnectionFactory* getConnectionFactory() const {
+            return this->connectionFactory;
+        }
+    
+        /**
+         * Return the ConnectionFactory that this accessor uses for
+         * obtaining CMS Connections.
+         */
+        virtual ConnectionFactory* getConnectionFactory() {
+            return this->connectionFactory;
+        }
+    
+        /**
+         * Set the transaction mode that is used when creating a CMS Session.
+         * Default is "false".
+         * 
+         * @param sessionTransacted the transaction mode
+         */
+        virtual void setSessionTransacted(bool sessionTransacted) {
+            this->sessionTransacted = sessionTransacted;
+        }
+    
+        /**
+         * Return whether the CMS sessions used by this
+         * accessor are supposed to be transacted.
+         * @return <code>true</code> if the CMS Sessions used are transacted
+         * @see #setSessionTransacted(bool)
+         */
+        virtual bool isSessionTransacted() const {
+            return this->sessionTransacted;
+        }
+    
+        /**
+         * Set the CMS acknowledgement mode that is used when creating a CMS
+         * Session to send a message.
+         * <p>Default is <code>AUTO_ACKNOWLEDGE</code>.
+         * @param sessionAcknowledgeMode the acknowledgement mode
+         */
+        virtual void setSessionAcknowledgeMode(int sessionAcknowledgeMode) {
+            this->sessionAcknowledgeMode = sessionAcknowledgeMode;
+        }
+    
+        /**
+         * Return the acknowledgement mode for CMS sessions.
+         * @return the acknowledgement mode applied by this accessor
+         */
+        virtual int getSessionAcknowledgeMode() const {
+            return this->sessionAcknowledgeMode;
+        }
+    
+    protected:
+    
+        /**
+         * Create a CMS Connection via this template's ConnectionFactory.
+         * @return the new CMS Connection
+         * @throws cms::CMSException if thrown by CMS API methods
+         */
+        virtual cms::Connection* createConnection() throw (cms::CMSException) {
+            return getConnectionFactory()->createConnection();
+        }
+    
+        /**
+         * Create a CMS Session for the given Connection.
+         * @param con the CMS Connection to create a Session for
+         * @return the new CMS Session
+         * @throws cms::CMSException if thrown by CMS API methods
+         */
+        virtual cms::Session* createSession(cms::Connection* con) throw (cms::CMSException) {
+            return con->createSession(isSessionTransacted(), getSessionAcknowledgeMode());
+        }
+    
+        /**
+         * Determine whether the given Session is in client acknowledge mode.
+         * @param session the CMS Session to check
+         * @return whether the given Session is in client acknowledge mode
+         * @throws cms::CMSException if thrown by CMS API methods
+         */
+        virtual bool isClientAcknowledge(cms::Session* session) throws JMSException {
+            return (session.getAcknowledgeMode() == Session.CLIENT_ACKNOWLEDGE);
+        }
+    
+    };
+
+}}
+
+#endif /* _ACTIVEMQ_CMSUTIL_CMSACCESSOR_H_ */

Added: activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/CmsDestinationAccessor.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/CmsDestinationAccessor.h?rev=609175&view=auto
==============================================================================
--- activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/CmsDestinationAccessor.h (added)
+++ activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/CmsDestinationAccessor.h Sat Jan  5 08:58:56 2008
@@ -0,0 +1,105 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef _ACTIVEMQ_CMSUTIL_CMSDESTINATIONACCESSOR_H_
+#define _ACTIVEMQ_CMSUTIL_CMSDESTINATIONACCESSOR_H_
+
+#include <activemq/cmsutil/CmsAccessor.h>
+
+namespace activemq {
+namespace cmsutil {
+
+    /**
+     * Extends the <code>CmsAccessor</code> to add support for resolving destination names.
+     * 
+     * <p>Not intended to be used directly.
+     * 
+     * @see CmsTemplate
+     * @see CmsAccessor
+     */
+    class CmsDestinationAccessor : public CmsAccessor {
+    
+    private:
+        
+        /**
+         * The default destination resolver.
+         */
+        DynamicDestinationResolver defaultDestinationResolver;
+        
+        /**
+         * The destination resolver to use.
+         */
+        DestinationResolver* destinationResolver;
+    
+        /**
+         * Determines whether to use topics or queues by default.
+         */
+        bool pubSubDomain;
+    
+    public:
+        
+        CmsDestinationAccessor() {
+            pubSubDomain = false;             
+            destinationResolver = &defaultDestinationResolver;
+        }
+        
+        virtual ~CmsDestinationAccessor() {            
+        }
+        
+        virtual bool isPubSubDomain() const {
+            return this->pubSubDomain;
+        }
+        
+        virtual void setPubSubDomain( bool pubSubDomain ) {
+            this->pubSubDomain = pubSubDomain;
+        }
+    
+        virtual DestinationResolver* getDestinationResolver() {
+            return destinationResolver;
+        }
+        
+        virtual const DestinationResolver* getDestinationResolver() const {
+            return destinationResolver;
+        }
+        
+        virtual void setDestinationResolver( DestinationResolver* destRes ) {
+            this->destinationResolver = destRes;
+        }
+        
+    protected:
+        
+        /**
+         * Resolves the destination via the <code>DestinationResolver</code>.
+         * @param session
+         *      the session
+         * @param destName
+         *      the name of the destination.
+         * @return the destination
+         * @throws cms::CMSException if resolution failed.
+         */
+        virtual cms::Destination* resolveDestinationName( 
+                cms::Session* session, 
+                const std::string& destName ) throws (cms::CMSException) {
+            
+            getDestinationResolver().resolveDestinationName(session, 
+                    destName, 
+                    isPubSubDomain());
+        }
+    };
+
+}}
+
+#endif /* _ACTIVEMQ_CMSUTIL_CMSDESTINATIONACCESSOR_H_ */

Added: activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/DestinationResolver.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/DestinationResolver.h?rev=609175&view=auto
==============================================================================
--- activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/DestinationResolver.h (added)
+++ activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/DestinationResolver.h Sat Jan  5 08:58:56 2008
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef _ACTIVEMQ_CMSUTIL_DESTINATIONRESOLVER_H_
+#define _ACTIVEMQ_CMSUTIL_DESTINATIONRESOLVER_H_
+
+#include <cms/Session.h>
+
+namespace activemq {
+namespace cmsutil {
+
+    // Forward declarations.
+    class ResourceLifecycleManager;
+    
+    /**
+     * Resolves a CMS destination name to a <code>Destination</code>.
+     */
+    class DestinationResolver {
+    
+    public:
+    
+        virtual ~DestinationResolver() {}
+    
+        /**
+         * Sets the <code>ResourceLifecycleManager</code> to be used for
+         * any allocated resources.
+         * 
+         * @param mgr
+         *      the resource lifecycle manager.
+         */
+        virtual void setResourceLifecycleManager( ResourceLifecycleManager* mgr) = 0;
+        
+        /**
+         * Resolves the given name to a destination.  If 
+         * <code>pubSubDomain</code> is true, a topic will be returned, 
+         * otherwise a queue will be returned.
+         * 
+         * @param session 
+         *      the session for which to retrieve resolve the 
+         *      destination.
+         * @param destName 
+         *      the name to be resolved.
+         * @param pubSubDomain 
+         *      If true, the name will be resolved to a Topic,
+         *      otherwise a Queue.
+         * @return the resolved destination
+         * @throws cms::CMSException if resolution failed.
+         */
+        virtual cms::Destination* resolveDestinationName(
+                cms::Session* session,
+                const std::string& destName,
+                bool pubSubDomain ) throw (cms::CMSException) = 0;
+    };
+
+}}
+
+#endif /* _ACTIVEMQ_CMSUTIL_DESTINATIONRESOLVER_H_ */

Added: activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/DynamicDestinationResolver.cpp
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/DynamicDestinationResolver.cpp?rev=609175&view=auto
==============================================================================
--- activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/DynamicDestinationResolver.cpp (added)
+++ activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/DynamicDestinationResolver.cpp Sat Jan  5 08:58:56 2008
@@ -0,0 +1,103 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "DynamicDestinationResolver.h"
+#include "ResourceLifecycleManager.h"
+
+using namespace activemq::cmsutil;
+using namespace decaf::util;
+using namespace std;
+
+////////////////////////////////////////////////////////////////////////////////
+cms::Topic* DynamicDestinationResolver::SessionResolver::getTopic(
+        const std::string& topicName ) throw (cms::CMSException) {
+
+    cms::Topic* topic = NULL;
+    try {
+        
+        // See if we already have a topic with this name.
+        topic = topicMap.getValue(topicName);
+        
+    } catch (decaf::lang::exceptions::NoSuchElementException& ex) {
+        
+        // Create a new topic.
+        topic = session->createTopic(topicName);
+        
+        // Add the topic to the lifecycle manager.
+        resourceLifecycleManager->addDestination(topic);
+        
+        // Add the topic to the map.
+        topicMap.setValue(topicName, topic);
+    }
+    return topic;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+cms::Queue* DynamicDestinationResolver::SessionResolver::getQueue(
+        const std::string& queueName) throw (cms::CMSException) {
+
+    cms::Queue* queue = NULL;
+    try {
+        
+        // See if we already have a queue with this name.
+        queue = queueMap.getValue(queueName);
+        
+    } catch (decaf::lang::exceptions::NoSuchElementException& ex) {
+        
+        // Create a new queue.
+        queue = session->createQueue(queueName);
+        
+        // Add the queue to the lifecycle manager.
+        resourceLifecycleManager->addDestination(queue);
+        
+        // Add the queue to the map.
+        queueMap.setValue(queueName, queue);
+    }
+    return queue;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+DynamicDestinationResolver::~DynamicDestinationResolver() {
+    
+    // Destroy the session resolvers.
+    vector<SessionResolver*> r = sessionResolverMap.getValues();
+    for( size_t ix=0; ix<r.size(); ++ix ) {
+        delete r[ix];
+    }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+cms::Destination* DynamicDestinationResolver::resolveDestinationName(
+        cms::Session* session, const std::string& destName, bool pubSubDomain)
+        throw (cms::CMSException) {
+ 
+    // Get the resolver for this session.
+    SessionResolver* resolver = NULL;
+    try {
+        resolver = sessionResolverMap.getValue(session);
+    } catch (decaf::lang::exceptions::NoSuchElementException& ex) {
+        resolver = new SessionResolver(session, resourceLifecycleManager);
+        sessionResolverMap.setValue(session, resolver);
+    }
+    
+    // Return the appropriate destination.
+    if( pubSubDomain ) {
+        return resolver->getTopic(destName);
+    } else {
+        return resolver->getQueue(destName);
+    }
+}

Added: activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/DynamicDestinationResolver.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/DynamicDestinationResolver.h?rev=609175&view=auto
==============================================================================
--- activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/DynamicDestinationResolver.h (added)
+++ activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/DynamicDestinationResolver.h Sat Jan  5 08:58:56 2008
@@ -0,0 +1,111 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef _ACTIVEMQ_CMSUTIL_DYNAMICDESTINATIONRESOLVER_H_
+#define _ACTIVEMQ_CMSUTIL_DYNAMICDESTINATIONRESOLVER_H_
+
+#include <activemq/cmsutil/DestinationResolver.h>
+#include <cms/Session.h>
+#include <decaf/util/Map.h>
+
+namespace activemq {
+namespace cmsutil {
+
+    /**
+     * Resolves a CMS destination name to a <code>Destination</code>.
+     */
+    class DynamicDestinationResolver : public DestinationResolver {
+    
+    private:
+        
+        /**
+         * Manages maps of names to topics and queues for a single session.
+         */
+        class SessionResolver {
+        private:
+            ResourceLifecycleManager* resourceLifecycleManager;
+            cms::Session* session;
+            decaf::util::Map<std::string, cms::Topic*> topicMap;
+            decaf::util::Map<std::string, cms::Queue*> queueMap;
+            
+        public:
+            
+            SessionResolver(cms::Session* session,
+                ResourceLifecycleManager* resourceLifecycleManager ) {
+                
+                this->session = session;
+                this->resourceLifecycleManager = resourceLifecycleManager;
+            }
+            
+            virtual ~SessionResolver() {}
+            
+            cms::Topic* getTopic(const std::string& topicName ) 
+                throw (cms::CMSException);
+            
+            cms::Queue* getQueue(const std::string& queueName ) 
+                throw (cms::CMSException);
+        };
+        
+        /**
+         * Maps a given session to the resolver for that session.
+         */
+        decaf::util::Map< cms::Session*, SessionResolver*> sessionResolverMap;
+        
+        /**
+         * Manages lifecycle of any allocated topics/queues.
+         */
+        ResourceLifecycleManager* resourceLifecycleManager;
+        
+    public:
+    
+        virtual ~DynamicDestinationResolver();
+    
+        /**
+         * Sets the <code>ResourceLifecycleManager</code> to be used for
+         * any allocated resources.
+         * 
+         * @param mgr
+         *      the resource lifecycle manager.
+         */
+        virtual void setResourceLifecycleManager( ResourceLifecycleManager* mgr) {
+            this->resourceLifecycleManager = mgr;
+        }
+                
+        /**
+         * Resolves the given name to a destination.  If 
+         * <code>pubSubDomain</code> is true, a topic will be returned, 
+         * otherwise a queue will be returned.
+         * 
+         * @param session 
+         *      the session for which to retrieve resolve the 
+         *      destination.
+         * @param destName 
+         *      the name to be resolved.
+         * @param pubSubDomain 
+         *      If true, the name will be resolved to a Topic,
+         *      otherwise a Queue.
+         * @return the resolved destination
+         * @throws cms::CMSException if resolution failed.
+         */
+        virtual cms::Destination* resolveDestinationName(
+                cms::Session* session,
+                const std::string& destName,
+                bool pubSubDomain ) throw (cms::CMSException);
+    };
+
+}}
+
+#endif /* _ACTIVEMQ_CMSUTIL_DYNAMICDESTINATIONRESOLVER_H_ */

Added: activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/ResourceLifecycleManager.cpp
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/ResourceLifecycleManager.cpp?rev=609175&view=auto
==============================================================================
--- activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/ResourceLifecycleManager.cpp (added)
+++ activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/ResourceLifecycleManager.cpp Sat Jan  5 08:58:56 2008
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ResourceLifecycleManager.h"
+
+using namespace activemq::cmsutil;
+
+////////////////////////////////////////////////////////////////////////////////
+ResourceLifecycleManager::ResourceLifecycleManager() {
+}
+
+////////////////////////////////////////////////////////////////////////////////
+ResourceLifecycleManager::~ResourceLifecycleManager() {
+
+    try {
+        
+        // Destroy all the resources
+        destroy();
+        
+    } catch( cms::CMSException& e ) { /* Absorb*/}
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void ResourceLifecycleManager::releaseAll() {
+
+    connections.clear();
+    sessions.clear();
+    destinations.clear();
+    producers.clear();
+    consumers.clear();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void ResourceLifecycleManager::destroy() throw (cms::CMSException) {
+
+    // Close all the connections.
+    for (std::size_t ix=0; ix<connections.size(); ++ix) {
+        connections[ix]->close();
+    }
+
+    // Destroy the producers.
+    for (std::size_t ix=0; ix<producers.size(); ++ix) {
+        delete producers[ix];
+    }
+
+    // Destroy the consumers.
+    for (std::size_t ix=0; ix<consumers.size(); ++ix) {
+        delete consumers[ix];
+    }
+
+    // Destroy the destinations.
+    for (std::size_t ix=0; ix<destinations.size(); ++ix) {
+        delete destinations[ix];
+    }
+
+    // Destroy the sessions.
+    for (std::size_t ix=0; ix<sessions.size(); ++ix) {
+        delete sessions[ix];
+    }
+
+    // Destroy the connections,
+    for (std::size_t ix=0; ix<connections.size(); ++ix) {
+        delete connections[ix];
+    }
+
+    // Empty all the vectors.
+    releaseAll();
+}
+

Added: activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/ResourceLifecycleManager.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/ResourceLifecycleManager.h?rev=609175&view=auto
==============================================================================
--- activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/ResourceLifecycleManager.h (added)
+++ activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/ResourceLifecycleManager.h Sat Jan  5 08:58:56 2008
@@ -0,0 +1,123 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ACTIVEMQ_CMSUTIL_RESOURCELIFECYCLEMANAGER_H_
+#define ACTIVEMQ_CMSUTIL_RESOURCELIFECYCLEMANAGER_H_
+
+#include <cms/Connection.h>
+#include <cms/Session.h>
+#include <cms/Destination.h>
+#include <cms/MessageProducer.h>
+#include <cms/MessageConsumer.h>
+
+namespace activemq {
+namespace cmsutil {
+
+    /**
+     * Manages the lifecycle of a set of CMS resources.  A call to
+     * <code>destroy</code> will close and destroy all of the contained
+     * resources in the appropriate manner.
+     */
+    class ResourceLifecycleManager {
+    private:
+    
+        std::vector<cms::Connection*> connections;
+        std::vector<cms::Session*> sessions;
+        std::vector<cms::Destination*> destinations;
+        std::vector<cms::MessageProducer*> producers;
+        std::vector<cms::MessageConsumer*> consumers;
+    
+    public:
+    
+        ResourceLifecycleManager();
+        
+        /**
+         * Destructor - calls <code>destroy</code>
+         */
+        virtual ~ResourceLifecycleManager();
+    
+        /**
+         * Adds a connection so that its life will be managed by
+         * this object.
+         * 
+         * @param connection
+         *         the object to be managed
+         */
+        void addConnection(cms::Connection* connection) {
+            connections.push_back(connection);
+        }
+    
+        /**
+         * Adds a session so that its life will be managed by
+         * this object.
+         * 
+         * @param session
+         *         the object to be managed
+         */
+        void addSession(cms::Session* session) {
+            sessions.push_back(session);
+        }
+        
+        /**
+         * Adds a destination so that its life will be managed by
+         * this object.
+         * 
+         * @param dest
+         *         the object to be managed
+         */
+        void addDestination(cms::Destination* dest) {
+            destinations.push_back(dest);
+        }
+        
+        /**
+         * Adds a message producer so that its life will be managed by
+         * this object.
+         * 
+         * @param producer
+         *         the object to be managed
+         */
+        void addMessageProducer(cms::MessageProducer* producer) {
+            producers.push_back(producer);
+        }
+        
+        /**
+         * Adds a message consumer so that its life will be managed by
+         * this object.
+         * 
+         * @param consumer
+         *         the object to be managed
+         */
+        void addMessageConsumer(cms::MessageConsumer* consumer) {
+            consumers.push_back(consumer);
+        }
+    
+        /**
+         * Closes and destroys the contained CMS resources.
+         * @throws cms::CMSException thrown if an error occurs.
+         */
+        void destroy() throw (cms::CMSException);
+    
+        /**
+         * Releases all of the contained resources so that this 
+         * object will no longer control their lifetimes. 
+         */
+        void releaseAll();
+    };
+
+}}
+
+#endif /*ACTIVEMQ_CMSUTIL_RESOURCELIFECYCLEMANAGER_H_*/

Modified: activemq/activemq-cpp/trunk/src/test/Makefile.am
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/test/Makefile.am?rev=609175&r1=609174&r2=609175&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/src/test/Makefile.am (original)
+++ activemq/activemq-cpp/trunk/src/test/Makefile.am Sat Jan  5 08:58:56 2008
@@ -60,6 +60,7 @@
   activemq/core/ActiveMQConnectionFactoryTest.cpp \
   activemq/core/ActiveMQConnectionTest.cpp \
   activemq/core/ActiveMQSessionTest.cpp \
+  activemq/cmsutil/DynamicDestinationResolverTest.cpp \
   activemq/exceptions/ActiveMQExceptionTest.cpp \
   activemq/transport/IOTransportTest.cpp \
   activemq/transport/filters/ResponseCorrelatorTest.cpp \
@@ -79,7 +80,7 @@
 check_PROGRAMS = activemq-test
 
 ## Also run the tests as part of make check
-## TESTS = $(check_PROGRAMS)
+TESTS = $(check_PROGRAMS)
 
 ## 
 ## Compiler/Linker Options

Added: activemq/activemq-cpp/trunk/src/test/activemq/cmsutil/DummySession.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/test/activemq/cmsutil/DummySession.h?rev=609175&view=auto
==============================================================================
--- activemq/activemq-cpp/trunk/src/test/activemq/cmsutil/DummySession.h (added)
+++ activemq/activemq-cpp/trunk/src/test/activemq/cmsutil/DummySession.h Sat Jan  5 08:58:56 2008
@@ -0,0 +1,98 @@
+#ifndef ACTIVEMQ_CMSUTIL_DUMMYSESSION_H_
+#define ACTIVEMQ_CMSUTIL_DUMMYSESSION_H_
+
+#include <cms/Session.h>
+#include <activemq/connector/stomp/StompTopic.h>
+#include <activemq/connector/stomp/StompQueue.h>
+
+namespace activemq {
+namespace cmsutil {
+
+    class DummySession : public cms::Session {
+        
+    public:
+
+            virtual ~DummySession() {}
+
+            virtual void close() throw( cms::CMSException ){}
+            
+            virtual void commit() throw ( cms::CMSException ) {}
+            
+            virtual void rollback() throw ( cms::CMSException ) {}
+
+            virtual cms::MessageConsumer* createConsumer(
+                const cms::Destination* destination )
+                    throw ( cms::CMSException ) { return NULL; }
+
+            virtual cms::MessageConsumer* createConsumer( 
+                const cms::Destination* destination,
+                const std::string& selector )
+                    throw ( cms::CMSException ) {
+                return NULL;
+            }
+            
+            virtual cms::MessageConsumer* createConsumer( 
+                const cms::Destination* destination,
+                const std::string& selector,
+                bool noLocal )
+                    throw ( cms::CMSException ) { return NULL; }
+
+            virtual cms::MessageConsumer* createDurableConsumer(
+                const cms::Topic* destination,
+                const std::string& name,
+                const std::string& selector,
+                bool noLocal = false )
+                    throw ( cms::CMSException ) { return NULL; }
+
+            virtual cms::MessageProducer* createProducer( const cms::Destination* destination )
+                throw ( cms::CMSException ) { return NULL; }
+
+            virtual cms::Queue* createQueue( const std::string& queueName )
+                throw ( cms::CMSException ) {
+                return new activemq::connector::stomp::StompQueue(queueName);
+            }
+            
+            virtual cms::Topic* createTopic( const std::string& topicName )
+                throw ( cms::CMSException ) {
+                return new activemq::connector::stomp::StompTopic(topicName);
+            }
+
+            virtual cms::TemporaryQueue* createTemporaryQueue()
+                throw ( cms::CMSException ) { return NULL; }
+
+            virtual cms::TemporaryTopic* createTemporaryTopic()
+                throw ( cms::CMSException ){ return NULL; }
+
+            virtual cms::Message* createMessage() 
+                throw ( cms::CMSException ){ return NULL; }
+
+            virtual cms::BytesMessage* createBytesMessage() 
+                throw ( cms::CMSException){ return NULL; }
+
+            virtual cms::BytesMessage* createBytesMessage(
+                const unsigned char* bytes,
+                std::size_t bytesSize ) 
+                    throw ( cms::CMSException){
+                return NULL;
+            }
+
+            virtual cms::TextMessage* createTextMessage() 
+                throw ( cms::CMSException ){ return NULL; }
+
+            virtual cms::TextMessage* createTextMessage( const std::string& text ) 
+                throw ( cms::CMSException ){ return NULL; }
+
+            virtual cms::MapMessage* createMapMessage() 
+                throw ( cms::CMSException ){ return NULL; }
+
+            virtual cms::Session::AcknowledgeMode getAcknowledgeMode() const { return cms::Session::AUTO_ACKNOWLEDGE; }
+
+            virtual bool isTransacted() const{ return false; }
+ 
+            virtual void unsubscribe( const std::string& name ) 
+                throw ( cms::CMSException ){}
+    };
+    
+}}
+
+#endif /*ACTIVEMQ_CMSUTIL_DUMMYSESSION_H_*/

Added: activemq/activemq-cpp/trunk/src/test/activemq/cmsutil/DynamicDestinationResolverTest.cpp
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/test/activemq/cmsutil/DynamicDestinationResolverTest.cpp?rev=609175&view=auto
==============================================================================
--- activemq/activemq-cpp/trunk/src/test/activemq/cmsutil/DynamicDestinationResolverTest.cpp (added)
+++ activemq/activemq-cpp/trunk/src/test/activemq/cmsutil/DynamicDestinationResolverTest.cpp Sat Jan  5 08:58:56 2008
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "DynamicDestinationResolverTest.h"
+#include <activemq/cmsutil/DynamicDestinationResolver.h>
+#include <activemq/cmsutil/ResourceLifecycleManager.h>
+#include "DummySession.h"
+
+CPPUNIT_TEST_SUITE_REGISTRATION( activemq::cmsutil::DynamicDestinationResolverTest );
+
+using namespace activemq;
+using namespace activemq::cmsutil;
+
+////////////////////////////////////////////////////////////////////////////////
+void DynamicDestinationResolverTest::testTopics() {
+
+    ResourceLifecycleManager mgr;    
+    DynamicDestinationResolver resolver;
+    resolver.setResourceLifecycleManager(&mgr);
+    
+    DummySession session;
+    
+    // Test topic
+    cms::Destination* testTopic = dynamic_cast<cms::Topic*>(resolver.resolveDestinationName(&session, 
+            (std::string)"test", true ));
+    
+    CPPUNIT_ASSERT(testTopic != NULL);
+    
+    // Hello topic
+    cms::Destination* helloTopic = resolver.resolveDestinationName(&session, 
+            (std::string)"hello", true );
+    
+    CPPUNIT_ASSERT(helloTopic != NULL);
+    CPPUNIT_ASSERT(helloTopic != testTopic);
+    
+    cms::Destination* testTopic2 = dynamic_cast<cms::Topic*>(resolver.resolveDestinationName(&session, 
+                (std::string)"test", true ));
+    
+    CPPUNIT_ASSERT(testTopic2 != NULL);
+    CPPUNIT_ASSERT(testTopic == testTopic2);
+    
+    mgr.destroy();
+    
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void DynamicDestinationResolverTest::testQueues() {
+
+    ResourceLifecycleManager mgr;    
+    DynamicDestinationResolver resolver;
+    resolver.setResourceLifecycleManager(&mgr);
+    
+    DummySession session;
+    
+    // Queue topic
+    cms::Destination* testQueue = dynamic_cast<cms::Queue*>(resolver.resolveDestinationName(&session, 
+            (std::string)"test", false ));
+    
+    CPPUNIT_ASSERT(testQueue != NULL);
+    
+    // Hello queue
+    cms::Destination* helloQueue = resolver.resolveDestinationName(&session, 
+            (std::string)"hello", false );
+    
+    CPPUNIT_ASSERT(helloQueue != NULL);
+    CPPUNIT_ASSERT(helloQueue != testQueue);
+    
+    cms::Destination* testQueue2 = dynamic_cast<cms::Queue*>(resolver.resolveDestinationName(&session, 
+                (std::string)"test", false ));
+    
+    CPPUNIT_ASSERT(testQueue2 != NULL);
+    CPPUNIT_ASSERT(testQueue == testQueue2);
+    
+    mgr.destroy();
+}

Added: activemq/activemq-cpp/trunk/src/test/activemq/cmsutil/DynamicDestinationResolverTest.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/test/activemq/cmsutil/DynamicDestinationResolverTest.h?rev=609175&view=auto
==============================================================================
--- activemq/activemq-cpp/trunk/src/test/activemq/cmsutil/DynamicDestinationResolverTest.h (added)
+++ activemq/activemq-cpp/trunk/src/test/activemq/cmsutil/DynamicDestinationResolverTest.h Sat Jan  5 08:58:56 2008
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _ACTIVEMQ_CMSUTIL_DYNAMICDESTINATIONRESOLVERTEST_H_
+#define _ACTIVEMQ_CMSUTIL_DYNAMICDESTINATIONRESOLVERTEST_H_
+
+#include <cppunit/TestFixture.h>
+#include <cppunit/extensions/HelperMacros.h>
+
+
+namespace activemq{
+namespace cmsutil{
+
+    class DynamicDestinationResolverTest : public CppUnit::TestFixture
+    {
+        CPPUNIT_TEST_SUITE( DynamicDestinationResolverTest );
+        CPPUNIT_TEST( testTopics );
+        CPPUNIT_TEST( testQueues );
+        CPPUNIT_TEST_SUITE_END();
+
+    public:
+
+        DynamicDestinationResolverTest() {}
+        virtual ~DynamicDestinationResolverTest() {}
+
+        void testTopics();
+        void testQueues();
+    };
+
+}}
+
+#endif /*_ACTIVEMQ_CMSUTIL_DYNAMICDESTINATIONRESOLVERTEST_H_*/