View Javadoc

1   package org.eclipse.jetty.websocket;
2   
3   import java.io.IOException;
4   import java.util.HashMap;
5   import java.util.Map;
6   
7   import org.eclipse.jetty.io.Buffer;
8   import org.eclipse.jetty.util.QuotedStringTokenizer;
9   import org.eclipse.jetty.util.TypeUtil;
10  import org.eclipse.jetty.websocket.WebSocketParser.FrameHandler;
11  
12  public class AbstractExtension implements Extension
13  {
14      private static final int[] __mask = { -1, 0x04, 0x02, 0x01};
15      private final String _name;
16      private final Map<String,String> _parameters=new HashMap<String, String>();
17      private FrameHandler _inbound;
18      private WebSocketGenerator _outbound;
19      private WebSocket.FrameConnection _connection;
20      
21      public AbstractExtension(String name)
22      {
23          _name = name;
24      }
25      
26      public WebSocket.FrameConnection getConnection()
27      {
28          return _connection;
29      }
30  
31      public boolean init(Map<String, String> parameters)
32      {
33          _parameters.putAll(parameters);
34          return true;
35      }
36      
37      public String getInitParameter(String name)
38      {
39          return _parameters.get(name);
40      }
41  
42      public String getInitParameter(String name,String dft)
43      {
44          if (!_parameters.containsKey(name))
45              return dft;
46          return _parameters.get(name);
47      }
48  
49      public int getInitParameter(String name, int dft)
50      {
51          String v=_parameters.get(name);
52          if (v==null)
53              return dft;
54          return Integer.valueOf(v);
55      }
56      
57      
58      public void bind(WebSocket.FrameConnection connection, FrameHandler incoming, WebSocketGenerator outgoing)
59      {
60          _connection=connection;
61          _inbound=incoming;
62          _outbound=outgoing;
63      }
64  
65      public String getName()
66      {
67          return _name;
68      }
69  
70      public String getParameterizedName()
71      {
72          StringBuilder name = new StringBuilder();
73          name.append(_name);
74          for (String param : _parameters.keySet())
75              name.append(';').append(param).append('=').append(QuotedStringTokenizer.quoteIfNeeded(_parameters.get(param),";="));
76          return name.toString();
77      }
78  
79      public void onFrame(byte flags, byte opcode, Buffer buffer)
80      {
81          // System.err.printf("onFrame %s %x %x %d\n",getExtensionName(),flags,opcode,buffer.length());
82          _inbound.onFrame(flags,opcode,buffer);
83      }
84  
85      public void close(int code, String message)
86      {
87          _inbound.close(code,message);
88      }
89  
90      public int flush() throws IOException
91      {
92          return _outbound.flush();
93      }
94  
95      public boolean isBufferEmpty()
96      {
97          return _outbound.isBufferEmpty();
98      }
99  
100     public void addFrame(byte flags, byte opcode, byte[] content, int offset, int length) throws IOException
101     {
102         // System.err.printf("addFrame %s %x %x %d\n",getExtensionName(),flags,opcode,length);
103         _outbound.addFrame(flags,opcode,content,offset,length);
104     }
105     
106     public byte setFlag(byte flags,int rsv)
107     {
108         if (rsv<1||rsv>3)
109             throw new IllegalArgumentException("rsv"+rsv);
110         byte b=(byte)(flags | __mask[rsv]);
111         return b;
112     }
113     
114     public byte clearFlag(byte flags,int rsv)
115     {
116         if (rsv<1||rsv>3)
117             throw new IllegalArgumentException("rsv"+rsv);
118         return (byte)(flags & ~__mask[rsv]);
119     }
120 
121     public boolean isFlag(byte flags,int rsv)
122     {
123         if (rsv<1||rsv>3)
124             throw new IllegalArgumentException("rsv"+rsv);
125         return (flags & __mask[rsv])!=0;
126     }
127     
128     public String toString()
129     {
130         return getParameterizedName();
131     }
132 }