001: /*
002: * Copyright 1999-2004 The Apache Software Foundation
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016: package org.apache.commons.collections.iterators;
017:
018: import java.util.Collection;
019: import java.util.Enumeration;
020: import java.util.Iterator;
021:
022: /**
023: * Adapter to make {@link Enumeration Enumeration} instances appear
024: * to be {@link Iterator Iterator} instances.
025: *
026: * @since Commons Collections 1.0
027: * @version $Revision: 155406 $ $Date: 2005-02-26 12:55:26 +0000 (Sat, 26 Feb 2005) $
028: *
029: * @author <a href="mailto:jstrachan@apache.org">James Strachan</a>
030: * @author <a href="mailto:dlr@finemaltcoding.com">Daniel Rall</a>
031: */
032: public class EnumerationIterator implements Iterator {
033:
034: /** The collection to remove elements from */
035: private Collection collection;
036: /** The enumeration being converted */
037: private Enumeration enumeration;
038: /** The last object retrieved */
039: private Object last;
040:
041: // Constructors
042: //-----------------------------------------------------------------------
043: /**
044: * Constructs a new <code>EnumerationIterator</code> that will not
045: * function until {@link #setEnumeration(Enumeration)} is called.
046: */
047: public EnumerationIterator() {
048: this (null, null);
049: }
050:
051: /**
052: * Constructs a new <code>EnumerationIterator</code> that provides
053: * an iterator view of the given enumeration.
054: *
055: * @param enumeration the enumeration to use
056: */
057: public EnumerationIterator(final Enumeration enumeration) {
058: this (enumeration, null);
059: }
060:
061: /**
062: * Constructs a new <code>EnumerationIterator</code> that will remove
063: * elements from the specified collection.
064: *
065: * @param enumeration the enumeration to use
066: * @param collection the collection to remove elements form
067: */
068: public EnumerationIterator(final Enumeration enumeration,
069: final Collection collection) {
070: super ();
071: this .enumeration = enumeration;
072: this .collection = collection;
073: this .last = null;
074: }
075:
076: // Iterator interface
077: //-----------------------------------------------------------------------
078: /**
079: * Returns true if the underlying enumeration has more elements.
080: *
081: * @return true if the underlying enumeration has more elements
082: * @throws NullPointerException if the underlying enumeration is null
083: */
084: public boolean hasNext() {
085: return enumeration.hasMoreElements();
086: }
087:
088: /**
089: * Returns the next object from the enumeration.
090: *
091: * @return the next object from the enumeration
092: * @throws NullPointerException if the enumeration is null
093: */
094: public Object next() {
095: last = enumeration.nextElement();
096: return last;
097: }
098:
099: /**
100: * Removes the last retrieved element if a collection is attached.
101: * <p>
102: * Functions if an associated <code>Collection</code> is known.
103: * If so, the first occurrence of the last returned object from this
104: * iterator will be removed from the collection.
105: *
106: * @exception IllegalStateException <code>next()</code> not called.
107: * @exception UnsupportedOperationException if no associated collection
108: */
109: public void remove() {
110: if (collection != null) {
111: if (last != null) {
112: collection.remove(last);
113: } else {
114: throw new IllegalStateException(
115: "next() must have been called for remove() to function");
116: }
117: } else {
118: throw new UnsupportedOperationException(
119: "No Collection associated with this Iterator");
120: }
121: }
122:
123: // Properties
124: //-----------------------------------------------------------------------
125: /**
126: * Returns the underlying enumeration.
127: *
128: * @return the underlying enumeration
129: */
130: public Enumeration getEnumeration() {
131: return enumeration;
132: }
133:
134: /**
135: * Sets the underlying enumeration.
136: *
137: * @param enumeration the new underlying enumeration
138: */
139: public void setEnumeration(final Enumeration enumeration) {
140: this.enumeration = enumeration;
141: }
142:
143: }
|