Author: gnodet
Date: Wed Feb  4 13:58:14 2009
New Revision: 740743

URL: http://svn.apache.org/viewvc?rev=740743&view=rev
Log:
SM-1786: Refactor JmsProviderEndpoint to not use reflection to call protected 
method on Spring JmsTemplate class

Modified:
    
servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsProviderEndpoint.java

Modified: 
servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsProviderEndpoint.java
URL: 
http://svn.apache.org/viewvc/servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsProviderEndpoint.java?rev=740743&r1=740742&r2=740743&view=diff
==============================================================================
--- 
servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsProviderEndpoint.java
 (original)
+++ 
servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsProviderEndpoint.java
 Wed Feb  4 13:58:14 2009
@@ -16,9 +16,6 @@
  */
 package org.apache.servicemix.jms.endpoints;
 
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
 import javax.jbi.management.DeploymentException;
 import javax.jbi.messaging.ExchangeStatus;
 import javax.jbi.messaging.Fault;
@@ -26,13 +23,27 @@
 import javax.jbi.messaging.InOut;
 import javax.jbi.messaging.MessageExchange;
 import javax.jbi.messaging.NormalizedMessage;
+import javax.jms.Connection;
 import javax.jms.ConnectionFactory;
 import javax.jms.Destination;
 import javax.jms.JMSException;
 import javax.jms.Message;
+import javax.jms.MessageConsumer;
 import javax.jms.MessageListener;
+import javax.jms.MessageProducer;
 import javax.jms.ObjectMessage;
+import javax.jms.Queue;
+import javax.jms.QueueBrowser;
+import javax.jms.QueueConnection;
+import javax.jms.QueueConnectionFactory;
+import javax.jms.QueueSender;
+import javax.jms.QueueSession;
 import javax.jms.Session;
+import javax.jms.Topic;
+import javax.jms.TopicConnection;
+import javax.jms.TopicConnectionFactory;
+import javax.jms.TopicPublisher;
+import javax.jms.TopicSession;
 
 import org.apache.servicemix.JbiConstants;
 import org.apache.servicemix.common.endpoints.ProviderEndpoint;
@@ -42,13 +53,14 @@
 import org.apache.servicemix.store.memory.MemoryStoreFactory;
 import org.springframework.jms.JmsException;
 import org.springframework.jms.UncategorizedJmsException;
+import org.springframework.jms.connection.JmsResourceHolder;
 import org.springframework.jms.core.JmsTemplate;
-import org.springframework.jms.core.JmsTemplate102;
 import org.springframework.jms.core.MessageCreator;
 import org.springframework.jms.core.SessionCallback;
 import org.springframework.jms.listener.AbstractMessageListenerContainer;
 import org.springframework.jms.listener.DefaultMessageListenerContainer;
 import org.springframework.jms.listener.DefaultMessageListenerContainer102;
+import org.springframework.jms.support.converter.SimpleMessageConverter102;
 import org.springframework.jms.support.destination.DestinationResolver;
 import org.springframework.jms.support.destination.DynamicDestinationResolver;
 
@@ -67,7 +79,7 @@
     private JmsProviderMarshaler marshaler = new DefaultProviderMarshaler();
     private DestinationChooser destinationChooser = new 
SimpleDestinationChooser();
     private DestinationChooser replyDestinationChooser = new 
SimpleDestinationChooser();
-    private JmsTemplate template;
+    private JmsTemplateUtil template;
 
     private boolean jms102;
     private ConnectionFactory connectionFactory;
@@ -685,45 +697,17 @@
     }
 
     private void send(final Session session, final Destination dest, final 
Message message) throws JmsException {
-        // Do not call directly the template to avoid the cost of creating a 
new connection / session
-//        template.send(dest, new MessageCreator() {
-//            public Message createMessage(Session session) throws 
JMSException {
-//                return message;
-//            }
-//        });
-        try {
-            Method method = JmsTemplate.class.getDeclaredMethod("doSend", 
Session.class, Destination.class, MessageCreator.class);
-            method.setAccessible(true);
-            method.invoke(template, session, dest, new MessageCreator() {
+        template.send(session, dest, new MessageCreator() {
                 public Message createMessage(Session session) throws 
JMSException {
                     return message;
                 }
             });
-        } catch (NoSuchMethodException e) {
-            throw new RuntimeException(e);
-        } catch (IllegalAccessException e) {
-            throw new RuntimeException(e);
-        } catch (InvocationTargetException e) {
-            throw new RuntimeException(e);
-        }
     }
 
     private Message receiveSelected(final Session session,
                                     final Destination dest,
                                     final String messageSelector) throws 
JMSException {
-        // Do not call directly the template to avoid the cost of creating a 
new connection / session
-//        return template.doReceive(session, dest, messageSelector);
-        try {
-            Method method = JmsTemplate.class.getDeclaredMethod("doReceive", 
Session.class, Destination.class, String.class);
-            method.setAccessible(true);
-            return (Message) method.invoke(template, session, dest, 
messageSelector);
-        } catch (NoSuchMethodException e) {
-            throw new RuntimeException(e);
-        } catch (IllegalAccessException e) {
-            throw new RuntimeException(e);
-        } catch (InvocationTargetException e) {
-            throw new RuntimeException(e);
-        }
+        return template.receiveSelected(session, dest, messageSelector);
     }
 
     /**
@@ -905,12 +889,12 @@
      *
      * @return
      */
-    protected JmsTemplate createTemplate() {
-        JmsTemplate tplt;
+    protected JmsTemplateUtil createTemplate() {
+        JmsTemplateUtil tplt;
         if (isJms102()) {
-            tplt = new JmsTemplate102();
+            tplt = new JmsTemplate102Util();
         } else {
-            tplt = new JmsTemplate();
+            tplt = new JmsTemplateUtil();
         }
         tplt.setConnectionFactory(getConnectionFactory());
         if (getDestination() != null) {
@@ -965,4 +949,112 @@
         return cont;
     }
 
+    public static class JmsTemplateUtil extends JmsTemplate {
+        public void send(Session session, Destination destination, 
MessageCreator messageCreator) throws JmsException {
+            try {
+                doSend(session, destination, messageCreator);
+            } catch (JMSException ex) {
+                throw convertJmsAccessException(ex);
+            }
+        }
+        public Message receiveSelected(Session session, Destination 
destination, String messageSelector) throws JmsException {
+            try {
+                return doReceive(session, destination, messageSelector);
+            } catch (JMSException ex) {
+                throw convertJmsAccessException(ex);
+            }
+        }
+    }
+
+    public static class JmsTemplate102Util extends JmsTemplateUtil {
+        protected void initDefaultStrategies() {
+            setMessageConverter(new SimpleMessageConverter102());
+        }
+
+        public void afterPropertiesSet() {
+            super.afterPropertiesSet();
+            if (isPubSubDomain()) {
+                if (!(getConnectionFactory() instanceof 
TopicConnectionFactory)) {
+                    throw new IllegalArgumentException(
+                            "Specified a Spring JMS 1.0.2 template for topics "
+                            + "but did not supply an instance of 
TopicConnectionFactory");
+                }
+            } else {
+                if (!(getConnectionFactory() instanceof 
QueueConnectionFactory)) {
+                    throw new IllegalArgumentException(
+                            "Specified a Spring JMS 1.0.2 template for queues "
+                            + "but did not supply an instance of 
QueueConnectionFactory");
+                }
+            }
+        }
+
+        protected Connection getConnection(JmsResourceHolder holder) {
+            return holder.getConnection(isPubSubDomain() ? (Class) 
TopicConnection.class : QueueConnection.class);
+        }
+
+        protected Session getSession(JmsResourceHolder holder) {
+            return holder.getSession(isPubSubDomain() ? (Class) 
TopicSession.class : QueueSession.class);
+        }
+
+        protected Connection createConnection() throws JMSException {
+            if (isPubSubDomain()) {
+                return ((TopicConnectionFactory) 
getConnectionFactory()).createTopicConnection();
+            } else {
+                return ((QueueConnectionFactory) 
getConnectionFactory()).createQueueConnection();
+            }
+        }
+
+        protected Session createSession(Connection con) throws JMSException {
+            if (isPubSubDomain()) {
+                return ((TopicConnection) 
con).createTopicSession(isSessionTransacted(), getSessionAcknowledgeMode());
+            } else {
+                return ((QueueConnection) 
con).createQueueSession(isSessionTransacted(), getSessionAcknowledgeMode());
+            }
+        }
+
+        protected MessageProducer doCreateProducer(Session session, 
Destination destination) throws JMSException {
+            if (isPubSubDomain()) {
+                return ((TopicSession) session).createPublisher((Topic) 
destination);
+            } else {
+                return ((QueueSession) session).createSender((Queue) 
destination);
+            }
+        }
+
+        protected MessageConsumer createConsumer(Session session, Destination 
destination, String messageSelector) throws JMSException {
+            if (isPubSubDomain()) {
+                return ((TopicSession) session).createSubscriber((Topic) 
destination, messageSelector, isPubSubNoLocal());
+            } else {
+                return ((QueueSession) session).createReceiver((Queue) 
destination, messageSelector);
+            }
+        }
+
+        protected QueueBrowser createBrowser(Session session, Queue queue, 
String messageSelector) throws JMSException {
+            if (isPubSubDomain()) {
+                throw new javax.jms.IllegalStateException("Cannot create 
QueueBrowser for a TopicSession");
+            } else {
+                return ((QueueSession) session).createBrowser(queue, 
messageSelector);
+            }
+        }
+
+        protected void doSend(MessageProducer producer, Message message) 
throws JMSException {
+            if (isPubSubDomain()) {
+                if (isExplicitQosEnabled()) {
+                    ((TopicPublisher) producer).publish(message, 
getDeliveryMode(), getPriority(), getTimeToLive());
+                } else {
+                    ((TopicPublisher) producer).publish(message);
+                }
+            } else {
+                if (isExplicitQosEnabled()) {
+                    ((QueueSender) producer).send(message, getDeliveryMode(), 
getPriority(), getTimeToLive());
+                } else {
+                    ((QueueSender) producer).send(message);
+                }
+            }
+        }
+
+        protected boolean isClientAcknowledge(Session session) throws 
JMSException {
+            return getSessionAcknowledgeMode() == Session.CLIENT_ACKNOWLEDGE;
+        }
+
+    }
 }


Reply via email to