1 package org
.argeo
.slc
.jms
;
3 import java
.io
.PrintWriter
;
4 import java
.io
.StringWriter
;
5 import java
.util
.ArrayList
;
6 import java
.util
.HashMap
;
10 import javax
.jms
.JMSException
;
11 import javax
.jms
.Message
;
12 import javax
.jms
.Session
;
14 import org
.argeo
.slc
.SlcException
;
15 import org
.argeo
.slc
.msg
.ExecutionAnswer
;
16 import org
.springframework
.jms
.listener
.adapter
.MessageListenerAdapter
;
18 public class ServiceMessageListenerAdapter
extends MessageListenerAdapter
{
19 public final static String DEFAULT_METHOD_NAME_PARAMETER
= "action";
20 public final static String BODY_ARGUMENT
= "BODY";
22 private Map
<String
, List
<String
>> methodArguments
= new HashMap
<String
, List
<String
>>();
24 private static String methodNameParameter
= DEFAULT_METHOD_NAME_PARAMETER
;
27 protected Object
extractMessage(Message message
) throws JMSException
{
28 return new ExtractedMessage(message
);
32 protected String
getListenerMethodName(Message originalMessage
,
33 Object extractedMessage
) throws JMSException
{
34 return ((ExtractedMessage
) extractedMessage
).methodName
;
38 protected Object
[] buildListenerArguments(Object extractedMessage
) {
39 return ((ExtractedMessage
) extractedMessage
).arguments
;
43 public void onMessage(Message message
, Session session
) throws JMSException
{
44 try {// hacked and simplified from parent class
45 // Regular case: find a handler method reflectively.
46 Object convertedMessage
= extractMessage(message
);
47 String methodName
= getListenerMethodName(message
, convertedMessage
);
49 // Invoke the handler method with appropriate arguments.
50 Object
[] listenerArguments
= buildListenerArguments(convertedMessage
);
51 Object result
= invokeListenerMethod(methodName
, listenerArguments
);
53 handleResult(result
, message
, session
);
55 ExecutionAnswer answer
= ExecutionAnswer
.ok("Execution of "
56 + methodName
+ " on " + getDelegate() + " succeeeded.");
57 Message okMessage
= getMessageConverter().toMessage(answer
,
59 sendResponse(session
, getResponseDestination(message
,
60 okMessage
, session
), okMessage
);
62 } catch (Exception e
) {
66 StringWriter writer
= new StringWriter();
67 e
.printStackTrace(new PrintWriter(writer
));
68 ExecutionAnswer answer
= ExecutionAnswer
.error(writer
.toString());
69 Message errorMessage
= getMessageConverter().toMessage(answer
,
71 sendResponse(session
, getResponseDestination(message
, errorMessage
,
72 session
), errorMessage
);
76 protected class ExtractedMessage
{
77 private final String methodName
;
78 private final Object
[] arguments
;
79 private final Message originalMessage
;
81 public ExtractedMessage(Message originalMessage
) throws JMSException
{
82 this.originalMessage
= originalMessage
;
84 if (!originalMessage
.propertyExists(methodNameParameter
))
85 throw new SlcException("No property " + methodNameParameter
86 + " in incoming message,"
87 + " cannot determine service method");
89 methodName
= originalMessage
.getStringProperty(methodNameParameter
);
91 if (!methodArguments
.containsKey(methodName
)) {// no arg specified
92 arguments
= new Object
[0];
94 List
<String
> parameterNames
= methodArguments
.get(methodName
);
95 List
<Object
> arguments
= new ArrayList
<Object
>();
97 for (String name
: parameterNames
) {
98 if (name
.equals(BODY_ARGUMENT
)) {
99 Object body
= getMessageConverter().fromMessage(
103 if (!originalMessage
.propertyExists(name
))
104 throw new SlcException("No property " + name
105 + " in incoming message,"
106 + " cannot determine argument #" + count
);
107 arguments
.add(originalMessage
.getObjectProperty(name
));
111 this.arguments
= arguments
.toArray();
116 public void setMethodArguments(Map
<String
, List
<String
>> methodArguments
) {
117 this.methodArguments
= methodArguments
;
120 public static void setMethodNameParameter(String methodNameParameter
) {
121 ServiceMessageListenerAdapter
.methodNameParameter
= methodNameParameter
;