]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms.ui/src/org/argeo/cms/ui/jcr/model/RepositoriesElem.java
Major refactoring of Argeo CMS UI
[lgpl/argeo-commons.git] / org.argeo.cms.ui / src / org / argeo / cms / ui / jcr / model / RepositoriesElem.java
1 package org.argeo.cms.ui.jcr.model;
2
3 import java.util.Map;
4
5 import javax.jcr.Node;
6 import javax.jcr.NodeIterator;
7 import javax.jcr.Repository;
8 import javax.jcr.RepositoryException;
9 import javax.jcr.RepositoryFactory;
10 import javax.jcr.Session;
11
12 import org.argeo.api.security.Keyring;
13 import org.argeo.cms.ArgeoNames;
14 import org.argeo.cms.jcr.CmsJcrUtils;
15 import org.argeo.cms.ui.jcr.RepositoryRegister;
16 import org.argeo.eclipse.ui.EclipseUiException;
17 import org.argeo.eclipse.ui.TreeParent;
18 import org.argeo.eclipse.ui.dialogs.ErrorFeedback;
19
20 /**
21 * UI Tree component that implements the Argeo abstraction of a
22 * {@link RepositoryFactory} that enable a user to "mount" various repositories
23 * in a single Tree like View. It is usually meant to be at the root of the UI
24 * Tree and thus {@link getParent()} method will return null.
25 *
26 * The {@link RepositoryFactory} is injected at instantiation time and must be
27 * use get or register new {@link Repository} objects upon which a reference is
28 * kept here.
29 */
30
31 public class RepositoriesElem extends TreeParent implements ArgeoNames {
32 private final RepositoryRegister repositoryRegister;
33 private final RepositoryFactory repositoryFactory;
34
35 /**
36 * A session of the logged in user on the default workspace of the node
37 * repository.
38 */
39 private final Session userSession;
40 private final Keyring keyring;
41
42 public RepositoriesElem(String name, RepositoryRegister repositoryRegister, RepositoryFactory repositoryFactory,
43 TreeParent parent, Session userSession, Keyring keyring) {
44 super(name);
45 this.repositoryRegister = repositoryRegister;
46 this.repositoryFactory = repositoryFactory;
47 this.userSession = userSession;
48 this.keyring = keyring;
49 }
50
51 /**
52 * Override normal behavior to initialize the various repositories only at
53 * request time
54 */
55 @Override
56 public synchronized Object[] getChildren() {
57 if (isLoaded()) {
58 return super.getChildren();
59 } else {
60 // initialize current object
61 Map<String, Repository> refRepos = repositoryRegister.getRepositories();
62 for (String name : refRepos.keySet()) {
63 Repository repository = refRepos.get(name);
64 // if (repository instanceof MaintainedRepository)
65 // super.addChild(new MaintainedRepositoryElem(name,
66 // repository, this));
67 // else
68 super.addChild(new RepositoryElem(name, repository, this));
69 }
70
71 // remote
72 if (keyring != null) {
73 try {
74 addRemoteRepositories(keyring);
75 } catch (RepositoryException e) {
76 throw new EclipseUiException("Cannot browse remote repositories", e);
77 }
78 }
79 return super.getChildren();
80 }
81 }
82
83 protected void addRemoteRepositories(Keyring jcrKeyring) throws RepositoryException {
84 Node userHome = CmsJcrUtils.getUserHome(userSession);
85 if (userHome != null && userHome.hasNode(ARGEO_REMOTE)) {
86 NodeIterator it = userHome.getNode(ARGEO_REMOTE).getNodes();
87 while (it.hasNext()) {
88 Node remoteNode = it.nextNode();
89 String uri = remoteNode.getProperty(ARGEO_URI).getString();
90 try {
91 RemoteRepositoryElem remoteRepositoryNode = new RemoteRepositoryElem(remoteNode.getName(),
92 repositoryFactory, uri, this, userSession, jcrKeyring, remoteNode.getPath());
93 super.addChild(remoteRepositoryNode);
94 } catch (Exception e) {
95 ErrorFeedback.show("Cannot add remote repository " + remoteNode, e);
96 }
97 }
98 }
99 }
100
101 public void registerNewRepository(String alias, Repository repository) {
102 // TODO: implement this
103 // Create a new RepositoryNode Object
104 // add it
105 // super.addChild(new RepositoriesNode(...));
106 }
107
108 /** Returns the {@link RepositoryRegister} wrapped by this object. */
109 public RepositoryRegister getRepositoryRegister() {
110 return repositoryRegister;
111 }
112 }