blob: 34aa1b741b69dfcdd579136b1b11016daf437a7b [file] [log] [blame]
/*
* 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);
}
}
}