| /* |
| * 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.TreeLogger; |
| import com.google.gwt.core.ext.typeinfo.JClassType; |
| import com.google.gwt.core.ext.typeinfo.JPackage; |
| |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.Collections; |
| import java.util.HashMap; |
| import java.util.HashSet; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.Set; |
| |
| /** |
| * An immutable class that encapsulates an API package. |
| */ |
| final class ApiPackage implements Comparable<ApiPackage>, ApiElement { |
| |
| private Map<String, ApiClass> apiClasses = new HashMap<String, ApiClass>(); |
| private final ApiContainer apiContainer; |
| private final TreeLogger logger; |
| private final String name; |
| private final JPackage packageObject; |
| |
| ApiPackage(JPackage obj, ApiContainer container) { |
| packageObject = obj; |
| this.apiContainer = container; |
| logger = container.getLogger(); |
| name = obj.getName(); |
| initialize(); |
| } |
| |
| public int compareTo(ApiPackage other) { |
| return this.getName().compareTo(other.getName()); |
| } |
| |
| @Override |
| public boolean equals(Object o) { |
| if (!(o instanceof ApiPackage)) { |
| return false; |
| } |
| return this.getName().equals(((ApiPackage) o).getName()); |
| } |
| |
| public String getRelativeSignature() { |
| return name; |
| } |
| |
| @Override |
| public int hashCode() { |
| return this.getName().hashCode(); |
| } |
| |
| @Override |
| public String toString() { |
| return name; |
| } |
| |
| List<JClassType> getAllClasses() { |
| List<JClassType> allClasses = new ArrayList<JClassType>( |
| Arrays.asList(packageObject.getTypes())); |
| logger.log(TreeLogger.SPAM, "API " + packageObject + " has " |
| + allClasses.size() + " outer classes", null); |
| int index = 0; |
| while (index < allClasses.size()) { |
| JClassType classObject = allClasses.get(index); |
| allClasses.addAll(Arrays.asList(classObject.getNestedTypes())); |
| index++; |
| } |
| logger.log(TreeLogger.SPAM, "API " + packageObject + " has " |
| + allClasses.size() + " total classes", null); |
| return allClasses; |
| } |
| |
| String getApiAsString() { |
| StringBuffer sb = new StringBuffer(); |
| sb.append(name + ", size = " + apiClasses.size() + "\n"); |
| ArrayList<ApiClass> apiClassesList = new ArrayList<ApiClass>( |
| apiClasses.values()); |
| Collections.sort(apiClassesList); |
| for (ApiClass apiClass : apiClassesList) { |
| sb.append(apiClass.getApiAsString()); |
| } |
| return sb.toString(); |
| } |
| |
| ApiClass getApiClass(String className) { |
| return apiClasses.get(className); |
| } |
| |
| Set<ApiClass> getApiClassesBySet(Set<String> classNames) { |
| Set<ApiClass> set = new HashSet<ApiClass>(); |
| for (String className : classNames) { |
| set.add(getApiClass(className)); |
| } |
| return set; |
| } |
| |
| Set<String> getApiClassNames() { |
| return new HashSet<String>(apiClasses.keySet()); |
| } |
| |
| ApiContainer getApiContainer() { |
| return apiContainer; |
| } |
| |
| String getName() { |
| return name; |
| } |
| |
| private void initialize() { |
| ArrayList<String> notAddedClassNames = new ArrayList<String>(); |
| for (JClassType classType : getAllClasses()) { |
| if (apiContainer.isApiClass(classType)) { |
| ApiClass apiClass = new ApiClass(classType, this); |
| apiClasses.put(classType.getQualifiedSourceName(), apiClass); |
| } else { |
| notAddedClassNames.add(classType.toString()); |
| } |
| } |
| if (notAddedClassNames.size() > 0) { |
| logger.log(TreeLogger.SPAM, "API " + apiContainer.getName() + ", package: " + name |
| + ", not adding " + notAddedClassNames.size() + " nonApi classes: " |
| + notAddedClassNames, null); |
| } |
| } |
| |
| } |