/*
* Copyright Terracotta, 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.ehcache.clustered.client.internal;
import org.ehcache.clustered.client.config.TimeoutDuration;
import java.util.concurrent.TimeUnit;
/**
* Describes the timeouts for {@link ClusterTierManagerClientEntity} operations. Use
* {@link #builder()} to construct an instance.
*/
public final class Timeouts {
public static final TimeoutDuration DEFAULT_READ_OPERATION_TIMEOUT = TimeoutDuration.of(20, TimeUnit.SECONDS);
private final TimeoutDuration readOperationTimeout;
private final TimeoutDuration mutativeOperationTimeout;
private final TimeoutDuration lifecycleOperationTimeout;
private Timeouts(TimeoutDuration readOperationTimeout, TimeoutDuration mutativeOperationTimeout, TimeoutDuration lifecycleOperationTimeout) {
this.readOperationTimeout = readOperationTimeout;
this.mutativeOperationTimeout = mutativeOperationTimeout;
this.lifecycleOperationTimeout = lifecycleOperationTimeout;
}
public TimeoutDuration getReadOperationTimeout() {
return readOperationTimeout;
}
public TimeoutDuration getMutativeOperationTimeout() {
return mutativeOperationTimeout;
}
public TimeoutDuration getLifecycleOperationTimeout() {
return lifecycleOperationTimeout;
}
public static Builder builder() {
return new Builder();
}
@Override
public String toString() {
return "Timeouts{" +
"readOperationTimeout=" + readOperationTimeout +
", mutativeOperationTimeout=" + mutativeOperationTimeout +
", lifecycleOperationTimeout=" + lifecycleOperationTimeout +
'}';
}
/**
* Constructs instances of {@link Timeouts}. When obtained from
* {@link Timeouts#builder()}, the default values are pre-set.
*/
public static final class Builder {
private TimeoutDuration readOperationTimeout = DEFAULT_READ_OPERATION_TIMEOUT;
private TimeoutDuration mutativeOperationTimeout = TimeoutDuration.of(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
private TimeoutDuration lifecycleOperationTimeout = TimeoutDuration.of(20, TimeUnit.SECONDS);
/**
* Sets the timeout for read operations. The default value for this timeout is
* 5 seconds.
*
* @param readOperationTimeout the {@code TimeoutDuration} to use for the read operation timeout
*
* @return this {@code Builder}
*/
public Builder setReadOperationTimeout(TimeoutDuration readOperationTimeout) {
if (readOperationTimeout == null) {
throw new NullPointerException("readOperationTimeout");
}
this.readOperationTimeout = readOperationTimeout;
return this;
}
/**
* Sets the timeout for mutative operations like {@code put} and {@code remove}. The default value
* for this timeout is {@link TimeoutDuration#NONE}.
*
* @param mutativeOperationTimeout the {@code TimeoutDuration} to use for a mutative operation timeout
*
* @return this {@code Builder}
*/
public Builder setMutativeOperationTimeout(TimeoutDuration mutativeOperationTimeout) {
if (mutativeOperationTimeout == null) {
throw new NullPointerException("mutativeOperationTimeout");
}
this.mutativeOperationTimeout = mutativeOperationTimeout;
return this;
}
/**
* Sets the timeout for server store manager lifecycle operations like {@code validate} and {@code validateCache}.
*
* @param lifecycleOperationTimeout the {@code TimeoutDuration} to use for a store manager lifecycle operation timeout
*
* @return this {@code Builder}
*/
public Builder setLifecycleOperationTimeout(TimeoutDuration lifecycleOperationTimeout) {
if (lifecycleOperationTimeout == null) {
throw new NullPointerException("lifecycleOperationTimeout");
}
this.lifecycleOperationTimeout = lifecycleOperationTimeout;
return this;
}
/**
* Gets a new {@link Timeouts} instance using the current timeout duration settings.
*
* @return a new {@code Timeouts} instance
*/
public Timeouts build() {
return new Timeouts(readOperationTimeout, mutativeOperationTimeout, lifecycleOperationTimeout);
}
}
}