Home | History | Annotate | Download | only in util
      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 	 */
     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 	 */
     72 	public static CallVerificationStack getInstance() {
     73 		return _instance;
     74 	}
     75 
     76 	/**
     77 	 * Pushes the call stack.
     78 	 */
     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 	 */
     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 	 */
    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
    113     public void clear() {
    114 		this.callStack.clear();
    115 		super.clear();
    116 	}
    117 
    118 	@Override
    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 	 */
    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 	 */
    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 	 */
    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 	 */
    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 	 */
    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 	 */
    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 	 */
    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
    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 	 */
    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 	 */
    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 	 */
    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 	 */
    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 	 */
    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 	 */
    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 	 */
    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 		 */
    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 		 */
    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 		 */
    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 		 */
    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 		 */
    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 		 */
    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 		 */
    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 		 */
    342 		public BaseTypeWrapper(short val) {
    343 			this.value = new Short(val);
    344 		}
    345 
    346 		/*
    347 		 * Gets the internal value.
    348 		 */
    349 		public Object getValue() {
    350 			return this.value;
    351 		}
    352 	}
    353 }
    354