1package jdiff;
2
3import java.io.*;
4import java.util.*;
5
6/**
7 * Class to represent a field, analogous to FieldDoc in the
8 * Javadoc doclet API.
9 *
10 * The method used for Collection comparison (compareTo) must make its
11 * comparison based upon everything that is known about this field.
12 *
13 * See the file LICENSE.txt for copyright details.
14 * @author Matthew Doar, mdoar@pobox.com
15 */
16class FieldAPI implements Comparable {
17    /** Name of the field. */
18    public String name_;
19
20    /** Type of the field. */
21    public String type_;
22
23    /**
24     * The fully qualified name of the class or interface this field is
25     * inherited from. If this is null, then the field is defined locally
26     * in this class or interface.
27     */
28    public String inheritedFrom_ = null;
29
30    /** Set if this field is transient. */
31    public boolean isTransient_ = false;
32
33    /** Set if this field is volatile. */
34    public boolean isVolatile_ = false;
35
36    /** If non-null, this is the value of this field. */
37    public String value_ = null;
38
39    /** Modifiers for this class. */
40    public Modifiers modifiers_;
41
42    /** The doc block, default is null. */
43    public String doc_ = null;
44
45    /** Constructor. */
46    public FieldAPI(String name, String type,
47                    boolean isTransient, boolean isVolatile,
48                    String value, Modifiers modifiers) {
49        name_ = name;
50        type_ = type;
51        isTransient_ = isTransient;
52        isVolatile_ = isVolatile;
53        value_ = value;
54        modifiers_ = modifiers;
55    }
56
57    /** Copy constructor. */
58    public FieldAPI(FieldAPI f) {
59        name_ = f.name_;
60        type_ = f.type_;
61        inheritedFrom_ = f.inheritedFrom_;
62        isTransient_ = f.isTransient_;
63        isVolatile_ = f.isVolatile_;
64        value_ = f.value_;
65        modifiers_ = f.modifiers_; // Note: shallow copy
66        doc_ = f.doc_;
67    }
68
69    /** Compare two FieldAPI objects, including name, type and modifiers. */
70    public int compareTo(Object o) {
71        FieldAPI oFieldAPI = (FieldAPI)o;
72        int comp = name_.compareTo(oFieldAPI.name_);
73        if (comp != 0)
74            return comp;
75        comp = type_.compareTo(oFieldAPI.type_);
76        if (comp != 0)
77            return comp;
78        if (APIComparator.changedInheritance(inheritedFrom_, oFieldAPI.inheritedFrom_) != 0)
79            return -1;
80        if (isTransient_ != oFieldAPI.isTransient_) {
81            return -1;
82        }
83        if (isVolatile_ != oFieldAPI.isVolatile_) {
84            return -1;
85        }
86        if (value_ != null && oFieldAPI.value_ != null) {
87            comp = value_.compareTo(oFieldAPI.value_);
88            if (comp != 0)
89                return comp;
90        }
91        comp = modifiers_.compareTo(oFieldAPI.modifiers_);
92        if (comp != 0)
93            return comp;
94        if (APIComparator.docChanged(doc_, oFieldAPI.doc_))
95            return -1;
96        return 0;
97    }
98
99    /**
100     * Tests two fields, using just the field name, used by indexOf().
101     */
102    public boolean equals(Object o) {
103        if (name_.compareTo(((FieldAPI)o).name_) == 0)
104            return true;
105        return false;
106    }
107}
108