]> git.argeo.org Git - lgpl/argeo-commons.git/blob - model/RepositoriesNode.java
Prepare next development cycle
[lgpl/argeo-commons.git] / model / RepositoriesNode.java
1 package org.argeo.jcr.ui.explorer.model;
2
3 import java.util.Hashtable;
4 import java.util.Map;
5
6 import javax.jcr.Node;
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;
12
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;
21
22 /**
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.
27 *
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
30 * kept here.
31 */
32
33 public class RepositoriesNode extends TreeParent implements ArgeoNames {
34 private final RepositoryRegister repositoryRegister;
35
36 private final JcrKeyring jcrKeyring;
37
38 public RepositoriesNode(String name, RepositoryRegister repositoryRegister,
39 TreeParent parent, JcrKeyring jcrKeyring) {
40 super(name);
41 this.repositoryRegister = repositoryRegister;
42 this.jcrKeyring = jcrKeyring;
43 }
44
45 /**
46 * Override normal behavior to initialize the various repositories only at
47 * request time
48 */
49 @Override
50 public synchronized Object[] getChildren() {
51 if (isLoaded()) {
52 return super.getChildren();
53 } else {
54 // initialize current object
55 Map<String, Repository> refRepos = repositoryRegister
56 .getRepositories();
57 for (String name : refRepos.keySet()) {
58 super.addChild(new RepositoryNode(name, refRepos.get(name),
59 this));
60 }
61
62 // remote
63 if (jcrKeyring != null) {
64 try {
65 addRemoteRepositories(jcrKeyring);
66 } catch (RepositoryException e) {
67 throw new ArgeoException(
68 "Cannot browse remote repositories", e);
69 }
70 }
71 return super.getChildren();
72 }
73 }
74
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();
84 try {
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 "
97 + remoteNode, e);
98 }
99 }
100 }
101 }
102
103 public void registerNewRepository(String alias, Repository repository) {
104 // TODO: implement this
105 // Create a new RepositoryNode Object
106 // add it
107 // super.addChild(new RepositoriesNode(...));
108 }
109
110 /** Returns the {@link RepositoryRegister} wrapped by this object. */
111 public RepositoryRegister getRepositoryRegister() {
112 return repositoryRegister;
113 }
114 }