KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > jdiff > ClassDiff


1 package jdiff;
2
3 import java.util.*;
4 import com.sun.javadoc.*;
5
6 /**
7  * The changes between two classes.
8  *
9  * See the file LICENSE.txt for copyright details.
10  * @author Matthew Doar, doar@pobox.com
11  */

12 class ClassDiff {
13
14     /** Name of the class. */
15     public String JavaDoc name_;
16
17     /** Set if this class is an interface in the new API. */
18     public boolean isInterface_;
19
20     /**
21      * A string describing the changes in inheritance.
22      */

23     public String JavaDoc inheritanceChange_ = null;
24
25     /**
26      * A string describing the changes in documentation.
27      */

28     public String JavaDoc documentationChange_ = null;
29
30     /**
31      * A string describing the changes in modifiers.
32      * Changes can be in whether this is a class or interface, whether it is
33      * abstract, static, final, and in its visibility.
34      */

35     public String JavaDoc modifiersChange_ = null;
36
37     /** Constructors added in the new API. */
38     public List ctorsAdded = null;
39     /** Constructors removed in the new API. */
40     public List ctorsRemoved = null;
41     /** Constructors changed in the new API. */
42     public List ctorsChanged = null;
43
44     /** Methods added in the new API. */
45     public List methodsAdded = null;
46     /** Methods removed in the new API. */
47     public List methodsRemoved = null;
48     /** Methods changed in the new API. */
49     public List methodsChanged = null;
50
51     /** Fields added in the new API. */
52     public List fieldsAdded = null;
53     /** Fields removed in the new API. */
54     public List fieldsRemoved = null;
55     /** Fields changed in the new API. */
56     public List fieldsChanged = null;
57
58     /* The percentage difference for this class. */
59     public double pdiff = 0.0;
60
61     /** Default constructor. */
62     public ClassDiff(String JavaDoc name) {
63         name_ = name;
64         isInterface_ = false;
65
66         ctorsAdded = new ArrayList(); // ConstructorAPI[]
67
ctorsRemoved = new ArrayList(); // ConstructorAPI[]
68
ctorsChanged = new ArrayList(); // MemberDiff[]
69

70         methodsAdded = new ArrayList(); // MethodAPI[]
71
methodsRemoved = new ArrayList(); // MethodAPI[]
72
methodsChanged = new ArrayList(); // MemberDiff[]
73

74         fieldsAdded = new ArrayList(); // FieldAPI[]
75
fieldsRemoved = new ArrayList(); // FieldAPI[]
76
fieldsChanged = new ArrayList(); // MemberDiff[]
77
}
78
79     /**
80      * Compare the inheritance details of two classes and produce
81      * a String for the inheritanceChanges_ field in this class.
82      * If there is no difference, null is returned.
83      */

84     public static String JavaDoc diff(ClassAPI oldClass, ClassAPI newClass) {
85         Collections.sort(oldClass.implements_);
86         Collections.sort(newClass.implements_);
87         String JavaDoc res = "";
88         boolean hasContent = false;
89         if (oldClass.extends_ != null && newClass.extends_ != null &&
90             oldClass.extends_.compareTo(newClass.extends_) != 0) {
91             res += "The superclass changed from <code>" + oldClass.extends_ + "</code> to <code>" + newClass.extends_ + "</code>.<br>";
92             hasContent = true;
93         }
94         // Check for implemented interfaces which were removed
95
String JavaDoc removedInterfaces = "";
96         int numRemoved = 0;
97         Iterator iter = oldClass.implements_.iterator();
98         while (iter.hasNext()) {
99             String JavaDoc oldInterface = (String JavaDoc)(iter.next());
100             int idx = Collections.binarySearch(newClass.implements_, oldInterface);
101             if (idx < 0) {
102                 if (numRemoved != 0)
103                     removedInterfaces += ", ";
104                 removedInterfaces += oldInterface;
105                 numRemoved++;
106             }
107         }
108         String JavaDoc addedInterfaces = "";
109         int numAdded = 0;
110         iter = newClass.implements_.iterator();
111         while (iter.hasNext()) {
112             String JavaDoc newInterface = (String JavaDoc)(iter.next());
113             int idx = Collections.binarySearch(oldClass.implements_, newInterface);
114             if (idx < 0) {
115                 if (numAdded != 0)
116                     addedInterfaces += ", ";
117                 addedInterfaces += newInterface;
118                 numAdded++;
119             }
120         }
121         if (numRemoved != 0) {
122             if (hasContent)
123                 res += " ";
124             if (numRemoved == 1)
125                 res += "Removed interface <code>" + removedInterfaces + "</code>.<br>";
126             else
127                 res += "Removed interfaces <code>" + removedInterfaces + "</code>.<br>";
128             hasContent = true;
129         }
130         if (numAdded != 0) {
131             if (hasContent)
132                 res += " ";
133             if (numAdded == 1)
134                 res += "Added interface <code>" + addedInterfaces + "</code>.<br>";
135             else
136                 res += "Added interfaces <code>" + addedInterfaces + "</code>.<br>";
137             hasContent = true;
138         }
139         if (res.compareTo("") == 0)
140             return null;
141         return res;
142     }
143
144     /** Add a change in the modifiers. */
145     public void addModifiersChange(String JavaDoc commonModifierChanges) {
146         if (commonModifierChanges != null) {
147             if (modifiersChange_ == null)
148                 modifiersChange_ = commonModifierChanges;
149             else
150                 modifiersChange_ += " " + commonModifierChanges;
151         }
152     }
153 }
154
155
Popular Tags