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