Author: michiel
Date: 2010-04-01 13:43:17 +0200 (Thu, 01 Apr 2010)
New Revision: 41717

Added:
   mmbase/trunk/utils/src/main/java/org/mmbase/util/magicfile/XmlDetector.java
Modified:
   
mmbase/trunk/utils/src/main/java/org/mmbase/util/magicfile/AbstractDetector.java
   mmbase/trunk/utils/src/main/java/org/mmbase/util/magicfile/BasicDetector.java
   mmbase/trunk/utils/src/main/java/org/mmbase/util/magicfile/Detector.java
   mmbase/trunk/utils/src/main/java/org/mmbase/util/magicfile/MagicFile.java
   
mmbase/trunk/utils/src/main/java/org/mmbase/util/magicfile/MagicXMLReader.java
   
mmbase/trunk/utils/src/main/java/org/mmbase/util/magicfile/resources/magic.dtd
   
mmbase/trunk/utils/src/main/java/org/mmbase/util/magicfile/resources/magic_1_0.dtd
   mmbase/trunk/utils/src/main/java/org/mmbase/util/xml/DocumentReader.java
Log:
  MMB-1947

Modified: 
mmbase/trunk/utils/src/main/java/org/mmbase/util/magicfile/AbstractDetector.java
===================================================================
--- 
mmbase/trunk/utils/src/main/java/org/mmbase/util/magicfile/AbstractDetector.java
    2010-04-01 10:52:24 UTC (rev 41716)
+++ 
mmbase/trunk/utils/src/main/java/org/mmbase/util/magicfile/AbstractDetector.java
    2010-04-01 11:43:17 UTC (rev 41717)
@@ -11,6 +11,8 @@
 package org.mmbase.util.magicfile;
 import java.util.*;
 import java.io.*;
+import org.w3c.dom.Element;
+import org.mmbase.util.xml.*;
 import org.mmbase.util.logging.*;
 
 /**
@@ -83,8 +85,45 @@
     public void setDesignation(String designation) {
         this.message = designation;
     }
+    public String getDesignation() {
+        return message;
+    }
 
-    public void configure(org.w3c.dom.Element el) {
-        // nothing to do.
+    public void setValid(boolean v) {
+        valid = v;
     }
+
+    /**
+     * @return Whether parsing of magic line for this detector succeeded
+     */
+    public boolean valid() {
+        return valid;
+    }
+
+
+
+    public void configure(Element e) {
+
+        {
+            Element e1 = DocumentReader.getElementByPath(e, 
"detector.mimetype");
+            if (e1 == null ) log.error("No mime type in " + 
XMLWriter.write(e));
+            setMimeType(DocumentReader.getElementValue(e1));
+        }
+
+        {
+            Element e1 = DocumentReader.getElementByPath(e, 
"detector.extension");
+            setExtension(DocumentReader.getElementValue(e1));
+        }
+        {
+            Element e1 = DocumentReader.getElementByPath(e, 
"detector.designation");
+            setDesignation(DocumentReader.getElementValue(e1));
+        }
+    }
+
+
+    @Override
+    public String toString() {
+        return getClass() + " " + getMimeType() + " " + extensions;
+    }
+
 }

Modified: 
mmbase/trunk/utils/src/main/java/org/mmbase/util/magicfile/BasicDetector.java
===================================================================
--- 
mmbase/trunk/utils/src/main/java/org/mmbase/util/magicfile/BasicDetector.java   
    2010-04-01 10:52:24 UTC (rev 41716)
+++ 
mmbase/trunk/utils/src/main/java/org/mmbase/util/magicfile/BasicDetector.java   
    2010-04-01 11:43:17 UTC (rev 41717)
@@ -54,6 +54,7 @@
 public class BasicDetector extends AbstractDetector {
     private static final Logger log = 
Logging.getLoggerInstance(BasicDetector.class);
 
+
     // No configuration below
     private static final int BIG_ENDIAN = 0;
     private static final int LITTLE_ENDIAN = 1;
@@ -102,6 +103,8 @@
         return testComparator;
     }
 
+
+
     /**
      * @return Whether detector matches the prefix/lithmus of the file
      */
@@ -145,6 +148,7 @@
     /**
      * todo: I noticed there is also a %5.5s variation in magic...
      */
+    @Override
     public String getDesignation() {
         if (hasX) {
             int n = message.indexOf("%d");
@@ -165,18 +169,7 @@
         return message;
     }
 
-    public void setInvalid() {
-        valid = false;
-    }
-
     /**
-     * @return Whether parsing of magic line for this detector succeeded
-     */
-    public boolean valid() {
-        return valid;
-    }
-
-    /**
      * @return Conversion of 2 byte array to integer
      */
     private int byteArrayToInt(byte[] ar) {
@@ -556,18 +549,8 @@
 
     @Override
     public void configure(Element e) {
-        Element e1;
-
-        e1 = DocumentReader.getElementByPath(e, "detector.mimetype");
-        setMimeType(DocumentReader.getElementValue(e1));
-
-        e1 = DocumentReader.getElementByPath(e, "detector.extension");
-        setExtension(DocumentReader.getElementValue(e1));
-
-        e1 = DocumentReader.getElementByPath(e, "detector.designation");
-        setDesignation(DocumentReader.getElementValue(e1));
-
-        e1 = DocumentReader.getElementByPath(e, "detector.test");
+        super.configure(e);
+        Element e1 = DocumentReader.getElementByPath(e, "detector.test");
         if (e1 != null) {
             setTest(convertOctals(DocumentReader.getElementValue(e1)));
             setOffset(e1.getAttribute("offset"));

Modified: 
mmbase/trunk/utils/src/main/java/org/mmbase/util/magicfile/Detector.java
===================================================================
--- mmbase/trunk/utils/src/main/java/org/mmbase/util/magicfile/Detector.java    
2010-04-01 10:52:24 UTC (rev 41716)
+++ mmbase/trunk/utils/src/main/java/org/mmbase/util/magicfile/Detector.java    
2010-04-01 11:43:17 UTC (rev 41717)
@@ -31,7 +31,7 @@
     void addChild(Detector detector, int level);
     boolean test(byte[] lithmus);
 
-    void setInvalid();
+    void setValid(boolean v);
     boolean valid();
 
 

Modified: 
mmbase/trunk/utils/src/main/java/org/mmbase/util/magicfile/MagicFile.java
===================================================================
--- mmbase/trunk/utils/src/main/java/org/mmbase/util/magicfile/MagicFile.java   
2010-04-01 10:52:24 UTC (rev 41716)
+++ mmbase/trunk/utils/src/main/java/org/mmbase/util/magicfile/MagicFile.java   
2010-04-01 11:43:17 UTC (rev 41717)
@@ -24,13 +24,14 @@
 public class MagicFile {
     private static final Logger log = 
Logging.getLoggerInstance(MagicFile.class);
 
-    public static final String FAILED = "Failed to determine type";
-    // application/octet-stream?
-
     protected static final int BUFSIZE = 4598;
     // Read a string of maximally this length from the file
     // Is this garanteed to be big enough?
 
+
+    public static final String FAILED = "Failed to determine type";
+    // application/octet-stream?
+
     private static MagicFile instance;
 
     protected final DetectorProvider detectors;
@@ -63,6 +64,7 @@
         return detectors.getDetectors();
     }
 
+
     /*
      * @deprecated use getMimeType(File)
      */
@@ -105,9 +107,13 @@
      *
      * @return The found mime-type or FAILED
      */
-    public String getMimeType(byte[] input) {
+    public String getMimeType(final byte[] input) {
+        List<Detector> list = getDetectors();
+        if (list == null || list.size() == 0) {
+            log.warn("No detectors found");
+            return FAILED;
+        }
         byte[] lithmus;
-
         if (input.length > BUFSIZE) {
             lithmus = new byte[BUFSIZE];
             System.arraycopy(input, 0, lithmus, 0, BUFSIZE);
@@ -116,14 +122,10 @@
             lithmus = input;
         }
 
-        List<Detector> list = getDetectors();
-        if (list == null) {
-            log.warn("No detectors found");
-            return FAILED;
-        }
         for (Detector detector : list) {
             if (detector.test(lithmus)) {
-                log.debug("Trying " + detector.getMimeType());
+                log.debug("Matched " + detector);
+
                 return detector.getMimeType();
             }
         }
@@ -137,6 +139,9 @@
         int res = input.read(lithmus, 0, BUFSIZE);
         log.debug("read " + res + "  bytes from " + input);
         return getMimeType(lithmus);
+
+
+
     }
 
     /**

Modified: 
mmbase/trunk/utils/src/main/java/org/mmbase/util/magicfile/MagicXMLReader.java
===================================================================
--- 
mmbase/trunk/utils/src/main/java/org/mmbase/util/magicfile/MagicXMLReader.java  
    2010-04-01 10:52:24 UTC (rev 41716)
+++ 
mmbase/trunk/utils/src/main/java/org/mmbase/util/magicfile/MagicXMLReader.java  
    2010-04-01 11:43:17 UTC (rev 41717)
@@ -7,6 +7,7 @@
 import org.mmbase.util.logging.*;
 import org.mmbase.util.xml.DocumentReader;
 import org.mmbase.util.xml.Instantiator;
+import org.mmbase.util.xml.XMLWriter;
 import org.w3c.dom.Element;
 import org.xml.sax.InputSource;
 import java.util.concurrent.CopyOnWriteArrayList;
@@ -95,7 +96,7 @@
                     Detector d = getOneDetector(element);
                     detectors.add(d);
                 } catch (Exception ex) {
-                    log.error(ex.getMessage() + ": " + element, ex);
+                    log.error(ex.getClass() + " " + ex.getMessage() + ": " + 
XMLWriter.write(element));
                 }
             }
         }
@@ -114,8 +115,12 @@
         Element e1 = getElementByPath(e, "detector.childlist");
         if (e1 != null) {
             for (Element element: getChildElements(e1)) {
-                Detector child = getOneDetector(element);
-                d.addChild(child, 1); // Not sure if this is the right thing
+                try {
+                    Detector child = getOneDetector(element);
+                    d.addChild(child, 1); // Not sure if this is the  thing
+                } catch (Exception ex) {
+                    log.warn(ex.getClass() + " " + ex.getMessage() + ": " + 
XMLWriter.write(e1));
+                }
             }
         }
         return d;

Added: 
mmbase/trunk/utils/src/main/java/org/mmbase/util/magicfile/XmlDetector.java
===================================================================
--- mmbase/trunk/utils/src/main/java/org/mmbase/util/magicfile/XmlDetector.java 
                        (rev 0)
+++ mmbase/trunk/utils/src/main/java/org/mmbase/util/magicfile/XmlDetector.java 
2010-04-01 11:43:17 UTC (rev 41717)
@@ -0,0 +1,89 @@
+/*
+
+This software is OSI Certified Open Source Software.
+OSI Certified is a certification mark of the Open Source Initiative.
+
+The license (Mozilla version 1.0) can be read at the MMBase site.
+See http://www.MMBase.org/license
+
+*/
+
+package org.mmbase.util.magicfile;
+import java.util.*;
+import java.io.*;
+import org.w3c.dom.Element;
+import org.xml.sax.*;
+import org.xml.sax.helpers.*;
+import org.mmbase.util.xml.ErrorHandler;
+import org.mmbase.util.xml.*;
+import org.mmbase.util.logging.*;
+
+/**
+
+ * @version $Id: Detector.java 41036 2010-02-15 22:30:54Z michiel $
+ */
+
+public class XmlDetector extends AbstractDetector {
+    private static final Logger log = 
Logging.getLoggerInstance(XmlDetector.class);
+
+
+
+    protected String namespace = null;
+    protected String doctype   = null;
+
+    public void setXmlns(String xmlns) {
+        namespace = xmlns;
+    }
+
+    public void setDocType(String dt) {
+        doctype = dt;
+    }
+
+    /**
+     * @return Whether detector matches the prefix/lithmus of the file
+     */
+    public boolean test(byte[] lithmus) {
+        try {
+            XMLReader parser = XMLReaderFactory.createXMLReader();
+            Handler handler = new Handler();
+            parser.setContentHandler(handler);
+            parser.setErrorHandler(new ErrorHandler(false, 
ErrorHandler.FATAL_ERROR));
+            InputSource source = new InputSource(new 
ByteArrayInputStream(lithmus));
+            parser.parse(source);
+            return false;
+        } catch (Matched m) {
+            return true;
+        } catch (SAXException e) {
+            return false;
+        } catch (java.io.IOException ioe) {
+            log.warn(ioe);
+            return false;
+        }
+    }
+
+    @Override
+    public void configure(Element el) {
+        super.configure(el);
+        if (namespace == null && doctype == null) {
+            throw new IllegalStateException("Not configured with either 
namespace or doctype");
+        }
+        if (doctype != null) {
+            throw new UnsupportedOperationException("Needs implementing");
+        }
+    }
+
+    protected class Matched extends RuntimeException {
+    }
+
+    protected class Handler extends DefaultHandler {
+
+
+        @Override
+        public void startPrefixMapping(String prefix, String uri)  {
+            if (uri.equals(XmlDetector.this.namespace)) {
+                throw new Matched();
+            }
+        }
+    }
+
+}

Modified: 
mmbase/trunk/utils/src/main/java/org/mmbase/util/magicfile/resources/magic.dtd
===================================================================
--- 
mmbase/trunk/utils/src/main/java/org/mmbase/util/magicfile/resources/magic.dtd  
    2010-04-01 10:52:24 UTC (rev 41716)
+++ 
mmbase/trunk/utils/src/main/java/org/mmbase/util/magicfile/resources/magic.dtd  
    2010-04-01 11:43:17 UTC (rev 41717)
@@ -4,7 +4,7 @@
 <!ELEMENT author (#PCDATA)>
 <!ELEMENT description (#PCDATA)>
 <!ELEMENT detectorlist (detector*)>
-<!ELEMENT detector (mimetype,extension,designation,test,param?,childlist?)>
+<!ELEMENT detector (mimetype,extension,designation,test?,param?,childlist?)>
 <!ATTLIST detector class CDATA "org.mmbase.util.magicfile.BasicDetector">
 <!ELEMENT extension (#PCDATA)>
 <!ELEMENT mimetype (#PCDATA)>

Modified: 
mmbase/trunk/utils/src/main/java/org/mmbase/util/magicfile/resources/magic_1_0.dtd
===================================================================
--- 
mmbase/trunk/utils/src/main/java/org/mmbase/util/magicfile/resources/magic_1_0.dtd
  2010-04-01 10:52:24 UTC (rev 41716)
+++ 
mmbase/trunk/utils/src/main/java/org/mmbase/util/magicfile/resources/magic_1_0.dtd
  2010-04-01 11:43:17 UTC (rev 41717)
@@ -4,7 +4,7 @@
 <!ELEMENT author (#PCDATA)>
 <!ELEMENT description (#PCDATA)>
 <!ELEMENT detectorlist (detector*)>
-<!ELEMENT detector (mimetype,extension,designation,test,param?,childlist?)>
+<!ELEMENT detector (mimetype,extension,designation,test?,param?,childlist?)>
 <!ATTLIST detector class CDATA "org.mmbase.util.magicfile.BasicDetector">
 <!ELEMENT extension (#PCDATA)>
 <!ELEMENT mimetype (#PCDATA)>

Modified: 
mmbase/trunk/utils/src/main/java/org/mmbase/util/xml/DocumentReader.java
===================================================================
--- mmbase/trunk/utils/src/main/java/org/mmbase/util/xml/DocumentReader.java    
2010-04-01 10:52:24 UTC (rev 41716)
+++ mmbase/trunk/utils/src/main/java/org/mmbase/util/xml/DocumentReader.java    
2010-04-01 11:43:17 UTC (rev 41717)
@@ -454,7 +454,7 @@
      * @return Value of attribute
      */
     public String getElementAttributeValue(String path, String attr) {
-        return getElementAttributeValue(getElementByPath(path),attr);
+        return getElementAttributeValue(getElementByPath(path), attr);
     }
 
 

_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs

Reply via email to