| /* |
| * 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 Alexei S. Vaskin |
| */ |
| |
| /** |
| * Created on 03.05.2005 |
| */ |
| |
| package org.apache.harmony.jpda.tests.framework.jdwp; |
| |
| /** |
| * This class provides description of class field. |
| * |
| */ |
| public final class Field { |
| |
| private long id; |
| |
| private long classID; |
| |
| private String name; |
| |
| private String signature; |
| |
| private int modBits; |
| |
| private byte tag; |
| |
| /** |
| * Default constructor. |
| */ |
| public Field() { |
| id = -1; |
| classID = -1; |
| name = "unknown"; |
| signature = "unknown"; |
| modBits = -1; |
| } |
| |
| /** |
| * Constructor initializing all members of the Field instance. |
| * |
| * @param id |
| * field id |
| * @param classID |
| * class id |
| * @param name |
| * field name |
| * @param signature |
| * signature signature of the field class |
| * @param modBits |
| * field modifiers |
| */ |
| public Field(long id, long classID, String name, String signature, |
| int modBits) { |
| this.id = id; |
| this.classID = classID; |
| this.name = name; |
| this.modBits = modBits; |
| setSignature(signature); |
| } |
| |
| /** |
| * Sets signature and detects type tag from it. |
| * |
| * @param signature |
| * signature of the field class |
| */ |
| private void setSignature(String signature) { |
| switch (signature.charAt(0)) { |
| case '[': |
| tag = JDWPConstants.Tag.ARRAY_TAG; |
| break; |
| case 'B': |
| tag = JDWPConstants.Tag.BYTE_TAG; |
| break; |
| case 'C': |
| tag = JDWPConstants.Tag.CHAR_TAG; |
| break; |
| case 'L': |
| tag = JDWPConstants.Tag.OBJECT_TAG; |
| break; |
| case 'F': |
| tag = JDWPConstants.Tag.FLOAT_TAG; |
| break; |
| case 'D': |
| tag = JDWPConstants.Tag.DOUBLE_TAG; |
| break; |
| case 'I': |
| tag = JDWPConstants.Tag.INT_TAG; |
| break; |
| case 'J': |
| tag = JDWPConstants.Tag.LONG_TAG; |
| break; |
| case 'S': |
| tag = JDWPConstants.Tag.SHORT_TAG; |
| break; |
| case 'V': |
| tag = JDWPConstants.Tag.VOID_TAG; |
| break; |
| case 'Z': |
| tag = JDWPConstants.Tag.BOOLEAN_TAG; |
| break; |
| case 's': |
| tag = JDWPConstants.Tag.STRING_TAG; |
| break; |
| case 't': |
| tag = JDWPConstants.Tag.THREAD_TAG; |
| break; |
| case 'g': |
| tag = JDWPConstants.Tag.THREAD_GROUP_TAG; |
| break; |
| case 'l': |
| tag = JDWPConstants.Tag.CLASS_LOADER_TAG; |
| break; |
| case 'c': |
| tag = JDWPConstants.Tag.CLASS_OBJECT_TAG; |
| break; |
| } |
| |
| this.signature = signature; |
| } |
| |
| /** |
| * Gets field id. |
| * |
| * @return long |
| */ |
| public long getID() { |
| return this.id; |
| } |
| |
| /** |
| * Gets id of the field reference type. |
| * |
| * @return long |
| */ |
| public long getClassID() { |
| return classID; |
| } |
| |
| /** |
| * Gets field name. |
| * |
| * @return String |
| */ |
| public String getName() { |
| return name; |
| } |
| |
| /** |
| * Gets signature of field type. |
| * |
| * @return String |
| */ |
| public String getSignature() { |
| return signature; |
| } |
| |
| /** |
| * Gets field modifiers. |
| * |
| * @return int |
| */ |
| public int getModBits() { |
| return modBits; |
| } |
| |
| /** |
| * Gets field java type. |
| * |
| * @return String |
| */ |
| public String getType() { |
| String type = "unknown type"; |
| switch (tag) { |
| case JDWPConstants.Tag.ARRAY_TAG: |
| switch (signature.charAt(1)) { |
| case 'B': |
| type = "byte[]"; |
| break; |
| case 'C': |
| type = "char[]"; |
| break; |
| case 'J': |
| type = "long[]"; |
| break; |
| case 'F': |
| type = "float[]"; |
| break; |
| case 'D': |
| type = "double[]"; |
| break; |
| case 'I': |
| type = "int[]"; |
| break; |
| case 'S': |
| type = "short[]"; |
| break; |
| case 'V': |
| type = "void[]"; |
| break; |
| case 'Z': |
| type = "boolean[]"; |
| break; |
| case 's': |
| type = "java.Lang.String[]"; |
| break; |
| case 'L': |
| type = signature |
| .substring(2, signature.length() - 1 /* |
| * skip ending |
| * ';' |
| */) |
| .replaceAll("/", ".") |
| + "[]"; // skip ending ';' |
| break; |
| } |
| break; |
| case JDWPConstants.Tag.OBJECT_TAG: |
| type = signature |
| .substring(1, signature.length() - 1 /* skip ending ';' */) |
| .replaceAll("/", "."); // skip ending ';' |
| break; |
| case JDWPConstants.Tag.BOOLEAN_TAG: |
| type = "boolean"; |
| break; |
| case JDWPConstants.Tag.BYTE_TAG: |
| type = "byte"; |
| break; |
| case JDWPConstants.Tag.CHAR_TAG: |
| type = "char"; |
| break; |
| case JDWPConstants.Tag.DOUBLE_TAG: |
| type = "double"; |
| break; |
| case JDWPConstants.Tag.FLOAT_TAG: |
| type = "float"; |
| break; |
| case JDWPConstants.Tag.INT_TAG: |
| type = "int"; |
| break; |
| case JDWPConstants.Tag.LONG_TAG: |
| type = "long"; |
| break; |
| case JDWPConstants.Tag.SHORT_TAG: |
| type = "short"; |
| break; |
| case JDWPConstants.Tag.STRING_TAG: |
| type = "string"; |
| break; |
| default: |
| break; |
| } |
| |
| return type; |
| } |
| |
| /** |
| * Compares two Field objects. |
| * |
| * @see java.lang.Object#equals(java.lang.Object) |
| * @return boolean |
| */ |
| public boolean equals(Object obj) { |
| if (!(obj instanceof Field)) { |
| return false; |
| } |
| |
| if (this.getClass() != obj.getClass()) { |
| return false; |
| } |
| |
| Field field = (Field) obj; |
| return this.id == field.id && this.classID == field.classID |
| && this.name.equals(field.name) |
| && this.signature.equals(field.signature) |
| && this.modBits == field.modBits; |
| } |
| |
| /** |
| * Converts Field object to String. |
| * |
| * @see java.lang.Object#toString() |
| * @return String |
| */ |
| public String toString() { |
| String str = "Field: id=" + id + ", classID=" + classID + ", name='" |
| + name + "', signature='" + signature + "', modBits="; |
| String access = ""; |
| if ((this.modBits & JDWPConstants.FieldAccess.ACC_PRIVATE) == JDWPConstants.FieldAccess.ACC_PRIVATE) { |
| access += JDWPConstants.FieldAccess |
| .getName(JDWPConstants.FieldAccess.ACC_PRIVATE) |
| + " "; |
| } else if ((this.modBits & JDWPConstants.FieldAccess.ACC_PROTECTED) == JDWPConstants.FieldAccess.ACC_PROTECTED) { |
| access += JDWPConstants.FieldAccess |
| .getName(JDWPConstants.FieldAccess.ACC_PROTECTED) |
| + " "; |
| } else if ((this.modBits & JDWPConstants.FieldAccess.ACC_PUBLIC) == JDWPConstants.FieldAccess.ACC_PUBLIC) { |
| access += JDWPConstants.FieldAccess |
| .getName(JDWPConstants.FieldAccess.ACC_PUBLIC) |
| + " "; |
| } |
| if ((this.modBits & JDWPConstants.FieldAccess.ACC_FINAL) == JDWPConstants.FieldAccess.ACC_FINAL) { |
| access += JDWPConstants.FieldAccess |
| .getName(JDWPConstants.FieldAccess.ACC_FINAL) |
| + " "; |
| } |
| if ((this.modBits & JDWPConstants.FieldAccess.ACC_STATIC) == JDWPConstants.FieldAccess.ACC_STATIC) { |
| access += JDWPConstants.FieldAccess |
| .getName(JDWPConstants.FieldAccess.ACC_STATIC) |
| + " "; |
| } |
| if ((this.modBits & JDWPConstants.FieldAccess.ACC_TRANSIENT) == JDWPConstants.FieldAccess.ACC_TRANSIENT) { |
| access += JDWPConstants.FieldAccess |
| .getName(JDWPConstants.FieldAccess.ACC_TRANSIENT) |
| + " "; |
| } |
| if ((this.modBits & JDWPConstants.FieldAccess.ACC_VOLATILE) == JDWPConstants.FieldAccess.ACC_VOLATILE) { |
| access += JDWPConstants.FieldAccess |
| .getName(JDWPConstants.FieldAccess.ACC_VOLATILE) |
| + " "; |
| } |
| |
| return str + access; |
| } |
| |
| /** |
| * Tells whether this field is private. |
| * |
| * @return boolean |
| */ |
| public boolean isPrivate() { |
| return (modBits & JDWPConstants.FieldAccess.ACC_PRIVATE) == JDWPConstants.FieldAccess.ACC_PRIVATE; |
| } |
| |
| /** |
| * Tells whether this field is protected. |
| * |
| * @return boolean |
| */ |
| public boolean isProtected() { |
| return (modBits & JDWPConstants.FieldAccess.ACC_PROTECTED) == JDWPConstants.FieldAccess.ACC_PROTECTED; |
| } |
| |
| /** |
| * Tells whether this field is public. |
| * |
| * @return boolean |
| */ |
| public boolean isPublic() { |
| return (modBits & JDWPConstants.FieldAccess.ACC_PUBLIC) == JDWPConstants.FieldAccess.ACC_PUBLIC; |
| } |
| |
| /** |
| * Tells whether this field is final. |
| * |
| * @return boolean |
| */ |
| public boolean isFinal() { |
| return (modBits & JDWPConstants.FieldAccess.ACC_FINAL) == JDWPConstants.FieldAccess.ACC_FINAL; |
| } |
| |
| /** |
| * Tells whether this field is static. |
| * |
| * @return boolean |
| */ |
| public boolean isStatic() { |
| return (modBits & JDWPConstants.FieldAccess.ACC_STATIC) == JDWPConstants.FieldAccess.ACC_STATIC; |
| } |
| } |