blob: 09ec546c49fb8454be0f4bec721dfcd82a2cf737 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.hadoop.mapreduce.lib.join;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.io.WritableUtils;
import org.apache.hadoop.util.ReflectionUtils;
/**
* This class provides an implementation of ResetableIterator. The
* implementation uses an {@link java.util.ArrayList} to store elements
* added to it, replaying them as requested.
* Prefer {@link StreamBackedIterator}.
*/
public class ArrayListBackedIterator<X extends Writable>
implements ResetableIterator<X> {
private Iterator<X> iter;
private ArrayList<X> data;
private X hold = null;
private Configuration conf = new Configuration();
public ArrayListBackedIterator() {
this(new ArrayList<X>());
}
public ArrayListBackedIterator(ArrayList<X> data) {
this.data = data;
this.iter = this.data.iterator();
}
public boolean hasNext() {
return iter.hasNext();
}
public boolean next(X val) throws IOException {
if (iter.hasNext()) {
ReflectionUtils.copy(conf, iter.next(), val);
if (null == hold) {
hold = WritableUtils.clone(val, null);
} else {
ReflectionUtils.copy(conf, val, hold);
}
return true;
}
return false;
}
public boolean replay(X val) throws IOException {
ReflectionUtils.copy(conf, hold, val);
return true;
}
public void reset() {
iter = data.iterator();
}
public void add(X item) throws IOException {
data.add(WritableUtils.clone(item, null));
}
public void close() throws IOException {
iter = null;
data = null;
}
public void clear() {
data.clear();
reset();
}
}