ObservableReader.java

  1. /**
  2.  *
  3.  * Copyright 2003-2007 Jive Software.
  4.  *
  5.  * Licensed under the Apache License, Version 2.0 (the "License");
  6.  * you may not use this file except in compliance with the License.
  7.  * You may obtain a copy of the License at
  8.  *
  9.  *     http://www.apache.org/licenses/LICENSE-2.0
  10.  *
  11.  * Unless required by applicable law or agreed to in writing, software
  12.  * distributed under the License is distributed on an "AS IS" BASIS,
  13.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14.  * See the License for the specific language governing permissions and
  15.  * limitations under the License.
  16.  */
  17. package org.jivesoftware.smack.util;

  18. import java.io.IOException;
  19. import java.io.Reader;
  20. import java.util.ArrayList;
  21. import java.util.List;


  22. /**
  23.  * An ObservableReader is a wrapper on a Reader that notifies to its listeners when
  24.  * reading character streams.
  25.  *
  26.  * @author Gaston Dombiak
  27.  */
  28. public class ObservableReader extends Reader {

  29.     Reader wrappedReader = null;
  30.     final List<ReaderListener> listeners = new ArrayList<ReaderListener>();

  31.     public ObservableReader(Reader wrappedReader) {
  32.         this.wrappedReader = wrappedReader;
  33.     }

  34.     @Override
  35.     public int read(char[] cbuf, int off, int len) throws IOException {
  36.         int count = wrappedReader.read(cbuf, off, len);
  37.         if (count > 0) {
  38.             String str = new String(cbuf, off, count);
  39.             // Notify that a new string has been read
  40.             ReaderListener[] readerListeners = null;
  41.             synchronized (listeners) {
  42.                 readerListeners = new ReaderListener[listeners.size()];
  43.                 listeners.toArray(readerListeners);
  44.             }
  45.             for (int i = 0; i < readerListeners.length; i++) {
  46.                 readerListeners[i].read(str);
  47.             }
  48.         }
  49.         return count;
  50.     }

  51.     @Override
  52.     public void close() throws IOException {
  53.         wrappedReader.close();
  54.     }

  55.     @Override
  56.     public int read() throws IOException {
  57.         return wrappedReader.read();
  58.     }

  59.     @Override
  60.     public int read(char[] cbuf) throws IOException {
  61.         return wrappedReader.read(cbuf);
  62.     }

  63.     @Override
  64.     public long skip(long n) throws IOException {
  65.         return wrappedReader.skip(n);
  66.     }

  67.     @Override
  68.     public boolean ready() throws IOException {
  69.         return wrappedReader.ready();
  70.     }

  71.     @Override
  72.     public boolean markSupported() {
  73.         return wrappedReader.markSupported();
  74.     }

  75.     @Override
  76.     public void mark(int readAheadLimit) throws IOException {
  77.         wrappedReader.mark(readAheadLimit);
  78.     }

  79.     @Override
  80.     public void reset() throws IOException {
  81.         wrappedReader.reset();
  82.     }

  83.     /**
  84.      * Adds a reader listener to this reader that will be notified when
  85.      * new strings are read.
  86.      *
  87.      * @param readerListener a reader listener.
  88.      */
  89.     public void addReaderListener(ReaderListener readerListener) {
  90.         if (readerListener == null) {
  91.             return;
  92.         }
  93.         synchronized (listeners) {
  94.             if (!listeners.contains(readerListener)) {
  95.                 listeners.add(readerListener);
  96.             }
  97.         }
  98.     }

  99.     /**
  100.      * Removes a reader listener from this reader.
  101.      *
  102.      * @param readerListener a reader listener.
  103.      */
  104.     public void removeReaderListener(ReaderListener readerListener) {
  105.         synchronized (listeners) {
  106.             listeners.remove(readerListener);
  107.         }
  108.     }

  109. }