package org.jboss.as.undertow;
import org.jboss.as.controller.AbstractAddStepHandler;
import org.jboss.as.controller.AbstractRemoveStepHandler;
import org.jboss.as.controller.AttributeDefinition;
import org.jboss.as.controller.OperationFailedException;
import org.jboss.as.controller.PathAddress;
import org.jboss.as.controller.PathElement;
import org.jboss.as.controller.ReloadRequiredWriteAttributeHandler;
import org.jboss.as.controller.SimplePersistentResourceDefinition;
import org.jboss.as.controller.descriptions.ModelDescriptionConstants;
import org.jboss.as.controller.registry.ManagementResourceRegistration;
import org.jboss.as.controller.registry.OperationEntry;
import org.jboss.dmr.ModelNode;
/**
* @author <a href="mailto:tomaz.cerar@redhat.com">Tomaz Cerar</a> (c) 2013 Red Hat Inc.
*/
public abstract class AbstractHandlerResourceDefinition extends SimplePersistentResourceDefinition implements Handler {
protected final String name;
protected AbstractHandlerResourceDefinition(final String name, AbstractAddStepHandler addHandler, AbstractRemoveStepHandler removeHandler) {
super(PathElement.pathElement(Constants.HANDLER, name), UndertowExtension.getResolver(Constants.HANDLER, name), addHandler, removeHandler);
this.name = name;
}
protected AbstractHandlerResourceDefinition(final String name) {
super(PathElement.pathElement(Constants.HANDLER, name), UndertowExtension.getResolver(Constants.HANDLER, name));
this.name = name;
}
@Override
public void registerOperations(ManagementResourceRegistration resourceRegistration) {
super.registerOperations(resourceRegistration);
if (resourceRegistration.getOperationEntry(PathAddress.EMPTY_ADDRESS, ModelDescriptionConstants.ADD) == null) {
registerAddOperation(resourceRegistration, new DefaultHandlerAdd(), OperationEntry.Flag.RESTART_RESOURCE_SERVICES);
}
if (resourceRegistration.getOperationEntry(PathAddress.EMPTY_ADDRESS, ModelDescriptionConstants.REMOVE) == null) {
registerRemoveOperation(resourceRegistration, new DefaultHandlerRemove(), OperationEntry.Flag.RESTART_RESOURCE_SERVICES);
}
}
@Override
public void registerAttributes(ManagementResourceRegistration resourceRegistration) {
super.registerAttributes(resourceRegistration);
ReloadRequiredWriteAttributeHandler writeHandler = new ReloadRequiredWriteAttributeHandler(getAttributes());
for (AttributeDefinition def : getAttributes()) {
resourceRegistration.registerReadWriteAttribute(def, null, writeHandler);
}
}
@Override
public String getName() {
return name;
}
@Override
public AttributeDefinition[] getAttributes() {
return new AttributeDefinition[0];
}
@Override
protected boolean useValueAsElementName() {
return true;
}
/*
protected Map<String, AttributeDefinition> getAttributeMap() {
Map<String, AttributeDefinition> res = new HashMap<>();
for (AttributeDefinition def : getAttributes()) {
res.put(def.getName(), def);
}
return res;
}
public void parse(final XMLExtendedStreamReader reader, PathAddress parentAddress, List<ModelNode> list) throws XMLStreamException {
PathAddress address = parentAddress.append(Constants.HANDLER, getName());
ModelNode op = Util.createAddOperation(address);
list.add(op);
Map<String, AttributeDefinition> attributes = getAttributeMap();
for (int i = 0; i < reader.getAttributeCount(); i++) {
String attributeName = reader.getAttributeLocalName(i);
if (attributes.containsKey(attributeName)) {
String value = reader.getAttributeValue(i);
AttributeDefinition def = attributes.get(attributeName);
if (def instanceof SimpleAttributeDefinition) {
((SimpleAttributeDefinition) def).parseAndSetParameter(value, op, reader);
} else {
throw new IllegalArgumentException("we should know how to handle " + def);
}
} else {
throw ParseUtils.unexpectedAttribute(reader, i);
}
}
ParseUtils.requireNoContent(reader);
}
@Override
public void persist(XMLExtendedStreamWriter writer, Property handler) throws XMLStreamException {
writer.writeStartElement(getName());
for (AttributeDefinition def : getAttributes()) {
def.getAttributeMarshaller().marshallAsAttribute(def, handler.getValue(), false, writer);
}
writer.writeEndElement();
}*/
protected class DefaultHandlerAdd extends AbstractAddStepHandler {
@Override
protected void populateModel(ModelNode operation, ModelNode model) throws OperationFailedException {
for (AttributeDefinition def : getAttributes()) {
def.validateAndSet(operation, model);
}
}
}
protected static class DefaultHandlerRemove extends AbstractRemoveStepHandler {
private DefaultHandlerRemove() {
}
}
}