You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by fm...@apache.org on 2008/02/06 12:20:36 UTC
svn commit: r618964 - in
/incubator/sling/trunk/launchpad/launchpad-servlets/src/main/java/org/apache/sling/launchpad:
renderers/StreamRendererServlet.java servlets/LaunchpadDefaultServlet.java
Author: fmeschbe
Date: Wed Feb 6 03:20:32 2008
New Revision: 618964
URL: http://svn.apache.org/viewvc?rev=618964&view=rev
Log:
SLING-224 create resource streamer servlet to stream streamable resources when
requested without a request extension or when the request extension is ".res"
Added:
incubator/sling/trunk/launchpad/launchpad-servlets/src/main/java/org/apache/sling/launchpad/renderers/StreamRendererServlet.java
Modified:
incubator/sling/trunk/launchpad/launchpad-servlets/src/main/java/org/apache/sling/launchpad/servlets/LaunchpadDefaultServlet.java
Added: incubator/sling/trunk/launchpad/launchpad-servlets/src/main/java/org/apache/sling/launchpad/renderers/StreamRendererServlet.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/launchpad/launchpad-servlets/src/main/java/org/apache/sling/launchpad/renderers/StreamRendererServlet.java?rev=618964&view=auto
==============================================================================
--- incubator/sling/trunk/launchpad/launchpad-servlets/src/main/java/org/apache/sling/launchpad/renderers/StreamRendererServlet.java (added)
+++ incubator/sling/trunk/launchpad/launchpad-servlets/src/main/java/org/apache/sling/launchpad/renderers/StreamRendererServlet.java Wed Feb 6 03:20:32 2008
@@ -0,0 +1,141 @@
+/*
+ * 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.sling.launchpad.renderers;
+
+import static javax.servlet.http.HttpServletResponse.SC_NOT_MODIFIED;
+import static org.apache.sling.api.servlets.HttpConstants.HEADER_IF_MODIFIED_SINCE;
+import static org.apache.sling.api.servlets.HttpConstants.HEADER_LAST_MODIFIED;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.api.SlingHttpServletResponse;
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceMetadata;
+import org.apache.sling.api.servlets.SlingSafeMethodsServlet;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class StreamRendererServlet extends SlingSafeMethodsServlet {
+
+ private static final long serialVersionUID = -1L;
+
+ /** default log */
+ private final Logger log = LoggerFactory.getLogger(getClass());
+
+ public StreamRendererServlet() {
+ }
+
+ @Override
+ protected void doGet(SlingHttpServletRequest request,
+ SlingHttpServletResponse response) throws IOException {
+
+ Resource resource = request.getResource();
+ ResourceMetadata meta = resource.getResourceMetadata();
+
+ // check the last modification time and If-Modified-Since header
+ Long modifTime = (Long) meta.get(ResourceMetadata.MODIFICATION_TIME);
+ if (unmodified(request, modifTime)) {
+ response.setStatus(SC_NOT_MODIFIED);
+ return;
+ }
+
+ // fail if the resource does not adapt to an InputStream
+ InputStream stream = resource.adaptTo(InputStream.class);
+ if (stream == null) {
+ log.error("service: Resource {} does not adapt to an InputStream",
+ resource);
+ response.sendError(HttpServletResponse.SC_NOT_FOUND);
+ return;
+ }
+
+ // finally stream the resource
+ try {
+
+ if (modifTime != null) {
+ response.setDateHeader(HEADER_LAST_MODIFIED, modifTime);
+ }
+
+ final String defaultContentType = "application/octet-stream";
+ String contentType = (String) meta.get(ResourceMetadata.CONTENT_TYPE);
+ if (contentType == null || defaultContentType.equals(contentType)) {
+ // if repository doesn't provide a content-type, or
+ // provides the
+ // default one,
+ // try to do better using our servlet context
+ final String ct = getServletContext().getMimeType(
+ resource.getPath());
+ if (ct != null) {
+ contentType = ct;
+ }
+ }
+ if (contentType != null) {
+ response.setContentType(contentType);
+ }
+
+ String encoding = (String) meta.get(ResourceMetadata.CHARACTER_ENCODING);
+ if (encoding != null) {
+ response.setCharacterEncoding(encoding);
+ }
+
+ OutputStream out = response.getOutputStream();
+
+ byte[] buf = new byte[1024];
+ int rd;
+ while ((rd = stream.read(buf)) >= 0) {
+ out.write(buf, 0, rd);
+ }
+
+ } finally {
+ try {
+ stream.close();
+ } catch (IOException ignore) {
+ // don't care
+ }
+ }
+ }
+
+ /**
+ * Returns <code>true</code> if the request has a
+ * <code>If-Modified-Since</code> header whose date value is later than
+ * the last modification time given as <code>modifTime</code>.
+ *
+ * @param request The <code>ComponentRequest</code> checked for the
+ * <code>If-Modified-Since</code> header.
+ * @param modifTime The last modification time to compare the header to.
+ * @return <code>true</code> if the <code>modifTime</code> is less than
+ * or equal to the time of the <code>If-Modified-Since</code>
+ * header.
+ */
+ private boolean unmodified(HttpServletRequest request, Long modifTime) {
+ if (modifTime != null) {
+ long modTime = modifTime / 1000; // seconds
+ long ims = request.getDateHeader(HEADER_IF_MODIFIED_SINCE) / 1000;
+ return modTime <= ims;
+ }
+
+ // we have no modification time value, assume modified
+ return false;
+ }
+
+}
\ No newline at end of file
Modified: incubator/sling/trunk/launchpad/launchpad-servlets/src/main/java/org/apache/sling/launchpad/servlets/LaunchpadDefaultServlet.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/launchpad/launchpad-servlets/src/main/java/org/apache/sling/launchpad/servlets/LaunchpadDefaultServlet.java?rev=618964&r1=618963&r2=618964&view=diff
==============================================================================
--- incubator/sling/trunk/launchpad/launchpad-servlets/src/main/java/org/apache/sling/launchpad/servlets/LaunchpadDefaultServlet.java (original)
+++ incubator/sling/trunk/launchpad/launchpad-servlets/src/main/java/org/apache/sling/launchpad/servlets/LaunchpadDefaultServlet.java Wed Feb 6 03:20:32 2008
@@ -18,31 +18,24 @@
*/
package org.apache.sling.launchpad.servlets;
-import static javax.servlet.http.HttpServletResponse.SC_NOT_MODIFIED;
-import static org.apache.sling.api.servlets.HttpConstants.HEADER_IF_MODIFIED_SINCE;
-import static org.apache.sling.api.servlets.HttpConstants.HEADER_LAST_MODIFIED;
-
import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.resource.NonExistingResource;
import org.apache.sling.api.resource.Resource;
-import org.apache.sling.api.resource.ResourceMetadata;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.apache.sling.launchpad.renderers.DefaultHtmlRendererServlet;
import org.apache.sling.launchpad.renderers.JsonRendererServlet;
import org.apache.sling.launchpad.renderers.PlainTextRendererServlet;
+import org.apache.sling.launchpad.renderers.StreamRendererServlet;
import org.apache.sling.ujax.UjaxPostServlet;
/**
@@ -77,6 +70,8 @@
private Servlet postServlet;
private Servlet defaultGetServlet;
+
+ private Servlet streamServlet;
private Servlet ujaxInfoServlet;
@@ -95,11 +90,13 @@
ujaxInfoServlet.init(config);
defaultGetServlet = new PlainTextRendererServlet("text/plain");
+ streamServlet = new StreamRendererServlet();
getServlets = new HashMap<String, Servlet>();
getServlets.put("html", new DefaultHtmlRendererServlet("text/html"));
getServlets.put("json", new JsonRendererServlet("application/json"));
getServlets.put("txt", defaultGetServlet);
+ getServlets.put("res", streamServlet);
}
protected void doGet(SlingHttpServletRequest request,
@@ -121,7 +118,6 @@
// render using a servlet or binary streaming
Servlet s = defaultGetServlet;
- InputStream stream = null;
final String ext = request.getRequestPathInfo().getExtension();
if (ext != null && ext.length() > 0) {
// if there is an extension, lookup our getServlets
@@ -129,13 +125,11 @@
} else {
// no extension means we're addressing a static file directly
// check whether the resource adapts to a stream, spool then
- stream = resource.adaptTo(InputStream.class);
+ s = streamServlet;
}
// render using stream, s, or fail
- if (stream != null) {
- stream(request, response, resource, stream);
- } else if (s != null) {
+ if (s != null) {
s.service(request, response);
} else {
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
@@ -147,88 +141,6 @@
SlingHttpServletResponse response) throws ServletException,
IOException {
postServlet.service(request, response);
- }
-
- /** Stream the Resource to response */
- private void stream(HttpServletRequest request,
- HttpServletResponse response, Resource resource, InputStream stream)
- throws IOException {
-
- ResourceMetadata meta = resource.getResourceMetadata();
-
- // check the last modification time and If-Modified-Since header
- Long modifTime = (Long) meta.get(ResourceMetadata.MODIFICATION_TIME);
- if (unmodified(request, modifTime)) {
-
- response.setStatus(SC_NOT_MODIFIED);
-
- } else {
-
- if (modifTime != null) {
- response.setDateHeader(HEADER_LAST_MODIFIED, modifTime);
- }
-
- final String defaultContentType = "application/octet-stream";
- String contentType = (String) meta.get(ResourceMetadata.CONTENT_TYPE);
- if (contentType == null || defaultContentType.equals(contentType)) {
- // if repository doesn't provide a content-type, or provides the
- // default one,
- // try to do better using our servlet context
- final String ct = getServletContext().getMimeType(
- resource.getPath());
- if (ct != null) {
- contentType = ct;
- }
- }
- if (contentType != null) {
- response.setContentType(contentType);
- }
-
- String encoding = (String) meta.get(ResourceMetadata.CHARACTER_ENCODING);
- if (encoding != null) {
- response.setCharacterEncoding(encoding);
- }
-
- try {
- OutputStream out = response.getOutputStream();
-
- byte[] buf = new byte[1024];
- int rd;
- while ((rd = stream.read(buf)) >= 0) {
- out.write(buf, 0, rd);
- }
-
- } finally {
- try {
- stream.close();
- } catch (IOException ignore) {
- // don't care
- }
- }
- }
- }
-
- /**
- * Returns <code>true</code> if the request has a
- * <code>If-Modified-Since</code> header whose date value is later than
- * the last modification time given as <code>modifTime</code>.
- *
- * @param request The <code>ComponentRequest</code> checked for the
- * <code>If-Modified-Since</code> header.
- * @param modifTime The last modification time to compare the header to.
- * @return <code>true</code> if the <code>modifTime</code> is less than
- * or equal to the time of the <code>If-Modified-Since</code>
- * header.
- */
- private boolean unmodified(HttpServletRequest request, Long modifTime) {
- if (modifTime != null) {
- long modTime = modifTime / 1000; // seconds
- long ims = request.getDateHeader(HEADER_IF_MODIFIED_SINCE) / 1000;
- return modTime <= ims;
- }
-
- // we have no modification time value, assume modified
- return false;
}
}