blob: ae932eef6c0b15480c24ef374a834708587e3f2b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache license, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the license for the specific language governing permissions and
* limitations under the license.
*/
package org.apache.logging.log4j.core.config.builder.impl;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.AbstractConfiguration;
import org.apache.logging.log4j.core.config.ConfigurationSource;
import org.apache.logging.log4j.core.config.ConfiguratonFileWatcher;
import org.apache.logging.log4j.core.config.Node;
import org.apache.logging.log4j.core.config.Reconfigurable;
import org.apache.logging.log4j.core.config.builder.api.Component;
import org.apache.logging.log4j.core.config.plugins.util.PluginManager;
import org.apache.logging.log4j.core.config.plugins.util.PluginType;
import org.apache.logging.log4j.core.config.plugins.util.ResolverUtil;
import org.apache.logging.log4j.core.config.status.StatusConfiguration;
import org.apache.logging.log4j.core.util.FileWatcher;
import org.apache.logging.log4j.core.util.Patterns;
/**
* This is the general version of the Configuration created by the Builder. It may be extended to
* enhance its functionality.
*
* @since 2.4
*/
public class BuiltConfiguration extends AbstractConfiguration {
private static final String[] VERBOSE_CLASSES = new String[] { ResolverUtil.class.getName() };
private final StatusConfiguration statusConfig;
protected Component rootComponent;
private Component loggersComponent;
private Component appendersComponent;
private Component filtersComponent;
private Component propertiesComponent;
private Component customLevelsComponent;
private Component scriptsComponent;
private String contentType = "text";
public BuiltConfiguration(final LoggerContext loggerContext, final ConfigurationSource source, final Component rootComponent) {
super(loggerContext, source);
statusConfig = new StatusConfiguration().withVerboseClasses(VERBOSE_CLASSES).withStatus(getDefaultStatus());
for (final Component component : rootComponent.getComponents()) {
switch (component.getPluginType()) {
case "Scripts": {
scriptsComponent = component;
break;
}
case "Loggers": {
loggersComponent = component;
break;
}
case "Appenders": {
appendersComponent = component;
break;
}
case "Filters": {
filtersComponent = component;
break;
}
case "Properties": {
propertiesComponent = component;
break;
}
case "CustomLevels": {
customLevelsComponent = component;
break;
}
}
}
this.rootComponent = rootComponent;
}
@Override
public void setup() {
final List<Node> children = rootNode.getChildren();
if (propertiesComponent.getComponents().size() > 0) {
children.add(convertToNode(rootNode, propertiesComponent));
}
if (scriptsComponent.getComponents().size() > 0) {
children.add(convertToNode(rootNode, scriptsComponent));
}
if (customLevelsComponent.getComponents().size() > 0) {
children.add(convertToNode(rootNode, customLevelsComponent));
}
children.add(convertToNode(rootNode, loggersComponent));
children.add(convertToNode(rootNode, appendersComponent));
if (filtersComponent.getComponents().size() > 0) {
if (filtersComponent.getComponents().size() == 1) {
children.add(convertToNode(rootNode, filtersComponent.getComponents().get(0)));
} else {
children.add(convertToNode(rootNode, filtersComponent));
}
}
rootComponent = null;
}
public String getContentType() {
return this.contentType;
}
public void setContentType(final String contentType) {
this.contentType = contentType;
}
public void createAdvertiser(final String advertiserString, final ConfigurationSource configSource) {
byte[] buffer = null;
try {
if (configSource != null) {
final InputStream is = configSource.getInputStream();
if (is != null) {
buffer = toByteArray(is);
}
}
} catch (final IOException ioe) {
LOGGER.warn("Unable to read configuration source " + configSource.toString());
}
super.createAdvertiser(advertiserString, configSource, buffer, contentType);
}
public StatusConfiguration getStatusConfiguration() {
return statusConfig;
}
public void setPluginPackages(final String packages) {
pluginPackages.addAll(Arrays.asList(packages.split(Patterns.COMMA_SEPARATOR)));
}
public void setShutdownHook(final String flag) {
isShutdownHookEnabled = !"disable".equalsIgnoreCase(flag);
}
public void setShutdownTimeoutMillis(final long shutdownTimeoutMillis) {
this.shutdownTimeoutMillis = shutdownTimeoutMillis;
}
public void setMonitorInterval(final int intervalSeconds) {
if (this instanceof Reconfigurable && intervalSeconds > 0) {
final ConfigurationSource configSource = getConfigurationSource();
if (configSource != null) {
final File configFile = configSource.getFile();
if (intervalSeconds > 0) {
getWatchManager().setIntervalSeconds(intervalSeconds);
if (configFile != null) {
final FileWatcher watcher = new ConfiguratonFileWatcher((Reconfigurable) this, listeners);
getWatchManager().watchFile(configFile, watcher);
}
}
}
}
}
@Override
public PluginManager getPluginManager() {
return pluginManager;
}
protected Node convertToNode(final Node parent, final Component component) {
final String name = component.getPluginType();
final PluginType<?> pluginType = pluginManager.getPluginType(name);
final Node node = new Node(parent, name, pluginType);
node.getAttributes().putAll(component.getAttributes());
node.setValue(component.getValue());
final List<Node> children = node.getChildren();
for (final Component child : component.getComponents()) {
children.add(convertToNode(node, child));
}
return node;
}
}