| /* |
| * 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. |
| */ |
| |
| /** |
| * @author Aleksey V. Yantsen |
| */ |
| |
| /** |
| * Created on 10.25.2004 |
| */ |
| package org.apache.harmony.jpda.tests.framework.jdwp; |
| |
| import org.apache.harmony.jpda.tests.framework.TestErrorException; |
| import org.apache.harmony.jpda.tests.framework.jdwp.JDWPConstants; |
| |
| /** |
| * This class represents generic value used in JDWP packets. |
| */ |
| public class Value { |
| |
| /** |
| * Creates new boolean value. |
| */ |
| public static Value createBoolean(boolean value) { |
| return new Value(value); |
| } |
| |
| /** |
| * Creates new byte value. |
| */ |
| public static Value createByte(byte value) { |
| return new Value(JDWPConstants.Tag.BYTE_TAG, Byte.valueOf(value)); |
| } |
| |
| /** |
| * Creates new char value. |
| */ |
| public static Value createChar(char value) { |
| return new Value(value); |
| } |
| |
| /** |
| * Creates new short value. |
| */ |
| public static Value createShort(short value) { |
| return new Value(JDWPConstants.Tag.SHORT_TAG, Short.valueOf(value)); |
| } |
| |
| /** |
| * Creates new int value. |
| */ |
| public static Value createInt(int value) { |
| return new Value(JDWPConstants.Tag.INT_TAG, Integer.valueOf(value)); |
| } |
| |
| /** |
| * Creates new long value. |
| */ |
| public static Value createLong(long value) { |
| return new Value(JDWPConstants.Tag.LONG_TAG, Long.valueOf(value)); |
| } |
| |
| /** |
| * Creates new float value. |
| */ |
| public static Value createFloat(float value) { |
| return new Value(JDWPConstants.Tag.FLOAT_TAG, Float.valueOf(value)); |
| } |
| |
| /** |
| * Creates new double value. |
| */ |
| public static Value createDouble(double value) { |
| return new Value(JDWPConstants.Tag.DOUBLE_TAG, Double.valueOf(value)); |
| } |
| |
| /** |
| * Creates void value. |
| */ |
| public static Value createVoidValue() { |
| return new Value(JDWPConstants.Tag.VOID_TAG, Long.valueOf(0)); |
| } |
| |
| /** |
| * Creates object value. |
| */ |
| public static Value createObjectValue(byte tag, long value) { |
| if (isPrimitiveTag(tag)) { |
| throw new AssertionError(JDWPConstants.Tag.getName(tag) + " is primitive"); |
| } |
| return new Value(tag, Long.valueOf(value)); |
| } |
| |
| private final byte tag; |
| |
| private final Number numberValue; |
| |
| private final boolean booleanValue; |
| |
| private final char charValue; |
| |
| /** |
| * Creates new value. |
| */ |
| private Value(byte tag, Number numberValue) { |
| this.tag = tag; |
| this.numberValue = numberValue; |
| this.booleanValue = false; |
| this.charValue = 0; |
| } |
| |
| /** |
| * Creates new boolean value. |
| */ |
| private Value(boolean value) { |
| this.tag = JDWPConstants.Tag.BOOLEAN_TAG; |
| this.booleanValue = value; |
| this.numberValue = null; |
| this.charValue = 0; |
| } |
| |
| /** |
| * Creates new char value. |
| */ |
| private Value(char value) { |
| this.tag = JDWPConstants.Tag.CHAR_TAG; |
| this.charValue = value; |
| this.numberValue = null; |
| this.booleanValue = false; |
| } |
| |
| /** |
| * Returns tag of this value. |
| * |
| * @return Returns the tag. |
| */ |
| public byte getTag() { |
| return tag; |
| } |
| |
| /** |
| * Returns byte representation of this value. |
| * |
| * @return byte value |
| */ |
| public byte getByteValue() { |
| return numberValue.byteValue(); |
| } |
| |
| /** |
| * Returns short representation of this value. |
| * |
| * @return short value |
| */ |
| public short getShortValue() { |
| return numberValue.shortValue(); |
| } |
| |
| /** |
| * Returns int representation of this value. |
| * |
| * @return int value |
| */ |
| public int getIntValue() { |
| return numberValue.intValue(); |
| } |
| |
| /** |
| * Returns long representation of this value. |
| * |
| * @return long value |
| */ |
| public long getLongValue() { |
| return numberValue.longValue(); |
| } |
| |
| /** |
| * Returns float representation of this value. |
| * |
| * @return float value |
| */ |
| public float getFloatValue() { |
| return numberValue.floatValue(); |
| } |
| |
| /** |
| * Returns double representation of this value. |
| * |
| * @return double value |
| */ |
| public double getDoubleValue() { |
| return numberValue.doubleValue(); |
| } |
| |
| /** |
| * Returns boolean representation of this value. |
| * |
| * @return boolean value |
| */ |
| public boolean getBooleanValue() { |
| return booleanValue; |
| } |
| |
| /** |
| * Returns char representation of this value. |
| * |
| * @return char value |
| */ |
| public char getCharValue() { |
| return charValue; |
| } |
| |
| private static boolean isPrimitiveTag(byte tag) { |
| switch (tag) { |
| case JDWPConstants.Tag.BOOLEAN_TAG: |
| case JDWPConstants.Tag.BYTE_TAG: |
| case JDWPConstants.Tag.CHAR_TAG: |
| case JDWPConstants.Tag.SHORT_TAG: |
| case JDWPConstants.Tag.INT_TAG: |
| case JDWPConstants.Tag.LONG_TAG: |
| case JDWPConstants.Tag.FLOAT_TAG: |
| case JDWPConstants.Tag.DOUBLE_TAG: |
| case JDWPConstants.Tag.VOID_TAG: |
| return true; |
| case JDWPConstants.Tag.NO_TAG: |
| case JDWPConstants.Tag.ARRAY_TAG: |
| case JDWPConstants.Tag.CLASS_LOADER_TAG: |
| case JDWPConstants.Tag.CLASS_OBJECT_TAG: |
| case JDWPConstants.Tag.OBJECT_TAG: |
| case JDWPConstants.Tag.STRING_TAG: |
| case JDWPConstants.Tag.THREAD_TAG: |
| case JDWPConstants.Tag.THREAD_GROUP_TAG: |
| return false; |
| default: |
| throw new TestErrorException("Illegal tag value: " + tag); |
| } |
| } |
| |
| /** |
| * Compares with other value. |
| */ |
| @Override |
| public boolean equals(Object arg0) { |
| if (!(arg0 instanceof Value)) |
| return false; |
| |
| Value value0 = (Value) arg0; |
| if (tag != value0.tag) |
| return false; |
| |
| switch (tag) { |
| case JDWPConstants.Tag.BOOLEAN_TAG: |
| return getBooleanValue() == value0.getBooleanValue(); |
| case JDWPConstants.Tag.BYTE_TAG: |
| return getByteValue() == value0.getByteValue(); |
| case JDWPConstants.Tag.CHAR_TAG: |
| return getCharValue() == value0.getCharValue(); |
| case JDWPConstants.Tag.DOUBLE_TAG: |
| if (Double.isNaN(getDoubleValue()) |
| && (Double.isNaN(value0.getDoubleValue()))) |
| return true; |
| return getDoubleValue() == value0.getDoubleValue(); |
| case JDWPConstants.Tag.FLOAT_TAG: |
| if (Float.isNaN(getFloatValue()) |
| && (Float.isNaN(value0.getFloatValue()))) |
| return true; |
| return getFloatValue() == value0.getFloatValue(); |
| case JDWPConstants.Tag.INT_TAG: |
| return getIntValue() == value0.getIntValue(); |
| case JDWPConstants.Tag.LONG_TAG: |
| return getLongValue() == value0.getLongValue(); |
| case JDWPConstants.Tag.SHORT_TAG: |
| return getShortValue() == value0.getShortValue(); |
| case JDWPConstants.Tag.STRING_TAG: |
| case JDWPConstants.Tag.ARRAY_TAG: |
| case JDWPConstants.Tag.CLASS_LOADER_TAG: |
| case JDWPConstants.Tag.CLASS_OBJECT_TAG: |
| case JDWPConstants.Tag.OBJECT_TAG: |
| case JDWPConstants.Tag.THREAD_GROUP_TAG: |
| case JDWPConstants.Tag.THREAD_TAG: |
| return getLongValue() == value0.getLongValue(); |
| } |
| |
| throw new TestErrorException("Illegal tag value"); |
| } |
| |
| /** |
| * Converts this value to string representation for printing. |
| */ |
| @Override |
| public String toString() { |
| |
| switch (tag) { |
| case JDWPConstants.Tag.BOOLEAN_TAG: |
| return "boolean: " + getBooleanValue(); |
| case JDWPConstants.Tag.BYTE_TAG: |
| return "byte: " + getByteValue(); |
| case JDWPConstants.Tag.CHAR_TAG: |
| return "char: " + getCharValue(); |
| case JDWPConstants.Tag.DOUBLE_TAG: |
| return "double: " + getDoubleValue(); |
| case JDWPConstants.Tag.FLOAT_TAG: |
| return "float: " + getFloatValue(); |
| case JDWPConstants.Tag.INT_TAG: |
| return "int: " + getIntValue(); |
| case JDWPConstants.Tag.LONG_TAG: |
| return "long: " + getLongValue(); |
| case JDWPConstants.Tag.SHORT_TAG: |
| return "short: " + getShortValue(); |
| case JDWPConstants.Tag.STRING_TAG: |
| return "StringID: " + getLongValue(); |
| case JDWPConstants.Tag.ARRAY_TAG: |
| return "ArrayID: " + getLongValue(); |
| case JDWPConstants.Tag.CLASS_LOADER_TAG: |
| return "ClassLoaderID: " + getLongValue(); |
| case JDWPConstants.Tag.CLASS_OBJECT_TAG: |
| return "ClassObjectID: " + getLongValue(); |
| case JDWPConstants.Tag.OBJECT_TAG: |
| return "ObjectID: " + getLongValue(); |
| case JDWPConstants.Tag.THREAD_GROUP_TAG: |
| return "ThreadGroupID: " + getLongValue(); |
| case JDWPConstants.Tag.THREAD_TAG: |
| return "ThreadID: " + getLongValue(); |
| } |
| |
| throw new TestErrorException("Illegal tag value: " + tag); |
| } |
| } |