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 <[email protected]> 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 "[email protected]" <[email protected]>.
