1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.core.appender.rolling.action;
18
19 import java.nio.file.FileSystem;
20 import java.nio.file.FileSystems;
21 import java.nio.file.Path;
22 import java.nio.file.PathMatcher;
23 import java.nio.file.attribute.BasicFileAttributes;
24 import java.util.Arrays;
25 import java.util.Collections;
26 import java.util.List;
27 import java.util.regex.Pattern;
28
29 import org.apache.logging.log4j.Logger;
30 import org.apache.logging.log4j.core.config.plugins.Plugin;
31 import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
32 import org.apache.logging.log4j.core.config.plugins.PluginElement;
33 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
34 import org.apache.logging.log4j.status.StatusLogger;
35
36
37
38
39
40
41
42
43
44 @Plugin(name = "IfFileName", category = "Core", printObject = true)
45 public final class IfFileName implements PathCondition {
46 private static final Logger LOGGER = StatusLogger.getLogger();
47 private final PathMatcher pathMatcher;
48 private final String syntaxAndPattern;
49 private final PathCondition[] nestedConditions;
50
51
52
53
54
55
56
57
58
59 private IfFileName(final String glob, final String regex, final PathCondition[] nestedConditions) {
60 if (regex == null && glob == null) {
61 throw new IllegalArgumentException("Specify either a path glob or a regular expression. "
62 + "Both cannot be null.");
63 }
64 this.syntaxAndPattern = createSyntaxAndPatternString(glob, regex);
65 this.pathMatcher = FileSystems.getDefault().getPathMatcher(syntaxAndPattern);
66 this.nestedConditions = nestedConditions == null ? new PathCondition[0] : Arrays.copyOf(nestedConditions,
67 nestedConditions.length);
68 }
69
70 static String createSyntaxAndPatternString(final String glob, final String regex) {
71 if (glob != null) {
72 return glob.startsWith("glob:") ? glob : "glob:" + glob;
73 }
74 return regex.startsWith("regex:") ? regex : "regex:" + regex;
75 }
76
77
78
79
80
81
82
83
84
85 public String getSyntaxAndPattern() {
86 return syntaxAndPattern;
87 }
88
89 public List<PathCondition> getNestedConditions() {
90 return Collections.unmodifiableList(Arrays.asList(nestedConditions));
91 }
92
93
94
95
96
97
98
99 @Override
100 public boolean accept(final Path basePath, final Path relativePath, final BasicFileAttributes attrs) {
101 final boolean result = pathMatcher.matches(relativePath);
102
103 final String match = result ? "matches" : "does not match";
104 final String accept = result ? "ACCEPTED" : "REJECTED";
105 LOGGER.trace("IfFileName {}: '{}' {} relative path '{}'", accept, syntaxAndPattern, match, relativePath);
106 if (result) {
107 return IfAll.accept(nestedConditions, basePath, relativePath, attrs);
108 }
109 return result;
110 }
111
112
113
114
115
116
117 @Override
118 public void beforeFileTreeWalk() {
119 IfAll.beforeFileTreeWalk(nestedConditions);
120 }
121
122
123
124
125
126
127
128
129
130
131
132
133
134 @PluginFactory
135 public static IfFileName createNameCondition(
136
137 @PluginAttribute("glob") final String glob,
138 @PluginAttribute("regex") final String regex,
139 @PluginElement("PathConditions") final PathCondition... nestedConditions) {
140
141 return new IfFileName(glob, regex, nestedConditions);
142 }
143
144 @Override
145 public String toString() {
146 final String nested = nestedConditions.length == 0 ? "" : " AND " + Arrays.toString(nestedConditions);
147 return "IfFileName(" + syntaxAndPattern + nested + ")";
148 }
149 }