196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectpackage jdiff;
296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectimport java.util.*;
496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectimport com.sun.javadoc.*;
596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project/**
796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * The changes between two classes.
896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project *
996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * See the file LICENSE.txt for copyright details.
1096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @author Matthew Doar, mdoar@pobox.com
1196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */
1296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectclass ClassDiff {
1396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
1496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /** Name of the class. */
1596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public String name_;
1696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
1796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /** Set if this class is an interface in the new API. */
1896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public boolean isInterface_;
1996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
2096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
2196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * A string describing the changes in inheritance.
2296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
2396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public String inheritanceChange_ = null;
2496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
2596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
2696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * A string describing the changes in documentation.
2796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
2896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public String documentationChange_ = null;
2996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
3096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
3196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * A string describing the changes in modifiers.
3296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Changes can be in whether this is a class or interface, whether it is
3396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * abstract, static, final, and in its visibility.
3496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
3596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public String modifiersChange_ = null;
3696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
3796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /** Constructors added in the new API. */
3896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public List ctorsAdded = null;
3996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /** Constructors removed in the new API. */
4096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public List ctorsRemoved = null;
4196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /** Constructors changed in the new API. */
4296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public List ctorsChanged = null;
4396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
4496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /** Methods added in the new API. */
4596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public List methodsAdded = null;
4696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /** Methods removed in the new API. */
4796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public List methodsRemoved = null;
4896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /** Methods changed in the new API. */
4996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public List methodsChanged = null;
5096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
5196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /** Fields added in the new API. */
5296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public List fieldsAdded = null;
5396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /** Fields removed in the new API. */
5496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public List fieldsRemoved = null;
5596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /** Fields changed in the new API. */
5696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public List fieldsChanged = null;
5796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
5896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /* The percentage difference for this class. */
5996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public double pdiff = 0.0;
6096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
6196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /** Default constructor. */
6296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public ClassDiff(String name) {
6396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        name_ = name;
6496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        isInterface_ = false;
6596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
6696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        ctorsAdded = new ArrayList(); // ConstructorAPI[]
6796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        ctorsRemoved = new ArrayList(); // ConstructorAPI[]
6896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        ctorsChanged = new ArrayList(); // MemberDiff[]
6996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
7096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        methodsAdded = new ArrayList(); // MethodAPI[]
7196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        methodsRemoved = new ArrayList(); // MethodAPI[]
7296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        methodsChanged = new ArrayList(); // MemberDiff[]
7396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
7496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        fieldsAdded = new ArrayList(); // FieldAPI[]
7596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        fieldsRemoved = new ArrayList(); // FieldAPI[]
7696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        fieldsChanged = new ArrayList(); // MemberDiff[]
7796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
7896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
7996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
8096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Compare the inheritance details of two classes and produce
8196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * a String for the inheritanceChanges_ field in this class.
8296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * If there is no difference, null is returned.
8396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
8496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public static String diff(ClassAPI oldClass, ClassAPI newClass) {
8596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        Collections.sort(oldClass.implements_);
8696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        Collections.sort(newClass.implements_);
8796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        String res = "";
8896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        boolean hasContent = false;
8996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (oldClass.extends_ != null && newClass.extends_ != null &&
9096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            oldClass.extends_.compareTo(newClass.extends_) != 0) {
9196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            res += "The superclass changed from <code>" + oldClass.extends_ + "</code> to <code>" + newClass.extends_ + "</code>.<br>";
9296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            hasContent = true;
9396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
9496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // Check for implemented interfaces which were removed
9596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        String removedInterfaces = "";
9696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        int numRemoved = 0;
9796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        Iterator iter = oldClass.implements_.iterator();
9896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        while (iter.hasNext()) {
9996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            String oldInterface = (String)(iter.next());
10096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            int idx = Collections.binarySearch(newClass.implements_, oldInterface);
10196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            if (idx < 0) {
10296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                if (numRemoved != 0)
10396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                    removedInterfaces += ", ";
10496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                removedInterfaces += oldInterface;
10596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                numRemoved++;
10696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            }
10796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
10896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        String addedInterfaces = "";
10996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        int numAdded = 0;
11096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        iter = newClass.implements_.iterator();
11196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        while (iter.hasNext()) {
11296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            String newInterface = (String)(iter.next());
11396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            int idx = Collections.binarySearch(oldClass.implements_, newInterface);
11496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            if (idx < 0) {
11596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                if (numAdded != 0)
11696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                    addedInterfaces += ", ";
11796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                addedInterfaces += newInterface;
11896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                numAdded++;
11996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            }
12096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
12196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (numRemoved != 0) {
12296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            if (hasContent)
12396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                res += " ";
12496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            if (numRemoved == 1)
12596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                res += "Removed interface <code>" + removedInterfaces + "</code>.<br>";
12696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            else
12796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                res += "Removed interfaces <code>" + removedInterfaces + "</code>.<br>";
12896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            hasContent = true;
12996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
13096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (numAdded != 0) {
13196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            if (hasContent)
13296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                res += " ";
13396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            if (numAdded == 1)
13496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                res += "Added interface <code>" + addedInterfaces + "</code>.<br>";
13596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            else
13696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                res += "Added interfaces <code>" + addedInterfaces + "</code>.<br>";
13796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            hasContent = true;
13896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
13996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (res.compareTo("") == 0)
14096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            return null;
14196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        return res;
14296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
14396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
14496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /** Add a change in the modifiers. */
14596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public void addModifiersChange(String commonModifierChanges) {
14696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (commonModifierChanges != null) {
14796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            if (modifiersChange_ == null)
14896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                modifiersChange_ = commonModifierChanges;
14996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            else
15096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                modifiersChange_ += " " + commonModifierChanges;
15196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
15296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
15396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project}
15496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
155