/* * Copyright 2011 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.ipc.invalidation.external.client.types; /** * Information given to about a operation - success, temporary or permanent failure. * */ public final class Status { /** Actual status of the operation: Whether successful, transient or permanent failure. */ public enum Code { /** Operation was successful. */ SUCCESS, /** * Operation had a transient failure. The application can retry the failed operation later - * if it chooses to do so, it must use a sensible backoff policy such as exponential backoff. */ TRANSIENT_FAILURE, /** * Opration has a permanent failure. Application must not automatically retry without fixing * the situation (e.g., by presenting a dialog box to the user). */ PERMANENT_FAILURE } /** Success or failure. */ private final Code code; /** A message describing why the state was unknown, for debugging. */ private final String message; /** Creates a new Status object given the {@code code} and {@code message}. */ public static Status newInstance(Status.Code code, String message) { return new Status(code, message); } private Status(Code code, String message) { this.code = code; this.message = message; } /** Returns true iff the status corresponds to a successful completion of the operation.*/ public boolean isSuccess() { return code == Code.SUCCESS; } /** * Whether the failure is transient for an operation, e.g., for a {@code register} operation. * For transient failures, the application can retry the operation but it must use a sensible * policy such as exponential backoff so that it does not add significant load to the backend * servers. */ public boolean isTransientFailure() { return code == Code.TRANSIENT_FAILURE; } /** * Whether the failure is transient for an operation, e.g., for a {@code register} operation. * See discussion in {@code Status.Code} for permanent and transient failure handling. */ public boolean isPermanentFailure() { return code == Code.PERMANENT_FAILURE; } /** A message describing why the state was unknown, for debugging. */ public String getMessage() { return message; } /** Returns the code for this status message. */ public Code getCode() { return code; } @Override public String toString() { return "Code: " + code + ", " + message; } @Override public boolean equals(Object object) { if (object == this) { return true; } if (!(object instanceof Status)) { return false; } final Status other = (Status) object; if (code != other.code) { return false; } if (message == null) { return other.message == null; } return message.equals(other.message); } @Override public int hashCode() { return code.hashCode() ^ ((message == null) ? 0 : message.hashCode()); } }