Author: jukka
Date: Sat Nov 3 08:15:00 2007
New Revision: 591631
URL: http://svn.apache.org/viewvc?rev=591631&view=rev
Log:
TIKA-87 - MimeTypes should allow modification of MIME types
- Merged MimeInfo and MimeType
- Made MimeType Comparable
Modified:
incubator/tika/trunk/src/main/java/org/apache/tika/mime/MimeType.java
incubator/tika/trunk/src/main/java/org/apache/tika/mime/MimeTypes.java
Modified: incubator/tika/trunk/src/main/java/org/apache/tika/mime/MimeType.java
URL:
http://svn.apache.org/viewvc/incubator/tika/trunk/src/main/java/org/apache/tika/mime/MimeType.java?rev=591631&r1=591630&r2=591631&view=diff
==============================================================================
--- incubator/tika/trunk/src/main/java/org/apache/tika/mime/MimeType.java
(original)
+++ incubator/tika/trunk/src/main/java/org/apache/tika/mime/MimeType.java Sat
Nov 3 08:15:00 2007
@@ -20,6 +20,7 @@
import java.util.ArrayList;
import java.util.Collections;
import java.util.regex.Pattern;
+
import org.apache.tika.utils.StringUtil;
/**
@@ -27,7 +28,7 @@
*
*
*/
-public final class MimeType {
+public final class MimeType implements Comparable<MimeType> {
/** The primary and sub types separator */
private final static String SEPARATOR = "/";
@@ -331,8 +332,8 @@
return level;
}
- void incLevel() {
- this.level++;
+ void setLevel(int level) {
+ this.level = level;
}
/**
@@ -467,4 +468,13 @@
.toString();
}
}
+
+ public int compareTo(MimeType o) {
+ int diff = level - o.level;
+ if (diff == 0) {
+ diff = name.compareTo(o.name);
+ }
+ return diff;
+ }
+
}
Modified: incubator/tika/trunk/src/main/java/org/apache/tika/mime/MimeTypes.java
URL:
http://svn.apache.org/viewvc/incubator/tika/trunk/src/main/java/org/apache/tika/mime/MimeTypes.java?rev=591631&r1=591630&r2=591631&view=diff
==============================================================================
--- incubator/tika/trunk/src/main/java/org/apache/tika/mime/MimeTypes.java
(original)
+++ incubator/tika/trunk/src/main/java/org/apache/tika/mime/MimeTypes.java Sat
Nov 3 08:15:00 2007
@@ -28,6 +28,8 @@
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
+import java.util.SortedSet;
+import java.util.TreeSet;
/**
* This class is a MimeType repository. It gathers a set of MimeTypes and
@@ -49,7 +51,7 @@
public final static String DEFAULT = "application/octet-stream";
/** All the registered MimeTypes indexed on their name */
- private Map<String, MimeInfo> types = new HashMap<String, MimeInfo>();
+ private Map<String, MimeType> types = new HashMap<String, MimeType>();
/** The patterns matcher */
private Patterns patterns = new Patterns();
@@ -58,10 +60,10 @@
private ArrayList<Magic> magics = new ArrayList<Magic>();
/** List of all registered rootXML */
- private ArrayList<MimeInfo> xmls = new ArrayList<MimeInfo>();
+ private SortedSet<MimeType> xmls = new TreeSet<MimeType>();
- private Map<String, List<MimeInfo>> unsolvedDeps =
- new HashMap<String, List<MimeInfo>>();
+ private Map<String, List<MimeType>> unsolvedDeps =
+ new HashMap<String, List<MimeType>>();
/**
* A comparator used to sort the mime types based on their magics (it is
@@ -78,17 +80,6 @@
}
};
- /**
- * A comparator used to sort the mime types based on their level (the level
- * is the number of super-types for a type)
- */
- private final static Comparator<MimeInfo> LEVELS_COMPARATOR =
- new Comparator<MimeInfo>() {
- public int compare(MimeInfo o1, MimeInfo o2) {
- return o2.getLevel() - o1.getLevel();
- }
- };
-
/** The minimum length of data to provide to check all MimeTypes */
private int minLength = 0;
@@ -146,8 +137,7 @@
assert data != null;
// First, check for XML descriptions (level by level)
- for (MimeInfo info : xmls) {
- MimeType type = info.getType();
+ for (MimeType type : xmls) {
if (type.matchesXML(data)) {
return type;
}
@@ -309,8 +299,7 @@
* MimeType is registered for this name.
*/
public MimeType forName(String name) {
- MimeInfo info = types.get(name);
- return (info == null) ? null : info.getType();
+ return types.get(name);
}
/**
@@ -353,29 +342,27 @@
}
// Add the new type in the repository
- MimeInfo info = new MimeInfo(type);
- types.put(type.getName(), info);
+ types.put(type.getName(), type);
// Checks for some unsolved dependencies on this new type
- List<MimeInfo> deps = unsolvedDeps.get(type.getName());
+ List<MimeType> deps = unsolvedDeps.remove(type.getName());
if (deps != null) {
- int level = info.getLevel();
- for (MimeInfo dep : deps) {
+ int level = type.getLevel();
+ for (MimeType dep : deps) {
level = Math.max(level, dep.getLevel() + 1);
}
- info.setLevel(level);
- unsolvedDeps.remove(type.getName());
+ type.setLevel(level);
}
for (String name : type.getSuperTypes()) {
- MimeInfo superType = types.get(name);
+ MimeType superType = types.get(name);
if (superType == null) {
deps = unsolvedDeps.get(name);
if (deps == null) {
- deps = new ArrayList<MimeInfo>();
+ deps = new ArrayList<MimeType>();
unsolvedDeps.put(name, deps);
}
- deps.add(info);
+ deps.add(type);
}
}
@@ -391,52 +378,8 @@
// Update the xml (xmlRoot) index...
if (type.hasRootXML()) {
- this.xmls.add(info);
+ xmls.add(type);
}
- Collections.sort(xmls, LEVELS_COMPARATOR);
}
- // Inherited Javadoc
- public String toString() {
- StringBuilder builder = new StringBuilder();
- for (MimeInfo info : types.values()) {
- builder.append(info.getType()).append("\n");
- }
- return builder.toString();
- }
-
- private final class MimeInfo {
-
- private final MimeType type;
-
- private int level;
-
- MimeInfo(MimeType type) {
- this.type = type;
- this.level = 0;
- }
-
- MimeType getType() {
- return type;
- }
-
- int getLevel() {
- return level;
- }
-
- void setLevel(int level) {
- if (level > this.level) {
- this.level = level;
-
- // Update all my super-types
- for (String name : type.getSuperTypes()) {
- MimeInfo info = types.get(name);
- if (info != null) {
- info.setLevel(level + 1);
- }
- }
- }
- }
-
- }
}