package org.jboss.as.undertow; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP_ADDR; import java.nio.ByteBuffer; import java.util.List; import org.jboss.as.controller.AbstractAddStepHandler; 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.ReloadRequiredRemoveStepHandler; import org.jboss.as.controller.ReloadRequiredWriteAttributeHandler; import org.jboss.as.controller.ServiceVerificationHandler; import org.jboss.as.controller.SimpleAttributeDefinition; import org.jboss.as.controller.SimpleAttributeDefinitionBuilder; import org.jboss.as.controller.SimplePersistentResourceDefinition; import org.jboss.as.controller.registry.ManagementResourceRegistration; import org.jboss.dmr.ModelNode; import org.jboss.dmr.ModelType; import org.jboss.msc.service.ServiceBuilder; import org.jboss.msc.service.ServiceController; import org.xnio.Pool; /** * @author <a href="mailto:tomaz.cerar@redhat.com">Tomaz Cerar</a> (c) 2013 Red Hat Inc. */ public class BufferPoolResourceDefinition extends SimplePersistentResourceDefinition { static final SimpleAttributeDefinition BUFFER_SIZE = new SimpleAttributeDefinitionBuilder(Constants.BUFFER_SIZE, ModelType.LONG) .setDefaultValue(new ModelNode(1024)) .build(); static final SimpleAttributeDefinition BUFFER_PER_SLICE = new SimpleAttributeDefinitionBuilder(Constants.BUFFER_PER_SLICE, ModelType.LONG) .setDefaultValue(new ModelNode(1024)) .build(); /*<buffer-pool name="default" buffer-size="1024" buffers-per-slice="1024"/>*/ static SimpleAttributeDefinition[] ATTRIBUTES = new SimpleAttributeDefinition[]{ BUFFER_SIZE, BUFFER_PER_SLICE }; public static final BufferPoolResourceDefinition INSTANCE = new BufferPoolResourceDefinition(); private BufferPoolResourceDefinition() { super(UndertowExtension.BUFFER_POOL_PATH, UndertowExtension.getResolver(Constants.BUFFER_POOL), new BufferPoolAdd(), ReloadRequiredRemoveStepHandler.INSTANCE ); } @Override public AttributeDefinition[] getAttributes() { return ATTRIBUTES; } @Override public void registerAttributes(ManagementResourceRegistration resourceRegistration) { super.registerAttributes(resourceRegistration); for (AttributeDefinition attr : BufferPoolResourceDefinition.ATTRIBUTES) { resourceRegistration.registerReadWriteAttribute(attr, null, new ReloadRequiredWriteAttributeHandler(attr)); } } private static class BufferPoolAdd extends AbstractAddStepHandler { @Override protected void populateModel(ModelNode operation, ModelNode model) throws OperationFailedException { for (AttributeDefinition attr : BufferPoolResourceDefinition.ATTRIBUTES) { attr.validateAndSet(operation, model); } } @Override protected void performRuntime(OperationContext context, ModelNode operation, ModelNode model, ServiceVerificationHandler verificationHandler, List<ServiceController<?>> newControllers) throws OperationFailedException { final PathAddress address = PathAddress.pathAddress(operation.get(OP_ADDR)); final String name = address.getLastElement().getValue(); int bufferSize = BUFFER_SIZE.resolveModelAttribute(context, model).asInt(); int bufferPerSlice = BUFFER_PER_SLICE.resolveModelAttribute(context, model).asInt(); final BufferPoolService service = new BufferPoolService(bufferSize, bufferPerSlice); final ServiceBuilder<Pool<ByteBuffer>> serviceBuilder = context.getServiceTarget().addService(UndertowService.BUFFER_POOL.append(name), service); serviceBuilder.setInitialMode(ServiceController.Mode.ACTIVE); final ServiceController<Pool<ByteBuffer>> serviceController = serviceBuilder.install(); if (newControllers != null) { newControllers.add(serviceController); } } } }