blob: acfe952166dc49c868173ffe1669db50fba20617 [file] [log] [blame]
/*
* 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;
import com.google.ipc.invalidation.util.Preconditions;
import java.util.Arrays;
/**
* A class to represent an invalidation for a given object/version and an optional payload.
*
*/
public final class Invalidation {
/** The object being invalidated/updated. */
private final ObjectId objectId;
/** The new version of the object. */
private final long version;
/** Optional payload for the object. */
private final byte[] payload;
/** Whether this is a restarted invalidation, for internal use only. */
private final boolean isTrickleRestart;
/**
* Creates an invalidation for the given {@code object} and {@code version}.
*/
public static Invalidation newInstance(ObjectId objectId, long version) {
return new Invalidation(objectId, version, null, true);
}
/**
* Creates an invalidation for the given {@code object} and {@code version} and {@code payload}
*/
public static Invalidation newInstance(ObjectId objectId, long version,
byte[] payload) {
return new Invalidation(objectId, version, payload, true);
}
/**
* Creates an invalidation for the given {@code object}, {@code version} and optional
* {@code payload} and internal {@code isTrickleRestart} flag.
*/
public static Invalidation newInstance(ObjectId objectId, long version,
byte[] payload, boolean isTrickleRestart) {
return new Invalidation(objectId, version, payload, isTrickleRestart);
}
/**
* Creates an invalidation for the given {@code object}, {@code version} and optional
* {@code payload} and optional {@code componentStampLog}.
*/
private Invalidation(ObjectId objectId, long version, byte[] payload,
boolean isTrickleRestart) {
this.objectId = Preconditions.checkNotNull(objectId, "objectId");
this.version = version;
this.payload = payload;
this.isTrickleRestart = isTrickleRestart;
}
public ObjectId getObjectId() {
return objectId;
}
public long getVersion() {
return version;
}
/** Returns the optional payload for the object - if none exists, returns {@code null}. */
public byte[] getPayload() {
return payload;
}
@Override
public boolean equals(Object object) {
if (object == this) {
return true;
}
if (!(object instanceof Invalidation)) {
return false;
}
final Invalidation other = (Invalidation) object;
if ((payload != null) != (other.payload != null)) {
// One of the objects has a payload and the other one does not.
return false;
}
// Both have a payload or not.
return objectId.equals(other.objectId) && (version == other.version) &&
(isTrickleRestart == other.isTrickleRestart) &&
((payload == null) || Arrays.equals(payload, other.payload));
}
@Override
public int hashCode() {
int result = 17;
result = 31 * result + objectId.hashCode();
result = 31 * result + (int) (version ^ (version >>> 32));
// Booleans.hashCode() inlined here to reduce client library size.
result = 31 * result + (isTrickleRestart ? 1231 : 1237);
if (payload != null) {
result = 31 * result + Arrays.hashCode(payload);
}
return result;
}
@Override
public String toString() {
return "Inv: <" + objectId + ", " + version + ", " + isTrickleRestart + ", " +
BytesFormatter.toString(payload) + ">";
}
/** Returns whether this is a restarted invalidation, for internal use only. */
public boolean getIsTrickleRestartForInternalUse() {
return isTrickleRestart;
}
}