JCR Explorer with keyring integration
authorMathieu Baudier <mbaudier@argeo.org>
Sun, 2 Oct 2011 17:53:53 +0000 (17:53 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Sun, 2 Oct 2011 17:53:53 +0000 (17:53 +0000)
git-svn-id: https://svn.argeo.org/commons/trunk@4774 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

18 files changed:
eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/remote_connected.gif [new file with mode: 0644]
eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/remote_disconnected.gif [new file with mode: 0644]
eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/repository.gif [deleted file]
eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/workspace.gif [deleted file]
eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/JcrImages.java
server/modules/org.argeo.node.repofactory.jackrabbit/META-INF/spring/repofactory-osgi.xml
server/plugins/org.argeo.jcr.ui.explorer/META-INF/spring/commands.xml
server/plugins/org.argeo.jcr.ui.explorer/META-INF/spring/jcr.xml
server/plugins/org.argeo.jcr.ui.explorer/META-INF/spring/osgi.xml
server/plugins/org.argeo.jcr.ui.explorer/META-INF/spring/views.xml
server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/browser/NodeContentProvider.java
server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/browser/NodeLabelProvider.java
server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/commands/AddRemoteRepository.java
server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/model/RemoteRepositoryNode.java [new file with mode: 0644]
server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/model/RepositoriesNode.java
server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/model/RepositoryNode.java
server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/model/WorkspaceNode.java
server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/views/GenericJcrBrowser.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 (file)
index 0000000..1492b4e
Binary files /dev/null and b/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/remote_connected.gif differ
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 (file)
index 0000000..6c54da9
Binary files /dev/null and b/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/remote_disconnected.gif differ
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 (file)
index ef7809c..0000000
Binary files a/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/repository.gif and /dev/null differ
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 (file)
index 0df0f5d..0000000
Binary files a/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/workspace.gif and /dev/null differ
index c99e3f572dc553ce4ffb7f71ed9e464a2a5ca039..b9566d7ea32956e9c79b387475a73df0248b6561 100644 (file)
@@ -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();
+
 }
index b54f422c9f383e07f33df7e6d224b1dd6154f1c0..afd93565862c7322cec9981646a4f3ab28a264c1 100644 (file)
@@ -18,4 +18,5 @@
 \r
        <!-- SERVICES -->\r
        <service ref="repositoryFactory" interface="javax.jcr.RepositoryFactory" />\r
+       <service ref="repositoryFactory" interface="org.argeo.jcr.RepositoryRegister" />\r
 </beans:beans>
\ No newline at end of file
index 8a2f071eb6dbe06c158722069d7a864e51a8343f..f77487f1d92481b4c0f3d5a984409c83608fcbb0 100644 (file)
@@ -21,7 +21,7 @@
 
 
        <bean id="addRemoteRepository" class="org.argeo.jcr.ui.explorer.commands.AddRemoteRepository">
-               <property name="repositoryFactory" ref="repositoryFactory" />
+               <property name="repositoryFactory" ref="repositoryRegister" />
                <property name="bundleContext" ref="bundleContext" />
                <property name="keyring" ref="jcrKeyring" />
        </bean>
index 7869429d4e16fa612a718b1357613aab1284139c..37d7f4d883b35cc6809d968ffe8d98f81d96389e 100644 (file)
@@ -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">
 
-       <bean id="repositoryRegister" class="org.argeo.jcr.DefaultRepositoryRegister">
-       </bean>
-
        <bean id="nodeSession" class="org.argeo.jcr.spring.ThreadBoundSession">
                <property name="repository" ref="nodeRepository" />
        </bean>
index 6771ecc560769c76b768dff98a71a2aead49def8..d514a2a4e57383a8c1501e9995a80b994d7cf4c2 100644 (file)
@@ -8,13 +8,7 @@
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"\r
        osgi:default-timeout="30000">\r
 \r
-       <set id="repositories" interface="javax.jcr.Repository"\r
-               cardinality="0..N">\r
-               <listener ref="repositoryRegister" bind-method="register"\r
-                       unbind-method="unregister" />\r
-       </set>\r
-\r
-       <reference id="repositoryFactory" interface="javax.jcr.RepositoryFactory" />\r
+       <reference id="repositoryRegister" interface="org.argeo.jcr.RepositoryRegister" />\r
 \r
        <reference id="nodeRepository" interface="javax.jcr.Repository"\r
                filter="(argeo.jcr.repository.alias=node)" />\r
index 975dc5404716321ecfe6cce6e7abc94297512d8d..6cda684b4667d294f00b46a227fc3a2e7ae41503 100644 (file)
@@ -7,6 +7,7 @@
        <!-- Views -->
        <bean id="browserView" class="org.argeo.jcr.ui.explorer.views.GenericJcrBrowser"
                scope="prototype">
+               <property name="jcrKeyring" ref="jcrKeyring" />
                <property name="repositoryRegister" ref="repositoryRegister" />
        </bean>
 </beans>
index c7b9cdd164ceb4c423e1815128bd04417b62b6a4..c0ae9c42256ccfa9c64edebf557dae378106411b 100644 (file)
@@ -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();
        }
 
index cee1370ecbe7a003e7d1217e1a1880cd00ae4953..0521383a1838a8cc479bd96ddd9006e7c6b1540d 100644 (file)
@@ -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());
index f784bb6985af2d20a8931ee37c6e14189c02e6ed..e691b8fb65dd4a3740b90164da8b7a2265b0174c 100644 (file)
@@ -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<String, String> params = new Hashtable<String, String>();
+                               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<String, String> params = new Hashtable<String, String>();
-                       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<String, String> params = new Hashtable<String, String>();
@@ -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 (file)
index 0000000..d3e0326
--- /dev/null
@@ -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, ' ');
+               }
+       }
+
+}
index 83a1f589885a1d0d69558edd6501fb436913555b..6634603aa18fe4bf28a033ba51b2db644efe0aa4 100644 (file)
@@ -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<String, String> params = new Hashtable<String, String>();
+                                       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
index 97759a651d06e6a8b0a65f528826dba85ee7258c..b4d16603d030504d52eca89f2d15a555156afb87 100644 (file)
@@ -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;
        }
index 58c9c83bc3efa24fdd3c25009145712ded086f3f..63c56349ae8d7e2badcbe873e357e33d92f4c0d6 100644 (file)
@@ -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) {
index ee28eb863ec6dfed819fd5cc5961574447b5998b..da015010f9e0fe1d32c7d3a66371b96c017d7ce6 100644 (file)
@@ -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;
        }
 
 }