Home | History | Annotate | Download | only in jdwp
      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