X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=plugins%2Forg.argeo.slc.client.ui.dist%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fclient%2Fui%2Fdist%2Fmodel%2FWorkspaceElem.java;h=3be73b5e568fc6ee9f78d87c75e8e7c1dee630a5;hb=d19e5160d9bdc6ee3eea8eee0fd13fc126bd339f;hp=f5fb3722ea7c48fe1d1456a402f8309857f64206;hpb=dad892d8383b3d5ade11cbda5ee7b41354165076;p=gpl%2Fargeo-slc.git diff --git a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/model/WorkspaceElem.java b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/model/WorkspaceElem.java index f5fb3722e..3be73b5e5 100644 --- a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/model/WorkspaceElem.java +++ b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/model/WorkspaceElem.java @@ -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