/*
* JBoss, Home of Professional Open Source.
* Copyright 2012, Red Hat, Inc., and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* 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 software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.as.clustering.infinispan.subsystem;
import org.infinispan.server.infinispan.spi.service.CacheServiceName;
import org.jboss.as.controller.AttributeDefinition;
import org.jboss.as.controller.OperationDefinition;
import org.jboss.as.controller.OperationStepHandler;
import org.jboss.as.controller.PathElement;
import org.jboss.as.controller.SimpleAttributeDefinition;
import org.jboss.as.controller.SimpleAttributeDefinitionBuilder;
import org.jboss.as.controller.SimpleOperationDefinitionBuilder;
import org.jboss.as.controller.SimpleResourceDefinition;
import org.jboss.as.controller.descriptions.ResourceDescriptionResolver;
import org.jboss.as.controller.registry.AttributeAccess;
import org.jboss.as.controller.registry.ManagementResourceRegistration;
import org.jboss.as.controller.services.path.ResolvePathHandler;
import org.jboss.dmr.ModelNode;
import org.jboss.dmr.ModelType;
/**
* Base class for cache resources which require common cache attributes only.
*
* @author Richard Achmatowicz (c) 2011 Red Hat Inc.
*/
public class CacheResource extends SimpleResourceDefinition implements RestartableResourceDefinition {
// attributes
static final SimpleAttributeDefinition CONFIGURATION =
new SimpleAttributeDefinitionBuilder(ModelKeys.CONFIGURATION, ModelType.STRING, true)
.setXmlName(Attribute.CONFIGURATION.getLocalName())
.setAllowExpression(true)
.setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
.build();
static final AttributeDefinition[] CACHE_ATTRIBUTES = {CONFIGURATION};
// here for legacy purposes only
static final SimpleAttributeDefinition NAME =
new SimpleAttributeDefinitionBuilder(ModelKeys.NAME, ModelType.STRING, true)
.setXmlName(Attribute.NAME.getLocalName())
.setAllowExpression(false)
.setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
.build();
// operation parameters
static final SimpleAttributeDefinition MIGRATOR_NAME =
new SimpleAttributeDefinitionBuilder(ModelKeys.MIGRATOR_NAME, ModelType.STRING, true)
.setAllowExpression(false)
.build();
// operation parameters
static final SimpleAttributeDefinition READ_BATCH =
new SimpleAttributeDefinitionBuilder(ModelKeys.READ_BATCH, ModelType.INT, true)
.setAllowExpression(false)
.setDefaultValue(new ModelNode().set(1000))
.build();
static final SimpleAttributeDefinition WRITE_THREADS =
new SimpleAttributeDefinitionBuilder(ModelKeys.WRITE_THREADS, ModelType.INT, true)
.setAllowExpression(false)
.setDefaultValue(new ModelNode().set(Runtime.getRuntime().availableProcessors()))
.build();
// operations
static final OperationDefinition CLEAR_CACHE =
new SimpleOperationDefinitionBuilder("clear-cache",
new InfinispanResourceDescriptionResolver("cache")
).setRuntimeOnly().build();
static final OperationDefinition FLUSH_CACHE =
new SimpleOperationDefinitionBuilder("flush-cache",
new InfinispanResourceDescriptionResolver("cache")
).setRuntimeOnly().build();
static final OperationDefinition STOP_CACHE =
new SimpleOperationDefinitionBuilder("stop-cache",
new InfinispanResourceDescriptionResolver("cache")
).setRuntimeOnly().build();
static final OperationDefinition SHUTDOWN_CACHE =
new SimpleOperationDefinitionBuilder("shutdown-cache",
new InfinispanResourceDescriptionResolver("cache")
).setRuntimeOnly().build();
static final OperationDefinition START_CACHE =
new SimpleOperationDefinitionBuilder("start-cache",
new InfinispanResourceDescriptionResolver("cache")
).setRuntimeOnly().build();
static final OperationDefinition RESET_STATISTICS =
new SimpleOperationDefinitionBuilder("reset-statistics",
new InfinispanResourceDescriptionResolver("cache")
).setRuntimeOnly().build();
static final OperationDefinition RESET_ACTIVATION_STATISTICS =
new SimpleOperationDefinitionBuilder(
"reset-activation-statistics",
new InfinispanResourceDescriptionResolver("cache")
).setRuntimeOnly().build();
static final OperationDefinition RESET_INVALIDATION_STATISTICS =
new SimpleOperationDefinitionBuilder(
"reset-invalidation-statistics",
new InfinispanResourceDescriptionResolver("cache")
).setRuntimeOnly().build();
static final OperationDefinition RESET_PASSIVATION_STATISTICS =
new SimpleOperationDefinitionBuilder(
"reset-passivation-statistics",
new InfinispanResourceDescriptionResolver("cache")
).setRuntimeOnly().build();
static final OperationDefinition RESET_RPC_MANAGER_STATISTICS =
new SimpleOperationDefinitionBuilder(
"reset-rpc-manager-statistics",
new InfinispanResourceDescriptionResolver("cache")
).setRuntimeOnly().build();
static final OperationDefinition SYNCHRONIZE_DATA =
new SimpleOperationDefinitionBuilder(
"synchronize-data",
new InfinispanResourceDescriptionResolver("cache")
).setParameters(MIGRATOR_NAME, READ_BATCH, WRITE_THREADS).setRuntimeOnly().build();
static final OperationDefinition DISCONNECT_SOURCE =
new SimpleOperationDefinitionBuilder(
"disconnect-source",
new InfinispanResourceDescriptionResolver("cache")
).setParameters(MIGRATOR_NAME).setRuntimeOnly().build();
static final OperationDefinition RECORD_KNOWN_GLOBAL_KEYSET =
new SimpleOperationDefinitionBuilder(
"record-known-global-keyset",
new InfinispanResourceDescriptionResolver("cache")
).setRuntimeOnly().build();
static final OperationDefinition MASS_REINDEX =
new SimpleOperationDefinitionBuilder(
"mass-reindex",
new InfinispanResourceDescriptionResolver("cache")
).setRuntimeOnly().build();
protected final ResolvePathHandler resolvePathHandler;
protected final boolean runtimeRegistration;
private final RestartableServiceHandler serviceInstaller;
public CacheResource(PathElement pathElement, ResourceDescriptionResolver descriptionResolver, CacheAdd cacheAddHandler, OperationStepHandler removeHandler, ResolvePathHandler resolvePathHandler, boolean runtimeRegistration) {
super(pathElement, descriptionResolver, cacheAddHandler, removeHandler);
this.serviceInstaller = cacheAddHandler;
this.resolvePathHandler = resolvePathHandler;
this.runtimeRegistration = runtimeRegistration;
}
@Override
public RestartableServiceHandler getServiceInstaller() {
return serviceInstaller;
}
@Override
public boolean isRuntimeRegistration() {
return runtimeRegistration;
}
@Override
public void registerAttributes(ManagementResourceRegistration resourceRegistration) {
super.registerAttributes(resourceRegistration);
final OperationStepHandler restartWriteHandler = new RestartServiceWriteAttributeHandler(getPathElement().getKey(), serviceInstaller, CacheServiceName.CACHE, CACHE_ATTRIBUTES);
for (AttributeDefinition attr : CACHE_ATTRIBUTES) {
resourceRegistration.registerReadWriteAttribute(attr, CacheReadAttributeHandler.INSTANCE, restartWriteHandler);
}
if (runtimeRegistration) {
CacheMetricsHandler.INSTANCE.registerCommonMetrics(resourceRegistration);
}
}
@Override
public void registerOperations(ManagementResourceRegistration resourceRegistration) {
super.registerOperations(resourceRegistration);
resourceRegistration.registerOperationHandler(CacheResource.CLEAR_CACHE, CacheCommands.ClearCacheCommand.INSTANCE);
resourceRegistration.registerOperationHandler(CacheResource.FLUSH_CACHE, CacheCommands.FlushCacheCommand.INSTANCE);
resourceRegistration.registerOperationHandler(CacheResource.START_CACHE, CacheCommands.StartCacheCommand.INSTANCE);
resourceRegistration.registerOperationHandler(CacheResource.STOP_CACHE, CacheCommands.StopCacheCommand.INSTANCE);
resourceRegistration.registerOperationHandler(CacheResource.SHUTDOWN_CACHE, CacheCommands.ShudownCacheCommand.INSTANCE);
resourceRegistration.registerOperationHandler(CacheResource.RESET_STATISTICS, CacheCommands.ResetCacheStatisticsCommand.INSTANCE);
resourceRegistration.registerOperationHandler(CacheResource.RESET_ACTIVATION_STATISTICS, CacheCommands.ResetActivationStatisticsCommand.INSTANCE);
resourceRegistration.registerOperationHandler(CacheResource.RESET_INVALIDATION_STATISTICS, CacheCommands.ResetInvalidationStatisticsCommand.INSTANCE);
resourceRegistration.registerOperationHandler(CacheResource.RESET_PASSIVATION_STATISTICS, CacheCommands.ResetPassivationStatisticsCommand.INSTANCE);
resourceRegistration.registerOperationHandler(CacheResource.RESET_RPC_MANAGER_STATISTICS, CacheCommands.ResetRpcManagerStatisticsCommand.INSTANCE);
resourceRegistration.registerOperationHandler(CacheResource.DISCONNECT_SOURCE, CacheCommands.DisconnectSourceCommand.INSTANCE);
resourceRegistration.registerOperationHandler(CacheResource.RECORD_KNOWN_GLOBAL_KEYSET, CacheCommands.RecordGlobalKeySetCommand.INSTANCE);
resourceRegistration.registerOperationHandler(CacheResource.SYNCHRONIZE_DATA, CacheCommands.SynchronizeDataCommand.INSTANCE);
resourceRegistration.registerOperationHandler(CacheResource.MASS_REINDEX, CacheCommands.MassReindexCommand.INSTANCE);
}
@Override
public void registerChildren(ManagementResourceRegistration resourceRegistration) {
super.registerChildren(resourceRegistration);
resourceRegistration.registerSubModel(new TransactionResource(this));
resourceRegistration.registerSubModel(new BackupSiteResource(this));
}
}