View Javadoc

1   //
2   //  ========================================================================
3   //  Copyright (c) 1995-2013 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.spdy.api;
20  
21  import java.util.HashMap;
22  import java.util.Map;
23  
24  /**
25   * <p>An enumeration of stream statuses.</p>
26   */
27  public enum StreamStatus
28  {
29      /**
30       * <p>The stream status indicating a protocol error</p>
31       */
32      PROTOCOL_ERROR(1, 1),
33      /**
34       * <p>The stream status indicating that the stream is not valid</p>
35       */
36      INVALID_STREAM(2, 2),
37      /**
38       * <p>The stream status indicating that the stream has been refused</p>
39       */
40      REFUSED_STREAM(3, 3),
41      /**
42       * <p>The stream status indicating that the implementation does not support the SPDY version of the stream</p>
43       */
44      UNSUPPORTED_VERSION(4, 4),
45      /**
46       * <p>The stream status indicating that the stream is no longer needed</p>
47       */
48      CANCEL_STREAM(5, 5),
49      /**
50       * <p>The stream status indicating an implementation error</p>
51       */
52      INTERNAL_ERROR(6, 6),
53      /**
54       * <p>The stream status indicating a flow control error</p>
55       */
56      FLOW_CONTROL_ERROR(7, 7),
57      /**
58       * <p>The stream status indicating a stream opened more than once</p>
59       */
60      STREAM_IN_USE(-1, 8),
61      /**
62       * <p>The stream status indicating data on a stream already closed</p>
63       */
64      STREAM_ALREADY_CLOSED(-1, 9),
65      /**
66       * <p>The stream status indicating credentials not valid</p>
67       */
68      INVALID_CREDENTIALS(-1, 10),
69      /**
70       * <p>The stream status indicating that the implementation could not support a frame too large</p>
71       */
72      FRAME_TOO_LARGE(-1, 11);
73  
74      /**
75       * @param version the SPDY protocol version
76       * @param code the stream status code
77       * @return a {@link StreamStatus} from the given version and code,
78       * or null if no such status exists
79       */
80      public static StreamStatus from(short version, int code)
81      {
82          switch (version)
83          {
84              case SPDY.V2:
85                  return Codes.v2Codes.get(code);
86              case SPDY.V3:
87                  return Codes.v3Codes.get(code);
88              default:
89                  throw new IllegalStateException();
90          }
91      }
92  
93      private final int v2Code;
94      private final int v3Code;
95  
96      private StreamStatus(int v2Code, int v3Code)
97      {
98          this.v2Code = v2Code;
99          if (v2Code >= 0)
100             Codes.v2Codes.put(v2Code, this);
101         this.v3Code = v3Code;
102         if (v3Code >= 0)
103             Codes.v3Codes.put(v3Code, this);
104     }
105 
106     /**
107      * @param version the SPDY protocol version
108      * @return the stream status code
109      */
110     public int getCode(short version)
111     {
112         switch (version)
113         {
114             case SPDY.V2:
115                 return v2Code;
116             case SPDY.V3:
117                 return v3Code;
118             default:
119                 throw new IllegalStateException();
120         }
121     }
122 
123     private static class Codes
124     {
125         private static final Map<Integer, StreamStatus> v2Codes = new HashMap<>();
126         private static final Map<Integer, StreamStatus> v3Codes = new HashMap<>();
127     }
128 }