1 /*
2 * Licensed under the Apache License, Version 2.0 (the "License");
3 * you may not use this file except in compliance with the License.
4 * You may obtain a copy of the License at
5 *
6 * http://www.apache.org/licenses/LICENSE-2.0
7 *
8 * Unless required by applicable law or agreed to in writing, software
9 * distributed under the License is distributed on an "AS IS" BASIS,
10 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 * See the License for the specific language governing permissions and
12 * limitations under the License.
13 */
14
15 package org.apache.commons.functor.generator.util;
16
17 import java.util.ArrayList;
18 import java.util.Collection;
19
20 import org.apache.commons.functor.UnaryFunction;
21 import org.apache.commons.functor.UnaryProcedure;
22 import org.apache.commons.functor.generator.Generator;
23
24 /**
25 * Transforms a generator into a collection. If a collection is not passed into
26 * the constructor an ArrayList will be returned from the transform method.
27 *
28 * @param <E> the type of elements held in the adapted collection.
29 * @since 1.0
30 * @version $Revision: 1160793 $ $Date: 2011-08-23 18:48:32 +0200 (Tue, 23 Aug 2011) $
31 * @author Jason Horman (jason@jhorman.org)
32 */
33 public class CollectionTransformer<E> implements UnaryFunction<Generator<? extends E>, Collection<? super E>> {
34 /*
35 * TODO revisit this class... it could stand a more-descriptive name. Also, it's a little
36 * hard to say whether, for an instance constructed without a specific target collection,
37 * #evaluate() should return a new ArrayList for each call, or continue adding to
38 * a single ArrayList instance (the current behavior).
39 * Perhaps this is more a documentation issue than anything.
40 */
41
42 // instance methods
43 //---------------------------------------------------
44 /**
45 * The adapted collection has to be filled.
46 */
47 private final Collection<? super E> toFill;
48
49 // constructors
50 //---------------------------------------------------
51 /**
52 * Create a new CollectionTransformer.
53 */
54 public CollectionTransformer() {
55 this(null);
56 }
57
58 /**
59 * Create a new CollectionTransformer.
60 * @param toFill Collection to fill
61 */
62 public CollectionTransformer(Collection<? super E> toFill) {
63 Collection<? super E> coll;
64 if (toFill == null) {
65 coll = new ArrayList<E>();
66 } else {
67 coll = toFill;
68 }
69 this.toFill = coll;
70 }
71
72 // instance methods
73 //---------------------------------------------------
74 /**
75 * {@inheritDoc}
76 */
77 @SuppressWarnings("unchecked")
78 public Collection<E> evaluate(Generator<? extends E> generator) {
79 generator.run(new UnaryProcedure<E>() {
80 public void run(E obj) {
81 toFill.add(obj);
82 }
83 });
84 return (Collection<E>) toFill;
85 }
86 }