1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.logging.log4j.core.appender.rolling.action;
19
20 import java.nio.file.Path;
21 import java.util.List;
22 import java.util.Objects;
23
24 import javax.script.SimpleBindings;
25
26 import org.apache.logging.log4j.Logger;
27 import org.apache.logging.log4j.core.Core;
28 import org.apache.logging.log4j.core.config.Configuration;
29 import org.apache.logging.log4j.core.config.plugins.Plugin;
30 import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
31 import org.apache.logging.log4j.core.config.plugins.PluginElement;
32 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
33 import org.apache.logging.log4j.core.script.AbstractScript;
34 import org.apache.logging.log4j.core.script.ScriptFile;
35 import org.apache.logging.log4j.core.script.ScriptRef;
36 import org.apache.logging.log4j.status.StatusLogger;
37
38
39
40
41
42
43
44 @Plugin(name = "ScriptCondition", category = Core.CATEGORY_NAME, printObject = true)
45 public class ScriptCondition {
46 private static Logger LOGGER = StatusLogger.getLogger();
47
48 private final AbstractScript script;
49 private final Configuration configuration;
50
51
52
53
54
55
56
57 public ScriptCondition(final AbstractScript script, final Configuration configuration) {
58 this.script = Objects.requireNonNull(script, "script");
59 this.configuration = Objects.requireNonNull(configuration, "configuration");
60 if (!(script instanceof ScriptRef)) {
61 configuration.getScriptManager().addScript(script);
62 }
63 }
64
65
66
67
68
69
70
71
72 @SuppressWarnings("unchecked")
73 public List<PathWithAttributes> selectFilesToDelete(final Path basePath, final List<PathWithAttributes> candidates) {
74 final SimpleBindings bindings = new SimpleBindings();
75 bindings.put("basePath", basePath);
76 bindings.put("pathList", candidates);
77 bindings.putAll(configuration.getProperties());
78 bindings.put("configuration", configuration);
79 bindings.put("substitutor", configuration.getStrSubstitutor());
80 bindings.put("statusLogger", LOGGER);
81 final Object object = configuration.getScriptManager().execute(script.getName(), bindings);
82 return (List<PathWithAttributes>) object;
83 }
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104 @PluginFactory
105 public static ScriptCondition createCondition(@PluginElement("Script") final AbstractScript script,
106 @PluginConfiguration final Configuration configuration) {
107
108 if (script == null) {
109 LOGGER.error("A Script, ScriptFile or ScriptRef element must be provided for this ScriptCondition");
110 return null;
111 }
112 if (script instanceof ScriptRef) {
113 if (configuration.getScriptManager().getScript(script.getName()) == null) {
114 LOGGER.error("ScriptCondition: No script with name {} has been declared.", script.getName());
115 return null;
116 }
117 }
118 return new ScriptCondition(script, configuration);
119 }
120 }