Home | History | Annotate | Download | only in jdwp
      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  *
     15  *  See the License for the specific language governing permissions and
     16  *  limitations under the License.
     17  */
     18 
     19 /**
     20  * @author Aleksey V. Yantsen
     21  */
     22 
     23 /**
     24  * Created on 10.25.2004
     25  */
     26 package org.apache.harmony.jpda.tests.framework.jdwp;
     27 
     28 import org.apache.harmony.jpda.tests.framework.TestErrorException;
     29 import org.apache.harmony.jpda.tests.framework.jdwp.JDWPConstants;
     30 
     31 /**
     32  * This class represents generic value used in JDWP packets.
     33  */
     34 public class Value {
     35 
     36     /**
     37      * Creates new boolean value.
     38      */
     39     public static Value createBoolean(boolean value) {
     40         return new Value(value);
     41     }
     42 
     43     /**
     44      * Creates new byte value.
     45      */
     46     public static Value createByte(byte value) {
     47         return new Value(JDWPConstants.Tag.BYTE_TAG, Byte.valueOf(value));
     48     }
     49 
     50     /**
     51      * Creates new char value.
     52      */
     53     public static Value createChar(char value) {
     54         return new Value(value);
     55     }
     56 
     57     /**
     58      * Creates new short value.
     59      */
     60     public static Value createShort(short value) {
     61         return new Value(JDWPConstants.Tag.SHORT_TAG, Short.valueOf(value));
     62     }
     63 
     64     /**
     65      * Creates new int value.
     66      */
     67     public static Value createInt(int value) {
     68         return new Value(JDWPConstants.Tag.INT_TAG, Integer.valueOf(value));
     69     }
     70 
     71     /**
     72      * Creates new long value.
     73      */
     74     public static Value createLong(long value) {
     75         return new Value(JDWPConstants.Tag.LONG_TAG, Long.valueOf(value));
     76     }
     77 
     78     /**
     79      * Creates new float value.
     80      */
     81     public static Value createFloat(float value) {
     82         return new Value(JDWPConstants.Tag.FLOAT_TAG, Float.valueOf(value));
     83     }
     84 
     85     /**
     86      * Creates new double value.
     87      */
     88     public static Value createDouble(double value) {
     89         return new Value(JDWPConstants.Tag.DOUBLE_TAG, Double.valueOf(value));
     90     }
     91 
     92     /**
     93      * Creates void value.
     94      */
     95     public static Value createVoidValue() {
     96         return new Value(JDWPConstants.Tag.VOID_TAG, Long.valueOf(0));
     97     }
     98 
     99     /**
    100      * Creates object value.
    101      */
    102     public static Value createObjectValue(byte tag, long value) {
    103         if (isPrimitiveTag(tag)) {
    104             throw new AssertionError(JDWPConstants.Tag.getName(tag) + " is primitive");
    105         }
    106         return new Value(tag, Long.valueOf(value));
    107     }
    108 
    109     private final byte tag;
    110 
    111     private final Number numberValue;
    112 
    113     private final boolean booleanValue;
    114 
    115     private final char charValue;
    116 
    117     /**
    118      * Creates new value.
    119      */
    120     private Value(byte tag, Number numberValue) {
    121         this.tag = tag;
    122         this.numberValue = numberValue;
    123         this.booleanValue = false;
    124         this.charValue = 0;
    125     }
    126 
    127     /**
    128      * Creates new boolean value.
    129      */
    130     private Value(boolean value) {
    131         this.tag = JDWPConstants.Tag.BOOLEAN_TAG;
    132         this.booleanValue = value;
    133         this.numberValue = null;
    134         this.charValue = 0;
    135     }
    136 
    137     /**
    138      * Creates new char value.
    139      */
    140     private Value(char value) {
    141         this.tag = JDWPConstants.Tag.CHAR_TAG;
    142         this.charValue = value;
    143         this.numberValue = null;
    144         this.booleanValue = false;
    145     }
    146 
    147     /**
    148      * Returns tag of this value.
    149      *
    150      * @return Returns the tag.
    151      */
    152     public byte getTag() {
    153         return tag;
    154     }
    155 
    156     /**
    157      * Returns byte representation of this value.
    158      *
    159      * @return byte value
    160      */
    161     public byte getByteValue() {
    162         return numberValue.byteValue();
    163     }
    164 
    165     /**
    166      * Returns short representation of this value.
    167      *
    168      * @return short value
    169      */
    170     public short getShortValue() {
    171         return numberValue.shortValue();
    172     }
    173 
    174     /**
    175      * Returns int representation of this value.
    176      *
    177      * @return int value
    178      */
    179     public int getIntValue() {
    180         return numberValue.intValue();
    181     }
    182 
    183     /**
    184      * Returns long representation of this value.
    185      *
    186      * @return long value
    187      */
    188     public long getLongValue() {
    189         return numberValue.longValue();
    190     }
    191 
    192     /**
    193      * Returns float representation of this value.
    194      *
    195      * @return float value
    196      */
    197     public float getFloatValue() {
    198         return numberValue.floatValue();
    199     }
    200 
    201     /**
    202      * Returns double representation of this value.
    203      *
    204      * @return double value
    205      */
    206     public double getDoubleValue() {
    207         return numberValue.doubleValue();
    208     }
    209 
    210     /**
    211      * Returns boolean representation of this value.
    212      *
    213      * @return boolean value
    214      */
    215     public boolean getBooleanValue() {
    216         return booleanValue;
    217     }
    218 
    219     /**
    220      * Returns char representation of this value.
    221      *
    222      * @return char value
    223      */
    224     public char getCharValue() {
    225         return charValue;
    226     }
    227 
    228     private static boolean isPrimitiveTag(byte tag) {
    229         switch (tag) {
    230             case JDWPConstants.Tag.BOOLEAN_TAG:
    231             case JDWPConstants.Tag.BYTE_TAG:
    232             case JDWPConstants.Tag.CHAR_TAG:
    233             case JDWPConstants.Tag.SHORT_TAG:
    234             case JDWPConstants.Tag.INT_TAG:
    235             case JDWPConstants.Tag.LONG_TAG:
    236             case JDWPConstants.Tag.FLOAT_TAG:
    237             case JDWPConstants.Tag.DOUBLE_TAG:
    238             case JDWPConstants.Tag.VOID_TAG:
    239                 return true;
    240             case JDWPConstants.Tag.NO_TAG:
    241             case JDWPConstants.Tag.ARRAY_TAG:
    242             case JDWPConstants.Tag.CLASS_LOADER_TAG:
    243             case JDWPConstants.Tag.CLASS_OBJECT_TAG:
    244             case JDWPConstants.Tag.OBJECT_TAG:
    245             case JDWPConstants.Tag.STRING_TAG:
    246             case JDWPConstants.Tag.THREAD_TAG:
    247             case JDWPConstants.Tag.THREAD_GROUP_TAG:
    248                 return false;
    249             default:
    250                 throw new TestErrorException("Illegal tag value: " + tag);
    251         }
    252     }
    253 
    254     /**
    255      * Compares with other value.
    256      */
    257     @Override
    258     public boolean equals(Object arg0) {
    259         if (!(arg0 instanceof Value))
    260             return false;
    261 
    262         Value value0 = (Value) arg0;
    263         if (tag != value0.tag)
    264             return false;
    265 
    266         switch (tag) {
    267         case JDWPConstants.Tag.BOOLEAN_TAG:
    268             return getBooleanValue() == value0.getBooleanValue();
    269         case JDWPConstants.Tag.BYTE_TAG:
    270             return getByteValue() == value0.getByteValue();
    271         case JDWPConstants.Tag.CHAR_TAG:
    272             return getCharValue() == value0.getCharValue();
    273         case JDWPConstants.Tag.DOUBLE_TAG:
    274             if (Double.isNaN(getDoubleValue())
    275                     && (Double.isNaN(value0.getDoubleValue())))
    276                 return true;
    277             return getDoubleValue() == value0.getDoubleValue();
    278         case JDWPConstants.Tag.FLOAT_TAG:
    279             if (Float.isNaN(getFloatValue())
    280                     && (Float.isNaN(value0.getFloatValue())))
    281                 return true;
    282             return getFloatValue() == value0.getFloatValue();
    283         case JDWPConstants.Tag.INT_TAG:
    284             return getIntValue() == value0.getIntValue();
    285         case JDWPConstants.Tag.LONG_TAG:
    286             return getLongValue() == value0.getLongValue();
    287         case JDWPConstants.Tag.SHORT_TAG:
    288             return getShortValue() == value0.getShortValue();
    289         case JDWPConstants.Tag.STRING_TAG:
    290         case JDWPConstants.Tag.ARRAY_TAG:
    291         case JDWPConstants.Tag.CLASS_LOADER_TAG:
    292         case JDWPConstants.Tag.CLASS_OBJECT_TAG:
    293         case JDWPConstants.Tag.OBJECT_TAG:
    294         case JDWPConstants.Tag.THREAD_GROUP_TAG:
    295         case JDWPConstants.Tag.THREAD_TAG:
    296             return getLongValue() == value0.getLongValue();
    297         }
    298 
    299         throw new TestErrorException("Illegal tag value");
    300     }
    301 
    302     /**
    303      * Converts this value to string representation for printing.
    304      */
    305     @Override
    306     public String toString() {
    307 
    308         switch (tag) {
    309         case JDWPConstants.Tag.BOOLEAN_TAG:
    310             return "boolean: " + getBooleanValue();
    311         case JDWPConstants.Tag.BYTE_TAG:
    312             return "byte: " + getByteValue();
    313         case JDWPConstants.Tag.CHAR_TAG:
    314             return "char: " + getCharValue();
    315         case JDWPConstants.Tag.DOUBLE_TAG:
    316             return "double: " + getDoubleValue();
    317         case JDWPConstants.Tag.FLOAT_TAG:
    318             return "float: " + getFloatValue();
    319         case JDWPConstants.Tag.INT_TAG:
    320             return "int: " + getIntValue();
    321         case JDWPConstants.Tag.LONG_TAG:
    322             return "long: " + getLongValue();
    323         case JDWPConstants.Tag.SHORT_TAG:
    324             return "short: " + getShortValue();
    325         case JDWPConstants.Tag.STRING_TAG:
    326             return "StringID: " + getLongValue();
    327         case JDWPConstants.Tag.ARRAY_TAG:
    328             return "ArrayID: " + getLongValue();
    329         case JDWPConstants.Tag.CLASS_LOADER_TAG:
    330             return "ClassLoaderID: " + getLongValue();
    331         case JDWPConstants.Tag.CLASS_OBJECT_TAG:
    332             return "ClassObjectID: " + getLongValue();
    333         case JDWPConstants.Tag.OBJECT_TAG:
    334             return "ObjectID: " + getLongValue();
    335         case JDWPConstants.Tag.THREAD_GROUP_TAG:
    336             return "ThreadGroupID: " + getLongValue();
    337         case JDWPConstants.Tag.THREAD_TAG:
    338             return "ThreadID: " + getLongValue();
    339         }
    340 
    341         throw new TestErrorException("Illegal tag value: " + tag);
    342     }
    343 }
    344