[IO-634] Make getCause synchronized and use a Deque instead of Stack (#64)
* Fix "Non-synchronized override of synchronized method".
* Replace synchronized Stack with unsynchronized Deque in FilenameUtils.
diff --git a/src/main/java/org/apache/commons/io/FilenameUtils.java b/src/main/java/org/apache/commons/io/FilenameUtils.java
index 81d27df..cf7c7cf 100644
--- a/src/main/java/org/apache/commons/io/FilenameUtils.java
+++ b/src/main/java/org/apache/commons/io/FilenameUtils.java
@@ -18,11 +18,12 @@
import java.io.File;
import java.io.IOException;
+import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
+import java.util.Deque;
import java.util.List;
-import java.util.Stack;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -1385,11 +1386,11 @@ public static boolean wildcardMatch(final String fileName, final String wildcard
boolean anyChars = false;
int textIdx = 0;
int wcsIdx = 0;
- final Stack<int[]> backtrack = new Stack<>();
+ final Deque<int[]> backtrack = new ArrayDeque<>(wcs.length);
// loop around a backtrack stack, to handle complex * matching
do {
- if (backtrack.size() > 0) {
+ if (!backtrack.isEmpty()) {
final int[] array = backtrack.pop();
wcsIdx = array[0];
textIdx = array[1];
@@ -1448,7 +1449,7 @@ public static boolean wildcardMatch(final String fileName, final String wildcard
return true;
}
- } while (backtrack.size() > 0);
+ } while (!backtrack.isEmpty());
return false;
}
diff --git a/src/main/java/org/apache/commons/io/TaggedIOException.java b/src/main/java/org/apache/commons/io/TaggedIOException.java
index afa66cb..5c6f0f4 100644
--- a/src/main/java/org/apache/commons/io/TaggedIOException.java
+++ b/src/main/java/org/apache/commons/io/TaggedIOException.java
@@ -129,7 +129,7 @@ public Serializable getTag() {
* @return wrapped exception
*/
@Override
- public IOException getCause() {
+ public synchronized IOException getCause() {
return (IOException) super.getCause();
}