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