]> 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 refactoring (remove APIs from argeo.util)
[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.eclipse.ui.TreeParent;
16 import org.argeo.jcr.JcrUtils;
17 import org.argeo.node.ArgeoNames;
18 import org.argeo.node.ArgeoTypes;
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()
50 + RepoConstants.REPOSITORIES_BASE_PATH;
51
52 if (!nodeSession.itemExists(reposPath))
53 initializeModel(nodeSession);
54
55 NodeIterator repos = nodeSession.getNode(reposPath).getNodes();
56 while (repos.hasNext()) {
57 Node repoNode = repos.nextNode();
58 if (repoNode.isNodeType(ArgeoTypes.ARGEO_REMOTE_REPOSITORY)) {
59 String label = repoNode.isNodeType(NodeType.MIX_TITLE) ? repoNode
60 .getProperty(Property.JCR_TITLE).getString()
61 : repoNode.getName();
62 repositories.add(new RepoElem(repositoryFactory, keyring,
63 repoNode, label));
64 }
65 }
66 } catch (RepositoryException e) {
67 throw new SlcException("Cannot get base elements", e);
68 }
69 return repositories.toArray();
70 }
71
72 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
73 }
74
75 // @Override
76 public Object[] getChildren(Object parentElement) {
77 if (parentElement instanceof TreeParent)
78 return ((TreeParent) parentElement).getChildren();
79 else
80 return null;
81 }
82
83 // @Override
84 public Object getParent(Object element) {
85 if (element instanceof TreeParent)
86 return ((TreeParent) element).getParent();
87 return null;
88 }
89
90 // @Override
91 public boolean hasChildren(Object element) {
92 if (element instanceof TreeParent)
93 return ((TreeParent) element).hasChildren();
94 else
95 return false;
96 }
97
98 public void dispose() {
99 for (RepoElem repoElem : repositories)
100 repoElem.dispose();
101 repositories = new ArrayList<RepoElem>();
102 JcrUtils.logoutQuietly(nodeSession);
103 }
104
105 private void initializeModel(Session nodeSession) {
106 try {
107 Node homeNode = NodeUtils.getUserHome(nodeSession);
108 if (homeNode == null) // anonymous
109 throw new SlcException("User must be authenticated.");
110
111 // make sure base directory is available
112 Node repos = JcrUtils.mkdirs(nodeSession, homeNode.getPath()
113 + RepoConstants.REPOSITORIES_BASE_PATH);
114 if (nodeSession.hasPendingChanges())
115 nodeSession.save();
116
117 // register default local java repository
118 String alias = RepoConstants.DEFAULT_JAVA_REPOSITORY_ALIAS;
119 Repository javaRepository = NodeUtils.getRepositoryByAlias(
120 repositoryFactory, alias);
121 if (javaRepository != null) {
122 if (!repos.hasNode(alias)) {
123 Node repoNode = repos.addNode(alias,
124 ArgeoTypes.ARGEO_REMOTE_REPOSITORY);
125 repoNode.setProperty(ArgeoNames.ARGEO_URI, "vm:///" + alias);
126 repoNode.addMixin(NodeType.MIX_TITLE);
127 repoNode.setProperty(Property.JCR_TITLE,
128 RepoConstants.DEFAULT_JAVA_REPOSITORY_LABEL);
129 nodeSession.save();
130 }
131 }
132 } catch (RepositoryException e) {
133 throw new SlcException("Cannot initialize model", e);
134 }
135 }
136
137 /* DEPENDENCY INJECTION */
138 public void setRepositoryFactory(RepositoryFactory repositoryFactory) {
139 this.repositoryFactory = repositoryFactory;
140 }
141
142 public void setKeyring(Keyring keyring) {
143 this.keyring = keyring;
144 }
145 }