package org.argeo.slc.client.ui.dist.model; import java.security.AccessControlException; import java.util.ArrayList; import java.util.List; import javax.jcr.Repository; import javax.jcr.RepositoryException; import javax.jcr.Session; import org.argeo.jcr.JcrUtils; import org.argeo.slc.SlcException; /** * Abstracts a group of distribution, that is a bunch of workspaces with same * prefix. */ public class GroupElem extends DistParentElem { private RepoElem repoElem; private String name; public GroupElem(RepoElem repoElem, String prefix) { super(repoElem.inHome(), repoElem.isReadOnly()); this.repoElem = repoElem; this.name = prefix; } public Object[] getChildren() { Session session = null; try { Repository repository = repoElem.getRepository(); session = repository.login(repoElem.getCredentials()); String[] workspaceNames = session.getWorkspace() .getAccessibleWorkspaceNames(); List distributionElems = new ArrayList(); buildWksp: for (String workspaceName : workspaceNames) { // Filter non-public workspaces for user anonymous. if (repoElem.getRepoNode() == null) { Session tmpSession = null; try { tmpSession = repository.login(workspaceName); Boolean res = true; try { tmpSession.checkPermission("/", "read"); } catch (AccessControlException e) { res = false; } if (!res) continue buildWksp; } catch (RepositoryException e) { throw new SlcException( "Cannot list workspaces for anonymous user", e); } finally { JcrUtils.logoutQuietly(tmpSession); } } // filter technical workspaces if (workspaceName.startsWith(name) && workspaceName.substring(0, workspaceName.indexOf("-")).equals(name)) { distributionElems.add(new WorkspaceElem(repoElem, workspaceName)); } } return distributionElems.toArray(); } catch (RepositoryException e) { throw new SlcException("Cannot list workspaces for prefix " + name, e); } finally { JcrUtils.logoutQuietly(session); } } public String getLabel() { return name; } public String toString() { return getLabel(); } public void dispose() { } public RepoElem getRepoElem() { return repoElem; } }