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