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.ArgeoException;
import org.argeo.jcr.JcrUtils;
-import org.argeo.slc.SlcException;
/**
* Abstract set of similar workspaces, that is a bunch of workspaces with same
* prefix.
*/
public class WkspGroupElem extends DistParentElem {
- private RepoElem repoElem;
- private String name;
- public WkspGroupElem(RepoElem repoElem, String prefix) {
- super(repoElem.inHome(), repoElem.isReadOnly());
- this.repoElem = repoElem;
- this.name = prefix;
- }
+ private Session defaultSession;
- public Object[] getChildren() {
- Session session = null;
+ public WkspGroupElem(RepoElem repoElem, String prefix) {
+ super(prefix, repoElem.inHome(), repoElem.isReadOnly());
+ setParent(repoElem);
+ // Directly adds children upon creation
try {
- Repository repository = repoElem.getRepository();
- session = repository.login(repoElem.getCredentials());
-
- String[] workspaceNames = session.getWorkspace()
+ defaultSession = repoElem.repositoryLogin(null);
+ String[] wkpNames = defaultSession.getWorkspace()
.getAccessibleWorkspaceNames();
- List<WorkspaceElem> distributionElems = new ArrayList<WorkspaceElem>();
- 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.lastIndexOf(VERSION_SEP)).equals(
- name)) {
- distributionElems.add(new WorkspaceElem(repoElem,
- workspaceName));
- }
+ for (String wkpName : wkpNames) {
+ if (prefix.equals(getPrefix(wkpName))
+ // if (wkpName.startsWith(prefix)
+ && repoElem.isWorkspaceVisible(wkpName))
+ addChild(new WorkspaceElem(WkspGroupElem.this, repoElem,
+ wkpName));
}
- return distributionElems.toArray();
} catch (RepositoryException e) {
- throw new SlcException("Cannot list workspaces for prefix " + name,
- e);
- } finally {
- JcrUtils.logoutQuietly(session);
+ throw new ArgeoException("Cannot retrieve workspace names", e);
}
}
- public String getLabel() {
- return name;
- }
-
- public String toString() {
- return getLabel();
+ // FIXME - we rely on a "hard coded" convention : Workspace name must have
+ // this format: name-major.minor
+ // We might expose this method as static public, to be used among others by
+ // the RepoElem parent objects when building its children
+ private String getPrefix(String workspaceName) {
+ if (workspaceName.lastIndexOf(VERSION_SEP) > 0)
+ return workspaceName.substring(0,
+ workspaceName.lastIndexOf(VERSION_SEP));
+ else
+ return workspaceName;
}
public void dispose() {
- }
-
- public RepoElem getRepoElem() {
- return repoElem;
+ JcrUtils.logoutQuietly(defaultSession);
+ super.dispose();
}
}
\ No newline at end of file