KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > sapia > ubik > net > nio > CycleBase


1 package org.sapia.ubik.net.nio;
2
3 import java.io.IOException JavaDoc;
4 import java.nio.ByteBuffer JavaDoc;
5 import java.nio.channels.Channel JavaDoc;
6
7 import org.sapia.ubik.net.nio.util.ByteBufferPool;
8
9 /**
10  * A base implementation of the <code>Cycle</code> interface.
11  *
12  * @author Yanick Duchesne
13  *
14  * <dl>
15  * <dt><b>Copyright: </b>
16  * <dd>Copyright &#169; 2002-2005 <a HREF="http://www.sapia-oss.org">Sapia Open
17  * Source Software </a>. All Rights Reserved.</dd>
18  * </dt>
19  * <dt><b>License: </b>
20  * <dd>Read the license.txt file of the jar or visit the <a
21  * HREF="http://www.sapia-oss.org/license.html">license page </a> at the Sapia
22  * OSS web site</dd>
23  * </dt>
24  * </dl>
25  */

26 public class CycleBase implements Cycle {
27
28   private int _state, _nextState;
29   private Channel JavaDoc _channel;
30   private ChannelHandler _handler;
31   private ChannelManager _manager;
32   private ByteBuffer JavaDoc _buffer;
33   private ByteBufferPool _pool;
34   private CycleListener _listener;
35   private Throwable JavaDoc _err;
36
37   protected CycleBase(int initialState, ChannelManager manager,
38       Channel JavaDoc channel, ByteBufferPool pool, CycleListener listener) {
39     assertState(initialState);
40     _state = initialState;
41     _channel = channel;
42     _listener = listener;
43     _manager = manager;
44     _pool = pool;
45   }
46
47   /**
48    * @see org.sapia.ubik.net.nio.Cycle#state()
49    */

50   public int state() {
51     return _state;
52   }
53
54   /**
55    * @see org.sapia.ubik.net.nio.Cycle#state(int)
56    */

57   public void state(int nextState) {
58     assertState(nextState);
59     _nextState = nextState;
60   }
61
62   /**
63    * @see org.sapia.ubik.net.nio.Cycle#error(java.lang.Throwable)
64    */

65   public void error(Throwable JavaDoc err) {
66     state(STATE_ERROR);
67     _err = err;
68   }
69
70   /**
71    * @see org.sapia.ubik.net.nio.Cycle#next()
72    */

73   public void next() {
74     _state = _nextState;
75     _listener.onNextState(this);
76   }
77
78   /**
79    * @see org.sapia.ubik.net.nio.Cycle#isComplete()
80    */

81   public boolean isComplete() {
82     return _state == STATE_COMPLETE;
83   }
84
85   /**
86    * @see org.sapia.ubik.net.nio.Cycle#isRecycle()
87    */

88   public boolean isRecycle() {
89     return _state == STATE_RECYCLE;
90   }
91
92   /**
93    * @see org.sapia.ubik.net.nio.Cycle#isRead()
94    */

95   public boolean isRead() {
96     return _state == STATE_READ;
97   }
98
99   /**
100    * @see org.sapia.ubik.net.nio.Cycle#isWrite()
101    */

102   public boolean isWrite() {
103     return _state == STATE_WRITE;
104   }
105
106   /**
107    * @see org.sapia.ubik.net.nio.Cycle#isProcess()
108    */

109   public boolean isProcess() {
110     return false;
111   }
112
113   /**
114    * @see org.sapia.ubik.net.nio.Cycle#isError()
115    */

116   public boolean isError() {
117     return _state == STATE_ERROR;
118   }
119
120   /**
121    * @see org.sapia.ubik.net.nio.Cycle#getError()
122    */

123   public Throwable JavaDoc getError() {
124     return _err;
125   }
126
127   /**
128    * @see org.sapia.ubik.net.nio.Cycle#getChannel()
129    */

130   public Channel JavaDoc getChannel() {
131     return _channel;
132   }
133
134   /**
135    * @see org.sapia.ubik.net.nio.Cycle#getChannelManager()
136    */

137   public ChannelManager getChannelManager() {
138     return _manager;
139   }
140
141   /**
142    * @see org.sapia.ubik.net.nio.Cycle#getByteBuffer()
143    */

144   public ByteBuffer JavaDoc getByteBuffer() {
145     if(_buffer == null) {
146       try {
147         _buffer = (ByteBuffer JavaDoc) _pool.acquire();
148       } catch(Exception JavaDoc e) {
149         throw new RuntimeException JavaDoc("Could not acquire byte buffer");
150       }
151     }
152     return _buffer;
153   }
154
155   /**
156    * @see org.sapia.ubik.net.nio.Cycle#getHandler()
157    */

158   public ChannelHandler getHandler() {
159     if(_handler == null) {
160       _handler = _manager.createHandler();
161     }
162     return _handler;
163   }
164
165   /**
166    * @see org.sapia.ubik.net.nio.Cycle#destroy()
167    */

168   public void destroy() {
169     if(_buffer != null) {
170       _pool.release(_buffer);
171     }
172     try {
173       _channel.close();
174     } catch(IOException JavaDoc e) {
175     }
176   }
177
178   /**
179    * @see org.sapia.ubik.net.nio.Cycle#releaseByteBuffer()
180    */

181   public void releaseByteBuffer() {
182     if(_buffer != null) {
183       _pool.release(_buffer);
184     }
185   }
186
187   protected void handler(ChannelHandler handler) {
188     _handler = handler;
189   }
190
191   protected void byteBuffer(ByteBuffer JavaDoc buf) {
192     _buffer = buf;
193   }
194
195   protected void assertState(int state) {
196     if(state < STATE_READ || state > STATE_ERROR) {
197       throw new IllegalStateException JavaDoc("Invalid state: " + state);
198     }
199   }
200
201 }
202
Popular Tags