/*
* JBoss, Home of Professional Open Source.
* Copyright 2010, 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.logging;
import static org.jboss.as.controller.services.path.PathResourceDefinition.PATH;
import static org.jboss.as.controller.services.path.PathResourceDefinition.RELATIVE_TO;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
import org.jboss.as.controller.AttributeDefinition;
import org.jboss.as.controller.CaseParameterCorrector;
import org.jboss.as.controller.DefaultAttributeMarshaller;
import org.jboss.as.controller.ModelVersion;
import org.jboss.as.controller.ObjectTypeAttributeDefinition;
import org.jboss.as.controller.OperationFailedException;
import org.jboss.as.controller.SimpleAttributeDefinition;
import org.jboss.as.controller.SimpleAttributeDefinitionBuilder;
import org.jboss.as.controller.SimpleMapAttributeDefinition;
import org.jboss.as.controller.operations.validation.ObjectTypeValidator;
import org.jboss.as.controller.registry.AttributeAccess.Flag;
import org.jboss.as.logging.correctors.FileCorrector;
import org.jboss.as.logging.resolvers.FileResolver;
import org.jboss.as.logging.resolvers.LevelResolver;
import org.jboss.as.logging.validators.FileValidator;
import org.jboss.as.logging.validators.LogLevelValidator;
import org.jboss.dmr.ModelNode;
import org.jboss.dmr.ModelType;
import org.jboss.logmanager.Level;
/**
* @author Emanuel Muckenhuber
*/
public interface CommonAttributes {
// Attributes
PropertyAttributeDefinition APPEND = PropertyAttributeDefinition.Builder.of("append", ModelType.BOOLEAN, true)
.setAllowExpression(true)
.setAttributeMarshaller(ElementAttributeMarshaller.VALUE_ATTRIBUTE_MARSHALLER)
.setDefaultValue(new ModelNode(true))
.build();
PropertyAttributeDefinition AUTOFLUSH = PropertyAttributeDefinition.Builder.of("autoflush", ModelType.BOOLEAN, true)
.setAllowExpression(true)
.setDefaultValue(new ModelNode(true))
.setPropertyName("autoFlush")
.build();
SimpleAttributeDefinition CLASS = SimpleAttributeDefinitionBuilder.create("class", ModelType.STRING)
.setAllowExpression(false)
.setFlags(Flag.RESTART_RESOURCE_SERVICES)
.build();
PropertyAttributeDefinition ENABLED = PropertyAttributeDefinition.Builder.of("enabled", ModelType.BOOLEAN, true)
.setAllowExpression(true)
.setDefaultValue(new ModelNode(true))
.build();
PropertyAttributeDefinition ENCODING = PropertyAttributeDefinition.Builder.of("encoding", ModelType.STRING, true)
.setAllowExpression(true)
.setAttributeMarshaller(ElementAttributeMarshaller.VALUE_ATTRIBUTE_MARSHALLER)
.build();
PropertyObjectTypeAttributeDefinition FILE = PropertyObjectTypeAttributeDefinition.Builder.of("file", RELATIVE_TO, PATH)
.setAllowExpression(false)
.setAllowNull(false)
.setAttributeMarshaller(new DefaultAttributeMarshaller() {
@Override
public void marshallAsElement(final AttributeDefinition attribute, final ModelNode resourceModel, final boolean marshallDefault, final XMLStreamWriter writer) throws XMLStreamException {
if (isMarshallable(attribute, resourceModel, marshallDefault)) {
writer.writeStartElement(attribute.getXmlName());
final ModelNode file = resourceModel.get(attribute.getName());
RELATIVE_TO.marshallAsAttribute(file, marshallDefault, writer);
PATH.marshallAsAttribute(file, marshallDefault, writer);
writer.writeEndElement();
}
}
})
.setCorrector(FileCorrector.INSTANCE)
.setPropertyName("fileName")
.setResolver(FileResolver.INSTANCE)
.setValidator(new FileValidator())
.build();
PropertyAttributeDefinition FILTER_SPEC = PropertyAttributeDefinition.Builder.of("filter-spec", ModelType.STRING, true)
.addAlternatives("filter")
.setAllowExpression(true)
.setAttributeMarshaller(ElementAttributeMarshaller.VALUE_ATTRIBUTE_MARSHALLER)
.build();
SimpleAttributeDefinition HANDLER = SimpleAttributeDefinitionBuilder.create("handler", ModelType.STRING)
.setAllowExpression(false)
.setAttributeMarshaller(ElementAttributeMarshaller.NAME_ATTRIBUTE_MARSHALLER)
.build();
LogHandlerListAttributeDefinition HANDLERS = LogHandlerListAttributeDefinition.Builder.of("handlers")
.setAllowExpression(false)
.setAllowNull(true)
.build();
SimpleAttributeDefinition HANDLER_NAME = SimpleAttributeDefinitionBuilder.create("name", ModelType.STRING, true).build();
// JUL doesn't allow for null levels. Use ALL as the default
PropertyAttributeDefinition LEVEL = PropertyAttributeDefinition.Builder.of("level", ModelType.STRING, true)
.setAllowExpression(true)
.setAttributeMarshaller(ElementAttributeMarshaller.NAME_ATTRIBUTE_MARSHALLER)
.setCorrector(CaseParameterCorrector.TO_UPPER)
.setDefaultValue(new ModelNode(Level.ALL.getName()))
.setResolver(LevelResolver.INSTANCE)
.setValidator(new LogLevelValidator(true))
.build();
String LOGGING_PROFILE = "logging-profile";
String LOGGING_PROFILES = "logging-profiles";
SimpleAttributeDefinition MODULE = SimpleAttributeDefinitionBuilder.create("module", ModelType.STRING)
.setAllowExpression(false)
.setFlags(Flag.RESTART_RESOURCE_SERVICES)
.build();
SimpleAttributeDefinition NAME = SimpleAttributeDefinitionBuilder.create("name", ModelType.STRING, true)
.setAllowExpression(false)
.setDeprecated(ModelVersion.create(1, 2, 0))
.build();
SimpleMapAttributeDefinition PROPERTIES = new SimpleMapAttributeDefinition.Builder("properties", true)
.setAllowExpression(true)
.setAttributeMarshaller(new DefaultAttributeMarshaller() {
@Override
public void marshallAsElement(AttributeDefinition attribute, ModelNode resourceModel, boolean marshallDefault, XMLStreamWriter writer) throws XMLStreamException {
resourceModel = resourceModel.get(attribute.getName());
if (resourceModel.isDefined()) {
writer.writeStartElement(attribute.getName());
for (ModelNode property : resourceModel.asList()) {
writer.writeEmptyElement(Element.PROPERTY.getLocalName());
writer.writeAttribute("name", property.asProperty().getName());
writer.writeAttribute("value", property.asProperty().getValue().asString());
}
writer.writeEndElement();
}
}
})
.build();
/**
* The name of the root logger.
*/
String ROOT_LOGGER_NAME = "";
// Legacy Filter attributes
SimpleAttributeDefinition ACCEPT = SimpleAttributeDefinitionBuilder.create("accept", ModelType.BOOLEAN, true)
.setAllowExpression(false)
.setDefaultValue(new ModelNode(true))
.build();
SimpleAttributeDefinition CHANGE_LEVEL = SimpleAttributeDefinitionBuilder.create("change-level", ModelType.STRING, true)
.setAllowExpression(false)
.setCorrector(CaseParameterCorrector.TO_UPPER)
.setValidator(new LogLevelValidator(true))
.build();
SimpleAttributeDefinition DENY = SimpleAttributeDefinitionBuilder.create("deny", ModelType.BOOLEAN, true)
.setAllowExpression(false)
.setDefaultValue(new ModelNode(true))
.build();
SimpleAttributeDefinition FILTER_PATTERN = SimpleAttributeDefinitionBuilder.create("pattern", ModelType.STRING)
.setAllowExpression(false)
.build();
SimpleAttributeDefinition MATCH = SimpleAttributeDefinitionBuilder.create("match", ModelType.STRING, true)
.setAllowExpression(false)
.build();
SimpleAttributeDefinition MAX_INCLUSIVE = SimpleAttributeDefinitionBuilder.create("max-inclusive", ModelType.BOOLEAN, true)
.setAllowExpression(false)
.setDefaultValue(new ModelNode(true))
.build();
SimpleAttributeDefinition MAX_LEVEL = SimpleAttributeDefinitionBuilder.create("max-level", ModelType.STRING)
.setAllowExpression(false)
.setCorrector(CaseParameterCorrector.TO_UPPER)
.setValidator(new LogLevelValidator(true))
.build();
SimpleAttributeDefinition MIN_INCLUSIVE = SimpleAttributeDefinitionBuilder.create("min-inclusive", ModelType.BOOLEAN, true)
.setAllowExpression(false)
.setDefaultValue(new ModelNode(true))
.build();
SimpleAttributeDefinition MIN_LEVEL = SimpleAttributeDefinitionBuilder.create("min-level", ModelType.STRING)
.setAllowExpression(false)
.setCorrector(CaseParameterCorrector.TO_UPPER)
.setValidator(new LogLevelValidator(true))
.build();
SimpleAttributeDefinition NEW_LEVEL = SimpleAttributeDefinitionBuilder.create("new-level", ModelType.STRING)
.setAllowExpression(false)
.setCorrector(CaseParameterCorrector.TO_UPPER)
.setValidator(new LogLevelValidator(true))
.build();
SimpleAttributeDefinition REPLACEMENT = SimpleAttributeDefinitionBuilder.create("replacement", ModelType.STRING)
.setAllowExpression(false)
.build();
SimpleAttributeDefinition REPLACE_ALL = SimpleAttributeDefinitionBuilder.create("replace-all", ModelType.BOOLEAN, true)
.setAllowExpression(false)
.setDefaultValue(new ModelNode(true))
.build();
ObjectTypeAttributeDefinition LEVEL_RANGE_LEGACY = ObjectTypeAttributeDefinition.Builder.of("level-range", MIN_LEVEL, MIN_INCLUSIVE, MAX_LEVEL, MAX_INCLUSIVE)
.setAllowExpression(false)
.setAllowNull(true)
.setValidator(new ObjectTypeValidator(false, MIN_LEVEL, MIN_INCLUSIVE, MAX_LEVEL, MAX_INCLUSIVE) {
@Override
public void validateParameter(final String parameterName, final ModelNode value) throws OperationFailedException {
super.validateParameter(parameterName, value);
final ModelNode clonedValue = value.clone();
final AttributeDefinition[] allowedValues = {MIN_LEVEL, MIN_INCLUSIVE, MAX_LEVEL, MAX_INCLUSIVE};
for (AttributeDefinition valueType : allowedValues) {
final ModelNode syntheticValue;
// Does the value the type
if (clonedValue.has(valueType.getName())) {
syntheticValue = clonedValue.get(valueType.getName());
} else if (valueType.getDefaultValue() != null) {
// Use the default value
syntheticValue = valueType.getDefaultValue();
} else {
// Use an undefined value
syntheticValue = new ModelNode();
}
valueType.getValidator().validateParameter(valueType.getName(), syntheticValue);
}
}
})
.build();
ObjectTypeAttributeDefinition REPLACE = ObjectTypeAttributeDefinition.Builder.of("replace", FILTER_PATTERN, REPLACEMENT, REPLACE_ALL)
.setAllowExpression(false)
.setAllowNull(true)
.setValidator(new ObjectTypeValidator(false, FILTER_PATTERN, REPLACEMENT, REPLACE_ALL) {
@Override
public void validateParameter(final String parameterName, final ModelNode value) throws OperationFailedException {
super.validateParameter(parameterName, value);
final ModelNode clonedValue = value.clone();
final AttributeDefinition[] allowedValues = {FILTER_PATTERN, REPLACEMENT, REPLACE_ALL};
for (AttributeDefinition valueType : allowedValues) {
final ModelNode syntheticValue;
// Does the value the type
if (clonedValue.has(valueType.getName())) {
syntheticValue = clonedValue.get(valueType.getName());
} else if (valueType.getDefaultValue() != null) {
// Use the default value
syntheticValue = valueType.getDefaultValue();
} else {
// Use an undefined value
syntheticValue = new ModelNode();
}
valueType.getValidator().validateParameter(valueType.getName(), syntheticValue);
}
}
})
.build();
ObjectTypeAttributeDefinition NOT = ObjectTypeAttributeDefinition.Builder.of("not", ACCEPT, CHANGE_LEVEL, DENY, LEVEL, LEVEL_RANGE_LEGACY, MATCH, REPLACE)
.setAllowExpression(false)
.setAllowNull(true)
.build();
ObjectTypeAttributeDefinition ALL = ObjectTypeAttributeDefinition.Builder.of("all", ACCEPT, CHANGE_LEVEL, DENY, LEVEL, LEVEL_RANGE_LEGACY, MATCH, NOT, REPLACE)
.setAllowExpression(false)
.setAllowNull(true)
.build();
ObjectTypeAttributeDefinition ANY = ObjectTypeAttributeDefinition.Builder.of("any", ACCEPT, CHANGE_LEVEL, DENY, LEVEL, LEVEL_RANGE_LEGACY, MATCH, NOT, REPLACE)
.setAllowExpression(false)
.setAllowNull(true)
.build();
ObjectTypeAttributeDefinition FILTER = ObjectTypeAttributeDefinition.Builder.of("filter", ALL, ANY, ACCEPT, CHANGE_LEVEL, DENY, LEVEL, LEVEL_RANGE_LEGACY, MATCH, NOT, REPLACE)
.setAllowExpression(false)
.addAlternatives(FILTER_SPEC.getName())
.setDeprecated(ModelVersion.create(1, 2, 0))
.setAllowNull(true)
.build();
String ADD_HANDLER_OPERATION_NAME = "add-handler";
String REMOVE_HANDLER_OPERATION_NAME = "remove-handler";
}