Author: fmeschbe
Date: Mon Dec 17 03:44:56 2007
New Revision: 604843
URL: http://svn.apache.org/viewvc?rev=604843&view=rev
Log:
SLING-137 Remove ScriptResolver implementations
Additionally start implementing more flexible default servlet support
Added:
incubator/sling/trunk/sling/core/src/main/java/org/apache/sling/core/impl/servlets/SlingScriptServlet.java
Removed:
incubator/sling/trunk/sling/core/src/main/java/org/apache/sling/core/impl/scripting/
Modified:
incubator/sling/trunk/sling/core/src/main/java/org/apache/sling/core/CoreConstants.java
incubator/sling/trunk/sling/core/src/main/java/org/apache/sling/core/impl/servlets/SlingServletResolver.java
incubator/sling/trunk/sling/core/src/main/java/org/apache/sling/core/servlets/DefaultServlet.java
Modified:
incubator/sling/trunk/sling/core/src/main/java/org/apache/sling/core/CoreConstants.java
URL:
http://svn.apache.org/viewvc/incubator/sling/trunk/sling/core/src/main/java/org/apache/sling/core/CoreConstants.java?rev=604843&r1=604842&r2=604843&view=diff
==============================================================================
---
incubator/sling/trunk/sling/core/src/main/java/org/apache/sling/core/CoreConstants.java
(original)
+++
incubator/sling/trunk/sling/core/src/main/java/org/apache/sling/core/CoreConstants.java
Mon Dec 17 03:44:56 2007
@@ -34,7 +34,7 @@
* <p>
* This property is available calling the
* <code>BundleContext.getProperty(String)</code> method.
- *
+ *
* @see #SLING_HOME_URL
*/
public static final String SLING_HOME = "sling.home";
@@ -49,7 +49,7 @@
* <p>
* This property is available calling the
* <code>BundleContext.getProperty(String)</code> method.
- *
+ *
* @see #SLING_HOME
*/
public static final String SLING_HOME_URL = "sling.home.url";
@@ -83,5 +83,13 @@
* is missing or empty the Servlet is ignored.
*/
public static final String SLING_RESOURCE_TYPES =
"sling.core.resourceTypes";
+
+ /**
+ * The name of the registered servlet used as the default servlet if no
+ * other servlet or script could be selected (value is
+ * "sling.core.servlet.default"). If no servlet is registered under this
+ * name, the [EMAIL PROTECTED]
org.apache.sling.core.servlets.DefaultServlet} is used.
+ */
+ public static final String DEFAULT_SERVLET_NAME =
"sling.core.servlet.default";
}
Added:
incubator/sling/trunk/sling/core/src/main/java/org/apache/sling/core/impl/servlets/SlingScriptServlet.java
URL:
http://svn.apache.org/viewvc/incubator/sling/trunk/sling/core/src/main/java/org/apache/sling/core/impl/servlets/SlingScriptServlet.java?rev=604843&view=auto
==============================================================================
---
incubator/sling/trunk/sling/core/src/main/java/org/apache/sling/core/impl/servlets/SlingScriptServlet.java
(added)
+++
incubator/sling/trunk/sling/core/src/main/java/org/apache/sling/core/impl/servlets/SlingScriptServlet.java
Mon Dec 17 03:44:56 2007
@@ -0,0 +1,103 @@
+/*
+ * 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.core.impl.servlets;
+
+import static java.lang.Boolean.TRUE;
+import static org.apache.sling.api.scripting.SlingBindings.FLUSH;
+import static org.apache.sling.api.scripting.SlingBindings.REQUEST;
+import static org.apache.sling.api.scripting.SlingBindings.RESPONSE;
+
+import java.io.IOException;
+
+import javax.servlet.Servlet;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+
+import org.apache.sling.api.SlingException;
+import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.api.SlingHttpServletResponse;
+import org.apache.sling.api.scripting.SlingBindings;
+import org.apache.sling.api.scripting.SlingScript;
+import org.slf4j.LoggerFactory;
+
+/**
+ * The <code>SlingScriptServlet</code> is a servlet encapsulating a
+ * <code>SlingScript</code> instance for unified use in the
+ * [EMAIL PROTECTED] SlingServletResolver}.
+ */
+public class SlingScriptServlet implements Servlet {
+
+ private ServletConfig servletConfig;
+
+ /**
+ * The script to call in the
+ * [EMAIL PROTECTED] #service(ServletRequest, ServletResponse)} method.
+ */
+ private final SlingScript script;
+
+ public SlingScriptServlet(SlingScript script) {
+ this.script = script;
+ }
+
+ public void service(ServletRequest req, ServletResponse res)
+ throws ServletException, IOException {
+
+ SlingHttpServletRequest request = (SlingHttpServletRequest) req;
+
+ try {
+ // prepare the properties for the script
+ SlingBindings props = new SlingBindings();
+ props.put(REQUEST, req);
+ props.put(RESPONSE, res);
+ props.put(FLUSH, TRUE);
+
+ res.setCharacterEncoding("UTF-8");
+ res.setContentType(request.getResponseContentType());
+
+ // evaluate the script now using the ScriptEngine
+ script.eval(props);
+
+ } catch (IOException ioe) {
+ throw ioe;
+ } catch (ServletException se) {
+ throw se;
+ } catch (Exception e) {
+ throw new SlingException("Cannot get DefaultSlingScript: "
+ + e.getMessage(), e);
+ }
+ }
+
+ public ServletConfig getServletConfig() {
+ return servletConfig;
+ }
+
+ public String getServletInfo() {
+ return "Servlet for script " + script.getScriptResource().getURI();
+ }
+
+ public void init(ServletConfig servletConfig) {
+ this.servletConfig = servletConfig;
+ }
+
+ public void destroy() {
+ }
+
+}
Modified:
incubator/sling/trunk/sling/core/src/main/java/org/apache/sling/core/impl/servlets/SlingServletResolver.java
URL:
http://svn.apache.org/viewvc/incubator/sling/trunk/sling/core/src/main/java/org/apache/sling/core/impl/servlets/SlingServletResolver.java?rev=604843&r1=604842&r2=604843&view=diff
==============================================================================
---
incubator/sling/trunk/sling/core/src/main/java/org/apache/sling/core/impl/servlets/SlingServletResolver.java
(original)
+++
incubator/sling/trunk/sling/core/src/main/java/org/apache/sling/core/impl/servlets/SlingServletResolver.java
Mon Dec 17 03:44:56 2007
@@ -18,6 +18,9 @@
*/
package org.apache.sling.core.impl.servlets;
+import static org.apache.sling.core.CoreConstants.DEFAULT_SERVLET_NAME;
+import static org.apache.sling.core.CoreConstants.SLING_RESOURCE_TYPES;
+
import java.util.Dictionary;
import java.util.HashMap;
import java.util.Hashtable;
@@ -34,7 +37,6 @@
import org.apache.sling.api.servlets.ServletResolver;
import org.apache.sling.core.CoreConstants;
import org.apache.sling.core.impl.helper.SlingServletConfig;
-import org.apache.sling.core.impl.scripting.DefaultSlingScriptServlet;
import org.apache.sling.core.servlets.DefaultServlet;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
@@ -61,13 +63,13 @@
*/
public static final String PROP_PATH = "path";
- public static final String DEFAULT_SERVLET_NAME =
"sling.core.servlet.default";
-
private ServiceTracker scriptResolver;
private String[] path;
private Map<String, Servlet> servlets = new HashMap<String, Servlet>();
+
+ private Servlet coreDefaultServlet;
private ServiceRegistration registration;
@@ -122,15 +124,11 @@
// use default servlet, create one if missing
if (servlet == null) {
servlet = getServlet(DEFAULT_SERVLET_NAME);
- if (servlet == null) {
- try {
- servlet = new DefaultServlet();
- servlet.init(new SlingServletConfig(null, null,
DEFAULT_SERVLET_NAME));
- putServlet(DEFAULT_SERVLET_NAME, servlet);
- } catch (ServletException se) {
- log.error("Failed to initiliaze Servlet", se);
- }
- }
+ }
+
+ // last resort, use the core bundle default servlet
+ if (servlet == null) {
+ servlet = getCoreDefaultServlet();
}
if (servlet != null && log.isDebugEnabled()) {
@@ -151,7 +149,7 @@
@Override
public Object addingService(ServiceReference reference) {
- Object typeObject =
reference.getProperty(CoreConstants.SLING_RESOURCE_TYPES);
+ Object typeObject = reference.getProperty(SLING_RESOURCE_TYPES);
if (typeObject == null) {
log.info(
"addingService: Ignoring Servlet service {} without resource
types",
@@ -187,7 +185,7 @@
@Override
public void removedService(ServiceReference reference, Object service) {
- Object typeObject =
reference.getProperty(CoreConstants.SLING_RESOURCE_TYPES);
+ Object typeObject = reference.getProperty(SLING_RESOURCE_TYPES);
if (typeObject != null) {
String name = ((Servlet)
service).getServletConfig().getServletName();
@@ -228,13 +226,26 @@
if (ssr != null) {
SlingScript script = ssr.resolveScript(request);
if (script != null) {
- return new DefaultSlingScriptServlet(script);
+ return new SlingScriptServlet(script);
}
}
return null;
}
+ private Servlet getCoreDefaultServlet() {
+ if (coreDefaultServlet == null) {
+ try {
+ Servlet servlet = new DefaultServlet();
+ servlet.init(new SlingServletConfig(null, null, "Sling Core
Default Servlet"));
+ coreDefaultServlet = servlet;
+ } catch (ServletException se) {
+ log.error("Failed to initiliaze Servlet", se);
+ }
+ }
+
+ return coreDefaultServlet;
+ }
// ---------- SCR Integration
----------------------------------------------
public void updated(Dictionary properties) {
Modified:
incubator/sling/trunk/sling/core/src/main/java/org/apache/sling/core/servlets/DefaultServlet.java
URL:
http://svn.apache.org/viewvc/incubator/sling/trunk/sling/core/src/main/java/org/apache/sling/core/servlets/DefaultServlet.java?rev=604843&r1=604842&r2=604843&view=diff
==============================================================================
---
incubator/sling/trunk/sling/core/src/main/java/org/apache/sling/core/servlets/DefaultServlet.java
(original)
+++
incubator/sling/trunk/sling/core/src/main/java/org/apache/sling/core/servlets/DefaultServlet.java
Mon Dec 17 03:44:56 2007
@@ -21,10 +21,8 @@
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
-import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
-import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.TreeMap;
@@ -34,13 +32,9 @@
import org.apache.commons.beanutils.BeanMap;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
-import org.apache.sling.api.request.RequestParameter;
-import org.apache.sling.api.request.RequestParameterMap;
import org.apache.sling.api.resource.NonExistingResource;
import org.apache.sling.api.resource.Resource;
-import org.apache.sling.api.resource.ResourceManager;
-import org.apache.sling.api.servlets.SlingAllMethodsServlet;
-import org.osgi.service.component.ComponentException;
+import org.apache.sling.api.servlets.SlingSafeMethodsServlet;
/**
* The <code>DefaultServlet</code> is a very simple default resource handler.
@@ -49,74 +43,7 @@
* type. Rather it is used internally on demand.
*
*/
-public class DefaultServlet extends SlingAllMethodsServlet {
-
- protected void doInit() {
- }
-
- @Override
- protected void doPost(SlingHttpServletRequest request,
- SlingHttpServletResponse response) throws IOException {
-
- RequestParameterMap parameters = request.getRequestParameterMap();
- if (parameters == null || parameters.isEmpty()) {
- // just redirect to display the resource
- response.sendRedirect(request.getRequestURI());
- return;
- }
-
- Resource resource = request.getResource();
- Map<Object, Object> contentMap = asMap(resource);
-
- // special _delete property to remove a property
- RequestParameter[] toRemove = parameters.get("_delete");
- for (int i = 0; toRemove != null && i < toRemove.length; i++) {
- String[] names = toRemove[i].getString().split("[, ]");
- for (int j = 0; j < names.length; j++) {
- contentMap.remove(names[j]);
- }
- }
-
- for (Iterator<Map.Entry<String, RequestParameter[]>> pi =
parameters.entrySet().iterator(); pi.hasNext();) {
- Map.Entry<String, RequestParameter[]> pEntry = pi.next();
- String name = pEntry.getKey();
- if ("_delete".equals(name)) {
- continue;
- }
-
- RequestParameter[] values = pEntry.getValue();
-
- try {
- if (values == null || values.length == 0) {
- contentMap.remove(name);
- } else if (values.length == 1) {
- contentMap.put(name, this.toObject(values[0]));
- } else {
- List<Object> valueList = new ArrayList<Object>();
- for (int i = 0; i < values.length; i++) {
- valueList.add(this.toObject(values[i]));
- }
- contentMap.put(name, valueList);
- }
- } catch (Throwable t) {
- // should actually handle
- }
- }
-
- try {
- ResourceManager rm = (ResourceManager)
request.getResourceResolver();
- if (rm != null) {
- rm.store(resource);
- rm.save();
- }
- } catch (Throwable t) {
- throw new ComponentException("Cannot update " + resource.getURI(),
- t);
- }
-
- // have the resource rendered now
- response.sendRedirect(request.getRequestURI());
- }
+public class DefaultServlet extends SlingSafeMethodsServlet {
@Override
protected void doGet(SlingHttpServletRequest request,
@@ -307,13 +234,5 @@
// no objects available
return null;
- }
-
- private Object toObject(RequestParameter parameter) throws IOException {
- if (parameter.isFormField()) {
- return parameter.getString();
- }
-
- return parameter.getInputStream();
}
}