/**
* Copyright 2011-2013 Terracotta, Inc.
* Copyright 2011-2013 Oracle, 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 org.jsr107.tck.expiry;
import org.jsr107.tck.support.CacheClient;
import org.jsr107.tck.support.Operation;
import org.jsr107.tck.support.Server;
import javax.cache.expiry.Duration;
import javax.cache.expiry.ExpiryPolicy;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
/**
*/
public class ExpiryPolicyClient extends CacheClient implements ExpiryPolicy {
private transient ExpiryPolicy forwardPolicy = null;
/**
* Constructs a {@link ExpiryPolicyClient}.
*
* @param address the {@link java.net.InetAddress} on which to connect to the {@link org.jsr107.tck.expiry.ExpiryPolicyServer}
* @param port the port to which to connect to the {@link org.jsr107.tck.expiry.ExpiryPolicyServer}
*/
public ExpiryPolicyClient(InetAddress address, int port) {
super(address, port);
}
@Override
protected boolean checkDirectCallsPossible() {
Server server = Server.lookupServerAtLocalMachine(port);
if (server == null) {
return false;
}
forwardPolicy = ((ExpiryPolicyServer) server).getExpiryPolicy();
return true;
}
/**
* {@inheritDoc}
*/
@Override
public Duration getExpiryForCreation() {
if (isDirectCallable()) {
return forwardPolicy.getExpiryForCreation();
}
return getClient().invoke(new GetExpiryOperation(ExpiryPolicyServer.EntryOperation.CREATION));
}
/**
* {@inheritDoc}
*/
@Override
public Duration getExpiryForAccess() {
if (isDirectCallable()) {
return forwardPolicy.getExpiryForAccess();
}
return getClient().invoke(new GetExpiryOperation(ExpiryPolicyServer.EntryOperation.ACCESSED));
}
/**
* {@inheritDoc}
*/
@Override
public Duration getExpiryForUpdate() {
if (isDirectCallable()) {
return forwardPolicy.getExpiryForUpdate();
}
return getClient().invoke(new GetExpiryOperation(ExpiryPolicyServer.EntryOperation.UPDATED));
}
/**
* The {@link GetExpiryOperation}.
*/
private static class GetExpiryOperation implements Operation<Duration> {
private ExpiryPolicyServer.EntryOperation entryOperation;
/**
* Constructs a {@link GetExpiryOperation}.
*/
public GetExpiryOperation(ExpiryPolicyServer.EntryOperation entryOperation) {
this.entryOperation = entryOperation;
}
/**
* {@inheritDoc}
*/
@Override
public String getType() {
return "getExpiry";
}
/**
* {@inheritDoc}
*/
@Override
public Duration onInvoke(ObjectInputStream ois,
ObjectOutputStream oos) throws IOException, ClassNotFoundException {
oos.writeObject(entryOperation.name());
Object o = ois.readObject();
if (o instanceof RuntimeException) {
throw (RuntimeException) o;
} else {
return (Duration) o;
}
}
}
}