| /* |
| * 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.appender.rolling.action; |
| |
| import java.nio.file.Path; |
| import java.util.List; |
| import java.util.Objects; |
| |
| import javax.script.SimpleBindings; |
| |
| import org.apache.logging.log4j.Logger; |
| import org.apache.logging.log4j.core.Core; |
| import org.apache.logging.log4j.core.config.Configuration; |
| import org.apache.logging.log4j.plugins.Plugin; |
| import org.apache.logging.log4j.core.config.plugins.PluginConfiguration; |
| import org.apache.logging.log4j.plugins.PluginElement; |
| import org.apache.logging.log4j.plugins.PluginFactory; |
| import org.apache.logging.log4j.core.script.AbstractScript; |
| import org.apache.logging.log4j.core.script.ScriptFile; |
| import org.apache.logging.log4j.core.script.ScriptRef; |
| import org.apache.logging.log4j.status.StatusLogger; |
| |
| /** |
| * A condition of the {@link DeleteAction} where a user-provided script selects the files to delete from a provided |
| * list. The specified script may be a {@link Script}, a {@link ScriptFile} or a {@link ScriptRef}. |
| * |
| * @see #createCondition(AbstractScript, Configuration) |
| */ |
| @Plugin(name = "ScriptCondition", category = Core.CATEGORY_NAME, printObject = true) |
| public class ScriptCondition { |
| private static final Logger LOGGER = StatusLogger.getLogger(); |
| |
| private final AbstractScript script; |
| private final Configuration configuration; |
| |
| /** |
| * Constructs a new ScriptCondition. |
| * |
| * @param script the script that can select files to delete |
| * @param configuration configuration containing the StrSubstitutor passed to the script |
| */ |
| public ScriptCondition(final AbstractScript script, final Configuration configuration) { |
| this.script = Objects.requireNonNull(script, "script"); |
| this.configuration = Objects.requireNonNull(configuration, "configuration"); |
| if (!(script instanceof ScriptRef)) { |
| configuration.getScriptManager().addScript(script); |
| } |
| } |
| |
| /** |
| * Executes the script |
| * |
| * @param baseDir |
| * @param candidates |
| * @return |
| */ |
| @SuppressWarnings("unchecked") |
| public List<PathWithAttributes> selectFilesToDelete(final Path basePath, final List<PathWithAttributes> candidates) { |
| final SimpleBindings bindings = new SimpleBindings(); |
| bindings.put("basePath", basePath); |
| bindings.put("pathList", candidates); |
| bindings.putAll(configuration.getProperties()); |
| bindings.put("configuration", configuration); |
| bindings.put("substitutor", configuration.getStrSubstitutor()); |
| bindings.put("statusLogger", LOGGER); |
| final Object object = configuration.getScriptManager().execute(script.getName(), bindings); |
| return (List<PathWithAttributes>) object; |
| } |
| |
| /** |
| * Creates the ScriptCondition. |
| * |
| * @param script The script to run. This may be a {@link Script}, a {@link ScriptFile} or a {@link ScriptRef}. The |
| * script must return a {@code List<PathWithAttributes>}. When the script is executed, it is provided the |
| * following bindings: |
| * <ul> |
| * <li>basePath - the directory from where the {@link DeleteAction Delete} action started scanning for |
| * files to delete. Can be used to relativize the paths in the pathList.</li> |
| * <li>pathList - a {@code java.util.List} containing {@link PathWithAttribute} objects. (The script is |
| * free to modify and return this list.)</li> |
| * <li>substitutor - a {@link StrSubstitutor} that can be used to look up variables embedded in the base |
| * dir or other properties |
| * <li>statusLogger - the {@link StatusLogger} that can be used to log events during script execution |
| * <li>any properties declared in the configuration</li> |
| * </ul> |
| * @param configuration the configuration |
| * @return A ScriptCondition. |
| */ |
| @PluginFactory |
| public static ScriptCondition createCondition(@PluginElement("Script") final AbstractScript script, |
| @PluginConfiguration final Configuration configuration) { |
| |
| if (script == null) { |
| LOGGER.error("A Script, ScriptFile or ScriptRef element must be provided for this ScriptCondition"); |
| return null; |
| } |
| if (script instanceof ScriptRef) { |
| if (configuration.getScriptManager().getScript(script.getName()) == null) { |
| LOGGER.error("ScriptCondition: No script with name {} has been declared.", script.getName()); |
| return null; |
| } |
| } |
| return new ScriptCondition(script, configuration); |
| } |
| } |