Source for gnu.inet.nntp.LineIterator

   1: /*
   2:  * LineIterator.java
   3:  * Copyright (C) 2002 The Free Software Foundation
   4:  * 
   5:  * This file is part of GNU inetlib, a library.
   6:  * 
   7:  * GNU inetlib is free software; you can redistribute it and/or modify
   8:  * it under the terms of the GNU General Public License as published by
   9:  * the Free Software Foundation; either version 2 of the License, or
  10:  * (at your option) any later version.
  11:  * 
  12:  * GNU inetlib is distributed in the hope that it will be useful,
  13:  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15:  * GNU General Public License for more details.
  16:  * 
  17:  * You should have received a copy of the GNU General Public License
  18:  * along with this library; if not, write to the Free Software
  19:  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  20:  *
  21:  * Linking this library statically or dynamically with other modules is
  22:  * making a combined work based on this library.  Thus, the terms and
  23:  * conditions of the GNU General Public License cover the whole
  24:  * combination.
  25:  *
  26:  * As a special exception, the copyright holders of this library give you
  27:  * permission to link this library with independent modules to produce an
  28:  * executable, regardless of the license terms of these independent
  29:  * modules, and to copy and distribute the resulting executable under
  30:  * terms of your choice, provided that you also meet, for each linked
  31:  * independent module, the terms and conditions of the license of that
  32:  * module.  An independent module is a module which is not derived from
  33:  * or based on this library.  If you modify this library, you may extend
  34:  * this exception to your version of the library, but you are not
  35:  * obliged to do so.  If you do not wish to do so, delete this
  36:  * exception statement from your version.
  37:  */
  38: 
  39: package gnu.inet.nntp;
  40: 
  41: import java.io.IOException;
  42: import java.util.Iterator;
  43: import java.util.NoSuchElementException;
  44: 
  45: /**
  46:  * An iterator over an NNTP multi-line response.
  47:  *
  48:  * @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
  49:  */
  50: public class LineIterator
  51:   implements Iterator, PendingData
  52: {
  53: 
  54:   static final String DOT = ".";
  55: 
  56:   boolean doneRead = false;
  57:   NNTPConnection connection;
  58:   String current;
  59: 
  60:   LineIterator(NNTPConnection connection)
  61:   {
  62:     this.connection = connection;
  63:   }
  64: 
  65:   void doRead()
  66:     throws IOException
  67:   {
  68:     if (doneRead)
  69:       {
  70:         return;
  71:       }
  72:     String line = connection.read();
  73:     if (DOT.equals(line))
  74:       {
  75:         current = null;
  76:       }
  77:     else
  78:       {
  79:         current = line;
  80:       }
  81:     doneRead = true;
  82:   }
  83: 
  84:   /**
  85:    * Indicates whether there are more lines to be read.
  86:    */
  87:   public boolean hasNext()
  88:   {
  89:     try
  90:       {
  91:         doRead();
  92:       }
  93:     catch (IOException e)
  94:       {
  95:         return false;
  96:       }
  97:     return(current != null);
  98:   }
  99: 
 100:   /**
 101:    * Returns the next line.
 102:    */
 103:   public Object next()
 104:   {
 105:     try
 106:       {
 107:         return nextLine();
 108:       }
 109:     catch (IOException e)
 110:       {
 111:         throw new NoSuchElementException("I/O error: " + e.getMessage());
 112:       }
 113:   }
 114: 
 115:   /**
 116:    * Returns the next line.
 117:    */
 118:   public String nextLine()
 119:     throws IOException
 120:   {
 121:     doRead();
 122:     if (current == null)
 123:       {
 124:         throw new NoSuchElementException();
 125:       }
 126:     doneRead = false;
 127:     return current;
 128:   }
 129: 
 130:   /**
 131:    * This iterator is read-only.
 132:    */
 133:   public void remove()
 134:   {
 135:     throw new UnsupportedOperationException();
 136:   }
 137: 
 138:   /**
 139:    * Read to the end of this iterator.
 140:    */
 141:   public void readToEOF()
 142:     throws IOException
 143:   {
 144:     do
 145:       {
 146:         doRead();
 147:       }
 148:     while (current != null);
 149:   }
 150: 
 151: }