All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.ehcache.clustered.client.config.builders.ServerSideConfigurationBuilder Maven / Gradle / Ivy

/*
 * 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.util.HashMap;
import java.util.Map;

import org.ehcache.clustered.client.config.ClusteringServiceConfiguration;
import org.ehcache.clustered.common.ServerSideConfiguration;
import org.ehcache.clustered.common.ServerSideConfiguration.Pool;
import org.ehcache.config.Builder;
import org.ehcache.config.units.MemoryUnit;

import static java.util.Collections.emptyMap;
import static java.util.Collections.unmodifiableMap;

/**
 * Constructs the server-side portion of a {@link ClusteringServiceConfiguration}.  An instance of this
 * class is used in conjunction with {@link ClusteringServiceConfigurationBuilder} and is obtained from
 * the {@link ClusteringServiceConfigurationBuilder#autoCreate() autoCreate} and
 * {@link ClusteringServiceConfigurationBuilder#expecting() expecting} methods of that class.
 */
public class ServerSideConfigurationBuilder implements Builder {

  private final ClusteringServiceConfigurationBuilder clientSideBuilder;
  private final String defaultServerResource;
  private final Map pools;

  ServerSideConfigurationBuilder(ClusteringServiceConfigurationBuilder clientSideBuilder) {
    if (clientSideBuilder == null) {
      throw new NullPointerException("clientSideBuilder can not be null");
    }
    this.clientSideBuilder = clientSideBuilder;
    this.defaultServerResource = null;
    this.pools = emptyMap();
  }

  private ServerSideConfigurationBuilder(ServerSideConfigurationBuilder original, String defaultServerResource) {
    this.clientSideBuilder = original.clientSideBuilder;
    this.pools = original.pools;
    this.defaultServerResource = defaultServerResource;
  }

  private ServerSideConfigurationBuilder(ServerSideConfigurationBuilder original, String poolName, Pool poolDefinition) {
    this.clientSideBuilder = original.clientSideBuilder;
    this.defaultServerResource = original.defaultServerResource;
    Map pools = new HashMap<>(original.pools);
    if (pools.put(poolName, poolDefinition) != null) {
      throw new IllegalArgumentException("Pool '" + poolName + "' already defined");
    }
    this.pools = unmodifiableMap(pools);
  }

  /**
   * Sets the default server resource for pools and caches.
   *
   * @param defaultServerResource default server resource
   *
   * @return a clustering service configuration builder
   */
  public ServerSideConfigurationBuilder defaultServerResource(String defaultServerResource) {
    return new ServerSideConfigurationBuilder(this, defaultServerResource);
  }

  /**
   * Adds a resource pool with the given name and size and consuming the given server resource.
   *
   * @param name pool name
   * @param size pool size
   * @param unit pool size unit
   * @param serverResource server resource to consume
   *
   * @return a clustering service configuration builder
   */
  public ServerSideConfigurationBuilder resourcePool(String name, long size, MemoryUnit unit, String serverResource) {
    return resourcePool(name, new Pool(unit.toBytes(size), serverResource));
  }

  /**
   * Adds a resource pool with the given name and size and consuming the default server resource.
   *
   * @param name pool name
   * @param size pool size
   * @param unit pool size unit
   *
   * @return a clustering service configuration builder
   */
  public ServerSideConfigurationBuilder resourcePool(String name, long size, MemoryUnit unit) {
    return resourcePool(name, new Pool(unit.toBytes(size)));
  }

  /**
   * Adds a resource pool with the given name and definition
   *
   * @param name pool name
   * @param definition pool definition
   *
   * @return a clustering service configuration builder
   */
  public ServerSideConfigurationBuilder resourcePool(String name, Pool definition) {
    return new ServerSideConfigurationBuilder(this, name, definition);
  }

  @Override
  public ClusteringServiceConfiguration build() {
    return clientSideBuilder.build(buildServerSideConfiguration());
  }

  private ServerSideConfiguration buildServerSideConfiguration() {
    if (defaultServerResource == null) {
      return new ServerSideConfiguration(pools);
    } else {
      return new ServerSideConfiguration(defaultServerResource, pools);
    }
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy