package org.argeo.slc.client.ui.dist.model;
+import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.query.Query;
import org.argeo.ArgeoException;
+import org.argeo.jcr.JcrUtils;
import org.argeo.slc.jcr.SlcNames;
import org.argeo.slc.jcr.SlcTypes;
public class WorkspaceElem extends DistParentElem {
private final RepoElem repoElem;
private String workspaceName;
- private Session defaultSession;
+ private Session currSession;
public WorkspaceElem(WkspGroupElem parent, RepoElem repoElem,
String workspaceName) {
}
public Boolean isConnected() {
- if (defaultSession != null && defaultSession.isLive())
+ if (currSession != null && currSession.isLive())
return true;
else
return false;
}
public void login() {
- defaultSession = repoElem.repositoryLogin(getName());
+ 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() {
try {
if (isConnected())
- return defaultSession.getRootNode().hasNodes();
+ return currSession.getRootNode().hasNodes();
else
- return false;
+ return true;
} catch (RepositoryException re) {
throw new ArgeoException(
"Unexpected error while checking children node existence",
} else {
// initialize current object
try {
- if (defaultSession == null)
- return null;
- else {
- Query groupQuery = defaultSession
- .getWorkspace()
- .getQueryManager()
- .createQuery(
- "select * from [" + SlcTypes.SLC_GROUP_BASE
- + "] as group order by group.["
- + SlcNames.SLC_GROUP_BASE_ID + "]",
- Query.JCR_SQL2);
- NodeIterator groups = groupQuery.execute().getNodes();
- while (groups.hasNext()) {
- addChild(new GroupBaseElem(WorkspaceElem.this, groups
- .nextNode()
- .getProperty(SlcNames.SLC_GROUP_BASE_ID)
- .getString()));
+ // Lazy connect the first time we retrieve children
+ if (currSession == null)
+ login();
+
+ // Retrieve already existing distribution
+ Query groupQuery = currSession
+ .getWorkspace()
+ .getQueryManager()
+ .createQuery(
+ "select * from ["
+ + SlcTypes.SLC_MODULAR_DISTRIBUTION
+ + "]", Query.JCR_SQL2);
+ NodeIterator distributions = groupQuery.execute().getNodes();
+ distribs: while (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 (ModularDistBaseElem.AETHER_BINARIES_TYPE
+ .equals(artifactId)) {
+ name = groupId;
+ type = ModularDistBaseElem.AETHER_BINARIES_TYPE;
+ } else {
+ name = artifactId;
+ type = ModularDistBaseElem.AETHER_DEP_TYPE;
}
+ if (getChildByName(name) == null)
+ addChild(new ModularDistBaseElem(WorkspaceElem.this,
+ name, distBase, type));
+ }
+ // Add empty group base that have been marked as relevant
+ groupQuery = currSession
+ .getWorkspace()
+ .getQueryManager()
+ .createQuery(
+ "select * from ["
+ + SlcTypes.SLC_RELEVANT_CATEGORY + "]",
+ Query.JCR_SQL2);
+ distributions = groupQuery.execute().getNodes();
+ while (distributions.hasNext()) {
+ Node distBase = distributions.nextNode();
+ String groupBaseId = distBase.getProperty(
+ SlcNames.SLC_GROUP_BASE_ID).getString();
+ if (getChildByName(groupBaseId) == null)
+ addChild(new ModularDistBaseElem(WorkspaceElem.this,
+ groupBaseId, distBase,
+ ModularDistBaseElem.AETHER_CATEGORY_BASE));
}
return super.getChildren();
} catch (RepositoryException e) {
}
}
}
+
+ @Override
+ public synchronized void dispose() {
+ JcrUtils.logoutQuietly(currSession);
+ super.dispose();
+ }
}