1 package org
.argeo
.slc
.client
.ui
.dist
.controllers
;
3 import java
.util
.ArrayList
;
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
;
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
;
29 * Enables browsing in local and remote SLC software repositories. Keyring and
30 * repository factory must be injected
32 public class DistTreeContentProvider
implements ITreeContentProvider
{
33 private static final long serialVersionUID
= -7640840211717811421L;
35 /* DEPENDENCY INJECTION */
36 private RepositoryFactory repositoryFactory
;
37 private Keyring keyring
;
40 private Session nodeSession
;
41 List
<RepoElem
> repositories
= new ArrayList
<RepoElem
>();
43 public Object
[] getElements(Object input
) {
44 Repository nodeRepository
= (Repository
) input
;
46 if (nodeSession
!= null)
48 nodeSession
= nodeRepository
.login();
50 String reposPath
= UserJcrUtils
.getUserHome(nodeSession
).getPath()
51 + RepoConstants
.REPOSITORIES_BASE_PATH
;
53 if (!nodeSession
.itemExists(reposPath
))
54 initializeModel(nodeSession
);
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()
63 repositories
.add(new RepoElem(repositoryFactory
, keyring
,
67 } catch (RepositoryException e
) {
68 throw new SlcException("Cannot get base elements", e
);
70 return repositories
.toArray();
73 public void inputChanged(Viewer viewer
, Object oldInput
, Object newInput
) {
77 public Object
[] getChildren(Object parentElement
) {
78 if (parentElement
instanceof TreeParent
)
79 return ((TreeParent
) parentElement
).getChildren();
85 public Object
getParent(Object element
) {
86 if (element
instanceof TreeParent
)
87 return ((TreeParent
) element
).getParent();
92 public boolean hasChildren(Object element
) {
93 if (element
instanceof TreeParent
)
94 return ((TreeParent
) element
).hasChildren();
99 public void dispose() {
100 for (RepoElem repoElem
: repositories
)
102 repositories
= new ArrayList
<RepoElem
>();
103 JcrUtils
.logoutQuietly(nodeSession
);
106 private void initializeModel(Session nodeSession
) {
108 Node homeNode
= UserJcrUtils
.getUserHome(nodeSession
);
109 if (homeNode
== null) // anonymous
110 throw new SlcException("User must be authenticated.");
112 // make sure base directory is available
113 Node repos
= JcrUtils
.mkdirs(nodeSession
, homeNode
.getPath()
114 + RepoConstants
.REPOSITORIES_BASE_PATH
);
115 if (nodeSession
.hasPendingChanges())
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
);
133 } catch (RepositoryException e
) {
134 throw new SlcException("Cannot initialize model", e
);
138 /* DEPENDENCY INJECTION */
139 public void setRepositoryFactory(RepositoryFactory repositoryFactory
) {
140 this.repositoryFactory
= repositoryFactory
;
143 public void setKeyring(Keyring keyring
) {
144 this.keyring
= keyring
;