package org.apache.tuscany.binding.jms; import java.lang.reflect.Method; import javax.jms.Destination; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.MessageProducer; import javax.jms.Session; import javax.jms.TextMessage; import javax.naming.Context; import javax.naming.NamingException; public class JMSProxy implements MessageListener{ protected Method operationMethod; protected SDODataBinding dataBinding; private Object entryPointProxy; private JMSBinding jmsBinding; private Context context; private JMSResourceFactory jmsResourceFactory; private OperationSelector operationSelector; public JMSProxy(Object entryPointProxy,JMSResourceFactory jmsResourceFactory, JMSBinding jmsBinding,SDODataBinding dataBinding, OperationSelector operationSelector) throws NamingException{ this.entryPointProxy = entryPointProxy; this.dataBinding = dataBinding; this.jmsBinding = jmsBinding; this.jmsResourceFactory = jmsResourceFactory; this.operationSelector = operationSelector; } public void onMessage(Message msg){ String operationName = operationSelector.getOperationName(msg); try { Object[] args = dataBinding.fromXML(((TextMessage)msg).getText()); operationMethod = getOperationMethod(entryPointProxy,operationName,args); Object result = operationMethod.invoke(entryPointProxy,args); // if result is null then the method can be assumed as oneway if (result != null){ String response = dataBinding.toXML(new Object[] {result} ); sendReply(operationName, response); } } catch (Exception e) { // need to do proper error handling e.printStackTrace(); } } private Method getOperationMethod(Object entryPointProxy2, String operationName, Object[] args) { // TODO Auto-generated method stub return null; } private void sendReply(String operationName,String payload) throws JMSException, NamingException{ Session session = jmsResourceFactory.createSession(); javax.jms.Message message = jmsResourceFactory.createMessage(session); message.setJMSCorrelationID(operationName); // I am using the existing header instead of adding a new JMS property. ((javax.jms.TextMessage)message).setText((String)payload); Destination destination = null; Object obj = context.lookup(jmsBinding.getDestinationName()); destination = (Destination) obj; MessageProducer producer = session.createProducer(destination); producer.send(message); producer.close(); session.close(); } }