001 /* 002 * Copyright (C) 2000-2001 Iowa State University 003 * 004 * This file is part of mjc, the MultiJava Compiler. 005 * 006 * This program is free software; you can redistribute it and/or modify 007 * it under the terms of the GNU General Public License as published by 008 * the Free Software Foundation; either version 2 of the License, or 009 * (at your option) any later version. 010 * 011 * This program is distributed in the hope that it will be useful, 012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 014 * GNU General Public License for more details. 015 * 016 * You should have received a copy of the GNU General Public License 017 * along with this program; if not, write to the Free Software 018 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 019 * 020 * $Id: LineIterator.java,v 1.6 2005/09/03 21:57:23 jkiniry Exp $ 021 * Author: David R. Cok 022 */ 023 package junitutils; 024 025 import java.io.*; 026 import java.util.Iterator; 027 028 /** This is a utility class that is an iterator over the lines produced 029 by reading a file. It is used in particular by various 030 JUnit tests. 031 032 @author David R. Cok 033 */ 034 public class LineIterator implements Iterator { 035 036 //@ represents moreElements <- nextLine != null; 037 038 /** A reader that reads lines from the file. */ 039 //@ non_null 040 private BufferedReader r; 041 042 /** The next value to be returned by the iterator. We read ahead one so 043 that we know the value of hasNext() when asked. 044 */ 045 //@ spec_public 046 private String nextLine; 047 048 /** Starts an iterator reading from the given external process. 049 @param filename The name of the file to be read 050 */ 051 //@ requires filename != null; 052 //@ ensures (* file is readable *); 053 //@ signals (java.io.IOException) (* file is not readable *); 054 public LineIterator(String filename) throws java.io.IOException { 055 r = new BufferedReader(new FileReader(filename)); 056 nextLine = r.readLine(); 057 //System.out.println("READ " + nextLine); 058 } 059 060 //@ represents moreElements <- nextLine != null; 061 062 /** Per a standard iterator, returns true if there is another value waiting. */ 063 public boolean hasNext() throws RuntimeException { 064 try { 065 if (nextLine == null) { 066 r.close(); 067 } 068 return nextLine != null; 069 } catch (java.io.IOException e) { 070 throw new RuntimeException("EXCEPTION in hasNext - " + e); 071 } 072 } 073 074 /** Per a standard iterator, returns the next value - and throws 075 java.util.NoSuchElementException if the list has been exhausted 076 (hasNext() returns false). 077 */ 078 //@ also modifies nextLine; 079 public Object next() throws java.util.NoSuchElementException, RuntimeException { 080 if (nextLine == null) 081 throw new java.util.NoSuchElementException(); 082 try { 083 String n = nextLine; 084 nextLine = r.readLine(); 085 //System.out.println("READ " + nextLine); 086 return n; 087 } catch (java.io.IOException e) { 088 throw new RuntimeException("EXCEPTION in next - " + e); 089 } 090 } 091 092 /** This operation will throw an exception, as there is no need for 093 remove in this context. */ 094 //@ also 095 //@ requires \typeof(this)==\type(LineIterator); 096 //@ ensures false; 097 //@ signals (UnsupportedOperationException) true; 098 public void remove() throws UnsupportedOperationException { 099 throw new java.lang.UnsupportedOperationException(); 100 } 101 102 } 103 104 105