You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2017/11/07 09:48:07 UTC
[sling-org-apache-sling-jcr-jackrabbit-usermanager] 07/28:
Formatting ...
This is an automated email from the ASF dual-hosted git repository.
rombert pushed a commit to annotated tag org.apache.sling.jcr.jackrabbit.usermanager-2.0.4
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-jcr-jackrabbit-usermanager.git
commit a034d92f8b4fed4d4acdd969846cc50fa1fda6bb
Author: Felix Meschberger <fm...@apache.org>
AuthorDate: Tue Jun 9 10:16:54 2009 +0000
Formatting ...
git-svn-id: https://svn.apache.org/repos/asf/incubator/sling/trunk/bundles/jcr/jackrabbit-usermanager@782945 13f79535-47bb-0310-9956-ffa450edef68
---
.../post/AbstractAuthorizablePostServlet.java | 352 +++++++++++----------
.../usermanager/post/AbstractGroupPostServlet.java | 108 ++++---
.../usermanager/post/AbstractUserPostServlet.java | 25 +-
.../post/ChangeUserPasswordServlet.java | 132 ++++----
.../usermanager/post/CreateGroupServlet.java | 110 ++++---
.../usermanager/post/CreateUserServlet.java | 169 +++++-----
.../post/DeleteAuthorizableServlet.java | 55 ++--
.../usermanager/post/UpdateGroupServlet.java | 90 +++---
.../usermanager/post/UpdateUserServlet.java | 80 ++---
.../usermanager/post/impl/DateParser.java | 31 +-
.../usermanager/post/impl/RequestProperty.java | 35 +-
.../usermanager/resource/AuthorizableResource.java | 144 +++++----
.../resource/AuthorizableResourceProvider.java | 343 +++++++++++---------
.../usermanager/resource/AuthorizableValueMap.java | 168 +++++-----
14 files changed, 984 insertions(+), 858 deletions(-)
diff --git a/src/main/java/org/apache/sling/jackrabbit/usermanager/post/AbstractAuthorizablePostServlet.java b/src/main/java/org/apache/sling/jackrabbit/usermanager/post/AbstractAuthorizablePostServlet.java
index ab1d5cf..412d0f2 100644
--- a/src/main/java/org/apache/sling/jackrabbit/usermanager/post/AbstractAuthorizablePostServlet.java
+++ b/src/main/java/org/apache/sling/jackrabbit/usermanager/post/AbstractAuthorizablePostServlet.java
@@ -54,12 +54,13 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
- * Base class for all the POST servlets for the UserManager operations
+ * Base class for all the POST servlets for the UserManager operations
*/
-public abstract class AbstractAuthorizablePostServlet extends SlingAllMethodsServlet {
- private static final long serialVersionUID = -5918670409789895333L;
+public abstract class AbstractAuthorizablePostServlet extends
+ SlingAllMethodsServlet {
+ private static final long serialVersionUID = -5918670409789895333L;
- /**
+ /**
* default log
*/
private final Logger log = LoggerFactory.getLogger(getClass());
@@ -71,9 +72,9 @@ public abstract class AbstractAuthorizablePostServlet extends SlingAllMethodsSer
* values.4="dd.MM.yyyy HH:mm:ss" values.5="dd.MM.yyyy"
*/
private static final String PROP_DATE_FORMAT = "servlet.post.dateFormats";
-
- private DateParser dateParser;
-
+
+ private DateParser dateParser;
+
// ---------- SCR Integration ----------------------------------------------
protected void activate(ComponentContext context) {
@@ -89,15 +90,18 @@ public abstract class AbstractAuthorizablePostServlet extends SlingAllMethodsSer
protected void deactivate(ComponentContext context) {
dateParser = null;
}
-
-
- /* (non-Javadoc)
- * @see org.apache.sling.api.servlets.SlingAllMethodsServlet#doPost(org.apache.sling.api.SlingHttpServletRequest, org.apache.sling.api.SlingHttpServletResponse)
- */
- @Override
- protected void doPost(SlingHttpServletRequest request,
- SlingHttpServletResponse httpResponse) throws ServletException,
- IOException {
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * org.apache.sling.api.servlets.SlingAllMethodsServlet#doPost(org.apache
+ * .sling.api.SlingHttpServletRequest,
+ * org.apache.sling.api.SlingHttpServletResponse)
+ */
+ @Override
+ protected void doPost(SlingHttpServletRequest request,
+ SlingHttpServletResponse httpResponse) throws ServletException,
+ IOException {
// prepare the response
HtmlResponse htmlResponse = new HtmlResponse();
htmlResponse.setReferer(request.getHeader("referer"));
@@ -112,30 +116,45 @@ public abstract class AbstractAuthorizablePostServlet extends SlingAllMethodsSer
// parent location
path = ResourceUtil.getParent(path);
if (path != null) {
- htmlResponse.setParentLocation(externalizePath(request, path));
+ htmlResponse.setParentLocation(externalizePath(request, path));
}
Session session = request.getResourceResolver().adaptTo(Session.class);
final List<Modification> changes = new ArrayList<Modification>();
-
+
try {
handleOperation(request, htmlResponse, changes);
-
- //TODO: maybe handle SlingAuthorizablePostProcessor handlers here
-
+
+ // TODO: maybe handle SlingAuthorizablePostProcessor handlers here
+
// set changes on html response
- for(Modification change : changes) {
- switch ( change.getType() ) {
- case MODIFY : htmlResponse.onModified(change.getSource()); break;
- case DELETE : htmlResponse.onDeleted(change.getSource()); break;
- case MOVE : htmlResponse.onMoved(change.getSource(), change.getDestination()); break;
- case COPY : htmlResponse.onCopied(change.getSource(), change.getDestination()); break;
- case CREATE : htmlResponse.onCreated(change.getSource()); break;
- case ORDER : htmlResponse.onChange("ordered", change.getSource(), change.getDestination()); break;
+ for (Modification change : changes) {
+ switch (change.getType()) {
+ case MODIFY:
+ htmlResponse.onModified(change.getSource());
+ break;
+ case DELETE:
+ htmlResponse.onDeleted(change.getSource());
+ break;
+ case MOVE:
+ htmlResponse.onMoved(change.getSource(),
+ change.getDestination());
+ break;
+ case COPY:
+ htmlResponse.onCopied(change.getSource(),
+ change.getDestination());
+ break;
+ case CREATE:
+ htmlResponse.onCreated(change.getSource());
+ break;
+ case ORDER:
+ htmlResponse.onChange("ordered", change.getSource(),
+ change.getDestination());
+ break;
}
}
-
+
if (session.hasPendingChanges()) {
session.save();
}
@@ -157,7 +176,7 @@ public abstract class AbstractAuthorizablePostServlet extends SlingAllMethodsSer
e.getMessage(), e);
}
}
-
+
// check for redirect URL if processing succeeded
if (htmlResponse.isSuccessful()) {
String redirect = getRedirectUrl(request, htmlResponse);
@@ -169,22 +188,22 @@ public abstract class AbstractAuthorizablePostServlet extends SlingAllMethodsSer
// create a html response and send if unsuccessful or no redirect
htmlResponse.send(httpResponse, isSetStatus(request));
- }
-
- /**
- * Extending Servlet should implement this operation to do the work
- *
- * @param request the sling http request to process
- * @param htmlResponse the response
- * @param changes
- */
- abstract protected void handleOperation(SlingHttpServletRequest request,
- HtmlResponse htmlResponse, List<Modification> changes) throws RepositoryException;
-
-
+ }
+
+ /**
+ * Extending Servlet should implement this operation to do the work
+ *
+ * @param request the sling http request to process
+ * @param htmlResponse the response
+ * @param changes
+ */
+ abstract protected void handleOperation(SlingHttpServletRequest request,
+ HtmlResponse htmlResponse, List<Modification> changes)
+ throws RepositoryException;
+
/**
* compute redirect URL (SLING-126)
- *
+ *
* @param ctx the post processor
* @return the redirect location or <code>null</code>
*/
@@ -255,17 +274,15 @@ public abstract class AbstractAuthorizablePostServlet extends SlingAllMethodsSer
SlingPostConstants.RP_STATUS);
return true;
}
-
-
-
- // ------ The methods below are based on the private methods from the ModifyOperation class -----
-
+
+ // ------ The methods below are based on the private methods from the
+ // ModifyOperation class -----
+
/**
* Collects the properties that form the content to be written back to the
- * repository.
+ * repository. NOTE: In the returned map, the key is the property name not a
+ * path.
*
- * NOTE: In the returned map, the key is the property name not a path.
- *
* @throws RepositoryException if a repository error occurs
* @throws ServletException if an internal error occurs
*/
@@ -295,13 +312,14 @@ public abstract class AbstractAuthorizablePostServlet extends SlingAllMethodsSer
// ensure the paramName is an absolute property name
String propPath;
if (paramName.startsWith("./")) {
- propPath = paramName.substring(2);
+ propPath = paramName.substring(2);
} else {
- propPath = paramName;
+ propPath = paramName;
}
if (propPath.indexOf('/') != -1) {
- //only one path segment is valid here, so this paramter can't be used.
- continue; //skip it.
+ // only one path segment is valid here, so this paramter can't
+ // be used.
+ continue; // skip it.
}
// @TypeHint example
@@ -374,7 +392,7 @@ public abstract class AbstractAuthorizablePostServlet extends SlingAllMethodsSer
// causes the JCR Text property to be set by moving the /tmp/path
// property to Text.
if (propPath.endsWith(SlingPostConstants.SUFFIX_MOVE_FROM)) {
- //don't support @MoveFrom here
+ // don't support @MoveFrom here
continue;
}
@@ -384,7 +402,7 @@ public abstract class AbstractAuthorizablePostServlet extends SlingAllMethodsSer
// causes the JCR Text property to be set by copying the /tmp/path
// property to Text.
if (propPath.endsWith(SlingPostConstants.SUFFIX_COPY_FROM)) {
- //don't support @CopyFrom here
+ // don't support @CopyFrom here
continue;
}
@@ -396,13 +414,12 @@ public abstract class AbstractAuthorizablePostServlet extends SlingAllMethodsSer
return reqProperties;
}
-
-
+
/**
* Returns the request property for the given property path. If such a
* request property does not exist yet it is created and stored in the
* <code>props</code>.
- *
+ *
* @param props The map of already seen request properties.
* @param paramName The absolute path of the property including the
* <code>suffix</code> to be looked up.
@@ -425,14 +442,14 @@ public abstract class AbstractAuthorizablePostServlet extends SlingAllMethodsSer
return prop;
}
-
-
+
/**
* Removes all properties listed as {@link RequestProperty#isDelete()} from
* the authorizable.
- *
- * @param authorizable The <code>org.apache.jackrabbit.api.security.user.Authorizable</code>
- * that should have properties deleted.
+ *
+ * @param authorizable The
+ * <code>org.apache.jackrabbit.api.security.user.Authorizable</code>
+ * that should have properties deleted.
* @param reqProperties The map of request properties to check for
* properties to be removed.
* @param response The <code>HtmlResponse</code> to be updated with
@@ -440,30 +457,29 @@ public abstract class AbstractAuthorizablePostServlet extends SlingAllMethodsSer
* @throws RepositoryException Is thrown if an error occurrs checking or
* removing properties.
*/
- protected void processDeletes(Authorizable resource,
+ protected void processDeletes(Authorizable resource,
Map<String, RequestProperty> reqProperties,
List<Modification> changes) throws RepositoryException {
for (RequestProperty property : reqProperties.values()) {
if (property.isDelete()) {
- if (resource.hasProperty(property.getName())) {
- resource.removeProperty(property.getName());
+ if (resource.hasProperty(property.getName())) {
+ resource.removeProperty(property.getName());
changes.add(Modification.onDeleted(property.getPath()));
- }
+ }
}
}
}
-
/**
* Writes back the content
- *
+ *
* @throws RepositoryException if a repository error occurs
* @throws ServletException if an internal error occurs
*/
protected void writeContent(Session session, Authorizable authorizable,
- Map<String, RequestProperty> reqProperties, List<Modification> changes)
- throws RepositoryException {
+ Map<String, RequestProperty> reqProperties,
+ List<Modification> changes) throws RepositoryException {
for (RequestProperty prop : reqProperties.values()) {
if (prop.hasValues()) {
@@ -474,45 +490,47 @@ public abstract class AbstractAuthorizablePostServlet extends SlingAllMethodsSer
}
if (authorizable.isGroup()) {
if (prop.getName().equals("groupId")) {
- //skip these
- continue;
- }
+ // skip these
+ continue;
+ }
} else {
- if (prop.getName().equals("userId") ||
- prop.getName().equals("pwd") ||
- prop.getName().equals("pwdConfirm")) {
- //skip these
- continue;
+ if (prop.getName().equals("userId")
+ || prop.getName().equals("pwd")
+ || prop.getName().equals("pwdConfirm")) {
+ // skip these
+ continue;
}
}
if (prop.isFileUpload()) {
- //don't handle files for user properties for now.
- continue;
- //uploadHandler.setFile(parent, prop, changes);
+ // don't handle files for user properties for now.
+ continue;
+ // uploadHandler.setFile(parent, prop, changes);
} else {
- setPropertyAsIs(session, authorizable, prop, changes);
+ setPropertyAsIs(session, authorizable, prop, changes);
}
}
}
}
-
+
/**
* set property without processing, except for type hints
- *
+ *
* @param parent the parent node
* @param prop the request property
* @throws RepositoryException if a repository error occurs.
*/
- private void setPropertyAsIs(Session session, Authorizable parent, RequestProperty prop, List<Modification> changes)
+ private void setPropertyAsIs(Session session, Authorizable parent,
+ RequestProperty prop, List<Modification> changes)
throws RepositoryException {
- String parentPath;
- if (parent.isGroup()) {
- parentPath = AuthorizableResourceProvider.SYSTEM_USER_MANAGER_GROUP_PREFIX + parent.getID();
- } else {
- parentPath = AuthorizableResourceProvider.SYSTEM_USER_MANAGER_USER_PREFIX + parent.getID();
- }
-
+ String parentPath;
+ if (parent.isGroup()) {
+ parentPath = AuthorizableResourceProvider.SYSTEM_USER_MANAGER_GROUP_PREFIX
+ + parent.getID();
+ } else {
+ parentPath = AuthorizableResourceProvider.SYSTEM_USER_MANAGER_USER_PREFIX
+ + parent.getID();
+ }
// no explicit typehint
int type = PropertyType.UNDEFINED;
@@ -525,29 +543,29 @@ public abstract class AbstractAuthorizablePostServlet extends SlingAllMethodsSer
}
String[] values = prop.getStringValues();
- if (values == null) {
+ if (values == null) {
// remove property
- boolean removedProp = removePropertyIfExists(parent, prop.getName());
- if (removedProp) {
- changes.add(Modification.onDeleted(
- parentPath + "/" + prop.getName()
- ));
- }
+ boolean removedProp = removePropertyIfExists(parent, prop.getName());
+ if (removedProp) {
+ changes.add(Modification.onDeleted(parentPath + "/"
+ + prop.getName()));
+ }
} else if (values.length == 0) {
// do not create new prop here, but clear existing
if (parent.hasProperty(prop.getName())) {
- Value val = session.getValueFactory().createValue("");
- parent.setProperty(prop.getName(), val);
- changes.add(Modification.onModified(
- parentPath + "/" + prop.getName()
- ));
+ Value val = session.getValueFactory().createValue("");
+ parent.setProperty(prop.getName(), val);
+ changes.add(Modification.onModified(parentPath + "/"
+ + prop.getName()));
}
} else if (values.length == 1) {
boolean removedProp = removePropertyIfExists(parent, prop.getName());
- // if the provided value is the empty string, we don't have to do anything.
- if ( values[0].length() == 0 ) {
- if ( removedProp ) {
- changes.add(Modification.onDeleted(parentPath + "/" + prop.getName()));
+ // if the provided value is the empty string, we don't have to do
+ // anything.
+ if (values[0].length() == 0) {
+ if (removedProp) {
+ changes.add(Modification.onDeleted(parentPath + "/"
+ + prop.getName()));
}
} else {
// modify property
@@ -555,38 +573,41 @@ public abstract class AbstractAuthorizablePostServlet extends SlingAllMethodsSer
// try conversion
Calendar c = dateParser.parse(values[0]);
if (c != null) {
- if ( prop.hasMultiValueTypeHint() ) {
+ if (prop.hasMultiValueTypeHint()) {
final Value[] array = new Value[1];
array[0] = session.getValueFactory().createValue(c);
parent.setProperty(prop.getName(), array);
- changes.add(Modification.onModified(
- parentPath + "/" + prop.getName()
- ));
+ changes.add(Modification.onModified(parentPath
+ + "/" + prop.getName()));
} else {
- Value cVal = session.getValueFactory().createValue(c);
- parent.setProperty(prop.getName(), cVal);
- changes.add(Modification.onModified(
- parentPath + "/" + prop.getName()
- ));
+ Value cVal = session.getValueFactory().createValue(
+ c);
+ parent.setProperty(prop.getName(), cVal);
+ changes.add(Modification.onModified(parentPath
+ + "/" + prop.getName()));
}
return;
}
// fall back to default behaviour
}
- if ( type == PropertyType.UNDEFINED ) {
- Value val = session.getValueFactory().createValue(values[0], PropertyType.STRING);
- parent.setProperty(prop.getName(), val);
+ if (type == PropertyType.UNDEFINED) {
+ Value val = session.getValueFactory().createValue(
+ values[0], PropertyType.STRING);
+ parent.setProperty(prop.getName(), val);
} else {
- if ( prop.hasMultiValueTypeHint() ) {
+ if (prop.hasMultiValueTypeHint()) {
final Value[] array = new Value[1];
- array[0] = session.getValueFactory().createValue(values[0], type);
+ array[0] = session.getValueFactory().createValue(
+ values[0], type);
parent.setProperty(prop.getName(), array);
} else {
- Value val = session.getValueFactory().createValue(values[0], type);
+ Value val = session.getValueFactory().createValue(
+ values[0], type);
parent.setProperty(prop.getName(), val);
}
}
- changes.add(Modification.onModified(parentPath + "/" + prop.getName()));
+ changes.add(Modification.onModified(parentPath + "/"
+ + prop.getName()));
}
} else {
removePropertyIfExists(parent, prop.getName());
@@ -595,51 +616,52 @@ public abstract class AbstractAuthorizablePostServlet extends SlingAllMethodsSer
ValueFactory valFac = session.getValueFactory();
Value[] c = dateParser.parse(values, valFac);
if (c != null) {
- parent.setProperty(prop.getName(), c);
- changes.add(Modification.onModified(
- parentPath + "/" + prop.getName()
- ));
+ parent.setProperty(prop.getName(), c);
+ changes.add(Modification.onModified(parentPath + "/"
+ + prop.getName()));
return;
}
// fall back to default behaviour
}
- Value [] vals = new Value[values.length];
- if ( type == PropertyType.UNDEFINED ) {
- for(int i=0; i < values.length; i++) {
- vals[i] = session.getValueFactory().createValue(values[i]);
- }
+ Value[] vals = new Value[values.length];
+ if (type == PropertyType.UNDEFINED) {
+ for (int i = 0; i < values.length; i++) {
+ vals[i] = session.getValueFactory().createValue(values[i]);
+ }
} else {
- for(int i=0; i < values.length; i++) {
- vals[i] = session.getValueFactory().createValue(values[i], type);
- }
+ for (int i = 0; i < values.length; i++) {
+ vals[i] = session.getValueFactory().createValue(values[i],
+ type);
+ }
}
- parent.setProperty(prop.getName(), vals);
- changes.add(Modification.onModified(parentPath + "/" + prop.getName()));
+ parent.setProperty(prop.getName(), vals);
+ changes.add(Modification.onModified(parentPath + "/"
+ + prop.getName()));
}
-
+
}
/**
* Removes the property with the given name from the parent resource if it
* exists.
- *
+ *
* @param parent the parent resource
* @param name the name of the property to remove
- * @return path of the property that was removed or <code>null</code> if
- * it was not removed
+ * @return path of the property that was removed or <code>null</code> if it
+ * was not removed
* @throws RepositoryException if a repository error occurs.
*/
- private boolean removePropertyIfExists(Authorizable resource, String name) throws RepositoryException {
- if (resource.getProperty(name) != null) {
- resource.removeProperty(name);
- return true;
- }
- return false;
- }
+ private boolean removePropertyIfExists(Authorizable resource, String name)
+ throws RepositoryException {
+ if (resource.getProperty(name) != null) {
+ resource.removeProperty(name);
+ return true;
+ }
+ return false;
+ }
-
- // ------ These methods were copied from AbstractSlingPostOperation ------
+ // ------ These methods were copied from AbstractSlingPostOperation ------
/**
* Returns the path of the resource of the request as the item path.
@@ -654,7 +676,7 @@ public abstract class AbstractAuthorizablePostServlet extends SlingAllMethodsSer
/**
* Returns an external form of the given path prepending the context path
* and appending a display extension.
- *
+ *
* @param path the path to externalize
* @return the url
*/
@@ -675,20 +697,20 @@ public abstract class AbstractAuthorizablePostServlet extends SlingAllMethodsSer
return ret.toString();
}
-
+
/**
- * Returns <code>true</code> if the <code>name</code> starts with either
- * of the prefixes
- * {@link SlingPostConstants#ITEM_PREFIX_RELATIVE_CURRENT <code>./</code>},
- * {@link SlingPostConstants#ITEM_PREFIX_RELATIVE_PARENT <code>../</code>}
- * and {@link SlingPostConstants#ITEM_PREFIX_ABSOLUTE <code>/</code>}.
+ * Returns <code>true</code> if the <code>name</code> starts with either of
+ * the prefixes {@link SlingPostConstants#ITEM_PREFIX_RELATIVE_CURRENT
+ * <code>./</code>}, {@link SlingPostConstants#ITEM_PREFIX_RELATIVE_PARENT
+ * <code>../</code>} and {@link SlingPostConstants#ITEM_PREFIX_ABSOLUTE
+ * <code>/</code>}.
*/
protected boolean hasItemPathPrefix(String name) {
return name.startsWith(SlingPostConstants.ITEM_PREFIX_ABSOLUTE)
|| name.startsWith(SlingPostConstants.ITEM_PREFIX_RELATIVE_CURRENT)
|| name.startsWith(SlingPostConstants.ITEM_PREFIX_RELATIVE_PARENT);
}
-
+
/**
* Returns true if any of the request parameters starts with
* {@link SlingPostConstants#ITEM_PREFIX_RELATIVE_CURRENT <code>./</code>}.
@@ -713,5 +735,5 @@ public abstract class AbstractAuthorizablePostServlet extends SlingAllMethodsSer
return requirePrefix;
}
-
+
}
diff --git a/src/main/java/org/apache/sling/jackrabbit/usermanager/post/AbstractGroupPostServlet.java b/src/main/java/org/apache/sling/jackrabbit/usermanager/post/AbstractGroupPostServlet.java
index 675aeb8..1c677d6 100644
--- a/src/main/java/org/apache/sling/jackrabbit/usermanager/post/AbstractGroupPostServlet.java
+++ b/src/main/java/org/apache/sling/jackrabbit/usermanager/post/AbstractGroupPostServlet.java
@@ -32,64 +32,70 @@ import org.apache.sling.servlets.post.SlingPostConstants;
/**
* Base class for servlets manipulating groups
*/
-public abstract class AbstractGroupPostServlet extends AbstractAuthorizablePostServlet {
- private static final long serialVersionUID = 1159063041816944076L;
+public abstract class AbstractGroupPostServlet extends
+ AbstractAuthorizablePostServlet {
+ private static final long serialVersionUID = 1159063041816944076L;
- /**
- * Update the group membership based on the ":member" request
- * parameters. If the ":member" value ends with @Delete it is removed
- * from the group membership, otherwise it is added to the group membership.
+ /**
+ * Update the group membership based on the ":member" request parameters. If
+ * the ":member" value ends with @Delete it is removed from the group
+ * membership, otherwise it is added to the group membership.
*
* @param request
* @param authorizable
* @throws RepositoryException
*/
- protected void updateGroupMembership(SlingHttpServletRequest request,
- Authorizable authorizable, List<Modification> changes) throws RepositoryException {
- if (authorizable.isGroup()) {
- Group group = ((Group)authorizable);
- String groupPath = AuthorizableResourceProvider.SYSTEM_USER_MANAGER_GROUP_PREFIX + group.getID();
+ protected void updateGroupMembership(SlingHttpServletRequest request,
+ Authorizable authorizable, List<Modification> changes)
+ throws RepositoryException {
+ if (authorizable.isGroup()) {
+ Group group = ((Group) authorizable);
+ String groupPath = AuthorizableResourceProvider.SYSTEM_USER_MANAGER_GROUP_PREFIX
+ + group.getID();
- ResourceResolver resolver = request.getResourceResolver();
- Resource baseResource = request.getResource();
- boolean changed = false;
+ ResourceResolver resolver = request.getResourceResolver();
+ Resource baseResource = request.getResource();
+ boolean changed = false;
- //first remove any members posted as ":member@Delete"
- String[] membersToDelete = request.getParameterValues(SlingPostConstants.RP_PREFIX + "member" + SlingPostConstants.SUFFIX_DELETE);
- if (membersToDelete != null) {
- for (String member : membersToDelete) {
- Resource res = resolver.getResource(baseResource, member);
- if (res != null) {
- Authorizable memberAuthorizable = res.adaptTo(Authorizable.class);
- if (memberAuthorizable != null) {
- group.removeMember(memberAuthorizable);
- changed = true;
- }
- }
-
- }
- }
-
- //second add any members posted as ":member"
- String[] membersToAdd = request.getParameterValues(SlingPostConstants.RP_PREFIX + "member");
- if (membersToAdd != null) {
- for (String member : membersToAdd) {
- Resource res = resolver.getResource(baseResource, member);
- if (res != null) {
- Authorizable memberAuthorizable = res.adaptTo(Authorizable.class);
- if (memberAuthorizable != null) {
- group.addMember(memberAuthorizable);
- changed = true;
- }
- }
- }
- }
+ // first remove any members posted as ":member@Delete"
+ String[] membersToDelete = request.getParameterValues(SlingPostConstants.RP_PREFIX
+ + "member" + SlingPostConstants.SUFFIX_DELETE);
+ if (membersToDelete != null) {
+ for (String member : membersToDelete) {
+ Resource res = resolver.getResource(baseResource, member);
+ if (res != null) {
+ Authorizable memberAuthorizable = res.adaptTo(Authorizable.class);
+ if (memberAuthorizable != null) {
+ group.removeMember(memberAuthorizable);
+ changed = true;
+ }
+ }
+
+ }
+ }
+
+ // second add any members posted as ":member"
+ String[] membersToAdd = request.getParameterValues(SlingPostConstants.RP_PREFIX
+ + "member");
+ if (membersToAdd != null) {
+ for (String member : membersToAdd) {
+ Resource res = resolver.getResource(baseResource, member);
+ if (res != null) {
+ Authorizable memberAuthorizable = res.adaptTo(Authorizable.class);
+ if (memberAuthorizable != null) {
+ group.addMember(memberAuthorizable);
+ changed = true;
+ }
+ }
+ }
+ }
+
+ if (changed) {
+ // add an entry to the changes list to record the membership
+ // change
+ changes.add(Modification.onModified(groupPath + "/members"));
+ }
+ }
+ }
- if (changed) {
- //add an entry to the changes list to record the membership change
- changes.add(Modification.onModified(groupPath + "/members"));
- }
- }
- }
-
}
diff --git a/src/main/java/org/apache/sling/jackrabbit/usermanager/post/AbstractUserPostServlet.java b/src/main/java/org/apache/sling/jackrabbit/usermanager/post/AbstractUserPostServlet.java
index 8e32ae9..87cf907 100644
--- a/src/main/java/org/apache/sling/jackrabbit/usermanager/post/AbstractUserPostServlet.java
+++ b/src/main/java/org/apache/sling/jackrabbit/usermanager/post/AbstractUserPostServlet.java
@@ -26,30 +26,34 @@ import org.osgi.service.component.ComponentContext;
/**
* Base class for servlets manipulating users
*/
-public abstract class AbstractUserPostServlet extends AbstractAuthorizablePostServlet {
- private static final long serialVersionUID = -8401210711297654453L;
+public abstract class AbstractUserPostServlet extends
+ AbstractAuthorizablePostServlet {
+ private static final long serialVersionUID = -8401210711297654453L;
- /**
+ /**
* To be used for the encryption. E.g. for passwords in
- * {@link javax.jcr.SimpleCredentials#getPassword()} SimpleCredentials}
+ * {@link javax.jcr.SimpleCredentials#getPassword()} SimpleCredentials}
+ *
* @scr.property valueRef="DEFAULT_PASSWORD_DIGEST_ALGORITHM"
*/
private static final String PROP_PASSWORD_DIGEST_ALGORITHM = "password.digest.algorithm";
+
private static final String DEFAULT_PASSWORD_DIGEST_ALGORITHM = "sha1";
+
private String passwordDigestAlgoritm = null;
// ---------- SCR Integration ----------------------------------------------
protected void activate(ComponentContext context) {
super.activate(context);
-
+
Dictionary<?, ?> props = context.getProperties();
Object propValue = props.get(PROP_PASSWORD_DIGEST_ALGORITHM);
if (propValue instanceof String) {
- passwordDigestAlgoritm = (String)propValue;
+ passwordDigestAlgoritm = (String) propValue;
} else {
- passwordDigestAlgoritm = DEFAULT_PASSWORD_DIGEST_ALGORITHM;
+ passwordDigestAlgoritm = DEFAULT_PASSWORD_DIGEST_ALGORITHM;
}
}
@@ -57,7 +61,7 @@ public abstract class AbstractUserPostServlet extends AbstractAuthorizablePostSe
super.deactivate(context);
passwordDigestAlgoritm = null;
}
-
+
/**
* Digest the given password using the configured digest algorithm
*
@@ -69,7 +73,8 @@ public abstract class AbstractUserPostServlet extends AbstractAuthorizablePostSe
try {
StringBuffer password = new StringBuffer();
password.append("{").append(passwordDigestAlgoritm).append("}");
- password.append(Text.digest(passwordDigestAlgoritm, pwd.getBytes("UTF-8")));
+ password.append(Text.digest(passwordDigestAlgoritm,
+ pwd.getBytes("UTF-8")));
return password.toString();
} catch (NoSuchAlgorithmException e) {
throw new IllegalArgumentException(e.toString());
@@ -77,5 +82,5 @@ public abstract class AbstractUserPostServlet extends AbstractAuthorizablePostSe
throw new IllegalArgumentException(e.toString());
}
}
-
+
}
diff --git a/src/main/java/org/apache/sling/jackrabbit/usermanager/post/ChangeUserPasswordServlet.java b/src/main/java/org/apache/sling/jackrabbit/usermanager/post/ChangeUserPasswordServlet.java
index 9feddec..118f6aa 100644
--- a/src/main/java/org/apache/sling/jackrabbit/usermanager/post/ChangeUserPasswordServlet.java
+++ b/src/main/java/org/apache/sling/jackrabbit/usermanager/post/ChangeUserPasswordServlet.java
@@ -31,77 +31,83 @@ import org.apache.sling.api.servlets.HtmlResponse;
import org.apache.sling.servlets.post.Modification;
/**
- * Sling Post Operation implementation for updating the password of a user in the
- * jackrabbit UserManager.
+ * Sling Post Operation implementation for updating the password of a user in
+ * the jackrabbit UserManager.
*
* @scr.component metatype="no" immediate="true"
* @scr.service interface="javax.servlet.Servlet"
* @scr.property name="sling.servlet.resourceTypes" value="sling/user"
- * @scr.property name="sling.servlet.methods" value="POST"
- * @scr.property name="sling.servlet.selectors" value="changePassword"
+ * @scr.property name="sling.servlet.methods" value="POST"
+ * @scr.property name="sling.servlet.selectors" value="changePassword"
*/
public class ChangeUserPasswordServlet extends AbstractUserPostServlet {
- private static final long serialVersionUID = 1923614318474654502L;
+ private static final long serialVersionUID = 1923614318474654502L;
- /* (non-Javadoc)
- * @see org.apache.sling.jackrabbit.usermanager.post.AbstractAuthorizablePostServlet#handleOperation(org.apache.sling.api.SlingHttpServletRequest, org.apache.sling.api.servlets.HtmlResponse, java.util.List)
- */
- @Override
- protected void handleOperation(SlingHttpServletRequest request,
- HtmlResponse htmlResponse, List<Modification> changes)
- throws RepositoryException {
- Authorizable authorizable = null;
- Resource resource = request.getResource();
- if (resource != null) {
- authorizable = resource.adaptTo(Authorizable.class);
- }
-
- //check that the user was located.
- if (authorizable == null || authorizable.isGroup()) {
- throw new ResourceNotFoundException("User to update could not be determined.");
- }
+ /*
+ * (non-Javadoc)
+ * @see
+ * org.apache.sling.jackrabbit.usermanager.post.AbstractAuthorizablePostServlet
+ * #handleOperation(org.apache.sling.api.SlingHttpServletRequest,
+ * org.apache.sling.api.servlets.HtmlResponse, java.util.List)
+ */
+ @Override
+ protected void handleOperation(SlingHttpServletRequest request,
+ HtmlResponse htmlResponse, List<Modification> changes)
+ throws RepositoryException {
+ Authorizable authorizable = null;
+ Resource resource = request.getResource();
+ if (resource != null) {
+ authorizable = resource.adaptTo(Authorizable.class);
+ }
- if ("anonymous".equals(authorizable.getID())) {
- throw new RepositoryException("Can not change the password of the anonymous user.");
- }
+ // check that the user was located.
+ if (authorizable == null || authorizable.isGroup()) {
+ throw new ResourceNotFoundException(
+ "User to update could not be determined.");
+ }
- Session session = request.getResourceResolver().adaptTo(Session.class);
- if (session == null) {
- throw new RepositoryException("JCR Session not found");
- }
+ if ("anonymous".equals(authorizable.getID())) {
+ throw new RepositoryException(
+ "Can not change the password of the anonymous user.");
+ }
- //check that the submitted parameter values have valid values.
- String oldPwd = request.getParameter("oldPwd");
- if (oldPwd == null || oldPwd.length() == 0) {
- throw new RepositoryException("Old Password was not submitted");
- }
- String newPwd = request.getParameter("newPwd");
- if (newPwd == null || newPwd.length() == 0) {
- throw new RepositoryException("New Password was not submitted");
- }
- String newPwdConfirm = request.getParameter("newPwdConfirm");
- if (!newPwd.equals(newPwdConfirm)) {
- throw new RepositoryException("New Password does not match the confirmation password");
- }
-
- try {
- String digestedOldPwd = digestPassword(oldPwd);
- Value[] pwdProperty = ((User)authorizable).getProperty("rep:password");
- if (pwdProperty != null && pwdProperty.length > 0) {
- String repPasswordValue = pwdProperty[0].getString();
- if (!digestedOldPwd.equals(repPasswordValue)) {
- //submitted oldPwd value is not correct.
- throw new RepositoryException("Old Password does not match");
- }
- }
-
- ((User)authorizable).changePassword(digestPassword(newPwd));
-
- changes.add(Modification.onModified(
- resource.getPath() + "/rep:password"
- ));
- } catch (RepositoryException re) {
- throw new RepositoryException("Failed to change user password.", re);
- }
- }
+ Session session = request.getResourceResolver().adaptTo(Session.class);
+ if (session == null) {
+ throw new RepositoryException("JCR Session not found");
+ }
+
+ // check that the submitted parameter values have valid values.
+ String oldPwd = request.getParameter("oldPwd");
+ if (oldPwd == null || oldPwd.length() == 0) {
+ throw new RepositoryException("Old Password was not submitted");
+ }
+ String newPwd = request.getParameter("newPwd");
+ if (newPwd == null || newPwd.length() == 0) {
+ throw new RepositoryException("New Password was not submitted");
+ }
+ String newPwdConfirm = request.getParameter("newPwdConfirm");
+ if (!newPwd.equals(newPwdConfirm)) {
+ throw new RepositoryException(
+ "New Password does not match the confirmation password");
+ }
+
+ try {
+ String digestedOldPwd = digestPassword(oldPwd);
+ Value[] pwdProperty = ((User) authorizable).getProperty("rep:password");
+ if (pwdProperty != null && pwdProperty.length > 0) {
+ String repPasswordValue = pwdProperty[0].getString();
+ if (!digestedOldPwd.equals(repPasswordValue)) {
+ // submitted oldPwd value is not correct.
+ throw new RepositoryException("Old Password does not match");
+ }
+ }
+
+ ((User) authorizable).changePassword(digestPassword(newPwd));
+
+ changes.add(Modification.onModified(resource.getPath()
+ + "/rep:password"));
+ } catch (RepositoryException re) {
+ throw new RepositoryException("Failed to change user password.", re);
+ }
+ }
}
diff --git a/src/main/java/org/apache/sling/jackrabbit/usermanager/post/CreateGroupServlet.java b/src/main/java/org/apache/sling/jackrabbit/usermanager/post/CreateGroupServlet.java
index a7e162b..67814ba 100644
--- a/src/main/java/org/apache/sling/jackrabbit/usermanager/post/CreateGroupServlet.java
+++ b/src/main/java/org/apache/sling/jackrabbit/usermanager/post/CreateGroupServlet.java
@@ -38,63 +38,73 @@ import org.apache.sling.servlets.post.SlingPostConstants;
* Sling Post Servlet implementation for creating a group in the jackrabbit
* UserManager.
*
- * @scr.component immediate="true"
+ * @scr.component immediate="true"
* @scr.service interface="javax.servlet.Servlet"
* @scr.property name="sling.servlet.resourceTypes" value="sling/groups"
- * @scr.property name="sling.servlet.methods" value="POST"
- * @scr.property name="sling.servlet.selectors" value="create"
+ * @scr.property name="sling.servlet.methods" value="POST"
+ * @scr.property name="sling.servlet.selectors" value="create"
*/
public class CreateGroupServlet extends AbstractGroupPostServlet {
- private static final long serialVersionUID = -1084915263933901466L;
+ private static final long serialVersionUID = -1084915263933901466L;
- /* (non-Javadoc)
- * @see org.apache.sling.jackrabbit.usermanager.post.AbstractAuthorizablePostServlet#handleOperation(org.apache.sling.api.SlingHttpServletRequest, org.apache.sling.api.servlets.HtmlResponse, java.util.List)
- */
- @Override
- protected void handleOperation(SlingHttpServletRequest request,
- HtmlResponse response, List<Modification> changes) throws RepositoryException {
-
- //check that the submitted parameter values have valid values.
- final String principalName = request.getParameter(SlingPostConstants.RP_NODE_NAME);
- if (principalName == null) {
- throw new RepositoryException("Group name was not submitted");
- }
+ /*
+ * (non-Javadoc)
+ * @see
+ * org.apache.sling.jackrabbit.usermanager.post.AbstractAuthorizablePostServlet
+ * #handleOperation(org.apache.sling.api.SlingHttpServletRequest,
+ * org.apache.sling.api.servlets.HtmlResponse, java.util.List)
+ */
+ @Override
+ protected void handleOperation(SlingHttpServletRequest request,
+ HtmlResponse response, List<Modification> changes)
+ throws RepositoryException {
- Session session = request.getResourceResolver().adaptTo(Session.class);
- if (session == null) {
- throw new RepositoryException("JCR Session not found");
- }
+ // check that the submitted parameter values have valid values.
+ final String principalName = request.getParameter(SlingPostConstants.RP_NODE_NAME);
+ if (principalName == null) {
+ throw new RepositoryException("Group name was not submitted");
+ }
- try {
- UserManager userManager = AccessControlUtil.getUserManager(session);
- Authorizable authorizable = userManager.getAuthorizable(principalName);
-
- if (authorizable != null) {
- //principal already exists!
- throw new RepositoryException("A principal already exists with the requested name: " + principalName);
- } else {
- Map<String, RequestProperty> reqProperties = collectContent(request, response);
+ Session session = request.getResourceResolver().adaptTo(Session.class);
+ if (session == null) {
+ throw new RepositoryException("JCR Session not found");
+ }
- Group group = userManager.createGroup(new Principal() {
- public String getName() {
- return principalName;
- }
- });
+ try {
+ UserManager userManager = AccessControlUtil.getUserManager(session);
+ Authorizable authorizable = userManager.getAuthorizable(principalName);
- String groupPath = AuthorizableResourceProvider.SYSTEM_USER_MANAGER_GROUP_PREFIX + group.getID();
- response.setPath(groupPath);
- response.setLocation(externalizePath(request, groupPath));
- response.setParentLocation(externalizePath(request, AuthorizableResourceProvider.SYSTEM_USER_MANAGER_GROUP_PATH));
- changes.add(Modification.onCreated(groupPath));
-
- // write content from form
- writeContent(session, group, reqProperties, changes);
-
- //update the group memberships
- updateGroupMembership(request, group, changes);
- }
- } catch (RepositoryException re) {
- throw new RepositoryException("Failed to create new group.", re);
- }
- }
+ if (authorizable != null) {
+ // principal already exists!
+ throw new RepositoryException(
+ "A principal already exists with the requested name: "
+ + principalName);
+ } else {
+ Map<String, RequestProperty> reqProperties = collectContent(
+ request, response);
+
+ Group group = userManager.createGroup(new Principal() {
+ public String getName() {
+ return principalName;
+ }
+ });
+
+ String groupPath = AuthorizableResourceProvider.SYSTEM_USER_MANAGER_GROUP_PREFIX
+ + group.getID();
+ response.setPath(groupPath);
+ response.setLocation(externalizePath(request, groupPath));
+ response.setParentLocation(externalizePath(request,
+ AuthorizableResourceProvider.SYSTEM_USER_MANAGER_GROUP_PATH));
+ changes.add(Modification.onCreated(groupPath));
+
+ // write content from form
+ writeContent(session, group, reqProperties, changes);
+
+ // update the group memberships
+ updateGroupMembership(request, group, changes);
+ }
+ } catch (RepositoryException re) {
+ throw new RepositoryException("Failed to create new group.", re);
+ }
+ }
}
diff --git a/src/main/java/org/apache/sling/jackrabbit/usermanager/post/CreateUserServlet.java b/src/main/java/org/apache/sling/jackrabbit/usermanager/post/CreateUserServlet.java
index c8259dc..7d0c9af 100644
--- a/src/main/java/org/apache/sling/jackrabbit/usermanager/post/CreateUserServlet.java
+++ b/src/main/java/org/apache/sling/jackrabbit/usermanager/post/CreateUserServlet.java
@@ -46,29 +46,31 @@ import org.slf4j.LoggerFactory;
* description="%createUser.post.operation.description"
* @scr.service interface="javax.servlet.Servlet"
* @scr.property name="sling.servlet.resourceTypes" value="sling/users"
- * @scr.property name="sling.servlet.methods" value="POST"
- * @scr.property name="sling.servlet.selectors" value="create"
+ * @scr.property name="sling.servlet.methods" value="POST"
+ * @scr.property name="sling.servlet.selectors" value="create"
*/
public class CreateUserServlet extends AbstractUserPostServlet {
- private static final long serialVersionUID = 6871481922737658675L;
+ private static final long serialVersionUID = 6871481922737658675L;
- /**
+ /**
* default log
*/
private final Logger log = LoggerFactory.getLogger(getClass());
- /** @scr.property label="%self.registration.enabled.name"
- * description="%self.registration.enabled.description"
- * valueRef="DEFAULT_SELF_REGISTRATION_ENABLED"
+ /**
+ * @scr.property label="%self.registration.enabled.name"
+ * description="%self.registration.enabled.description"
+ * valueRef="DEFAULT_SELF_REGISTRATION_ENABLED"
*/
private static final String PROP_SELF_REGISTRATION_ENABLED = "self.registration.enabled";
+
private static final Boolean DEFAULT_SELF_REGISTRATION_ENABLED = Boolean.TRUE;
private Boolean selfRegistrationEnabled = DEFAULT_SELF_REGISTRATION_ENABLED;
/**
* The JCR Repository we access to resolve resources
- *
+ *
* @scr.reference
*/
private SlingRepository repository;
@@ -89,7 +91,7 @@ public class CreateUserServlet extends AbstractUserPostServlet {
* Return the administrative session and close it.
*/
private void ungetSession(final Session session) {
- if ( session != null ) {
+ if (session != null) {
try {
session.logout();
} catch (Throwable t) {
@@ -102,83 +104,94 @@ public class CreateUserServlet extends AbstractUserPostServlet {
/**
* Activates this component.
- *
+ *
* @param componentContext The OSGi <code>ComponentContext</code> of this
- * component.
+ * component.
*/
protected void activate(ComponentContext componentContext) {
- super.activate(componentContext);
+ super.activate(componentContext);
Dictionary<?, ?> props = componentContext.getProperties();
Object propValue = props.get(PROP_SELF_REGISTRATION_ENABLED);
if (propValue instanceof String) {
- selfRegistrationEnabled = Boolean.parseBoolean((String)propValue);
+ selfRegistrationEnabled = Boolean.parseBoolean((String) propValue);
} else {
- selfRegistrationEnabled = DEFAULT_SELF_REGISTRATION_ENABLED;
+ selfRegistrationEnabled = DEFAULT_SELF_REGISTRATION_ENABLED;
}
}
-
-
- /* (non-Javadoc)
- * @see org.apache.sling.jackrabbit.usermanager.post.AbstractAuthorizablePostServlet#handleOperation(org.apache.sling.api.SlingHttpServletRequest, org.apache.sling.api.servlets.HtmlResponse, java.util.List)
- */
- @Override
- protected void handleOperation(SlingHttpServletRequest request,
- HtmlResponse response, List<Modification> changes) throws RepositoryException {
- //make sure user self-registration is enabled
- if (!selfRegistrationEnabled) {
- throw new RepositoryException("Sorry, registration of new users is not currently enabled. Please try again later.");
- }
-
- Session session = request.getResourceResolver().adaptTo(Session.class);
- if (session == null) {
- throw new RepositoryException("JCR Session not found");
- }
-
- //check that the submitted parameter values have valid values.
- String principalName = request.getParameter(SlingPostConstants.RP_NODE_NAME);
- if (principalName == null) {
- throw new RepositoryException("User name was not submitted");
- }
- String pwd = request.getParameter("pwd");
- if (pwd == null) {
- throw new RepositoryException("Password was not submitted");
- }
- String pwdConfirm = request.getParameter("pwdConfirm");
- if (!pwd.equals(pwdConfirm)) {
- throw new RepositoryException("Password value does not match the confirmation password");
- }
-
- Session selfRegSession = null;
- try {
- selfRegSession = getSession();
-
- UserManager userManager = AccessControlUtil.getUserManager(selfRegSession);
- Authorizable authorizable = userManager.getAuthorizable(principalName);
-
- if (authorizable != null) {
- //user already exists!
- throw new RepositoryException("A principal already exists with the requested name: " + principalName);
- } else {
- Map<String, RequestProperty> reqProperties = collectContent(request, response);
-
- User user = userManager.createUser(principalName, digestPassword(pwd));
- String userPath = AuthorizableResourceProvider.SYSTEM_USER_MANAGER_USER_PREFIX + user.getID();
-
- response.setPath(userPath);
- response.setLocation(externalizePath(request, userPath));
- response.setParentLocation(externalizePath(request, AuthorizableResourceProvider.SYSTEM_USER_MANAGER_USER_PATH));
- changes.add(Modification.onCreated(userPath));
-
- // write content from form
- writeContent(selfRegSession, user, reqProperties, changes);
-
- if (selfRegSession.hasPendingChanges()) {
- selfRegSession.save();
- }
- }
- } finally {
- ungetSession(selfRegSession);
- }
- }
+ /*
+ * (non-Javadoc)
+ * @see
+ * org.apache.sling.jackrabbit.usermanager.post.AbstractAuthorizablePostServlet
+ * #handleOperation(org.apache.sling.api.SlingHttpServletRequest,
+ * org.apache.sling.api.servlets.HtmlResponse, java.util.List)
+ */
+ @Override
+ protected void handleOperation(SlingHttpServletRequest request,
+ HtmlResponse response, List<Modification> changes)
+ throws RepositoryException {
+ // make sure user self-registration is enabled
+ if (!selfRegistrationEnabled) {
+ throw new RepositoryException(
+ "Sorry, registration of new users is not currently enabled. Please try again later.");
+ }
+
+ Session session = request.getResourceResolver().adaptTo(Session.class);
+ if (session == null) {
+ throw new RepositoryException("JCR Session not found");
+ }
+
+ // check that the submitted parameter values have valid values.
+ String principalName = request.getParameter(SlingPostConstants.RP_NODE_NAME);
+ if (principalName == null) {
+ throw new RepositoryException("User name was not submitted");
+ }
+ String pwd = request.getParameter("pwd");
+ if (pwd == null) {
+ throw new RepositoryException("Password was not submitted");
+ }
+ String pwdConfirm = request.getParameter("pwdConfirm");
+ if (!pwd.equals(pwdConfirm)) {
+ throw new RepositoryException(
+ "Password value does not match the confirmation password");
+ }
+
+ Session selfRegSession = null;
+ try {
+ selfRegSession = getSession();
+
+ UserManager userManager = AccessControlUtil.getUserManager(selfRegSession);
+ Authorizable authorizable = userManager.getAuthorizable(principalName);
+
+ if (authorizable != null) {
+ // user already exists!
+ throw new RepositoryException(
+ "A principal already exists with the requested name: "
+ + principalName);
+ } else {
+ Map<String, RequestProperty> reqProperties = collectContent(
+ request, response);
+
+ User user = userManager.createUser(principalName,
+ digestPassword(pwd));
+ String userPath = AuthorizableResourceProvider.SYSTEM_USER_MANAGER_USER_PREFIX
+ + user.getID();
+
+ response.setPath(userPath);
+ response.setLocation(externalizePath(request, userPath));
+ response.setParentLocation(externalizePath(request,
+ AuthorizableResourceProvider.SYSTEM_USER_MANAGER_USER_PATH));
+ changes.add(Modification.onCreated(userPath));
+
+ // write content from form
+ writeContent(selfRegSession, user, reqProperties, changes);
+
+ if (selfRegSession.hasPendingChanges()) {
+ selfRegSession.save();
+ }
+ }
+ } finally {
+ ungetSession(selfRegSession);
+ }
+ }
}
diff --git a/src/main/java/org/apache/sling/jackrabbit/usermanager/post/DeleteAuthorizableServlet.java b/src/main/java/org/apache/sling/jackrabbit/usermanager/post/DeleteAuthorizableServlet.java
index 39ac672..44d6a7b 100644
--- a/src/main/java/org/apache/sling/jackrabbit/usermanager/post/DeleteAuthorizableServlet.java
+++ b/src/main/java/org/apache/sling/jackrabbit/usermanager/post/DeleteAuthorizableServlet.java
@@ -33,34 +33,40 @@ import org.apache.sling.servlets.post.Modification;
import org.apache.sling.servlets.post.SlingPostConstants;
/**
- * Sling Post Operation implementation for deleting one or more users and/or groups from the
- * jackrabbit UserManager.
+ * Sling Post Operation implementation for deleting one or more users and/or
+ * groups from the jackrabbit UserManager.
*
* @scr.component metatype="no" immediate="true"
* @scr.service interface="javax.servlet.Servlet"
- * @scr.property name="sling.servlet.resourceTypes" values.0="sling/user" values.1="sling/group" values.2="sling/userManager"
- * @scr.property name="sling.servlet.methods" value="POST"
- * @scr.property name="sling.servlet.selectors" value="delete"
+ * @scr.property name="sling.servlet.resourceTypes" values.0="sling/user"
+ * values.1="sling/group" values.2="sling/userManager"
+ * @scr.property name="sling.servlet.methods" value="POST"
+ * @scr.property name="sling.servlet.selectors" value="delete"
*/
public class DeleteAuthorizableServlet extends AbstractAuthorizablePostServlet {
- private static final long serialVersionUID = 5874621724096106496L;
-
- /* (non-Javadoc)
- * @see org.apache.sling.jackrabbit.usermanager.post.AbstractAuthorizablePostServlet#handleOperation(org.apache.sling.api.SlingHttpServletRequest, org.apache.sling.api.servlets.HtmlResponse, java.util.List)
- */
- @Override
- protected void handleOperation(SlingHttpServletRequest request,
- HtmlResponse htmlResponse, List<Modification> changes)
- throws RepositoryException {
+ private static final long serialVersionUID = 5874621724096106496L;
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * org.apache.sling.jackrabbit.usermanager.post.AbstractAuthorizablePostServlet
+ * #handleOperation(org.apache.sling.api.SlingHttpServletRequest,
+ * org.apache.sling.api.servlets.HtmlResponse, java.util.List)
+ */
+ @Override
+ protected void handleOperation(SlingHttpServletRequest request,
+ HtmlResponse htmlResponse, List<Modification> changes)
+ throws RepositoryException {
Iterator<Resource> res = getApplyToResources(request);
if (res == null) {
Resource resource = request.getResource();
Authorizable item = resource.adaptTo(Authorizable.class);
if (item == null) {
- String msg = "Missing source " + resource.getPath() + " for delete";
- htmlResponse.setStatus(HttpServletResponse.SC_NOT_FOUND, msg);
- throw new ResourceNotFoundException(msg);
+ String msg = "Missing source " + resource.getPath()
+ + " for delete";
+ htmlResponse.setStatus(HttpServletResponse.SC_NOT_FOUND, msg);
+ throw new ResourceNotFoundException(msg);
}
item.remove();
@@ -75,17 +81,16 @@ public class DeleteAuthorizableServlet extends AbstractAuthorizablePostServlet {
}
}
}
- }
-
-
+ }
+
/**
* Returns an iterator on <code>Resource</code> instances addressed in the
* {@link SlingPostConstants#RP_APPLY_TO} request parameter. If the request
- * parameter is not set, <code>null</code> is returned. If the parameter
- * is set with valid resources an empty iterator is returned. Any resources
+ * parameter is not set, <code>null</code> is returned. If the parameter is
+ * set with valid resources an empty iterator is returned. Any resources
* addressed in the {@link SlingPostConstants#RP_APPLY_TO} parameter is
* ignored.
- *
+ *
* @param request The <code>SlingHttpServletRequest</code> object used to
* get the {@link SlingPostConstants#RP_APPLY_TO} parameter.
* @return The iterator of resources listed in the parameter or
@@ -105,7 +110,9 @@ public class DeleteAuthorizableServlet extends AbstractAuthorizablePostServlet {
private static class ApplyToIterator implements Iterator<Resource> {
private final ResourceResolver resolver;
+
private final Resource baseResource;
+
private final String[] paths;
private int pathIndex;
@@ -155,5 +162,5 @@ public class DeleteAuthorizableServlet extends AbstractAuthorizablePostServlet {
return null;
}
}
-
+
}
diff --git a/src/main/java/org/apache/sling/jackrabbit/usermanager/post/UpdateGroupServlet.java b/src/main/java/org/apache/sling/jackrabbit/usermanager/post/UpdateGroupServlet.java
index 4e433a8..5c06cf1 100644
--- a/src/main/java/org/apache/sling/jackrabbit/usermanager/post/UpdateGroupServlet.java
+++ b/src/main/java/org/apache/sling/jackrabbit/usermanager/post/UpdateGroupServlet.java
@@ -31,55 +31,61 @@ import org.apache.sling.jackrabbit.usermanager.post.impl.RequestProperty;
import org.apache.sling.servlets.post.Modification;
/**
- * Sling Post Operation implementation for updating a group in the
- * jackrabbit UserManager.
+ * Sling Post Operation implementation for updating a group in the jackrabbit
+ * UserManager.
*
* @scr.component metatype="no" immediate="true"
* @scr.service interface="javax.servlet.Servlet"
* @scr.property name="sling.servlet.resourceTypes" values="sling/group"
- * @scr.property name="sling.servlet.methods" value="POST"
- * @scr.property name="sling.servlet.selectors" value="update"
+ * @scr.property name="sling.servlet.methods" value="POST"
+ * @scr.property name="sling.servlet.selectors" value="update"
*/
public class UpdateGroupServlet extends AbstractGroupPostServlet {
- private static final long serialVersionUID = -8292054361992488797L;
+ private static final long serialVersionUID = -8292054361992488797L;
- /* (non-Javadoc)
- * @see org.apache.sling.jackrabbit.usermanager.post.AbstractAuthorizablePostServlet#handleOperation(org.apache.sling.api.SlingHttpServletRequest, org.apache.sling.api.servlets.HtmlResponse, java.util.List)
- */
- @Override
- protected void handleOperation(SlingHttpServletRequest request,
- HtmlResponse htmlResponse, List<Modification> changes)
- throws RepositoryException {
- Authorizable authorizable = null;
- Resource resource = request.getResource();
- if (resource != null) {
- authorizable = resource.adaptTo(Authorizable.class);
- }
-
- //check that the group was located.
- if (authorizable == null) {
- throw new ResourceNotFoundException("Group to update could not be determined");
- }
+ /*
+ * (non-Javadoc)
+ * @see
+ * org.apache.sling.jackrabbit.usermanager.post.AbstractAuthorizablePostServlet
+ * #handleOperation(org.apache.sling.api.SlingHttpServletRequest,
+ * org.apache.sling.api.servlets.HtmlResponse, java.util.List)
+ */
+ @Override
+ protected void handleOperation(SlingHttpServletRequest request,
+ HtmlResponse htmlResponse, List<Modification> changes)
+ throws RepositoryException {
+ Authorizable authorizable = null;
+ Resource resource = request.getResource();
+ if (resource != null) {
+ authorizable = resource.adaptTo(Authorizable.class);
+ }
- Session session = request.getResourceResolver().adaptTo(Session.class);
- if (session == null) {
- throw new RepositoryException("JCR Session not found");
- }
+ // check that the group was located.
+ if (authorizable == null) {
+ throw new ResourceNotFoundException(
+ "Group to update could not be determined");
+ }
- Map<String, RequestProperty> reqProperties = collectContent(request, htmlResponse);
- try {
- // cleanup any old content (@Delete parameters)
- processDeletes(authorizable, reqProperties, changes);
-
- // write content from form
- writeContent(session, authorizable, reqProperties, changes);
-
- //update the group memberships
- if (authorizable.isGroup()) {
- updateGroupMembership(request, authorizable, changes);
- }
- } catch (RepositoryException re) {
- throw new RepositoryException("Failed to update group.", re);
- }
- }
+ Session session = request.getResourceResolver().adaptTo(Session.class);
+ if (session == null) {
+ throw new RepositoryException("JCR Session not found");
+ }
+
+ Map<String, RequestProperty> reqProperties = collectContent(request,
+ htmlResponse);
+ try {
+ // cleanup any old content (@Delete parameters)
+ processDeletes(authorizable, reqProperties, changes);
+
+ // write content from form
+ writeContent(session, authorizable, reqProperties, changes);
+
+ // update the group memberships
+ if (authorizable.isGroup()) {
+ updateGroupMembership(request, authorizable, changes);
+ }
+ } catch (RepositoryException re) {
+ throw new RepositoryException("Failed to update group.", re);
+ }
+ }
}
diff --git a/src/main/java/org/apache/sling/jackrabbit/usermanager/post/UpdateUserServlet.java b/src/main/java/org/apache/sling/jackrabbit/usermanager/post/UpdateUserServlet.java
index d0245c6..70d0501 100644
--- a/src/main/java/org/apache/sling/jackrabbit/usermanager/post/UpdateUserServlet.java
+++ b/src/main/java/org/apache/sling/jackrabbit/usermanager/post/UpdateUserServlet.java
@@ -31,51 +31,57 @@ import org.apache.sling.jackrabbit.usermanager.post.impl.RequestProperty;
import org.apache.sling.servlets.post.Modification;
/**
- * Sling Post Operation implementation for updating a user in the
- * jackrabbit UserManager.
+ * Sling Post Operation implementation for updating a user in the jackrabbit
+ * UserManager.
*
* @scr.component metatype="no" immediate="true"
* @scr.service interface="javax.servlet.Servlet"
* @scr.property name="sling.servlet.resourceTypes" value="sling/user"
- * @scr.property name="sling.servlet.methods" value="POST"
- * @scr.property name="sling.servlet.selectors" value="update"
+ * @scr.property name="sling.servlet.methods" value="POST"
+ * @scr.property name="sling.servlet.selectors" value="update"
*/
public class UpdateUserServlet extends AbstractUserPostServlet {
- private static final long serialVersionUID = 5874621724096106496L;
+ private static final long serialVersionUID = 5874621724096106496L;
- /* (non-Javadoc)
- * @see org.apache.sling.jackrabbit.usermanager.post.AbstractAuthorizablePostServlet#handleOperation(org.apache.sling.api.SlingHttpServletRequest, org.apache.sling.api.servlets.HtmlResponse, java.util.List)
- */
- @Override
- protected void handleOperation(SlingHttpServletRequest request,
- HtmlResponse htmlResponse, List<Modification> changes)
- throws RepositoryException {
- Authorizable authorizable = null;
- Resource resource = request.getResource();
- if (resource != null) {
- authorizable = resource.adaptTo(Authorizable.class);
- }
-
- //check that the group was located.
- if (authorizable == null) {
- throw new ResourceNotFoundException("User to update could not be determined");
- }
+ /*
+ * (non-Javadoc)
+ * @see
+ * org.apache.sling.jackrabbit.usermanager.post.AbstractAuthorizablePostServlet
+ * #handleOperation(org.apache.sling.api.SlingHttpServletRequest,
+ * org.apache.sling.api.servlets.HtmlResponse, java.util.List)
+ */
+ @Override
+ protected void handleOperation(SlingHttpServletRequest request,
+ HtmlResponse htmlResponse, List<Modification> changes)
+ throws RepositoryException {
+ Authorizable authorizable = null;
+ Resource resource = request.getResource();
+ if (resource != null) {
+ authorizable = resource.adaptTo(Authorizable.class);
+ }
- Session session = request.getResourceResolver().adaptTo(Session.class);
- if (session == null) {
- throw new RepositoryException("JCR Session not found");
- }
+ // check that the group was located.
+ if (authorizable == null) {
+ throw new ResourceNotFoundException(
+ "User to update could not be determined");
+ }
- Map<String, RequestProperty> reqProperties = collectContent(request, htmlResponse);
- try {
- // cleanup any old content (@Delete parameters)
- processDeletes(authorizable, reqProperties, changes);
-
- // write content from form
- writeContent(session, authorizable, reqProperties, changes);
+ Session session = request.getResourceResolver().adaptTo(Session.class);
+ if (session == null) {
+ throw new RepositoryException("JCR Session not found");
+ }
- } catch (RepositoryException re) {
- throw new RepositoryException("Failed to update user.", re);
- }
- }
+ Map<String, RequestProperty> reqProperties = collectContent(request,
+ htmlResponse);
+ try {
+ // cleanup any old content (@Delete parameters)
+ processDeletes(authorizable, reqProperties, changes);
+
+ // write content from form
+ writeContent(session, authorizable, reqProperties, changes);
+
+ } catch (RepositoryException re) {
+ throw new RepositoryException("Failed to update user.", re);
+ }
+ }
}
diff --git a/src/main/java/org/apache/sling/jackrabbit/usermanager/post/impl/DateParser.java b/src/main/java/org/apache/sling/jackrabbit/usermanager/post/impl/DateParser.java
index 227ea4c..c2f4769 100644
--- a/src/main/java/org/apache/sling/jackrabbit/usermanager/post/impl/DateParser.java
+++ b/src/main/java/org/apache/sling/jackrabbit/usermanager/post/impl/DateParser.java
@@ -48,8 +48,9 @@ public class DateParser {
private final List<DateFormat> formats = new LinkedList<DateFormat>();
/**
- * Registers a format string to the list of internally checked ones.
- * Uses the {@link SimpleDateFormat}.
+ * Registers a format string to the list of internally checked ones. Uses
+ * the {@link SimpleDateFormat}.
+ *
* @param format format as in {@link SimpleDateFormat}
* @throws IllegalArgumentException if the format is not valid.
*/
@@ -59,6 +60,7 @@ public class DateParser {
/**
* Registers a date format to the list of internally checked ones.
+ *
* @param format date format
*/
public void register(DateFormat format) {
@@ -70,16 +72,17 @@ public class DateParser {
* instance. If no format matches returns <code>null</code>.
* <p/>
* Note: method is synchronized because SimpleDateFormat is not.
- *
+ *
* @param source date time source string
* @return calendar representation of the source or <code>null</code>
*/
public synchronized Calendar parse(String source) {
- for (DateFormat fmt: formats) {
+ for (DateFormat fmt : formats) {
try {
Date d = fmt.parse(source);
if (log.isDebugEnabled()) {
- log.debug("Parsed " + source + " using " + fmt + " into " + d);
+ log.debug("Parsed " + source + " using " + fmt + " into "
+ + d);
}
Calendar c = Calendar.getInstance();
c.setTime(d);
@@ -95,38 +98,38 @@ public class DateParser {
/**
* Parses the given source strings and returns the respective calendar
- * instances. If no format matches for any of the sources
- * returns <code>null</code>.
+ * instances. If no format matches for any of the sources returns
+ * <code>null</code>.
* <p/>
* Note: method is synchronized because SimpleDateFormat is not.
- *
+ *
* @param sources date time source strings
* @return calendar representations of the source or <code>null</code>
*/
public synchronized Calendar[] parse(String sources[]) {
Calendar ret[] = new Calendar[sources.length];
- for (int i=0; i< sources.length; i++) {
+ for (int i = 0; i < sources.length; i++) {
if ((ret[i] = parse(sources[i])) == null) {
return null;
}
}
return ret;
}
-
+
/**
* Parses the given source strings and returns the respective jcr date value
- * instances. If no format matches for any of the sources
- * returns <code>null</code>.
+ * instances. If no format matches for any of the sources returns
+ * <code>null</code>.
* <p/>
* Note: method is synchronized because SimpleDateFormat is not.
- *
+ *
* @param sources date time source strings
* @param factory the value factory
* @return jcr date value representations of the source or <code>null</code>
*/
public synchronized Value[] parse(String sources[], ValueFactory factory) {
Value ret[] = new Value[sources.length];
- for (int i=0; i< sources.length; i++) {
+ for (int i = 0; i < sources.length; i++) {
Calendar c = parse(sources[i]);
if (c == null) {
return null;
diff --git a/src/main/java/org/apache/sling/jackrabbit/usermanager/post/impl/RequestProperty.java b/src/main/java/org/apache/sling/jackrabbit/usermanager/post/impl/RequestProperty.java
index cca1323..481ab41 100644
--- a/src/main/java/org/apache/sling/jackrabbit/usermanager/post/impl/RequestProperty.java
+++ b/src/main/java/org/apache/sling/jackrabbit/usermanager/post/impl/RequestProperty.java
@@ -21,10 +21,9 @@ import org.apache.sling.api.resource.ResourceUtil;
import org.apache.sling.servlets.post.SlingPostConstants;
/**
- * This is a copy of the class from 'org.apache.sling.servlets.post.impl.helper' which is not exported.
- *
- * Encapsulates all infos from the respective request parameters that are needed
- * to create the repository property
+ * This is a copy of the class from 'org.apache.sling.servlets.post.impl.helper'
+ * which is not exported. Encapsulates all infos from the respective request
+ * parameters that are needed to create the repository property
*/
public class RequestProperty {
@@ -74,7 +73,7 @@ public class RequestProperty {
}
public void setTypeHintValue(String typeHint) {
- if ( typeHint != null && typeHint.endsWith("[]") ) {
+ if (typeHint != null && typeHint.endsWith("[]")) {
this.typeHint = typeHint.substring(0, typeHint.length() - 2);
this.hasMultiValueTypeHint = true;
} else {
@@ -126,7 +125,7 @@ public class RequestProperty {
/**
* Checks if this property provides any values. this is the case if one of
* the values is not empty or if the default handling is not 'ignore'
- *
+ *
* @return <code>true</code> if this property provides values
*/
public boolean providesValue() {
@@ -148,7 +147,7 @@ public class RequestProperty {
/**
* Returns the assembled string array out of the provided request values and
* default values.
- *
+ *
* @return a String array or <code>null</code> if the property needs to be
* removed.
*/
@@ -185,7 +184,7 @@ public class RequestProperty {
/**
* Specifies whether this property should be deleted before any new content
* is to be set according to the values stored.
- *
+ *
* @param isDelete <code>true</code> if the repository item described by
* this is to be deleted before any other operation.
*/
@@ -194,8 +193,8 @@ public class RequestProperty {
}
/**
- * Returns <code>true</code> if the repository item described by this is
- * to be deleted before setting new content to it.
+ * Returns <code>true</code> if the repository item described by this is to
+ * be deleted before setting new content to it.
*/
public boolean isDelete() {
return isDelete;
@@ -205,7 +204,7 @@ public class RequestProperty {
* Sets the path of the repository item from which the content for this
* property is to be copied or moved. The path may be relative in which case
* it will be resolved relative to the absolute path of this property.
- *
+ *
* @param sourcePath The path of the repository item to get the content from
* @param isMove <code>true</code> if the source content is to be moved,
* otherwise the source content is copied from the repository
@@ -224,9 +223,9 @@ public class RequestProperty {
}
/**
- * Returns <code>true</code> if the content of this property is to be set
- * by moving content from another repository item.
- *
+ * Returns <code>true</code> if the content of this property is to be set by
+ * moving content from another repository item.
+ *
* @see #getRepositorySource()
*/
public boolean hasRepositoryMoveSource() {
@@ -234,9 +233,9 @@ public class RequestProperty {
}
/**
- * Returns <code>true</code> if the content of this property is to be set
- * by copying content from another repository item.
- *
+ * Returns <code>true</code> if the content of this property is to be set by
+ * copying content from another repository item.
+ *
* @see #getRepositorySource()
*/
public boolean hasRepositoryCopySource() {
@@ -246,7 +245,7 @@ public class RequestProperty {
/**
* Returns the absolute path of the repository item from which the content
* for this property is to be copied or moved.
- *
+ *
* @see #hasRepositoryCopySource()
* @see #hasRepositoryMoveSource()
* @see #setRepositorySource(String, boolean)
diff --git a/src/main/java/org/apache/sling/jackrabbit/usermanager/resource/AuthorizableResource.java b/src/main/java/org/apache/sling/jackrabbit/usermanager/resource/AuthorizableResource.java
index c158d46..aac15c5 100644
--- a/src/main/java/org/apache/sling/jackrabbit/usermanager/resource/AuthorizableResource.java
+++ b/src/main/java/org/apache/sling/jackrabbit/usermanager/resource/AuthorizableResource.java
@@ -16,7 +16,6 @@
*/
package org.apache.sling.jackrabbit.usermanager.resource;
-
import java.util.Map;
import javax.jcr.RepositoryException;
@@ -29,91 +28,102 @@ import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ValueMap;
/**
- * Resource implementation for Authorizable
+ * Resource implementation for Authorizable
*/
public class AuthorizableResource extends SlingAdaptable implements Resource {
- private Authorizable authorizable = null;
- private ResourceResolver resourceResolver = null;
+ private Authorizable authorizable = null;
+
+ private ResourceResolver resourceResolver = null;
+
private final String path;
+
private final String resourceType;
+
private final ResourceMetadata metadata;
-
- public AuthorizableResource(Authorizable authorizable,
- ResourceResolver resourceResolver, String path) {
- super();
- this.resourceResolver = resourceResolver;
+ public AuthorizableResource(Authorizable authorizable,
+ ResourceResolver resourceResolver, String path) {
+ super();
+
+ this.resourceResolver = resourceResolver;
this.authorizable = authorizable;
this.path = path;
if (authorizable.isGroup()) {
- this.resourceType = "sling:group";
+ this.resourceType = "sling:group";
} else {
- this.resourceType = "sling:user";
+ this.resourceType = "sling:user";
}
this.metadata = new ResourceMetadata();
metadata.setResolutionPath(path);
- }
-
- /* (non-Javadoc)
- * @see org.apache.sling.api.resource.Resource#getPath()
- */
- public String getPath() {
- return path;
- }
-
- /* (non-Javadoc)
- * @see org.apache.sling.api.resource.Resource#getResourceMetadata()
- */
- public ResourceMetadata getResourceMetadata() {
- return metadata;
- }
-
- /* (non-Javadoc)
- * @see org.apache.sling.api.resource.Resource#getResourceResolver()
- */
- public ResourceResolver getResourceResolver() {
- return resourceResolver;
- }
-
- /* (non-Javadoc)
- * @see org.apache.sling.api.resource.Resource#getResourceSuperType()
- */
- public String getResourceSuperType() {
- return null;
- }
-
- /* (non-Javadoc)
- * @see org.apache.sling.api.resource.Resource#getResourceType()
- */
- public String getResourceType() {
- return resourceType;
- }
-
- /* (non-Javadoc)
- * @see org.apache.sling.api.adapter.Adaptable#adaptTo(java.lang.Class)
- */
- @SuppressWarnings("unchecked")
- public <AdapterType> AdapterType adaptTo(Class<AdapterType> type) {
- if (type == Map.class || type == ValueMap.class) {
- return (AdapterType) new AuthorizableValueMap(authorizable); // unchecked cast
- } else if (type == Authorizable.class) {
- return (AdapterType)authorizable;
- }
-
- return super.adaptTo(type);
- }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.apache.sling.api.resource.Resource#getPath()
+ */
+ public String getPath() {
+ return path;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.apache.sling.api.resource.Resource#getResourceMetadata()
+ */
+ public ResourceMetadata getResourceMetadata() {
+ return metadata;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.apache.sling.api.resource.Resource#getResourceResolver()
+ */
+ public ResourceResolver getResourceResolver() {
+ return resourceResolver;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.apache.sling.api.resource.Resource#getResourceSuperType()
+ */
+ public String getResourceSuperType() {
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.apache.sling.api.resource.Resource#getResourceType()
+ */
+ public String getResourceType() {
+ return resourceType;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.apache.sling.api.adapter.Adaptable#adaptTo(java.lang.Class)
+ */
+ @SuppressWarnings("unchecked")
+ public <AdapterType> AdapterType adaptTo(Class<AdapterType> type) {
+ if (type == Map.class || type == ValueMap.class) {
+ return (AdapterType) new AuthorizableValueMap(authorizable); // unchecked
+ // cast
+ } else if (type == Authorizable.class) {
+ return (AdapterType) authorizable;
+ }
+
+ return super.adaptTo(type);
+ }
public String toString() {
String id = null;
if (authorizable != null) {
try {
- id = authorizable.getID();
- } catch (RepositoryException e) {
- //ignore it.
- }
+ id = authorizable.getID();
+ } catch (RepositoryException e) {
+ // ignore it.
+ }
}
- return getClass().getSimpleName() + ", id=" + id
- + ", path=" + getPath();
+ return getClass().getSimpleName() + ", id=" + id + ", path="
+ + getPath();
}
}
diff --git a/src/main/java/org/apache/sling/jackrabbit/usermanager/resource/AuthorizableResourceProvider.java b/src/main/java/org/apache/sling/jackrabbit/usermanager/resource/AuthorizableResourceProvider.java
index af864b6..b1eeb13 100644
--- a/src/main/java/org/apache/sling/jackrabbit/usermanager/resource/AuthorizableResourceProvider.java
+++ b/src/main/java/org/apache/sling/jackrabbit/usermanager/resource/AuthorizableResourceProvider.java
@@ -44,177 +44,204 @@ import org.slf4j.LoggerFactory;
* @scr.component immediate="true" label="%authorizable.resourceprovider.name"
* description="authorizable.resourceprovider.description"
* @scr.property name="service.description"
- * value="Resource provider implementation for UserManager resources"
+ * value="Resource provider implementation for UserManager resources"
* @scr.property name="service.vendor" value="The Apache Software Foundation"
* @scr.property name="provider.roots" value="/system/userManager/"
* @scr.service interface="org.apache.sling.api.resource.ResourceProvider"
*/
public class AuthorizableResourceProvider implements ResourceProvider {
-
+
/**
* default log
*/
private final Logger log = LoggerFactory.getLogger(getClass());
- public static final String SYSTEM_USER_MANAGER_PATH = "/system/userManager";
+ public static final String SYSTEM_USER_MANAGER_PATH = "/system/userManager";
+
+ public static final String SYSTEM_USER_MANAGER_USER_PATH = SYSTEM_USER_MANAGER_PATH
+ + "/user";
+
+ public static final String SYSTEM_USER_MANAGER_GROUP_PATH = SYSTEM_USER_MANAGER_PATH
+ + "/group";
- public static final String SYSTEM_USER_MANAGER_USER_PATH = SYSTEM_USER_MANAGER_PATH + "/user";
- public static final String SYSTEM_USER_MANAGER_GROUP_PATH = SYSTEM_USER_MANAGER_PATH + "/group";
+ public static final String SYSTEM_USER_MANAGER_USER_PREFIX = SYSTEM_USER_MANAGER_USER_PATH
+ + "/";
- public static final String SYSTEM_USER_MANAGER_USER_PREFIX = SYSTEM_USER_MANAGER_USER_PATH + "/";
- public static final String SYSTEM_USER_MANAGER_GROUP_PREFIX = SYSTEM_USER_MANAGER_GROUP_PATH + "/";
+ public static final String SYSTEM_USER_MANAGER_GROUP_PREFIX = SYSTEM_USER_MANAGER_GROUP_PATH
+ + "/";
- /* (non-Javadoc)
- * @see org.apache.sling.api.resource.ResourceProvider#getResource(org.apache.sling.api.resource.ResourceResolver, javax.servlet.http.HttpServletRequest, java.lang.String)
- */
- public Resource getResource(ResourceResolver resourceResolver,
- HttpServletRequest request, String path) {
+ /*
+ * (non-Javadoc)
+ * @see
+ * org.apache.sling.api.resource.ResourceProvider#getResource(org.apache
+ * .sling.api.resource.ResourceResolver,
+ * javax.servlet.http.HttpServletRequest, java.lang.String)
+ */
+ public Resource getResource(ResourceResolver resourceResolver,
+ HttpServletRequest request, String path) {
return getResource(resourceResolver, path);
- }
-
-
- /* (non-Javadoc)
- * @see org.apache.sling.api.resource.ResourceProvider#getResource(org.apache.sling.api.resource.ResourceResolver, java.lang.String)
- */
- public Resource getResource(ResourceResolver resourceResolver, String path) {
-
- //handle resources for the virtual container resources
- if (path.equals(SYSTEM_USER_MANAGER_PATH)) {
- return new SyntheticResource(resourceResolver, path, "sling:userManager");
- } else if (path.equals(SYSTEM_USER_MANAGER_USER_PATH)) {
- return new SyntheticResource(resourceResolver, path, "sling:users");
- } else if (path.equals(SYSTEM_USER_MANAGER_GROUP_PATH)) {
- return new SyntheticResource(resourceResolver, path, "sling:groups");
- }
-
- // the principalId should be the first segment after the prefix
- String pid = null;
- if (path.startsWith(SYSTEM_USER_MANAGER_USER_PREFIX)) {
- pid = path.substring(SYSTEM_USER_MANAGER_USER_PREFIX.length());
- } else if (path.startsWith(SYSTEM_USER_MANAGER_GROUP_PREFIX)) {
- pid = path.substring(SYSTEM_USER_MANAGER_GROUP_PREFIX.length());
- }
-
- if (pid != null) {
- if (pid.indexOf('/') != -1) {
- return null; //something bogus on the end of the path so bail out now.
- }
- try {
- Session session = resourceResolver.adaptTo(Session.class);
- if (session != null) {
- UserManager userManager = AccessControlUtil.getUserManager(session);
- if (userManager != null) {
- Authorizable authorizable = userManager.getAuthorizable(pid);
- if (authorizable != null) {
- //found the Authorizable, so return the resource that wraps it.
- return new AuthorizableResource(authorizable, resourceResolver, path);
- }
- }
- }
- } catch (RepositoryException re) {
- throw new SlingException("Error looking up Authorizable for principal: " + pid, re);
- }
- }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * org.apache.sling.api.resource.ResourceProvider#getResource(org.apache
+ * .sling.api.resource.ResourceResolver, java.lang.String)
+ */
+ public Resource getResource(ResourceResolver resourceResolver, String path) {
+
+ // handle resources for the virtual container resources
+ if (path.equals(SYSTEM_USER_MANAGER_PATH)) {
+ return new SyntheticResource(resourceResolver, path,
+ "sling:userManager");
+ } else if (path.equals(SYSTEM_USER_MANAGER_USER_PATH)) {
+ return new SyntheticResource(resourceResolver, path, "sling:users");
+ } else if (path.equals(SYSTEM_USER_MANAGER_GROUP_PATH)) {
+ return new SyntheticResource(resourceResolver, path, "sling:groups");
+ }
+
+ // the principalId should be the first segment after the prefix
+ String pid = null;
+ if (path.startsWith(SYSTEM_USER_MANAGER_USER_PREFIX)) {
+ pid = path.substring(SYSTEM_USER_MANAGER_USER_PREFIX.length());
+ } else if (path.startsWith(SYSTEM_USER_MANAGER_GROUP_PREFIX)) {
+ pid = path.substring(SYSTEM_USER_MANAGER_GROUP_PREFIX.length());
+ }
+
+ if (pid != null) {
+ if (pid.indexOf('/') != -1) {
+ return null; // something bogus on the end of the path so bail
+ // out now.
+ }
+ try {
+ Session session = resourceResolver.adaptTo(Session.class);
+ if (session != null) {
+ UserManager userManager = AccessControlUtil.getUserManager(session);
+ if (userManager != null) {
+ Authorizable authorizable = userManager.getAuthorizable(pid);
+ if (authorizable != null) {
+ // found the Authorizable, so return the resource
+ // that wraps it.
+ return new AuthorizableResource(authorizable,
+ resourceResolver, path);
+ }
+ }
+ }
+ } catch (RepositoryException re) {
+ throw new SlingException(
+ "Error looking up Authorizable for principal: " + pid, re);
+ }
+ }
return null;
- }
-
-
- /* (non-Javadoc)
- * @see org.apache.sling.api.resource.ResourceProvider#listChildren(org.apache.sling.api.resource.Resource)
- */
- public Iterator<Resource> listChildren(Resource parent) {
- if (parent == null) {
- throw new NullPointerException("parent is null");
- }
- try {
- String path = parent.getPath();
- ResourceResolver resourceResolver = parent.getResourceResolver();
-
- //handle children of /system/userManager
- if (SYSTEM_USER_MANAGER_PATH.equals(path)) {
- List<Resource> resources = new ArrayList<Resource>();
- if (resourceResolver != null) {
- resources.add(getResource(resourceResolver, SYSTEM_USER_MANAGER_USER_PATH));
- resources.add(getResource(resourceResolver, SYSTEM_USER_MANAGER_GROUP_PATH));
- }
- return resources.iterator();
- }
-
- int searchType = -1;
- if (SYSTEM_USER_MANAGER_USER_PATH.equals(path)) {
- searchType = PrincipalManager.SEARCH_TYPE_NOT_GROUP;
- } else if (SYSTEM_USER_MANAGER_GROUP_PATH.equals(path)) {
- searchType = PrincipalManager.SEARCH_TYPE_GROUP;
- }
- if (searchType != -1) {
- PrincipalIterator principals = null;
-
- //TODO: this actually does not work correctly since the jackrabbit findPrincipals API
- // currently does an exact match of the search filter so it won't match a wildcard
- Session session = resourceResolver.adaptTo(Session.class);
- if (session != null) {
- PrincipalManager principalManager = AccessControlUtil.getPrincipalManager(session);
- principals = principalManager.findPrincipals(".*", PrincipalManager.SEARCH_TYPE_NOT_GROUP);
- }
-
-
- if (principals != null) {
- return new ChildrenIterator(parent, principals);
- }
- }
- } catch (RepositoryException re) {
- throw new SlingException("Error listing children of resource: " + parent.getPath(), re);
- }
-
- return null;
- }
-
-
-
- private final class ChildrenIterator implements Iterator<Resource> {
- private PrincipalIterator principals;
- private Resource parent;
-
- public ChildrenIterator(Resource parent, PrincipalIterator principals) {
- this.parent = parent;
- this.principals = principals;
- }
-
- public boolean hasNext() {
- return principals.hasNext();
- }
-
- public Resource next() {
- Principal nextPrincipal = principals.nextPrincipal();
- try {
- ResourceResolver resourceResolver = parent.getResourceResolver();
- if (resourceResolver != null) {
- Session session = resourceResolver.adaptTo(Session.class);
- if (session != null) {
- UserManager userManager = AccessControlUtil.getUserManager(session);
- if (userManager != null) {
- Authorizable authorizable = userManager.getAuthorizable(nextPrincipal.getName());
- if (authorizable != null) {
- String path;
- if (authorizable.isGroup()) {
- path = SYSTEM_USER_MANAGER_GROUP_PREFIX + nextPrincipal.getName();
- } else {
- path = SYSTEM_USER_MANAGER_USER_PREFIX + nextPrincipal.getName();
- }
- return new AuthorizableResource(authorizable, resourceResolver, path);
- }
- }
- }
- }
- } catch (RepositoryException re) {
- log.error("Exception while looking up authorizable resource.", re);
- }
- return null;
- }
-
- public void remove() {
- throw new UnsupportedOperationException();
- }
- }
-
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * org.apache.sling.api.resource.ResourceProvider#listChildren(org.apache
+ * .sling.api.resource.Resource)
+ */
+ public Iterator<Resource> listChildren(Resource parent) {
+ if (parent == null) {
+ throw new NullPointerException("parent is null");
+ }
+ try {
+ String path = parent.getPath();
+ ResourceResolver resourceResolver = parent.getResourceResolver();
+
+ // handle children of /system/userManager
+ if (SYSTEM_USER_MANAGER_PATH.equals(path)) {
+ List<Resource> resources = new ArrayList<Resource>();
+ if (resourceResolver != null) {
+ resources.add(getResource(resourceResolver,
+ SYSTEM_USER_MANAGER_USER_PATH));
+ resources.add(getResource(resourceResolver,
+ SYSTEM_USER_MANAGER_GROUP_PATH));
+ }
+ return resources.iterator();
+ }
+
+ int searchType = -1;
+ if (SYSTEM_USER_MANAGER_USER_PATH.equals(path)) {
+ searchType = PrincipalManager.SEARCH_TYPE_NOT_GROUP;
+ } else if (SYSTEM_USER_MANAGER_GROUP_PATH.equals(path)) {
+ searchType = PrincipalManager.SEARCH_TYPE_GROUP;
+ }
+ if (searchType != -1) {
+ PrincipalIterator principals = null;
+
+ // TODO: this actually does not work correctly since the
+ // jackrabbit findPrincipals API
+ // currently does an exact match of the search filter so it
+ // won't match a wildcard
+ Session session = resourceResolver.adaptTo(Session.class);
+ if (session != null) {
+ PrincipalManager principalManager = AccessControlUtil.getPrincipalManager(session);
+ principals = principalManager.findPrincipals(".*",
+ PrincipalManager.SEARCH_TYPE_NOT_GROUP);
+ }
+
+ if (principals != null) {
+ return new ChildrenIterator(parent, principals);
+ }
+ }
+ } catch (RepositoryException re) {
+ throw new SlingException("Error listing children of resource: "
+ + parent.getPath(), re);
+ }
+
+ return null;
+ }
+
+ private final class ChildrenIterator implements Iterator<Resource> {
+ private PrincipalIterator principals;
+
+ private Resource parent;
+
+ public ChildrenIterator(Resource parent, PrincipalIterator principals) {
+ this.parent = parent;
+ this.principals = principals;
+ }
+
+ public boolean hasNext() {
+ return principals.hasNext();
+ }
+
+ public Resource next() {
+ Principal nextPrincipal = principals.nextPrincipal();
+ try {
+ ResourceResolver resourceResolver = parent.getResourceResolver();
+ if (resourceResolver != null) {
+ Session session = resourceResolver.adaptTo(Session.class);
+ if (session != null) {
+ UserManager userManager = AccessControlUtil.getUserManager(session);
+ if (userManager != null) {
+ Authorizable authorizable = userManager.getAuthorizable(nextPrincipal.getName());
+ if (authorizable != null) {
+ String path;
+ if (authorizable.isGroup()) {
+ path = SYSTEM_USER_MANAGER_GROUP_PREFIX
+ + nextPrincipal.getName();
+ } else {
+ path = SYSTEM_USER_MANAGER_USER_PREFIX
+ + nextPrincipal.getName();
+ }
+ return new AuthorizableResource(authorizable,
+ resourceResolver, path);
+ }
+ }
+ }
+ }
+ } catch (RepositoryException re) {
+ log.error("Exception while looking up authorizable resource.",
+ re);
+ }
+ return null;
+ }
+
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+ }
+
}
diff --git a/src/main/java/org/apache/sling/jackrabbit/usermanager/resource/AuthorizableValueMap.java b/src/main/java/org/apache/sling/jackrabbit/usermanager/resource/AuthorizableValueMap.java
index 3dafa19..88c7c1c 100644
--- a/src/main/java/org/apache/sling/jackrabbit/usermanager/resource/AuthorizableValueMap.java
+++ b/src/main/java/org/apache/sling/jackrabbit/usermanager/resource/AuthorizableValueMap.java
@@ -45,10 +45,15 @@ import org.slf4j.LoggerFactory;
*/
public class AuthorizableValueMap implements ValueMap {
private Logger logger = LoggerFactory.getLogger(AuthorizableValueMap.class);
- private Set<String> hiddenProperties = new HashSet<String>(Arrays.asList(new String[]{"rep:password", "jcr:uuid"}));
- private boolean fullyRead;
+
+ private Set<String> hiddenProperties = new HashSet<String>(
+ Arrays.asList(new String[] { "rep:password", "jcr:uuid" }));
+
+ private boolean fullyRead;
+
private final Map<String, Object> cache;
- private Authorizable authorizable;
+
+ private Authorizable authorizable;
public AuthorizableValueMap(Authorizable authorizable) {
this.authorizable = authorizable;
@@ -56,17 +61,17 @@ public class AuthorizableValueMap implements ValueMap {
this.fullyRead = false;
}
- @SuppressWarnings("unchecked")
- public <T> T get(String name, Class<T> type) {
+ @SuppressWarnings("unchecked")
+ public <T> T get(String name, Class<T> type) {
if (type == null) {
return (T) get(name);
}
return convertToType(name, type);
- }
+ }
- @SuppressWarnings("unchecked")
- public <T> T get(String name, T defaultValue) {
+ @SuppressWarnings("unchecked")
+ public <T> T get(String name, T defaultValue) {
if (defaultValue == null) {
return (T) get(name);
}
@@ -81,51 +86,50 @@ public class AuthorizableValueMap implements ValueMap {
}
return value;
- }
+ }
- public boolean containsKey(Object key) {
+ public boolean containsKey(Object key) {
return get(key) != null;
- }
+ }
- public boolean containsValue(Object value) {
+ public boolean containsValue(Object value) {
readFully();
return cache.containsValue(value);
- }
+ }
- public Set<java.util.Map.Entry<String, Object>> entrySet() {
+ public Set<java.util.Map.Entry<String, Object>> entrySet() {
readFully();
return cache.entrySet();
- }
+ }
- public Object get(Object key) {
+ public Object get(Object key) {
Object value = cache.get(key);
if (value == null) {
value = read((String) key);
}
return value;
- }
-
+ }
- public Set<String> keySet() {
+ public Set<String> keySet() {
readFully();
return cache.keySet();
- }
+ }
- public int size() {
+ public int size() {
readFully();
return cache.size();
- }
+ }
- public boolean isEmpty() {
+ public boolean isEmpty() {
return size() == 0;
- }
+ }
- public Collection<Object> values() {
+ public Collection<Object> values() {
readFully();
return cache.values();
- }
-
+ }
+
protected Object read(String key) {
// if the item has been completely read, we need not check
@@ -135,14 +139,14 @@ public class AuthorizableValueMap implements ValueMap {
}
if (hiddenProperties.contains(key)) {
- return null;
+ return null;
}
-
+
try {
if (authorizable.hasProperty(key)) {
Value[] property = authorizable.getProperty(key);
Object value = valuesToJavaObject(property);
- cache.put(key, value);
+ cache.put(key, value);
return value;
}
} catch (RepositoryException re) {
@@ -152,37 +156,38 @@ public class AuthorizableValueMap implements ValueMap {
// property not found or some error accessing it
return null;
}
-
- protected Object valuesToJavaObject(Value [] values) throws RepositoryException {
+
+ protected Object valuesToJavaObject(Value[] values)
+ throws RepositoryException {
if (values == null) {
- return null;
+ return null;
} else if (values.length == 1) {
- return JcrResourceUtil.toJavaObject(values[0]);
+ return JcrResourceUtil.toJavaObject(values[0]);
} else {
- Object [] valuesObjs = new Object[values.length];
- for (int i=0; i < values.length; i++) {
- valuesObjs[i] = JcrResourceUtil.toJavaObject(values[i]);
- }
- return valuesObjs;
+ Object[] valuesObjs = new Object[values.length];
+ for (int i = 0; i < values.length; i++) {
+ valuesObjs[i] = JcrResourceUtil.toJavaObject(values[i]);
+ }
+ return valuesObjs;
}
}
-
+
@SuppressWarnings("unchecked")
- protected void readFully() {
+ protected void readFully() {
if (!fullyRead) {
try {
Iterator pi = authorizable.getPropertyNames();
while (pi.hasNext()) {
- String key = (String)pi.next();
+ String key = (String) pi.next();
if (hiddenProperties.contains(key)) {
- continue; //skip it.
+ continue; // skip it.
}
if (!cache.containsKey(key)) {
- Value[] property = authorizable.getProperty(key);
- Object value = valuesToJavaObject(property);
- cache.put(key, value);
+ Value[] property = authorizable.getProperty(key);
+ Object value = valuesToJavaObject(property);
+ cache.put(key, value);
}
}
fullyRead = true;
@@ -191,24 +196,25 @@ public class AuthorizableValueMap implements ValueMap {
}
}
}
-
+
// ---------- Unsupported Modification methods
-
- public Object remove(Object arg0) {
+
+ public Object remove(Object arg0) {
throw new UnsupportedOperationException();
- }
- public void clear() {
+ }
+
+ public void clear() {
throw new UnsupportedOperationException();
- }
- public Object put(String arg0, Object arg1) {
+ }
+
+ public Object put(String arg0, Object arg1) {
throw new UnsupportedOperationException();
- }
+ }
- public void putAll(Map<? extends String, ? extends Object> arg0) {
+ public void putAll(Map<? extends String, ? extends Object> arg0) {
throw new UnsupportedOperationException();
- }
-
-
+ }
+
// ---------- Implementation helper
@SuppressWarnings("unchecked")
@@ -220,9 +226,9 @@ public class AuthorizableValueMap implements ValueMap {
Value[] values = authorizable.getProperty(name);
if (values == null) {
- return null;
+ return null;
}
-
+
boolean multiValue = values.length > 1;
boolean array = type.isArray();
@@ -236,8 +242,8 @@ public class AuthorizableValueMap implements ValueMap {
} else {
Value value = values[0];
if (array) {
- result = (T) convertToArray(
- new Value[] { value }, type.getComponentType());
+ result = (T) convertToArray(new Value[] { value },
+ type.getComponentType());
} else {
result = convertToType(-1, value, type);
}
@@ -254,26 +260,26 @@ public class AuthorizableValueMap implements ValueMap {
// fall back to nothing
return result;
}
-
+
private <T> T[] convertToArray(Value[] jcrValues, Class<T> type)
- throws ValueFormatException, RepositoryException {
- List<T> values = new ArrayList<T>();
- for (int i = 0; i < jcrValues.length; i++) {
- T value = convertToType(i, jcrValues[i], type);
- if (value != null) {
- values.add(value);
- }
- }
-
- @SuppressWarnings("unchecked")
- T[] result = (T[]) Array.newInstance(type, values.size());
-
- return values.toArray(result);
+ throws ValueFormatException, RepositoryException {
+ List<T> values = new ArrayList<T>();
+ for (int i = 0; i < jcrValues.length; i++) {
+ T value = convertToType(i, jcrValues[i], type);
+ if (value != null) {
+ values.add(value);
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ T[] result = (T[]) Array.newInstance(type, values.size());
+
+ return values.toArray(result);
}
-
+
@SuppressWarnings("unchecked")
- private <T> T convertToType(int index, Value jcrValue,
- Class<T> type) throws ValueFormatException, RepositoryException {
+ private <T> T convertToType(int index, Value jcrValue, Class<T> type)
+ throws ValueFormatException, RepositoryException {
if (String.class == type) {
return (T) jcrValue.getString();
@@ -302,7 +308,7 @@ public class AuthorizableValueMap implements ValueMap {
// fallback in case of unsupported type
return null;
}
-
+
private Class<?> normalizeClass(Class<?> type) {
if (Calendar.class.isAssignableFrom(type)) {
type = Calendar.class;
@@ -315,5 +321,5 @@ public class AuthorizableValueMap implements ValueMap {
}
return type;
}
-
+
}
\ No newline at end of file
--
To stop receiving notification emails like this one, please contact
"commits@sling.apache.org" <co...@sling.apache.org>.