/* * JBoss, Home of Professional Open Source. * Copyright 2015, 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.deployments.resources; import java.util.Collection; import org.jboss.as.controller.PathAddress; import org.jboss.as.controller.PathElement; import org.jboss.as.controller.ResourceDefinition; import org.jboss.as.controller.SimpleAttributeDefinition; import org.jboss.as.controller.SimpleAttributeDefinitionBuilder; import org.jboss.as.controller.SimpleMapAttributeDefinition; import org.jboss.as.controller.SimpleResourceDefinition; import org.jboss.as.controller.registry.ManagementResourceRegistration; import org.jboss.as.logging.LoggingExtension; import org.jboss.as.logging.RootLoggerResourceDefinition; import org.jboss.as.logging.deployments.LoggingConfigurationService; import org.jboss.as.server.deployment.DeploymentResourceSupport; import org.jboss.dmr.ModelNode; import org.jboss.dmr.ModelType; import org.jboss.logmanager.config.LogContextConfiguration; import org.jboss.logmanager.config.ObjectConfigurable; import org.jboss.logmanager.config.PropertyConfigurable; /** * @author <a href="mailto:jperkins@redhat.com">James R. Perkins</a> */ public class LoggingDeploymentResources { public static final SimpleResourceDefinition CONFIGURATION = new SimpleResourceDefinition(new SimpleResourceDefinition.Parameters(PathElement.pathElement("configuration"), LoggingExtension.getResourceDescriptionResolver("deployment")).setRuntime()); public static final SimpleResourceDefinition HANDLER = new HandlerResourceDefinition(); public static final SimpleResourceDefinition LOGGER = new LoggerResourceDefinition(); public static final SimpleResourceDefinition FORMATTER = new PropertiesResourceDefinition("formatter") { @Override protected PropertyConfigurable getPropertyConfigurable(final LogContextConfiguration logContextConfiguration, final String name) { return logContextConfiguration.getFormatterConfiguration(name); } @Override protected ObjectConfigurable getObjectConfigurable(final LogContextConfiguration logContextConfiguration, final String name) { return logContextConfiguration.getFormatterConfiguration(name); } }; public static final SimpleResourceDefinition FILTER = new PropertiesResourceDefinition("filter") { @Override protected PropertyConfigurable getPropertyConfigurable(final LogContextConfiguration logContextConfiguration, final String name) { return logContextConfiguration.getFilterConfiguration(name); } @Override protected ObjectConfigurable getObjectConfigurable(final LogContextConfiguration logContextConfiguration, final String name) { return logContextConfiguration.getFilterConfiguration(name); } }; public static final SimpleResourceDefinition POJO = new PropertiesResourceDefinition("pojo") { @Override protected PropertyConfigurable getPropertyConfigurable(final LogContextConfiguration logContextConfiguration, final String name) { return logContextConfiguration.getPojoConfiguration(name); } @Override protected ObjectConfigurable getObjectConfigurable(final LogContextConfiguration logContextConfiguration, final String name) { return logContextConfiguration.getPojoConfiguration(name); } }; public static final SimpleResourceDefinition ERROR_MANAGER = new PropertiesResourceDefinition("error-manager") { @Override protected PropertyConfigurable getPropertyConfigurable(final LogContextConfiguration logContextConfiguration, final String name) { return logContextConfiguration.getErrorManagerConfiguration(name); } @Override protected ObjectConfigurable getObjectConfigurable(final LogContextConfiguration logContextConfiguration, final String name) { return logContextConfiguration.getErrorManagerConfiguration(name); } }; /** * Registers the deployment resources needed. * * @param deploymentResourceSupport the deployment resource support * @param service the service, which may be {@code null}, used to find the resource names that need to be registered */ public static void registerDeploymentResource(final DeploymentResourceSupport deploymentResourceSupport, final LoggingConfigurationService service) { final PathElement base = PathElement.pathElement("configuration", service.getConfiguration()); deploymentResourceSupport.getDeploymentSubModel(LoggingExtension.SUBSYSTEM_NAME, base); final LogContextConfiguration configuration = service.getValue(); // Register the child resources if the configuration is not null in cases where a log4j configuration was used if (configuration != null) { registerDeploymentResource(deploymentResourceSupport, base, HANDLER, configuration.getHandlerNames()); registerDeploymentResource(deploymentResourceSupport, base, LOGGER, configuration.getLoggerNames()); registerDeploymentResource(deploymentResourceSupport, base, FORMATTER, configuration.getFormatterNames()); registerDeploymentResource(deploymentResourceSupport, base, FILTER, configuration.getFilterNames()); registerDeploymentResource(deploymentResourceSupport, base, POJO, configuration.getPojoNames()); registerDeploymentResource(deploymentResourceSupport, base, ERROR_MANAGER, configuration.getErrorManagerNames()); } } private static void registerDeploymentResource(final DeploymentResourceSupport deploymentResourceSupport, final PathElement base, final ResourceDefinition def, final Collection<String> names) { for (String name : names) { // Replace any blank values with the default root-logger name; this should only happen on loggers final String resourceName = name.isEmpty() ? RootLoggerResourceDefinition.ROOT_LOGGER_ATTRIBUTE_NAME : name; final PathAddress address = PathAddress.pathAddress(base, PathElement.pathElement(def.getPathElement().getKey(), resourceName)); deploymentResourceSupport.getDeploymentSubModel(LoggingExtension.SUBSYSTEM_NAME, address); } } private abstract static class PropertiesResourceDefinition extends SimpleResourceDefinition { static final SimpleAttributeDefinition CLASS_NAME = SimpleAttributeDefinitionBuilder.create("class-name", ModelType.STRING) .setStorageRuntime() .build(); static final SimpleAttributeDefinition MODULE = SimpleAttributeDefinitionBuilder.create("module", ModelType.STRING, true) .setStorageRuntime() .build(); static final SimpleMapAttributeDefinition PROPERTIES = new SimpleMapAttributeDefinition.Builder("properties", ModelType.STRING, true) .setStorageRuntime() .build(); public PropertiesResourceDefinition(final String name) { super(new Parameters(PathElement.pathElement(name), LoggingExtension.getResourceDescriptionResolver("deployment", name)).setRuntime()); } @Override public void registerAttributes(final ManagementResourceRegistration resourceRegistration) { resourceRegistration.registerReadOnlyAttribute(CLASS_NAME, new LoggingConfigurationReadStepHandler() { @Override protected void updateModel(final LogContextConfiguration logContextConfiguration, final String name, final ModelNode model) { final ObjectConfigurable configuration = getObjectConfigurable(logContextConfiguration, name); setModelValue(model, configuration.getClassName()); } }); resourceRegistration.registerReadOnlyAttribute(MODULE, new LoggingConfigurationReadStepHandler() { @Override protected void updateModel(final LogContextConfiguration logContextConfiguration, final String name, final ModelNode model) { final ObjectConfigurable configuration = getObjectConfigurable(logContextConfiguration, name); setModelValue(model, configuration.getModuleName()); } }); resourceRegistration.registerReadOnlyAttribute(PROPERTIES, new LoggingConfigurationReadStepHandler() { @Override protected void updateModel(final LogContextConfiguration logContextConfiguration, final String name, final ModelNode model) { final PropertyConfigurable configuration = getPropertyConfigurable(logContextConfiguration, name); addProperties(configuration, model); } }); } protected abstract PropertyConfigurable getPropertyConfigurable(LogContextConfiguration logContextConfiguration, String name); protected abstract ObjectConfigurable getObjectConfigurable(LogContextConfiguration logContextConfiguration, String name); } }