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
;
36 private final JcrKeyring jcrKeyring
;
38 public RepositoriesNode(String name
, RepositoryRegister repositoryRegister
,
39 TreeParent parent
, JcrKeyring jcrKeyring
) {
41 this.repositoryRegister
= repositoryRegister
;
42 this.jcrKeyring
= jcrKeyring
;
46 * Override normal behavior to initialize the various repositories only at
50 public synchronized Object
[] getChildren() {
52 return super.getChildren();
54 // initialize current object
55 Map
<String
, Repository
> refRepos
= repositoryRegister
57 for (String name
: refRepos
.keySet()) {
58 super.addChild(new RepositoryNode(name
, refRepos
.get(name
),
63 if (jcrKeyring
!= null) {
65 addRemoteRepositories(jcrKeyring
);
66 } catch (RepositoryException e
) {
67 throw new ArgeoException(
68 "Cannot browse remote repositories", e
);
71 return super.getChildren();
75 protected void addRemoteRepositories(JcrKeyring jcrKeyring
)
76 throws RepositoryException
{
77 Session userSession
= jcrKeyring
.getSession();
78 Node userHome
= JcrUtils
.getUserHome(userSession
);
79 if (userHome
!= null && userHome
.hasNode(ARGEO_REMOTE
)) {
80 NodeIterator it
= userHome
.getNode(ARGEO_REMOTE
).getNodes();
81 while (it
.hasNext()) {
82 Node remoteNode
= it
.nextNode();
83 String uri
= remoteNode
.getProperty(ARGEO_URI
).getString();
85 Hashtable
<String
, String
> params
= new Hashtable
<String
, String
>();
86 params
.put(ArgeoJcrConstants
.JCR_REPOSITORY_URI
, uri
);
87 params
.put(ArgeoJcrConstants
.JCR_REPOSITORY_ALIAS
,
88 remoteNode
.getName());
89 Repository repository
= repositoryRegister
90 .getRepository(params
);
91 RemoteRepositoryNode remoteRepositoryNode
= new RemoteRepositoryNode(
92 remoteNode
.getName(), repository
, this, jcrKeyring
,
93 remoteNode
.getPath());
94 super.addChild(remoteRepositoryNode
);
95 } catch (Exception e
) {
96 ErrorFeedback
.show("Cannot add remote repository "
103 public void registerNewRepository(String alias
, Repository repository
) {
104 // TODO: implement this
105 // Create a new RepositoryNode Object
107 // super.addChild(new RepositoriesNode(...));
110 /** Returns the {@link RepositoryRegister} wrapped by this object. */
111 public RepositoryRegister
getRepositoryRegister() {
112 return repositoryRegister
;