// Copyright 2012 Google Inc. All Rights Reserved. // // 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.collide.shared.invalidations; import com.google.collide.shared.invalidations.InvalidationUtils.InvalidationObjectPrefix; /** * An object which defines a tango object which can receive notifications or have notifications * published. * * @param <T> The type of the payload for this object {@link Void} if no payload is required. */ public final class InvalidationObjectId<T> { /** * An enum which defines the version number and persistence requirements for a * {@link InvalidationObjectId}. Currently these aren't really used but may be used in future * implementations. */ public enum VersioningRequirement { /** * No version or payload data will be persisted and {@link System#currentTimeMillis()} will be * used to assign version numbers. * <p> * Recommended for objects which are sending notifications to the client which do not require * the ability to determine a notification was missed. These clients typically do not have * payloads or have payloads which carry extra information and can be lost or dropped. */ NONE, /** * No payload data will be persisted; however, versions will be sequential. * <p> * Recommended for objects which require the ability to determine that a notification was missed * but do not require the ability to retrieve any missed payloads. */ VERSION_ONLY, /** * Versions will be sequential and payloads will be persisted for each invalidation. * <p> * Recommended for objects which require the ability to determine that a notification was missed * and the ability to retrieve any missed payloads. */ PAYLOADS } private final InvalidationObjectPrefix prefix; private final String id; private final String name; private final VersioningRequirement versioningRequirement; /** * A string which indicates that there was no payload, this is only used when a * {@link InvalidationObjectId} has uses {@link InvalidationUtils.VersioningRequirement#PAYLOADS}. */ public static final String EMPTY_PAYLOAD = "\0\3"; public InvalidationObjectId( InvalidationObjectPrefix prefix, String id, VersioningRequirement versioningRequirement) { this.prefix = prefix; // TODO: if the id is a number pack it into an integer this.id = id; this.versioningRequirement = versioningRequirement; this.name = prefix.getPrefix() + id; } /** * @return the name of this object for use in registration. */ public String getName() { return name; } public InvalidationObjectPrefix getPrefix() { return prefix; } /** * @return the id portion of this object, typically a workspaceId or projectId. */ public String getId() { return id; } public VersioningRequirement getVersioningRequirement() { return versioningRequirement; } /** * Useful for logging so the full name is logged, use #getName for registering. */ @Override public String toString() { return prefix.toString() + "(" + name + ")"; } }