Author: justin
Date: Sat Jun 19 02:11:16 2010
New Revision: 956174
URL: http://svn.apache.org/viewvc?rev=956174&view=rev
Log:
SLING-1557 - adding members and declaredMembers properties for groups and
memberOf and declaredMemberOf properties for users and groups
Modified:
sling/trunk/bundles/jcr/jackrabbit-usermanager/src/main/java/org/apache/sling/jackrabbit/usermanager/impl/resource/AuthorizableValueMap.java
sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/userManager/UpdateGroupTest.java
Modified:
sling/trunk/bundles/jcr/jackrabbit-usermanager/src/main/java/org/apache/sling/jackrabbit/usermanager/impl/resource/AuthorizableValueMap.java
URL:
http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/jackrabbit-usermanager/src/main/java/org/apache/sling/jackrabbit/usermanager/impl/resource/AuthorizableValueMap.java?rev=956174&r1=956173&r2=956174&view=diff
==============================================================================
---
sling/trunk/bundles/jcr/jackrabbit-usermanager/src/main/java/org/apache/sling/jackrabbit/usermanager/impl/resource/AuthorizableValueMap.java
(original)
+++
sling/trunk/bundles/jcr/jackrabbit-usermanager/src/main/java/org/apache/sling/jackrabbit/usermanager/impl/resource/AuthorizableValueMap.java
Sat Jun 19 02:11:16 2010
@@ -33,6 +33,7 @@ import javax.jcr.Value;
import javax.jcr.ValueFormatException;
import org.apache.jackrabbit.api.security.user.Authorizable;
+import org.apache.jackrabbit.api.security.user.Group;
import org.apache.sling.api.resource.ValueMap;
import org.apache.sling.jcr.resource.JcrResourceUtil;
import org.slf4j.Logger;
@@ -42,6 +43,15 @@ import org.slf4j.LoggerFactory;
* ValueMap implementation for Authorizable Resources
*/
public class AuthorizableValueMap implements ValueMap {
+
+ private static final String DECLARED_MEMBERS_KEY = "declaredMembers";
+
+ private static final String MEMBERS_KEY = "members";
+
+ private static final String DECLARED_MEMBER_OF_KEY = "declaredMemberOf";
+
+ private static final String MEMBER_OF_KEY = "memberOf";
+
private Logger logger =
LoggerFactory.getLogger(AuthorizableValueMap.class);
private boolean fullyRead;
@@ -126,7 +136,6 @@ public class AuthorizableValueMap implem
}
protected Object read(String key) {
-
// if the item has been completely read, we need not check
// again, as we certainly will not find the key
if (fullyRead) {
@@ -134,6 +143,19 @@ public class AuthorizableValueMap implem
}
try {
+ if (key.equals(MEMBERS_KEY) && authorizable.isGroup()) {
+ return getMembers((Group) authorizable, true);
+ }
+ if (key.equals(DECLARED_MEMBERS_KEY) && authorizable.isGroup()) {
+ return getMembers((Group) authorizable, false);
+ }
+ if (key.equals(MEMBER_OF_KEY)) {
+ return getMemberships(authorizable, true);
+ }
+ if (key.equals(DECLARED_MEMBER_OF_KEY)) {
+ return getMemberships(authorizable, false);
+ }
+
if (authorizable.hasProperty(key)) {
final Value[] property = authorizable.getProperty(key);
final Object value = valuesToJavaObject(property);
@@ -167,6 +189,13 @@ public class AuthorizableValueMap implem
protected void readFully() {
if (!fullyRead) {
try {
+ if (authorizable.isGroup()) {
+ cache.put(MEMBERS_KEY, getMembers((Group) authorizable,
true));
+ cache.put(DECLARED_MEMBERS_KEY, getMembers((Group)
authorizable, false));
+ }
+ cache.put(MEMBER_OF_KEY, getMemberships(authorizable, true));
+ cache.put(DECLARED_MEMBER_OF_KEY, getMemberships(authorizable,
false));
+
Iterator pi = authorizable.getPropertyNames();
while (pi.hasNext()) {
String key = (String) pi.next();
@@ -319,4 +348,28 @@ public class AuthorizableValueMap implem
return type;
}
+ private String[] getMembers(Group group, boolean includeAll) throws
RepositoryException {
+ List<String> results = new ArrayList<String>();
+ for (Iterator<Authorizable> it = includeAll ? group.getMembers() :
group.getDeclaredMembers();
+ it.hasNext();) {
+ Authorizable auth = it.next();
+ if (auth.isGroup()) {
+
results.add(AuthorizableResourceProvider.SYSTEM_USER_MANAGER_GROUP_PREFIX +
auth.getID());
+ } else {
+
results.add(AuthorizableResourceProvider.SYSTEM_USER_MANAGER_USER_PREFIX +
auth.getID());
+ }
+ }
+ return results.toArray(new String[results.size()]);
+ }
+
+ private String[] getMemberships(Authorizable authorizable, boolean
includeAll) throws RepositoryException {
+ List<String> results = new ArrayList<String>();
+ for (Iterator<Group> it = includeAll ? authorizable.memberOf() :
authorizable.declaredMemberOf();
+ it.hasNext();) {
+ Group group = it.next();
+
results.add(AuthorizableResourceProvider.SYSTEM_USER_MANAGER_GROUP_PREFIX +
group.getID());
+ }
+ return results.toArray(new String[results.size()]);
+ }
+
}
\ No newline at end of file
Modified:
sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/userManager/UpdateGroupTest.java
URL:
http://svn.apache.org/viewvc/sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/userManager/UpdateGroupTest.java?rev=956174&r1=956173&r2=956174&view=diff
==============================================================================
---
sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/userManager/UpdateGroupTest.java
(original)
+++
sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/userManager/UpdateGroupTest.java
Sat Jun 19 02:11:16 2010
@@ -25,6 +25,7 @@ import javax.servlet.http.HttpServletRes
import org.apache.commons.httpclient.Credentials;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
+import org.apache.sling.commons.json.JSONArray;
import org.apache.sling.commons.json.JSONException;
import org.apache.sling.commons.json.JSONObject;
@@ -35,11 +36,20 @@ import org.apache.sling.commons.json.JSO
public class UpdateGroupTest extends AbstractUserManagerTest {
String testGroupId = null;
-
+
+ String testUserId = null;
+
@Override
protected void tearDown() throws Exception {
+ if (testUserId != null) {
+ //remove the test user if it exists.
+ String postUrl = HTTP_BASE_URL + "/system/userManager/user/" +
testUserId + ".delete.html";
+ List<NameValuePair> postParams = new ArrayList<NameValuePair>();
+ assertAuthenticatedAdminPostStatus(postUrl,
HttpServletResponse.SC_OK, postParams, null);
+ }
+
if (testGroupId != null) {
- //remove the test user if it exists.
+ //remove the test group if it exists.
String postUrl = HTTP_BASE_URL +
"/system/userManager/group/" + testGroupId + ".delete.html";
List<NameValuePair> postParams = new
ArrayList<NameValuePair>();
assertAuthenticatedAdminPostStatus(postUrl,
HttpServletResponse.SC_OK, postParams, null);
@@ -50,16 +60,16 @@ public class UpdateGroupTest extends Abs
public void testUpdateGroup() throws IOException, JSONException {
testGroupId = createTestGroup();
-
+
String postUrl = HTTP_BASE_URL + "/system/userManager/group/" +
testGroupId + ".update.html";
List<NameValuePair> postParams = new ArrayList<NameValuePair>();
postParams.add(new NameValuePair("displayName", "My Updated
Test Group"));
postParams.add(new NameValuePair("url",
"http://www.apache.org/updated"));
-
+
Credentials creds = new UsernamePasswordCredentials("admin",
"admin");
assertAuthenticatedPostStatus(creds, postUrl,
HttpServletResponse.SC_OK, postParams, null);
-
+
//fetch the user profile json to verify the settings
String getUrl = HTTP_BASE_URL + "/system/userManager/group/" +
testGroupId + ".json";
assertAuthenticatedHttpStatus(creds, getUrl,
HttpServletResponse.SC_OK, null); //make sure the profile request returns some
data
@@ -69,22 +79,67 @@ public class UpdateGroupTest extends Abs
assertEquals("My Updated Test Group",
jsonObj.getString("displayName"));
assertEquals("http://www.apache.org/updated",
jsonObj.getString("url"));
}
-
+
public void testUpdateGroupMembers() throws IOException, JSONException {
testGroupId = createTestGroup();
-
+ testUserId = createTestUser();
+
+ Credentials creds = new UsernamePasswordCredentials("admin", "admin");
+
+ // verify that the members array exists, but is empty
+ JSONArray members = getTestGroupMembers(creds);
+ assertEquals(0, members.length());
+
+ JSONArray memberships = getTestUserMemberships(creds);
+ assertEquals(0, memberships.length());
+
String postUrl = HTTP_BASE_URL + "/system/userManager/group/" +
testGroupId + ".update.html";
- //TODO: verify this works....
+ // add a group member
List<NameValuePair> postParams = new ArrayList<NameValuePair>();
- postParams.add(new NameValuePair(":member",
"../user/testUser"));
- postParams.add(new NameValuePair(":mem...@delete",
"testGroup"));
-
- Credentials creds = new UsernamePasswordCredentials("admin",
"admin");
- assertAuthenticatedPostStatus(creds, postUrl,
HttpServletResponse.SC_OK, postParams, null);
-
- //TODO: verify the group membership is correct....
+ postParams.add(new NameValuePair(":member", testUserId));
+ assertAuthenticatedPostStatus(creds, postUrl,
HttpServletResponse.SC_OK, postParams, null);
+
+ members = getTestGroupMembers(creds);
+ assertEquals(1, members.length());
+ assertEquals("/system/userManager/user/" + testUserId,
members.getString(0));
+
+ memberships = getTestUserMemberships(creds);
+ assertEquals(1, memberships.length());
+ assertEquals("/system/userManager/group/" + testGroupId,
memberships.getString(0));
+
+ // delete a group member
+ postParams.clear();
+ postParams.add(new NameValuePair(":mem...@delete", testUserId));
+ assertAuthenticatedPostStatus(creds, postUrl,
HttpServletResponse.SC_OK, postParams, null);
+
+ members = getTestGroupMembers(creds);
+ assertEquals(0, members.length());
+
+ memberships = getTestUserMemberships(creds);
+ assertEquals(0, memberships.length());
+
}
-
+
+ JSONArray getTestUserMemberships(Credentials creds) throws IOException,
JSONException {
+ String getUrl = HTTP_BASE_URL + "/system/userManager/user/" +
testUserId + ".json";
+ assertAuthenticatedHttpStatus(creds, getUrl,
HttpServletResponse.SC_OK, null); //make sure the profile request returns some
data
+ String json = getAuthenticatedContent(creds, getUrl,
CONTENT_TYPE_JSON, null, HttpServletResponse.SC_OK);
+ assertNotNull(json);
+ JSONObject jsonObj = new JSONObject(json);
+ JSONArray memberships = jsonObj.getJSONArray("memberOf");
+ return memberships;
+ }
+
+ JSONArray getTestGroupMembers(Credentials creds) throws IOException,
JSONException {
+ String getUrl = HTTP_BASE_URL + "/system/userManager/group/" +
testGroupId + ".json";
+ assertAuthenticatedHttpStatus(creds, getUrl,
HttpServletResponse.SC_OK, null); //make sure the profile request returns some
data
+ String json = getAuthenticatedContent(creds, getUrl,
CONTENT_TYPE_JSON, null, HttpServletResponse.SC_OK);
+ assertNotNull(json);
+ JSONObject jsonObj = new JSONObject(json);
+ JSONArray members = jsonObj.getJSONArray("members");
+ return members;
+ }
+
}