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 Alexei S. Vaskin 21 */ 22 23 /** 24 * Created on 03.05.2005 25 */ 26 27 package org.apache.harmony.jpda.tests.framework.jdwp; 28 29 /** 30 * This class provides description of class field. 31 * 32 */ 33 public final class Field { 34 35 private long id; 36 37 private long classID; 38 39 private String name; 40 41 private String signature; 42 43 private String genericSignature; 44 45 private int modBits; 46 47 private byte tag; 48 49 /** 50 * Constructor initializing all members of the Field instance. 51 * 52 * @param id 53 * field id 54 * @param classID 55 * class id 56 * @param name 57 * field name 58 * @param signature 59 * signature signature of the field class 60 * @param modBits 61 * field modifiers 62 */ 63 public Field(long id, long classID, String name, String signature, String genericSignature, 64 int modBits) { 65 this.id = id; 66 this.classID = classID; 67 this.name = name; 68 this.modBits = modBits; 69 this.genericSignature = genericSignature; 70 setSignature(signature); 71 } 72 73 /** 74 * Sets signature and detects type tag from it. 75 * 76 * @param signature 77 * signature of the field class 78 */ 79 private void setSignature(String signature) { 80 switch (signature.charAt(0)) { 81 case '[': 82 tag = JDWPConstants.Tag.ARRAY_TAG; 83 break; 84 case 'B': 85 tag = JDWPConstants.Tag.BYTE_TAG; 86 break; 87 case 'C': 88 tag = JDWPConstants.Tag.CHAR_TAG; 89 break; 90 case 'L': 91 tag = JDWPConstants.Tag.OBJECT_TAG; 92 break; 93 case 'F': 94 tag = JDWPConstants.Tag.FLOAT_TAG; 95 break; 96 case 'D': 97 tag = JDWPConstants.Tag.DOUBLE_TAG; 98 break; 99 case 'I': 100 tag = JDWPConstants.Tag.INT_TAG; 101 break; 102 case 'J': 103 tag = JDWPConstants.Tag.LONG_TAG; 104 break; 105 case 'S': 106 tag = JDWPConstants.Tag.SHORT_TAG; 107 break; 108 case 'V': 109 tag = JDWPConstants.Tag.VOID_TAG; 110 break; 111 case 'Z': 112 tag = JDWPConstants.Tag.BOOLEAN_TAG; 113 break; 114 case 's': 115 tag = JDWPConstants.Tag.STRING_TAG; 116 break; 117 case 't': 118 tag = JDWPConstants.Tag.THREAD_TAG; 119 break; 120 case 'g': 121 tag = JDWPConstants.Tag.THREAD_GROUP_TAG; 122 break; 123 case 'l': 124 tag = JDWPConstants.Tag.CLASS_LOADER_TAG; 125 break; 126 case 'c': 127 tag = JDWPConstants.Tag.CLASS_OBJECT_TAG; 128 break; 129 } 130 131 this.signature = signature; 132 } 133 134 /** 135 * Gets field id. 136 * 137 * @return long 138 */ 139 public long getFieldID() { 140 return this.id; 141 } 142 143 /** 144 * Gets id of the field reference type. 145 * 146 * @return long 147 */ 148 public long getClassID() { 149 return classID; 150 } 151 152 /** 153 * Gets field name. 154 * 155 * @return String 156 */ 157 public String getName() { 158 return name; 159 } 160 161 /** 162 * Gets signature of field type. 163 * 164 * @return String 165 */ 166 public String getSignature() { 167 return signature; 168 } 169 170 /** 171 * Gets generic signature of field type. 172 * 173 * @return the genericSignature 174 */ 175 public String getGenericSignature() { 176 return genericSignature; 177 } 178 179 /** 180 * Gets field modifiers. 181 * 182 * @return int 183 */ 184 public int getModBits() { 185 return modBits; 186 } 187 188 /** 189 * Gets field java type. 190 * 191 * @return String 192 */ 193 public String getType() { 194 String type = "unknown type"; 195 switch (tag) { 196 case JDWPConstants.Tag.ARRAY_TAG: 197 switch (signature.charAt(1)) { 198 case 'B': 199 type = "byte[]"; 200 break; 201 case 'C': 202 type = "char[]"; 203 break; 204 case 'J': 205 type = "long[]"; 206 break; 207 case 'F': 208 type = "float[]"; 209 break; 210 case 'D': 211 type = "double[]"; 212 break; 213 case 'I': 214 type = "int[]"; 215 break; 216 case 'S': 217 type = "short[]"; 218 break; 219 case 'V': 220 type = "void[]"; 221 break; 222 case 'Z': 223 type = "boolean[]"; 224 break; 225 case 's': 226 type = "java.Lang.String[]"; 227 break; 228 case 'L': 229 type = signature 230 .substring(2, signature.length() - 1 /* 231 * skip ending 232 * ';' 233 */) 234 .replaceAll("/", ".") 235 + "[]"; // skip ending ';' 236 break; 237 } 238 break; 239 case JDWPConstants.Tag.OBJECT_TAG: 240 type = signature 241 .substring(1, signature.length() - 1 /* skip ending ';' */) 242 .replaceAll("/", "."); // skip ending ';' 243 break; 244 case JDWPConstants.Tag.BOOLEAN_TAG: 245 type = "boolean"; 246 break; 247 case JDWPConstants.Tag.BYTE_TAG: 248 type = "byte"; 249 break; 250 case JDWPConstants.Tag.CHAR_TAG: 251 type = "char"; 252 break; 253 case JDWPConstants.Tag.DOUBLE_TAG: 254 type = "double"; 255 break; 256 case JDWPConstants.Tag.FLOAT_TAG: 257 type = "float"; 258 break; 259 case JDWPConstants.Tag.INT_TAG: 260 type = "int"; 261 break; 262 case JDWPConstants.Tag.LONG_TAG: 263 type = "long"; 264 break; 265 case JDWPConstants.Tag.SHORT_TAG: 266 type = "short"; 267 break; 268 case JDWPConstants.Tag.STRING_TAG: 269 type = "string"; 270 break; 271 default: 272 break; 273 } 274 275 return type; 276 } 277 278 /** 279 * Compares two Field objects. 280 * 281 * @see java.lang.Object#equals(java.lang.Object) 282 * @return boolean 283 */ 284 @Override 285 public boolean equals(Object obj) { 286 if (!(obj instanceof Field)) { 287 return false; 288 } 289 290 if (this.getClass() != obj.getClass()) { 291 return false; 292 } 293 294 Field field = (Field) obj; 295 return this.id == field.id && this.classID == field.classID 296 && this.name.equals(field.name) 297 && this.signature.equals(field.signature) 298 && this.modBits == field.modBits; 299 } 300 301 /** 302 * Converts Field object to String. 303 * 304 * @see java.lang.Object#toString() 305 * @return String 306 */ 307 @Override 308 public String toString() { 309 String str = "Field: id=" + id + ", classID=" + classID + ", name='" 310 + name + "', signature='" + signature + "', modBits="; 311 String access = ""; 312 if ((this.modBits & JDWPConstants.FieldAccess.ACC_PRIVATE) == JDWPConstants.FieldAccess.ACC_PRIVATE) { 313 access += JDWPConstants.FieldAccess 314 .getName(JDWPConstants.FieldAccess.ACC_PRIVATE) 315 + " "; 316 } else if ((this.modBits & JDWPConstants.FieldAccess.ACC_PROTECTED) == JDWPConstants.FieldAccess.ACC_PROTECTED) { 317 access += JDWPConstants.FieldAccess 318 .getName(JDWPConstants.FieldAccess.ACC_PROTECTED) 319 + " "; 320 } else if ((this.modBits & JDWPConstants.FieldAccess.ACC_PUBLIC) == JDWPConstants.FieldAccess.ACC_PUBLIC) { 321 access += JDWPConstants.FieldAccess 322 .getName(JDWPConstants.FieldAccess.ACC_PUBLIC) 323 + " "; 324 } 325 if ((this.modBits & JDWPConstants.FieldAccess.ACC_FINAL) == JDWPConstants.FieldAccess.ACC_FINAL) { 326 access += JDWPConstants.FieldAccess 327 .getName(JDWPConstants.FieldAccess.ACC_FINAL) 328 + " "; 329 } 330 if ((this.modBits & JDWPConstants.FieldAccess.ACC_STATIC) == JDWPConstants.FieldAccess.ACC_STATIC) { 331 access += JDWPConstants.FieldAccess 332 .getName(JDWPConstants.FieldAccess.ACC_STATIC) 333 + " "; 334 } 335 if ((this.modBits & JDWPConstants.FieldAccess.ACC_TRANSIENT) == JDWPConstants.FieldAccess.ACC_TRANSIENT) { 336 access += JDWPConstants.FieldAccess 337 .getName(JDWPConstants.FieldAccess.ACC_TRANSIENT) 338 + " "; 339 } 340 if ((this.modBits & JDWPConstants.FieldAccess.ACC_VOLATILE) == JDWPConstants.FieldAccess.ACC_VOLATILE) { 341 access += JDWPConstants.FieldAccess 342 .getName(JDWPConstants.FieldAccess.ACC_VOLATILE) 343 + " "; 344 } 345 346 return str + access; 347 } 348 349 /** 350 * Tells whether this field is private. 351 * 352 * @return boolean 353 */ 354 public boolean isPrivate() { 355 return (modBits & JDWPConstants.FieldAccess.ACC_PRIVATE) == JDWPConstants.FieldAccess.ACC_PRIVATE; 356 } 357 358 /** 359 * Tells whether this field is protected. 360 * 361 * @return boolean 362 */ 363 public boolean isProtected() { 364 return (modBits & JDWPConstants.FieldAccess.ACC_PROTECTED) == JDWPConstants.FieldAccess.ACC_PROTECTED; 365 } 366 367 /** 368 * Tells whether this field is public. 369 * 370 * @return boolean 371 */ 372 public boolean isPublic() { 373 return (modBits & JDWPConstants.FieldAccess.ACC_PUBLIC) == JDWPConstants.FieldAccess.ACC_PUBLIC; 374 } 375 376 /** 377 * Tells whether this field is final. 378 * 379 * @return boolean 380 */ 381 public boolean isFinal() { 382 return (modBits & JDWPConstants.FieldAccess.ACC_FINAL) == JDWPConstants.FieldAccess.ACC_FINAL; 383 } 384 385 /** 386 * Tells whether this field is static. 387 * 388 * @return boolean 389 */ 390 public boolean isStatic() { 391 return (modBits & JDWPConstants.FieldAccess.ACC_STATIC) == JDWPConstants.FieldAccess.ACC_STATIC; 392 } 393 } 394