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