View Javadoc

1   //
2   //  ========================================================================
3   //  Copyright (c) 1995-2016 Mort Bay Consulting Pty. Ltd.
4   //  ------------------------------------------------------------------------
5   //  All rights reserved. This program and the accompanying materials
6   //  are made available under the terms of the Eclipse Public License v1.0
7   //  and Apache License v2.0 which accompanies this distribution.
8   //
9   //      The Eclipse Public License is available at
10  //      http://www.eclipse.org/legal/epl-v10.html
11  //
12  //      The Apache License v2.0 is available at
13  //      http://www.opensource.org/licenses/apache2.0.php
14  //
15  //  You may elect to redistribute this code under either of these licenses.
16  //  ========================================================================
17  //
18  
19  package org.eclipse.jetty.websocket.jsr356.messages;
20  
21  import java.io.IOException;
22  import java.nio.ByteBuffer;
23  
24  import javax.websocket.MessageHandler;
25  import javax.websocket.MessageHandler.Partial;
26  
27  import org.eclipse.jetty.util.BufferUtil;
28  import org.eclipse.jetty.websocket.common.message.MessageAppender;
29  import org.eclipse.jetty.websocket.jsr356.MessageHandlerWrapper;
30  
31  /**
32   * Partial BINARY MessageAppender for MessageHandler.Partial interface
33   */
34  public class BinaryPartialMessage implements MessageAppender
35  {
36      private final MessageHandlerWrapper msgWrapper;
37      private final MessageHandler.Partial<Object> partialHandler;
38  
39      @SuppressWarnings("unchecked")
40      public BinaryPartialMessage(MessageHandlerWrapper wrapper)
41      {
42          this.msgWrapper = wrapper;
43          this.partialHandler = (Partial<Object>)wrapper.getHandler();
44      }
45  
46      @Override
47      public void appendFrame(ByteBuffer payload, boolean isLast) throws IOException
48      {
49          // No decoders for Partial messages per JSR-356 (PFD1 spec)
50  
51          // Supported Partial<> Type #1: ByteBuffer
52          if (msgWrapper.isMessageType(ByteBuffer.class))
53          {
54              partialHandler.onMessage(payload.slice(),isLast);
55              return;
56          }
57  
58          // Supported Partial<> Type #2: byte[]
59          if (msgWrapper.isMessageType(byte[].class))
60          {
61              partialHandler.onMessage(BufferUtil.toArray(payload),isLast);
62              return;
63          }
64  
65          StringBuilder err = new StringBuilder();
66          err.append(msgWrapper.getHandler().getClass());
67          err.append(" does not implement an expected ");
68          err.append(MessageHandler.Partial.class.getName());
69          err.append(" of type ");
70          err.append(ByteBuffer.class.getName());
71          err.append(" or byte[]");
72          throw new IllegalStateException(err.toString());
73      }
74  
75      @Override
76      public void messageComplete()
77      {
78          /* nothing to do here */
79      }
80  }