Author: enorman
Date: Tue Aug 24 04:36:33 2010
New Revision: 988382

URL: http://svn.apache.org/viewvc?rev=988382&view=rev
Log:
SLING-1677 Let AccessManager POST servlets return JSON

Modified:
    sling/trunk/bundles/jcr/jackrabbit-accessmanager/pom.xml
    
sling/trunk/bundles/jcr/jackrabbit-accessmanager/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/AbstractAccessPostServlet.java
    
sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/accessManager/AbstractAccessManagerTest.java
    
sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/accessManager/ModifyAceTest.java
    
sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/accessManager/PrivilegesInfoTest.java
    
sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/accessManager/RemoveAcesTest.java

Modified: sling/trunk/bundles/jcr/jackrabbit-accessmanager/pom.xml
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/jackrabbit-accessmanager/pom.xml?rev=988382&r1=988381&r2=988382&view=diff
==============================================================================
--- sling/trunk/bundles/jcr/jackrabbit-accessmanager/pom.xml (original)
+++ sling/trunk/bundles/jcr/jackrabbit-accessmanager/pom.xml Tue Aug 24 
04:36:33 2010
@@ -61,6 +61,9 @@
                                        <instructions>
                                                <Private-Package>
                                                </Private-Package>
+                        <Embed-Dependency>
+                            
org.apache.sling.servlets.post;inline="org/apache/sling/servlets/post/impl/helper/JSONResponse*"
+                        </Embed-Dependency>
                                                <Export-Package>
                      
org.apache.sling.jcr.jackrabbit.accessmanager;version=${project.version},
                      
org.apache.sling.jcr.jackrabbit.accessmanager.post;version=${project.version}
@@ -114,7 +117,7 @@
                <dependency>
                        <groupId>org.apache.sling</groupId>
                        <artifactId>org.apache.sling.servlets.post</artifactId>
-                       <version>2.0.4-incubator</version>
+                       <version>2.0.5-SNAPSHOT</version>
             <scope>provided</scope>
                </dependency>
                <dependency>
@@ -137,5 +140,9 @@
                        <groupId>org.osgi</groupId>
                        <artifactId>org.osgi.compendium</artifactId>
                </dependency>
+               <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+        </dependency>
        </dependencies>
 </project>

Modified: 
sling/trunk/bundles/jcr/jackrabbit-accessmanager/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/AbstractAccessPostServlet.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/jackrabbit-accessmanager/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/AbstractAccessPostServlet.java?rev=988382&r1=988381&r2=988382&view=diff
==============================================================================
--- 
sling/trunk/bundles/jcr/jackrabbit-accessmanager/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/AbstractAccessPostServlet.java
 (original)
+++ 
sling/trunk/bundles/jcr/jackrabbit-accessmanager/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/AbstractAccessPostServlet.java
 Tue Aug 24 04:36:33 2010
@@ -39,6 +39,7 @@ import org.apache.sling.api.servlets.Sli
 import org.apache.sling.api.wrappers.SlingRequestPaths;
 import org.apache.sling.servlets.post.Modification;
 import org.apache.sling.servlets.post.SlingPostConstants;
+import org.apache.sling.servlets.post.impl.helper.JSONResponse;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -61,7 +62,7 @@ public abstract class AbstractAccessPost
                        SlingHttpServletResponse httpResponse) throws 
ServletException,
                        IOException {
         // prepare the response
-        HtmlResponse htmlResponse = new HtmlResponse();
+        HtmlResponse htmlResponse = createHtmlResponse(request);
         htmlResponse.setReferer(request.getHeader("referer"));
 
         // calculate the paths
@@ -133,6 +134,23 @@ public abstract class AbstractAccessPost
         htmlResponse.send(httpResponse, isSetStatus(request));
        }
 
+    /**
+     * Creates an instance of a HtmlResponse.
+     * @param req The request being serviced
+     * @return a {...@link 
org.apache.sling.servlets.post.impl.helper.JSONResponse} if any of these 
conditions are true:
+     * <ul>
+     *   <li>the response content type is application/json
+     * </ul>
+     * or a {...@link org.apache.sling.api.servlets.HtmlResponse} otherwise
+     */
+    protected HtmlResponse createHtmlResponse(SlingHttpServletRequest req) {
+       if 
(JSONResponse.RESPONSE_CONTENT_TYPE.equals(req.getResponseContentType())) {
+               return new JSONResponse();
+       } else {
+            return new HtmlResponse();
+       }
+    }
+       
        /**
         * Extending Servlet should implement this operation to do the work
         *

Modified: 
sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/accessManager/AbstractAccessManagerTest.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/accessManager/AbstractAccessManagerTest.java?rev=988382&r1=988381&r2=988382&view=diff
==============================================================================
--- 
sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/accessManager/AbstractAccessManagerTest.java
 (original)
+++ 
sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/accessManager/AbstractAccessManagerTest.java
 Tue Aug 24 04:36:33 2010
@@ -17,170 +17,21 @@
 package org.apache.sling.launchpad.webapp.integrationtest.accessManager;
 
 import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.List;
 import java.util.Random;
 
 import javax.servlet.http.HttpServletResponse;
 
-import org.apache.commons.httpclient.Credentials;
-import org.apache.commons.httpclient.Header;
-import org.apache.commons.httpclient.HttpException;
-import org.apache.commons.httpclient.NameValuePair;
-import org.apache.commons.httpclient.UsernamePasswordCredentials;
-import org.apache.commons.httpclient.auth.AuthScope;
-import org.apache.commons.httpclient.methods.GetMethod;
-import org.apache.commons.httpclient.methods.PostMethod;
-import org.apache.sling.commons.testing.integration.HttpTestBase;
+import 
org.apache.sling.launchpad.webapp.integrationtest.AbstractAuthenticatedTest;
 import org.apache.sling.servlets.post.SlingPostConstants;
 
 /**
  * Base class for AccessManager tests.
  */
-public abstract class AbstractAccessManagerTest extends HttpTestBase {
+public abstract class AbstractAccessManagerTest extends 
AbstractAuthenticatedTest {
 
        public static final String TEST_BASE_PATH = "/sling-tests";
-
-    /** Execute a POST request and check status */
-    protected void assertAuthenticatedPostStatus(Credentials creds, String 
url, int expectedStatusCode, List<NameValuePair> postParams, String 
assertMessage)
-    throws IOException {
-        final PostMethod post = new PostMethod(url);
-        post.setFollowRedirects(false);
-        
-        URL baseUrl = new URL(HTTP_BASE_URL);
-        AuthScope authScope = new AuthScope(baseUrl.getHost(), 
baseUrl.getPort(), AuthScope.ANY_REALM);
-        post.setDoAuthentication(true);
-        Credentials oldCredentials = 
httpClient.getState().getCredentials(authScope);
-        try {
-                       httpClient.getState().setCredentials(authScope, creds);
-               
-               if(postParams!=null) {
-                   final NameValuePair [] nvp = {};
-                   post.setRequestBody(postParams.toArray(nvp));
-               }
-       
-               final int status = httpClient.executeMethod(post);
-               if(assertMessage == null) {
-                   assertEquals(expectedStatusCode, status);
-               } else {
-                   assertEquals(assertMessage, expectedStatusCode, status);
-               }
-        } finally {
-               httpClient.getState().setCredentials(authScope, oldCredentials);
-        }
-    }
-
-    /** Verify that given URL returns expectedStatusCode
-     * @throws IOException */
-    protected void assertAuthenticatedHttpStatus(Credentials creds, String 
urlString, int expectedStatusCode, String assertMessage) throws IOException {
-        URL baseUrl = new URL(HTTP_BASE_URL);
-        AuthScope authScope = new AuthScope(baseUrl.getHost(), 
baseUrl.getPort(), AuthScope.ANY_REALM);
-        GetMethod getMethod = new GetMethod(urlString);
-        getMethod.setDoAuthentication(true);
-        
-        Credentials oldCredentials = 
httpClient.getState().getCredentials(authScope);
-       try {
-                       httpClient.getState().setCredentials(authScope, creds);
-
-                       final int status = httpClient.executeMethod(getMethod);
-            if(assertMessage == null) {
-                assertEquals(urlString,expectedStatusCode, status);
-            } else {
-                assertEquals(assertMessage, expectedStatusCode, status);
-            }
-       } finally {
-               httpClient.getState().setCredentials(authScope, oldCredentials);
-       }
-    }
-
-    
-    /** retrieve the contents of given URL and assert its content type
-     * @param expectedContentType use CONTENT_TYPE_DONTCARE if must not be 
checked 
-     * @throws IOException
-     * @throws HttpException */
-    protected String getAuthenticatedContent(Credentials creds, String url, 
String expectedContentType, List<NameValuePair> params, int expectedStatusCode) 
throws IOException {
-        final GetMethod get = new GetMethod(url);
-
-        URL baseUrl = new URL(HTTP_BASE_URL);
-        AuthScope authScope = new AuthScope(baseUrl.getHost(), 
baseUrl.getPort(), AuthScope.ANY_REALM);
-        get.setDoAuthentication(true);
-        Credentials oldCredentials = 
httpClient.getState().getCredentials(authScope);
-       try {
-                       httpClient.getState().setCredentials(authScope, creds);
-                       
-               if(params != null) {
-                   final NameValuePair [] nvp = new NameValuePair[0];
-                   get.setQueryString(params.toArray(nvp));
-               }
-               final int status = httpClient.executeMethod(get);
-               final InputStream is = get.getResponseBodyAsStream();
-               final StringBuffer content = new StringBuffer();
-               final String charset = get.getResponseCharSet();
-               final byte [] buffer = new byte[16384];
-               int n = 0;
-               while( (n = is.read(buffer, 0, buffer.length)) > 0) {
-                   content.append(new String(buffer, 0, n, charset));
-               }
-               assertEquals("Expected status " + expectedStatusCode + " for " 
+ url + " (content=" + content + ")",
-                       expectedStatusCode,status);
-               final Header h = get.getResponseHeader("Content-Type");
-               if(expectedContentType == null) {
-                   if(h!=null) {
-                       fail("Expected null Content-Type, got " + h.getValue());
-                   }
-               } else if(CONTENT_TYPE_DONTCARE.equals(expectedContentType)) {
-                   // no check
-               } else if(h==null) {
-                   fail(
-                           "Expected Content-Type that starts with '" + 
expectedContentType
-                           +" but got no Content-Type header at " + url
-                   );
-               } else {
-                   assertTrue(
-                       "Expected Content-Type that starts with '" + 
expectedContentType
-                       + "' for " + url + ", got '" + h.getValue() + "'",
-                       h.getValue().startsWith(expectedContentType)
-                   );
-               }
-               return content.toString();
-                       
-       } finally {
-               httpClient.getState().setCredentials(authScope, oldCredentials);
-       }
-    }
-    
-    
-    protected static Random random = new Random(System.currentTimeMillis());
     
-       protected String createTestUser() throws IOException {
-        String postUrl = HTTP_BASE_URL + 
"/system/userManager/user.create.html";
-
-               String testUserId = "testUser" + random.nextInt();
-               List<NameValuePair> postParams = new ArrayList<NameValuePair>();
-               postParams.add(new NameValuePair(":name", testUserId));
-               postParams.add(new NameValuePair("pwd", "testPwd"));
-               postParams.add(new NameValuePair("pwdConfirm", "testPwd"));
-               Credentials creds = new UsernamePasswordCredentials("admin", 
"admin");
-               assertAuthenticatedPostStatus(creds, postUrl, 
HttpServletResponse.SC_OK, postParams, null);
-               
-               return testUserId;
-       }
-    
-       protected String createTestGroup() throws IOException {
-        String postUrl = HTTP_BASE_URL + 
"/system/userManager/group.create.html";
-
-               String testGroupId = "testGroup" + random.nextInt();
-               List<NameValuePair> postParams = new ArrayList<NameValuePair>();
-               postParams.add(new NameValuePair(":name", testGroupId));
-               
-               //success would be a redirect to the welcome page of the webapp
-        Credentials creds = new UsernamePasswordCredentials("admin", "admin");
-               assertAuthenticatedPostStatus(creds, postUrl, 
HttpServletResponse.SC_OK, postParams, null);
-               
-               return testGroupId;
-       }
+    private static Random random = new Random(System.currentTimeMillis());
        
        protected String createTestFolder() throws IOException {
         String postUrl = HTTP_BASE_URL + TEST_BASE_PATH + "/" + "testFolder" + 
random.nextInt();

Modified: 
sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/accessManager/ModifyAceTest.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/accessManager/ModifyAceTest.java?rev=988382&r1=988381&r2=988382&view=diff
==============================================================================
--- 
sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/accessManager/ModifyAceTest.java
 (original)
+++ 
sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/accessManager/ModifyAceTest.java
 Tue Aug 24 04:36:33 2010
@@ -832,4 +832,27 @@ public class ModifyAceTest extends Abstr
                assertAuthenticatedPostStatus(creds, postUrl, 
HttpServletResponse.SC_OK, postParams, null);
        }
        
+       /**
+        * Test for SLING-1677
+        */
+       public void testModifyAceResponseAsJSON() throws IOException, 
JSONException {
+               testUserId = createTestUser();
+               
+               testFolderUrl = createTestFolder();
+               
+        String postUrl = testFolderUrl + ".modifyAce.json";
+
+               List<NameValuePair> postParams = new ArrayList<NameValuePair>();
+               postParams.add(new NameValuePair("principalId", testUserId));
+               postParams.add(new NameValuePair("privil...@jcr:read", 
"granted"));
+               postParams.add(new NameValuePair("privil...@jcr:write", 
"denied"));
+               postParams.add(new 
NameValuePair("privil...@jcr:modifyAccessControl", "bogus")); //invalid value 
should be ignored.
+               
+               Credentials creds = new UsernamePasswordCredentials("admin", 
"admin");
+               String json = getAuthenticatedPostContent(creds, postUrl, 
CONTENT_TYPE_JSON, postParams, HttpServletResponse.SC_OK);
+
+        //make sure the json response can be parsed as a JSON object
+        JSONObject jsonObject = new JSONObject(json);
+               assertNotNull(jsonObject);
+       }
 }

Modified: 
sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/accessManager/PrivilegesInfoTest.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/accessManager/PrivilegesInfoTest.java?rev=988382&r1=988381&r2=988382&view=diff
==============================================================================
--- 
sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/accessManager/PrivilegesInfoTest.java
 (original)
+++ 
sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/accessManager/PrivilegesInfoTest.java
 Tue Aug 24 04:36:33 2010
@@ -20,6 +20,7 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Random;
 import java.util.Set;
 
 import javax.servlet.http.HttpServletResponse;
@@ -35,6 +36,7 @@ import org.apache.sling.servlets.post.Sl
  * Tests for the PrivilegesInfo Script Helper
  */
 public class PrivilegesInfoTest extends AbstractAccessManagerTest {
+    private static Random random = new Random(System.currentTimeMillis());
        
        String testUserId = null;
        String testGroupId = null;

Modified: 
sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/accessManager/RemoveAcesTest.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/accessManager/RemoveAcesTest.java?rev=988382&r1=988381&r2=988382&view=diff
==============================================================================
--- 
sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/accessManager/RemoveAcesTest.java
 (original)
+++ 
sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/accessManager/RemoveAcesTest.java
 Tue Aug 24 04:36:33 2010
@@ -180,4 +180,24 @@ public class RemoveAcesTest extends Abst
                assertNotNull(jsonObject);
                assertEquals(0, jsonObject.length());
        }
+       
+       /**
+        * Test for SLING-1677
+        */
+       public void testRemoveAcesResponseAsJSON() throws IOException, 
JSONException {
+               String folderUrl = createFolderWithAces(true);
+               
+               //remove the ace for the testUser principal
+               String postUrl = folderUrl + ".deleteAce.json"; 
+               List<NameValuePair> postParams = new ArrayList<NameValuePair>();
+               postParams.add(new NameValuePair(":applyTo", testUserId));
+               postParams.add(new NameValuePair(":applyTo", testGroupId));
+        Credentials creds = new UsernamePasswordCredentials("admin", "admin");
+        String json = getAuthenticatedPostContent(creds, postUrl, 
CONTENT_TYPE_JSON, postParams, HttpServletResponse.SC_OK);
+
+        //make sure the json response can be parsed as a JSON object
+        JSONObject jsonObject = new JSONObject(json);
+               assertNotNull(jsonObject);
+       }
 }
+


Reply via email to