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