Issue #207 - Support javax.websocket version 1.1
This commit is contained in:
parent
94ea9f5b05
commit
1f196f5276
|
@ -246,7 +246,7 @@ public class ClientContainer extends ContainerLifeCycle implements WebSocketCont
|
||||||
|
|
||||||
// synchronized (endpointClientMetadataCache)
|
// synchronized (endpointClientMetadataCache)
|
||||||
// {
|
// {
|
||||||
// metadata = endpointClientMetadataCache.get(endpoint);
|
//
|
||||||
//
|
//
|
||||||
// if (metadata != null)
|
// if (metadata != null)
|
||||||
// {
|
// {
|
||||||
|
@ -282,7 +282,7 @@ public class ClientContainer extends ContainerLifeCycle implements WebSocketCont
|
||||||
// endpointClientMetadataCache.put(endpoint,metadata);
|
// endpointClientMetadataCache.put(endpoint,metadata);
|
||||||
// return metadata;
|
// return metadata;
|
||||||
// }
|
// }
|
||||||
return metadata;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public DecoderFactory getDecoderFactory()
|
public DecoderFactory getDecoderFactory()
|
||||||
|
|
|
@ -18,14 +18,17 @@
|
||||||
|
|
||||||
package org.eclipse.jetty.websocket.jsr356.annotations;
|
package org.eclipse.jetty.websocket.jsr356.annotations;
|
||||||
|
|
||||||
import javax.websocket.OnClose;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Callable for {@link javax.websocket.OnClose} annotated methods
|
* Callable for {@link javax.websocket.OnClose} annotated methods
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public class OnCloseCallable extends JsrCallable
|
public class OnCloseCallable extends JsrCallable
|
||||||
{
|
{
|
||||||
|
@Override
|
||||||
|
public void setDecodingType(Class<?> decodingType)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
/*private int idxCloseReason = -1;
|
/*private int idxCloseReason = -1;
|
||||||
|
|
||||||
public OnCloseCallable(Class<?> pojo, Method method)
|
public OnCloseCallable(Class<?> pojo, Method method)
|
||||||
|
|
|
@ -26,6 +26,11 @@ import javax.websocket.OnError;
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public class OnErrorCallable extends JsrCallable
|
public class OnErrorCallable extends JsrCallable
|
||||||
{
|
{
|
||||||
|
@Override
|
||||||
|
public void setDecodingType(Class<?> decodingType)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
/* private int idxThrowable = -1;
|
/* private int idxThrowable = -1;
|
||||||
|
|
||||||
public OnErrorCallable(Class<?> pojo, Method method)
|
public OnErrorCallable(Class<?> pojo, Method method)
|
||||||
|
|
|
@ -21,6 +21,12 @@ package org.eclipse.jetty.websocket.jsr356.annotations;
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public class OnMessageCallable extends JsrCallable
|
public class OnMessageCallable extends JsrCallable
|
||||||
{
|
{
|
||||||
|
@Override
|
||||||
|
public void setDecodingType(Class<?> decodingType)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/* protected final Class<?> returnType;
|
/* protected final Class<?> returnType;
|
||||||
protected Encoder returnEncoder;
|
protected Encoder returnEncoder;
|
||||||
protected Class<?> decodingType;
|
protected Class<?> decodingType;
|
||||||
|
|
|
@ -18,14 +18,17 @@
|
||||||
|
|
||||||
package org.eclipse.jetty.websocket.jsr356.annotations;
|
package org.eclipse.jetty.websocket.jsr356.annotations;
|
||||||
|
|
||||||
import javax.websocket.OnOpen;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Callable for {@link javax.websocket.OnOpen} annotated methods
|
* Callable for {@link javax.websocket.OnOpen} annotated methods
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public class OnOpenCallable extends JsrCallable
|
public class OnOpenCallable extends JsrCallable
|
||||||
{
|
{
|
||||||
|
@Override
|
||||||
|
public void setDecodingType(Class<?> decodingType)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
/* private int idxEndpointConfig = -1;
|
/* private int idxEndpointConfig = -1;
|
||||||
|
|
||||||
public OnOpenCallable(Class<?> pojo, Method method)
|
public OnOpenCallable(Class<?> pojo, Method method)
|
||||||
|
|
|
@ -35,10 +35,10 @@ import org.eclipse.jetty.websocket.common.util.ReflectUtils;
|
||||||
public class OnByteArrayFunction implements Function<byte[], Void>
|
public class OnByteArrayFunction implements Function<byte[], Void>
|
||||||
{
|
{
|
||||||
private static final DynamicArgs.Builder ARGBUILDER;
|
private static final DynamicArgs.Builder ARGBUILDER;
|
||||||
private static final Arg ARG_SESSION = new Arg(1, Session.class);
|
private static final Arg ARG_SESSION = new Arg(Session.class);
|
||||||
private static final Arg ARG_BUFFER = new Arg(2, byte[].class).required();
|
private static final Arg ARG_BUFFER = new Arg(byte[].class).required();
|
||||||
private static final Arg ARG_OFFSET = new Arg(3, int.class);
|
private static final Arg ARG_OFFSET = new Arg(int.class);
|
||||||
private static final Arg ARG_LENGTH = new Arg(4, int.class);
|
private static final Arg ARG_LENGTH = new Arg(int.class);
|
||||||
|
|
||||||
static
|
static
|
||||||
{
|
{
|
||||||
|
|
|
@ -49,7 +49,16 @@ public class Arg
|
||||||
this.index = idx;
|
this.index = idx;
|
||||||
this.type = type;
|
this.type = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Arg(Arg arg)
|
||||||
|
{
|
||||||
|
this.method = arg.method;
|
||||||
|
this.index = arg.index;
|
||||||
|
this.type = arg.type;
|
||||||
|
this.tag = arg.tag;
|
||||||
|
this.required = arg.required;
|
||||||
|
}
|
||||||
|
|
||||||
public <T extends Annotation> T getAnnotation(Class<T> annoClass)
|
public <T extends Annotation> T getAnnotation(Class<T> annoClass)
|
||||||
{
|
{
|
||||||
if (method == null)
|
if (method == null)
|
||||||
|
|
|
@ -31,6 +31,26 @@ import org.eclipse.jetty.websocket.common.util.ReflectUtils;
|
||||||
|
|
||||||
class UnorderedSignature implements Signature, Predicate<Method>
|
class UnorderedSignature implements Signature, Predicate<Method>
|
||||||
{
|
{
|
||||||
|
private class SelectedArg extends Arg
|
||||||
|
{
|
||||||
|
private boolean selected = false;
|
||||||
|
|
||||||
|
public SelectedArg(Arg arg)
|
||||||
|
{
|
||||||
|
super(arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSelected()
|
||||||
|
{
|
||||||
|
return selected;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void selected()
|
||||||
|
{
|
||||||
|
this.selected = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private final static Logger LOG = Log.getLogger(UnorderedSignature.class);
|
private final static Logger LOG = Log.getLogger(UnorderedSignature.class);
|
||||||
private final Arg[] params;
|
private final Arg[] params;
|
||||||
|
|
||||||
|
@ -118,6 +138,13 @@ class UnorderedSignature implements Signature, Predicate<Method>
|
||||||
methodArgs[pi] = argId.apply(methodArgs[pi]);
|
methodArgs[pi] = argId.apply(methodArgs[pi]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Selected Args
|
||||||
|
SelectedArg selectedArgs[] = new SelectedArg[callArgs.length];
|
||||||
|
for (int ci = 0; ci < selectedArgs.length; ci++)
|
||||||
|
{
|
||||||
|
selectedArgs[ci] = new SelectedArg(callArgs[ci]);
|
||||||
|
}
|
||||||
|
|
||||||
// Iterate through mappings, looking for a callArg that fits it
|
// Iterate through mappings, looking for a callArg that fits it
|
||||||
for (int ai = 0; ai < argMappingLength; ai++)
|
for (int ai = 0; ai < argMappingLength; ai++)
|
||||||
{
|
{
|
||||||
|
@ -126,8 +153,9 @@ class UnorderedSignature implements Signature, Predicate<Method>
|
||||||
// Find reference to argument in callArgs
|
// Find reference to argument in callArgs
|
||||||
for (int ci = 0; ci < callArgsLen; ci++)
|
for (int ci = 0; ci < callArgsLen; ci++)
|
||||||
{
|
{
|
||||||
if (methodArgs[ai].matches(callArgs[ci]))
|
if (!selectedArgs[ci].selected && methodArgs[ai].matches(selectedArgs[ci]))
|
||||||
{
|
{
|
||||||
|
selectedArgs[ci].selected();
|
||||||
ref = ci;
|
ref = ci;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -171,32 +199,20 @@ class UnorderedSignature implements Signature, Predicate<Method>
|
||||||
// Ensure that required arguments are present in the mapping
|
// Ensure that required arguments are present in the mapping
|
||||||
for (int ci = 0; ci < callArgsLen; ci++)
|
for (int ci = 0; ci < callArgsLen; ci++)
|
||||||
{
|
{
|
||||||
if (callArgs[ci].isRequired())
|
if (selectedArgs[ci].isRequired() && !selectedArgs[ci].isSelected())
|
||||||
{
|
{
|
||||||
boolean found = false;
|
StringBuilder err = new StringBuilder();
|
||||||
for (int ai = 0; ai < argMappingLength; ai++)
|
err.append("Unable to find required type [");
|
||||||
|
err.append(callArgs[ci].getType());
|
||||||
|
err.append("] in method ");
|
||||||
|
ReflectUtils.append(err, method);
|
||||||
|
|
||||||
|
if (throwOnFailure)
|
||||||
|
throw new DynamicArgsException(err.toString());
|
||||||
|
else
|
||||||
{
|
{
|
||||||
if (argMapping[ai] == ci)
|
LOG.debug("{}", err.toString());
|
||||||
{
|
return null;
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!found)
|
|
||||||
{
|
|
||||||
StringBuilder err = new StringBuilder();
|
|
||||||
err.append("Unable to find required type [");
|
|
||||||
err.append(callArgs[ci].getType());
|
|
||||||
err.append("] in method ");
|
|
||||||
ReflectUtils.append(err, method);
|
|
||||||
|
|
||||||
if (throwOnFailure)
|
|
||||||
throw new DynamicArgsException(err.toString());
|
|
||||||
else
|
|
||||||
{
|
|
||||||
LOG.debug("{}", err.toString());
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -217,13 +217,9 @@ public class DynamicArgsTest
|
||||||
DynamicArgs.Builder dab = new DynamicArgs.Builder();
|
DynamicArgs.Builder dab = new DynamicArgs.Builder();
|
||||||
dab.addSignature(ARG_BYTEARRAY, ARG_OFFSET, ARG_LENGTH);
|
dab.addSignature(ARG_BYTEARRAY, ARG_OFFSET, ARG_LENGTH);
|
||||||
|
|
||||||
final Arg CALL_BYTEARRAY = new Arg(byte[].class);
|
|
||||||
final Arg CALL_OFFSET = new Arg(int.class).setTag("offset");
|
|
||||||
final Arg CALL_LENGTH = new Arg(int.class).setTag("length");
|
|
||||||
|
|
||||||
SampleSignatures ssigs = new SampleSignatures();
|
SampleSignatures ssigs = new SampleSignatures();
|
||||||
Method m = findMethodByName(ssigs, "sigByteArray");
|
Method m = findMethodByName(ssigs, "sigByteArray");
|
||||||
DynamicArgs dynamicArgs = dab.build(m, CALL_BYTEARRAY, CALL_OFFSET, CALL_LENGTH);
|
DynamicArgs dynamicArgs = dab.build(m, ARG_BYTEARRAY, ARG_OFFSET, ARG_LENGTH);
|
||||||
assertThat("DynamicArgs", dynamicArgs, notNullValue());
|
assertThat("DynamicArgs", dynamicArgs, notNullValue());
|
||||||
|
|
||||||
// Test with potential args
|
// Test with potential args
|
||||||
|
|
|
@ -32,6 +32,7 @@ import org.eclipse.jetty.websocket.common.test.Fuzzer;
|
||||||
import org.eclipse.jetty.websocket.common.test.Fuzzer.SendMode;
|
import org.eclipse.jetty.websocket.common.test.Fuzzer.SendMode;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
@SuppressWarnings("Duplicates")
|
||||||
public class TestABCase1 extends AbstractABCase
|
public class TestABCase1 extends AbstractABCase
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -2,7 +2,7 @@ org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
|
||||||
org.eclipse.jetty.LEVEL=WARN
|
org.eclipse.jetty.LEVEL=WARN
|
||||||
|
|
||||||
# org.eclipse.jetty.io.WriteFlusher.LEVEL=DEBUG
|
# org.eclipse.jetty.io.WriteFlusher.LEVEL=DEBUG
|
||||||
# org.eclipse.jetty.websocket.LEVEL=DEBUG
|
org.eclipse.jetty.websocket.LEVEL=DEBUG
|
||||||
# org.eclipse.jetty.websocket.LEVEL=INFO
|
# org.eclipse.jetty.websocket.LEVEL=INFO
|
||||||
# org.eclipse.jetty.websocket.common.io.LEVEL=DEBUG
|
# org.eclipse.jetty.websocket.common.io.LEVEL=DEBUG
|
||||||
# org.eclipse.jetty.websocket.server.ab.LEVEL=DEBUG
|
# org.eclipse.jetty.websocket.server.ab.LEVEL=DEBUG
|
||||||
|
|
Loading…
Reference in New Issue