1 //$Id: ActionStack.java 351 2008-08-14 20:20:56Z jg_hamburg $
2 /********************************************************************************
3 * DDTUnit, a Datadriven Approach to Unit- and Moduletesting
4 * Copyright (c) 2004, Joerg and Kai Gellien
5 * All rights reserved.
6 *
7 * The Software is provided under the terms of the Common Public License 1.0
8 * as provided with the distribution of DDTUnit in the file cpl-v10.html.
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 *
13 * + Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 *
16 * + Redistributions in binary form must reproduce the above
17 * copyright notice, this list of conditions and the following
18 * disclaimer in the documentation and/or other materials provided
19 * with the distribution.
20 *
21 * + Neither the name of the authors or DDTUnit, nor the
22 * names of its contributors may be used to endorse or promote
23 * products derived from this software without specific prior
24 * written permission.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
27 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
28 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
29 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
30 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 ********************************************************************************/
38 package junitx.ddtunit.data.processing;
39
40 import org.slf4j.Logger;
41 import org.slf4j.LoggerFactory;
42
43 /**
44 * Stack containing all {@link junitx.ddtunit.data.processing.ActionBase}s
45 * generated during parsing xml structure.
46 *
47 * @author jg
48 */
49 public class ActionStack implements ILinkChangeListener {
50 private Logger log = LoggerFactory.getLogger(ActionStack.class);
51
52 private static final String LF = System.getProperty("line.separator");
53
54 protected IAction first;
55
56 protected IAction last;
57
58 public ActionStack() {
59 // no special initialization
60 }
61
62 /**
63 * Push new element on stack
64 *
65 * @param action to add
66 */
67 public void push(IAction action) {
68 if (action == null) {
69 throw new IllegalArgumentException(
70 "Provided action should not be null");
71 }
72 if (this.last != null) {
73 action.setPrevious(this.last);
74 this.last.setNext(action);
75 action.setNext(null);
76 this.last = action;
77 } else {
78 this.first = action;
79 this.last = action;
80 action.setPrevious(null);
81 action.setNext(null);
82 }
83 action.registerLinkChangeListener(this);
84 }
85
86 /**
87 * Retrieve last element on stack and delete it on stack.
88 *
89 * @return last element on stack
90 */
91 public IAction pop() {
92 IAction action = this.last;
93 this.last = action.getPrevious();
94 if (this.last != null) {
95 this.last.setNext(null);
96 }
97 if (action == this.first) {
98 this.first = null;
99 }
100 action.setPrevious(null);
101 action.setNext(null);
102 return action;
103 }
104
105 /**
106 * Retrieve last element on stack without deleting it from stack
107 *
108 * @return last element of stack
109 */
110 public IAction peek() {
111 return this.last;
112 }
113
114 /**
115 * check if record stack is empty.
116 *
117 * @return true if no elements on stack
118 */
119 public boolean isEmpty() {
120 boolean check = false;
121 if (this.last == null && this.first == null) {
122 check = true;
123 }
124 return check;
125 }
126
127 String infoOf() {
128 StringBuffer info = new StringBuffer("ActionStack Info:");
129 if (this.first == null) {
130 info.append(" is Empty");
131 } else {
132 IAction action = this.first;
133 StringBuffer indent = new StringBuffer(" ");
134 while (action != null) {
135 info.append(LF);
136 info.append(indent).append(action.getClass().getName());
137 action = action.getNext();
138 indent.append(" ");
139 }
140 }
141 return info.toString();
142 }
143
144 public IAction process() {
145 IAction lastAction = peek();
146 log.debug("Processing " + lastAction + " ...");
147 return lastAction.process();
148 }
149 }