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: [email protected]
For additional commands, e-mail: [email protected]