Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/metadata/DecoderMetadataSet.java')
-rw-r--r--jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/metadata/DecoderMetadataSet.java92
1 files changed, 92 insertions, 0 deletions
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/metadata/DecoderMetadataSet.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/metadata/DecoderMetadataSet.java
new file mode 100644
index 0000000000..0307b3caf8
--- /dev/null
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/metadata/DecoderMetadataSet.java
@@ -0,0 +1,92 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2013 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.websocket.jsr356.metadata;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.websocket.Decoder;
+
+import org.eclipse.jetty.websocket.api.InvalidWebSocketException;
+import org.eclipse.jetty.websocket.common.events.annotated.InvalidSignatureException;
+import org.eclipse.jetty.websocket.common.util.ReflectUtils;
+import org.eclipse.jetty.websocket.jsr356.MessageType;
+
+public class DecoderMetadataSet extends CoderMetadataSet<Decoder, DecoderMetadata>
+{
+ @Override
+ protected List<DecoderMetadata> discover(Class<? extends Decoder> decoder)
+ {
+ List<DecoderMetadata> metadatas = new ArrayList<>();
+
+ if (Decoder.Binary.class.isAssignableFrom(decoder))
+ {
+ Class<?> objType = getDecoderType(decoder,Decoder.Binary.class);
+ metadatas.add(new DecoderMetadata(decoder,objType,MessageType.BINARY,false));
+ }
+ if (Decoder.BinaryStream.class.isAssignableFrom(decoder))
+ {
+ Class<?> objType = getDecoderType(decoder,Decoder.BinaryStream.class);
+ metadatas.add(new DecoderMetadata(decoder,objType,MessageType.BINARY,true));
+ }
+ if (Decoder.Text.class.isAssignableFrom(decoder))
+ {
+ Class<?> objType = getDecoderType(decoder,Decoder.Text.class);
+ metadatas.add(new DecoderMetadata(decoder,objType,MessageType.TEXT,false));
+ }
+ if (Decoder.TextStream.class.isAssignableFrom(decoder))
+ {
+ Class<?> objType = getDecoderType(decoder,Decoder.TextStream.class);
+ metadatas.add(new DecoderMetadata(decoder,objType,MessageType.TEXT,true));
+ }
+
+ if (!ReflectUtils.isDefaultConstructable(decoder))
+ {
+ throw new InvalidSignatureException("Decoder must have public, no-args constructor: " + decoder.getName());
+ }
+
+ if (metadatas.size() <= 0)
+ {
+ throw new InvalidSignatureException("Not a valid Decoder class: " + decoder.getName());
+ }
+
+ return metadatas;
+ }
+
+ private Class<?> getDecoderType(Class<? extends Decoder> decoder, Class<?> interfaceClass)
+ {
+ Class<?> decoderClass = ReflectUtils.findGenericClassFor(decoder,interfaceClass);
+ if (decoderClass == null)
+ {
+ StringBuilder err = new StringBuilder();
+ err.append("Invalid type declared for interface ");
+ err.append(interfaceClass.getName());
+ err.append(" on class ");
+ err.append(decoder);
+ throw new InvalidWebSocketException(err.toString());
+ }
+ return decoderClass;
+ }
+
+ protected final void register(Class<?> type, Class<? extends Decoder> decoder, MessageType msgType, boolean streamed)
+ {
+ DecoderMetadata metadata = new DecoderMetadata(decoder,type,msgType,streamed);
+ trackMetadata(metadata);
+ }
+}

Back to the top