annotate src/rep/channel/SelectionKeySimulator.java @ 193:3133040ee4f4

(no commit message)
author one
date Wed, 31 Dec 2008 15:06:22 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
193
3133040ee4f4 (no commit message)
one
parents:
diff changeset
1 package rep.channel;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
2
3133040ee4f4 (no commit message)
one
parents:
diff changeset
3 import java.io.IOException;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
4 import java.nio.channels.SelectableChannel;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
5 import java.nio.channels.SelectionKey;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
6 import java.nio.channels.Selector;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
7
3133040ee4f4 (no commit message)
one
parents:
diff changeset
8 public class SelectionKeySimulator<P> extends REPSelectionKey<P>{
3133040ee4f4 (no commit message)
one
parents:
diff changeset
9
3133040ee4f4 (no commit message)
one
parents:
diff changeset
10 private int interestOpt;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
11 private SelectableChannel channel;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
12 private int ready;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
13 public Selector selector;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
14 public boolean canceled = false;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
15
3133040ee4f4 (no commit message)
one
parents:
diff changeset
16 public SelectionKeySimulator(SelectableChannel cs, int opt, Selector _selector) {
3133040ee4f4 (no commit message)
one
parents:
diff changeset
17 channel = cs;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
18 interestOpt = opt;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
19 selector = _selector;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
20 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
21 public SelectionKeySimulator(SelectionKey k) {
3133040ee4f4 (no commit message)
one
parents:
diff changeset
22 channel = k.channel();
3133040ee4f4 (no commit message)
one
parents:
diff changeset
23 interestOpt = k.interestOps();
3133040ee4f4 (no commit message)
one
parents:
diff changeset
24 selector = k.selector();
3133040ee4f4 (no commit message)
one
parents:
diff changeset
25 attach(k.attachment());
3133040ee4f4 (no commit message)
one
parents:
diff changeset
26 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
27
3133040ee4f4 (no commit message)
one
parents:
diff changeset
28
3133040ee4f4 (no commit message)
one
parents:
diff changeset
29 public boolean isAble() {
3133040ee4f4 (no commit message)
one
parents:
diff changeset
30 if ( (interestOpt&OP_READ)!=0 && isReadable() )
3133040ee4f4 (no commit message)
one
parents:
diff changeset
31 return true;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
32 else if( (interestOpt&OP_ACCEPT)!=0 && isAcceptable() )
3133040ee4f4 (no commit message)
one
parents:
diff changeset
33 return true;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
34 else if( (interestOpt&OP_WRITE)!=0 && isWritable() )
3133040ee4f4 (no commit message)
one
parents:
diff changeset
35 return true;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
36 else
3133040ee4f4 (no commit message)
one
parents:
diff changeset
37 return false;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
38 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
39
3133040ee4f4 (no commit message)
one
parents:
diff changeset
40 public void setFlag() {
3133040ee4f4 (no commit message)
one
parents:
diff changeset
41 ChannelSimulator<?> scs = (ChannelSimulator<?>) channel;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
42 ready = 0;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
43 if(scs.isAcceptable()) ready |= OP_ACCEPT;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
44 if(scs.isReadable()) ready |= OP_READ;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
45 if(scs.isWritable()) ready |= OP_WRITE;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
46 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
47
3133040ee4f4 (no commit message)
one
parents:
diff changeset
48 public SelectableChannel channel() {
3133040ee4f4 (no commit message)
one
parents:
diff changeset
49 return channel;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
50 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
51
3133040ee4f4 (no commit message)
one
parents:
diff changeset
52 @SuppressWarnings("unchecked")
3133040ee4f4 (no commit message)
one
parents:
diff changeset
53 @Override
3133040ee4f4 (no commit message)
one
parents:
diff changeset
54 public REPSocketChannel<P> channel1() {
3133040ee4f4 (no commit message)
one
parents:
diff changeset
55 return (REPSocketChannel<P>)channel;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
56 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
57
3133040ee4f4 (no commit message)
one
parents:
diff changeset
58 @SuppressWarnings("unchecked")
3133040ee4f4 (no commit message)
one
parents:
diff changeset
59 @Override
3133040ee4f4 (no commit message)
one
parents:
diff changeset
60 public REPServerSocketChannel<P> serverSocketChannel() {
3133040ee4f4 (no commit message)
one
parents:
diff changeset
61 return (REPServerSocketChannel<P>)channel;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
62 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
63
3133040ee4f4 (no commit message)
one
parents:
diff changeset
64 public SelectableChannel channel(REPPack<P> packer) {
3133040ee4f4 (no commit message)
one
parents:
diff changeset
65 return channel;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
66 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
67
3133040ee4f4 (no commit message)
one
parents:
diff changeset
68 @SuppressWarnings("unchecked")
3133040ee4f4 (no commit message)
one
parents:
diff changeset
69 public REPSocketChannel<P> accept(REPPack<P> pack) throws IOException {
3133040ee4f4 (no commit message)
one
parents:
diff changeset
70 assert(channel instanceof ServerChannelSimulator);
3133040ee4f4 (no commit message)
one
parents:
diff changeset
71 ServerChannelSimulator<P> scs = (ServerChannelSimulator<P>) channel;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
72 return scs.accept1();
3133040ee4f4 (no commit message)
one
parents:
diff changeset
73 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
74
3133040ee4f4 (no commit message)
one
parents:
diff changeset
75 @SuppressWarnings("unchecked")
3133040ee4f4 (no commit message)
one
parents:
diff changeset
76 @Override
3133040ee4f4 (no commit message)
one
parents:
diff changeset
77 public void cancel() {
3133040ee4f4 (no commit message)
one
parents:
diff changeset
78 canceled = true;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
79 SelectorSimulator s = (SelectorSimulator)selector;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
80 s.deregister(channel);
3133040ee4f4 (no commit message)
one
parents:
diff changeset
81 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
82
3133040ee4f4 (no commit message)
one
parents:
diff changeset
83 @Override
3133040ee4f4 (no commit message)
one
parents:
diff changeset
84 public int interestOps() {
3133040ee4f4 (no commit message)
one
parents:
diff changeset
85 return interestOpt;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
86 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
87
3133040ee4f4 (no commit message)
one
parents:
diff changeset
88 @Override
3133040ee4f4 (no commit message)
one
parents:
diff changeset
89 public SelectionKey interestOps(int ops) {
3133040ee4f4 (no commit message)
one
parents:
diff changeset
90 interestOpt = ops;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
91 return this;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
92 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
93
3133040ee4f4 (no commit message)
one
parents:
diff changeset
94 @Override
3133040ee4f4 (no commit message)
one
parents:
diff changeset
95 public boolean isValid() {
3133040ee4f4 (no commit message)
one
parents:
diff changeset
96 return (!canceled) && channel.isOpen() && selector.isOpen();
3133040ee4f4 (no commit message)
one
parents:
diff changeset
97 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
98
3133040ee4f4 (no commit message)
one
parents:
diff changeset
99
3133040ee4f4 (no commit message)
one
parents:
diff changeset
100 @Override
3133040ee4f4 (no commit message)
one
parents:
diff changeset
101 public Selector selector() {
3133040ee4f4 (no commit message)
one
parents:
diff changeset
102 return selector;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
103 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
104
3133040ee4f4 (no commit message)
one
parents:
diff changeset
105 @Override
3133040ee4f4 (no commit message)
one
parents:
diff changeset
106 public int readyOps() {
3133040ee4f4 (no commit message)
one
parents:
diff changeset
107 int ops=0;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
108 if ( channel instanceof ServerChannelSimulator ){
3133040ee4f4 (no commit message)
one
parents:
diff changeset
109 ServerChannelSimulator<?> scs = (ServerChannelSimulator<?>) channel;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
110 ops = ( OP_ACCEPT * (scs.isAcceptable()? 1:0) );
3133040ee4f4 (no commit message)
one
parents:
diff changeset
111 } else if ( channel instanceof ChannelSimulator ){
3133040ee4f4 (no commit message)
one
parents:
diff changeset
112 ChannelSimulator<?> scs = (ChannelSimulator<?>) channel;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
113 ops = ( OP_READ * (scs.isReadable()? 1:0) )
3133040ee4f4 (no commit message)
one
parents:
diff changeset
114 | ( OP_WRITE * (scs.isWritable()? 1:0) );
3133040ee4f4 (no commit message)
one
parents:
diff changeset
115 // (OP_READ & true) がつかえないらしい.
3133040ee4f4 (no commit message)
one
parents:
diff changeset
116 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
117 return ops;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
118 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
119
3133040ee4f4 (no commit message)
one
parents:
diff changeset
120 }