11package net .sharksystem .asap ;
22
3+ import net .sharksystem .asap .apps .ASAPMessages ;
4+
35import java .io .IOException ;
46import java .util .ArrayList ;
57import java .util .Iterator ;
1012 *
1113 * @author thsc
1214 */
13- class ASAPInMemoChannelMessages implements ASAPChannelMessages {
15+ class ASAPInMemoMessages implements ASAPMessages {
1416 public static final int DEFAULT_MAX_CACHE_SIZE = 1000 ;
1517 private final CharSequence uri ;
1618 private final ASAPChunkStorageFS chunkStorage ;
@@ -27,8 +29,8 @@ class ASAPInMemoChannelMessages implements ASAPChannelMessages {
2729
2830 private int numberOfMessages = 0 ;
2931
30- public ASAPInMemoChannelMessages (ASAPChunkStorageFS chunkStorage ,
31- CharSequence uri , int fromEra , int toEra , int maxCacheLen ) {
32+ public ASAPInMemoMessages (ASAPChunkStorageFS chunkStorage ,
33+ CharSequence uri , int fromEra , int toEra , int maxCacheLen ) {
3234
3335 this .uri = uri ;
3436 this .chunkStorage = chunkStorage ;
@@ -37,8 +39,8 @@ public ASAPInMemoChannelMessages(ASAPChunkStorageFS chunkStorage,
3739 this .maxCacheLen = maxCacheLen ;
3840 }
3941
40- public ASAPInMemoChannelMessages (ASAPChunkStorageFS chunkStorage ,
41- CharSequence uri , int fromEra , int toEra ) {
42+ public ASAPInMemoMessages (ASAPChunkStorageFS chunkStorage ,
43+ CharSequence uri , int fromEra , int toEra ) {
4244
4345 this (chunkStorage , uri , fromEra , toEra , DEFAULT_MAX_CACHE_SIZE );
4446 }
@@ -86,9 +88,8 @@ private void syncChunkList() throws IOException {
8688 }
8789 } while (anotherLoop );
8890 }
89-
90- @ Override
91- public int getNumberMessage () throws IOException {
91+
92+ public int size () throws IOException {
9293 this .initialize ();
9394 return this .numberOfMessages ;
9495 }
@@ -99,12 +100,24 @@ public CharSequence getURI() {
99100 }
100101
101102 @ Override
102- public Iterator <CharSequence > getMessages () throws IOException {
103+ public CharSequence getFormat () {
104+ return null ;
105+ }
106+
107+ @ Override
108+ public Iterator <CharSequence > getMessagesAsCharSequence () throws IOException {
103109 this .initialize ();
104110
105111 return new ChunkListMessageIterator (this .chunkList );
106112 }
107113
114+ @ Override
115+ public Iterator <byte []> getMessages () throws IOException {
116+ this .initialize ();
117+
118+ return new ChunkListByteMessageIterator (this .chunkList );
119+ }
120+
108121 @ Override
109122 public CharSequence getMessage (int position , boolean chronologically )
110123 throws ASAPException , IOException {
@@ -219,15 +232,14 @@ public void sync() throws IOException {
219232 // helper: message iterator implementation //
220233 //////////////////////////////////////////////////////////////////////////////////////////
221234
222- private class ChunkListMessageIterator implements Iterator <CharSequence > {
223-
235+ private abstract class ChunkListIterator <T > {
224236 private final List <ASAPChunk > chunkList ;
225237 private ASAPChunk currentChunk ;
226238 private int nextIndex ;
227- private Iterator <CharSequence > currentIterator ;
228- private CharSequence messageAhead ;
239+ private Iterator <T > currentIterator ;
240+ private T messageAhead ;
229241
230- public ChunkListMessageIterator (List <ASAPChunk > chunkList ) throws IOException {
242+ public ChunkListIterator (List <ASAPChunk > chunkList ) throws IOException {
231243 this .chunkList = chunkList ;
232244 this .currentChunk = null ;
233245 this .nextIndex = 0 ;
@@ -254,38 +266,62 @@ private void readAhead() {
254266 // open next chunk / iterator
255267 this .currentChunk = this .chunkList .get (this .nextIndex ++);
256268 try {
257- this .currentIterator = this .currentChunk . getMessages ( );
269+ this .currentIterator = this .getMessageIterator ( currentChunk );
258270 this .readAhead (); // next try
259271 } catch (IOException e ) {
260272 // cannot recover from that problem
261273 return ;
262274 }
263275 }
264276
265- @ Override
277+
266278 public boolean hasNext () {
267279 return this .messageAhead != null ;
268280 }
269281
270- @ Override
271- public CharSequence next () {
282+ public T next () {
272283 if (this .messageAhead == null ) {
273284 throw new NoSuchElementException ("list empty or already reached end" );
274285 }
275286
276287 // remove that single message cache
277- CharSequence retMessage = this .messageAhead ;
288+ T retMessage = this .messageAhead ;
278289 this .messageAhead = null ;
279290
280291 // read ahead - if possible
281292 this .readAhead ();
282293
283294 return retMessage ;
284295 }
296+
297+ abstract Iterator <T > getMessageIterator (ASAPChunk chunk ) throws IOException ;
285298 }
286299
287- public int size () throws IOException {
288- this .initialize ();
289- return this .numberOfMessages ;
300+ private class ChunkListMessageIterator extends ChunkListIterator <CharSequence > implements Iterator <CharSequence > {
301+ private Iterator <CharSequence > currentIterator ;
302+ private CharSequence messageAhead ;
303+
304+ public ChunkListMessageIterator (List <ASAPChunk > chunkList ) throws IOException {
305+ super (chunkList );
306+ }
307+
308+ @ Override
309+ Iterator <CharSequence > getMessageIterator (ASAPChunk chunk ) throws IOException {
310+ return chunk .getMessages ();
311+ }
312+ }
313+
314+ private class ChunkListByteMessageIterator extends ChunkListIterator <byte []> implements Iterator <byte []> {
315+ private Iterator <CharSequence > currentIterator ;
316+ private CharSequence messageAhead ;
317+
318+ public ChunkListByteMessageIterator (List <ASAPChunk > chunkList ) throws IOException {
319+ super (chunkList );
320+ }
321+
322+ @ Override
323+ Iterator <byte []> getMessageIterator (ASAPChunk chunk ) throws IOException {
324+ return chunk .getMessagesAsBytes ();
325+ }
290326 }
291327}
0 commit comments