blob: 1aae13c06212bb7dbe8e6cb33521eee0f85c6853 [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 java.util.HashMap;
import java.util.Map;
/**
*
* An ApiChange message.Each message is a Status followed by an optional String
* description.
*
*/
final class ApiChange implements Comparable<ApiChange> {
// add specific changes. For example, add FINAL_ADDED and
// ABSTRACT_ADDED instead of API_ATTRIBUTES_CHANGED
enum Status {
ABSTRACT_ADDED,
ATTRIBUTES_CHANGED_WARNING,
COMPATIBLE,
COMPATIBLE_WITH,
EXCEPTION_TYPE_ERROR,
FINAL_ADDED,
MISSING,
NONABSTRACT_CLASS_MADE_INTERFACE,
OVERLOADED_METHOD_CALL,
/*
* The api (argument types, return types, exceptions in throws clause) for
* an api method that can be overridden CANNOT change without breaking api
* compatibility
*/
OVERRIDABLE_METHOD_ARGUMENT_TYPE_CHANGE, OVERRIDABLE_METHOD_EXCEPTION_TYPE_CHANGE, OVERRIDABLE_METHOD_RETURN_TYPE_CHANGE,
RETURN_TYPE_ERROR,
STATIC_ADDED,
STATIC_REMOVED,
SUBCLASSABLE_API_CLASS_MADE_INTERFACE,
SUBCLASSABLE_API_INTERFACE_MADE_CLASS,
}
private static Map<String, Status> cache = new HashMap<String, Status>();
static {
for (Status tempStatus : Status.values()) {
cache.put(tempStatus.name(), tempStatus);
}
}
public static boolean contains(String str) {
return cache.get(str) != null;
}
private ApiElement element = null;
private String message = null;
private Status status = null;
private String stringRepresentation = null;
private String stringRepresentationWithoutMessage = null;
public ApiChange(ApiElement element, Status status) {
this(element, status, null);
}
public ApiChange(ApiElement element, Status status, String message) {
this.element = element;
this.status = status;
this.message = message;
}
public int compareTo(ApiChange arg0) {
return this.toString().compareTo(arg0.toString());
}
@Override
public boolean equals(Object o) {
if (!(o instanceof ApiChange)) {
return false;
}
return this.toString().equals(o.toString());
}
public ApiElement getApiElement() {
return element;
}
public String getMessage() {
return message;
}
public Status getStatus() {
return status;
}
public String getStringRepresentationWithoutMessage() {
if (stringRepresentationWithoutMessage == null) {
stringRepresentationWithoutMessage =
element.getRelativeSignature() + ApiDiffGenerator.DELIMITER + status.name();
}
return stringRepresentationWithoutMessage;
}
@Override
public int hashCode() {
return this.toString().hashCode();
}
public int hashCodeForDuplication() {
return element.hashCode() * 31 + status.hashCode() * 23
+ (message == null ? 0 : message.hashCode());
}
@Override
public String toString() {
if (stringRepresentation == null) {
stringRepresentation =
getStringRepresentationWithoutMessage()
+ (message == null ? "" : (ApiDiffGenerator.DELIMITER + message));
}
return stringRepresentation;
}
}