001 /* JAPI - (Yet another (hopefully) useful) Java API
002 *
003 * Copyright (C) 2004-2006 Christian Hujer
004 *
005 * This program is free software; you can redistribute it and/or
006 * modify it under the terms of the GNU General Public License as
007 * published by the Free Software Foundation; either version 2 of the
008 * License, or (at your option) any later version.
009 *
010 * This program is distributed in the hope that it will be useful, but
011 * WITHOUT ANY WARRANTY; without even the implied warranty of
012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
013 * General Public License for more details.
014 *
015 * You should have received a copy of the GNU General Public License
016 * along with this program; if not, write to the Free Software
017 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
018 * 02111-1307, USA.
019 */
020
021 package net.sf.japi.io;
022
023 import java.io.IOException;
024 import java.util.Iterator;
025 import java.util.NoSuchElementException;
026 import org.jetbrains.annotations.Nullable;
027 import org.jetbrains.annotations.NotNull;
028
029 /** A special delegate of ARGV Reader supplying lines via an Iterator.
030 * @author <a href="mailto:chris@riedquat.de">Christian Hujer</a>
031 */
032 public class ARGV implements Iterable<String>, Iterator<String> {
033
034 /** ARGVReader. */
035 @Nullable private ARGVReader argvReader;
036
037 /** Next line. */
038 @Nullable private String nextLine;
039
040 /** Create an ARGV.
041 * @param args Command line arguments or some other String array containing 0 or more file names.
042 */
043 @SuppressWarnings({"IOResourceOpenedButNotSafelyClosed"})
044 public ARGV(@NotNull final String... args) {
045 argvReader = new ARGVReader(args);
046 try {
047 nextLine = argvReader.readLine();
048 } catch (final IOException e) {
049 close();
050 }
051 }
052
053 /** Close the current ARGVReader. */
054 private void close() {
055 nextLine = null;
056 try {
057 assert argvReader != null;
058 argvReader.close();
059 } catch (final IOException e) {
060 // ignore
061 } finally {
062 argvReader = null;
063 }
064 }
065
066 /** {@inheritDoc} */
067 public ARGV iterator() {
068 return this;
069 }
070
071 /** {@inheritDoc} */
072 public boolean hasNext() {
073 return nextLine != null;
074 }
075
076 /** {@inheritDoc} */
077 @NotNull public String next() {
078 if (nextLine == null) {
079 throw new NoSuchElementException();
080 }
081 try {
082 return nextLine;
083 } finally {
084 try {
085 assert argvReader != null;
086 nextLine = argvReader.readLine();
087 } catch (final IOException e) {
088 close();
089 }
090 }
091 }
092
093 /** {@inheritDoc} */
094 public void remove() {
095 throw new UnsupportedOperationException();
096 }
097
098 } // class ARGV