]> 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
Clean: fix typos, update comments
[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.jcr.ArgeoJcrUtils;
16 import org.argeo.jcr.ArgeoNames;
17 import org.argeo.jcr.ArgeoTypes;
18 import org.argeo.jcr.JcrUtils;
19 import org.argeo.jcr.UserJcrUtils;
20 import org.argeo.slc.SlcException;
21 import org.argeo.slc.client.ui.dist.model.DistParentElem;
22 import org.argeo.slc.client.ui.dist.model.RepoElem;
23 import org.argeo.slc.client.ui.dist.model.WorkspaceElem;
24 import org.argeo.slc.repo.RepoConstants;
25 import org.argeo.util.security.Keyring;
26 import org.eclipse.jface.viewers.ITreeContentProvider;
27 import org.eclipse.jface.viewers.Viewer;
28
29 /**
30 * Enables browsing in local and remote SLC software repositories. Keyring
31 * and repository factory must be injected
32 */
33 public class DistTreeContentProvider implements ITreeContentProvider {
34 private Session nodeSession;
35 List<RepoElem> repositories = new ArrayList<RepoElem>();
36
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 repositories.add(new RepoElem(repoNode, repositoryFactory,
58 keyring));
59 }
60 } catch (RepositoryException e) {
61 throw new SlcException("Cannot get base elements", e);
62 }
63 return repositories.toArray();
64 }
65
66 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
67 }
68
69 public Object[] getChildren(Object parentElement) {
70 if (parentElement instanceof DistParentElem) {
71 return ((DistParentElem) parentElement).getChildren();
72 } else if (parentElement instanceof WorkspaceElem) {
73 return ((WorkspaceElem) parentElement).getChildren();
74 }
75 return null;
76 }
77
78 public Object getParent(Object element) {
79 // TODO register repo elem in distribution elem?
80 return null;
81 }
82
83 public boolean hasChildren(Object element) {
84 if (element instanceof WorkspaceElem)
85 return false;
86 else if (element instanceof DistParentElem)
87 return true;
88 else
89 return false;
90 }
91
92 public void dispose() {
93 for (RepoElem repoElem : repositories)
94 repoElem.dispose();
95 repositories = new ArrayList<RepoElem>();
96 JcrUtils.logoutQuietly(nodeSession);
97 }
98
99 private void initializeModel(Session nodeSession) {
100 try {
101
102 Node homeNode = UserJcrUtils.getUserHome(nodeSession);
103 if (homeNode == null) // anonymous
104 throw new SlcException("User must be authenticated.");
105
106 // make sure base directory is available
107 Node repos = JcrUtils.mkdirs(nodeSession, homeNode.getPath()
108 + RepoConstants.REPOSITORIES_BASE_PATH);
109 nodeSession.save();
110
111 // register default local java repository
112 String alias = RepoConstants.DEFAULT_JAVA_REPOSITORY_ALIAS;
113 Repository javaRepository = ArgeoJcrUtils.getRepositoryByAlias(
114 repositoryFactory, alias);
115 if (javaRepository != null) {
116 if (!repos.hasNode(alias)) {
117 Node repoNode = repos.addNode(alias,
118 ArgeoTypes.ARGEO_REMOTE_REPOSITORY);
119 repoNode.setProperty(ArgeoNames.ARGEO_URI, "vm:///" + alias);
120 repoNode.addMixin(NodeType.MIX_TITLE);
121 repoNode.setProperty(Property.JCR_TITLE,
122 RepoConstants.DEFAULT_JAVA_REPOSITORY_LABEL);
123 nodeSession.save();
124 }
125 }
126 } catch (RepositoryException e) {
127 throw new SlcException("Cannot initialize model", e);
128 }
129 }
130
131 /*
132 * DEPENDENCY INJECTION
133 */
134 public void setRepositoryFactory(RepositoryFactory repositoryFactory) {
135 this.repositoryFactory = repositoryFactory;
136 }
137
138 public void setKeyring(Keyring keyring) {
139 this.keyring = keyring;
140 }
141 }