You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by bo...@apache.org on 2014/01/25 07:46:11 UTC
svn commit: r1561268 -
/commons/proper/compress/branches/compress-2.0/src/main/java/org/apache/commons/compress2/archivers/Archivers.java
Author: bodewig
Date: Sat Jan 25 06:46:10 2014
New Revision: 1561268
URL: http://svn.apache.org/r1561268
Log:
internally sort archives found in a way that during auto-detection the formats requiring less bytes come first
Modified:
commons/proper/compress/branches/compress-2.0/src/main/java/org/apache/commons/compress2/archivers/Archivers.java
Modified: commons/proper/compress/branches/compress-2.0/src/main/java/org/apache/commons/compress2/archivers/Archivers.java
URL: http://svn.apache.org/viewvc/commons/proper/compress/branches/compress-2.0/src/main/java/org/apache/commons/compress2/archivers/Archivers.java?rev=1561268&r1=1561267&r2=1561268&view=diff
==============================================================================
--- commons/proper/compress/branches/compress-2.0/src/main/java/org/apache/commons/compress2/archivers/Archivers.java (original)
+++ commons/proper/compress/branches/compress-2.0/src/main/java/org/apache/commons/compress2/archivers/Archivers.java Sat Jan 25 06:46:10 2014
@@ -18,13 +18,18 @@
*/
package org.apache.commons.compress2.archivers;
+import java.util.ArrayList;
import java.util.Collections;
-import java.util.HashMap;
+import java.util.Comparator;
import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.ServiceConfigurationError;
import java.util.ServiceLoader;
+import java.util.Set;
+import java.util.TreeSet;
/**
* Loads ArchiveFormats defined as "services" from {@code
@@ -113,10 +118,11 @@ public class Archivers implements Iterab
}
private void fillMap() throws ServiceConfigurationError {
- // TODO make that a TreeMap sorted for auto-detection order
+ Set<ArchiveFormat> ts = new TreeSet<ArchiveFormat>(SORT_FOR_AUTO_DETECTION);
+ ts.addAll(asList(formatLoader));
Map<String, ArchiveFormat<? extends ArchiveEntry>> a =
- new HashMap<String, ArchiveFormat<? extends ArchiveEntry>>();
- for (ArchiveFormat<? extends ArchiveEntry> f : formatLoader) {
+ new LinkedHashMap<String, ArchiveFormat<? extends ArchiveEntry>>();
+ for (ArchiveFormat<? extends ArchiveEntry> f : ts) {
a.put(f.getName(), f);
}
archivers = Collections.unmodifiableMap(a);
@@ -168,6 +174,29 @@ public class Archivers implements Iterab
};
}
+ private static <T> List<T> asList(Iterable<T> i) {
+ List<T> l = new ArrayList<T>();
+ for (T t : i) {
+ l.add(t);
+ }
+ return l;
+ }
+
+ private Comparator<ArchiveFormat> SORT_FOR_AUTO_DETECTION = new Comparator<ArchiveFormat>() {
+ public int compare(ArchiveFormat a1, ArchiveFormat a2) {
+ if (a1.supportsAutoDetection() && a2.supportsAutoDetection()) {
+ return a1.getNumberOfBytesRequiredForAutodetection() - a2.getNumberOfBytesRequiredForAutodetection();
+ }
+ if (!a1.supportsAutoDetection() && !a2.supportsAutoDetection()) {
+ return 0;
+ }
+ if (a1.supportsAutoDetection()) {
+ return -1;
+ }
+ return 1;
+ }
+ };
+
private static class FilteringIterator<T> implements Iterator<T> {
private final Iterator<T> i;
private final Predicate<? super T> filter;