package org.infinispan.server.endpoint.subsystem;
import java.util.Collections;
import java.util.Set;
import java.util.stream.Collectors;
import org.infinispan.server.commons.msc.ServiceContainerHelper;
import org.infinispan.server.core.CacheIgnoreAware;
import org.infinispan.server.core.ProtocolServer;
import org.infinispan.server.endpoint.Constants;
import org.jboss.as.controller.AbstractWriteAttributeHandler;
import org.jboss.as.controller.AttributeDefinition;
import org.jboss.as.controller.OperationContext;
import org.jboss.as.controller.OperationFailedException;
import org.jboss.as.controller.PathAddress;
import org.jboss.as.controller.PathElement;
import org.jboss.as.controller.descriptions.ModelDescriptionConstants;
import org.jboss.dmr.ModelNode;
import org.jboss.msc.service.ServiceController;
import org.jboss.msc.service.ServiceName;
/**
* @author gustavonalle
* @since 8.1
*/
public class CacheIgnoreReadWriteHandler extends AbstractWriteAttributeHandler<Void> {
public CacheIgnoreReadWriteHandler(final AttributeDefinition attribute) {
super(attribute);
}
@Override
protected boolean applyUpdateToRuntime(OperationContext context, ModelNode operation, String attributeName, ModelNode resolvedValue, ModelNode currentValue, HandbackHolder<Void> handbackHolder) throws OperationFailedException {
CacheIgnoreAware cacheIgnoreAware = getCacheDisablingAware(operation, context);
applyModelToRuntime(cacheIgnoreAware, resolvedValue);
return false;
}
private CacheIgnoreAware getCacheDisablingAware(ModelNode operation, OperationContext context) {
final PathAddress address = PathAddress.pathAddress(operation.get(ModelDescriptionConstants.OP_ADDR));
PathElement lastElement = address.getLastElement();
String connectorType = lastElement.getKey().split("-")[0];
String connectorName = lastElement.getValue();
ServiceName serviceName = Constants.DATAGRID.append(connectorType, connectorName);
ServiceController<ProtocolServer> service = ServiceContainerHelper.findService(context.getServiceRegistry(true), serviceName);
return service.getValue();
}
@Override
protected void revertUpdateToRuntime(OperationContext context, ModelNode operation, String attributeName, ModelNode valueToRestore, ModelNode valueToRevert, Void handback) throws OperationFailedException {
CacheIgnoreAware cacheIgnoreAware = getCacheDisablingAware(operation, context);
final ModelNode restored = context.readResource(PathAddress.EMPTY_ADDRESS).getModel().clone();
restored.get(attributeName).set(valueToRestore);
applyModelToRuntime(cacheIgnoreAware, restored);
}
private void applyModelToRuntime(CacheIgnoreAware cacheIgnoreAware, final ModelNode model) throws OperationFailedException {
Set<String> values = Collections.emptySet();
if (model.isDefined()) {
values = model.asList().stream().map(ModelNode::asString).collect(Collectors.toSet());
}
cacheIgnoreAware.setIgnoredCaches(values);
}
}