From e2ad359a9b5d3822dcc2ad0576070fc46e2847d8 Mon Sep 17 00:00:00 2001 From: Bruno Sinou Date: Tue, 5 Mar 2013 19:31:19 +0000 Subject: [PATCH] enhance distribution UI git-svn-id: https://svn.argeo.org/slc/trunk@6100 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../META-INF/spring/commands.xml | 2 +- .../org.argeo.slc.client.ui.dist/plugin.xml | 10 +- .../argeo/slc/client/ui/dist/DistImages.java | 19 +- .../ui/dist/commands/AddRepository.java | 245 ---------------- .../ui/dist/commands/CreateWorkspace.java | 8 +- .../ui/dist/commands/RegisterRepository.java | 226 ++++++++++++++ .../ui/dist/commands/RepoSyncCommand.java | 16 +- .../ui/dist/editors/ArtifactDetailsPage.java | 5 +- .../dist/utils/ArtifactNamesComparator.java | 73 +++++ .../dist/utils/ArtifactsTableConfigurer.java | 6 +- .../utils/GenericDoubleClickListener.java | 10 +- .../ui/dist/views/DistributionsView.java | 43 ++- .../client/ui/dist/wizards/FetchWizard.java | 206 ++++--------- .../ui/dist/wizards/RegisterRepoWizard.java | 277 ++++++++++++++++++ 14 files changed, 721 insertions(+), 425 deletions(-) delete mode 100644 plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/AddRepository.java create mode 100644 plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/RegisterRepository.java create mode 100644 plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/utils/ArtifactNamesComparator.java create mode 100644 plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/wizards/RegisterRepoWizard.java diff --git a/plugins/org.argeo.slc.client.ui.dist/META-INF/spring/commands.xml b/plugins/org.argeo.slc.client.ui.dist/META-INF/spring/commands.xml index 6a43fd6a5..c5dce5e2f 100644 --- a/plugins/org.argeo.slc.client.ui.dist/META-INF/spring/commands.xml +++ b/plugins/org.argeo.slc.client.ui.dist/META-INF/spring/commands.xml @@ -63,7 +63,7 @@ scope="prototype"> - + diff --git a/plugins/org.argeo.slc.client.ui.dist/plugin.xml b/plugins/org.argeo.slc.client.ui.dist/plugin.xml index eede0bcbb..1d3935d50 100644 --- a/plugins/org.argeo.slc.client.ui.dist/plugin.xml +++ b/plugins/org.argeo.slc.client.ui.dist/plugin.xml @@ -123,7 +123,7 @@ @@ -211,10 +211,10 @@ + commandId="org.argeo.slc.client.ui.dist.registerRepository" + icon="icons/addRepo.gif" + label="Register repository" + tooltip="Register a remote repository"> params = new Hashtable(); - 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; - } - } -} diff --git a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/CreateWorkspace.java b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/CreateWorkspace.java index 812e6eebe..86cf1926b 100644 --- a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/CreateWorkspace.java +++ b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/CreateWorkspace.java @@ -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 index 000000000..805257a12 --- /dev/null +++ b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/RegisterRepository.java @@ -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 params = new Hashtable(); + // 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; + // } + // } +} diff --git a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/RepoSyncCommand.java b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/RepoSyncCommand.java index e780cdf43..5bbf4f405 100644 --- a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/RepoSyncCommand.java +++ b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/RepoSyncCommand.java @@ -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); diff --git a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/ArtifactDetailsPage.java b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/ArtifactDetailsPage.java index 25a8f940f..f350a722f 100644 --- a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/ArtifactDetailsPage.java +++ b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/ArtifactDetailsPage.java @@ -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 index 000000000..13b75fb7e --- /dev/null +++ b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/utils/ArtifactNamesComparator.java @@ -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 diff --git a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/utils/ArtifactsTableConfigurer.java b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/utils/ArtifactsTableConfigurer.java index 214927236..6505ddee0 100644 --- a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/utils/ArtifactsTableConfigurer.java +++ b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/utils/ArtifactsTableConfigurer.java @@ -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 indexToName = new HashMap(); diff --git a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/utils/GenericDoubleClickListener.java b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/utils/GenericDoubleClickListener.java index 98612395a..52fd904ca 100644 --- a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/utils/GenericDoubleClickListener.java +++ b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/utils/GenericDoubleClickListener.java @@ -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); } diff --git a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/views/DistributionsView.java b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/views/DistributionsView.java index dc37c3420..3ca2ce9ab 100644 --- a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/views/DistributionsView.java +++ b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/views/DistributionsView.java @@ -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 distributionElems = new ArrayList(); 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) { diff --git a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/wizards/FetchWizard.java b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/wizards/FetchWizard.java index a3d86fcca..44649f94e 100644 --- a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/wizards/FetchWizard.java +++ b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/wizards/FetchWizard.java @@ -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 wkspToSync = new ArrayList(); - - 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 wksps = new ArrayList(); + 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(); - 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(); + 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 result = new ArrayList(); + // 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 privilegedAction = new - // PrivilegedAction() { - // 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 index 000000000..c38f42fb7 --- /dev/null +++ b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/wizards/RegisterRepoWizard.java @@ -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 params = new Hashtable(); + 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 -- 2.39.2