package org.infinispan.server.endpoint.subsystem;
import java.util.function.BiFunction;
import java.util.stream.Stream;
import org.infinispan.server.commons.controller.Operations;
import org.jboss.as.controller.OperationContext;
import org.jboss.as.controller.OperationFailedException;
import org.jboss.as.controller.OperationStepHandler;
import org.jboss.as.controller.PathAddress;
import org.jboss.as.controller.PathElement;
import org.jboss.as.controller.descriptions.ModelDescriptionConstants;
import org.jboss.as.controller.registry.Resource;
import org.jboss.dmr.ModelNode;
/**
* @author gustavonalle
* @since 8.1
*/
public class CacheDisablingCascadeHandler implements OperationStepHandler {
private final BiFunction<ModelNode, ModelNode, ModelNode> modelNodeOp;
public CacheDisablingCascadeHandler(BiFunction<ModelNode, ModelNode, ModelNode> modelNodeOp) {
this.modelNodeOp = modelNodeOp;
}
@Override
public void execute(OperationContext context, ModelNode operation) throws OperationFailedException {
final PathAddress address = PathAddress.pathAddress(operation.require(ModelDescriptionConstants.OP_ADDR));
final ModelNode cacheNames = operation.get(ModelKeys.CACHE_NAMES);
Resource endpointResource = context.readResourceForUpdate(PathAddress.EMPTY_ADDRESS);
Stream<Resource.ResourceEntry> connectorResources = endpointResource.getChildTypes().stream().flatMap(type -> endpointResource.getChildren(type).stream());
connectorResources.forEach(resourceEntry -> {
ModelNode list = resourceEntry.getModel().get(ModelKeys.IGNORED_CACHES);
ModelNode result = modelNodeOp.apply(list, cacheNames);
PathElement pathElement = resourceEntry.getPathElement();
ModelNode op = Operations.createWriteAttributeOperation(PathAddress.pathAddress(address, pathElement), ModelKeys.IGNORED_CACHES, result);
context.addStep(op, new CacheIgnoreReadWriteHandler(CommonConnectorResource.IGNORED_CACHES), OperationContext.Stage.MODEL);
});
}
}