blob: e12edfe70efe12eef3bdc59135007926234d454c [file] [log] [blame]
/*
* 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;
}
}