• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
18 package tests.util;
19 
20 import java.util.Stack;
21 
22 /**
23  * A stack to store the parameters of a call, as well as the call stack.
24  *
25  */
26 public class CallVerificationStack extends Stack<Object> {
27 
28 	/*
29 	 * --------------------------------------------------------------------
30 	 * Class variables
31 	 * --------------------------------------------------------------------
32 	 */
33 
34 	private static final long serialVersionUID = 1L;
35 
36 	// the singleton
37 	private static final CallVerificationStack _instance = new CallVerificationStack();
38 
39 	/*
40 	 * --------------------------------------------------------------------
41 	 * Instance variables
42 	 * --------------------------------------------------------------------
43 	 */
44 
45 	// the call stack, store StackTraceElement
46 	private final Stack<StackTraceElement> callStack = new Stack<StackTraceElement>();
47 
48 	/*
49 	 * -------------------------------------------------------------------
50 	 * Constructors
51 	 * -------------------------------------------------------------------
52 	 */
53 
54 	/**
55 	 * Can't be instantiated.
56 	 */
CallVerificationStack()57 	private CallVerificationStack() {
58 		// empty
59 	}
60 
61 	/*
62 	 * -------------------------------------------------------------------
63 	 * Methods
64 	 * -------------------------------------------------------------------
65 	 */
66 
67 	/**
68 	 * Gets the singleton instance.
69 	 *
70 	 * @return the singleton instance
71 	 */
getInstance()72 	public static CallVerificationStack getInstance() {
73 		return _instance;
74 	}
75 
76 	/**
77 	 * Pushes the call stack.
78 	 */
pushCallStack()79 	private void pushCallStack() {
80 		StackTraceElement[] eles = (new Throwable()).getStackTrace();
81 		int i;
82 		for (i = 1; i < eles.length; i++) {
83 			if (!eles[i].getClassName().equals(this.getClass().getName())) {
84 				break;
85 			}
86 		}
87 		this.callStack.push(eles[i]);
88 	}
89 
90 	/**
91 	 * Gets the "current" calling class name.
92 	 *
93 	 * @return the "current" calling class name
94 	 */
getCurrentSourceClass()95 	public String getCurrentSourceClass() {
96 		return this.callStack.peek().getClassName();
97 	}
98 
99 	/**
100 	 * Gets the "current" calling method name.
101 	 *
102 	 * @return the "current" calling method name
103 	 */
getCurrentSourceMethod()104 	public String getCurrentSourceMethod() {
105 		return this.callStack.peek().getMethodName();
106 	}
107 
108 	/**
109 	 * Clear the parameter stack and the call stack.
110 	 *
111 	 */
112 	@Override
clear()113     public void clear() {
114 		this.callStack.clear();
115 		super.clear();
116 	}
117 
118 	@Override
push(Object o)119     public Object push(Object o) {
120 		pushCallStack();
121 		return super.push(o);
122 	}
123 
124 	/**
125 	 * Pushes a boolean onto the top of this stack.
126 	 *
127 	 * @param val
128 	 *            the value to push
129 	 */
push(boolean val)130 	public void push(boolean val) {
131 		this.push(new BaseTypeWrapper(val));
132 	}
133 
134 	/**
135 	 * Pushes a char onto the top of this stack.
136 	 *
137 	 * @param val
138 	 *            the value to push
139 	 */
push(char val)140 	public void push(char val) {
141 		this.push(new BaseTypeWrapper(val));
142 	}
143 
144 	/**
145 	 * Pushes a double onto the top of this stack.
146 	 *
147 	 * @param val
148 	 *            the value to push
149 	 */
push(double val)150 	public void push(double val) {
151 		this.push(new BaseTypeWrapper(val));
152 	}
153 
154 	/**
155 	 * Pushes a float onto the top of this stack.
156 	 *
157 	 * @param val
158 	 *            the value to push
159 	 */
push(float val)160 	public void push(float val) {
161 		this.push(new BaseTypeWrapper(val));
162 	}
163 
164 	/**
165 	 * Pushes an int onto the top of this stack.
166 	 *
167 	 * @param val
168 	 *            the value to push
169 	 */
push(int val)170 	public void push(int val) {
171 		this.push(new BaseTypeWrapper(val));
172 	}
173 
174 	/**
175 	 * Pushes a long onto the top of this stack.
176 	 *
177 	 * @param val
178 	 *            the value to push
179 	 */
push(long val)180 	public void push(long val) {
181 		this.push(new BaseTypeWrapper(val));
182 	}
183 
184 	/**
185 	 * Pushes a short onto the top of this stack.
186 	 *
187 	 * @param val
188 	 *            the value to push
189 	 */
push(short val)190 	public void push(short val) {
191 		this.push(new BaseTypeWrapper(val));
192 	}
193 
194 	/**
195 	 * Pop an object.
196 	 *
197 	 * @return the object
198 	 */
199 	@Override
pop()200     public Object pop() {
201 		this.callStack.pop();
202 		return super.pop();
203 	}
204 
205 	/**
206 	 * Pop a boolean.
207 	 *
208 	 * @return the value
209 	 */
popBoolean()210 	public boolean popBoolean() {
211 		BaseTypeWrapper wrapper = (BaseTypeWrapper) this.pop();
212 		Boolean value = (Boolean) wrapper.getValue();
213 		return value.booleanValue();
214 	}
215 
216 	/**
217 	 * Pop a char.
218 	 *
219 	 * @return the value
220 	 */
popChar()221 	public char popChar() {
222 		BaseTypeWrapper wrapper = (BaseTypeWrapper) this.pop();
223 		Character value = (Character) wrapper.getValue();
224 		return value.charValue();
225 	}
226 
227 	/**
228 	 * Pop a double.
229 	 *
230 	 * @return the value
231 	 */
popDouble()232 	public double popDouble() {
233 		BaseTypeWrapper wrapper = (BaseTypeWrapper) this.pop();
234 		Double value = (Double) wrapper.getValue();
235 		return value.doubleValue();
236 	}
237 
238 	/**
239 	 * Pop a float.
240 	 *
241 	 * @return the value
242 	 */
popFloat()243 	public float popFloat() {
244 		BaseTypeWrapper wrapper = (BaseTypeWrapper) this.pop();
245 		Float value = (Float) wrapper.getValue();
246 		return value.floatValue();
247 	}
248 
249 	/**
250 	 * Pop a int.
251 	 *
252 	 * @return the value
253 	 */
popInt()254 	public int popInt() {
255 		BaseTypeWrapper wrapper = (BaseTypeWrapper) this.pop();
256 		Integer value = (Integer) wrapper.getValue();
257 		return value.intValue();
258 	}
259 
260 	/**
261 	 * Pop a long.
262 	 *
263 	 * @return the value
264 	 */
popLong()265 	public long popLong() {
266 		BaseTypeWrapper wrapper = (BaseTypeWrapper) this.pop();
267 		Long value = (Long) wrapper.getValue();
268 		return value.longValue();
269 	}
270 
271 	/**
272 	 * Pop a short.
273 	 *
274 	 * @return the value
275 	 */
popShort()276 	public short popShort() {
277 		BaseTypeWrapper wrapper = (BaseTypeWrapper) this.pop();
278 		Short value = (Short) wrapper.getValue();
279 		return value.shortValue();
280 	}
281 
282 	/*
283 	 * Wrapper of base types.
284 	 */
285 	class BaseTypeWrapper {
286 
287 		// the internal value
288 		private Object value;
289 
290 		/*
291 		 * Constructs a wrapper object for the base type <code> boolean </code> .
292 		 */
BaseTypeWrapper(boolean val)293 		public BaseTypeWrapper(boolean val) {
294 			this.value = new Boolean(val);
295 		}
296 
297 		/*
298 		 * Constructs a wrapper object for the base type <code> c </code> .
299 		 */
BaseTypeWrapper(byte val)300 		public BaseTypeWrapper(byte val) {
301 			this.value = new Byte(val);
302 		}
303 
304 		/*
305 		 * Constructs a wrapper object for the base type <code> char </code> .
306 		 */
BaseTypeWrapper(char val)307 		public BaseTypeWrapper(char val) {
308 			this.value = new Character(val);
309 		}
310 
311 		/*
312 		 * Constructs a wrapper object for the base type <code> double </code> .
313 		 */
BaseTypeWrapper(double val)314 		public BaseTypeWrapper(double val) {
315 			this.value = new Double(val);
316 		}
317 
318 		/*
319 		 * Constructs a wrapper object for the base type <code> float </code> .
320 		 */
BaseTypeWrapper(float val)321 		public BaseTypeWrapper(float val) {
322 			this.value = new Float(val);
323 		}
324 
325 		/*
326 		 * Constructs a wrapper object for the base type <code> int </code> .
327 		 */
BaseTypeWrapper(int val)328 		public BaseTypeWrapper(int val) {
329 			this.value = new Integer(val);
330 		}
331 
332 		/*
333 		 * Constructs a wrapper object for the base type <code> long </code> .
334 		 */
BaseTypeWrapper(long val)335 		public BaseTypeWrapper(long val) {
336 			this.value = new Long(val);
337 		}
338 
339 		/*
340 		 * Constructs a wrapper object for the base type <code> short </code> .
341 		 */
BaseTypeWrapper(short val)342 		public BaseTypeWrapper(short val) {
343 			this.value = new Short(val);
344 		}
345 
346 		/*
347 		 * Gets the internal value.
348 		 */
getValue()349 		public Object getValue() {
350 			return this.value;
351 		}
352 	}
353 }
354