You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tika.apache.org by ni...@apache.org on 2011/10/18 15:52:09 UTC

svn commit: r1185658 - in /tika/trunk/tika-core/src/main/java/org/apache/tika: Tika.java config/TikaConfig.java parser/AutoDetectParser.java

Author: nick
Date: Tue Oct 18 13:52:09 2011
New Revision: 1185658

URL: http://svn.apache.org/viewvc?rev=1185658&view=rev
Log:
TIKA-755 Have TikaConfig create a DefaultDetector instance based on the supplied MimeTypes and/or ClassLoader, and switch Tika+AutoDetectParser to get their detector from there, rather than create their own DefaultDetector instance

Modified:
    tika/trunk/tika-core/src/main/java/org/apache/tika/Tika.java
    tika/trunk/tika-core/src/main/java/org/apache/tika/config/TikaConfig.java
    tika/trunk/tika-core/src/main/java/org/apache/tika/parser/AutoDetectParser.java

Modified: tika/trunk/tika-core/src/main/java/org/apache/tika/Tika.java
URL: http://svn.apache.org/viewvc/tika/trunk/tika-core/src/main/java/org/apache/tika/Tika.java?rev=1185658&r1=1185657&r2=1185658&view=diff
==============================================================================
--- tika/trunk/tika-core/src/main/java/org/apache/tika/Tika.java (original)
+++ tika/trunk/tika-core/src/main/java/org/apache/tika/Tika.java Tue Oct 18 13:52:09 2011
@@ -24,7 +24,6 @@ import java.io.Reader;
 import java.net.URL;
 
 import org.apache.tika.config.TikaConfig;
-import org.apache.tika.detect.DefaultDetector;
 import org.apache.tika.detect.Detector;
 import org.apache.tika.exception.TikaException;
 import org.apache.tika.io.TikaInputStream;
@@ -83,8 +82,7 @@ public class Tika {
      * @param config Tika configuration
      */
     public Tika(TikaConfig config) {
-        this(new DefaultDetector(config.getMimeRepository()),
-                new AutoDetectParser(config));
+        this(config.getDetector(), new AutoDetectParser(config));
     }
 
     /**

Modified: tika/trunk/tika-core/src/main/java/org/apache/tika/config/TikaConfig.java
URL: http://svn.apache.org/viewvc/tika/trunk/tika-core/src/main/java/org/apache/tika/config/TikaConfig.java?rev=1185658&r1=1185657&r2=1185658&view=diff
==============================================================================
--- tika/trunk/tika-core/src/main/java/org/apache/tika/config/TikaConfig.java (original)
+++ tika/trunk/tika-core/src/main/java/org/apache/tika/config/TikaConfig.java Tue Oct 18 13:52:09 2011
@@ -32,6 +32,9 @@ import javax.xml.parsers.DocumentBuilder
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 
+import org.apache.tika.detect.CompositeDetector;
+import org.apache.tika.detect.DefaultDetector;
+import org.apache.tika.detect.Detector;
 import org.apache.tika.exception.TikaException;
 import org.apache.tika.mime.MediaType;
 import org.apache.tika.mime.MediaTypeRegistry;
@@ -54,6 +57,7 @@ import org.xml.sax.SAXException;
 public class TikaConfig {
 
     private final CompositeParser parser;
+    private final Detector detector;
 
     private final MimeTypes mimeTypes;
 
@@ -111,6 +115,7 @@ public class TikaConfig {
     public TikaConfig(Element element, ClassLoader loader)
             throws TikaException, IOException {
         this.mimeTypes = typesFromDomElement(element);
+        this.detector = detectorFromDomElement(element, mimeTypes, loader);
         this.parser = parserFromDomElement(element, mimeTypes, loader);
     }
 
@@ -128,8 +133,9 @@ public class TikaConfig {
      */
     public TikaConfig(ClassLoader loader)
             throws MimeTypeException, IOException {
-        this.parser = new DefaultParser(loader);
         this.mimeTypes = MimeTypes.getDefaultMimeTypes();
+        this.detector = new DefaultDetector(mimeTypes, loader);
+        this.parser = new DefaultParser(mimeTypes.getMediaTypeRegistry(), loader);
     }
 
     /**
@@ -159,6 +165,8 @@ public class TikaConfig {
             this.mimeTypes = MimeTypes.getDefaultMimeTypes();
             this.parser = new DefaultParser(
                     mimeTypes.getMediaTypeRegistry(), loader);
+            this.detector = new DefaultDetector(
+                  MimeTypes.getDefaultMimeTypes(), loader);
         } else {
             InputStream stream;
             File file = new File(config);
@@ -174,6 +182,8 @@ public class TikaConfig {
                     this.mimeTypes = typesFromDomElement(element);
                     this.parser =
                         parserFromDomElement(element, mimeTypes, loader);
+                    this.detector =
+                       detectorFromDomElement(element, mimeTypes, loader);
                 } catch (SAXException e) {
                     throw new TikaException(
                             "Specified Tika configuration has syntax errors: "
@@ -235,6 +245,15 @@ public class TikaConfig {
         return parser.getParsers();
     }
 
+    /**
+     * Returns the configured detector instance.
+     *
+     * @return configured detector
+     */
+    public Detector getDetector() {
+        return detector;
+    }
+
     public MimeTypes getMimeRepository(){
         return mimeTypes;
     }
@@ -361,4 +380,36 @@ public class TikaConfig {
         return new CompositeParser(mimeTypes.getMediaTypeRegistry(), parsers);
     }
 
+    private static Detector detectorFromDomElement(
+          Element element, MimeTypes mimeTypes, ClassLoader loader)
+          throws TikaException, IOException {
+       List<Detector> detectors = new ArrayList<Detector>();
+       NodeList nodes = element.getElementsByTagName("detector");
+       for (int i = 0; i < nodes.getLength(); i++) {
+           Element node = (Element) nodes.item(i);
+           String name = node.getAttribute("class");
+
+           try {
+               Class<?> detectorClass = Class.forName(name, true, loader);
+               Object instance = detectorClass.newInstance();
+               if (!(instance instanceof Detector)) {
+                   throw new TikaException(
+                           "Configured class is not a Tika Detector: " + name);
+               }
+               Detector detector = (Detector) instance;
+               detectors.add(detector);
+           } catch (ClassNotFoundException e) {
+               throw new TikaException(
+                       "Configured detector class not found: " + name, e);
+           } catch (IllegalAccessException e) {
+               throw new TikaException(
+                       "Unable to access a detector class: " + name, e);
+           } catch (InstantiationException e) {
+               throw new TikaException(
+                       "Unable to instantiate a detector class: " + name, e);
+           }
+       }
+       
+       return new CompositeDetector(mimeTypes.getMediaTypeRegistry(), detectors);
+    }
 }

Modified: tika/trunk/tika-core/src/main/java/org/apache/tika/parser/AutoDetectParser.java
URL: http://svn.apache.org/viewvc/tika/trunk/tika-core/src/main/java/org/apache/tika/parser/AutoDetectParser.java?rev=1185658&r1=1185657&r2=1185658&view=diff
==============================================================================
--- tika/trunk/tika-core/src/main/java/org/apache/tika/parser/AutoDetectParser.java (original)
+++ tika/trunk/tika-core/src/main/java/org/apache/tika/parser/AutoDetectParser.java Tue Oct 18 13:52:09 2011
@@ -76,7 +76,7 @@ public class AutoDetectParser extends Co
 
     public AutoDetectParser(TikaConfig config) {
         super(config.getMediaTypeRegistry(), config.getParser());
-        setDetector(new DefaultDetector(config.getMimeRepository()));
+        setDetector(config.getDetector());
     }
 
     /**
@@ -84,7 +84,7 @@ public class AutoDetectParser extends Co
      */
     public void setConfig(TikaConfig config) {
         setParsers(config.getParsers());
-        setDetector(new DefaultDetector(config.getMimeRepository()));
+        setDetector(config.getDetector());
         setMediaTypeRegistry(config.getMediaTypeRegistry());
     }