001/* 002 * Copyright (c) 2007-2017 Xplenty, Inc. All Rights Reserved. 003 * 004 * Project and contact information: http://www.cascading.org/ 005 * 006 * This file is part of the Cascading project. 007 * 008 * Licensed under the Apache License, Version 2.0 (the "License"); 009 * you may not use this file except in compliance with the License. 010 * You may obtain a copy of the License at 011 * 012 * http://www.apache.org/licenses/LICENSE-2.0 013 * 014 * Unless required by applicable law or agreed to in writing, software 015 * distributed under the License is distributed on an "AS IS" BASIS, 016 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 017 * See the License for the specific language governing permissions and 018 * limitations under the License. 019 */ 020 021package cascading.tuple; 022 023import java.util.Iterator; 024import java.util.LinkedList; 025 026/** 027 * TupleEntryCollector is a convenience class for managing a list of tuples. More specifically it can simultaneously 028 * append and modify in place elements of the list through the use of a ListIterator. 029 */ 030public class TupleListCollector extends TupleEntryCollector implements Iterable<Tuple> 031 { 032 /** Field tuples */ 033 private final LinkedList<Tuple> tuples = new LinkedList<Tuple>(); 034 /** Field copyTupleOnCollect */ 035 private boolean copyTupleOnCollect = false; 036 037 /** 038 * Constructor TupleEntryCollector creates a new TupleEntryCollector instance. 039 * 040 * @param fields of type Fields 041 * @param tuple of type Tuple... 042 */ 043 public TupleListCollector( Fields fields, Tuple... tuple ) 044 { 045 super( fields ); 046 047 collect( tuple ); 048 } 049 050 /** 051 * Constructor TupleListCollector creates a new TupleListCollector instance. 052 * <p/> 053 * Set copyTupleOnCollect to {@code true} if a new Tuple instance should be stored in the 054 * underlying list. 055 * 056 * @param fields of type Fields 057 * @param copyTupleOnCollect of type boolean 058 */ 059 public TupleListCollector( Fields fields, boolean copyTupleOnCollect ) 060 { 061 super( fields ); 062 this.copyTupleOnCollect = copyTupleOnCollect; 063 } 064 065 /** 066 * Method collect adds every given Tuple instance. It tests for and ignores empty Tuples. 067 * 068 * @param tuples of type Tuple 069 */ 070 private void collect( Tuple... tuples ) 071 { 072 for( Tuple tuple : tuples ) 073 add( tuple ); 074 } 075 076 protected void collect( TupleEntry tupleEntry ) 077 { 078 if( copyTupleOnCollect ) 079 tuples.add( tupleEntry.getTupleCopy() ); 080 else 081 tuples.add( tupleEntry.getTuple() ); 082 } 083 084 /** 085 * Method isEmpty returns true if this collection is empty. 086 * 087 * @return the empty (type boolean) of this TupleCollector object. 088 */ 089 public boolean isEmpty() 090 { 091 return tuples.isEmpty(); 092 } 093 094 /** Method clear clears all Tuple instances from this instance. */ 095 public void clear() 096 { 097 tuples.clear(); 098 } 099 100 /** 101 * Returns the size of this collection. 102 * 103 * @return int 104 */ 105 public int size() 106 { 107 return tuples.size(); 108 } 109 110 /** 111 * Method iterator returns an iterator for this collection. 112 * 113 * @return Iterator<Tuple> 114 */ 115 public Iterator<Tuple> iterator() 116 { 117 return tuples.iterator(); 118 } 119 120 /** 121 * Method entryIterator return a TupleEntry iterator for this collection. 122 * </p> 123 * Note the same TupleEntry will be returned on each next() call. 124 * 125 * @return Iterator<TupleEntry> 126 */ 127 public Iterator<TupleEntry> entryIterator() 128 { 129 return new TupleEntryChainIterator( tupleEntry.getFields(), tuples.iterator() ); 130 } 131 }