/*
* Copyright 2011 Red Hat, Inc. and/or its affiliates.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA
*/
package org.infinispan.configuration.cache;
import static java.util.Arrays.asList;
public class ConfigurationBuilder implements ConfigurationChildBuilder {
private ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
private final ClusteringConfigurationBuilder clustering;
private final CustomInterceptorsConfigurationBuilder customInterceptors;
private final DataContainerConfigurationBuilder dataContainer;
private final DeadlockDetectionConfigurationBuilder deadlockDetection;
private final EvictionConfigurationBuilder eviction;
private final ExpirationConfigurationBuilder expiration;
private final IndexingConfigurationBuilder indexing;
private final InvocationBatchingConfigurationBuilder invocationBatching;
private final JMXStatisticsConfigurationBuilder jmxStatistics;
private final LoadersConfigurationBuilder loaders;
private final LockingConfigurationBuilder locking;
private final StoreAsBinaryConfigurationBuilder storeAsBinary;
private final TransactionConfigurationBuilder transaction;
private final VersioningConfigurationBuilder versioning;
private final UnsafeConfigurationBuilder unsafe;
private final DataPlacementConfigurationBuilder dataPlacement;
private final GarbageCollectorConfigurationBuilder garbageCollector;
private final ConditionalExecutorServiceConfigurationBuilder conditionalExecutorService;
public ConfigurationBuilder() {
this.clustering = new ClusteringConfigurationBuilder(this);
this.customInterceptors = new CustomInterceptorsConfigurationBuilder(this);
this.dataContainer = new DataContainerConfigurationBuilder(this);
this.deadlockDetection = new DeadlockDetectionConfigurationBuilder(this);
this.eviction = new EvictionConfigurationBuilder(this);
this.expiration = new ExpirationConfigurationBuilder(this);
this.indexing = new IndexingConfigurationBuilder(this);
this.invocationBatching = new InvocationBatchingConfigurationBuilder(this);
this.jmxStatistics = new JMXStatisticsConfigurationBuilder(this);
this.loaders = new LoadersConfigurationBuilder(this);
this.locking = new LockingConfigurationBuilder(this);
this.storeAsBinary = new StoreAsBinaryConfigurationBuilder(this);
this.transaction = new TransactionConfigurationBuilder(this);
this.versioning = new VersioningConfigurationBuilder(this);
this.unsafe = new UnsafeConfigurationBuilder(this);
this.dataPlacement = new DataPlacementConfigurationBuilder(this);
this.garbageCollector = new GarbageCollectorConfigurationBuilder(this);
this.conditionalExecutorService = new ConditionalExecutorServiceConfigurationBuilder(this);
}
public ConfigurationBuilder classLoader(ClassLoader cl) {
this.classLoader = cl;
return this;
}
ClassLoader classLoader() {
return classLoader;
}
@Override
public ClusteringConfigurationBuilder clustering() {
return clustering;
}
@Override
public CustomInterceptorsConfigurationBuilder customInterceptors() {
return customInterceptors;
}
@Override
public DataContainerConfigurationBuilder dataContainer() {
return dataContainer;
}
@Override
public DeadlockDetectionConfigurationBuilder deadlockDetection() {
return deadlockDetection;
}
@Override
public EvictionConfigurationBuilder eviction() {
return eviction;
}
@Override
public ExpirationConfigurationBuilder expiration() {
return expiration;
}
@Override
public IndexingConfigurationBuilder indexing() {
return indexing;
}
@Override
public InvocationBatchingConfigurationBuilder invocationBatching() {
return invocationBatching;
}
@Override
public JMXStatisticsConfigurationBuilder jmxStatistics() {
return jmxStatistics;
}
@Override
public StoreAsBinaryConfigurationBuilder storeAsBinary() {
return storeAsBinary;
}
@Override
public LoadersConfigurationBuilder loaders() {
return loaders;
}
@Override
public LockingConfigurationBuilder locking() {
return locking;
}
@Override
public TransactionConfigurationBuilder transaction() {
return transaction;
}
@Override
public VersioningConfigurationBuilder versioning() {
return versioning;
}
@Override
public UnsafeConfigurationBuilder unsafe() {
return unsafe;
}
@Override
public DataPlacementConfigurationBuilder dataPlacement() {
return dataPlacement;
}
@Override
public GarbageCollectorConfigurationBuilder garbageCollector() {
return garbageCollector;
}
@Override
public ConditionalExecutorServiceConfigurationBuilder conditionalExecutorService() {
return conditionalExecutorService;
}
@SuppressWarnings("unchecked")
public void validate() {
for (AbstractConfigurationChildBuilder<?> validatable:
asList(clustering, dataContainer, deadlockDetection, eviction, expiration, indexing,
invocationBatching, jmxStatistics, loaders, locking, storeAsBinary, transaction,
versioning, unsafe, dataPlacement, garbageCollector, conditionalExecutorService)) {
validatable.validate();
}
// TODO validate that a transport is set if a singleton store is set
}
@Override
public Configuration build() {
return build(true);
}
public Configuration build(boolean validate) {
if (validate) {
validate();
}
return new Configuration(clustering.create(), customInterceptors.create(),
dataContainer.create(), deadlockDetection.create(), eviction.create(),
expiration.create(), indexing.create(), invocationBatching.create(),
jmxStatistics.create(), loaders.create(), locking.create(), storeAsBinary.create(),
transaction.create(), unsafe.create(), versioning.create(), classLoader, dataPlacement.create(),
garbageCollector.create(), conditionalExecutorService.create());// TODO
}
public ConfigurationBuilder read(Configuration template) {
this.classLoader = template.classLoader();
this.clustering.read(template.clustering());
this.customInterceptors.read(template.customInterceptors());
this.dataContainer.read(template.dataContainer());
this.deadlockDetection.read(template.deadlockDetection());
this.eviction.read(template.eviction());
this.expiration.read(template.expiration());
this.indexing.read(template.indexing());
this.invocationBatching.read(template.invocationBatching());
this.jmxStatistics.read(template.jmxStatistics());
this.loaders.read(template.loaders());
this.locking.read(template.locking());
this.storeAsBinary.read(template.storeAsBinary());
this.transaction.read(template.transaction());
this.unsafe.read(template.unsafe());
this.versioning.read(template.versioning());
this.dataPlacement.read(template.dataPlacement());
this.garbageCollector.read(template.garbageCollector());
return this;
}
@Override
public String toString() {
return "ConfigurationBuilder{" +
"classLoader=" + classLoader +
", clustering=" + clustering +
", customInterceptors=" + customInterceptors +
", dataContainer=" + dataContainer +
", deadlockDetection=" + deadlockDetection +
", eviction=" + eviction +
", expiration=" + expiration +
", indexing=" + indexing +
", invocationBatching=" + invocationBatching +
", jmxStatistics=" + jmxStatistics +
", loaders=" + loaders +
", locking=" + locking +
", storeAsBinary=" + storeAsBinary +
", transaction=" + transaction +
", versioning=" + versioning +
", unsafe=" + unsafe +
", dataPlacement=" + dataPlacement +
", garbageCollector=" + garbageCollector +
'}';
}
}