/*
* 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.contrib;
import com.google.common.base.Preconditions;
import com.google.ipc.invalidation.external.client.types.ObjectId;
import com.google.ipc.invalidation.ticl.ProtoConverter;
import com.google.ipc.invalidation.ticl.TiclExponentialBackoffDelayGenerator;
import com.google.protobuf.ByteString;
import com.google.protos.ipc.invalidation.AndroidListenerProtocol.AndroidListenerState;
import com.google.protos.ipc.invalidation.AndroidListenerProtocol.AndroidListenerState.RetryRegistrationState;
import com.google.protos.ipc.invalidation.AndroidListenerProtocol.RegistrationCommand;
import com.google.protos.ipc.invalidation.AndroidListenerProtocol.StartCommand;
import java.util.Map;
import java.util.Map.Entry;
/**
* Static helper class supporting construction of valid {code AndroidListenerProtocol} messages.
*
*/
class AndroidListenerProtos {
/** Creates a register command for the given objects and client. */
static RegistrationCommand newRegisterCommand(ByteString clientId, Iterable<ObjectId> objectIds) {
final boolean isRegister = true;
return newRegistrationCommand(clientId, objectIds, isRegister);
}
/** Creates an unregister command for the given objects and client. */
static RegistrationCommand newUnregisterCommand(ByteString clientId,
Iterable<ObjectId> objectIds) {
final boolean isRegister = false;
return newRegistrationCommand(clientId, objectIds, isRegister);
}
/** Creates a retry register command for the given object and client. */
static RegistrationCommand newDelayedRegisterCommand(ByteString clientId, ObjectId objectId) {
final boolean isRegister = true;
return newDelayedRegistrationCommand(clientId, objectId, isRegister);
}
/** Creates a retry unregister command for the given object and client. */
static RegistrationCommand newDelayedUnregisterCommand(ByteString clientId, ObjectId objectId) {
final boolean isRegister = false;
return newDelayedRegistrationCommand(clientId, objectId, isRegister);
}
/** Creates proto for {@link AndroidListener} state. */
static AndroidListenerState newAndroidListenerState(ByteString clientId, int requestCodeSeqNum,
Map<ObjectId, TiclExponentialBackoffDelayGenerator> delayGenerators,
Iterable<ObjectId> desiredRegistrations) {
AndroidListenerState.Builder builder = AndroidListenerState.newBuilder()
.setClientId(clientId)
.setRequestCodeSeqNum(requestCodeSeqNum);
for (ObjectId objectId : desiredRegistrations) {
builder.addRegistration(ProtoConverter.convertToObjectIdProto(objectId));
}
for (Entry<ObjectId, TiclExponentialBackoffDelayGenerator> entry : delayGenerators.entrySet()) {
builder.addRetryRegistrationState(
newRetryRegistrationState(entry.getKey(), entry.getValue()));
}
return builder.build();
}
/** Creates proto for retry registration state. */
static RetryRegistrationState newRetryRegistrationState(ObjectId objectId,
TiclExponentialBackoffDelayGenerator delayGenerator) {
return RetryRegistrationState.newBuilder()
.setObjectId(ProtoConverter.convertToObjectIdProto(objectId))
.setExponentialBackoffState(delayGenerator.marshal())
.build();
}
/** Returns {@code true} iff the given proto is valid. */
static boolean isValidAndroidListenerState(AndroidListenerState state) {
return state.hasClientId() && state.hasRequestCodeSeqNum();
}
/** Returns {@code true} iff the given proto is valid. */
static boolean isValidRegistrationCommand(RegistrationCommand command) {
return command.hasIsRegister() && command.hasClientId() && command.hasIsDelayed();
}
/** Returns {@code true} iff the given proto is valid. */
static boolean isValidStartCommand(StartCommand command) {
return command.hasClientType() && command.hasClientName();
}
/** Creates start command proto. */
static StartCommand newStartCommand(int clientType, ByteString clientName) {
return StartCommand.newBuilder()
.setClientType(clientType)
.setClientName(clientName)
.build();
}
private static RegistrationCommand newRegistrationCommand(ByteString clientId,
Iterable<ObjectId> objectIds, boolean isRegister) {
RegistrationCommand.Builder builder = RegistrationCommand.newBuilder()
.setIsRegister(isRegister)
.setClientId(clientId)
.setIsDelayed(false);
for (ObjectId objectId : objectIds) {
Preconditions.checkNotNull(objectId);
builder.addObjectId(ProtoConverter.convertToObjectIdProto(objectId));
}
return builder.build();
}
private static RegistrationCommand newDelayedRegistrationCommand(ByteString clientId,
ObjectId objectId, boolean isRegister) {
return RegistrationCommand.newBuilder()
.setIsRegister(isRegister)
.addObjectId(ProtoConverter.convertToObjectIdProto(objectId))
.setClientId(clientId)
.setIsDelayed(true)
.build();
}
// Prevent instantiation.
private AndroidListenerProtos() {
}
}