]> 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/WorkspaceElem.java
work on remote Repo issues.
[gpl/argeo-slc.git] / plugins / org.argeo.slc.client.ui.dist / src / main / java / org / argeo / slc / client / ui / dist / model / WorkspaceElem.java
index f5fb3722ea7c48fe1d1456a402f8309857f64206..3be73b5e568fc6ee9f78d87c75e8e7c1dee630a5 100644 (file)
@@ -1,25 +1,32 @@
 package org.argeo.slc.client.ui.dist.model;
 
-/** Abstracts a workspace that contains a given distribution */
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.query.InvalidQueryException;
+import javax.jcr.query.QueryManager;
+import javax.jcr.query.qom.QueryObjectModel;
+import javax.jcr.query.qom.QueryObjectModelFactory;
+import javax.jcr.query.qom.Selector;
+
+import org.argeo.ArgeoException;
+import org.argeo.jcr.JcrUtils;
+import org.argeo.slc.jcr.SlcNames;
+import org.argeo.slc.jcr.SlcTypes;
+
+/** Abstract a workspace that contains a software distribution */
 public class WorkspaceElem extends DistParentElem {
        private final RepoElem repoElem;
        private String workspaceName;
-       private String label;
-
-       /**
-        * Helper to display only version when the workspace name is well formatted
-        */
-       private static String formatName(String name) {
-               if (name != null && name.lastIndexOf(VERSION_SEP) > 0)
-                       return name.substring(name.lastIndexOf(VERSION_SEP) + 1);
-               else
-                       return name;
-       }
+       private Session currSession;
 
-       public WorkspaceElem(RepoElem repoElem, String workspaceName) {
+       public WorkspaceElem(WkspGroupElem parent, RepoElem repoElem,
+                       String workspaceName) {
+               super(workspaceName, repoElem.inHome(), repoElem.isReadOnly());
                this.repoElem = repoElem;
                this.workspaceName = workspaceName;
-               this.label = formatName(workspaceName);
+               setParent(parent);
        }
 
        public String getWorkspaceName() {
@@ -30,20 +37,119 @@ public class WorkspaceElem extends DistParentElem {
                return repoElem;
        }
 
-       public boolean isReadOnly() {
-               return repoElem.isReadOnly();
+       public Boolean isConnected() {
+               if (currSession != null && currSession.isLive())
+                       return true;
+               else
+                       return false;
+       }
+
+       public void login() {
+               currSession = repoElem.repositoryLogin(getName());
+       }
+
+       /** Utility to create a new Session with correct credential in this context */
+       public Session getNewSession() {
+               return repoElem.repositoryLogin(getName());
        }
 
        public boolean hasChildren() {
-               return false;
+               try {
+                       if (isConnected())
+                               return currSession.getRootNode().hasNodes();
+                       else
+                               return true;
+               } catch (RepositoryException re) {
+                       throw new ArgeoException(
+                                       "Unexpected error while checking children node existence",
+                                       re);
+               }
        }
 
-       public Object[] getChildren() {
-               return null;
+       /** Override normal behaviour to initialize display of the workspace */
+       @Override
+       public synchronized Object[] getChildren() {
+               if (isLoaded()) {
+                       return super.getChildren();
+               } else {
+                       // initialize current object
+                       try {
+                               // Lazy connect the first time we retrieve children
+                               if (currSession == null)
+                                       login();
+
+                               // Retrieve already existing distribution
+
+                               // Use QOM rather than SQL2 - it seems more robust for remoting
+                               // with JCR 2.2 (might also be some model refresh issue with the
+                               // remoting)
+                               QueryManager queryManager = currSession.getWorkspace()
+                                               .getQueryManager();
+                               QueryObjectModelFactory factory = queryManager.getQOMFactory();
+                               Selector selector = factory.selector(
+                                               SlcTypes.SLC_MODULAR_DISTRIBUTION,
+                                               SlcTypes.SLC_MODULAR_DISTRIBUTION);
+                               // Curiously this works...
+                               // Selector selector = factory.selector(
+                               // SlcTypes.SLC_JAR_FILE,
+                               // SlcTypes.SLC_JAR_FILE);
+
+                               QueryObjectModel query = factory.createQuery(selector, null,
+                                               null, null);
+
+                               // Query groupQuery = currSession
+                               // .getWorkspace()
+                               // .getQueryManager()
+                               // .createQuery(
+                               // "select * from ["
+                               // + SlcTypes.SLC_MODULAR_DISTRIBUTION
+                               // + "]", Query.JCR_SQL2);
+                               NodeIterator distributions = null;
+                               try {
+                                       distributions = query.execute().getNodes();
+                               } catch (InvalidQueryException iqe) {
+                                       // For legacy only does not throw an exception while
+                                       // browsing
+                                       // legacy repositories that does not know
+                                       // SLC_MODULAR_DISTRIBUTION type
+                               }
+                               distribs: while (distributions != null
+                                               && distributions.hasNext()) {
+                                       Node currDist = distributions.nextNode();
+                                       Node distBase = currDist.getParent().getParent();
+                                       if (!distBase.isNodeType(SlcTypes.SLC_ARTIFACT_BASE))
+                                               continue distribs;
+                                       String groupId = distBase
+                                                       .getProperty(SlcNames.SLC_GROUP_ID).getString();
+                                       String artifactId = distBase.getProperty(
+                                                       SlcNames.SLC_ARTIFACT_ID).getString();
+
+                                       String name;
+                                       String type;
+                                       if (ModularDistVersionBaseElem.AETHER_BINARIES_TYPE
+                                                       .equals(artifactId)) {
+                                               name = groupId;
+                                               type = ModularDistVersionBaseElem.AETHER_BINARIES_TYPE;
+                                       } else {
+                                               name = artifactId;
+                                               type = ModularDistVersionBaseElem.AETHER_DEP_TYPE;
+                                       }
+                                       if (getChildByName(name) == null)
+                                               addChild(new ModularDistVersionBaseElem(
+                                                               WorkspaceElem.this, name, distBase, type));
+                               }
+                               return super.getChildren();
+                       } catch (RepositoryException e) {
+                               throw new ArgeoException(
+                                               "Cannot initialize WorkspaceNode UI object."
+                                                               + getName(), e);
+                       }
+               }
        }
 
        @Override
-       public String getLabel() {
-               return label;
+       public synchronized void dispose() {
+               JcrUtils.logoutQuietly(currSession);
+               super.dispose();
        }
-}
+}
\ No newline at end of file