Package org.aspectj.apache.bcel.classfile.annotation

Source Code of org.aspectj.apache.bcel.classfile.annotation.SimpleElementValue

/* *******************************************************************
* Copyright (c) 2004 IBM
* All rights reserved.
* This program and the accompanying materials are made available
* under the terms of the Eclipse Public License v1.0
* which accompanies this distribution and is available at
* http://www.eclipse.org/legal/epl-v10.html
* Contributors:
*     Andy Clement -     initial implementation {date}
* ******************************************************************/

package org.aspectj.apache.bcel.classfile.annotation;

import java.io.DataOutputStream;
import java.io.IOException;

import org.aspectj.apache.bcel.Constants;
import org.aspectj.apache.bcel.classfile.ConstantDouble;
import org.aspectj.apache.bcel.classfile.ConstantFloat;
import org.aspectj.apache.bcel.classfile.ConstantInteger;
import org.aspectj.apache.bcel.classfile.ConstantLong;
import org.aspectj.apache.bcel.classfile.ConstantPool;
import org.aspectj.apache.bcel.classfile.ConstantUtf8;

public class SimpleElementValue extends ElementValue {

  // For primitive types and string type, this points to the value entry in the cpGen
  // For 'class' this points to the class entry in the cpGen
  private int idx;

  // ctors for each supported type... type could be inferred but for now lets
  // force it to be passed

  /**
   * Protected ctor used for deserialization, doesn't *put* an entry in the constant pool, assumes the one at the supplied index
   * is correct.
   */
  protected SimpleElementValue(int type, int idx, ConstantPool cpGen) {
    super(type, cpGen);
    this.idx = idx;
  }

  public SimpleElementValue(int type, ConstantPool cpGen, int value) {
    super(type, cpGen);
    idx = cpGen.addInteger(value);
  }

  public SimpleElementValue(int type, ConstantPool cpGen, long value) {
    super(type, cpGen);
    idx = cpGen.addLong(value);
  }

  public SimpleElementValue(int type, ConstantPool cpGen, double value) {
    super(type, cpGen);
    idx = cpGen.addDouble(value);
  }

  public SimpleElementValue(int type, ConstantPool cpGen, float value) {
    super(type, cpGen);
    idx = cpGen.addFloat(value);
  }

  public SimpleElementValue(int type, ConstantPool cpGen, short value) {
    super(type, cpGen);
    idx = cpGen.addInteger(value);
  }

  public SimpleElementValue(int type, ConstantPool cpGen, byte value) {
    super(type, cpGen);
    idx = cpGen.addInteger(value);
  }

  public SimpleElementValue(int type, ConstantPool cpGen, char value) {
    super(type, cpGen);
    idx = cpGen.addInteger(value);
  }

  public SimpleElementValue(int type, ConstantPool cpGen, boolean value) {
    super(type, cpGen);
    if (value) {
      idx = cpGen.addInteger(1);
    } else {
      idx = cpGen.addInteger(0);
    }
  }

  public SimpleElementValue(int type, ConstantPool cpGen, String value) {
    super(type, cpGen);
    idx = cpGen.addUtf8(value);
  }

  public byte getValueByte() {
    if (type != PRIMITIVE_BYTE) {
      throw new RuntimeException("Dont call getValueByte() on a non BYTE ElementValue");
    }
    ConstantInteger c = (ConstantInteger) cpool.getConstant(idx, Constants.CONSTANT_Integer);
    return (byte) c.getIntValue();
  }

  public char getValueChar() {
    if (type != PRIMITIVE_CHAR) {
      throw new RuntimeException("Dont call getValueChar() on a non CHAR ElementValue");
    }
    ConstantInteger c = (ConstantInteger) cpool.getConstant(idx, Constants.CONSTANT_Integer);
    return (char) c.getIntValue();
  }

  public long getValueLong() {
    if (type != PRIMITIVE_LONG) {
      throw new RuntimeException("Dont call getValueLong() on a non LONG ElementValue");
    }
    ConstantLong j = (ConstantLong) cpool.getConstant(idx);
    return j.getValue();
  }

  public float getValueFloat() {
    if (type != PRIMITIVE_FLOAT) {
      throw new RuntimeException("Dont call getValueFloat() on a non FLOAT ElementValue");
    }
    ConstantFloat f = (ConstantFloat) cpool.getConstant(idx);
    return f.getValue();
  }

  public double getValueDouble() {
    if (type != PRIMITIVE_DOUBLE) {
      throw new RuntimeException("Dont call getValueDouble() on a non DOUBLE ElementValue");
    }
    ConstantDouble d = (ConstantDouble) cpool.getConstant(idx);
    return d.getValue();
  }

  public boolean getValueBoolean() {
    if (type != PRIMITIVE_BOOLEAN) {
      throw new RuntimeException("Dont call getValueBoolean() on a non BOOLEAN ElementValue");
    }
    ConstantInteger bo = (ConstantInteger) cpool.getConstant(idx);
    return (bo.getValue() != 0);
  }

  public short getValueShort() {
    if (type != PRIMITIVE_SHORT) {
      throw new RuntimeException("Dont call getValueShort() on a non SHORT ElementValue");
    }
    ConstantInteger s = (ConstantInteger) cpool.getConstant(idx);
    return (short) s.getIntValue();
  }

  /**
   * The boolean controls whether we copy info from the 'old' constant pool to the 'new'. You need to use this ctor if the
   * annotation is being copied from one file to another.
   */
  public SimpleElementValue(SimpleElementValue value, ConstantPool cpool, boolean copyPoolEntries) {
    super(value.getElementValueType(), cpool);
    if (!copyPoolEntries) {
      // J5ASSERT: Could assert value.stringifyValue() is the same as
      // cpool.getConstant(SimpleElementValuevalue.getIndex())
      idx = value.getIndex();
    } else {
      switch (value.getElementValueType()) {
      case STRING:
        idx = cpool.addUtf8(value.getValueString());
        break;
      case PRIMITIVE_INT:
        idx = cpool.addInteger(value.getValueInt());
        break;
      case PRIMITIVE_BYTE:
        idx = cpool.addInteger(value.getValueByte());
        break;
      case PRIMITIVE_CHAR:
        idx = cpool.addInteger(value.getValueChar());
        break;
      case PRIMITIVE_LONG:
        idx = cpool.addLong(value.getValueLong());
        break;
      case PRIMITIVE_FLOAT:
        idx = cpool.addFloat(value.getValueFloat());
        break;
      case PRIMITIVE_DOUBLE:
        idx = cpool.addDouble(value.getValueDouble());
        break;
      case PRIMITIVE_BOOLEAN:
        if (value.getValueBoolean()) {
          idx = cpool.addInteger(1);
        } else {
          idx = cpool.addInteger(0);
        }
        break;
      case PRIMITIVE_SHORT:
        idx = cpool.addInteger(value.getValueShort());
        break;
      default:
        throw new RuntimeException("SimpleElementValueGen class does not know how " + "to copy this type " + type);
      }
    }
  }

  public int getIndex() {
    return idx;
  }

  public String getValueString() {
    if (type != STRING) {
      throw new RuntimeException("Dont call getValueString() on a non STRING ElementValue");
    }
    ConstantUtf8 c = (ConstantUtf8) cpool.getConstant(idx);
    return c.getValue();
  }

  public int getValueInt() {
    if (type != PRIMITIVE_INT) {
      throw new RuntimeException("Dont call getValueString() on a non STRING ElementValue");
    }
    ConstantInteger c = (ConstantInteger) cpool.getConstant(idx);
    return c.getValue();
  }

  // Whatever kind of value it is, return it as a string
  @Override
  public String stringifyValue() {
    switch (type) {
    case PRIMITIVE_INT:
      ConstantInteger c = (ConstantInteger) cpool.getConstant(idx);
      return Integer.toString(c.getValue());
    case PRIMITIVE_LONG:
      ConstantLong j = (ConstantLong) cpool.getConstant(idx);
      return Long.toString(j.getValue());
    case PRIMITIVE_DOUBLE:
      ConstantDouble d = (ConstantDouble) cpool.getConstant(idx);
      return d.getValue().toString();
    case PRIMITIVE_FLOAT:
      ConstantFloat f = (ConstantFloat) cpool.getConstant(idx);
      return Float.toString(f.getValue());
    case PRIMITIVE_SHORT:
      ConstantInteger s = (ConstantInteger) cpool.getConstant(idx);
      return Integer.toString(s.getValue());
    case PRIMITIVE_BYTE:
      ConstantInteger b = (ConstantInteger) cpool.getConstant(idx);
      return Integer.toString(b.getValue());
    case PRIMITIVE_CHAR:
      ConstantInteger ch = (ConstantInteger) cpool.getConstant(idx);
      return new Character((char) ch.getIntValue()).toString();
    case PRIMITIVE_BOOLEAN:
      ConstantInteger bo = (ConstantInteger) cpool.getConstant(idx);
      if (bo.getValue() == 0) {
        return "false";
      } else {
        return "true";
      }
    case STRING:
      ConstantUtf8 cu8 = (ConstantUtf8) cpool.getConstant(idx);
      return cu8.getValue();

    default:
      throw new RuntimeException("SimpleElementValueGen class does not know how to stringify type " + type);
    }
  }

  @Override
  public String toString() {
    StringBuilder s = new StringBuilder();
    switch (type) {
    case PRIMITIVE_INT:
      ConstantInteger c = (ConstantInteger) cpool.getConstant(idx);
      s.append("(int)").append(Integer.toString(c.getValue()));
      break;
    case PRIMITIVE_LONG:
      ConstantLong j = (ConstantLong) cpool.getConstant(idx);
      s.append("(long)").append(Long.toString(j.getValue()));
      break;
    case PRIMITIVE_DOUBLE:
      ConstantDouble d = (ConstantDouble) cpool.getConstant(idx);
      s.append("(double)").append(d.getValue().toString());
      break;
    case PRIMITIVE_FLOAT:
      ConstantFloat f = (ConstantFloat) cpool.getConstant(idx);
      s.append("(float)").append(Float.toString(f.getValue()));
      break;
    case PRIMITIVE_SHORT:
      ConstantInteger ci = (ConstantInteger) cpool.getConstant(idx);
      s.append("(short)").append(Integer.toString(ci.getValue()));
      break;
    case PRIMITIVE_BYTE:
      ConstantInteger b = (ConstantInteger) cpool.getConstant(idx);
      s.append("(byte)").append(Integer.toString(b.getValue()));
      break;
    case PRIMITIVE_CHAR:
      ConstantInteger ch = (ConstantInteger) cpool.getConstant(idx);
      s.append("(char)").append(new Character((char) ch.getIntValue()).toString());
      break;
    case PRIMITIVE_BOOLEAN:
      ConstantInteger bo = (ConstantInteger) cpool.getConstant(idx);
      s.append("(boolean)");
      if (bo.getValue() == 0) {
        s.append("false");
      } else {
        s.append("true");
      }
      break;
    case STRING:
      ConstantUtf8 cu8 = (ConstantUtf8) cpool.getConstant(idx);
      s.append("(string)").append(cu8.getValue());
      break;
    default:
      throw new RuntimeException("SimpleElementValueGen class does not know how to stringify type " + type);
    }
    return s.toString();
  }

  @Override
  public void dump(DataOutputStream dos) throws IOException {
    dos.writeByte(type); // u1 kind of value
    switch (type) {
    case PRIMITIVE_INT:
    case PRIMITIVE_BYTE:
    case PRIMITIVE_CHAR:
    case PRIMITIVE_FLOAT:
    case PRIMITIVE_LONG:
    case PRIMITIVE_BOOLEAN:
    case PRIMITIVE_SHORT:
    case PRIMITIVE_DOUBLE:
    case STRING:
      dos.writeShort(idx);
      break;
    default:
      throw new RuntimeException("SimpleElementValueGen doesnt know how to write out type " + type);
    }
  }

}
TOP

Related Classes of org.aspectj.apache.bcel.classfile.annotation.SimpleElementValue

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.