1 package org
.argeo
.slc
.client
.ui
.dist
.model
;
3 import java
.util
.HashMap
;
6 import javax
.jcr
.Credentials
;
8 import javax
.jcr
.Property
;
9 import javax
.jcr
.Repository
;
10 import javax
.jcr
.RepositoryException
;
11 import javax
.jcr
.RepositoryFactory
;
12 import javax
.jcr
.Session
;
13 import javax
.jcr
.nodetype
.NodeType
;
15 import org
.argeo
.jcr
.ArgeoJcrUtils
;
16 import org
.argeo
.jcr
.ArgeoNames
;
17 import org
.argeo
.jcr
.JcrUtils
;
18 import org
.argeo
.slc
.SlcException
;
19 import org
.argeo
.slc
.repo
.RepoConstants
;
20 import org
.argeo
.slc
.repo
.RepoUtils
;
21 import org
.argeo
.util
.security
.Keyring
;
24 * Abstract a repository. Might be persisted by a node in the current user home
25 * Node or just an URI and a label if user is anonymous
27 public class RepoElem
extends DistParentElem
{
29 private Repository repository
;
30 private Credentials credentials
;
31 private RepositoryFactory repositoryFactory
;
32 private Keyring keyring
;
34 // Defines current repo
35 private Node repoNode
= null;
40 * Creates a RepoElement for an authenticated user. repofactory and keyring
41 * are used to enable lazy init
44 public RepoElem(Node repoNode
, RepositoryFactory repoFactory
,
46 this.repoNode
= repoNode
;
47 this.repositoryFactory
= repoFactory
;
48 this.keyring
= keyring
;
50 // initialize this repo informations
51 setInHome(RepoConstants
.DEFAULT_JAVA_REPOSITORY_ALIAS
52 .equals(repoNode
.getName()));
54 setReadOnly(!repoNode
.hasNode(ArgeoNames
.ARGEO_PASSWORD
));
55 uri
= JcrUtils
.get(repoNode
, ArgeoNames
.ARGEO_URI
);
56 label
= repoNode
.isNodeType(NodeType
.MIX_TITLE
) ? repoNode
57 .getProperty(Property
.JCR_TITLE
).getString() : repoNode
59 } catch (RepositoryException e
) {
60 throw new SlcException("Unable to " + "initialize repo element", e
);
65 * Creates a RepoElement for anonymous user. repofactory is used to enable
69 public RepoElem(RepositoryFactory repoFactory
, String uri
, String label
) {
70 this.repositoryFactory
= repoFactory
;
75 /** Lazily connects to repository */
76 protected void connect() {
77 if (repository
!= null)
81 repository
= ArgeoJcrUtils
.getRepositoryByUri(repositoryFactory
,
84 repository
= RepoUtils
.getRepository(repositoryFactory
, keyring
,
86 credentials
= RepoUtils
.getRepositoryCredentials(keyring
, repoNode
);
90 public String
getLabel() {
94 public String
getUri() {
98 public String
toString() {
99 return repoNode
!= null ? repoNode
.toString() : label
;
102 public Object
[] getChildren() {
104 Session session
= null;
106 session
= repository
.login(credentials
);
107 String
[] workspaceNames
= session
.getWorkspace()
108 .getAccessibleWorkspaceNames();
109 Map
<String
, GroupElem
> children
= new HashMap
<String
, GroupElem
>();
111 buildWksp
: for (String workspaceName
: workspaceNames
) {
112 // Add a supplementary check to hide workspace that are not
113 // public to anonymous user
116 // if (repoNode == null) {
117 // Session tmpSession = null;
119 // tmpSession = repository.login();
120 // Privilege[] priv = new Privilege[1];
121 // priv[0] = tmpSession.getAccessControlManager()
122 // .privilegeFromName(Privilege.JCR_READ);
123 // Privilege[] tmp = tmpSession.getAccessControlManager()
124 // .getPrivileges("/");
125 // boolean res = tmpSession.getAccessControlManager()
126 // .hasPrivileges("/", priv);
128 // continue buildWksp;
129 // } catch (RepositoryException e) {
130 // throw new SlcException(
131 // "Cannot list workspaces for anonymous user", e);
133 // JcrUtils.logoutQuietly(tmpSession);
137 // filter technical workspaces
138 // FIXME: rely on a more robust rule than just wksp name
139 if (workspaceName
.lastIndexOf('-') > 0) {
140 String prefix
= workspaceName
.substring(0,
141 workspaceName
.lastIndexOf('-'));
142 if (!children
.containsKey(prefix
)) {
143 children
.put(prefix
, new GroupElem(RepoElem
.this,
148 return children
.values().toArray();
149 } catch (RepositoryException e
) {
150 throw new SlcException("Cannot list workspaces for " + repoNode
, e
);
152 JcrUtils
.logoutQuietly(session
);
156 public Repository
getRepository() {
161 public Credentials
getCredentials() {
165 public String
getDescription() {
167 if (repoNode
!= null)
168 desc
= label
+ " (" + uri
+ ")";
172 /** Might return null in case of an anonymous user */
173 public Node
getRepoNode() {