/* * 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.config.builders; import java.net.URI; import org.ehcache.clustered.client.config.ClusteringServiceConfiguration; import java.util.concurrent.TimeUnit; import org.ehcache.clustered.client.config.TimeoutDuration; import org.ehcache.clustered.common.ServerSideConfiguration; import org.ehcache.config.Builder; /** * A builder of ClusteringService configurations. */ public final class ClusteringServiceConfigurationBuilder implements Builder<ClusteringServiceConfiguration> { private final URI clusterUri; private final TimeoutDuration readOperationTimeout; private final Boolean autoCreate; /** * Creates a new builder connecting to the given cluster. * * @param clusterUri cluster URI * * @return a clustering service configuration builder */ public static ClusteringServiceConfigurationBuilder cluster(URI clusterUri) { return new ClusteringServiceConfigurationBuilder(clusterUri); } private ClusteringServiceConfigurationBuilder(URI clusterUri) { this.clusterUri = clusterUri; this.readOperationTimeout = null; this.autoCreate = null; } private ClusteringServiceConfigurationBuilder(ClusteringServiceConfigurationBuilder original, TimeoutDuration readOperationTimeout) { this.clusterUri = original.clusterUri; this.readOperationTimeout = readOperationTimeout; this.autoCreate = original.autoCreate; } private ClusteringServiceConfigurationBuilder(ClusteringServiceConfigurationBuilder original, boolean autoCreate) { this.clusterUri = original.clusterUri; this.readOperationTimeout = original.readOperationTimeout; this.autoCreate = autoCreate; } /** * Support connection to an existing entity or create if the entity if absent. * * @return a clustering service configuration builder */ public ServerSideConfigurationBuilder autoCreate() { return new ServerSideConfigurationBuilder(new ClusteringServiceConfigurationBuilder(this, true)); } /** * Only support connection to an existing entity. * * @return a clustering service configuration builder */ public ServerSideConfigurationBuilder expecting() { return new ServerSideConfigurationBuilder(new ClusteringServiceConfigurationBuilder(this, false)); } /** * Adds a read operation timeout. Read operations which time out return a result comparable to * a cache miss. * * @param duration the amount of time permitted for read operations * @param unit the time units for {@code duration} * * @return a clustering service configuration builder * * @throws NullPointerException if {@code unit} is {@code null} * @throws IllegalArgumentException if {@code amount} is negative */ public ClusteringServiceConfigurationBuilder readOperationTimeout(long duration, TimeUnit unit) { return new ClusteringServiceConfigurationBuilder(this, TimeoutDuration.of(duration, unit)); } @Override public ClusteringServiceConfiguration build() { if (readOperationTimeout == null) { return new ClusteringServiceConfiguration(clusterUri); } else { return new ClusteringServiceConfiguration(clusterUri, readOperationTimeout); } } /** * Internal method to build a new {@link ClusteringServiceConfiguration} from the {@link ServerSideConfigurationBuilder}. * * @param serverSideConfiguration the {@code ServerSideConfiguration} to use * * @return a new {@code ClusteringServiceConfiguration} instance built from {@code this} * {@code ClusteringServiceConfigurationBuilder} and the {@code serverSideConfiguration} provided */ ClusteringServiceConfiguration build(ServerSideConfiguration serverSideConfiguration) { ClusteringServiceConfiguration configuration; if (autoCreate != null) { if (readOperationTimeout != null) { configuration = new ClusteringServiceConfiguration(clusterUri, readOperationTimeout, autoCreate, serverSideConfiguration); } else { configuration = new ClusteringServiceConfiguration(clusterUri, autoCreate, serverSideConfiguration); } } else { if (readOperationTimeout != null) { configuration = new ClusteringServiceConfiguration(clusterUri, readOperationTimeout, serverSideConfiguration); } else { configuration = new ClusteringServiceConfiguration(clusterUri, serverSideConfiguration); } } return configuration; } }