package models; import java.util.Iterator; import java.util.Set; import javax.jcr.AccessDeniedException; import javax.jcr.PathNotFoundException; import javax.jcr.RepositoryException; import javax.jcr.Session; import javax.jcr.UnsupportedRepositoryOperationException; import org.apache.jackrabbit.api.JackrabbitSession; import org.apache.jackrabbit.api.security.user.Authorizable; import org.apache.jackrabbit.api.security.user.AuthorizableExistsException; import org.apache.jackrabbit.api.security.user.Group; import org.apache.jackrabbit.api.security.user.UserManager; import com.google.common.collect.ImmutableSet; public class GroupManager { public static final String FLAG_NAME = "managedGroup"; public final JackrabbitSession session; public GroupManager(Session session) { this.session = (JackrabbitSession) session; } public Group create(String groupName) throws AuthorizableExistsException { Group group; try { group = session.getUserManager().createGroup(groupName); group.setProperty(FLAG_NAME, session.getValueFactory().createValue("")); } catch (AuthorizableExistsException e) { throw e; } catch (RepositoryException e) { throw new RuntimeException(e); } return group; } public Set<Group> list() { ImmutableSet.Builder<Group> set = ImmutableSet.<Group>builder(); try { for (Iterator<Authorizable> iter = fetchGroups(); iter.hasNext();) { Authorizable authorizable = iter.next(); if (authorizable instanceof Group) { set.add((Group) authorizable); } } } catch (RepositoryException e) { throw new RuntimeException(e); } return set.build(); } /** * Get groups to which this authorizable ID belongs. Most often used to find * groups for a particular user. * * @param memberId * @return Set of Groups */ public Set<Group> memberships(String memberId) { ImmutableSet.Builder<Group> set = ImmutableSet.<Group>builder(); try { Authorizable a = session.getUserManager().getAuthorizable(memberId); Iterator<Group> iter = a.declaredMemberOf(); while (iter.hasNext()) { set.add(iter.next()); } } catch (RepositoryException e) { throw new RuntimeException(e); } return set.build(); } public Group find(String groupName) throws PathNotFoundException { Group group; try { Authorizable a = session.getUserManager().getAuthorizable(groupName); if (a == null) throw new PathNotFoundException("Group does not exist."); if (!(a instanceof Group)) { throw new PathNotFoundException(groupName+" is not a group!"); } if (a.getProperty(FLAG_NAME) == null) { throw new PathNotFoundException(groupName+" is not a managed group."); } group = (Group) a; } catch (PathNotFoundException e) { throw e; } catch (RepositoryException e) { throw new RuntimeException(e); } return group; } public void delete(String groupName) throws PathNotFoundException { Group group = find(groupName); try { group.remove(); } catch (RepositoryException e) { throw new RuntimeException(e); } } public void addMember(String groupName, String memberId) throws PathNotFoundException { Group group = find(groupName); try { Authorizable a = session.getUserManager().getAuthorizable(memberId); if (a == null) throw new PathNotFoundException("User/Group does not exist."); group.addMember(a); } catch (PathNotFoundException e) { throw e; } catch (RepositoryException e) { throw new RuntimeException(e); } } public void removeMember(String groupName, String memberId) throws PathNotFoundException { Group group = find(groupName); try { Authorizable a = session.getUserManager().getAuthorizable(memberId); if (a == null) throw new PathNotFoundException("User/Group does not exist."); group.removeMember(a); } catch (PathNotFoundException e) { throw e; } catch (RepositoryException e) { throw new RuntimeException(e); } } protected Iterator<Authorizable> fetchGroups() throws AccessDeniedException, UnsupportedRepositoryOperationException, RepositoryException { return session.getUserManager().findAuthorizables( FLAG_NAME, "", UserManager.SEARCH_TYPE_GROUP); } }