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%2FRepoElem.java;h=6d07d1c672725063c1a49aae3ea313576b8d3d0a;hb=62dbc7d3c1627eb63d1325ff861ae93433de2eee;hp=75de44e773820f28a62466737e4b3a0f485a013f;hpb=4216976fae84a1b9a7a7c83111b9dd95c7825cf9;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/RepoElem.java b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/model/RepoElem.java index 75de44e77..6d07d1c67 100644 --- a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/model/RepoElem.java +++ b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/model/RepoElem.java @@ -1,5 +1,6 @@ package org.argeo.slc.client.ui.dist.model; +import java.security.AccessControlException; import java.util.HashMap; import java.util.Map; @@ -12,70 +13,91 @@ import javax.jcr.RepositoryFactory; import javax.jcr.Session; import javax.jcr.nodetype.NodeType; +import org.argeo.jcr.ArgeoJcrUtils; +import org.argeo.jcr.ArgeoNames; import org.argeo.jcr.JcrUtils; import org.argeo.slc.SlcException; +import org.argeo.slc.repo.RepoConstants; import org.argeo.slc.repo.RepoUtils; import org.argeo.util.security.Keyring; +/** + * Abstract a repository. Might be persisted by a node in the current user home + * Node or just an URI and a label if user is anonymous + */ public class RepoElem extends DistParentElem { - private Node repoNode; + // private final static Log log = LogFactory.getLog(RepoElem.class); private Repository repository; private Credentials credentials; - private RepositoryFactory repositoryFactory; private Keyring keyring; - @Deprecated - public RepoElem(Node repoNode, boolean inHome, boolean isReadOnly) { - super(inHome, isReadOnly); - this.repoNode = repoNode; - } - - /** Inject repofactory and keyring to enable lazy init */ - public RepoElem(Node repoNode, RepositoryFactory repoFactory, - Keyring keyring, boolean inHome, boolean isReadOnly) { - super(inHome, isReadOnly); - this.repoNode = repoNode; - this.repositoryFactory = repoFactory; - this.keyring = keyring; - } + // Defines current repo + private Node repoNode = null; + private String label; + private String uri; - /** Inject repofactory and keyring to enable lazy init */ + /** + * Creates a RepoElement for an authenticated user. repofactory and keyring + * are used to enable lazy init + * + */ public RepoElem(Node repoNode, RepositoryFactory repoFactory, Keyring keyring) { this.repoNode = repoNode; this.repositoryFactory = repoFactory; this.keyring = keyring; + try { + // initialize this repo informations + setInHome(RepoConstants.DEFAULT_JAVA_REPOSITORY_ALIAS + .equals(repoNode.getName())); + if (!inHome()) + setReadOnly(!repoNode.hasNode(ArgeoNames.ARGEO_PASSWORD)); + uri = JcrUtils.get(repoNode, ArgeoNames.ARGEO_URI); + label = repoNode.isNodeType(NodeType.MIX_TITLE) ? repoNode + .getProperty(Property.JCR_TITLE).getString() : repoNode + .getName(); + } catch (RepositoryException e) { + throw new SlcException("Unable to " + "initialize repo element", e); + } } - @Deprecated - public RepoElem(Node repoNode) { - this.repoNode = repoNode; + /** + * Creates a RepoElement for anonymous user. repofactory is used to enable + * lazy init + * + */ + public RepoElem(RepositoryFactory repoFactory, String uri, String label) { + this.repositoryFactory = repoFactory; + this.uri = uri; + this.label = label; } /** Lazily connects to repository */ protected void connect() { if (repository != null) return; - repository = RepoUtils.getRepository(repositoryFactory, keyring, - repoNode); - credentials = RepoUtils.getRepositoryCredentials(keyring, repoNode); + if (repoNode == null) + // Anonymous + repository = ArgeoJcrUtils.getRepositoryByUri(repositoryFactory, + uri); + else { + repository = RepoUtils.getRepository(repositoryFactory, keyring, + repoNode); + credentials = RepoUtils.getRepositoryCredentials(keyring, repoNode); + } } public String getLabel() { - try { - if (repoNode.isNodeType(NodeType.MIX_TITLE)) { - return repoNode.getProperty(Property.JCR_TITLE).getString(); - } else { - return repoNode.getName(); - } - } catch (RepositoryException e) { - throw new SlcException("Cannot read label of " + repoNode, e); - } + return label; + } + + public String getUri() { + return uri; } public String toString() { - return repoNode.toString(); + return repoNode != null ? repoNode.toString() : label; } public Object[] getChildren() { @@ -85,23 +107,41 @@ public class RepoElem extends DistParentElem { session = repository.login(credentials); String[] workspaceNames = session.getWorkspace() .getAccessibleWorkspaceNames(); - // List distributionElems = new - // ArrayList(); Map children = new HashMap(); - for (String workspaceName : workspaceNames) { + + buildWksp: for (String workspaceName : workspaceNames) { + // Add a supplementary check to hide workspace that are not + // public to anonymous user + + if (repoNode == 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 // FIXME: rely on a more robust rule than just wksp name if (workspaceName.lastIndexOf('-') > 0) { String prefix = workspaceName.substring(0, workspaceName.lastIndexOf('-')); - if (!repoNode.hasNode(workspaceName)) - repoNode.addNode(workspaceName); - repoNode.getSession().save(); if (!children.containsKey(prefix)) { children.put(prefix, new GroupElem(RepoElem.this, prefix)); } - // FIXME remove deleted workspaces } } return children.values().toArray(); @@ -112,14 +152,6 @@ public class RepoElem extends DistParentElem { } } - public String getRepoPath() { - try { - return repoNode.getPath(); - } catch (RepositoryException e) { - throw new SlcException("Cannot get path for " + repoNode, e); - } - } - public Repository getRepository() { connect(); return repository; @@ -129,8 +161,15 @@ public class RepoElem extends DistParentElem { return credentials; } + public String getDescription() { + String desc = label; + if (repoNode != null) + desc = label + " (" + uri + ")"; + return desc; + } + + /** Might return null in case of an anonymous user */ public Node getRepoNode() { return repoNode; } - -} +} \ No newline at end of file