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