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