You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by rp...@apache.org on 2015/11/26 15:56:09 UTC
[50/50] logging-log4j2 git commit: LOG4J2-435 sort paths before
executing the filtered Delete action
LOG4J2-435 sort paths before executing the filtered Delete action
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/97e22a7f
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/97e22a7f
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/97e22a7f
Branch: refs/heads/LOG4J2-435-delete-on-rollover
Commit: 97e22a7f496410bddd3390c4c879f9eae51fe5ed
Parents: 4c8d8a1
Author: rpopma <rp...@apache.org>
Authored: Thu Nov 26 23:55:06 2015 +0900
Committer: rpopma <rp...@apache.org>
Committed: Thu Nov 26 23:55:06 2015 +0900
----------------------------------------------------------------------
.../appender/rolling/action/DeleteAction.java | 50 ++++++++++++++++++--
.../rolling/action/DeleteActionTest.java | 2 +-
2 files changed, 47 insertions(+), 5 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/97e22a7f/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/DeleteAction.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/DeleteAction.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/DeleteAction.java
index 3fb625d..3abaae7 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/DeleteAction.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/DeleteAction.java
@@ -17,9 +17,11 @@
package org.apache.logging.log4j.core.appender.rolling.action;
+import java.io.IOException;
import java.nio.file.FileVisitor;
import java.nio.file.Path;
import java.util.List;
+import java.util.Objects;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.plugins.Plugin;
@@ -35,6 +37,8 @@ import org.apache.logging.log4j.core.lookup.StrSubstitutor;
@Plugin(name = "Delete", category = "Core", printObject = true)
public class DeleteAction extends AbstractPathAction {
+ private PathSorter pathSorter;
+
/**
* Creates a new DeleteAction that starts scanning for files to delete from the specified base path.
*
@@ -43,12 +47,47 @@ public class DeleteAction extends AbstractPathAction {
* @param maxDepth The maxDepth parameter is the maximum number of levels of directories to visit. A value of 0
* means that only the starting file is visited, unless denied by the security manager. A value of
* MAX_VALUE may be used to indicate that all levels should be visited.
+ * @param sorter sorts
* @param pathFilters an array of path filters (if more than one, they all need to accept a path before it is
* deleted).
*/
- DeleteAction(final String basePath, final boolean followSymbolicLinks, final int maxDepth,
+ DeleteAction(final String basePath, final boolean followSymbolicLinks, final int maxDepth, final PathSorter sorter,
final PathCondition[] pathFilters, final StrSubstitutor subst) {
super(basePath, followSymbolicLinks, maxDepth, pathFilters, subst);
+ this.pathSorter = Objects.requireNonNull(sorter, "sorter");
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.apache.logging.log4j.core.appender.rolling.action.AbstractPathAction#execute(FileVisitor)
+ */
+ @Override
+ public boolean execute(final FileVisitor<Path> visitor) throws IOException {
+ final List<PathWithAttributes> sortedPaths = getSortedPaths();
+
+ for (PathWithAttributes element : sortedPaths) {
+ try {
+ visitor.visitFile(element.getPath(), element.getAttributes());
+ } catch (final IOException ioex) {
+ visitor.visitFileFailed(element.getPath(), ioex);
+ }
+ }
+ // TODO return (visitor.success || ignoreProcessingFailure)
+ return true; // do not abort rollover even if processing failed
+ }
+
+ /**
+ * Returns a sorted list of all files up to maxDepth under the basePath.
+ *
+ * @return a sorted list of files
+ * @throws IOException
+ */
+ List<PathWithAttributes> getSortedPaths() throws IOException {
+ final SortingVisitor sort = new SortingVisitor(pathSorter);
+ super.execute(sort);
+ final List<PathWithAttributes> sortedPaths = sort.getSortedPaths();
+ return sortedPaths;
}
@Override
@@ -64,7 +103,8 @@ public class DeleteAction extends AbstractPathAction {
* @param maxDepth The maxDepth parameter is the maximum number of levels of directories to visit. A value of 0
* means that only the starting file is visited, unless denied by the security manager. A value of
* MAX_VALUE may be used to indicate that all levels should be visited.
- * @param pathFilters an array of path filters (if more than one, they all need to accept a path before it is
+ * @param PathSorter a plugin implementing the {@link PathSorter} interface
+ * @param PathConditions an array of path conditions (if more than one, they all need to accept a path before it is
* deleted).
* @param config The Configuration.
* @return A DeleteAction.
@@ -75,9 +115,11 @@ public class DeleteAction extends AbstractPathAction {
@PluginAttribute("basePath") final String basePath, //
@PluginAttribute(value = "followLinks", defaultBoolean = false) final boolean followLinks,
@PluginAttribute(value = "maxDepth", defaultInt = 1) final int maxDepth,
- @PluginElement("PathFilters") final PathCondition[] pathFilters,
+ @PluginElement("PathSorter") final PathSorter sorterParameter,
+ @PluginElement("PathConditions") final PathCondition[] pathConditions,
@PluginConfiguration final Configuration config) {
// @formatter:on
- return new DeleteAction(basePath, followLinks, maxDepth, pathFilters, config.getStrSubstitutor());
+ final PathSorter sorter = sorterParameter == null ? new PathSortByModificationTime(true) : sorterParameter;
+ return new DeleteAction(basePath, followLinks, maxDepth, sorter, pathConditions, config.getStrSubstitutor());
}
}
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/97e22a7f/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/action/DeleteActionTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/action/DeleteActionTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/action/DeleteActionTest.java
index 5b9aa1e..8793732 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/action/DeleteActionTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/action/DeleteActionTest.java
@@ -46,7 +46,7 @@ public class DeleteActionTest {
private static DeleteAction create(String path, boolean followLinks, int maxDepth, PathCondition[] filters) {
Configuration config = new BasicConfigurationFactory().new BasicConfiguration();
- DeleteAction delete = DeleteAction.createDeleteAction(path, followLinks, maxDepth, filters, config);
+ DeleteAction delete = DeleteAction.createDeleteAction(path, followLinks, maxDepth, null, filters, config);
return delete;
}