]> git.argeo.org Git - gpl/argeo-slc.git/blob - plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/model/RepoElem.java
+ first draft of anonymous perspective
[gpl/argeo-slc.git] / plugins / org.argeo.slc.client.ui.dist / src / main / java / org / argeo / slc / client / ui / dist / model / RepoElem.java
1 package org.argeo.slc.client.ui.dist.model;
2
3 import java.util.HashMap;
4 import java.util.Map;
5
6 import javax.jcr.Credentials;
7 import javax.jcr.Node;
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;
14
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;
22
23 /**
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
26 */
27 public class RepoElem extends DistParentElem {
28
29 private Repository repository;
30 private Credentials credentials;
31 private RepositoryFactory repositoryFactory;
32 private Keyring keyring;
33
34 // Defines current repo
35 private Node repoNode = null;
36 private String label;
37 private String uri;
38
39 /**
40 * Creates a RepoElement for an authenticated user. repofactory and keyring
41 * are used to enable lazy init
42 *
43 */
44 public RepoElem(Node repoNode, RepositoryFactory repoFactory,
45 Keyring keyring) {
46 this.repoNode = repoNode;
47 this.repositoryFactory = repoFactory;
48 this.keyring = keyring;
49 try {
50 // initialize this repo informations
51 setInHome(RepoConstants.DEFAULT_JAVA_REPOSITORY_ALIAS
52 .equals(repoNode.getName()));
53 if (!inHome())
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
58 .getName();
59 } catch (RepositoryException e) {
60 throw new SlcException("Unable to " + "initialize repo element", e);
61 }
62 }
63
64 /**
65 * Creates a RepoElement for anonymous user. repofactory is used to enable
66 * lazy init
67 *
68 */
69 public RepoElem(RepositoryFactory repoFactory, String uri, String label) {
70 this.repositoryFactory = repoFactory;
71 this.uri = uri;
72 this.label = label;
73 }
74
75 /** Lazily connects to repository */
76 protected void connect() {
77 if (repository != null)
78 return;
79 if (repoNode == null)
80 // Anonymous
81 repository = ArgeoJcrUtils.getRepositoryByUri(repositoryFactory,
82 uri);
83 else {
84 repository = RepoUtils.getRepository(repositoryFactory, keyring,
85 repoNode);
86 credentials = RepoUtils.getRepositoryCredentials(keyring, repoNode);
87 }
88 }
89
90 public String getLabel() {
91 return label;
92 }
93
94 public String getUri() {
95 return uri;
96 }
97
98 public String toString() {
99 return repoNode != null ? repoNode.toString() : label;
100 }
101
102 public Object[] getChildren() {
103 connect();
104 Session session = null;
105 try {
106 session = repository.login(credentials);
107 String[] workspaceNames = session.getWorkspace()
108 .getAccessibleWorkspaceNames();
109 Map<String, GroupElem> children = new HashMap<String, GroupElem>();
110
111 buildWksp: for (String workspaceName : workspaceNames) {
112 // Add a supplementary check to hide workspace that are not
113 // public to anonymous user
114
115 // TODO fix this
116 // if (repoNode == null) {
117 // Session tmpSession = null;
118 // try {
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);
127 // if (!res)
128 // continue buildWksp;
129 // } catch (RepositoryException e) {
130 // throw new SlcException(
131 // "Cannot list workspaces for anonymous user", e);
132 // } finally {
133 // JcrUtils.logoutQuietly(tmpSession);
134 // }
135 // }
136
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,
144 prefix));
145 }
146 }
147 }
148 return children.values().toArray();
149 } catch (RepositoryException e) {
150 throw new SlcException("Cannot list workspaces for " + repoNode, e);
151 } finally {
152 JcrUtils.logoutQuietly(session);
153 }
154 }
155
156 public Repository getRepository() {
157 connect();
158 return repository;
159 }
160
161 public Credentials getCredentials() {
162 return credentials;
163 }
164
165 public String getDescription() {
166 String desc = label;
167 if (repoNode != null)
168 desc = label + " (" + uri + ")";
169 return desc;
170 }
171
172 /** Might return null in case of an anonymous user */
173 public Node getRepoNode() {
174 return repoNode;
175 }
176 }