You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ju...@apache.org on 2009/10/28 17:50:36 UTC
svn commit: r830670 - in /jackrabbit/trunk/jackrabbit-jcr-server: ./
src/main/java/org/apache/jackrabbit/server/io/
src/main/java/org/apache/jackrabbit/webdav/simple/
Author: jukka
Date: Wed Oct 28 16:50:36 2009
New Revision: 830670
URL: http://svn.apache.org/viewvc?rev=830670&view=rev
Log:
JCR-2334: Tika-based type detection in jcr-server
Modified:
jackrabbit/trunk/jackrabbit-jcr-server/pom.xml
jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/AbstractExportContext.java
jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/DefaultHandler.java
jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/DefaultIOManager.java
jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/ExportContext.java
jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/ExportContextImpl.java
jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/IOManager.java
jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/IOManagerImpl.java
jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/IOUtil.java
jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/ImportContext.java
jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/ImportContextImpl.java
jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/MimeResolver.java
jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/XmlHandler.java
jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/ZipHandler.java
jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/DavResourceImpl.java
jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/ResourceConfig.java
jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/ResourceFactoryImpl.java
jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/SimpleWebdavServlet.java
Modified: jackrabbit/trunk/jackrabbit-jcr-server/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/pom.xml?rev=830670&r1=830669&r2=830670&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/pom.xml (original)
+++ jackrabbit/trunk/jackrabbit-jcr-server/pom.xml Wed Oct 28 16:50:36 2009
@@ -78,6 +78,11 @@
<artifactId>tika-core</artifactId>
</dependency>
<dependency>
+ <groupId>org.apache.tika</groupId>
+ <artifactId>tika-core</artifactId>
+ <version>0.4</version>
+ </dependency>
+ <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
Modified: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/AbstractExportContext.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/AbstractExportContext.java?rev=830670&r1=830669&r2=830670&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/AbstractExportContext.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/AbstractExportContext.java Wed Oct 28 16:50:36 2009
@@ -32,21 +32,14 @@
private final IOListener ioListener;
private final Item exportRoot;
private final boolean hasStream;
- private final MimeResolver mimeResolver;
protected boolean completed;
- public AbstractExportContext(Item exportRoot, boolean hasStream,
- IOListener ioListener) {
- this(exportRoot, hasStream, ioListener, null);
- }
-
- public AbstractExportContext(Item exportRoot, boolean hasStream,
- IOListener ioListener, MimeResolver mimeResolver) {
+ public AbstractExportContext(
+ Item exportRoot, boolean hasStream, IOListener ioListener) {
this.exportRoot = exportRoot;
this.hasStream = hasStream;
this.ioListener = (ioListener != null) ? ioListener : new DefaultIOListener(log);
- this.mimeResolver = (mimeResolver != null) ? mimeResolver : IOUtil.MIME_RESOLVER;
}
public IOListener getIOListener() {
@@ -57,10 +50,6 @@
return exportRoot;
}
- public MimeResolver getMimeResolver() {
- return mimeResolver;
- }
-
public boolean hasStream() {
return hasStream;
}
Modified: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/DefaultHandler.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/DefaultHandler.java?rev=830670&r1=830669&r2=830670&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/DefaultHandler.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/DefaultHandler.java Wed Oct 28 16:50:36 2009
@@ -24,6 +24,10 @@
import org.apache.jackrabbit.webdav.xml.Namespace;
import org.apache.jackrabbit.webdav.property.DavPropertyName;
import org.apache.jackrabbit.webdav.property.DavProperty;
+import org.apache.tika.config.TikaConfig;
+import org.apache.tika.detect.Detector;
+import org.apache.tika.exception.TikaException;
+import org.apache.tika.metadata.Metadata;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -70,21 +74,26 @@
private static Logger log = LoggerFactory.getLogger(DefaultHandler.class);
- private String collectionNodetype = JcrConstants.NT_FOLDER;
- private String defaultNodetype = JcrConstants.NT_FILE;
- /* IMPORTANT NOTE: for webDAV compliance the default nodetype of the content
- node has been changed from nt:resource to nt:unstructured. */
- private String contentNodetype = JcrConstants.NT_UNSTRUCTURED;
+ private String collectionNodetype;
+
+ private String defaultNodetype;
+
+ private String contentNodetype;
private IOManager ioManager;
/**
- * Creates a new <code>DefaultHandler</code> with default nodetype definitions
- * and without setting the IOManager.
+ * Creates a new <code>DefaultHandler</code> with default nodetype definitions:<br>
+ * <ul>
+ * <li>Nodetype for Collection: {@link JcrConstants#NT_FOLDER nt:folder}</li>
+ * <li>Nodetype for Non-Collection: {@link JcrConstants#NT_FILE nt:file}</li>
+ * <li>Nodetype for Non-Collection content: {@link JcrConstants#NT_UNSTRUCTURED nt:unstructured}</li>
+ * </ul>
*
- * @see IOHandler#setIOManager(IOManager)
+ * @param ioManager the I/O manager
*/
public DefaultHandler() {
+ this(null);
}
/**
@@ -92,13 +101,19 @@
* <ul>
* <li>Nodetype for Collection: {@link JcrConstants#NT_FOLDER nt:folder}</li>
* <li>Nodetype for Non-Collection: {@link JcrConstants#NT_FILE nt:file}</li>
- * <li>Nodetype for Non-Collection content: {@link JcrConstants#NT_RESOURCE nt:resource}</li>
+ * <li>Nodetype for Non-Collection content: {@link JcrConstants#NT_UNSTRUCTURED nt:unstructured}</li>
* </ul>
*
* @param ioManager the I/O manager
*/
public DefaultHandler(IOManager ioManager) {
- this.ioManager = ioManager;
+ this(ioManager,
+ JcrConstants.NT_FOLDER,
+ JcrConstants.NT_FILE,
+ // IMPORTANT NOTE: for webDAV compliance the default type
+ // of the content node has been changed from nt:resource to
+ // nt:unstructured
+ JcrConstants.NT_UNSTRUCTURED);
}
/**
@@ -640,6 +655,24 @@
return failures;
}
+ /**
+ * Detects the media type of a document based on the given name.
+ *
+ * @param name document name
+ * @return detected content type (or application/octet-stream)
+ */
+ protected String detect(String name) {
+ try {
+ Metadata metadata = new Metadata();
+ metadata.set(Metadata.RESOURCE_NAME_KEY, name);
+ return ioManager.getDetector().detect(null, metadata).toString();
+ } catch (IOException e) {
+ // Can not happen since the InputStream above is null
+ throw new IllegalStateException(
+ "Unexpected IOException", e);
+ }
+ }
+
//------------------------------------------------------------< private >---
/**
* Builds a webdav property name from the given jcrName. In case the jcrName
Modified: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/DefaultIOManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/DefaultIOManager.java?rev=830670&r1=830669&r2=830670&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/DefaultIOManager.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/DefaultIOManager.java Wed Oct 28 16:50:36 2009
@@ -16,6 +16,7 @@
*/
package org.apache.jackrabbit.server.io;
+import org.apache.tika.detect.Detector;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Modified: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/ExportContext.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/ExportContext.java?rev=830670&r1=830669&r2=830670&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/ExportContext.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/ExportContext.java Wed Oct 28 16:50:36 2009
@@ -17,6 +17,7 @@
package org.apache.jackrabbit.server.io;
import javax.jcr.Item;
+
import java.io.OutputStream;
/**
@@ -39,13 +40,6 @@
public OutputStream getOutputStream();
/**
- * Return the <code>MimeResolver</code> defined for this export context.
- *
- * @return mimetype resolver defined for this export context.
- */
- public MimeResolver getMimeResolver();
-
- /**
* Set the content type for the resource content
*
* @param mimeType
Modified: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/ExportContextImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/ExportContextImpl.java?rev=830670&r1=830669&r2=830670&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/ExportContextImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/ExportContextImpl.java Wed Oct 28 16:50:36 2009
@@ -19,6 +19,7 @@
import org.apache.jackrabbit.webdav.DavConstants;
import org.apache.jackrabbit.webdav.DavResource;
import org.apache.jackrabbit.webdav.io.OutputContext;
+import org.apache.tika.detect.Detector;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -53,13 +54,9 @@
private File outFile;
private OutputStream outStream;
- public ExportContextImpl(Item exportRoot, OutputContext outputCtx) throws IOException {
- this(exportRoot, outputCtx, null);
- }
-
- public ExportContextImpl(Item exportRoot, OutputContext outputCtx,
- MimeResolver mimeResolver) throws IOException {
- super(exportRoot, (outputCtx != null) ? outputCtx.hasStream() : false, null, mimeResolver);
+ public ExportContextImpl(Item exportRoot, OutputContext outputCtx)
+ throws IOException {
+ super(exportRoot, outputCtx != null && outputCtx.hasStream(), null);
this.outputCtx = outputCtx;
if (hasStream()) {
// we need a tmp file, since the export could fail
Modified: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/IOManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/IOManager.java?rev=830670&r1=830669&r2=830670&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/IOManager.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/IOManager.java Wed Oct 28 16:50:36 2009
@@ -17,6 +17,7 @@
package org.apache.jackrabbit.server.io;
import org.apache.jackrabbit.webdav.DavResource;
+import org.apache.tika.detect.Detector;
import java.io.IOException;
@@ -41,6 +42,20 @@
public IOHandler[] getIOHandlers();
/**
+ * Return the configured type detector.
+ *
+ * @return content type detector
+ */
+ Detector getDetector();
+
+ /**
+ * Sets the configured type detector.
+ *
+ * @param detector content type detector.
+ */
+ void setDetector(Detector detector);
+
+ /**
* Passes the specified context and boolean value to the IOHandlers present
* on this manager.
* As soon as the first handler incidates success the import should be
Modified: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/IOManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/IOManagerImpl.java?rev=830670&r1=830669&r2=830670&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/IOManagerImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/IOManagerImpl.java Wed Oct 28 16:50:36 2009
@@ -16,13 +16,14 @@
*/
package org.apache.jackrabbit.server.io;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.apache.jackrabbit.webdav.DavResource;
-
import java.io.IOException;
-import java.util.List;
import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.jackrabbit.webdav.DavResource;
+import org.apache.tika.detect.Detector;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
* <code>IOManagerImpl</code> represents the most simple <code>IOManager</code>
@@ -33,6 +34,11 @@
private static Logger log = LoggerFactory.getLogger(IOManagerImpl.class);
+ /**
+ * Content type detector.
+ */
+ private Detector detector;
+
private final List ioHandlers = new ArrayList();
/**
@@ -64,6 +70,24 @@
}
/**
+ * Return the configured type detector.
+ *
+ * @return content type detector
+ */
+ public Detector getDetector() {
+ return detector;
+ }
+
+ /**
+ * Sets the configured type detector.
+ *
+ * @param detector content type detector
+ */
+ public void setDetector(Detector detector) {
+ this.detector = detector;
+ }
+
+ /**
* @see IOManager#importContent(ImportContext, boolean)
*/
public boolean importContent(ImportContext context, boolean isCollection) throws IOException {
Modified: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/IOUtil.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/IOUtil.java?rev=830670&r1=830669&r2=830670&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/IOUtil.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/IOUtil.java Wed Oct 28 16:50:36 2009
@@ -49,12 +49,6 @@
public static final long UNDEFINED_LENGTH = -1;
/**
- * MimeType resolver used to retrieve the mimetype if no content type is
- * available during import.
- */
- public static final MimeResolver MIME_RESOLVER = new MimeResolver();
-
- /**
* Return the last modification time as formatted string.
*
* @return last modification time as string.
Modified: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/ImportContext.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/ImportContext.java?rev=830670&r1=830669&r2=830670&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/ImportContext.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/ImportContext.java Wed Oct 28 16:50:36 2009
@@ -17,6 +17,9 @@
package org.apache.jackrabbit.server.io;
import javax.jcr.Item;
+
+import org.apache.tika.detect.Detector;
+
import java.io.InputStream;
/**
@@ -33,13 +36,6 @@
public Item getImportRoot();
/**
- * Return the <code>MimeResolver</code> defined for this import context.
- *
- * @return mimetype resolver defined for this import context.
- */
- public MimeResolver getMimeResolver();
-
- /**
* Returns the system id of the resource to be imported. This id depends on
* the system the resource is comming from. it can be a filename, a
* display name of a webdav resource, an URI, etc.
Modified: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/ImportContextImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/ImportContextImpl.java?rev=830670&r1=830669&r2=830670&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/ImportContextImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/ImportContextImpl.java Wed Oct 28 16:50:36 2009
@@ -17,10 +17,15 @@
package org.apache.jackrabbit.server.io;
import org.apache.jackrabbit.webdav.io.InputContext;
+import org.apache.tika.detect.Detector;
+import org.apache.tika.metadata.Metadata;
+import org.apache.tika.mime.MediaType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.jcr.Item;
+
+import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
@@ -38,45 +43,13 @@
private final Item importRoot;
private final String systemId;
private final File inputFile;
- private final MimeResolver mimeResolver;
private InputContext inputCtx;
private boolean completed;
- /**
- * Creates a new item import context with the given root item and the
- * specified <code>InputContext</code>. If the input context provides an
- * input stream, the stream is written to a temporary file in order to avoid
- * problems with multiple IOHandlers that try to run the import but fail.
- * The temporary file is deleted as soon as this context is informed that
- * the import has been completed and it will not be used any more.
- *
- * @param importRoot the import root node
- * @param systemId
- * @param inputCtx wrapped by this <code>ImportContext</code>
- */
- public ImportContextImpl(Item importRoot, String systemId, InputContext inputCtx) throws IOException {
- this(importRoot, systemId, inputCtx, null);
- }
+ private final Detector detector;
- /**
- * Creates a new item import context with the given root item and the
- * specified <code>InputContext</code>. If the input context provides an
- * input stream, the stream is written to a temporary file in order to avoid
- * problems with multiple IOHandlers that try to run the import but fail.
- * The temporary file is deleted as soon as this context is informed that
- * the import has been completed and it will not be used any more.
- *
- * @param importRoot the import root node
- * @param systemId
- * @param inputCtx wrapped by this <code>ImportContext</code>
- * @param mimeResolver
- */
- public ImportContextImpl(Item importRoot, String systemId, InputContext inputCtx,
- MimeResolver mimeResolver) throws IOException {
- this(importRoot, systemId, (inputCtx != null) ? inputCtx.getInputStream() : null, null, mimeResolver);
- this.inputCtx = inputCtx;
- }
+ private final MediaType type;
/**
* Creates a new item import context. The specified InputStream is written
@@ -87,39 +60,35 @@
*
* @param importRoot
* @param systemId
- * @param in
+ * @param inputCtx input context, or <code>null</code>
+ * @param stream document input stream, or <code>null</code>
* @param ioListener
+ * @param detector content type detector
* @throws IOException
* @see ImportContext#informCompleted(boolean)
*/
- public ImportContextImpl(Item importRoot, String systemId, InputStream in,
- IOListener ioListener) throws IOException {
- this(importRoot, systemId, in, ioListener, null);
- }
-
- /**
- * Creates a new item import context. The specified InputStream is written
- * to a temporary file in order to avoid problems with multiple IOHandlers
- * that try to run the import but fail. The temporary file is deleted as soon
- * as this context is informed that the import has been completed and it
- * will not be used any more.
- *
- * @param importRoot
- * @param systemId
- * @param in
- * @param ioListener
- * @param mimeResolver
- * @throws IOException
- * @see ImportContext#informCompleted(boolean)
- */
- public ImportContextImpl(Item importRoot, String systemId, InputStream in,
- IOListener ioListener, MimeResolver mimeResolver)
+ public ImportContextImpl(
+ Item importRoot, String systemId, InputContext inputCtx,
+ InputStream stream, IOListener ioListener, Detector detector)
throws IOException {
this.importRoot = importRoot;
this.systemId = systemId;
- this.inputFile = IOUtil.getTempFile(in);
+ this.inputCtx = inputCtx;
this.ioListener = (ioListener != null) ? ioListener : new DefaultIOListener(log);
- this.mimeResolver = (mimeResolver == null) ? IOUtil.MIME_RESOLVER : mimeResolver;
+
+ Metadata metadata = new Metadata();
+ if (inputCtx != null && inputCtx.getContentType() != null) {
+ metadata.set(Metadata.CONTENT_TYPE, inputCtx.getContentType());
+ }
+ if (systemId != null) {
+ metadata.set(Metadata.RESOURCE_NAME_KEY, systemId);
+ }
+ if (stream != null && !stream.markSupported()) {
+ stream = new BufferedInputStream(stream);
+ }
+ this.detector = detector;
+ this.type = detector.detect(stream, metadata);
+ this.inputFile = IOUtil.getTempFile(stream);
}
/**
@@ -137,10 +106,10 @@
}
/**
- * @see ImportContext#getImportRoot()
+ * @see ImportContext#getDetector()
*/
- public MimeResolver getMimeResolver() {
- return mimeResolver;
+ public Detector getDetector() {
+ return detector;
}
/**
@@ -210,34 +179,17 @@
}
/**
- * @return the content type present on the <code>InputContext</code> or
- * <code>null</code>
- * @see InputContext#getContentType()
- */
- private String getContentType() {
- return (inputCtx != null) ? inputCtx.getContentType() : null;
- }
-
- /**
* @see ImportContext#getMimeType()
*/
public String getMimeType() {
- String contentType = getContentType();
- String mimeType = null;
- if (contentType != null) {
- mimeType = IOUtil.getMimeType(contentType);
- } else if (getSystemId() != null) {
- mimeType = mimeResolver.getMimeType(getSystemId());
- }
- return mimeType;
+ return IOUtil.getMimeType(type.toString());
}
/**
* @see ImportContext#getEncoding()
*/
public String getEncoding() {
- String contentType = getContentType();
- return (contentType != null) ? IOUtil.getEncoding(contentType) : null;
+ return IOUtil.getEncoding(type.toString());
}
/**
Modified: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/MimeResolver.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/MimeResolver.java?rev=830670&r1=830669&r2=830670&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/MimeResolver.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/MimeResolver.java Wed Oct 28 16:50:36 2009
@@ -1,103 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.jackrabbit.server.io;
-
-import org.apache.jackrabbit.util.Text;
-
-import java.io.IOException;
-import java.util.Properties;
-
-/**
- * This Class implements a very simple mime type resolver.
- */
-public class MimeResolver {
-
- /**
- * the loaded mimetypes
- */
- private Properties mimeTypes = new Properties();
-
- /**
- * the default mimetype
- */
- private String defaultMimeType = "application/octet-stream";
-
- /**
- * Creates a new mimetype resolver containing the default mappings and having
- * "application/octet-stream" set as default mimetype.
- */
- public MimeResolver() {
- try {
- // init the mime types
- mimeTypes.load(getClass().getResourceAsStream("mimetypes.properties"));
- } catch (IOException e) {
- throw new InternalError("Unable to load mimetypes: " + e.toString());
- }
- }
-
- /**
- * Creates a new mime type resolver extending the default mapping by the
- * entries of the given Properties. The default mimetype is set to the
- * given <code>defaultMimeType</code>.
- *
- * @param additionalProperties MimeType mappings to be added to the default
- * properties.
- * @param defaultMimeType The default mimetype. A non-null String with a
- * length greater than 0.
- */
- public MimeResolver(Properties additionalProperties, String defaultMimeType) {
- // init default mimetypes.
- this();
- // extend or adjust mapping.
- if (additionalProperties != null && !additionalProperties.isEmpty()) {
- mimeTypes.putAll(additionalProperties);
- }
- // set the default type.
- if (defaultMimeType != null && defaultMimeType.length() > 0) {
- this.defaultMimeType = defaultMimeType;
- }
- }
-
- /**
- * Returns the default mime type
- * @return
- */
- public String getDefaultMimeType() {
- return defaultMimeType;
- }
-
- /**
- * Sets the default mime type
- * @param defaultMimeType
- */
- public void setDefaultMimeType(String defaultMimeType) {
- this.defaultMimeType = defaultMimeType;
- }
-
- /**
- * Retrusn the mime type for the given name.
- * @param filename
- * @return
- */
- public String getMimeType(String filename) {
- String ext = Text.getName(filename, '.');
- if (ext.equals("")) {
- ext = filename;
- }
- return mimeTypes.getProperty(ext.toLowerCase(), defaultMimeType);
- }
-}
Modified: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/XmlHandler.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/XmlHandler.java?rev=830670&r1=830669&r2=830670&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/XmlHandler.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/XmlHandler.java Wed Oct 28 16:50:36 2009
@@ -149,7 +149,7 @@
if (contentNode.hasProperty(JcrConstants.JCR_MIMETYPE)) {
mimeType = contentNode.getProperty(JcrConstants.JCR_MIMETYPE).getString();
} else {
- mimeType = context.getMimeResolver().getMimeType(context.getExportRoot().getName());
+ mimeType = detect(context.getExportRoot().getName());
}
} catch (RepositoryException e) {
// ignore and return false
Modified: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/ZipHandler.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/ZipHandler.java?rev=830670&r1=830669&r2=830670&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/ZipHandler.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/ZipHandler.java Wed Oct 28 16:50:36 2009
@@ -153,7 +153,7 @@
if (contentNode.hasProperty(JcrConstants.JCR_MIMETYPE)) {
mimeType = contentNode.getProperty(JcrConstants.JCR_MIMETYPE).getString();
} else {
- mimeType = context.getMimeResolver().getMimeType(context.getExportRoot().getName());
+ mimeType = detect(context.getExportRoot().getName());
}
} catch (RepositoryException e) {
// ignore and return false
@@ -283,7 +283,8 @@
private final ZipEntry entry;
private ZipEntryImportContext(ImportContext context, ZipEntry entry, BoundedInputStream bin, Node contentNode) throws IOException, RepositoryException {
- super(contentNode, Text.getName(makeValidJCRPath(entry.getName(), true)), bin, context.getIOListener(), context.getMimeResolver());
+ super(contentNode, Text.getName(makeValidJCRPath(entry.getName(), true)),
+ null, bin, context.getIOListener(), getIOManager().getDetector());
this.entry = entry;
String path = makeValidJCRPath(entry.getName(), true);
importRoot = IOUtil.mkDirs(contentNode, Text.getRelativeParent(path, 1), getCollectionNodeType());
@@ -312,7 +313,7 @@
private OutputStream out;
private ZipEntryExportContext(Item exportRoot, OutputStream out, ExportContext context, int pos) {
- super(exportRoot, out != null, context.getIOListener(), context.getMimeResolver());
+ super(exportRoot, out != null, context.getIOListener());
this.out = out;
try {
String entryPath = (exportRoot.getPath().length() > pos) ? exportRoot.getPath().substring(pos) : "";
Modified: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/DavResourceImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/DavResourceImpl.java?rev=830670&r1=830669&r2=830670&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/DavResourceImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/DavResourceImpl.java Wed Oct 28 16:50:36 2009
@@ -897,7 +897,10 @@
* @throws IOException
*/
protected ImportContext getImportContext(InputContext inputCtx, String systemId) throws IOException {
- return new ImportContextImpl(node, systemId, inputCtx, config.getMimeResolver());
+ return new ImportContextImpl(
+ node, systemId, inputCtx,
+ (inputCtx != null) ? inputCtx.getInputStream() : null,
+ new DefaultIOListener(log), config.getDetector());
}
/**
@@ -908,7 +911,7 @@
* @throws IOException
*/
protected ExportContext getExportContext(OutputContext outputCtx) throws IOException {
- return new ExportContextImpl(node, outputCtx, config.getMimeResolver());
+ return new ExportContextImpl(node, outputCtx);
}
/**
Modified: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/ResourceConfig.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/ResourceConfig.java?rev=830670&r1=830669&r2=830670&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/ResourceConfig.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/ResourceConfig.java Wed Oct 28 16:50:36 2009
@@ -16,33 +16,33 @@
*/
package org.apache.jackrabbit.webdav.simple;
-import org.apache.jackrabbit.server.io.IOManager;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.jcr.Item;
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.ParserConfigurationException;
+
import org.apache.jackrabbit.server.io.DefaultIOManager;
import org.apache.jackrabbit.server.io.IOHandler;
-import org.apache.jackrabbit.server.io.PropertyManager;
+import org.apache.jackrabbit.server.io.IOManager;
import org.apache.jackrabbit.server.io.PropertyHandler;
+import org.apache.jackrabbit.server.io.PropertyManager;
import org.apache.jackrabbit.server.io.PropertyManagerImpl;
-import org.apache.jackrabbit.server.io.MimeResolver;
-import org.apache.jackrabbit.webdav.xml.ElementIterator;
import org.apache.jackrabbit.webdav.xml.DomUtil;
+import org.apache.jackrabbit.webdav.xml.ElementIterator;
+import org.apache.tika.detect.Detector;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.w3c.dom.Element;
import org.w3c.dom.Document;
+import org.w3c.dom.Element;
import org.xml.sax.SAXException;
-import javax.jcr.Item;
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.ParserConfigurationException;
-import java.net.URL;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Properties;
-import java.io.IOException;
-import java.io.InputStream;
-
/**
* <code>ResourceConfig</code>...
*/
@@ -50,12 +50,20 @@
private static Logger log = LoggerFactory.getLogger(ResourceConfig.class);
+ /**
+ * Content type detector.
+ */
+ private final Detector detector;
+
private ItemFilter itemFilter;
private IOManager ioManager;
private PropertyManager propManager;
private String[] nodetypeNames = new String[0];
private boolean collectionNames = false;
- private MimeResolver mimeResolver;
+
+ public ResourceConfig(Detector detector) {
+ this.detector = detector;
+ }
/**
* Tries to parse the given xml configuration file.
@@ -86,6 +94,11 @@
* >
* <!ELEMENT defaultmimetype (CDATA) >
* </pre>
+ * <p>
+ * The <mimetypeproperties/> settings have been deprecated and will
+ * be ignored with a warning. Instead you can use the
+ * {@link SimpleWebdavServlet#INIT_PARAM_MIME_INFO mime-info}
+ * servlet initialization parameter to customize the media type settings.
*
* @param configURL
*/
@@ -107,6 +120,7 @@
Object inst = buildClassFromConfig(el);
if (inst != null && inst instanceof IOManager) {
ioManager = (IOManager)inst;
+ ioManager.setDetector(detector);
// get optional 'iohandler' child elements and populate the
// ioManager with the instances
ElementIterator iohElements = DomUtil.getChildren(el, "iohandler", null);
@@ -177,21 +191,11 @@
log.debug("Resource configuration: no 'filter' element specified.");
}
- // optional mimetype properties
- Properties properties = new Properties();
- String defaultMimetype = null;
el = DomUtil.getChildElement(config, "mimetypeproperties", null);
if (el != null) {
- defaultMimetype = DomUtil.getChildText(el, "defaultmimetype", null);
- ElementIterator it = DomUtil.getChildren(el, "mimemapping", null);
- while (it.hasNext()) {
- Element mimeMapping = it.nextElement();
- String extension = DomUtil.getAttribute(mimeMapping, "extension", null);
- String mimetype = DomUtil.getAttribute(mimeMapping, "mimetype", null);
- properties.put(extension, mimetype);
- }
+ log.warn("Ignoring deprecated mimetypeproperties settings: {}",
+ configURL);
}
- mimeResolver = new MimeResolver(properties, defaultMimetype);
} catch (IOException e) {
log.debug("Invalid resource configuration: " + e.getMessage());
} catch (ParserConfigurationException e) {
@@ -270,6 +274,7 @@
if (ioManager == null) {
log.debug("ResourceConfig: missing io-manager > building DefaultIOManager ");
ioManager = new DefaultIOManager();
+ ioManager.setDetector(detector);
}
return ioManager;
}
@@ -331,10 +336,12 @@
}
/**
+ * Returns the configured content type detector.
*
- * @return
+ * @return content type detector
*/
- public MimeResolver getMimeResolver() {
- return mimeResolver;
+ public Detector getDetector() {
+ return detector;
}
-}
\ No newline at end of file
+
+}
Modified: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/ResourceFactoryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/ResourceFactoryImpl.java?rev=830670&r1=830669&r2=830670&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/ResourceFactoryImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/ResourceFactoryImpl.java Wed Oct 28 16:50:36 2009
@@ -50,17 +50,6 @@
/**
* Create a new <code>ResourceFactory</code> that uses the given lock
- * manager and the default {@link ResourceConfig resource config}.
- *
- * @param lockMgr
- */
- public ResourceFactoryImpl(LockManager lockMgr) {
- this.lockMgr = lockMgr;
- this.resourceConfig = new ResourceConfig();
- }
-
- /**
- * Create a new <code>ResourceFactory</code> that uses the given lock
* manager and resource filter.
*
* @param lockMgr
@@ -68,7 +57,7 @@
*/
public ResourceFactoryImpl(LockManager lockMgr, ResourceConfig resourceConfig) {
this.lockMgr = lockMgr;
- this.resourceConfig = (resourceConfig != null) ? resourceConfig : new ResourceConfig();
+ this.resourceConfig = resourceConfig;
}
/**
Modified: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/SimpleWebdavServlet.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/SimpleWebdavServlet.java?rev=830670&r1=830669&r2=830670&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/SimpleWebdavServlet.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/SimpleWebdavServlet.java Wed Oct 28 16:50:36 2009
@@ -28,13 +28,19 @@
import org.apache.jackrabbit.webdav.lock.LockManager;
import org.apache.jackrabbit.webdav.lock.SimpleLockManager;
import org.apache.jackrabbit.webdav.server.AbstractWebdavServlet;
+import org.apache.tika.detect.Detector;
+import org.apache.tika.mime.MimeTypeException;
+import org.apache.tika.mime.MimeTypesFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.jcr.Repository;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
+
+import java.io.IOException;
import java.net.MalformedURLException;
+import java.net.URL;
/**
* WebdavServlet provides webdav support (level 1 and 2 complient) for
@@ -76,6 +82,13 @@
public static final String INIT_PARAM_RESOURCE_CONFIG = "resource-config";
/**
+ * Name of the parameter that specifies the servlet resource path of
+ * a custom <mime-info/> configuration file. The default setting
+ * is to use the MIME media type database included in Apache Tika.
+ */
+ public static final String INIT_PARAM_MIME_INFO = "mime-info";
+
+ /**
* Servlet context attribute used to store the path prefix instead of
* having a static field with this servlet. The latter causes problems
* when running multiple
@@ -150,10 +163,10 @@
}
log.info("WWW-Authenticate header = '" + authenticate_header + "'");
+ config = new ResourceConfig(getDetector());
String configParam = getInitParameter(INIT_PARAM_RESOURCE_CONFIG);
if (configParam != null) {
try {
- config = new ResourceConfig();
config.parse(getServletContext().getResource(configParam));
} catch (MalformedURLException e) {
log.debug("Unable to build resource filter provider.");
@@ -162,6 +175,40 @@
}
/**
+ * Reads and returns the configured <mime-info/> database.
+ *
+ * @see #INIT_PARAM_MIME_INFO
+ * @return MIME media type database
+ * @throws ServletException if the database is invalid or can not be read
+ */
+ private Detector getDetector() throws ServletException {
+ URL url;
+
+ String mimeInfo = getInitParameter(INIT_PARAM_MIME_INFO);
+ if (mimeInfo != null) {
+ try {
+ url = getServletContext().getResource(mimeInfo);
+ } catch (MalformedURLException e) {
+ throw new ServletException(
+ "Invalid " + INIT_PARAM_MIME_INFO
+ + " configuration setting: " + mimeInfo, e);
+ }
+ } else {
+ url = MimeTypesFactory.class.getResource("tika-mimetypes.xml");
+ }
+
+ try {
+ return MimeTypesFactory.create(url);
+ } catch (MimeTypeException e) {
+ throw new ServletException(
+ "Invalid MIME media type database: " + url, e);
+ } catch (IOException e) {
+ throw new ServletException(
+ "Unable to read MIME media type database: " + url, e);
+ }
+ }
+
+ /**
* {@inheritDoc}
*/
protected boolean isPreconditionValid(WebdavRequest request,
@@ -345,10 +392,6 @@
* @return the resource configuration.
*/
public ResourceConfig getResourceConfig() {
- // fallback if no config present
- if (config == null) {
- config = new ResourceConfig();
- }
return config;
}