1 package org
.argeo
.jcr
.ui
.explorer
.model
;
3 import java
.util
.Hashtable
;
7 import javax
.jcr
.NodeIterator
;
8 import javax
.jcr
.Repository
;
9 import javax
.jcr
.RepositoryException
;
10 import javax
.jcr
.RepositoryFactory
;
11 import javax
.jcr
.Session
;
13 import org
.argeo
.ArgeoException
;
14 import org
.argeo
.eclipse
.ui
.ErrorFeedback
;
15 import org
.argeo
.eclipse
.ui
.TreeParent
;
16 import org
.argeo
.jcr
.ArgeoJcrConstants
;
17 import org
.argeo
.jcr
.ArgeoNames
;
18 import org
.argeo
.jcr
.JcrUtils
;
19 import org
.argeo
.jcr
.RepositoryRegister
;
20 import org
.argeo
.jcr
.security
.JcrKeyring
;
23 * UI Tree component. Implements the Argeo abstraction of a
24 * {@link RepositoryFactory} that enable a user to "mount" various repositories
25 * in a single Tree like View. It is usually meant to be at the root of the UI
26 * Tree and thus {@link getParent()} method will return null.
28 * The {@link RepositoryFactory} is injected at instantiation time and must be
29 * use get or register new {@link Repository} objects upon which a reference is
33 public class RepositoriesNode
extends TreeParent
implements ArgeoNames
{
34 private final RepositoryRegister repositoryRegister
;
35 private final RepositoryFactory repositoryFactory
;
37 private final JcrKeyring jcrKeyring
;
39 public RepositoriesNode(String name
, RepositoryRegister repositoryRegister
,
40 RepositoryFactory repositoryFactory
, TreeParent parent
,
41 JcrKeyring jcrKeyring
) {
43 this.repositoryRegister
= repositoryRegister
;
44 this.repositoryFactory
= repositoryFactory
;
45 this.jcrKeyring
= jcrKeyring
;
49 * Override normal behavior to initialize the various repositories only at
53 public synchronized Object
[] getChildren() {
55 return super.getChildren();
57 // initialize current object
58 Map
<String
, Repository
> refRepos
= repositoryRegister
60 for (String name
: refRepos
.keySet()) {
61 super.addChild(new RepositoryNode(name
, refRepos
.get(name
),
66 if (jcrKeyring
!= null) {
68 addRemoteRepositories(jcrKeyring
);
69 } catch (RepositoryException e
) {
70 throw new ArgeoException(
71 "Cannot browse remote repositories", e
);
74 return super.getChildren();
78 protected void addRemoteRepositories(JcrKeyring jcrKeyring
)
79 throws RepositoryException
{
80 Session userSession
= jcrKeyring
.getSession();
81 Node userHome
= JcrUtils
.getUserHome(userSession
);
82 if (userHome
!= null && userHome
.hasNode(ARGEO_REMOTE
)) {
83 NodeIterator it
= userHome
.getNode(ARGEO_REMOTE
).getNodes();
84 while (it
.hasNext()) {
85 Node remoteNode
= it
.nextNode();
86 String uri
= remoteNode
.getProperty(ARGEO_URI
).getString();
88 Hashtable
<String
, String
> params
= new Hashtable
<String
, String
>();
89 params
.put(ArgeoJcrConstants
.JCR_REPOSITORY_URI
, uri
);
90 params
.put(ArgeoJcrConstants
.JCR_REPOSITORY_ALIAS
,
91 remoteNode
.getName());
92 Repository repository
= repositoryFactory
93 .getRepository(params
);
94 RemoteRepositoryNode remoteRepositoryNode
= new RemoteRepositoryNode(
95 remoteNode
.getName(), repository
, this, jcrKeyring
,
96 remoteNode
.getPath());
97 super.addChild(remoteRepositoryNode
);
98 } catch (Exception e
) {
99 ErrorFeedback
.show("Cannot add remote repository "
106 public void registerNewRepository(String alias
, Repository repository
) {
107 // TODO: implement this
108 // Create a new RepositoryNode Object
110 // super.addChild(new RepositoriesNode(...));
113 /** Returns the {@link RepositoryRegister} wrapped by this object. */
114 public RepositoryRegister
getRepositoryRegister() {
115 return repositoryRegister
;