]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/model/WkspGroupElem.java
Fix licence management
[gpl/argeo-slc.git] / plugins / org.argeo.slc.client.ui.dist / src / main / java / org / argeo / slc / client / ui / dist / model / WkspGroupElem.java
index 685a8e053c27cb81f405e8ec5ec8b0746e5edc52..66434d71a81a378b2c8236dfeffbe5442917d049 100644 (file)
@@ -1,92 +1,53 @@
 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