/* * 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.nutch.webapp.servlet; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.nutch.plugin.PluginDescriptor; /** * Simple Servlet that serves resources from plugins. * * Plugin must put resources to be exposed into path /resources/ for example * resource /resources/possible/sub/folder/resource.jpg will then be available * in location <contextPath>/resources/<plugin_id>/possible/sub/folder/resource.jpg * */ public class ResourceServlet extends NutchHttpServlet { private static final String PATH = "/resources/"; private static final long serialVersionUID = 1L; /** * Extract plugin id from path. * * @param path * @return */ private String getPluginId(final String path) { String pluginid = null; if (path != null && path.length() >= PATH.length()) { String stripped = path.substring(PATH.length()); if (stripped.indexOf("/") != -1) { pluginid = stripped.substring(0, stripped.indexOf("/")); } } return pluginid; } /** * Extract plugin relative path from path. * * @param path * @return */ private String getPluginRelativePath(final String path) { String resource = path.substring(PATH.length() + getPluginId(path).length() + 1); return resource; } /** * Process a request for resource inside plugin */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PluginDescriptor descriptor = null; String resPath = null; String path = getContextRelativePath(request); String id = getPluginId(path); if (id != null) { resPath = PATH.substring(1) + getPluginRelativePath(path); descriptor = getServiceLocator().getPluginRepository() .getPluginDescriptor(id); if (descriptor != null) { if (descriptor != null) { InputStream is = descriptor.getClassLoader().getResourceAsStream( resPath); if (is != null) { // buffer for content byte[] buffer = new byte[response.getBufferSize()]; int len; String contentType = getServletContext().getMimeType(path) .toString(); response.setContentType(contentType); while ((len = is.read(buffer)) != -1) { // copy to outputStream response.getOutputStream().write(buffer, 0, len); } is.close(); response.flushBuffer(); return; } } } } //of no resource was found dispay error response.setContentType("text/plain"); PrintWriter pw = response.getWriter(); pw.println("type:" + getServletContext().getMimeType(path)); pw.println("path:" + path); pw.println("plugin-id:" + id); pw.println("plugin:" + descriptor); pw.println("plugin relative path:" + resPath); return; } }