enhance distribution UI
authorBruno Sinou <bsinou@argeo.org>
Tue, 5 Mar 2013 19:31:19 +0000 (19:31 +0000)
committerBruno Sinou <bsinou@argeo.org>
Tue, 5 Mar 2013 19:31:19 +0000 (19:31 +0000)
git-svn-id: https://svn.argeo.org/slc/trunk@6100 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

14 files changed:
plugins/org.argeo.slc.client.ui.dist/META-INF/spring/commands.xml
plugins/org.argeo.slc.client.ui.dist/plugin.xml
plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/DistImages.java
plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/AddRepository.java [deleted file]
plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/CreateWorkspace.java
plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/RegisterRepository.java [new file with mode: 0644]
plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/RepoSyncCommand.java
plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/ArtifactDetailsPage.java
plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/utils/ArtifactNamesComparator.java [new file with mode: 0644]
plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/utils/ArtifactsTableConfigurer.java
plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/utils/GenericDoubleClickListener.java
plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/views/DistributionsView.java
plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/wizards/FetchWizard.java
plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/wizards/RegisterRepoWizard.java [new file with mode: 0644]

index 6a43fd6a58c2bcb07d79168298418b51c789cfb1..c5dce5e2fd25e680b958942ec077f3555425b502 100644 (file)
@@ -63,7 +63,7 @@
                scope="prototype">
        </bean>
 
-       <bean id="addRepository" class="org.argeo.slc.client.ui.dist.commands.AddRepository">
+       <bean id="registerRepository" class="org.argeo.slc.client.ui.dist.commands.RegisterRepository">
                <property name="repositoryFactory" ref="repositoryFactory" />
                <property name="nodeRepository" ref="nodeRepository" />
                <property name="keyring" ref="keyring" />
index eede0bcbbe9cbb76d8296a4845ea88b9d16e0bd5..1d3935d5010bf9fef15d00863978cab9d0f077c5 100644 (file)
                        </commandParameter>
        </command>
                <command
-            id="org.argeo.slc.client.ui.dist.addRepository"
+            id="org.argeo.slc.client.ui.dist.registerRepository"
             defaultHandler="org.argeo.eclipse.spring.SpringCommandHandler"
             name="Add Repository">
        </command>
                <menuContribution
                locationURI="toolbar:org.argeo.slc.client.ui.dist.distributionsView">
             <command
-               commandId="org.argeo.slc.client.ui.dist.addRepository"
-                icon="icons/addItem.gif"
-                label="Add repository"
-                tooltip="Add a repository">
+               commandId="org.argeo.slc.client.ui.dist.registerRepository"
+                icon="icons/addRepo.gif"
+                label="Register repository"
+                tooltip="Register a remote repository">
             </command>
             <command
                commandId="org.argeo.slc.client.ui.dist.refreshDistributionsView"
index f88b8a95eef4b181b4f8e2fc51b0ac5f3275a4f1..d2756ff8a3fee9bef318eca022a694c65e99946b 100644 (file)
@@ -19,6 +19,7 @@ import org.eclipse.swt.graphics.Image;
 
 /** Shared icons. */
 public class DistImages {
+
        public final static Image IMG_ARTIFACT_BASE = DistPlugin
                        .getImageDescriptor("icons/artifactBase.gif").createImage();
        public final static Image IMG_ARTIFACT_VERSION_BASE = DistPlugin
@@ -26,7 +27,23 @@ public class DistImages {
        public final static Image IMG_FILE = DistPlugin.getImageDescriptor(
                        "icons/file.gif").createImage();
 
-       /** Icons to handle check boxes */
+       /* WORKSPACES */
+       public final static Image IMG_WKSP = DistPlugin.getImageDescriptor(
+                       "icons/distribution_perspective.gif").createImage();
+
+       /* REPOSITORIES */
+       public final static Image IMG_REPO = DistPlugin.getImageDescriptor(
+                       "icons/repo.gif").createImage();
+       public final static Image IMG_REPO_READONLY = DistPlugin
+                       .getImageDescriptor("icons/repoReadOnly.gif").createImage();
+       public final static Image IMG_ADD_REPO = DistPlugin.getImageDescriptor(
+                       "icons/addRepo.gif").createImage();
+       public final static Image IMG_REMOVE_REPO = DistPlugin.getImageDescriptor(
+                       "icons/artifactBase.gif").createImage();
+       public final static Image IMG_FETCH_REPO = DistPlugin.getImageDescriptor(
+                       "icons/fetchRepo.png").createImage();
+
+       /* CHECK BOXES */
        public final static Image CHECKED = DistPlugin.getImageDescriptor(
                        "icons/checked.gif").createImage();
        public final static Image UNCHECKED = DistPlugin.getImageDescriptor(
diff --git a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/AddRepository.java b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/AddRepository.java
deleted file mode 100644 (file)
index 7239548..0000000
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
- * Copyright (C) 2007-2012 Argeo GmbH
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *         http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.argeo.slc.client.ui.dist.commands;
-
-import java.net.URI;
-import java.util.Hashtable;
-
-import javax.jcr.Node;
-import javax.jcr.Property;
-import javax.jcr.Repository;
-import javax.jcr.RepositoryFactory;
-import javax.jcr.Session;
-import javax.jcr.SimpleCredentials;
-import javax.jcr.nodetype.NodeType;
-
-import org.argeo.ArgeoException;
-import org.argeo.eclipse.ui.ErrorFeedback;
-import org.argeo.jcr.ArgeoJcrConstants;
-import org.argeo.jcr.ArgeoJcrUtils;
-import org.argeo.jcr.ArgeoNames;
-import org.argeo.jcr.ArgeoTypes;
-import org.argeo.jcr.JcrUtils;
-import org.argeo.jcr.UserJcrUtils;
-import org.argeo.slc.client.ui.dist.DistPlugin;
-import org.argeo.slc.jcr.SlcNames;
-import org.argeo.slc.repo.RepoConstants;
-import org.argeo.util.security.Keyring;
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.dialogs.TitleAreaDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Connect to a remote repository.
- */
-public class AddRepository extends AbstractHandler implements ArgeoNames,
-               SlcNames {
-
-       public final static String ID = DistPlugin.ID + ".addRepository";
-       public final static String DEFAULT_LABEL = "Register a repository";
-       public final static String DEFAULT_ICON_PATH = "icons/addItem.gif";
-       
-       private RepositoryFactory repositoryFactory;
-       private Repository nodeRepository;
-       private Keyring keyring;
-
-       public Object execute(ExecutionEvent event) throws ExecutionException {
-               RemoteRepositoryLoginDialog dlg = new RemoteRepositoryLoginDialog(
-                               Display.getDefault().getActiveShell());
-               if (dlg.open() == Dialog.OK) {
-               }
-               return null;
-       }
-
-       public void setRepositoryFactory(RepositoryFactory repositoryFactory) {
-               this.repositoryFactory = repositoryFactory;
-       }
-
-       public void setKeyring(Keyring keyring) {
-               this.keyring = keyring;
-       }
-
-       public void setNodeRepository(Repository nodeRepository) {
-               this.nodeRepository = nodeRepository;
-       }
-
-       class RemoteRepositoryLoginDialog extends TitleAreaDialog {
-               private Text name;
-               private Text uri;
-               private Text username;
-               private Text password;
-               private Button saveInKeyring;
-
-               public RemoteRepositoryLoginDialog(Shell parentShell) {
-                       super(parentShell);
-               }
-
-               protected Point getInitialSize() {
-                       return new Point(600, 400);
-               }
-
-               protected Control createDialogArea(Composite parent) {
-                       Composite dialogarea = (Composite) super.createDialogArea(parent);
-                       dialogarea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,
-                                       true));
-                       Composite composite = new Composite(dialogarea, SWT.NONE);
-                       composite.setLayout(new GridLayout(2, false));
-                       composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,
-                                       false));
-                       setMessage("Login to remote repository", IMessageProvider.NONE);
-                       name = createLT(composite, "Name", "Example Java Repository");
-                       uri = createLT(composite, "URI",
-                                       "https://example.com/data/jcr/java");
-                       username = createLT(composite, "User", "");
-                       password = createLP(composite, "Password");
-
-                       saveInKeyring = createLC(composite, "Remember password", false);
-                       parent.pack();
-                       return composite;
-               }
-
-               @Override
-               protected void createButtonsForButtonBar(Composite parent) {
-                       super.createButtonsForButtonBar(parent);
-                       Button test = createButton(parent, 2, "Test", false);
-                       test.addSelectionListener(new SelectionAdapter() {
-                               public void widgetSelected(SelectionEvent arg0) {
-                                       testConnection();
-                               }
-                       });
-               }
-
-               void testConnection() {
-                       Session session = null;
-                       try {
-                               if (uri.getText().startsWith("http")) {// http, https
-                                       URI checkedUri = new URI(uri.getText());
-                                       String checkedUriStr = checkedUri.toString();
-                                       Hashtable<String, String> params = new Hashtable<String, String>();
-                                       params.put(ArgeoJcrConstants.JCR_REPOSITORY_URI,
-                                                       checkedUriStr);
-                                       Repository repository = ArgeoJcrUtils.getRepositoryByUri(
-                                                       repositoryFactory, checkedUriStr);
-                                       if (username.getText().trim().equals("")) {// anonymous
-                                               session = repository.login();
-                                       } else {
-                                               // FIXME use getTextChars() when upgrading to 3.7
-                                               // see
-                                               // https://bugs.eclipse.org/bugs/show_bug.cgi?id=297412
-                                               char[] pwd = password.getText().toCharArray();
-                                               SimpleCredentials sc = new SimpleCredentials(
-                                                               username.getText(), pwd);
-                                               session = repository.login(sc);
-                                       }
-                               } else {// alias
-                                       Repository repository = ArgeoJcrUtils.getRepositoryByAlias(
-                                                       repositoryFactory, uri.getText());
-                                       session = repository.login();
-                               }
-                               MessageDialog.openInformation(getParentShell(), "Success",
-                                               "Connection to '" + uri.getText() + "' successful");
-                       } catch (Exception e) {
-                               ErrorFeedback.show(
-                                               "Connection test failed for " + uri.getText(), e);
-                       } finally {
-                               JcrUtils.logoutQuietly(session);
-                       }
-               }
-
-               @Override
-               protected void okPressed() {
-                       Session nodeSession = null;
-                       try {
-                               nodeSession = nodeRepository.login();
-                               String reposPath = UserJcrUtils.getUserHome(nodeSession)
-                                               .getPath() + RepoConstants.REPOSITORIES_BASE_PATH;
-
-                               Node repos = nodeSession.getNode(reposPath);
-                               String repoNodeName = JcrUtils.replaceInvalidChars(name
-                                               .getText());
-                               if (repos.hasNode(repoNodeName))
-                                       throw new ArgeoException(
-                                                       "There is already a remote repository named "
-                                                                       + repoNodeName);
-                               Node repoNode = repos.addNode(repoNodeName,
-                                               ArgeoTypes.ARGEO_REMOTE_REPOSITORY);
-                               repoNode.setProperty(ARGEO_URI, uri.getText());
-                               repoNode.setProperty(ARGEO_USER_ID, username.getText());
-                               repoNode.addMixin(NodeType.MIX_TITLE);
-                               repoNode.setProperty(Property.JCR_TITLE, name.getText());
-                               nodeSession.save();
-                               if (saveInKeyring.getSelection()) {
-                                       String pwdPath = repoNode.getPath() + '/' + ARGEO_PASSWORD;
-                                       keyring.set(pwdPath, password.getText().toCharArray());
-                                       nodeSession.save();
-                               }
-                               MessageDialog.openInformation(getParentShell(),
-                                               "Repository Added",
-                                               "Remote repository " + uri.getText() + "' added");
-
-                               super.okPressed();
-                       } catch (Exception e) {
-                               ErrorFeedback.show("Cannot add remote repository", e);
-                       } finally {
-                               JcrUtils.logoutQuietly(nodeSession);
-                       }
-               }
-
-               /** Creates label and text. */
-               protected Text createLT(Composite parent, String label, String initial) {
-                       new Label(parent, SWT.NONE).setText(label);
-                       Text text = new Text(parent, SWT.SINGLE | SWT.LEAD | SWT.BORDER);
-                       text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-                       text.setText(initial);
-                       return text;
-               }
-
-               /** Creates label and check. */
-               protected Button createLC(Composite parent, String label,
-                               Boolean initial) {
-                       new Label(parent, SWT.NONE).setText(label);
-                       Button check = new Button(parent, SWT.CHECK);
-                       check.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-                       check.setSelection(initial);
-                       return check;
-               }
-
-               protected Text createLP(Composite parent, String label) {
-                       new Label(parent, SWT.NONE).setText(label);
-                       Text text = new Text(parent, SWT.SINGLE | SWT.LEAD | SWT.BORDER
-                                       | SWT.PASSWORD);
-                       text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-                       return text;
-               }
-       }
-}
index 812e6eebe01e4d35e0380f783d10a1f9fea15075..86cf1926b5f267446c36bff05df4b871f5489fc7 100644 (file)
@@ -29,6 +29,7 @@ import org.argeo.slc.client.ui.dist.utils.CommandHelpers;
 import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.dialogs.Dialog;
 import org.eclipse.jface.dialogs.InputDialog;
 import org.eclipse.ui.IWorkbenchWindow;
 
@@ -54,7 +55,12 @@ public class CreateWorkspace extends AbstractHandler {
                InputDialog inputDialog = new InputDialog(iww.getShell(),
                                "New workspace", "Choose a name for the workspace to create",
                                "", null);
-               inputDialog.open();
+               int result = inputDialog.open();
+
+               // Canceled by user
+               if (result == Dialog.CANCEL)
+                       return null;
+
                String workspaceName = inputDialog.getValue();
                Session session = null;
                try {
diff --git a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/RegisterRepository.java b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/RegisterRepository.java
new file mode 100644 (file)
index 0000000..805257a
--- /dev/null
@@ -0,0 +1,226 @@
+/*
+ * Copyright (C) 2007-2012 Argeo GmbH
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.argeo.slc.client.ui.dist.commands;
+
+import javax.jcr.Repository;
+import javax.jcr.RepositoryFactory;
+
+import org.argeo.jcr.ArgeoNames;
+import org.argeo.slc.client.ui.dist.DistPlugin;
+import org.argeo.slc.client.ui.dist.utils.CommandHelpers;
+import org.argeo.slc.client.ui.dist.wizards.RegisterRepoWizard;
+import org.argeo.slc.jcr.SlcNames;
+import org.argeo.util.security.Keyring;
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+/**
+ * Connect to a remote repository.
+ */
+public class RegisterRepository extends AbstractHandler implements ArgeoNames,
+               SlcNames {
+
+       public final static String ID = DistPlugin.ID + ".registerRepository";
+       public final static String DEFAULT_LABEL = "Register a repository";
+       public final static String DEFAULT_ICON_PATH = "icons/addRepo.gif";
+
+       /* DEPENDENCY INJECTION */
+       private RepositoryFactory repositoryFactory;
+       private Repository nodeRepository;
+       private Keyring keyring;
+
+       public Object execute(ExecutionEvent event) throws ExecutionException {
+               RegisterRepoWizard wizard = new RegisterRepoWizard(keyring,
+                               repositoryFactory, nodeRepository);
+               WizardDialog dialog = new WizardDialog(
+                               HandlerUtil.getActiveShell(event), wizard);
+               int result = dialog.open();
+               if (result == Dialog.OK)
+                       CommandHelpers.callCommand(RefreshDistributionsView.ID);
+
+               // RemoteRepositoryLoginDialog dlg = new RemoteRepositoryLoginDialog(
+               // Display.getDefault().getActiveShell());
+               // if (dlg.open() == Dialog.OK) {
+               // }
+               return null;
+       }
+
+       public void setRepositoryFactory(RepositoryFactory repositoryFactory) {
+               this.repositoryFactory = repositoryFactory;
+       }
+
+       public void setKeyring(Keyring keyring) {
+               this.keyring = keyring;
+       }
+
+       public void setNodeRepository(Repository nodeRepository) {
+               this.nodeRepository = nodeRepository;
+       }
+
+       // class RemoteRepositoryLoginDialog extends TitleAreaDialog {
+       // private Text name;
+       // private Text uri;
+       // private Text username;
+       // private Text password;
+       // private Button saveInKeyring;
+       //
+       // public RemoteRepositoryLoginDialog(Shell parentShell) {
+       // super(parentShell);
+       // }
+       //
+       // protected Point getInitialSize() {
+       // return new Point(600, 400);
+       // }
+       //
+       // protected Control createDialogArea(Composite parent) {
+       // Composite dialogarea = (Composite) super.createDialogArea(parent);
+       // dialogarea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,
+       // true));
+       // Composite composite = new Composite(dialogarea, SWT.NONE);
+       // composite.setLayout(new GridLayout(2, false));
+       // composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,
+       // false));
+       // setMessage("Login to remote repository", IMessageProvider.NONE);
+       // name = createLT(composite, "Name", "Example Java Repository");
+       // uri = createLT(composite, "URI",
+       // "https://example.com/data/jcr/java");
+       // username = createLT(composite, "User", "");
+       // password = createLP(composite, "Password");
+       //
+       // saveInKeyring = createLC(composite, "Remember password", false);
+       // parent.pack();
+       // return composite;
+       // }
+       //
+       // @Override
+       // protected void createButtonsForButtonBar(Composite parent) {
+       // super.createButtonsForButtonBar(parent);
+       // Button test = createButton(parent, 2, "Test", false);
+       // test.addSelectionListener(new SelectionAdapter() {
+       // public void widgetSelected(SelectionEvent arg0) {
+       // testConnection();
+       // }
+       // });
+       // }
+       //
+       // void testConnection() {
+       // Session session = null;
+       // try {
+       // if (uri.getText().startsWith("http")) {// http, https
+       // URI checkedUri = new URI(uri.getText());
+       // String checkedUriStr = checkedUri.toString();
+       // Hashtable<String, String> params = new Hashtable<String, String>();
+       // params.put(ArgeoJcrConstants.JCR_REPOSITORY_URI,
+       // checkedUriStr);
+       // Repository repository = ArgeoJcrUtils.getRepositoryByUri(
+       // repositoryFactory, checkedUriStr);
+       // if (username.getText().trim().equals("")) {// anonymous
+       // session = repository.login();
+       // } else {
+       // // FIXME use getTextChars() when upgrading to 3.7
+       // // see
+       // // https://bugs.eclipse.org/bugs/show_bug.cgi?id=297412
+       // char[] pwd = password.getText().toCharArray();
+       // SimpleCredentials sc = new SimpleCredentials(
+       // username.getText(), pwd);
+       // session = repository.login(sc);
+       // }
+       // } else {// alias
+       // Repository repository = ArgeoJcrUtils.getRepositoryByAlias(
+       // repositoryFactory, uri.getText());
+       // session = repository.login();
+       // }
+       // MessageDialog.openInformation(getParentShell(), "Success",
+       // "Connection to '" + uri.getText() + "' successful");
+       // } catch (Exception e) {
+       // ErrorFeedback.show(
+       // "Connection test failed for " + uri.getText(), e);
+       // } finally {
+       // JcrUtils.logoutQuietly(session);
+       // }
+       // }
+       //
+       // @Override
+       // protected void okPressed() {
+       // Session nodeSession = null;
+       // try {
+       // nodeSession = nodeRepository.login();
+       // String reposPath = UserJcrUtils.getUserHome(nodeSession)
+       // .getPath() + RepoConstants.REPOSITORIES_BASE_PATH;
+       //
+       // Node repos = nodeSession.getNode(reposPath);
+       // String repoNodeName = JcrUtils.replaceInvalidChars(name
+       // .getText());
+       // if (repos.hasNode(repoNodeName))
+       // throw new ArgeoException(
+       // "There is already a remote repository named "
+       // + repoNodeName);
+       // Node repoNode = repos.addNode(repoNodeName,
+       // ArgeoTypes.ARGEO_REMOTE_REPOSITORY);
+       // repoNode.setProperty(ARGEO_URI, uri.getText());
+       // repoNode.setProperty(ARGEO_USER_ID, username.getText());
+       // repoNode.addMixin(NodeType.MIX_TITLE);
+       // repoNode.setProperty(Property.JCR_TITLE, name.getText());
+       // nodeSession.save();
+       // if (saveInKeyring.getSelection()) {
+       // String pwdPath = repoNode.getPath() + '/' + ARGEO_PASSWORD;
+       // keyring.set(pwdPath, password.getText().toCharArray());
+       // nodeSession.save();
+       // }
+       // MessageDialog.openInformation(getParentShell(),
+       // "Repository Added",
+       // "Remote repository " + uri.getText() + "' added");
+       //
+       // super.okPressed();
+       // } catch (Exception e) {
+       // ErrorFeedback.show("Cannot add remote repository", e);
+       // } finally {
+       // JcrUtils.logoutQuietly(nodeSession);
+       // }
+       // }
+       //
+       // /** Creates label and text. */
+       // protected Text createLT(Composite parent, String label, String initial) {
+       // new Label(parent, SWT.NONE).setText(label);
+       // Text text = new Text(parent, SWT.SINGLE | SWT.LEAD | SWT.BORDER);
+       // text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+       // text.setText(initial);
+       // return text;
+       // }
+       //
+       // /** Creates label and check. */
+       // protected Button createLC(Composite parent, String label,
+       // Boolean initial) {
+       // new Label(parent, SWT.NONE).setText(label);
+       // Button check = new Button(parent, SWT.CHECK);
+       // check.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+       // check.setSelection(initial);
+       // return check;
+       // }
+       //
+       // protected Text createLP(Composite parent, String label) {
+       // new Label(parent, SWT.NONE).setText(label);
+       // Text text = new Text(parent, SWT.SINGLE | SWT.LEAD | SWT.BORDER
+       // | SWT.PASSWORD);
+       // text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+       // return text;
+       // }
+       // }
+}
index e780cdf43d175a39e05af1c2fdacee5ac393a045..5bbf4f405f4d88c4a067a7da6a9f996012274b45 100644 (file)
@@ -16,6 +16,7 @@ import org.argeo.util.security.Keyring;
 import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.dialogs.Dialog;
 import org.eclipse.jface.wizard.WizardDialog;
 import org.eclipse.ui.handlers.HandlerUtil;
 
@@ -25,31 +26,32 @@ public class RepoSyncCommand extends AbstractHandler {
 
        public final static String ID = DistPlugin.ID + ".repoSyncCommand";
        public final static String PARAM_TARGET_REPO = "targetRepoPath";
-       public final static String DEFAULT_LABEL = "Fetch ...";
-       public final static String DEFAULT_ICON_PATH = "icons/addItem.gif";
+       public final static String DEFAULT_LABEL = "Fetch...";
+       public final static String DEFAULT_ICON_PATH = "icons/fetchRepo.png";
 
        // DEPENDENCY INJECTION
        private Keyring keyring;
        private RepositoryFactory repositoryFactory;
        private Repository nodeRepository;
 
-       private Session currSession;
 
        public Object execute(ExecutionEvent event) throws ExecutionException {
+               Session currSession = null;
                try {
-                       currSession = nodeRepository.login();
                        // Target Repository
                        String targetRepoPath = event.getParameter(PARAM_TARGET_REPO);
+                       currSession = nodeRepository.login();
                        Node targetRepoNode = currSession.getNode(targetRepoPath);
 
                        FetchWizard wizard = new FetchWizard(keyring, repositoryFactory,
                                        nodeRepository);
                        wizard.setTargetRepoNode(targetRepoNode);
-
                        WizardDialog dialog = new WizardDialog(
                                        HandlerUtil.getActiveShell(event), wizard);
-                       dialog.open();
-                       CommandHelpers.callCommand(RefreshDistributionsView.ID);
+                       
+                       int result = dialog.open();
+                       if (result == Dialog.OK)
+                               CommandHelpers.callCommand(RefreshDistributionsView.ID);
                        return null;
                } catch (RepositoryException e) {
                        throw new SlcException("Unexpected error while fetching data", e);
index 25a8f940fbca776f5ce0e14b62bd667875373940..f350a722f3859cdf4ba30706299a37a0cf07e8b3 100644 (file)
@@ -26,8 +26,6 @@ import javax.jcr.RepositoryException;
 import javax.jcr.Value;
 import javax.jcr.nodetype.NodeType;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 import org.argeo.ArgeoException;
 import org.argeo.slc.client.ui.dist.DistImages;
 import org.argeo.slc.client.ui.dist.utils.DistUiHelpers;
@@ -58,7 +56,8 @@ import org.eclipse.ui.forms.widgets.ScrolledForm;
  */
 
 public class ArtifactDetailsPage extends FormPage implements SlcNames, SlcTypes {
-       private final static Log log = LogFactory.getLog(ArtifactDetailsPage.class);
+       // private final static Log log =
+       // LogFactory.getLog(ArtifactDetailsPage.class);
 
        // Main business Objects
        private Node currentNode;
diff --git a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/utils/ArtifactNamesComparator.java b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/utils/ArtifactNamesComparator.java
new file mode 100644 (file)
index 0000000..13b75fb
--- /dev/null
@@ -0,0 +1,73 @@
+package org.argeo.slc.client.ui.dist.utils;
+
+import org.argeo.eclipse.ui.TreeParent;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerComparator;
+
+/**
+ * Enable comparison of two names with form org.argeo.slc-1.2.x
+ */
+
+public class ArtifactNamesComparator extends ViewerComparator {
+
+       @Override
+       public int category(Object element) {
+               if (element instanceof String) {
+                       int lastInd = ((String) element).lastIndexOf('-');
+                       if (lastInd > 0)
+                               return 10;
+               }
+               // unvalid names always last
+               return 5;
+       }
+
+       @Override
+       public int compare(Viewer viewer, Object e1, Object e2) {
+               int cat1 = category(e1);
+               int cat2 = category(e2);
+
+               if (cat1 != cat2) {
+                       return cat1 - cat2;
+               }
+
+               int result = 0;
+
+               String s1, s2;
+
+               if (e1 instanceof TreeParent) {
+                       s1 = ((TreeParent) e1).getName();
+                       s2 = ((TreeParent) e2).getName();
+               } else {
+                       s1 = e1.toString();
+                       s2 = e2.toString();
+               }
+               
+               
+               int i1 = s1.lastIndexOf('-');
+               int i2 = s2.lastIndexOf('-'); 
+
+               
+               // Specific cases, unvalid Strings
+               if (i1 <0)
+                       if (i2 <0)
+                               return s1.compareTo(s2);
+                       else 
+                               return 1;
+               else 
+                       if (i2 <0)
+                               return -1;
+
+               String aPref = s1.substring(0, s1.lastIndexOf('-'));
+               String aSuf = s1.substring(s1.lastIndexOf('-'));
+
+               String bPref = s2.substring(0, s2.lastIndexOf('-'));
+               String bSuf = s2.substring(s2.lastIndexOf('-'));
+
+               result = aPref.compareTo(bPref);
+               if (result != 0)
+                       return result;
+               else
+                       return bSuf.compareTo(aSuf);
+
+       }
+}
\ No newline at end of file
index 21492723678bc20c9f18185098a9f2760efdf835..6505ddee07dec00a2fe33666911ea70ef70317d7 100644 (file)
@@ -25,8 +25,6 @@ import javax.jcr.RepositoryException;
 import javax.jcr.Value;
 import javax.jcr.query.Row;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 import org.argeo.ArgeoException;
 import org.argeo.eclipse.ui.GenericTableComparator;
 import org.argeo.slc.client.ui.dist.DistConstants;
@@ -48,8 +46,8 @@ import org.eclipse.swt.widgets.TableColumn;
  */
 public class ArtifactsTableConfigurer implements SlcNames, SlcTypes,
                DistConstants {
-       private final static Log log = LogFactory
-                       .getLog(ArtifactsTableConfigurer.class);
+       // private final static Log log = LogFactory
+       // .getLog(ArtifactsTableConfigurer.class);
        // Used in the comparator to be able to retrieve the value from a row
        // knowing the corresponding column index.
        private Map<Integer, String> indexToName = new HashMap<Integer, String>();
index 98612395a8af8c3aa60e25fa3829445d722af1d4..52fd904ca50cb75e7650ac9a1ac161e2c2fcbc26 100644 (file)
@@ -20,8 +20,6 @@ import javax.jcr.RepositoryException;
 import javax.jcr.nodetype.NodeType;
 import javax.jcr.query.Row;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 import org.argeo.ArgeoException;
 import org.argeo.eclipse.ui.jcr.utils.JcrFileProvider;
 import org.argeo.eclipse.ui.specific.FileHandler;
@@ -44,16 +42,16 @@ import org.eclipse.ui.PartInitException;
 public class GenericDoubleClickListener implements IDoubleClickListener,
                SlcTypes, SlcNames, DistConstants {
 
-       private final static Log log = LogFactory
-                       .getLog(GenericDoubleClickListener.class);
+       // private final static Log log = LogFactory
+       // .getLog(GenericDoubleClickListener.class);
 
-       private TreeViewer viewer;
+       //private TreeViewer viewer;
 
        private JcrFileProvider jfp;
        private FileHandler fileHandler;
 
        public GenericDoubleClickListener(TreeViewer viewer) {
-               this.viewer = viewer;
+               // this.viewer = viewer;
                jfp = new JcrFileProvider();
                fileHandler = new FileHandler(jfp);
        }
index dc37c34205837f0a882cd35a243723625e337c8e..3ca2ce9ab6eb98ee629ca8a22201ad37ded70dca 100644 (file)
@@ -45,17 +45,19 @@ import org.argeo.jcr.ArgeoTypes;
 import org.argeo.jcr.JcrUtils;
 import org.argeo.jcr.UserJcrUtils;
 import org.argeo.slc.SlcException;
+import org.argeo.slc.client.ui.dist.DistImages;
 import org.argeo.slc.client.ui.dist.DistPlugin;
-import org.argeo.slc.client.ui.dist.commands.AddRepository;
 import org.argeo.slc.client.ui.dist.commands.CopyWorkspace;
 import org.argeo.slc.client.ui.dist.commands.CreateWorkspace;
 import org.argeo.slc.client.ui.dist.commands.DeleteWorkspace;
 import org.argeo.slc.client.ui.dist.commands.ManageWorkspaceAuth;
 import org.argeo.slc.client.ui.dist.commands.NormalizeDistribution;
+import org.argeo.slc.client.ui.dist.commands.RegisterRepository;
 import org.argeo.slc.client.ui.dist.commands.RepoSyncCommand;
 import org.argeo.slc.client.ui.dist.commands.UnregisterRemoteRepo;
 import org.argeo.slc.client.ui.dist.editors.DistributionEditor;
 import org.argeo.slc.client.ui.dist.editors.DistributionEditorInput;
+import org.argeo.slc.client.ui.dist.utils.ArtifactNamesComparator;
 import org.argeo.slc.client.ui.dist.utils.CommandHelpers;
 import org.argeo.slc.jcr.SlcNames;
 import org.argeo.slc.repo.RepoConstants;
@@ -85,6 +87,7 @@ import org.eclipse.swt.dnd.DragSourceEvent;
 import org.eclipse.swt.dnd.TextTransfer;
 import org.eclipse.swt.dnd.Transfer;
 import org.eclipse.swt.dnd.TransferData;
+import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Menu;
 import org.eclipse.swt.widgets.Tree;
@@ -121,6 +124,16 @@ public class DistributionsView extends ViewPart implements SlcNames, ArgeoNames
                                        return ((RepoElem) element).getLabel();
                                return element.toString();
                        }
+
+                       @Override
+                       public Image getImage(Object element) {
+                               if (element instanceof RepoElem)
+                                       return DistImages.IMG_REPO;
+                               else if (element instanceof DistributionElem) {
+                                       return DistImages.IMG_WKSP;
+                               }
+                               return null;
+                       }
                });
 
                final Tree table = viewer.getTree();
@@ -129,6 +142,9 @@ public class DistributionsView extends ViewPart implements SlcNames, ArgeoNames
 
                viewer.setContentProvider(new DistributionsContentProvider());
                viewer.addDoubleClickListener(new DistributionsDCL());
+               viewer.setComparator(new ArtifactNamesComparator());
+               log.debug("Comparator set ");
+
                // Enable selection retrieving from outside the view
                getSite().setSelectionProvider(viewer);
 
@@ -223,8 +239,9 @@ public class DistributionsView extends ViewPart implements SlcNames, ArgeoNames
 
                                // Register a remote repository
                                CommandHelpers.refreshCommand(menuManager, window,
-                                               AddRepository.ID, AddRepository.DEFAULT_LABEL,
-                                               AddRepository.DEFAULT_ICON_PATH, !isDistribElem
+                                               RegisterRepository.ID,
+                                               RegisterRepository.DEFAULT_LABEL,
+                                               RegisterRepository.DEFAULT_ICON_PATH, !isDistribElem
                                                                && singleElement);
 
                                // Unregister a remote repository
@@ -340,7 +357,7 @@ public class DistributionsView extends ViewPart implements SlcNames, ArgeoNames
                }
 
                public Object getParent(Object element) {
-                       // TODO register repo elem in distirbution elem?
+                       // TODO register repo elem in distribution elem?
                        return null;
                }
 
@@ -407,13 +424,17 @@ public class DistributionsView extends ViewPart implements SlcNames, ArgeoNames
                                                .getAccessibleWorkspaceNames();
                                List<DistributionElem> distributionElems = new ArrayList<DistributionElem>();
                                for (String workspaceName : workspaceNames) {
-                                       Node workspaceNode = repoNode.hasNode(workspaceName) ? repoNode
-                                                       .getNode(workspaceName) : repoNode
-                                                       .addNode(workspaceName);
-                                       repoNode.getSession().save();
-                                       distributionElems.add(new DistributionElem(this,
-                                                       workspaceNode));
-                                       // FIXME remove deleted workspaces
+                                       // filter technical workspaces
+                                       // FIXME: rely on a more robust rule than just wksp name
+                                       if (workspaceName.lastIndexOf('-') > 0) {
+                                               Node workspaceNode = repoNode.hasNode(workspaceName) ? repoNode
+                                                               .getNode(workspaceName) : repoNode
+                                                               .addNode(workspaceName);
+                                               repoNode.getSession().save();
+                                               distributionElems.add(new DistributionElem(this,
+                                                               workspaceNode));
+                                               // FIXME remove deleted workspaces
+                                       }
                                }
                                return distributionElems.toArray();
                        } catch (RepositoryException e) {
index a3d86fcca66e5f028fb3ec2f42e798284f515bb0..44649f94e35c9302f228e202e1106b113f4bf414 100644 (file)
@@ -16,7 +16,6 @@
 package org.argeo.slc.client.ui.dist.wizards;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -36,9 +35,9 @@ import org.argeo.jcr.ArgeoTypes;
 import org.argeo.jcr.JcrUtils;
 import org.argeo.jcr.UserJcrUtils;
 import org.argeo.slc.SlcException;
-import org.argeo.slc.client.ui.dist.DistImages;
 import org.argeo.slc.client.ui.dist.DistPlugin;
 import org.argeo.slc.client.ui.dist.PrivilegedJob;
+import org.argeo.slc.client.ui.dist.utils.ArtifactNamesComparator;
 import org.argeo.slc.client.ui.dist.utils.ViewerUtils;
 import org.argeo.slc.repo.RepoConstants;
 import org.argeo.slc.repo.RepoSync;
@@ -48,12 +47,9 @@ import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.CheckboxCellEditor;
+import org.eclipse.jface.viewers.CheckboxTableViewer;
 import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.EditingSupport;
 import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.TableViewer;
 import org.eclipse.jface.viewers.TableViewerColumn;
 import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.jface.wizard.Wizard;
@@ -63,9 +59,9 @@ import org.eclipse.swt.events.ModifyEvent;
 import org.eclipse.swt.events.ModifyListener;
 import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Combo;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Label;
@@ -77,20 +73,17 @@ import org.eclipse.swt.widgets.Table;
  */
 public class FetchWizard extends Wizard {
 
+       // private final static Log log = LogFactory.getLog(FetchWizard.class);
+
        // Business objects
        private Keyring keyring;
        private RepositoryFactory repositoryFactory;
        private Session currSession;
-
-       // Caches the workspace list
-       private List<String> wkspToSync = new ArrayList<String>();
-
-       private TableViewer wkspViewer;
-
        private Node targetRepoNode, sourceRepoNode;
 
        // This page widget
        private DefineModelPage page;
+       private CheckboxTableViewer wkspViewer;
 
        public FetchWizard(Keyring keyring, RepositoryFactory repositoryFactory,
                        Repository nodeRepository) {
@@ -107,6 +100,7 @@ public class FetchWizard extends Wizard {
 
        @Override
        public void dispose() {
+               super.dispose();
                JcrUtils.logoutQuietly(currSession);
        }
 
@@ -115,7 +109,7 @@ public class FetchWizard extends Wizard {
                try {
                        page = new DefineModelPage();
                        addPage(page);
-                       setWindowTitle("Fetch ...");
+                       setWindowTitle("Fetch...");
                } catch (Exception e) {
                        throw new SlcException("Cannot add page to wizard ", e);
                }
@@ -142,7 +136,18 @@ public class FetchWizard extends Wizard {
                        Credentials sourceCredentials = RepoUtils.getRepositoryCredentials(
                                        keyring, sourceRepoNode);
 
-                       String msg = "Your are about to fetch data from repository: \n\t"
+                       String msg;
+
+                       // no workspace has been chosen, we return
+                       if (wkspViewer.getCheckedElements().length == 0) {
+                               msg = "No workspace has been chosen, and thus no fetch has been done.";
+                               MessageDialog.openWarning(DistPlugin.getDefault()
+                                               .getWorkbench().getDisplay().getActiveShell(),
+                                               "Warning", msg);
+                               return true;
+                       }
+
+                       msg = "Your are about to fetch data from repository: \n\t"
                                        + sourceRepoUri + "\ninto target repository: \n\t"
                                        + targetRepoUri + "\nDo you really want to proceed ?";
 
@@ -156,10 +161,12 @@ public class FetchWizard extends Wizard {
                                repoSync.setTargetRepoUri(targetRepoUri);
                                repoSync.setSourceRepoUri(sourceRepoUri);
 
-                               // / Specify workspaces to synchronise
-                               if (wkspToSync != null && wkspToSync.size() > 0)
-                                       repoSync.setSourceWkspList(wkspToSync);
-
+                               // Specify workspaces to synchronise
+                               List<String> wksps = new ArrayList<String>();
+                               for (Object obj : wkspViewer.getCheckedElements()) {
+                                       wksps.add((String) obj);
+                               }
+                               repoSync.setSourceWkspList(wksps);
                                FetchJob job = new FetchJob(repoSync);
                                job.setUser(true);
                                job.schedule();
@@ -208,7 +215,20 @@ public class FetchWizard extends Wizard {
                        gd.verticalAlignment = SWT.FILL;
                        wkspTable.setLayoutData(gd);
                        wkspTable.setLayout(new GridLayout(1, false));
-                       addFilesTablePart(wkspTable);
+                       addWkspTablePart(wkspTable);
+
+                       // Choose source repo
+                       final Button selectAllBtn = new Button(composite, SWT.CHECK);
+                       selectAllBtn.setText("Select/Unselect all");
+
+                       selectAllBtn.addSelectionListener(new SelectionListener() {
+                               public void widgetSelected(SelectionEvent e) {
+                                       wkspViewer.setAllChecked(selectAllBtn.getSelection());
+                               }
+
+                               public void widgetDefaultSelected(SelectionEvent e) {
+                               }
+                       });
 
                        chooseSourceRepoCmb.addModifyListener(new ModifyListener() {
                                public void modifyText(ModifyEvent e) {
@@ -220,8 +240,8 @@ public class FetchWizard extends Wizard {
                        });
 
                        // initialize to first avalaible repo
-                       chooseSourceRepoCmb.select(0);
-
+                       if (chooseSourceRepoCmb.getItemCount() > 0)
+                               chooseSourceRepoCmb.select(0);
                        // Compulsory
                        setControl(composite);
                }
@@ -263,49 +283,18 @@ public class FetchWizard extends Wizard {
                }
 
                // Create the workspaces table
-               private void addFilesTablePart(Composite parent) {
+               private void addWkspTablePart(Composite parent) {
 
-                       final Table table = new Table(parent, SWT.NONE | SWT.H_SCROLL
-                                       | SWT.V_SCROLL | SWT.BORDER);
+                       Table table = new Table(parent, SWT.H_SCROLL | SWT.V_SCROLL
+                                       | SWT.BORDER | SWT.CHECK);
                        table.setLayoutData(new GridData(SWT.LEFT, SWT.FILL, false, true));
                        table.setLinesVisible(true);
                        table.setHeaderVisible(true);
-                       wkspViewer = new TableViewer(table);
-
-                       // CHECKBOX COLUMN
-                       TableViewerColumn column = ViewerUtils.createTableViewerColumn(
-                                       wkspViewer, "", SWT.NONE, 20);
-                       column.setLabelProvider(new ColumnLabelProvider() {
-                               public String getText(Object element) {
-                                       return null;
-                               }
-
-                               public Image getImage(Object element) {
-                                       return wkspToSync.contains(element) ? DistImages.CHECKED
-                                                       : DistImages.UNCHECKED;
-                               }
-                       });
-                       column.setEditingSupport(new CheckboxEditingSupport(wkspViewer));
-                       // add select all option
-                       column.getColumn().addSelectionListener(new SelectionListener() {
-                               public void widgetSelected(SelectionEvent e) {
-                                       if (wkspToSync.size() > 0)
-                                               wkspToSync = new ArrayList<String>();
-                                       else {
-                                               String[] elements = (String[]) ((IStructuredContentProvider) wkspViewer
-                                                               .getContentProvider()).getElements(null);
-                                               wkspToSync = Arrays.asList(elements);
-                                       }
-                                       wkspViewer.refresh();
-                               }
-
-                               public void widgetDefaultSelected(SelectionEvent e) {
-                               }
-                       });
+                       wkspViewer = new CheckboxTableViewer(table);
 
                        // WORKSPACES COLUMN
-                       column = ViewerUtils.createTableViewerColumn(wkspViewer,
-                                       "Workspaces", SWT.NONE, 400);
+                       TableViewerColumn column = ViewerUtils.createTableViewerColumn(
+                                       wkspViewer, "Workspaces", SWT.NONE, 400);
                        column.setLabelProvider(new ColumnLabelProvider());
 
                        wkspViewer.setContentProvider(new IStructuredContentProvider() {
@@ -315,13 +304,15 @@ public class FetchWizard extends Wizard {
 
                                public void inputChanged(Viewer viewer, Object oldInput,
                                                Object newInput) {
-                                       // update current used repository
-                                       currSourceRepo = RepoUtils.getRepository(repositoryFactory,
-                                                       keyring, (Node) newInput);
-                                       currSourceCred = RepoUtils.getRepositoryCredentials(
-                                                       keyring, (Node) newInput);
-                                       // reset workspace list
-                                       wkspToSync = new ArrayList<String>();
+                                       if (newInput != null && newInput instanceof Node) {
+                                               // update current used repository
+                                               currSourceRepo = RepoUtils.getRepository(
+                                                               repositoryFactory, keyring, (Node) newInput);
+                                               currSourceCred = RepoUtils.getRepositoryCredentials(
+                                                               keyring, (Node) newInput);
+                                               // reset workspace list
+                                               wkspViewer.setAllChecked(false);
+                                       }
                                }
 
                                public void dispose() {
@@ -331,8 +322,13 @@ public class FetchWizard extends Wizard {
                                        Session session = null;
                                        try {
                                                session = currSourceRepo.login(currSourceCred);
-                                               return session.getWorkspace()
-                                                               .getAccessibleWorkspaceNames();
+                                               List<String> result = new ArrayList<String>();
+                                               // remove unvalid elements
+                                               for (String name : session.getWorkspace()
+                                                               .getAccessibleWorkspaceNames())
+                                                       if (name.lastIndexOf('-') > 0)
+                                                               result.add(name);
+                                               return result.toArray();
                                        } catch (RepositoryException e) {
                                                throw new SlcException(
                                                                "Unexpected error while initializing fetch wizard",
@@ -340,44 +336,10 @@ public class FetchWizard extends Wizard {
                                        } finally {
                                                JcrUtils.logoutQuietly(session);
                                        }
-
                                }
                        });
-               }
-
-               /** Select which file to import by editing a checkbox */
-               protected class CheckboxEditingSupport extends EditingSupport {
+                       wkspViewer.setComparator(new ArtifactNamesComparator());
 
-                       private final TableViewer viewer;
-
-                       public CheckboxEditingSupport(TableViewer viewer) {
-                               super(viewer);
-                               this.viewer = viewer;
-                       }
-
-                       @Override
-                       protected boolean canEdit(Object element) {
-                               return true;
-                       }
-
-                       @Override
-                       protected CellEditor getCellEditor(Object element) {
-                               return new CheckboxCellEditor(null, SWT.CHECK | SWT.READ_ONLY);
-                       }
-
-                       @Override
-                       protected Object getValue(Object element) {
-                               return wkspToSync.contains(element);
-                       }
-
-                       @Override
-                       protected void setValue(Object element, Object value) {
-                               if ((Boolean) value && !wkspToSync.contains(element))
-                                       wkspToSync.add((String) element);
-                               else if (!(Boolean) value && wkspToSync.contains(element))
-                                       wkspToSync.remove(element);
-                               viewer.refresh();
-                       }
                }
        }
 
@@ -414,42 +376,4 @@ public class FetchWizard extends Wizard {
        public void setSourceRepoNode(Node sourceRepoNode) {
                this.sourceRepoNode = sourceRepoNode;
        }
-
-       // private class FetchJob extends Job {
-       // private RepoSync repoSync;
-       // private final Authentication authentication;
-       // private Subject subject;
-       //
-       // public FetchJob(RepoSync repoSync) {
-       // super("Fetch");
-       // this.repoSync = repoSync;
-       // authentication = SecurityContextHolder.getContext()
-       // .getAuthentication();
-       // subject = Subject.getSubject(AccessController.getContext());
-       // }
-       //
-       // @Override
-       // protected IStatus run(final IProgressMonitor progressMonitor) {
-       // PrivilegedAction<IStatus> privilegedAction = new
-       // PrivilegedAction<IStatus>() {
-       // public IStatus run() {
-       // try {
-       // // SecurityContextHolder.setContext(securityContext);
-       // SecurityContextHolder.getContext().setAuthentication(
-       // authentication);
-       // ArgeoMonitor monitor = new EclipseArgeoMonitor(
-       // progressMonitor);
-       // repoSync.setMonitor(monitor);
-       // repoSync.run();
-       // } catch (Exception e) {
-       // return new Status(IStatus.ERROR, DistPlugin.ID,
-       // "Cannot fetch repository", e);
-       // }
-       // return Status.OK_STATUS;
-       // }
-       //
-       // };
-       // return Subject.doAs(subject, privilegedAction);
-       // }
-       // }
 }
\ No newline at end of file
diff --git a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/wizards/RegisterRepoWizard.java b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/wizards/RegisterRepoWizard.java
new file mode 100644 (file)
index 0000000..c38f42f
--- /dev/null
@@ -0,0 +1,277 @@
+/*
+ * Copyright (C) 2007-2012 Argeo GmbH
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.argeo.slc.client.ui.dist.wizards;
+
+import java.net.URI;
+import java.util.Hashtable;
+
+import javax.jcr.Node;
+import javax.jcr.Property;
+import javax.jcr.Repository;
+import javax.jcr.RepositoryFactory;
+import javax.jcr.Session;
+import javax.jcr.SimpleCredentials;
+import javax.jcr.nodetype.NodeType;
+
+import org.argeo.ArgeoException;
+import org.argeo.eclipse.ui.ErrorFeedback;
+import org.argeo.jcr.ArgeoJcrConstants;
+import org.argeo.jcr.ArgeoJcrUtils;
+import org.argeo.jcr.ArgeoNames;
+import org.argeo.jcr.ArgeoTypes;
+import org.argeo.jcr.JcrUtils;
+import org.argeo.jcr.UserJcrUtils;
+import org.argeo.slc.SlcException;
+import org.argeo.slc.repo.RepoConstants;
+import org.argeo.util.security.Keyring;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * 
+ * Registers a new remote repository in the current Node.
+ * 
+ */
+public class RegisterRepoWizard extends Wizard {
+
+       // Business objects
+       private Keyring keyring;
+       private RepositoryFactory repositoryFactory;
+       private Repository nodeRepository;
+
+       // Pages
+       private DefineModelPage page;
+
+       // Widgets of model page
+       private Text name;
+       private Text uri;
+       private Text username;
+       private Text password;
+       private Button saveInKeyring;
+
+       // Default values
+       private final static String DEFAULT_NAME = "Argeo public Repository";
+       private final static String DEFAULT_URI = "https://repo.argeo.org/data/pub/java";
+       private final static String DEFAULT_USER_NAME = "anonymous";
+       private final static boolean DEFAULT_ANONYMOUS = true;
+
+       public RegisterRepoWizard(Keyring keyring,
+                       RepositoryFactory repositoryFactory, Repository nodeRepository) {
+               super();
+               this.keyring = keyring;
+               this.repositoryFactory = repositoryFactory;
+               this.nodeRepository = nodeRepository;
+       }
+
+       @Override
+       public void addPages() {
+               try {
+                       page = new DefineModelPage();
+                       addPage(page);
+                       setWindowTitle("Register a new remote repository");
+               } catch (Exception e) {
+                       throw new SlcException("Cannot add page to wizard ", e);
+               }
+       }
+
+       @Override
+       public boolean performFinish() {
+               if (!canFinish())
+                       return false;
+
+               Session nodeSession = null;
+               try {
+                       nodeSession = nodeRepository.login();
+                       String reposPath = UserJcrUtils.getUserHome(nodeSession).getPath()
+                                       + RepoConstants.REPOSITORIES_BASE_PATH;
+
+                       Node repos = nodeSession.getNode(reposPath);
+                       String repoNodeName = JcrUtils.replaceInvalidChars(name.getText());
+                       if (repos.hasNode(repoNodeName))
+                               throw new ArgeoException(
+                                               "There is already a remote repository named "
+                                                               + repoNodeName);
+                       Node repoNode = repos.addNode(repoNodeName,
+                                       ArgeoTypes.ARGEO_REMOTE_REPOSITORY);
+                       repoNode.setProperty(ArgeoNames.ARGEO_URI, uri.getText());
+                       repoNode.setProperty(ArgeoNames.ARGEO_USER_ID, username.getText());
+                       repoNode.addMixin(NodeType.MIX_TITLE);
+                       repoNode.setProperty(Property.JCR_TITLE, name.getText());
+                       nodeSession.save();
+                       if (saveInKeyring.getSelection()) {
+                               String pwdPath = repoNode.getPath() + '/'
+                                               + ArgeoNames.ARGEO_PASSWORD;
+                               keyring.set(pwdPath, password.getText().toCharArray());
+                               nodeSession.save();
+                       }
+                       MessageDialog.openInformation(getShell(), "Repository Added",
+                                       "Remote repository " + uri.getText() + "' added");
+               } catch (Exception e) {
+                       ErrorFeedback.show("Cannot add remote repository", e);
+               } finally {
+                       JcrUtils.logoutQuietly(nodeSession);
+               }
+               return true;
+       }
+
+       private class DefineModelPage extends WizardPage {
+
+               public DefineModelPage() {
+                       super("Main");
+                       setTitle("Fill information to register a repository");
+               }
+
+               public void createControl(Composite parent) {
+
+                       // main layout
+                       Composite composite = new Composite(parent, SWT.NONE);
+                       composite.setLayout(new GridLayout(2, false));
+                       composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,
+                                       false));
+
+                       // Create various fields
+                       // setMessage("Login to remote repository", IMessageProvider.NONE);
+                       name = createLT(composite, "Name", DEFAULT_NAME);
+                       uri = createLT(composite, "URI", DEFAULT_URI);
+
+                       final Button anonymousLogin = createLC(composite,
+                                       "log as anonymous", true);
+                       anonymousLogin.addSelectionListener(new SelectionListener() {
+                               public void widgetSelected(SelectionEvent e) {
+                                       if (anonymousLogin.getSelection()) {
+                                               username.setText(DEFAULT_USER_NAME);
+                                               password.setText("");
+                                               username.setEnabled(false);
+                                               password.setEnabled(false);
+                                       } else {
+                                               username.setText("");
+                                               password.setText("");
+                                               username.setEnabled(true);
+                                               password.setEnabled(true);
+                                       }
+                               }
+
+                               public void widgetDefaultSelected(SelectionEvent e) {
+                               }
+                       });
+
+                       username = createLT(composite, "User", DEFAULT_USER_NAME);
+                       password = createLP(composite, "Password");
+                       saveInKeyring = createLC(composite, "Remember password", false);
+
+                       if (DEFAULT_ANONYMOUS) {
+                               username.setEnabled(false);
+                               password.setEnabled(false);
+                       }
+
+                       Button test = createButton(parent, "Test");
+                       test.addSelectionListener(new SelectionAdapter() {
+                               public void widgetSelected(SelectionEvent arg0) {
+                                       testConnection();
+                               }
+                       });
+
+                       // Compulsory
+                       setControl(composite);
+               }
+
+               /** Creates label and text. */
+               protected Text createLT(Composite parent, String label, String initial) {
+                       new Label(parent, SWT.NONE).setText(label);
+                       Text text = new Text(parent, SWT.SINGLE | SWT.LEAD | SWT.BORDER);
+                       text.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, true));
+                       text.setText(initial);
+                       return text;
+               }
+
+               /** Creates label and check. */
+               protected Button createLC(Composite parent, String label,
+                               Boolean initial) {
+                       new Label(parent, SWT.NONE).setText(label);
+                       Button check = new Button(parent, SWT.CHECK);
+                       check.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+                       check.setSelection(initial);
+                       return check;
+               }
+
+               /** Creates a button with a label. */
+               protected Button createButton(Composite parent, String label) {
+                       Button button = new Button(parent, SWT.PUSH);
+                       button.setText(label);
+                       button.setFont(JFaceResources.getDialogFont());
+                       setButtonLayoutData(button);
+                       return button;
+               }
+
+               /** Creates label and password field */
+               protected Text createLP(Composite parent, String label) {
+                       new Label(parent, SWT.NONE).setText(label);
+                       Text text = new Text(parent, SWT.SINGLE | SWT.LEAD | SWT.BORDER
+                                       | SWT.PASSWORD);
+                       text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+                       return text;
+               }
+
+       }
+
+       void testConnection() {
+               Session session = null;
+               try {
+                       if (uri.getText().startsWith("http")) {// http, https
+                               URI checkedUri = new URI(uri.getText());
+                               String checkedUriStr = checkedUri.toString();
+                               Hashtable<String, String> params = new Hashtable<String, String>();
+                               params.put(ArgeoJcrConstants.JCR_REPOSITORY_URI, checkedUriStr);
+                               Repository repository = ArgeoJcrUtils.getRepositoryByUri(
+                                               repositoryFactory, checkedUriStr);
+                               if (username.getText().trim().equals("")) {// anonymous
+                                       session = repository.login();
+                               } else {
+                                       // FIXME use getTextChars() when upgrading to 3.7
+                                       // see
+                                       // https://bugs.eclipse.org/bugs/show_bug.cgi?id=297412
+                                       char[] pwd = password.getText().toCharArray();
+                                       SimpleCredentials sc = new SimpleCredentials(
+                                                       username.getText(), pwd);
+                                       session = repository.login(sc);
+                               }
+                       } else {// alias
+                               Repository repository = ArgeoJcrUtils.getRepositoryByAlias(
+                                               repositoryFactory, uri.getText());
+                               session = repository.login();
+                       }
+                       MessageDialog.openInformation(getShell(), "Success",
+                                       "Connection to '" + uri.getText() + "' successful");
+               } catch (Exception e) {
+                       ErrorFeedback
+                                       .show("Connection test failed for " + uri.getText(), e);
+               } finally {
+                       JcrUtils.logoutQuietly(session);
+               }
+       }
+}
\ No newline at end of file