/* * 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; } }