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; } } }