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();
     }
 }


Reply via email to