You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by bd...@apache.org on 2008/12/02 16:31:34 UTC

svn commit: r722499 - /incubator/sling/trunk/extensions/jcrinstall/service/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/RepositoryObserver.java

Author: bdelacretaz
Date: Tue Dec  2 07:31:34 2008
New Revision: 722499

URL: http://svn.apache.org/viewvc?rev=722499&view=rev
Log:
SLING-747 - HTTP interface at /system/sling/jcrinstall to enable/disable jcrinstall, simulating the repository going away. Needed for integration tests

Modified:
    incubator/sling/trunk/extensions/jcrinstall/service/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/RepositoryObserver.java

Modified: incubator/sling/trunk/extensions/jcrinstall/service/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/RepositoryObserver.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/extensions/jcrinstall/service/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/RepositoryObserver.java?rev=722499&r1=722498&r2=722499&view=diff
==============================================================================
--- incubator/sling/trunk/extensions/jcrinstall/service/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/RepositoryObserver.java (original)
+++ incubator/sling/trunk/extensions/jcrinstall/service/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/RepositoryObserver.java Tue Dec  2 07:31:34 2008
@@ -19,6 +19,7 @@
 package org.apache.sling.jcr.jcrinstall.jcr.impl;
 
 import java.io.File;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.LinkedList;
@@ -34,13 +35,19 @@
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 import javax.jcr.observation.Event;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletResponse;
 
+import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.api.SlingHttpServletResponse;
+import org.apache.sling.api.servlets.SlingAllMethodsServlet;
 import org.apache.sling.jcr.api.SlingRepository;
 import org.apache.sling.jcr.jcrinstall.jcr.NodeConverter;
 import org.apache.sling.jcr.jcrinstall.osgi.OsgiController;
 import org.apache.sling.jcr.jcrinstall.osgi.ResourceOverrideRules;
 import org.osgi.framework.FrameworkEvent;
 import org.osgi.framework.FrameworkListener;
+import org.osgi.framework.ServiceReference;
 import org.osgi.service.component.ComponentContext;
 import org.osgi.service.startlevel.StartLevel;
 import org.slf4j.Logger;
@@ -56,14 +63,17 @@
  *  label="%jcrinstall.name" 
  *  description="%jcrinstall.description"
  *  immediate="true"
+ *  @scr.service
  *  @scr.property 
  *      name="service.description" 
  *      value="Sling jcrinstall OsgiController Service"
  *  @scr.property 
  *      name="service.vendor" 
  *      value="The Apache Software Foundation"
+ * @scr.property name="sling.servlet.paths" value="/system/sling/jcrinstall"
  */
-public class RepositoryObserver implements Runnable, FrameworkListener {
+@SuppressWarnings("serial")
+public class RepositoryObserver extends SlingAllMethodsServlet implements Runnable, FrameworkListener {
 
     private final SortedSet<WatchedFolder> folders = new TreeSet<WatchedFolder>();
     private RegexpFilter folderNameFilter;
@@ -74,6 +84,8 @@
     private boolean observationCycleActive;
     private boolean activated;
     
+    public static final String POST_ENABLE_PARAM = "enabled";
+    
     /** @scr.reference */
     protected OsgiController osgiController;
     
@@ -497,4 +509,57 @@
     protected Set<WatchedFolder> getWatchedFolders() {
         return folders;
     }
+
+    /** A POST can be used to deactivate/reactivate this, simulating a disappearing SlingRepository.
+     *  Used for integration testing.
+     */
+    @Override
+    protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) 
+    throws ServletException, IOException {
+        final String enable = request.getParameter(POST_ENABLE_PARAM);
+        if(enable != null) {
+            if(Boolean.parseBoolean(enable)) {
+                log.info("Processing POST with {}=true, attempting to bind SlingRepository", POST_ENABLE_PARAM);
+                if(repository != null) {
+                    response.sendError(HttpServletResponse.SC_CONFLICT, "Already enabled");
+                    return;
+                }
+                if(componentContext == null) {
+                    response.sendError(HttpServletResponse.SC_EXPECTATION_FAILED, "No ComponentContext, cannot enable service");
+                    return;
+                }
+                final ServiceReference ref = componentContext.getBundleContext().getServiceReference(SlingRepository.class.getName());
+                if(ref == null) {
+                    response.sendError(HttpServletResponse.SC_EXPECTATION_FAILED, "No SlingRepository ServiceReference available");
+                    return;
+                }
+                
+                final SlingRepository r = (SlingRepository)componentContext.getBundleContext().getService(ref);
+                bindSlingRepository(r);
+                
+            } else {
+                log.info("Processing POST with {}=false, attempting to unbind SlingRepository", POST_ENABLE_PARAM);
+                if(repository == null) {
+                    response.sendError(HttpServletResponse.SC_CONFLICT, "Not currently enabled, cannot disable");
+                    return;
+                }
+                unbindSlingRepository(repository);
+            }
+        } else {
+            response.sendError(HttpServletResponse.SC_BAD_REQUEST,
+                    "Use '" + POST_ENABLE_PARAM + "' parameter to enable/disable the RepositoryObserver");
+            return;
+        }
+        
+        doGet(request, response);
+    }
+
+    @Override
+    protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) 
+    throws ServletException, IOException 
+    {
+        final String status = repository != null ? "enabled" : "disabled";
+        response.setContentType("text/plain");
+        response.getWriter().write(getClass().getSimpleName() + " is " + status);
+    }
 }
\ No newline at end of file