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/28 13:42:51 UTC
svn commit: r631943 -
/incubator/sling/trunk/sling/servlet-resolver/src/main/java/org/apache/sling/servlet/resolver/defaults/DefaultServlet.java
Author: fmeschbe
Date: Thu Feb 28 04:42:50 2008
New Revision: 631943
URL: http://svn.apache.org/viewvc?rev=631943&view=rev
Log:
SLING-287 Cut down DefaultServlet to send a 404/NOT FOUND in case the URL
does not address a resource or 500/INTERNAL SERVER ERROR if no servlet
can be resolved to handle the resource
Modified:
incubator/sling/trunk/sling/servlet-resolver/src/main/java/org/apache/sling/servlet/resolver/defaults/DefaultServlet.java
Modified: incubator/sling/trunk/sling/servlet-resolver/src/main/java/org/apache/sling/servlet/resolver/defaults/DefaultServlet.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/sling/servlet-resolver/src/main/java/org/apache/sling/servlet/resolver/defaults/DefaultServlet.java?rev=631943&r1=631942&r2=631943&view=diff
==============================================================================
--- incubator/sling/trunk/sling/servlet-resolver/src/main/java/org/apache/sling/servlet/resolver/defaults/DefaultServlet.java (original)
+++ incubator/sling/trunk/sling/servlet-resolver/src/main/java/org/apache/sling/servlet/resolver/defaults/DefaultServlet.java Thu Feb 28 04:42:50 2008
@@ -19,30 +19,15 @@
package org.apache.sling.servlet.resolver.defaults;
import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Properties;
-import java.util.TreeMap;
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
-import org.apache.commons.beanutils.BeanMap;
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.SlingSafeMethodsServlet;
-import org.apache.sling.commons.json.JSONException;
-import org.apache.sling.commons.json.jcr.JsonItemWriter;
/**
* The <code>DefaultServlet</code> is a very simple default resource handler.
@@ -52,221 +37,20 @@
*/
public class DefaultServlet extends SlingSafeMethodsServlet {
- /** This optional request parameter sets the recursion level
- * (into chldren) when dumping a node */
- public static final String PARAM_RECURSION_LEVEL = "maxlevels";
-
@Override
protected void doGet(SlingHttpServletRequest request,
- SlingHttpServletResponse response) throws ServletException,
- IOException {
+ SlingHttpServletResponse response) throws IOException {
Resource resource = request.getResource();
// cannot handle the request for missing resources
if (resource instanceof NonExistingResource) {
- response.sendError(HttpServletResponse.SC_NOT_FOUND,"Resource not found at path " + resource.getPath());
- return;
- }
-
- String extension = request.getRequestPathInfo().getExtension();
-
- // check whether we have a directly addressed script
- if (extension == null) {
-
- // check whether the resource adapts to a stream, spool then
- InputStream stream = resource.adaptTo(InputStream.class);
- if (stream != null) {
- stream(response, resource, stream);
- return;
- }
-
- }
-
- // format response according to extension (use Mime mapping instead)
- if ("html".equals(extension) || "htm".equals(extension)) {
- this.renderContentHtml(resource, response);
- } else if ("xml".equals(extension)) {
- this.renderContentXML(resource, response);
- } else if ("properties".equals(extension)) {
- this.renderContentProperties(resource, response);
- } else if ("json".equals(extension)) {
- this.renderContentJson(resource, request, response);
+ response.sendError(HttpServletResponse.SC_NOT_FOUND,
+ "Resource not found at path " + resource.getPath());
} else {
- // default rendering as plain text
- this.renderContentText(resource, response);
- }
- }
-
- private void renderContentHtml(Resource resource,
- SlingHttpServletResponse response) throws IOException {
- Map<Object, Object> contentMap = new TreeMap<Object, Object>(
- this.asMap(resource));
-
- response.setContentType("text/html; charset=UTF-8");
- PrintWriter pw = response.getWriter();
-
- pw.println("<html><head><title>");
- pw.println(resource.getPath());
- pw.println("</title></head><body bgcolor='white' fgcolor='black'>");
- pw.println("<h1>Contents of <code>" + resource.getPath()
- + "</code></h1>");
-
- pw.println("<table>");
- pw.println("<tr><th>name</th><th>Value</th></tr>");
-
- for (Map.Entry<Object, Object> entry : contentMap.entrySet()) {
- pw.println("<tr><td>" + entry.getKey() + "</td><td>"
- + entry.getValue() + "</td></tr>");
- }
-
- pw.println("</body></html>");
- }
-
- private void renderContentText(Resource resource,
- SlingHttpServletResponse response) throws IOException {
- Map<Object, Object> contentMap = new TreeMap<Object, Object>(
- this.asMap(resource));
-
- response.setContentType("text/plain; charset=UTF-8");
- PrintWriter pw = response.getWriter();
-
- pw.println("Contents of " + resource.getPath());
- pw.println();
-
- for (Map.Entry<Object, Object> entry : contentMap.entrySet()) {
- pw.println(entry.getKey() + ": " + entry.getValue());
- }
- }
-
- private void renderContentProperties(Resource resource,
- SlingHttpServletResponse response) throws IOException {
- Properties props = new Properties();
-
- Map<Object, Object> contentMap = new TreeMap<Object, Object>(
- this.asMap(resource));
- for (Map.Entry<Object, Object> entry : contentMap.entrySet()) {
- props.setProperty(String.valueOf(entry.getKey()),
- String.valueOf(entry.getValue()));
- }
-
- response.setContentType("text/plain; charset=ISO-8859-1");
-
- OutputStream out = response.getOutputStream();
- props.store(out, "Contents of " + resource.getPath());
- }
-
- private void renderContentXML(Resource resource,
- SlingHttpServletResponse response) throws IOException {
- Map<Object, Object> contentMap = new TreeMap<Object, Object>(
- this.asMap(resource));
-
- response.setContentType("text/xml; charset=UTF-8");
- PrintWriter pw = response.getWriter();
-
- pw.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
- pw.println("<content>");
-
- for (Map.Entry<Object, Object> entry : contentMap.entrySet()) {
-
- pw.println(" <property>");
- pw.println(" <name>" + entry.getKey() + "</name>");
-
- if (entry.getValue() instanceof Collection) {
- pw.println(" <values>");
- Collection<?> coll = (Collection<?>) entry.getValue();
- for (Iterator<?> ci = coll.iterator(); ci.hasNext();) {
- pw.println(" <value>" + ci.next() + "</value>");
- }
- pw.println(" </values>");
-
- } else {
- pw.println(" <value>" + entry.getValue() + "</value>");
- }
- pw.println(" </property>");
- }
-
- pw.println("</content>");
- }
-
- private void renderContentJson(Resource resource,
- SlingHttpServletRequest request,
- SlingHttpServletResponse response) throws IOException {
- // how many levels deep?
- int maxRecursionLevels = 1;
- if (request.getRequestPathInfo().getSelectors().length > 0) {
- try {
- maxRecursionLevels = Integer.parseInt(request.getRequestPathInfo().getSelectors()[0]);
- } catch(Exception e) {
- // TODO ignore
- }
- }
-
- response.setContentType("text/x-json");
- response.setCharacterEncoding("UTF-8");
- final PrintWriter pw = response.getWriter();
- final JsonItemWriter itemWriter = new JsonItemWriter(null);
- try {
- final Node node =resource.adaptTo(Node.class);
- if ( node != null ) {
- itemWriter.dump(node, pw, maxRecursionLevels);
- }
- } catch(JSONException je) {
- throw new IOException(je.getMessage());
- } catch(RepositoryException re) {
- throw new IOException(re.getMessage());
- }
- }
-
- private void stream(HttpServletResponse response, Resource resource,
- InputStream stream) throws IOException {
-
- ResourceMetadata meta = resource.getResourceMetadata();
-
- String contentType = meta.getContentType();
- if (contentType == null) {
- contentType = getServletContext().getMimeType(resource.getPath());
- }
- if (contentType != null) {
- response.setContentType(contentType);
- }
-
- String encoding = meta.getCharacterEncoding();
- 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
- }
+ response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
+ "Cannot find servlet to handle resource " + resource.getPath());
}
}
- @SuppressWarnings("unchecked")
- private Map<Object, Object> asMap(Resource resource) {
-
- Object object = resource.adaptTo(Object.class);
- if (object != null) {
- if (object instanceof Map) {
- return (Map<Object, Object>) object; // unchecked cast
- }
-
- return new BeanMap(object); // unchecked cast
- }
-
- // no objects available
- return Collections.EMPTY_MAP; // unchecked cast
- }
}