| /* |
| * Copyright 2008 Google Inc. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| * use this file except in compliance with the License. You may obtain a copy of |
| * the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| * License for the specific language governing permissions and limitations under |
| * the License. |
| */ |
| |
| package com.google.gwt.tools.apichecker; |
| |
| import com.google.gwt.core.ext.typeinfo.NotFoundException; |
| |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.Collections; |
| import java.util.HashMap; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.Set; |
| |
| /** |
| * encapsulates a class that produces the diff between the api of two packages. |
| */ |
| final class ApiPackageDiffGenerator implements Comparable<ApiPackageDiffGenerator> { |
| private final ApiDiffGenerator apiDiffGenerator; |
| private Map<String, ApiClassDiffGenerator> intersectingClasses = |
| new HashMap<String, ApiClassDiffGenerator>(); |
| private Set<String> missingClassNames = null; |
| private final String name; |
| private final ApiPackage newPackage; |
| private final ApiPackage oldPackage; |
| |
| ApiPackageDiffGenerator(String packageName, ApiDiffGenerator apiDiffGenerator) |
| throws NotFoundException { |
| this.apiDiffGenerator = apiDiffGenerator; |
| name = packageName; |
| newPackage = apiDiffGenerator.getNewApiContainer().getApiPackage(packageName); |
| oldPackage = apiDiffGenerator.getOldApiContainer().getApiPackage(packageName); |
| if (newPackage == null || oldPackage == null) { |
| throw new NotFoundException("for package " + packageName |
| + ", one of the package objects is null"); |
| } |
| } |
| |
| public int compareTo(ApiPackageDiffGenerator other) { |
| return this.getName().compareTo(other.getName()); |
| } |
| |
| @Override |
| public boolean equals(Object o) { |
| if (!(o instanceof ApiPackageDiffGenerator)) { |
| return false; |
| } |
| return this.getName().equals(((ApiPackageDiffGenerator) o).getName()); |
| } |
| |
| @Override |
| public int hashCode() { |
| return this.getName().hashCode(); |
| } |
| |
| void computeApiDiff() throws NotFoundException { |
| Set<String> newClassNames = newPackage.getApiClassNames(); |
| missingClassNames = oldPackage.getApiClassNames(); |
| Set<String> intersection = |
| ApiDiffGenerator.removeIntersection(newClassNames, missingClassNames); |
| |
| /* Inspect each of the classes in each of the packages in the intersection */ |
| for (String className : intersection) { |
| ApiClassDiffGenerator tempClassDiffGenerator = new ApiClassDiffGenerator(className, this); |
| intersectingClasses.put(className, tempClassDiffGenerator); |
| tempClassDiffGenerator.computeApiDiff(); |
| } |
| } |
| |
| ApiClassDiffGenerator findApiClassDiffGenerator(String key) { |
| return intersectingClasses.get(key); |
| } |
| |
| Collection<ApiChange> getApiDiff() { |
| Collection<ApiChange> collection = new ArrayList<ApiChange>(); |
| Collection<ApiClass> missingClasses = oldPackage.getApiClassesBySet(missingClassNames); |
| for (ApiClass missingClass : missingClasses) { |
| collection.add(new ApiChange(missingClass, ApiChange.Status.MISSING)); |
| } |
| List<ApiClassDiffGenerator> intersectingClassesList = |
| new ArrayList<ApiClassDiffGenerator>(intersectingClasses.values()); |
| Collections.sort(intersectingClassesList); |
| for (ApiClassDiffGenerator intersectingClass : intersectingClasses.values()) { |
| collection.addAll(intersectingClass.getApiDiff()); |
| } |
| return collection; |
| } |
| |
| ApiDiffGenerator getApiDiffGenerator() { |
| return apiDiffGenerator; |
| } |
| |
| String getName() { |
| return name; |
| } |
| |
| ApiPackage getNewApiPackage() { |
| return newPackage; |
| } |
| |
| ApiPackage getOldApiPackage() { |
| return oldPackage; |
| } |
| |
| } |