2 * Copyright (C) 2007-2012 Argeo GmbH
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package org
.argeo
.cms
.ui
.jcr
.model
;
20 import javax
.jcr
.Node
;
21 import javax
.jcr
.NodeIterator
;
22 import javax
.jcr
.Repository
;
23 import javax
.jcr
.RepositoryException
;
24 import javax
.jcr
.RepositoryFactory
;
25 import javax
.jcr
.Session
;
27 import org
.argeo
.api
.NodeUtils
;
28 import org
.argeo
.api
.security
.Keyring
;
29 import org
.argeo
.cms
.ArgeoNames
;
30 import org
.argeo
.cms
.ui
.jcr
.RepositoryRegister
;
31 import org
.argeo
.eclipse
.ui
.EclipseUiException
;
32 import org
.argeo
.eclipse
.ui
.TreeParent
;
33 import org
.argeo
.eclipse
.ui
.dialogs
.ErrorFeedback
;
36 * UI Tree component that implements the Argeo abstraction of a
37 * {@link RepositoryFactory} that enable a user to "mount" various repositories
38 * in a single Tree like View. It is usually meant to be at the root of the UI
39 * Tree and thus {@link getParent()} method will return null.
41 * The {@link RepositoryFactory} is injected at instantiation time and must be
42 * use get or register new {@link Repository} objects upon which a reference is
46 public class RepositoriesElem
extends TreeParent
implements ArgeoNames
{
47 private final RepositoryRegister repositoryRegister
;
48 private final RepositoryFactory repositoryFactory
;
51 * A session of the logged in user on the default workspace of the node
54 private final Session userSession
;
55 private final Keyring keyring
;
57 public RepositoriesElem(String name
, RepositoryRegister repositoryRegister
, RepositoryFactory repositoryFactory
,
58 TreeParent parent
, Session userSession
, Keyring keyring
) {
60 this.repositoryRegister
= repositoryRegister
;
61 this.repositoryFactory
= repositoryFactory
;
62 this.userSession
= userSession
;
63 this.keyring
= keyring
;
67 * Override normal behavior to initialize the various repositories only at
71 public synchronized Object
[] getChildren() {
73 return super.getChildren();
75 // initialize current object
76 Map
<String
, Repository
> refRepos
= repositoryRegister
.getRepositories();
77 for (String name
: refRepos
.keySet()) {
78 Repository repository
= refRepos
.get(name
);
79 // if (repository instanceof MaintainedRepository)
80 // super.addChild(new MaintainedRepositoryElem(name,
81 // repository, this));
83 super.addChild(new RepositoryElem(name
, repository
, this));
87 if (keyring
!= null) {
89 addRemoteRepositories(keyring
);
90 } catch (RepositoryException e
) {
91 throw new EclipseUiException("Cannot browse remote repositories", e
);
94 return super.getChildren();
98 protected void addRemoteRepositories(Keyring jcrKeyring
) throws RepositoryException
{
99 Node userHome
= NodeUtils
.getUserHome(userSession
);
100 if (userHome
!= null && userHome
.hasNode(ARGEO_REMOTE
)) {
101 NodeIterator it
= userHome
.getNode(ARGEO_REMOTE
).getNodes();
102 while (it
.hasNext()) {
103 Node remoteNode
= it
.nextNode();
104 String uri
= remoteNode
.getProperty(ARGEO_URI
).getString();
106 RemoteRepositoryElem remoteRepositoryNode
= new RemoteRepositoryElem(remoteNode
.getName(),
107 repositoryFactory
, uri
, this, userSession
, jcrKeyring
, remoteNode
.getPath());
108 super.addChild(remoteRepositoryNode
);
109 } catch (Exception e
) {
110 ErrorFeedback
.show("Cannot add remote repository " + remoteNode
, e
);
116 public void registerNewRepository(String alias
, Repository repository
) {
117 // TODO: implement this
118 // Create a new RepositoryNode Object
120 // super.addChild(new RepositoriesNode(...));
123 /** Returns the {@link RepositoryRegister} wrapped by this object. */
124 public RepositoryRegister
getRepositoryRegister() {
125 return repositoryRegister
;