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