Repository: marmotta Updated Branches: refs/heads/MARMOTTA-499 [created] f89f61f21
MARMOTTA-499: replaced mime-utils to detect resources' mimetype Project: http://git-wip-us.apache.org/repos/asf/marmotta/repo Commit: http://git-wip-us.apache.org/repos/asf/marmotta/commit/f89f61f2 Tree: http://git-wip-us.apache.org/repos/asf/marmotta/tree/f89f61f2 Diff: http://git-wip-us.apache.org/repos/asf/marmotta/diff/f89f61f2 Branch: refs/heads/MARMOTTA-499 Commit: f89f61f2128fcb70db885b31b42077782ad411a6 Parents: 4a188e6 Author: Sergio Fernández <[email protected]> Authored: Tue Jul 8 10:33:18 2014 +0200 Committer: Sergio Fernández <[email protected]> Committed: Tue Jul 8 10:33:18 2014 +0200 ---------------------------------------------------------------------- .../modules/MarmottaResourceServiceImpl.java | 74 +++++++------------- 1 file changed, 24 insertions(+), 50 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/marmotta/blob/f89f61f2/platform/marmotta-core/src/main/java/org/apache/marmotta/platform/core/services/modules/MarmottaResourceServiceImpl.java ---------------------------------------------------------------------- diff --git a/platform/marmotta-core/src/main/java/org/apache/marmotta/platform/core/services/modules/MarmottaResourceServiceImpl.java b/platform/marmotta-core/src/main/java/org/apache/marmotta/platform/core/services/modules/MarmottaResourceServiceImpl.java index 480f541..a1638bf 100644 --- a/platform/marmotta-core/src/main/java/org/apache/marmotta/platform/core/services/modules/MarmottaResourceServiceImpl.java +++ b/platform/marmotta-core/src/main/java/org/apache/marmotta/platform/core/services/modules/MarmottaResourceServiceImpl.java @@ -18,8 +18,6 @@ package org.apache.marmotta.platform.core.services.modules; import com.google.common.io.ByteStreams; -import eu.medsea.mimeutil.MimeType; -import eu.medsea.mimeutil.MimeUtil2; import org.apache.marmotta.platform.core.api.config.ConfigurationService; import org.apache.marmotta.platform.core.api.modules.MarmottaResourceService; import org.apache.marmotta.platform.core.api.modules.ModuleService; @@ -27,6 +25,7 @@ import org.apache.marmotta.platform.core.api.modules.ResourceEntry; import org.apache.marmotta.platform.core.events.SystemStartupEvent; import org.apache.marmotta.platform.core.model.module.ModuleConfiguration; import org.apache.marmotta.platform.core.qualifiers.cache.MarmottaCache; +import org.apache.tika.Tika; import org.slf4j.Logger; import javax.annotation.PostConstruct; @@ -35,7 +34,8 @@ import javax.enterprise.event.Observes; import javax.inject.Inject; import java.io.IOException; import java.net.URL; -import java.util.Collection; +import java.nio.file.Files; +import java.nio.file.Paths; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentMap; @@ -47,7 +47,8 @@ import java.util.concurrent.ConcurrentMap; * Note that the resource service is not to be confused with the RDF resources maintained by the server. It is * purely meant to retrieve static non-Java resources contained in the modules and web application. * - * User: sschaffe + * @author Sebastian Schaffert + * @author Sergio Fernández */ @ApplicationScoped public class MarmottaResourceServiceImpl implements MarmottaResourceService { @@ -58,48 +59,34 @@ public class MarmottaResourceServiceImpl implements MarmottaResourceService { @Inject private ConfigurationService configurationService; - @Inject private ModuleService moduleService; - @Inject @MarmottaCache("resource-cache") private ConcurrentMap resourceCache; - /** - * Used for detecting the mime type of resources contained in KiWi modules - */ - private MimeUtil2 mimeUtil; - - private Map<String,String> resourceMap; + private Tika tika; @PostConstruct public void initialise() { // find all kiwi-module.properties and check whether they contain a baseurl property to map module web // resources to a certain path prefix; if yes, store the prefix and jar URL in the map for lookup and // resource resolving by the filter - this.resourceMap = new HashMap<String, String>(); - + this.resourceMap = new HashMap<>(); for(String module : moduleService.listModules()) { ModuleConfiguration config = moduleService.getModuleConfiguration(module); - if(config.getConfiguration().containsKey("baseurl")) { String path = config.getConfiguration().getString("baseurl"); resourceMap.put(path.startsWith("/")?path:"/"+path,moduleService.getModuleJar(module).toString()); } } - - - // detect the mime type of resources - this.mimeUtil = new MimeUtil2(); - this.mimeUtil.registerMimeDetector("eu.medsea.mimeutil.detector.ExtensionMimeDetector"); + this.tika = new Tika(); } - /** * Makes sure the service is initialised on system startup * @@ -109,7 +96,6 @@ public class MarmottaResourceServiceImpl implements MarmottaResourceService { } - /** * Return the resource identified by the relative URL passed as argument. The passed argument is relative * to the web application root of this web application. @@ -131,17 +117,13 @@ public class MarmottaResourceServiceImpl implements MarmottaResourceService { if(isCached(relativeURL)) { data = getFromCache(relativeURL); } else { - try { URL jarUrl = resolveResource(relativeURL); - if(jarUrl != null) { try { byte[] bytes = ByteStreams.toByteArray(jarUrl.openStream()); - - data = new ResourceEntry(jarUrl,bytes,bytes.length,getMimeType(jarUrl)); - - log.debug("retrieved resource {} (mime type {}, length {} bytes)", jarUrl.toString(), data.getContentType(),data.getLength()); + data = new ResourceEntry(jarUrl, bytes, bytes.length, getMimeType(jarUrl)); + log.debug("retrieved resource {} (mime type {}, length {} bytes)", jarUrl.toString(), data.getContentType(), data.getLength()); } catch (NullPointerException e) { // This happens if a directory is accessed in the jar-file. data = null; @@ -149,12 +131,10 @@ public class MarmottaResourceServiceImpl implements MarmottaResourceService { putInCache(relativeURL,data); } else { putInCache(relativeURL,null); - - log.debug("resource {} not found in any module",relativeURL); + log.debug("resource {} not found in any module", relativeURL); } - } catch(IOException ex) { - log.debug("error while trying to retrieve resource {}: {}",relativeURL,ex.getMessage()); + log.debug("error while trying to retrieve resource {}: {}", relativeURL, ex.getMessage()); } } return data; @@ -194,7 +174,6 @@ public class MarmottaResourceServiceImpl implements MarmottaResourceService { jarUrlEntry = jarUrlBase + (jarUrlBase.endsWith("/")?"":"/") + "web" + ( entryPath.startsWith("/") ? entryPath : "/" + entryPath); } - try { return new URL(jarUrlEntry); @@ -207,15 +186,10 @@ public class MarmottaResourceServiceImpl implements MarmottaResourceService { return null; } - - - - private boolean isCacheEnabled() { return configurationService.getBooleanConfiguration("resources.servercache.enabled", false); } - private boolean isCached(String key) { return isCacheEnabled() && resourceCache.containsKey(key) && resourceCache.get(key) != null; } @@ -227,26 +201,26 @@ public class MarmottaResourceServiceImpl implements MarmottaResourceService { return null; } - // Store in the cache + /** + * Store in the cache + */ private void putInCache(String key, ResourceEntry data) { if(isCacheEnabled()) { resourceCache.put(key,data); } } - private String getMimeType(URL resource) { - - @SuppressWarnings("unchecked") - Collection<MimeType> types = mimeUtil.getMimeTypes(resource); - - if(types.size() > 0) { - MimeType t = types.iterator().next(); - return t.toString(); - } else - return null; - + return getMimeType(resource.toString()); } + private String getMimeType(String resource) { + try { + return Files.probeContentType(Paths.get(resource)); + } catch (IOException e) { + log.error("No mimetype detected for resource {} by Java NIO, so switching to Tika: {}", resource, e.getMessage()); + return tika.detect(resource); + } + } }
