You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2012/12/12 21:26:41 UTC
svn commit: r1420948 - /tomcat/trunk/java/org/apache/tomcat/websocket/
Author: markt
Date: Wed Dec 12 20:26:38 2012
New Revision: 1420948
URL: http://svn.apache.org/viewvc?rev=1420948&view=rev
Log:
WebSocket 1.0 implementation part 13 of many
Complete first draft of @WebSocketMessage annotation handling
Added:
tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerAsyncBase.java
- copied, changed from r1420901, tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerAsync.java
tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerAsyncBinary.java (with props)
tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerAsyncString.java (with props)
tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerBasicBase.java
- copied, changed from r1420901, tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerBasic.java
tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerBasicBinary.java (with props)
tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerBasicPong.java (with props)
tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerBasicString.java (with props)
Removed:
tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerAsync.java
tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerBasic.java
Modified:
tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerBase.java
tomcat/trunk/java/org/apache/tomcat/websocket/PojoMethodMapping.java
tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java
Copied: tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerAsyncBase.java (from r1420901, tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerAsync.java)
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerAsyncBase.java?p2=tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerAsyncBase.java&p1=tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerAsync.java&r1=1420901&r2=1420948&rev=1420948&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerAsync.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerAsyncBase.java Wed Dec 12 20:26:38 2012
@@ -18,25 +18,42 @@ package org.apache.tomcat.websocket;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
+import java.nio.ByteBuffer;
import javax.websocket.MessageHandler;
+import javax.websocket.Session;
-public class PojoMessageHandlerAsync<T> extends PojoMessageHandlerBase<T>
- implements MessageHandler.Async<T> {
+public abstract class PojoMessageHandlerAsyncBase<T>
+ extends PojoMessageHandlerBase<T> implements MessageHandler.Async<T> {
- public PojoMessageHandlerAsync(Object pojo, Method method,
- WsSession wsSession) {
- super(pojo, method, wsSession);
+ private final int indexBoolean;
+
+ public PojoMessageHandlerAsyncBase(Object pojo, Method method,
+ Session session, Object[] params, int indexPayload,
+ boolean wrap, int indexBoolean, int indexSession) {
+ super(pojo, method, session, params, indexPayload, wrap,
+ indexSession);
+ this.indexBoolean = indexBoolean;
}
@Override
public void onMessage(T message, boolean last) {
- Object[] params = null; // TODO insert message, last and session into
- // params
+ Object[] parameters = params.clone();
+ if (indexBoolean != -1) {
+ parameters[indexBoolean] = Boolean.valueOf(last);
+ }
+ if (indexSession != -1) {
+ parameters[indexSession] = session;
+ }
+ if (unwrap) {
+ parameters[indexPayload] = ((ByteBuffer) message).array();
+ } else {
+ parameters[indexPayload] = message;
+ }
Object result;
try {
- result = method.invoke(pojo, params);
+ result = method.invoke(pojo, parameters);
} catch (IllegalAccessException | InvocationTargetException e) {
throw new IllegalArgumentException();
}
Added: tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerAsyncBinary.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerAsyncBinary.java?rev=1420948&view=auto
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerAsyncBinary.java (added)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerAsyncBinary.java Wed Dec 12 20:26:38 2012
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tomcat.websocket;
+
+import java.lang.reflect.Method;
+import java.nio.ByteBuffer;
+
+import javax.websocket.Session;
+
+
+public class PojoMessageHandlerAsyncBinary
+ extends PojoMessageHandlerAsyncBase<ByteBuffer>{
+
+ public PojoMessageHandlerAsyncBinary(Object pojo, Method method,
+ Session session, Object[] params, int indexPayload, boolean wrap,
+ int indexBoolean, int indexSession) {
+ super(pojo, method, session, params, indexPayload, wrap, indexBoolean,
+ indexSession);
+ }
+}
Propchange: tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerAsyncBinary.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerAsyncString.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerAsyncString.java?rev=1420948&view=auto
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerAsyncString.java (added)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerAsyncString.java Wed Dec 12 20:26:38 2012
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tomcat.websocket;
+
+import java.lang.reflect.Method;
+
+import javax.websocket.Session;
+
+
+public class PojoMessageHandlerAsyncString
+ extends PojoMessageHandlerAsyncBase<String>{
+
+ public PojoMessageHandlerAsyncString(Object pojo, Method method,
+ Session session, Object[] params, int indexPayload, boolean wrap,
+ int indexBoolean, int indexSession) {
+ super(pojo, method, session, params, indexPayload, wrap, indexBoolean,
+ indexSession);
+ }
+}
Propchange: tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerAsyncString.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerBase.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerBase.java?rev=1420948&r1=1420947&r2=1420948&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerBase.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerBase.java Wed Dec 12 20:26:38 2012
@@ -21,33 +21,53 @@ import java.lang.reflect.Method;
import java.nio.ByteBuffer;
import javax.websocket.EncodeException;
+import javax.websocket.RemoteEndpoint;
+import javax.websocket.Session;
public abstract class PojoMessageHandlerBase<T> {
protected final Object pojo;
protected final Method method;
- protected final WsSession wsSession;
+ protected final Session session;
+ protected final Object[] params;
+ protected final int indexPayload;
+ protected final boolean unwrap;
+ protected final int indexSession;
public PojoMessageHandlerBase(Object pojo, Method method,
- WsSession wsSession) {
+ Session session, Object[] params, int indexPayload, boolean unwrap,
+ int indexSession) {
this.pojo = pojo;
this.method = method;
- this.wsSession = wsSession;
+ this.session = session;
+ this.params = params;
+ this.indexPayload = indexPayload;
+ this.unwrap = unwrap;
+ this.indexSession = indexSession;
}
protected void processResult(Object result) {
+ if (result == null) {
+ return;
+ }
+
+ RemoteEndpoint remoteEndpoint = session.getRemote();
+ // TODO: Remove this once sendXxx is implemented?
+ if (remoteEndpoint == null) {
+ return;
+ }
+
try {
if (result instanceof String) {
- wsSession.getRemote().sendString((String) result);
+ remoteEndpoint.sendString((String) result);
} else if (result instanceof ByteBuffer) {
- wsSession.getRemote().sendBytes((ByteBuffer) result);
+ remoteEndpoint.sendBytes((ByteBuffer) result);
} else if (result instanceof byte[]) {
- wsSession.getRemote().sendBytes(
- ByteBuffer.wrap((byte[]) result));
- } else if (result != null) {
- wsSession.getRemote().sendObject(result);
+ remoteEndpoint.sendBytes(ByteBuffer.wrap((byte[]) result));
+ } else {
+ remoteEndpoint.sendObject(result);
}
} catch (IOException | EncodeException ioe) {
throw new IllegalStateException(ioe);
Copied: tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerBasicBase.java (from r1420901, tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerBasic.java)
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerBasicBase.java?p2=tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerBasicBase.java&p1=tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerBasic.java&r1=1420901&r2=1420948&rev=1420948&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerBasic.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerBasicBase.java Wed Dec 12 20:26:38 2012
@@ -18,24 +18,36 @@ package org.apache.tomcat.websocket;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
+import java.nio.ByteBuffer;
import javax.websocket.MessageHandler;
+import javax.websocket.Session;
-public class PojoMessageHandlerBasic<T> extends PojoMessageHandlerBase<T>
- implements MessageHandler.Basic<T> {
+public abstract class PojoMessageHandlerBasicBase<T>
+ extends PojoMessageHandlerBase<T> implements MessageHandler.Basic<T> {
- public PojoMessageHandlerBasic(Object pojo, Method method,
- WsSession wsSession) {
- super(pojo, method, wsSession);
+ public PojoMessageHandlerBasicBase(Object pojo, Method method,
+ Session session, Object[] params, int indexPayload,
+ boolean wrap, int indexSession) {
+ super(pojo, method, session, params, indexPayload, wrap,
+ indexSession);
}
@Override
public void onMessage(T message) {
- Object[] params = null; // TODO insert message and session into params
+ Object[] parameters = params.clone();
+ if (indexSession != -1) {
+ parameters[indexSession] = session;
+ }
+ if (unwrap) {
+ parameters[indexPayload] = ((ByteBuffer) message).array();
+ } else {
+ parameters[indexPayload] = message;
+ }
Object result;
try {
- result = method.invoke(pojo, params);
+ result = method.invoke(pojo, parameters);
} catch (IllegalAccessException | InvocationTargetException e) {
throw new IllegalArgumentException();
}
Added: tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerBasicBinary.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerBasicBinary.java?rev=1420948&view=auto
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerBasicBinary.java (added)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerBasicBinary.java Wed Dec 12 20:26:38 2012
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tomcat.websocket;
+
+import java.lang.reflect.Method;
+import java.nio.ByteBuffer;
+
+import javax.websocket.Session;
+
+public class PojoMessageHandlerBasicBinary
+ extends PojoMessageHandlerBasicBase<ByteBuffer> {
+
+ public PojoMessageHandlerBasicBinary(Object pojo, Method method,
+ Session session, Object[] params, int indexPayload, boolean wrap,
+ int indexSession) {
+ super(pojo, method, session, params, indexPayload, wrap, indexSession);
+ }
+}
Propchange: tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerBasicBinary.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerBasicPong.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerBasicPong.java?rev=1420948&view=auto
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerBasicPong.java (added)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerBasicPong.java Wed Dec 12 20:26:38 2012
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tomcat.websocket;
+
+import java.lang.reflect.Method;
+
+import javax.websocket.PongMessage;
+import javax.websocket.Session;
+
+public class PojoMessageHandlerBasicPong
+ extends PojoMessageHandlerBasicBase<PongMessage> {
+
+ public PojoMessageHandlerBasicPong(Object pojo, Method method,
+ Session session, Object[] params, int indexPayload, boolean wrap,
+ int indexSession) {
+ super(pojo, method, session, params, indexPayload, wrap, indexSession);
+ }
+}
Propchange: tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerBasicPong.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerBasicString.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerBasicString.java?rev=1420948&view=auto
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerBasicString.java (added)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerBasicString.java Wed Dec 12 20:26:38 2012
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tomcat.websocket;
+
+import java.lang.reflect.Method;
+
+import javax.websocket.Session;
+
+public class PojoMessageHandlerBasicString
+ extends PojoMessageHandlerBasicBase<String> {
+
+ public PojoMessageHandlerBasicString(Object pojo, Method method,
+ Session session, Object[] params, int indexPayload, boolean wrap,
+ int indexSession) {
+ super(pojo, method, session, params, indexPayload, wrap, indexSession);
+ }
+}
Propchange: tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerBasicString.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: tomcat/trunk/java/org/apache/tomcat/websocket/PojoMethodMapping.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/PojoMethodMapping.java?rev=1420948&r1=1420947&r2=1420948&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/PojoMethodMapping.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/PojoMethodMapping.java Wed Dec 12 20:26:38 2012
@@ -18,11 +18,14 @@ package org.apache.tomcat.websocket;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
+import java.nio.ByteBuffer;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import javax.websocket.MessageHandler;
+import javax.websocket.PongMessage;
import javax.websocket.Session;
import javax.websocket.WebSocketClose;
import javax.websocket.WebSocketError;
@@ -51,6 +54,11 @@ public class PojoMethodMapping {
Method open = null;
Method close = null;
Method error = null;
+ if (path.length() > mappingPath.length()) {
+ template = new UriTemplate(path.substring(mappingPath.length() - 2));
+ } else {
+ template = null;
+ }
for (Method method : clazzPojo.getMethods()) {
if (open == null &&
method.getAnnotation(WebSocketOpen.class) != null) {
@@ -62,17 +70,12 @@ public class PojoMethodMapping {
method.getAnnotation(WebSocketError.class) != null) {
error = method;
} else if (method.getAnnotation(WebSocketMessage.class) != null) {
- onMessage.add(new MessageMethod(method));
+ onMessage.add(new MessageMethod(method, template));
}
}
this.onOpen = open;
this.onClose = close;
this.onError = error;
- if (path.length() > mappingPath.length()) {
- template = new UriTemplate(path.substring(mappingPath.length() - 2));
- } else {
- template = null;
- }
onOpenParams = getPathParams(onOpen, false);
onCloseParams = getPathParams(onClose, false);
onErrorParams = getPathParams(onError, true);
@@ -114,20 +117,12 @@ public class PojoMethodMapping {
Session session) {
Set<MessageHandler> result = new HashSet<>();
for (MessageMethod messageMethod : onMessage) {
- result.add(buildMessageHandler(messageMethod, pojo, pathInfo,
- session));
+ result.add(messageMethod.getMessageHandler(pojo, pathInfo,session));
}
return result;
}
- private static MessageHandler buildMessageHandler(
- MessageMethod messageMethod, Object pojo, String pathInfo,
- Session session) {
- return null;
- }
-
-
private static PathParam[] getPathParams(Method m, boolean isError) {
if (m == null) {
return new PathParam[0];
@@ -220,20 +215,168 @@ public class PojoMethodMapping {
private static class MessageMethod {
private final Method m;
+ private final UriTemplate template;
+ private int indexString = -1;
+ private int indexByteArray = -1;
+ private int indexByteBuffer = -1;
+ private int indexPong = -1;
+ private int indexBoolean = -1;
+ private int indexSession = -1;
+ private Map<Integer,PathParam> indexPathParams = new HashMap<>();
+ private int indexPayload = -1;
- public MessageMethod(Method m) {
+ public MessageMethod(Method m, UriTemplate template) {
this.m = m;
- }
+ this.template = template;
+ Class<?>[] types = m.getParameterTypes();
+ Annotation[][] paramsAnnotations = m.getParameterAnnotations();
- public Method getMethod() {
- return m;
+ for (int i = 0; i < types.length; i++) {
+ if (types[i] == String.class) {
+ Annotation[] paramAnnotations = paramsAnnotations[i];
+ for (Annotation paramAnnotation : paramAnnotations) {
+ if (paramAnnotation.annotationType().equals(
+ WebSocketPathParam.class)) {
+ indexPathParams.put(
+ Integer.valueOf(i), new PathParam(types[i],
+ ((WebSocketPathParam) paramAnnotation).value()));
+ break;
+ }
+ }
+ if (indexString == -1) {
+ indexString = i;
+ } else {
+ // TODO i18n
+ throw new IllegalArgumentException();
+ }
+ } else if (types[i] == boolean.class) {
+ if (indexBoolean == -1) {
+ indexBoolean = i;
+ } else {
+ // TODO i18n
+ throw new IllegalArgumentException();
+ }
+ } else if (types[i] == ByteBuffer.class) {
+ if (indexByteBuffer == -1) {
+ indexByteBuffer = i;
+ } else {
+ // TODO i18n
+ throw new IllegalArgumentException();
+ }
+ } else if (types[i] == byte[].class) {
+ if (indexByteArray == -1) {
+ indexByteArray = i;
+ } else {
+ // TODO i18n
+ throw new IllegalArgumentException();
+ }
+ } else if (types[i] == Session.class) {
+ if (indexSession == -1) {
+ indexSession = i;
+ } else {
+ // TODO i18n
+ throw new IllegalArgumentException();
+ }
+ } else if (types[i] == PongMessage.class) {
+ if (indexPong == -1) {
+ indexPong = i;
+ } else {
+ // TODO i18n
+ throw new IllegalArgumentException();
+ }
+ }
+ }
+ // Additional checks required
+ if (indexString != -1) {
+ indexPayload = indexString;
+ }
+ if (indexByteArray != -1) {
+ if (indexPayload != -1) {
+ // TODO i18n
+ throw new IllegalArgumentException();
+ } else {
+ indexPayload = indexByteArray;
+ }
+ }
+ if (indexByteBuffer != -1) {
+ if (indexPayload != -1) {
+ // TODO i18n
+ throw new IllegalArgumentException();
+ } else {
+ indexPayload = indexByteBuffer;
+ }
+ }
+ if (indexPong != -1) {
+ if (indexPayload != -1) {
+ // TODO i18n
+ throw new IllegalArgumentException();
+ } else {
+ indexPayload = indexPong;
+ }
+ }
+ if (indexPayload == -1) {
+ // TODO i18n
+ throw new IllegalArgumentException();
+ }
+ if (indexPong != -1 && indexBoolean != -1) {
+ // TODO i18n
+ throw new IllegalArgumentException();
+ }
}
- public Object[] getParameters() {
- return null;
+ public MessageHandler getMessageHandler(Object pojo, String pathInfo,
+ Session session) {
+ Object[] params = new Object[m.getParameterTypes().length];
+
+ Map<String,String> pathParams = template.match(pathInfo);
+
+ for (Map.Entry<Integer,PathParam> entry :
+ indexPathParams.entrySet()) {
+ PathParam pathParam = entry.getValue();
+ String valueString = pathParams.get(pathParam.getName());
+ Object value = null;
+ if (valueString != null) {
+ value = coerceToType(pathParam.getType(), valueString);
+ }
+ params[entry.getKey().intValue()] = value;
+ }
+
+ MessageHandler mh = null;
+ if (indexBoolean == -1) {
+ // Basic
+ if (indexString != -1) {
+ mh = new PojoMessageHandlerBasicString(pojo, m, session,
+ params, indexString, false, indexSession);
+ } else if (indexByteArray != -1) {
+ mh = new PojoMessageHandlerBasicBinary(pojo, m, session,
+ params, indexByteArray, true, indexSession);
+ } else if (indexByteBuffer != -1) {
+ mh = new PojoMessageHandlerBasicBinary(pojo, m, session,
+ params, indexByteBuffer, false, indexSession);
+ } else {
+ mh = new PojoMessageHandlerBasicPong(pojo, m, session,
+ params, indexPong, false, indexSession);
+ }
+ } else {
+ // ASync
+ if (indexString != -1) {
+ mh = new PojoMessageHandlerAsyncString(pojo, m, session,
+ params, indexString, false, indexSession,
+ indexBoolean);
+ } else if (indexByteArray != -1) {
+ mh = new PojoMessageHandlerAsyncBinary(pojo, m, session,
+ params, indexByteArray, true, indexSession,
+ indexBoolean);
+ } else {
+ mh = new PojoMessageHandlerAsyncBinary(pojo, m, session,
+ params, indexByteBuffer, false, indexSession,
+ indexBoolean);
+ }
+ }
+ return mh;
}
}
}
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=1420948&r1=1420947&r2=1420948&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java Wed Dec 12 20:26:38 2012
@@ -17,6 +17,7 @@
package org.apache.tomcat.websocket;
import java.io.IOException;
+import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.net.URI;
import java.nio.ByteBuffer;
@@ -58,24 +59,24 @@ public class WsSession implements Sessio
@SuppressWarnings("unchecked")
@Override
public void addMessageHandler(MessageHandler listener) {
- Type[] types = listener.getClass().getGenericInterfaces();
+ Type[] types = ((ParameterizedType) listener.getClass().getGenericSuperclass()).getActualTypeArguments();
if (types.length != 1) {
// TODO i18n
throw new IllegalArgumentException();
}
- if (types[0].getClass().equals(String.class)) {
+ if (types[0].equals(String.class)) {
if (textMessageHandler != null) {
// TODO i18n
throw new IllegalStateException();
}
textMessageHandler = listener;
- } else if (types[0].getClass().equals(ByteBuffer.class)) {
+ } else if (types[0].equals(ByteBuffer.class)) {
if (binaryMessageHandler != null) {
// TODO i18n
throw new IllegalStateException();
}
binaryMessageHandler = listener;
- } else if (types[0].getClass().equals(PongMessage.class)) {
+ } else if (types[0].equals(PongMessage.class)) {
if (pongMessageHandler != null) {
// TODO i18n
throw new IllegalStateException();
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org