123
|
1 package rep.simulator;
|
|
2
|
|
3 import java.nio.channels.SelectableChannel;
|
|
4 import java.util.concurrent.BlockingQueue;
|
|
5 import java.util.concurrent.LinkedBlockingQueue;
|
|
6
|
|
7
|
|
8
|
|
9 public abstract class SelectableChannelSimulator<P> extends SelectableChannel{
|
|
10 protected BlockingQueue<P> qread;
|
|
11 protected BlockingQueue<P> qwrite;
|
|
12 protected SelectorSimulator<P> writeSelector;
|
|
13 protected SelectorSimulator<P> readSelector;
|
|
14
|
|
15 /* read from Queue. */
|
|
16 public P read(){
|
|
17 try {
|
|
18 if(readSelector!=null)
|
|
19 synchronized (readSelector){
|
|
20 return qread.take();
|
|
21 }
|
|
22 else{
|
|
23 return qread.take();
|
|
24 }
|
|
25 } catch (InterruptedException e) {
|
|
26 e.printStackTrace();
|
|
27 return null;
|
|
28 }
|
|
29 }
|
|
30 /* write to Queue. */
|
|
31 public boolean write(P p){
|
|
32 try {
|
|
33 if (writeSelector!=null)
|
|
34 synchronized (writeSelector){
|
|
35 qwrite.put(p);
|
|
36 writeSelector.notifyAll();
|
|
37 }
|
|
38 else {
|
|
39 qwrite.put(p);
|
|
40 }
|
|
41 return true;
|
|
42 } catch (InterruptedException e) {
|
|
43 e.printStackTrace();
|
|
44 return false;
|
|
45 }
|
|
46 }
|
|
47 public abstract ChannelSimulator<P> accept();
|
|
48
|
|
49 /* accessor methods. */
|
|
50 public BlockingQueue<P> getReadQ(){
|
|
51 return qread;
|
|
52 }
|
|
53 public BlockingQueue<P> getWriteQ(){
|
|
54 return qwrite;
|
|
55 }
|
|
56 public void createReadQ(){
|
|
57 qread = new LinkedBlockingQueue<P>();
|
|
58 }
|
|
59 public void createWriteQ(){
|
|
60 qwrite = new LinkedBlockingQueue<P>();
|
|
61 }
|
|
62 public void setWriteSelector(SelectorSimulator<P> _selector){
|
|
63 writeSelector = _selector;
|
|
64 }
|
|
65
|
|
66
|
|
67 /* return state of the Queue */
|
|
68 abstract public boolean isReadable();
|
|
69 abstract public boolean isWritable();
|
|
70 abstract public boolean isAcceptable();
|
|
71
|
|
72 }
|