| package jdiff; |
| |
| import java.util.*; |
| import com.sun.javadoc.*; |
| |
| /** |
| * The changes between two classes. |
| * |
| * See the file LICENSE.txt for copyright details. |
| * @author Matthew Doar, mdoar@pobox.com |
| */ |
| class ClassDiff { |
| |
| /** Name of the class. */ |
| public String name_; |
| |
| /** Set if this class is an interface in the new API. */ |
| public boolean isInterface_; |
| |
| /** |
| * A string describing the changes in inheritance. |
| */ |
| public String inheritanceChange_ = null; |
| |
| /** |
| * A string describing the changes in documentation. |
| */ |
| public String documentationChange_ = null; |
| |
| /** |
| * A string describing the changes in modifiers. |
| * Changes can be in whether this is a class or interface, whether it is |
| * abstract, static, final, and in its visibility. |
| */ |
| public String modifiersChange_ = null; |
| |
| /** Constructors added in the new API. */ |
| public List ctorsAdded = null; |
| /** Constructors removed in the new API. */ |
| public List ctorsRemoved = null; |
| /** Constructors changed in the new API. */ |
| public List ctorsChanged = null; |
| |
| /** Methods added in the new API. */ |
| public List methodsAdded = null; |
| /** Methods removed in the new API. */ |
| public List methodsRemoved = null; |
| /** Methods changed in the new API. */ |
| public List methodsChanged = null; |
| |
| /** Fields added in the new API. */ |
| public List fieldsAdded = null; |
| /** Fields removed in the new API. */ |
| public List fieldsRemoved = null; |
| /** Fields changed in the new API. */ |
| public List fieldsChanged = null; |
| |
| /* The percentage difference for this class. */ |
| public double pdiff = 0.0; |
| |
| /** Default constructor. */ |
| public ClassDiff(String name) { |
| name_ = name; |
| isInterface_ = false; |
| |
| ctorsAdded = new ArrayList(); // ConstructorAPI[] |
| ctorsRemoved = new ArrayList(); // ConstructorAPI[] |
| ctorsChanged = new ArrayList(); // MemberDiff[] |
| |
| methodsAdded = new ArrayList(); // MethodAPI[] |
| methodsRemoved = new ArrayList(); // MethodAPI[] |
| methodsChanged = new ArrayList(); // MemberDiff[] |
| |
| fieldsAdded = new ArrayList(); // FieldAPI[] |
| fieldsRemoved = new ArrayList(); // FieldAPI[] |
| fieldsChanged = new ArrayList(); // MemberDiff[] |
| } |
| |
| /** |
| * Compare the inheritance details of two classes and produce |
| * a String for the inheritanceChanges_ field in this class. |
| * If there is no difference, null is returned. |
| */ |
| public static String diff(ClassAPI oldClass, ClassAPI newClass) { |
| Collections.sort(oldClass.implements_); |
| Collections.sort(newClass.implements_); |
| String res = ""; |
| boolean hasContent = false; |
| if (oldClass.extends_ != null && newClass.extends_ != null && |
| oldClass.extends_.compareTo(newClass.extends_) != 0) { |
| res += "The superclass changed from <code>" + oldClass.extends_ + "</code> to <code>" + newClass.extends_ + "</code>.<br>"; |
| hasContent = true; |
| } |
| // Check for implemented interfaces which were removed |
| String removedInterfaces = ""; |
| int numRemoved = 0; |
| Iterator iter = oldClass.implements_.iterator(); |
| while (iter.hasNext()) { |
| String oldInterface = (String)(iter.next()); |
| int idx = Collections.binarySearch(newClass.implements_, oldInterface); |
| if (idx < 0) { |
| if (numRemoved != 0) |
| removedInterfaces += ", "; |
| removedInterfaces += oldInterface; |
| numRemoved++; |
| } |
| } |
| String addedInterfaces = ""; |
| int numAdded = 0; |
| iter = newClass.implements_.iterator(); |
| while (iter.hasNext()) { |
| String newInterface = (String)(iter.next()); |
| int idx = Collections.binarySearch(oldClass.implements_, newInterface); |
| if (idx < 0) { |
| if (numAdded != 0) |
| addedInterfaces += ", "; |
| addedInterfaces += newInterface; |
| numAdded++; |
| } |
| } |
| if (numRemoved != 0) { |
| if (hasContent) |
| res += " "; |
| if (numRemoved == 1) |
| res += "Removed interface <code>" + removedInterfaces + "</code>.<br>"; |
| else |
| res += "Removed interfaces <code>" + removedInterfaces + "</code>.<br>"; |
| hasContent = true; |
| } |
| if (numAdded != 0) { |
| if (hasContent) |
| res += " "; |
| if (numAdded == 1) |
| res += "Added interface <code>" + addedInterfaces + "</code>.<br>"; |
| else |
| res += "Added interfaces <code>" + addedInterfaces + "</code>.<br>"; |
| hasContent = true; |
| } |
| if (res.compareTo("") == 0) |
| return null; |
| return res; |
| } |
| |
| /** Add a change in the modifiers. */ |
| public void addModifiersChange(String commonModifierChanges) { |
| if (commonModifierChanges != null) { |
| if (modifiersChange_ == null) |
| modifiersChange_ = commonModifierChanges; |
| else |
| modifiersChange_ += " " + commonModifierChanges; |
| } |
| } |
| } |
| |