]> git.argeo.org Git - lgpl/argeo-commons.git/blob - server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/model/RepositoriesNode.java
3e05c989c18db1fc73814345dd212af69882bbe6
[lgpl/argeo-commons.git] / server / plugins / org.argeo.jcr.ui.explorer / src / main / java / org / argeo / jcr / ui / explorer / 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 private final RepositoryFactory repositoryFactory;
36
37 private final JcrKeyring jcrKeyring;
38
39 public RepositoriesNode(String name, RepositoryRegister repositoryRegister,
40 RepositoryFactory repositoryFactory, TreeParent parent,
41 JcrKeyring jcrKeyring) {
42 super(name);
43 this.repositoryRegister = repositoryRegister;
44 this.repositoryFactory = repositoryFactory;
45 this.jcrKeyring = jcrKeyring;
46 }
47
48 /**
49 * Override normal behavior to initialize the various repositories only at
50 * request time
51 */
52 @Override
53 public synchronized Object[] getChildren() {
54 if (isLoaded()) {
55 return super.getChildren();
56 } else {
57 // initialize current object
58 Map<String, Repository> refRepos = repositoryRegister
59 .getRepositories();
60 for (String name : refRepos.keySet()) {
61 super.addChild(new RepositoryNode(name, refRepos.get(name),
62 this));
63 }
64
65 // remote
66 if (jcrKeyring != null) {
67 try {
68 addRemoteRepositories(jcrKeyring);
69 } catch (RepositoryException e) {
70 throw new ArgeoException(
71 "Cannot browse remote repositories", e);
72 }
73 }
74 return super.getChildren();
75 }
76 }
77
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();
87 try {
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 "
100 + remoteNode, e);
101 }
102 }
103 }
104 }
105
106 public void registerNewRepository(String alias, Repository repository) {
107 // TODO: implement this
108 // Create a new RepositoryNode Object
109 // add it
110 // super.addChild(new RepositoriesNode(...));
111 }
112
113 /** Returns the {@link RepositoryRegister} wrapped by this object. */
114 public RepositoryRegister getRepositoryRegister() {
115 return repositoryRegister;
116 }
117 }