]> git.argeo.org Git - gpl/argeo-slc.git/blob - org.argeo.slc.client.ui.dist/src/org/argeo/slc/client/ui/dist/controllers/DistTreeContentProvider.java
Adapt to changes in BND.
[gpl/argeo-slc.git] / org.argeo.slc.client.ui.dist / src / org / argeo / slc / client / ui / dist / controllers / DistTreeContentProvider.java
1 package org.argeo.slc.client.ui.dist.controllers;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import javax.jcr.Node;
7 import javax.jcr.NodeIterator;
8 import javax.jcr.Property;
9 import javax.jcr.Repository;
10 import javax.jcr.RepositoryException;
11 import javax.jcr.RepositoryFactory;
12 import javax.jcr.Session;
13 import javax.jcr.nodetype.NodeType;
14
15 import org.argeo.cms.ArgeoNames;
16 import org.argeo.cms.ArgeoTypes;
17 import org.argeo.eclipse.ui.TreeParent;
18 import org.argeo.jcr.JcrUtils;
19 import org.argeo.node.NodeUtils;
20 import org.argeo.node.security.Keyring;
21 import org.argeo.slc.SlcException;
22 import org.argeo.slc.client.ui.dist.model.RepoElem;
23 import org.argeo.slc.repo.RepoConstants;
24 import org.eclipse.jface.viewers.ITreeContentProvider;
25 import org.eclipse.jface.viewers.Viewer;
26
27 /**
28 * Enables browsing in local and remote SLC software repositories. Keyring and
29 * repository factory must be injected
30 */
31 public class DistTreeContentProvider implements ITreeContentProvider {
32 private static final long serialVersionUID = -7640840211717811421L;
33
34 /* DEPENDENCY INJECTION */
35 private RepositoryFactory repositoryFactory;
36 private Keyring keyring;
37
38 // Context
39 private Session nodeSession;
40 List<RepoElem> repositories = new ArrayList<RepoElem>();
41
42 public Object[] getElements(Object input) {
43 Repository nodeRepository = (Repository) input;
44 try {
45 if (nodeSession != null)
46 dispose();
47 nodeSession = nodeRepository.login();
48
49 String reposPath = NodeUtils.getUserHome(nodeSession).getPath() + RepoConstants.REPOSITORIES_BASE_PATH;
50
51 if (!nodeSession.itemExists(reposPath))
52 initializeModel(nodeSession);
53
54 NodeIterator repos = nodeSession.getNode(reposPath).getNodes();
55 while (repos.hasNext()) {
56 Node repoNode = repos.nextNode();
57 if (repoNode.isNodeType(ArgeoTypes.ARGEO_REMOTE_REPOSITORY)) {
58 String label = repoNode.isNodeType(NodeType.MIX_TITLE)
59 ? repoNode.getProperty(Property.JCR_TITLE).getString() : repoNode.getName();
60 repositories.add(new RepoElem(repositoryFactory, keyring, repoNode, label));
61 }
62 }
63 } catch (RepositoryException e) {
64 throw new SlcException("Cannot get base elements", e);
65 }
66 return repositories.toArray();
67 }
68
69 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
70 }
71
72 // @Override
73 public Object[] getChildren(Object parentElement) {
74 if (parentElement instanceof TreeParent)
75 return ((TreeParent) parentElement).getChildren();
76 else
77 return null;
78 }
79
80 // @Override
81 public Object getParent(Object element) {
82 if (element instanceof TreeParent)
83 return ((TreeParent) element).getParent();
84 return null;
85 }
86
87 // @Override
88 public boolean hasChildren(Object element) {
89 if (element instanceof TreeParent)
90 return ((TreeParent) element).hasChildren();
91 else
92 return false;
93 }
94
95 public void dispose() {
96 for (RepoElem repoElem : repositories)
97 repoElem.dispose();
98 repositories = new ArrayList<RepoElem>();
99 JcrUtils.logoutQuietly(nodeSession);
100 }
101
102 private void initializeModel(Session nodeSession) {
103 try {
104 Node homeNode = NodeUtils.getUserHome(nodeSession);
105 if (homeNode == null) // anonymous
106 throw new SlcException("User must be authenticated.");
107
108 // make sure base directory is available
109 Node repos = JcrUtils.mkdirs(homeNode, RepoConstants.REPOSITORIES_BASE_PATH,null);
110 if (nodeSession.hasPendingChanges())
111 nodeSession.save();
112
113 // register default local java repository
114 String alias = RepoConstants.DEFAULT_JAVA_REPOSITORY_ALIAS;
115 Repository javaRepository = NodeUtils.getRepositoryByAlias(repositoryFactory, alias);
116 if (javaRepository != null) {
117 if (!repos.hasNode(alias)) {
118 Node repoNode = repos.addNode(alias, ArgeoTypes.ARGEO_REMOTE_REPOSITORY);
119 repoNode.setProperty(ArgeoNames.ARGEO_URI, "vm:///" + alias);
120 repoNode.addMixin(NodeType.MIX_TITLE);
121 repoNode.setProperty(Property.JCR_TITLE, RepoConstants.DEFAULT_JAVA_REPOSITORY_LABEL);
122 nodeSession.save();
123 }
124 }
125 } catch (RepositoryException e) {
126 throw new SlcException("Cannot initialize model", e);
127 }
128 }
129
130 /* DEPENDENCY INJECTION */
131 public void setRepositoryFactory(RepositoryFactory repositoryFactory) {
132 this.repositoryFactory = repositoryFactory;
133 }
134
135 public void setKeyring(Keyring keyring) {
136 this.keyring = keyring;
137 }
138 }