package com.delcyon.capo.webapp.servlets.resource; /* * Derived from ResourceServlet.java: * Copyright (c) 2012. betterFORM Project - http://www.betterform.de * Licensed under the terms of BSD License */ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.delcyon.capo.CapoApplication; public class WebResourcesServlet extends AbstractResourceServlet { private static final String resourceJARPath = ""; private final static String resourcePattern = "/wr/"; private final static String resourceFolder = "/web_resources/"; private static Map<String, String> mimeTypes; private static List<ResourceStreamer> resourceStreamers; private static String defaultVersion; private long lastModified = 0; private ServletConfig servletConfig; @Override public void init(ServletConfig config) throws ServletException { super.init(config); defaultVersion = getInitParameter("defaultVersion"); if (defaultVersion == null || defaultVersion.trim().length() == 0) { defaultVersion = ""; } Logger.getGlobal().log(Level.FINEST, "Using default version: '" + defaultVersion+"'"); servletConfig = config; lastModified = getLastModifiedValue(); Logger.getGlobal().log(Level.FINEST, "Using last modified: " + new SimpleDateFormat("MM/dd/yyyy hh:mm a").format(lastModified)); } @Override protected void initMimeTypes() { mimeTypes = new HashMap<String, String>(); mimeTypes.put("css", "text/css"); mimeTypes.put("js", "text/javascript"); mimeTypes.put("jpg", "image/jpeg"); mimeTypes.put("jpeg", "image/jpeg"); mimeTypes.put("png", "image/png"); mimeTypes.put("gif", "image/gif"); mimeTypes.put("gif", "image/gif"); mimeTypes.put("html", "text/html"); } @Override protected void initResourceStreamers() { resourceStreamers = new ArrayList<ResourceStreamer>(); resourceStreamers.add(new DefaultResourceStreamer()); } @Override public String getResourcePath(String requestURI) { String path = null; int queryIndex = requestURI.indexOf("?"); if (queryIndex != -1) { requestURI = requestURI.substring(0, queryIndex); } // if the request specifies a particular version (/js/dojo/x.y.z/dojo...) try that first if (requestURI.matches("^" + resourcePattern + ".*") == true) { path = resourceFolder + requestURI.substring(resourcePattern.length()); // if path doesn't map to an actual resource, we'll blank it out and try to find it in defaultVersion below if (AbstractResourceServlet.class.getResource(path) == null) { path = null; } } // use defaultVersion to try to locate the resource if (path == null) { path = resourceFolder + defaultVersion + "/" + requestURI.substring(resourcePattern.length()); } return path; } /** * Return a MimeType String for the given fileExtension or null if fileExtension is not one we handle here */ @Override protected String getMimeType(String fileExtension) { return mimeTypes.get(fileExtension); } /** * Return the lastModified date for our dojo.jar. Used to set response header when caching is enabled (see ResourceServlet.java) */ @Override protected long getLastModifiedValue() { if (this.lastModified == 0) { String realPath = servletConfig.getServletContext().getRealPath(resourceJARPath); if(realPath == null) { return System.currentTimeMillis(); } File file = new File(realPath); if (file.exists() == true) { this.lastModified = file.lastModified(); } } return lastModified; } /** * Takes an input stream and MimeType string, attempts to locate a suitable ResourceStreamer for the MimeType and, if one is found, uses it to stream the input stream to the response */ @Override protected void streamResource(HttpServletRequest request, HttpServletResponse response, String mimeType, InputStream inputStream) throws IOException { for (ResourceStreamer streamer : resourceStreamers) { if (streamer.isAppropriateStreamer(mimeType)) { streamer.stream(request, response, inputStream); } } } }