/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package tests.util; import java.util.Stack; /** * A stack to store the parameters of a call, as well as the call stack. */ public class CallVerificationStack extends Stack<Object> { /* * -------------------------------------------------------------------- * Class variables * -------------------------------------------------------------------- */ private static final long serialVersionUID = 1L; // the singleton private static final CallVerificationStack _instance = new CallVerificationStack(); /* * -------------------------------------------------------------------- * Instance variables * -------------------------------------------------------------------- */ // the call stack, store StackTraceElement private final Stack<StackTraceElement> callStack = new Stack<StackTraceElement>(); /* * ------------------------------------------------------------------- * Constructors * ------------------------------------------------------------------- */ /** * Can't be instantiated. */ private CallVerificationStack() { // empty } /* * ------------------------------------------------------------------- * Methods * ------------------------------------------------------------------- */ /** * Gets the singleton instance. * * @return the singleton instance */ public static CallVerificationStack getInstance() { return _instance; } /** * Pushes the call stack. */ private void pushCallStack() { StackTraceElement[] eles = (new Throwable()).getStackTrace(); int i; for (i = 1; i < eles.length; i++) { if (!eles[i].getClassName().equals(this.getClass().getName())) { break; } } this.callStack.push(eles[i]); } /** * Gets the "current" calling class name. * * @return the "current" calling class name */ public String getCurrentSourceClass() { return this.callStack.peek().getClassName(); } /** * Gets the "current" calling method name. * * @return the "current" calling method name */ public String getCurrentSourceMethod() { return this.callStack.peek().getMethodName(); } /** * Clear the parameter stack and the call stack. */ @Override public void clear() { this.callStack.clear(); super.clear(); } @Override public Object push(Object o) { pushCallStack(); return super.push(o); } /** * Pushes a boolean onto the top of this stack. * * @param val the value to push */ public void push(boolean val) { this.push(new BaseTypeWrapper(val)); } /** * Pushes a char onto the top of this stack. * * @param val the value to push */ public void push(char val) { this.push(new BaseTypeWrapper(val)); } /** * Pushes a double onto the top of this stack. * * @param val the value to push */ public void push(double val) { this.push(new BaseTypeWrapper(val)); } /** * Pushes a float onto the top of this stack. * * @param val the value to push */ public void push(float val) { this.push(new BaseTypeWrapper(val)); } /** * Pushes an int onto the top of this stack. * * @param val the value to push */ public void push(int val) { this.push(new BaseTypeWrapper(val)); } /** * Pushes a long onto the top of this stack. * * @param val the value to push */ public void push(long val) { this.push(new BaseTypeWrapper(val)); } /** * Pushes a short onto the top of this stack. * * @param val the value to push */ public void push(short val) { this.push(new BaseTypeWrapper(val)); } /** * Pop an object. * * @return the object */ @Override public Object pop() { this.callStack.pop(); return super.pop(); } /** * Pop a boolean. * * @return the value */ public boolean popBoolean() { BaseTypeWrapper wrapper = (BaseTypeWrapper) this.pop(); Boolean value = (Boolean) wrapper.getValue(); return value.booleanValue(); } /** * Pop a char. * * @return the value */ public char popChar() { BaseTypeWrapper wrapper = (BaseTypeWrapper) this.pop(); Character value = (Character) wrapper.getValue(); return value.charValue(); } /** * Pop a double. * * @return the value */ public double popDouble() { BaseTypeWrapper wrapper = (BaseTypeWrapper) this.pop(); Double value = (Double) wrapper.getValue(); return value.doubleValue(); } /** * Pop a float. * * @return the value */ public float popFloat() { BaseTypeWrapper wrapper = (BaseTypeWrapper) this.pop(); Float value = (Float) wrapper.getValue(); return value.floatValue(); } /** * Pop a int. * * @return the value */ public int popInt() { BaseTypeWrapper wrapper = (BaseTypeWrapper) this.pop(); Integer value = (Integer) wrapper.getValue(); return value.intValue(); } /** * Pop a long. * * @return the value */ public long popLong() { BaseTypeWrapper wrapper = (BaseTypeWrapper) this.pop(); Long value = (Long) wrapper.getValue(); return value.longValue(); } /** * Pop a short. * * @return the value */ public short popShort() { BaseTypeWrapper wrapper = (BaseTypeWrapper) this.pop(); Short value = (Short) wrapper.getValue(); return value.shortValue(); } /* * Wrapper of base types. */ class BaseTypeWrapper { // the internal value private Object value; /* * Constructs a wrapper object for the base type <code> boolean </code> . */ public BaseTypeWrapper(boolean val) { this.value = new Boolean(val); } /* * Constructs a wrapper object for the base type <code> c </code> . */ public BaseTypeWrapper(byte val) { this.value = new Byte(val); } /* * Constructs a wrapper object for the base type <code> char </code> . */ public BaseTypeWrapper(char val) { this.value = new Character(val); } /* * Constructs a wrapper object for the base type <code> double </code> . */ public BaseTypeWrapper(double val) { this.value = new Double(val); } /* * Constructs a wrapper object for the base type <code> float </code> . */ public BaseTypeWrapper(float val) { this.value = new Float(val); } /* * Constructs a wrapper object for the base type <code> int </code> . */ public BaseTypeWrapper(int val) { this.value = new Integer(val); } /* * Constructs a wrapper object for the base type <code> long </code> . */ public BaseTypeWrapper(long val) { this.value = new Long(val); } /* * Constructs a wrapper object for the base type <code> short </code> . */ public BaseTypeWrapper(short val) { this.value = new Short(val); } /* * Gets the internal value. */ public Object getValue() { return this.value; } } }