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