1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17 package org.apache.commons.functor.core.composite;
18
19 import java.io.Serializable;
20 import java.util.ArrayList;
21 import java.util.Iterator;
22 import java.util.List;
23
24 import org.apache.commons.functor.Procedure;
25
26 /**
27 * A {@link Procedure Procedure}
28 * that {@link Procedure#run runs} an ordered
29 * sequence of {@link Procedure Procedures}.
30 * When the sequence is empty, this procedure is does
31 * nothing.
32 * <p>
33 * Note that although this class implements
34 * {@link Serializable}, a given instance will
35 * only be truly <code>Serializable</code> if all the
36 * underlying functors are. Attempts to serialize
37 * an instance whose delegates are not all
38 * <code>Serializable</code> will result in an exception.
39 * </p>
40 * @version $Revision: 1171154 $ $Date: 2011-09-15 17:58:38 +0200 (Thu, 15 Sep 2011) $
41 * @author Rodney Waldhoff
42 */
43 public class Sequence implements Procedure, Serializable {
44
45 /**
46 * serialVersionUID declaration.
47 */
48 private static final long serialVersionUID = 8041703589149547883L;
49 // attributes
50 // ------------------------------------------------------------------------
51 private List<Procedure> list = new ArrayList<Procedure>();
52
53 // constructor
54 // ------------------------------------------------------------------------
55 /**
56 * Create a new Sequence.
57 */
58 public Sequence() {
59 super();
60 }
61
62 /**
63 * Create a new Sequence instance.
64 *
65 * @param procedures to run sequentially
66 */
67 public Sequence(Procedure... procedures) {
68 this();
69 if (procedures != null) {
70 for (Procedure p : procedures) {
71 then(p);
72 }
73 }
74 }
75
76 /**
77 * Create a new Sequence instance.
78 *
79 * @param procedures to run sequentially
80 */
81 public Sequence(Iterable<Procedure> procedures) {
82 this();
83 if (procedures != null) {
84 for (Procedure p : procedures) {
85 then(p);
86 }
87 }
88 }
89
90 // modifiers
91 // ------------------------------------------------------------------------
92 /**
93 * Fluently add a Procedure.
94 * @param p Procedure to add
95 * @return this
96 */
97 public final Sequence then(Procedure p) {
98 list.add(p);
99 return this;
100 }
101
102 // predicate interface
103 // ------------------------------------------------------------------------
104 /**
105 * {@inheritDoc}
106 */
107 public final void run() {
108 for (Iterator<Procedure> iter = list.iterator(); iter.hasNext();) {
109 iter.next().run();
110 }
111 }
112
113 /**
114 * {@inheritDoc}
115 */
116 public final boolean equals(Object that) {
117 return that == this || (that instanceof Sequence && equals((Sequence) that));
118 }
119
120 /**
121 * Learn whether a given Sequence is equal to this.
122 * @param that Sequence to test
123 * @return boolean
124 */
125 public boolean equals(Sequence that) {
126 // by construction, list is never null
127 return null != that && list.equals(that.list);
128 }
129
130 /**
131 * {@inheritDoc}
132 */
133 public int hashCode() {
134 // by construction, list is never null
135 return "Sequence".hashCode() ^ list.hashCode();
136 }
137
138 /**
139 * {@inheritDoc}
140 */
141 public String toString() {
142 return "Sequence<" + list + ">";
143 }
144
145 }