From 82e079d95c38d7136944d79394b9efd82a2864dd Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Sun, 2 Oct 2011 17:53:53 +0000 Subject: [PATCH] JCR Explorer with keyring integration git-svn-id: https://svn.argeo.org/commons/trunk@4774 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../icons/remote_connected.gif | Bin 0 -> 159 bytes .../icons/remote_disconnected.gif | Bin 0 -> 155 bytes .../icons/repository.gif | Bin 198 -> 0 bytes .../icons/workspace.gif | Bin 358 -> 0 bytes .../org/argeo/eclipse/ui/jcr/JcrImages.java | 17 +++++ .../META-INF/spring/repofactory-osgi.xml | 1 + .../META-INF/spring/commands.xml | 2 +- .../META-INF/spring/jcr.xml | 3 - .../META-INF/spring/osgi.xml | 8 +-- .../META-INF/spring/views.xml | 1 + .../explorer/browser/NodeContentProvider.java | 9 ++- .../explorer/browser/NodeLabelProvider.java | 22 ++++--- .../commands/AddRemoteRepository.java | 60 ++++++++++-------- .../explorer/model/RemoteRepositoryNode.java | 44 +++++++++++++ .../ui/explorer/model/RepositoriesNode.java | 58 ++++++++++++++++- .../jcr/ui/explorer/model/RepositoryNode.java | 15 ++--- .../jcr/ui/explorer/model/WorkspaceNode.java | 11 +--- .../ui/explorer/views/GenericJcrBrowser.java | 58 ++++++++--------- 18 files changed, 208 insertions(+), 101 deletions(-) create mode 100644 eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/remote_connected.gif create mode 100644 eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/remote_disconnected.gif delete mode 100644 eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/repository.gif delete mode 100644 eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/workspace.gif create mode 100644 server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/model/RemoteRepositoryNode.java diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/remote_connected.gif b/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/remote_connected.gif new file mode 100644 index 0000000000000000000000000000000000000000..1492b4efae265051c43c5f2870c1f71f97c899e3 GIT binary patch literal 159 zcmZ?wbhEHb6krfw*v!CSZy#S@Z~y=Q{QLL!|G#g4f4+Tvy#4+Q8p}12WsEYxhqZ46z5UO4 xC{IX5qW?tG!t@NQxhzk8CmDO_&kQNvl+j$RV9uyFP1Eu=fc2X4FC}0Hs=5U literal 0 HcmV?d00001 diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/remote_disconnected.gif b/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/remote_disconnected.gif new file mode 100644 index 0000000000000000000000000000000000000000..6c54da9ad04e75a4d661cde11103d636f93d003d GIT binary patch literal 155 zcmZ?wbhEHb6krfw*v!E2|NsBjuU{`)wrug@#S0fMoHuXYtXZ?BPoLh`*Vo?O-q6rc zTwI)ykpWc300xRbSr{1@co}p+Jdha-EFK$9dakw&zEL&p%2fxEV~JG{)JlUE`OP?D z!tp7LBO$spo_UuSlZOsdj7V$IN)8qgb5G%_nP;YGg)w^yPV`w5a_zD}ep0G83xhQP D%T+uT literal 0 HcmV?d00001 diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/repository.gif b/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/repository.gif deleted file mode 100644 index ef7809c94940a4e3eb6f9c32c054dbc74391a56c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 198 zcmV;%06G6hNk%w1VGsZi0J9DNe}I3VpP#?n+rYoTt*)(re}KQgzu(`#|KH#4?(Se; zU|(Qg_V)JC(b50^{{R30A^8LW000gEEC2ui01yBW000DY&`H*ay^TqkY!D!V2!oYK zL@PuBrpT&4Z;eY15hXcc!A`xC?p09gTdhtg&AiH#nW&Q7z_c$qRB)m ziPvF46`e-GX+U<{{f5W0a`MbXt)Ws>18_199XwxkU;qRs8;3`cjT@AemJSgBJ07u8 AR{#J2 diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/workspace.gif b/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/workspace.gif deleted file mode 100644 index 0df0f5dacd545e652debd97a6a8ee9842f6f2f96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 358 zcmZ?wbhEHb6krfwxXQrrntkPT2`)iZP@J9x-GD4NAi^YxpNK|&Oh3)@^t&!b2E2cyYu?l z`Ny{dr)3vz@3x*E?K~&Re{pW?>dMSb&BjfBb*28*#Q_~vKFwu*vs+xJGOAcl@EIM*h`O%DoP7%)5A6m0due;%3k#U&i!w!aJdHfvBQx`0rxc*8`t`0*D zLmPumgNrVwl9UwZ1l_JO4Q?4l#p&D{rMVTFTndbgTuU`w%CtD-rKLI6YXz#YDa*-i ZWm5}OXJ_5Nk6k@b_2{vqDuIp+)&TZCko^Dv diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/JcrImages.java b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/JcrImages.java index c99e3f572..b9566d7ea 100644 --- a/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/JcrImages.java +++ b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/JcrImages.java @@ -15,4 +15,21 @@ public class JcrImages { public final static Image HOME = JcrUiPlugin.getImageDescriptor( "icons/home.gif").createImage(); + public final static Image REPOSITORIES = JcrUiPlugin.getImageDescriptor( + "icons/repositories.gif").createImage(); + public final static Image REPOSITORY_DISCONNECTED = JcrUiPlugin + .getImageDescriptor("icons/repository_disconnected.gif") + .createImage(); + public final static Image REPOSITORY_CONNECTED = JcrUiPlugin + .getImageDescriptor("icons/repository_connected.gif").createImage(); + public final static Image REMOTE_DISCONNECTED = JcrUiPlugin + .getImageDescriptor("icons/remote_disconnected.gif").createImage(); + public final static Image REMOTE_CONNECTED = JcrUiPlugin + .getImageDescriptor("icons/remote_connected.gif").createImage(); + public final static Image WORKSPACE_DISCONNECTED = JcrUiPlugin + .getImageDescriptor("icons/workspace_disconnected.png") + .createImage(); + public final static Image WORKSPACE_CONNECTED = JcrUiPlugin + .getImageDescriptor("icons/workspace_connected.png").createImage(); + } diff --git a/server/modules/org.argeo.node.repofactory.jackrabbit/META-INF/spring/repofactory-osgi.xml b/server/modules/org.argeo.node.repofactory.jackrabbit/META-INF/spring/repofactory-osgi.xml index b54f422c9..afd935658 100644 --- a/server/modules/org.argeo.node.repofactory.jackrabbit/META-INF/spring/repofactory-osgi.xml +++ b/server/modules/org.argeo.node.repofactory.jackrabbit/META-INF/spring/repofactory-osgi.xml @@ -18,4 +18,5 @@ + \ No newline at end of file diff --git a/server/plugins/org.argeo.jcr.ui.explorer/META-INF/spring/commands.xml b/server/plugins/org.argeo.jcr.ui.explorer/META-INF/spring/commands.xml index 8a2f071eb..f77487f1d 100644 --- a/server/plugins/org.argeo.jcr.ui.explorer/META-INF/spring/commands.xml +++ b/server/plugins/org.argeo.jcr.ui.explorer/META-INF/spring/commands.xml @@ -21,7 +21,7 @@ - + diff --git a/server/plugins/org.argeo.jcr.ui.explorer/META-INF/spring/jcr.xml b/server/plugins/org.argeo.jcr.ui.explorer/META-INF/spring/jcr.xml index 7869429d4..37d7f4d88 100644 --- a/server/plugins/org.argeo.jcr.ui.explorer/META-INF/spring/jcr.xml +++ b/server/plugins/org.argeo.jcr.ui.explorer/META-INF/spring/jcr.xml @@ -5,9 +5,6 @@ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd"> - - - diff --git a/server/plugins/org.argeo.jcr.ui.explorer/META-INF/spring/osgi.xml b/server/plugins/org.argeo.jcr.ui.explorer/META-INF/spring/osgi.xml index 6771ecc56..d514a2a4e 100644 --- a/server/plugins/org.argeo.jcr.ui.explorer/META-INF/spring/osgi.xml +++ b/server/plugins/org.argeo.jcr.ui.explorer/META-INF/spring/osgi.xml @@ -8,13 +8,7 @@ http://www.springframework.org/schema/beans/spring-beans-2.5.xsd" osgi:default-timeout="30000"> - - - - - + diff --git a/server/plugins/org.argeo.jcr.ui.explorer/META-INF/spring/views.xml b/server/plugins/org.argeo.jcr.ui.explorer/META-INF/spring/views.xml index 975dc5404..6cda684b4 100644 --- a/server/plugins/org.argeo.jcr.ui.explorer/META-INF/spring/views.xml +++ b/server/plugins/org.argeo.jcr.ui.explorer/META-INF/spring/views.xml @@ -7,6 +7,7 @@ + diff --git a/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/browser/NodeContentProvider.java b/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/browser/NodeContentProvider.java index c7b9cdd16..c0ae9c422 100644 --- a/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/browser/NodeContentProvider.java +++ b/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/browser/NodeContentProvider.java @@ -10,6 +10,7 @@ import org.argeo.eclipse.ui.TreeParent; import org.argeo.jcr.ArgeoJcrConstants; import org.argeo.jcr.JcrUtils; import org.argeo.jcr.RepositoryRegister; +import org.argeo.jcr.security.JcrKeyring; import org.argeo.jcr.ui.explorer.model.RepositoriesNode; import org.argeo.jcr.ui.explorer.model.SingleJcrNode; import org.eclipse.jface.viewers.ITreeContentProvider; @@ -27,13 +28,15 @@ public class NodeContentProvider implements ITreeContentProvider { // Business Objects private RepositoryRegister repositoryRegister; private Session userSession; + private JcrKeyring jcrKeyring; // Utils // private ItemComparator itemComparator = new ItemComparator(); - public NodeContentProvider(Session userSession, + public NodeContentProvider(JcrKeyring jcrKeyring, RepositoryRegister repositoryRegister) { - this.userSession = userSession; + this.userSession = jcrKeyring != null ? jcrKeyring.getSession() : null; + this.jcrKeyring = jcrKeyring; this.repositoryRegister = repositoryRegister; } @@ -52,7 +55,7 @@ public class NodeContentProvider implements ITreeContentProvider { } if (repositoryRegister != null) objs.add(new RepositoriesNode("Repositories", repositoryRegister, - null)); + null, jcrKeyring)); return objs.toArray(); } diff --git a/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/browser/NodeLabelProvider.java b/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/browser/NodeLabelProvider.java index cee1370ec..0521383a1 100644 --- a/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/browser/NodeLabelProvider.java +++ b/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/browser/NodeLabelProvider.java @@ -6,7 +6,8 @@ import javax.jcr.nodetype.NodeType; import org.argeo.ArgeoException; import org.argeo.eclipse.ui.jcr.DefaultNodeLabelProvider; -import org.argeo.eclipse.ui.jcr.JcrUiPlugin; +import org.argeo.eclipse.ui.jcr.JcrImages; +import org.argeo.jcr.ui.explorer.model.RemoteRepositoryNode; import org.argeo.jcr.ui.explorer.model.RepositoriesNode; import org.argeo.jcr.ui.explorer.model.RepositoryNode; import org.argeo.jcr.ui.explorer.model.SingleJcrNode; @@ -15,8 +16,6 @@ import org.eclipse.swt.graphics.Image; public class NodeLabelProvider extends DefaultNodeLabelProvider { // Images - public final static Image REPOSITORIES = JcrUiPlugin.getImageDescriptor( - "icons/repositories.gif").createImage(); public String getText(Object element) { try { @@ -43,18 +42,23 @@ public class NodeLabelProvider extends DefaultNodeLabelProvider { @Override public Image getImage(Object element) { - if (element instanceof RepositoryNode) { + if (element instanceof RemoteRepositoryNode) { + if (((RemoteRepositoryNode) element).getDefaultSession() == null) + return JcrImages.REMOTE_DISCONNECTED; + else + return JcrImages.REMOTE_CONNECTED; + } else if (element instanceof RepositoryNode) { if (((RepositoryNode) element).getDefaultSession() == null) - return RepositoryNode.REPOSITORY_DISCONNECTED; + return JcrImages.REPOSITORY_DISCONNECTED; else - return RepositoryNode.REPOSITORY_CONNECTED; + return JcrImages.REPOSITORY_CONNECTED; } else if (element instanceof WorkspaceNode) { if (((WorkspaceNode) element).getSession() == null) - return WorkspaceNode.WORKSPACE_DISCONNECTED; + return JcrImages.WORKSPACE_DISCONNECTED; else - return WorkspaceNode.WORKSPACE_CONNECTED; + return JcrImages.WORKSPACE_CONNECTED; } else if (element instanceof RepositoriesNode) { - return REPOSITORIES; + return JcrImages.REPOSITORIES; } else if (element instanceof SingleJcrNode) try { return super.getImage(((SingleJcrNode) element).getNode()); diff --git a/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/commands/AddRemoteRepository.java b/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/commands/AddRemoteRepository.java index f784bb698..e691b8fb6 100644 --- a/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/commands/AddRemoteRepository.java +++ b/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/commands/AddRemoteRepository.java @@ -9,6 +9,7 @@ import javax.jcr.RepositoryFactory; import javax.jcr.Session; import javax.jcr.SimpleCredentials; +import org.argeo.ArgeoException; import org.argeo.eclipse.ui.ErrorFeedback; import org.argeo.jcr.ArgeoJcrConstants; import org.argeo.jcr.ArgeoNames; @@ -53,29 +54,30 @@ public class AddRemoteRepository extends AbstractHandler implements public Object execute(ExecutionEvent event) throws ExecutionException { String uri = null; if (event.getParameters().containsKey(PARAM_REPOSITORY_URI)) { + // FIXME remove this uri = event.getParameter(PARAM_REPOSITORY_URI); + if (uri == null) + return null; + + try { + Hashtable params = new Hashtable(); + params.put(ArgeoJcrConstants.JCR_REPOSITORY_URI, uri); + // by default we use the URI as alias + params.put(ArgeoJcrConstants.JCR_REPOSITORY_ALIAS, uri); + Repository repository = repositoryFactory.getRepository(params); + bundleContext.registerService(Repository.class.getName(), + repository, params); + } catch (Exception e) { + ErrorFeedback.show("Cannot add remote repository " + uri, e); + } } else { RemoteRepositoryLoginDialog dlg = new RemoteRepositoryLoginDialog( Display.getDefault().getActiveShell()); if (dlg.open() == Dialog.OK) { - uri = dlg.getUri(); + // uri = dlg.getUri(); } } - if (uri == null) - return null; - - try { - Hashtable params = new Hashtable(); - params.put(ArgeoJcrConstants.JCR_REPOSITORY_URI, uri); - // by default we use the URI as alias - params.put(ArgeoJcrConstants.JCR_REPOSITORY_ALIAS, uri); - Repository repository = repositoryFactory.getRepository(params); - bundleContext.registerService(Repository.class.getName(), - repository, params); - } catch (Exception e) { - ErrorFeedback.show("Cannot add remote repository " + uri, e); - } return null; } @@ -92,9 +94,8 @@ public class AddRemoteRepository extends AbstractHandler implements } class RemoteRepositoryLoginDialog extends TitleAreaDialog { - private String uri; private Text name; - private Text uriText; + private Text uri; private Text username; private Text password; @@ -116,7 +117,7 @@ public class AddRemoteRepository extends AbstractHandler implements false)); setMessage("Login to remote repository", IMessageProvider.NONE); name = createLT(composite, "Name", "remoteRepository"); - uriText = createLT(composite, "URI", + uri = createLT(composite, "URI", "http://localhost:7070/org.argeo.jcr.webapp/remoting/node"); username = createLT(composite, "User", ""); password = createLP(composite, "Password"); @@ -138,7 +139,7 @@ public class AddRemoteRepository extends AbstractHandler implements void testConnection() { Session session = null; try { - URI checkedUri = new URI(uriText.getText()); + URI checkedUri = new URI(uri.getText()); String checkedUriStr = checkedUri.toString(); Hashtable params = new Hashtable(); @@ -157,12 +158,11 @@ public class AddRemoteRepository extends AbstractHandler implements username.getText(), pwd); session = repository.login(sc); MessageDialog.openInformation(getParentShell(), "Success", - "Connection to '" + uriText.getText() - + "' successful"); + "Connection to '" + uri.getText() + "' successful"); } } catch (Exception e) { ErrorFeedback.show( - "Connection test failed for " + uriText.getText(), e); + "Connection test failed for " + uri.getText(), e); } finally { JcrUtils.logoutQuietly(session); } @@ -175,18 +175,26 @@ public class AddRemoteRepository extends AbstractHandler implements Node home = JcrUtils.getUserHome(nodeSession); Node remote = home.hasNode(ARGEO_REMOTE) ? home .getNode(ARGEO_REMOTE) : home.addNode(ARGEO_REMOTE); + if (remote.hasNode(name.getText())) + throw new ArgeoException( + "There is already a remote repository named " + + name.getText()); Node remoteRepository = remote.addNode(name.getText(), ArgeoTypes.ARGEO_REMOTE_REPOSITORY); - remoteRepository.setProperty(ARGEO_URI, uriText.getText()); + remoteRepository.setProperty(ARGEO_URI, uri.getText()); remoteRepository.setProperty(ARGEO_USER_ID, username.getText()); Node pwd = remoteRepository.addNode(ARGEO_PASSWORD); keyring.set(pwd.getPath(), password.getText().toCharArray()); nodeSession.save(); + MessageDialog.openInformation( + getParentShell(), + "Repository Added", + "Remote repository '" + username.getText() + "@" + + uri.getText() + "' added"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } - uri = uriText.getText(); super.okPressed(); } @@ -206,9 +214,5 @@ public class AddRemoteRepository extends AbstractHandler implements text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); return text; } - - public String getUri() { - return uri; - } } } diff --git a/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/model/RemoteRepositoryNode.java b/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/model/RemoteRepositoryNode.java new file mode 100644 index 000000000..d3e032668 --- /dev/null +++ b/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/model/RemoteRepositoryNode.java @@ -0,0 +1,44 @@ +package org.argeo.jcr.ui.explorer.model; + +import java.util.Arrays; + +import javax.jcr.Node; +import javax.jcr.Repository; +import javax.jcr.RepositoryException; +import javax.jcr.Session; +import javax.jcr.SimpleCredentials; + +import org.argeo.eclipse.ui.TreeParent; +import org.argeo.jcr.ArgeoNames; +import org.argeo.jcr.security.JcrKeyring; + +/** Root of a remote repository */ +public class RemoteRepositoryNode extends RepositoryNode { + private JcrKeyring jcrKeyring; + private String remoteNodePath; + + public RemoteRepositoryNode(String alias, Repository repository, + TreeParent parent, JcrKeyring jcrKeyring, String remoteNodePath) { + super(alias, repository, parent); + this.jcrKeyring = jcrKeyring; + this.remoteNodePath = remoteNodePath; + } + + @Override + protected Session repositoryLogin(String workspaceName) + throws RepositoryException { + Node remoteNode = jcrKeyring.getSession().getNode(remoteNodePath); + String userID = remoteNode.getProperty(ArgeoNames.ARGEO_USER_ID) + .getString(); + char[] password = jcrKeyring.getAsChars(remoteNodePath + "/" + + ArgeoNames.ARGEO_PASSWORD); + try { + SimpleCredentials credentials = new SimpleCredentials(userID, + password); + return getRepository().login(credentials, workspaceName); + } finally { + Arrays.fill(password, 0, password.length, ' '); + } + } + +} diff --git a/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/model/RepositoriesNode.java b/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/model/RepositoriesNode.java index 83a1f5898..6634603aa 100644 --- a/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/model/RepositoriesNode.java +++ b/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/model/RepositoriesNode.java @@ -1,12 +1,23 @@ package org.argeo.jcr.ui.explorer.model; +import java.util.Hashtable; import java.util.Map; +import javax.jcr.Node; +import javax.jcr.NodeIterator; import javax.jcr.Repository; +import javax.jcr.RepositoryException; import javax.jcr.RepositoryFactory; +import javax.jcr.Session; +import org.argeo.ArgeoException; +import org.argeo.eclipse.ui.ErrorFeedback; import org.argeo.eclipse.ui.TreeParent; +import org.argeo.jcr.ArgeoJcrConstants; +import org.argeo.jcr.ArgeoNames; +import org.argeo.jcr.JcrUtils; import org.argeo.jcr.RepositoryRegister; +import org.argeo.jcr.security.JcrKeyring; /** * UI Tree component. Implements the Argeo abstraction of a @@ -19,17 +30,20 @@ import org.argeo.jcr.RepositoryRegister; * kept here. */ -public class RepositoriesNode extends TreeParent { +public class RepositoriesNode extends TreeParent implements ArgeoNames { private final RepositoryRegister repositoryRegister; + private final JcrKeyring jcrKeyring; + public RepositoriesNode(String name, RepositoryRegister repositoryRegister, - TreeParent parent) { + TreeParent parent, JcrKeyring jcrKeyring) { super(name); this.repositoryRegister = repositoryRegister; + this.jcrKeyring = jcrKeyring; } /** - * Override normal behaviour to initialize the various repositories only at + * Override normal behavior to initialize the various repositories only at * request time */ @Override @@ -44,10 +58,48 @@ public class RepositoriesNode extends TreeParent { super.addChild(new RepositoryNode(name, refRepos.get(name), this)); } + + // remote + if (jcrKeyring != null) { + try { + addRemoteRepositories(jcrKeyring); + } catch (RepositoryException e) { + throw new ArgeoException( + "Cannot browse remote repositories", e); + } + } return super.getChildren(); } } + protected void addRemoteRepositories(JcrKeyring jcrKeyring) + throws RepositoryException { + Session userSession = jcrKeyring.getSession(); + Node userHome = JcrUtils.getUserHome(userSession); + if (userHome.hasNode(ARGEO_REMOTE)) { + NodeIterator it = userHome.getNode(ARGEO_REMOTE).getNodes(); + while (it.hasNext()) { + Node remoteNode = it.nextNode(); + String uri = remoteNode.getProperty(ARGEO_URI).getString(); + try { + Hashtable params = new Hashtable(); + params.put(ArgeoJcrConstants.JCR_REPOSITORY_URI, uri); + params.put(ArgeoJcrConstants.JCR_REPOSITORY_ALIAS, + remoteNode.getName()); + Repository repository = repositoryRegister + .getRepository(params); + RemoteRepositoryNode remoteRepositoryNode = new RemoteRepositoryNode( + remoteNode.getName(), repository, this, jcrKeyring, + remoteNode.getPath()); + super.addChild(remoteRepositoryNode); + } catch (Exception e) { + ErrorFeedback.show("Cannot add remote repository " + + remoteNode, e); + } + } + } + } + public void registerNewRepository(String alias, Repository repository) { // TODO: implement this // Create a new RepositoryNode Object diff --git a/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/model/RepositoryNode.java b/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/model/RepositoryNode.java index 97759a651..b4d16603d 100644 --- a/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/model/RepositoryNode.java +++ b/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/model/RepositoryNode.java @@ -6,8 +6,6 @@ import javax.jcr.Session; import org.argeo.ArgeoException; import org.argeo.eclipse.ui.TreeParent; -import org.argeo.eclipse.ui.jcr.JcrUiPlugin; -import org.eclipse.swt.graphics.Image; /** * UI Tree component. Wraps a JCR {@link Repository}. It also keeps a reference @@ -19,11 +17,6 @@ public class RepositoryNode extends TreeParent implements UiNode { private String alias; private final Repository repository; private Session defaultSession = null; - public final static Image REPOSITORY_DISCONNECTED = JcrUiPlugin - .getImageDescriptor("icons/repository_disconnected.gif") - .createImage(); - public final static Image REPOSITORY_CONNECTED = JcrUiPlugin - .getImageDescriptor("icons/repository_connected.gif").createImage(); /** Create a new repository with alias = name */ public RepositoryNode(String alias, Repository repository, TreeParent parent) { @@ -44,7 +37,7 @@ public class RepositoryNode extends TreeParent implements UiNode { // SimpleCredentials sc = new SimpleCredentials("root", // "demo".toCharArray()); // defaultSession = repository.login(sc); - defaultSession = repository.login(); + defaultSession = repositoryLogin(null); String[] wkpNames = defaultSession.getWorkspace() .getAccessibleWorkspaceNames(); for (String wkpName : wkpNames) { @@ -58,6 +51,12 @@ public class RepositoryNode extends TreeParent implements UiNode { } } + /** Actual call to the {@link Repository#login(javax.jcr.Credentials, String)} method. To be overridden.*/ + protected Session repositoryLogin(String workspaceName) + throws RepositoryException { + return repository.login(workspaceName); + } + public Session getDefaultSession() { return defaultSession; } diff --git a/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/model/WorkspaceNode.java b/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/model/WorkspaceNode.java index 58c9c83bc..63c56349a 100644 --- a/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/model/WorkspaceNode.java +++ b/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/model/WorkspaceNode.java @@ -10,8 +10,6 @@ import javax.jcr.observation.EventListener; import org.argeo.ArgeoException; import org.argeo.eclipse.ui.TreeParent; -import org.argeo.eclipse.ui.jcr.JcrUiPlugin; -import org.eclipse.swt.graphics.Image; /** * UI Tree component. Wraps the root node of a JCR {@link Workspace}. It also @@ -22,12 +20,6 @@ import org.eclipse.swt.graphics.Image; public class WorkspaceNode extends TreeParent implements EventListener, UiNode { private Session session = null; - public final static Image WORKSPACE_DISCONNECTED = JcrUiPlugin - .getImageDescriptor("icons/workspace_disconnected.png") - .createImage(); - public final static Image WORKSPACE_CONNECTED = JcrUiPlugin - .getImageDescriptor("icons/workspace_connected.png").createImage(); - public WorkspaceNode(RepositoryNode parent, String name) { this(parent, name, null); } @@ -59,8 +51,7 @@ public class WorkspaceNode extends TreeParent implements EventListener, UiNode { public void login() { try { logout(); - session = ((RepositoryNode) getParent()).getRepository().login( - getName()); + session = ((RepositoryNode) getParent()).repositoryLogin(getName()); processNewSession(session); } catch (RepositoryException e) { diff --git a/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/views/GenericJcrBrowser.java b/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/views/GenericJcrBrowser.java index ee28eb863..da015010f 100644 --- a/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/views/GenericJcrBrowser.java +++ b/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/views/GenericJcrBrowser.java @@ -5,7 +5,6 @@ import java.util.List; import javax.jcr.Property; import javax.jcr.PropertyType; -import javax.jcr.Repository; import javax.jcr.RepositoryException; import javax.jcr.Session; import javax.jcr.observation.Event; @@ -17,9 +16,8 @@ import org.argeo.eclipse.ui.TreeParent; import org.argeo.eclipse.ui.jcr.AsyncUiEventListener; import org.argeo.eclipse.ui.jcr.utils.NodeViewerComparer; import org.argeo.eclipse.ui.jcr.views.AbstractJcrBrowser; -import org.argeo.jcr.ArgeoJcrConstants; -import org.argeo.jcr.JcrUtils; import org.argeo.jcr.RepositoryRegister; +import org.argeo.jcr.security.JcrKeyring; import org.argeo.jcr.ui.explorer.browser.NodeContentProvider; import org.argeo.jcr.ui.explorer.browser.NodeLabelProvider; import org.argeo.jcr.ui.explorer.browser.PropertiesContentProvider; @@ -55,7 +53,7 @@ public class GenericJcrBrowser extends AbstractJcrBrowser { // LogFactory.getLog(GenericJcrBrowser.class); /* DEPENDENCY INJECTION */ - private Session session; + private JcrKeyring jcrKeyring; private RepositoryRegister repositoryRegister; // This page widgets @@ -73,19 +71,20 @@ public class GenericJcrBrowser extends AbstractJcrBrowser { public void createPartControl(Composite parent) { // look for session - Session nodeSession = session; - if (nodeSession == null) { - Repository nodeRepository = JcrUtils.getRepositoryByAlias( - repositoryRegister, ArgeoJcrConstants.ALIAS_NODE); - if (nodeRepository != null) - try { - nodeSession = nodeRepository.login(); - // TODO : enhance that to enable multirepository listener. - session = nodeSession; - } catch (RepositoryException e1) { - throw new ArgeoException("Cannot login to node repository"); - } - } + Session nodeSession = jcrKeyring != null ? jcrKeyring.getSession() + : null; + // if (nodeSession == null) { + // Repository nodeRepository = JcrUtils.getRepositoryByAlias( + // repositoryRegister, ArgeoJcrConstants.ALIAS_NODE); + // if (nodeRepository != null) + // try { + // nodeSession = nodeRepository.login(); + // // TODO : enhance that to enable multirepository listener. + // session = nodeSession; + // } catch (RepositoryException e1) { + // throw new ArgeoException("Cannot login to node repository"); + // } + // } // Instantiate the generic object that fits for // both RCP & RAP @@ -104,7 +103,7 @@ public class GenericJcrBrowser extends AbstractJcrBrowser { GridLayout gl = new GridLayout(1, false); top.setLayout(gl); - nodeContentProvider = new NodeContentProvider(nodeSession, + nodeContentProvider = new NodeContentProvider(jcrKeyring, repositoryRegister); // nodes viewer @@ -216,15 +215,16 @@ public class GenericJcrBrowser extends AbstractJcrBrowser { }); resultsObserver = new TreeObserver(tmpNodeViewer.getTree().getDisplay()); - try { - ObservationManager observationManager = session.getWorkspace() - .getObservationManager(); - observationManager.addEventListener(resultsObserver, - Event.PROPERTY_ADDED | Event.PROPERTY_CHANGED, "/", true, - null, null, false); - } catch (RepositoryException e) { - throw new ArgeoException("Cannot register listeners", e); - } + if (jcrKeyring != null) + try { + ObservationManager observationManager = jcrKeyring.getSession() + .getWorkspace().getObservationManager(); + observationManager.addEventListener(resultsObserver, + Event.PROPERTY_ADDED | Event.PROPERTY_CHANGED, "/", + true, null, null, false); + } catch (RepositoryException e) { + throw new ArgeoException("Cannot register listeners", e); + } tmpNodeViewer .addDoubleClickListener(new GenericNodeDoubleClickListener( @@ -290,8 +290,8 @@ public class GenericJcrBrowser extends AbstractJcrBrowser { this.repositoryRegister = repositoryRegister; } - public void setSession(Session session) { - this.session = session; + public void setJcrKeyring(JcrKeyring jcrKeyring) { + this.jcrKeyring = jcrKeyring; } } -- 2.30.2