Author: markt Date: Fri Mar 8 14:24:19 2013 New Revision: 1454400 URL: http://svn.apache.org/r1454400 Log: More plumbing for Decoders. Still more work to do to get this working end to end.
Modified: tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java tomcat/trunk/java/org/apache/tomcat/websocket/pojo/LocalStrings.properties tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBase.java tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBinary.java tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeText.java tomcat/trunk/res/checkstyle/org-import-control.xml Modified: tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java?rev=1454400&r1=1454399&r2=1454400&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java Fri Mar 8 14:24:19 2013 @@ -386,6 +386,11 @@ public class WsSession implements Sessio } + public Endpoint getLocal() { + return localEndpoint; + } + + protected MessageHandler getTextMessageHandler() { return textMessageHandler; } Modified: tomcat/trunk/java/org/apache/tomcat/websocket/pojo/LocalStrings.properties URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/pojo/LocalStrings.properties?rev=1454400&r1=1454399&r2=1454400&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/pojo/LocalStrings.properties (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/pojo/LocalStrings.properties Fri Mar 8 14:24:19 2013 @@ -16,4 +16,6 @@ pojoEndpointBase.onCloseFail=Failed to call onClose method of POJO end point for POJO of type [{0}] pojoEndpointBase.onErrorFail=Failed to call onError method of POJO end point for POJO of type [{0}] pojoEndpointBase.onOpenFail=Failed to call onOpen method of POJO end point for POJO of type [{0}] -pojoEndpointServer.getPojoInstanceFail=Failed to create instance of POJO of type [{0}] \ No newline at end of file +pojoEndpointServer.getPojoInstanceFail=Failed to create instance of POJO of type [{0}] +pojoMessageHandlerWhole.decodeFail=Failed to decode received message with first matching Decoder instance +pojoMessageHandlerWhole.decodeIoFail=IO error while decoding message \ No newline at end of file Modified: tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBase.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBase.java?rev=1454400&r1=1454399&r2=1454400&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBase.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBase.java Fri Mar 8 14:24:19 2013 @@ -20,8 +20,13 @@ import java.lang.reflect.InvocationTarge import java.lang.reflect.Method; import java.nio.ByteBuffer; +import javax.websocket.DecodeException; import javax.websocket.MessageHandler; import javax.websocket.Session; +import javax.websocket.SessionException; + +import org.apache.tomcat.util.res.StringManager; +import org.apache.tomcat.websocket.WsSession; /** * Common implementation code for the POJO whole message handlers. All the real @@ -32,6 +37,9 @@ import javax.websocket.Session; public abstract class PojoMessageHandlerWholeBase<T> extends PojoMessageHandlerBase<T> implements MessageHandler.Whole<T> { + private static final StringManager sm = + StringManager.getManager(Constants.PACKAGE_NAME); + public PojoMessageHandlerWholeBase(Object pojo, Method method, Session session, Object[] params, int indexPayload, boolean unwrap, int indexSession) { @@ -44,7 +52,15 @@ public abstract class PojoMessageHandler public final void onMessage(T message) { // Can this message be decoded? - Object payload = decode(message); + Object payload; + try { + payload = decode(message); + } catch (DecodeException de) { + SessionException se = new SessionException(sm.getString( + "pojoMessageHandlerWhole.decodeFail"), de, session); + ((WsSession) session).getLocal().onError(session, se); + return; + } if (payload == null) { // Not decoded. Unwrap if required. Unwrap only ever applies to @@ -75,6 +91,6 @@ public abstract class PojoMessageHandler } - protected abstract Object decode(T message); + protected abstract Object decode(T message) throws DecodeException; protected abstract void onClose(); } Modified: tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBinary.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBinary.java?rev=1454400&r1=1454399&r2=1454400&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBinary.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBinary.java Fri Mar 8 14:24:19 2013 @@ -16,23 +16,31 @@ */ package org.apache.tomcat.websocket.pojo; +import java.io.ByteArrayInputStream; +import java.io.IOException; import java.lang.reflect.Method; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; +import javax.websocket.DecodeException; import javax.websocket.Decoder; import javax.websocket.Decoder.Binary; import javax.websocket.Decoder.BinaryStream; import javax.websocket.EndpointConfig; import javax.websocket.Session; +import org.apache.tomcat.util.res.StringManager; + /** * ByteBuffer specific concrete whole message implementation. */ public class PojoMessageHandlerWholeBinary extends PojoMessageHandlerWholeBase<ByteBuffer> { + private static final StringManager sm = + StringManager.getManager(Constants.PACKAGE_NAME); + private final List<Decoder> decoders = new ArrayList<>(); public PojoMessageHandlerWholeBinary(Object pojo, Method method, @@ -52,7 +60,7 @@ public class PojoMessageHandlerWholeBina decoder.init(config); decoders.add(decoder); } else { - // Text decoder - ignore is + // Text decoder - ignore it } } } catch (IllegalAccessException | InstantiationException e) { @@ -62,8 +70,24 @@ public class PojoMessageHandlerWholeBina @Override - protected Object decode(ByteBuffer message) { - // TODO Not implemented + protected Object decode(ByteBuffer message) throws DecodeException { + for (Decoder decoder : decoders) { + if (decoder instanceof Binary) { + if (((Binary<?>) decoder).willDecode(message)) { + return ((Binary<?>) decoder).decode(message); + } + } else { + byte[] array = new byte[message.limit() - message.position()]; + message.get(array); + ByteArrayInputStream bais = new ByteArrayInputStream(array); + try { + return ((BinaryStream<?>) decoder).decode(bais); + } catch (IOException ioe) { + throw new DecodeException(message, sm.getString( + "pojoMessageHandlerWhole.decodeIoFail"), ioe); + } + } + } return null; } Modified: tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeText.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeText.java?rev=1454400&r1=1454399&r2=1454400&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeText.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeText.java Fri Mar 8 14:24:19 2013 @@ -16,22 +16,30 @@ */ package org.apache.tomcat.websocket.pojo; +import java.io.IOException; +import java.io.StringReader; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; +import javax.websocket.DecodeException; import javax.websocket.Decoder; import javax.websocket.Decoder.Text; import javax.websocket.Decoder.TextStream; import javax.websocket.EndpointConfig; import javax.websocket.Session; +import org.apache.tomcat.util.res.StringManager; + /** * Text specific concrete whole message implementation. */ public class PojoMessageHandlerWholeText extends PojoMessageHandlerWholeBase<String> { + private static final StringManager sm = + StringManager.getManager(Constants.PACKAGE_NAME); + private final List<Decoder> decoders = new ArrayList<>(); public PojoMessageHandlerWholeText(Object pojo, Method method, @@ -52,7 +60,7 @@ public class PojoMessageHandlerWholeText decoder.init(config); decoders.add(decoder); } else { - // Binary decoder - ignore is + // Binary decoder - ignore it } } } catch (IllegalAccessException | InstantiationException e) { @@ -62,8 +70,22 @@ public class PojoMessageHandlerWholeText @Override - protected Object decode(String message) { - // TODO Auto-generated method stub + protected Object decode(String message) throws DecodeException { + for (Decoder decoder : decoders) { + if (decoder instanceof Text) { + if (((Text<?>) decoder).willDecode(message)) { + return ((Text<?>) decoder).decode(message); + } + } else { + StringReader r = new StringReader(message); + try { + return ((TextStream<?>) decoder).decode(r); + } catch (IOException ioe) { + throw new DecodeException(message, sm.getString( + "pojoMessageHandlerWhole.decodeIoFail"), ioe); + } + } + } return null; } Modified: tomcat/trunk/res/checkstyle/org-import-control.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/res/checkstyle/org-import-control.xml?rev=1454400&r1=1454399&r2=1454400&view=diff ============================================================================== --- tomcat/trunk/res/checkstyle/org-import-control.xml (original) +++ tomcat/trunk/res/checkstyle/org-import-control.xml Fri Mar 8 14:24:19 2013 @@ -148,6 +148,9 @@ <!-- Ideally want to remove this --> <allow pkg="org.apache.tomcat.websocket.pojo"/> <disallow pkg="javax.servlet"/> + <subpackage name="pojo"> + <allow pkg="org.apache.tomcat.websocket"/> + </subpackage> <subpackage name="server"> <allow pkg="javax.servlet"/> <allow pkg="org.apache.tomcat.websocket"/> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org