blob: 8742ab1b81f6b39e4d10483e6e60ab0eba9b9b23 [file] [log] [blame]
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;
}
}
}