11package org .ros .internal .node .service ;
22
3+ import org .apache .commons .logging .LogFactory ;
34//import org.jboss.netty.buffer.ChannelBuffer;
45//import org.jboss.netty.buffer.ChannelBuffers;
56//import org.jboss.netty.channel.ChannelHandlerContext;
67//import org.jboss.netty.channel.MessageEvent;
78//import org.jboss.netty.channel.SimpleChannelHandler;
89import org .ros .exception .RosRuntimeException ;
910import org .ros .exception .ServiceException ;
10- import org .ros .internal .message .MessageBufferPool ;
11+ import org .ros .internal .message .MessageBuffers ;
12+ //import org.ros.internal.message.MessageBufferPool;
1113import org .ros .internal .system .Utility ;
1214import org .ros .internal .transport .ChannelHandler ;
1315import org .ros .internal .transport .ChannelHandlerContext ;
1416import org .ros .message .MessageFactory ;
1517import org .ros .node .service .ServiceResponseBuilder ;
1618
19+ import rosgraph_msgs .Log ;
20+
1721import java .io .IOException ;
1822import java .nio .ByteBuffer ;
1923import java .nio .charset .Charset ;
2327 * @author jg
2428 */
2529class ServiceRequestHandler <T , S > implements ChannelHandler {
26-
30+ private static final org . apache . commons . logging . Log log = LogFactory . getLog ( ServiceRequestHandler . class );
2731 private final ServiceDeclaration serviceDeclaration ;
2832 private final ServiceResponseBuilder <T , S > responseBuilder ;
2933
3034 private final MessageFactory messageFactory ;
3135 private final ExecutorService executorService ;
32- private final MessageBufferPool messageBufferPool ;
36+ //private final ByteBuffer messageBuffer = MessageBuffers.dynamicBuffer();
37+ //private final MessageBufferPool messageBufferPool;
3338
3439 public ServiceRequestHandler (ServiceDeclaration serviceDeclaration ,
3540 ServiceResponseBuilder <T , S > responseBuilder , MessageFactory messageFactory ,
@@ -38,26 +43,35 @@ public ServiceRequestHandler(ServiceDeclaration serviceDeclaration,
3843 this .responseBuilder = responseBuilder ;
3944 this .messageFactory = messageFactory ;
4045 this .executorService = executorService ;
41- messageBufferPool = new MessageBufferPool ();
46+ // messageBufferPool = new MessageBufferPool();
4247 }
4348
44- private void handleRequest (T request , ByteBuffer responseBuffer ) throws ServiceException {
49+ private S handleRequest (T request ) throws ServiceException {
4550 S response = messageFactory .newFromType (serviceDeclaration .getType ());
4651 responseBuilder .build (request , response );
47- Utility . serialize ( response , responseBuffer ) ;
52+ return response ;
4853 }
4954
50- private void handleSuccess (final ChannelHandlerContext ctx , ServiceServerResponse response , ByteBuffer responseBuffer ) {
55+ private void handleSuccess (final ChannelHandlerContext ctx , S result , ServiceServerResponse response , ByteBuffer responseBuffer ) {
5156 response .setErrorCode (1 );
52- response .setMessageLength (responseBuffer .limit ());
53- response .setMessageBytes (responseBuffer .array ());
54- ByteBuffer resbuf = messageBufferPool .acquire ();
55- Utility .serialize (response , resbuf );
57+ ByteBuffer resbuf = MessageBuffers .dynamicBuffer (); // allocate for serialized result of service method
58+ Utility .serialize (result , resbuf );
59+ byte [] b = new byte [resbuf .limit ()];
60+ resbuf .get (b );
61+ response .setMessageBytes (b );
62+ response .setMessageLength (response .getMessageBytes ().length );
63+ responseBuffer .putInt (response .getErrorCode ());
64+ responseBuffer .putInt (response .getMessageLength ());
65+ log .info ("Response to be serialized:" +response );
66+ Utility .serialize (response , responseBuffer );
67+ //log.info("ServiceRequestHandler serializing message buffer "+responseBuffer+
68+ // " with payload "+response.getMessageBytes().length);
5669 try {
57- ctx .write (resbuf .array ());
70+ ctx .write (responseBuffer .array ());
5871 } catch (IOException e ) {
5972 throw new RosRuntimeException (e );
6073 }
74+ MessageBuffers .returnBuffer (resbuf );
6175 }
6276
6377 private void handleError (final ChannelHandlerContext ctx , ServiceServerResponse response , String message , ByteBuffer responseBuffer ) {
@@ -66,6 +80,8 @@ private void handleError(final ChannelHandlerContext ctx, ServiceServerResponse
6680 response .setMessageLength (encodedMessage .limit ());
6781 response .setMessage (encodedMessage );
6882 response .setMessageBytes (encodedMessage .array ());
83+ responseBuffer .putInt (response .getErrorCode ());
84+ responseBuffer .putInt (response .getMessageLength ());
6985 Utility .serialize (response , responseBuffer );
7086 try {
7187 ctx .write (responseBuffer .array ());
@@ -84,19 +100,21 @@ public Object channelRead(final ChannelHandlerContext ctx, Object e) throws Exce
84100 @ Override
85101 public void run () {
86102 ServiceServerResponse response = new ServiceServerResponse ();
87- ByteBuffer responseBuffer = messageBufferPool . acquire ();
103+ ByteBuffer responseBuffer = MessageBuffers . dynamicBuffer ();
88104 boolean success ;
105+ S result = null ;
89106 try {
90- handleRequest (requestBuffer , responseBuffer );
107+ result = handleRequest (requestBuffer );
91108 success = true ;
92109 } catch (ServiceException ex ) {
93110 handleError (ctx , response , ex .getMessage (), responseBuffer );
94111 success = false ;
95112 }
96113 if (success ) {
97- handleSuccess (ctx , response , responseBuffer );
114+ handleSuccess (ctx , result , response , responseBuffer );
98115 }
99- messageBufferPool .release (responseBuffer );
116+ //messageBufferPool.release(responseBuffer);
117+ MessageBuffers .returnBuffer (responseBuffer );
100118 }
101119 });
102120 return requestBuffer ;
0 commit comments