/** * @author : Paul Taylor * @author : Eric Farng * * Version @version:$Id: ID3v1Iterator.java 520 2008-01-01 15:16:38Z paultaylor $ * * MusicTag Copyright (C)2003,2004 * * This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser * General Public License as published by the Free Software Foundation; either version 2.1 of the License, * or (at your option) any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License along with this library; if not, * you can get a copy from http://www.opensource.org/licenses/lgpl-license.php or write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Description: * */ package org.jaudiotagger.tag.id3; import java.util.Iterator; import java.util.NoSuchElementException; public class ID3v1Iterator implements Iterator { /** * */ private static final int TITLE = 1; /** * */ private static final int ARTIST = 2; /** * */ private static final int ALBUM = 3; /** * */ private static final int COMMENT = 4; /** * */ private static final int YEAR = 5; /** * */ private static final int GENRE = 6; /** * */ private static final int TRACK = 7; /** * */ private ID3v1Tag id3v1tag; /** * */ private int lastIndex = 0; /** * Creates a new ID3v1Iterator datatype. * * @param id3v1tag */ public ID3v1Iterator(ID3v1Tag id3v1tag) { this.id3v1tag = id3v1tag; } /** * @return */ public boolean hasNext() { return hasNext(lastIndex); } /** * @return */ public Object next() { return next(lastIndex); } /** * */ public void remove() { switch (lastIndex) { case TITLE: id3v1tag.title = ""; case ARTIST: id3v1tag.artist = ""; case ALBUM: id3v1tag.album = ""; case COMMENT: id3v1tag.comment = ""; case YEAR: id3v1tag.year = ""; case GENRE: id3v1tag.genre = (byte) -1; case TRACK: if (id3v1tag instanceof ID3v11Tag) { ((ID3v11Tag) id3v1tag).track = (byte) -1; } } } /** * @param index * @return */ private boolean hasNext(int index) { switch (index) { case TITLE: return (id3v1tag.title.length() > 0) || hasNext(index + 1); case ARTIST: return (id3v1tag.artist.length() > 0) || hasNext(index + 1); case ALBUM: return (id3v1tag.album.length() > 0) || hasNext(index + 1); case COMMENT: return (id3v1tag.comment.length() > 0) || hasNext(index + 1); case YEAR: return (id3v1tag.year.length() > 0) || hasNext(index + 1); case GENRE: return (id3v1tag.genre >= (byte) 0) || hasNext(index + 1); case TRACK: if (id3v1tag instanceof ID3v11Tag) { return (((ID3v11Tag) id3v1tag).track >= (byte) 0) || hasNext(index + 1); } default: return false; } } /** * @param index * @return * @throws NoSuchElementException */ private Object next(int index) { switch (lastIndex) { case 0: return (id3v1tag.title.length() > 0) ? id3v1tag.title : next(index + 1); case TITLE: return (id3v1tag.artist.length() > 0) ? id3v1tag.artist : next(index + 1); case ARTIST: return (id3v1tag.album.length() > 0) ? id3v1tag.album : next(index + 1); case ALBUM: return (id3v1tag.comment.length() > 0) ? id3v1tag.comment : next(index + 1); case COMMENT: return (id3v1tag.year.length() > 0) ? id3v1tag.year : next(index + 1); case YEAR: return (id3v1tag.genre >= (byte) 0) ? id3v1tag.genre : next(index + 1); case GENRE: return (id3v1tag instanceof ID3v11Tag && (((ID3v11Tag) id3v1tag).track >= (byte) 0)) ? ((ID3v11Tag) id3v1tag).track : null; default: throw new NoSuchElementException("Iteration has no more elements."); } } }