From: Mathieu Baudier Date: Mon, 22 Oct 2012 15:55:27 +0000 (+0000) Subject: Restructure Repo Dist UI X-Git-Tag: argeo-slc-2.1.7~595 X-Git-Url: http://git.argeo.org/?a=commitdiff_plain;h=927966d02abf22de8dd596239aca6a7a48a81e89;p=gpl%2Fargeo-slc.git Restructure Repo Dist UI git-svn-id: https://svn.argeo.org/slc/trunk@5634 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- 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 2be2c1185..7ad2b6b6a 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 @@ -16,24 +16,21 @@ - + - - - @@ -46,12 +43,18 @@ class="org.argeo.slc.client.ui.dist.commands.RefreshDistributionsView" scope="prototype"> - + + + + + + + diff --git a/plugins/org.argeo.slc.client.ui.dist/META-INF/spring/jcr.xml b/plugins/org.argeo.slc.client.ui.dist/META-INF/spring/jcr.xml index 6543412d5..51c210957 100644 --- a/plugins/org.argeo.slc.client.ui.dist/META-INF/spring/jcr.xml +++ b/plugins/org.argeo.slc.client.ui.dist/META-INF/spring/jcr.xml @@ -9,4 +9,16 @@ + + + + + + + + + + + diff --git a/plugins/org.argeo.slc.client.ui.dist/META-INF/spring/osgi.xml b/plugins/org.argeo.slc.client.ui.dist/META-INF/spring/osgi.xml index c938de8de..48399342d 100644 --- a/plugins/org.argeo.slc.client.ui.dist/META-INF/spring/osgi.xml +++ b/plugins/org.argeo.slc.client.ui.dist/META-INF/spring/osgi.xml @@ -12,4 +12,9 @@ filter="(argeo.jcr.repository.alias=java)" /> + + + + \ No newline at end of file diff --git a/plugins/org.argeo.slc.client.ui.dist/META-INF/spring/views.xml b/plugins/org.argeo.slc.client.ui.dist/META-INF/spring/views.xml index cfbbf2443..684e01fa9 100644 --- a/plugins/org.argeo.slc.client.ui.dist/META-INF/spring/views.xml +++ b/plugins/org.argeo.slc.client.ui.dist/META-INF/spring/views.xml @@ -45,7 +45,8 @@ - + + diff --git a/plugins/org.argeo.slc.client.ui.dist/plugin.xml b/plugins/org.argeo.slc.client.ui.dist/plugin.xml index 0edb2f87a..cc4b39c23 100644 --- a/plugins/org.argeo.slc.client.ui.dist/plugin.xml +++ b/plugins/org.argeo.slc.client.ui.dist/plugin.xml @@ -102,6 +102,11 @@ name="Workspace Name"> + + - - --> org.argeo.commons.base @@ -56,6 +63,11 @@ + + org.argeo.slc + org.argeo.slc.specs + 1.1.4-SNAPSHOT + org.argeo.slc org.argeo.slc.repo 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 new file mode 100644 index 000000000..18edd7122 --- /dev/null +++ b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/AddRepository.java @@ -0,0 +1,237 @@ +/* + * Copyright (C) 2007-2012 Mathieu Baudier + * + * 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.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 { + + 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", "Argeo.org Java Repository"); + uri = createLT(composite, "URI", + "https://repo.argeo.org/org.argeo.jcr.webapp/remoting/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() { + try { + Session 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); + } + } + + /** 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/views/DistributionsView.java b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/views/DistributionsView.java index 8cb1746a2..8d046f5ad 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 @@ -21,17 +21,24 @@ import java.util.List; import java.util.Map; import javax.jcr.Credentials; +import javax.jcr.Node; +import javax.jcr.NodeIterator; +import javax.jcr.Property; import javax.jcr.Repository; import javax.jcr.RepositoryException; import javax.jcr.RepositoryFactory; import javax.jcr.Session; +import javax.jcr.SimpleCredentials; +import javax.jcr.nodetype.NodeType; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.argeo.eclipse.ui.AbstractTreeContentProvider; import org.argeo.eclipse.ui.ErrorFeedback; import org.argeo.eclipse.ui.TreeParent; +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.client.ui.dist.DistPlugin; import org.argeo.slc.client.ui.dist.commands.CopyWorkspace; import org.argeo.slc.client.ui.dist.commands.CreateWorkspace; @@ -42,6 +49,8 @@ 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.CommandHelpers; import org.argeo.slc.jcr.SlcNames; +import org.argeo.slc.repo.RepoConstants; +import org.argeo.util.security.Keyring; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; @@ -49,8 +58,10 @@ import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.TreeViewerColumn; +import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Menu; @@ -63,17 +74,21 @@ import org.eclipse.ui.part.ViewPart; * Browse and manipulate distributions (like merge, rename, etc.). Only support * one single repository currently. */ - -public class DistributionsView extends ViewPart implements SlcNames { - private final static Log log = LogFactory.getLog(DistributionsView.class); +public class DistributionsView extends ViewPart implements SlcNames, ArgeoNames { + // private final static Log log = + // LogFactory.getLog(DistributionsView.class); public final static String ID = DistPlugin.ID + ".distributionsView"; - private Repository repository; + private Repository nodeRepository; private RepositoryFactory repositoryFactory; + private Keyring keyring; private TreeViewer viewer; - private List repositories = new ArrayList(); + // private List repositories = new + // ArrayList(); + + // private Session nodeSession = null; @Override public void createPartControl(Composite parent) { @@ -83,17 +98,19 @@ public class DistributionsView extends ViewPart implements SlcNames { TreeViewerColumn col = new TreeViewerColumn(viewer, SWT.NONE); col.getColumn().setWidth(200); - col.getColumn().setText("Workspace"); + // col.getColumn().setText("Workspace"); col.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { + if (element instanceof RepoElem) + return ((RepoElem) element).getLabel(); return element.toString(); } }); final Tree table = viewer.getTree(); - table.setHeaderVisible(true); - table.setLinesVisible(true); + table.setHeaderVisible(false); + table.setLinesVisible(false); viewer.setContentProvider(new DistributionsContentProvider()); viewer.addDoubleClickListener(new DistributionsDCL()); @@ -108,39 +125,103 @@ public class DistributionsView extends ViewPart implements SlcNames { viewer.getTree().setMenu(menu); getSite().registerContextMenu(menuManager, viewer); - // Initializes repositories - // TODO make it more generic, with remote repositories etc. - repositories.add(new RepositoryElem("java", repository, null)); + Session nodeSession = null; + try { + nodeSession = nodeRepository.login(); + + // make sure base directory is available + Node repos = JcrUtils.mkdirs(nodeSession, + UserJcrUtils.getUserHome(nodeSession).getPath() + + RepoConstants.REPOSITORIES_BASE_PATH); + nodeSession.save(); + + // register default local java repository + String alias = RepoConstants.DEFAULT_JAVA_REPOSITORY_ALIAS; + Repository javaRepository = ArgeoJcrUtils.getRepositoryByAlias( + repositoryFactory, alias); + if (javaRepository != null) { + if (!repos.hasNode(alias)) { + Node repoNode = repos.addNode(alias, + ArgeoTypes.ARGEO_REMOTE_REPOSITORY); + repoNode.setProperty(ARGEO_URI, alias); + repoNode.addMixin(NodeType.MIX_TITLE); + repoNode.setProperty(Property.JCR_TITLE, "vm://" + alias); + nodeSession.save(); + } + } + } catch (RepositoryException e) { + throw new SlcException("Cannot register repository", e); + } finally { + JcrUtils.logoutQuietly(nodeSession); + } + // + // try { + // nodeSession = nodeRepository.login(); + // NodeIterator repos = JcrUtils.mkdirs( + // nodeSession, + // UserJcrUtils.getUserHome(nodeSession).getPath() + // + RepoConstants.REPOSITORIES_BASE_PATH).getNodes(); + // while (repos.hasNext()) { + // Node repository = repos.nextNode(); + // String label = null; + // if (repository.isNodeType(NodeType.MIX_TITLE)) { + // label = repository.getProperty(Property.JCR_TITLE) + // .getString(); + // } + // + // if (repository.isNodeType(ArgeoTypes.ARGEO_REMOTE_REPOSITORY)) { + // String uri = repository.getProperty(ARGEO_URI).getString(); + // Credentials credentials = null; + // if (repository.hasProperty(ARGEO_USER_ID)) { + // String userId = repository.getProperty(ARGEO_USER_ID) + // .getString(); + // credentials = new SimpleCredentials(userId, + // "".toCharArray()); + // } + // Repository remoteRepository = ArgeoJcrUtils + // .getRepositoryByUri(repositoryFactory, uri); + // if (label == null) + // label = repository.getName(); + // repositories.add(new RepositoryElem(label, + // remoteRepository, credentials)); + // } + // } + // } catch (RepositoryException e) { + // throw new ArgeoException("Cannot read registered repositories", e); + // } // Remote -// String uri = null; -// Credentials credentials = null; -// Repository remoteRepository = null; - -// try { -// uri = "http://dev.argeo.org/org.argeo.jcr.webapp/pub/java"; -// credentials = new GuestCredentials(); -// remoteRepository = ArgeoJcrUtils.getRepositoryByUri(repositoryFactory, uri); -// repositories.add(new RepositoryElem("anonymous@dev.argeo.org//java", -// remoteRepository, credentials)); -// } catch (Exception e) { -// e.printStackTrace(); -// } - -// uri = "http://localhost:7070/org.argeo.jcr.webapp/pub/java"; -// credentials = new GuestCredentials(); -// remoteRepository = ArgeoJcrUtils.getRepositoryByUri(repositoryFactory, uri); -// repositories.add(new RepositoryElem("anonymous@localhost//java", -// remoteRepository, credentials)); - -// uri = "http://localhost:7070/org.argeo.jcr.webapp/remoting/java"; -// credentials = new SimpleCredentials(System.getProperty("user.name"), -// "".toCharArray()); -// remoteRepository = ArgeoJcrUtils.getRepositoryByUri(repositoryFactory, uri); -// repositories.add(new RepositoryElem("@localhost//java", -// remoteRepository, credentials)); - - viewer.setInput(getSite()); + // String uri = null; + // Credentials credentials = null; + // Repository remoteRepository = null; + + // try { + // uri = "http://dev.argeo.org/org.argeo.jcr.webapp/pub/java"; + // credentials = new GuestCredentials(); + // remoteRepository = + // ArgeoJcrUtils.getRepositoryByUri(repositoryFactory, uri); + // repositories.add(new RepositoryElem("anonymous@dev.argeo.org//java", + // remoteRepository, credentials)); + // } catch (Exception e) { + // e.printStackTrace(); + // } + + // uri = "http://localhost:7070/org.argeo.jcr.webapp/pub/java"; + // credentials = new GuestCredentials(); + // remoteRepository = + // ArgeoJcrUtils.getRepositoryByUri(repositoryFactory, uri); + // repositories.add(new RepositoryElem("anonymous@localhost//java", + // remoteRepository, credentials)); + + // uri = "http://localhost:7070/org.argeo.jcr.webapp/remoting/java"; + // credentials = new SimpleCredentials(System.getProperty("user.name"), + // "".toCharArray()); + // remoteRepository = + // ArgeoJcrUtils.getRepositoryByUri(repositoryFactory, uri); + // repositories.add(new RepositoryElem("@localhost//java", + // remoteRepository, credentials)); + + viewer.setInput(nodeRepository); } @@ -156,14 +237,18 @@ public class DistributionsView extends ViewPart implements SlcNames { viewer.setContentProvider(new DistributionsContentProvider()); } - public void setRepository(Repository repository) { - this.repository = repository; + public void setNodeRepository(Repository repository) { + this.nodeRepository = repository; } public void setRepositoryFactory(RepositoryFactory repositoryFactory) { this.repositoryFactory = repositoryFactory; } + public void setKeyring(Keyring keyring) { + this.keyring = keyring; + } + /** Programatically configure the context menu */ protected void contextMenuAboutToShow(IMenuManager menuManager) { IWorkbenchWindow window = DistPlugin.getDefault().getWorkbench() @@ -190,8 +275,7 @@ public class DistributionsView extends ViewPart implements SlcNames { // create workspace CommandHelpers.refreshCommand(menuManager, window, CreateWorkspace.ID, CreateWorkspace.DEFAULT_LABEL, - CreateWorkspace.DEFAULT_ICON_PATH, - tp instanceof RepositoryElem); + CreateWorkspace.DEFAULT_ICON_PATH, !isDistribElem); // Normalize workspace Map params = new HashMap(); @@ -226,44 +310,187 @@ public class DistributionsView extends ViewPart implements SlcNames { } } - private class DistributionsContentProvider extends - AbstractTreeContentProvider { + private class DistributionsContentProvider implements ITreeContentProvider { + Session nodeSession; + List repositories = new ArrayList(); - public Object[] getElements(Object arg0) { + public Object[] getElements(Object input) { + Repository nodeRepository = (Repository) input; + try { + if (nodeSession != null) + dispose(); + nodeSession = nodeRepository.login(); + + String reposPath = UserJcrUtils.getUserHome(nodeSession) + .getPath() + RepoConstants.REPOSITORIES_BASE_PATH; + NodeIterator repos = nodeSession.getNode(reposPath).getNodes(); + while (repos.hasNext()) { + Node repoNode = repos.nextNode(); + if (repoNode.isNodeType(ArgeoTypes.ARGEO_REMOTE_REPOSITORY)) { + repositories.add(new RepoElem(repoNode)); + } + } + } catch (RepositoryException e) { + throw new SlcException("Cannot get base elements", e); + } return repositories.toArray(); } + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { + + } + + public Object[] getChildren(Object parentElement) { + if (parentElement instanceof RepoElem) { + return ((RepoElem) parentElement).getChildren(); + } else if (parentElement instanceof DistributionElem) { + return ((DistributionElem) parentElement).getChildren(); + } + return null; + } + + public Object getParent(Object element) { + // TODO register repo elem in distirbution elem? + return null; + } + + public boolean hasChildren(Object element) { + if (element instanceof RepoElem) { + return true; + } else if (element instanceof DistributionElem) { + return false; + } + return false; + } + + public void dispose() { + for (RepoElem repoElem : repositories) + repoElem.dispose(); + repositories = new ArrayList(); + JcrUtils.logoutQuietly(nodeSession); + } + } - /** Wraps a repository **/ - private static class RepositoryElem extends TreeParent { - // private final Repository repository; - private Session defaultSession; + // private class DistributionsContentProvider extends + // AbstractTreeContentProvider { + // + // public Object[] getElements(Object arg0) { + // return repositories.toArray(); + // } + // + // } - public RepositoryElem(String name, Repository repository, - Credentials credentials) { - super(name); + private class RepoElem { + private Node repoNode; + + private Repository repository; + private Credentials credentials; + private Session defaultSession = null; + + public RepoElem(Node repoNode) { + this.repoNode = repoNode; + } + + /** Lazily connects to repository */ + protected void connect() { + if (defaultSession != null) + return; + + try { + if (repoNode.isNodeType(ArgeoTypes.ARGEO_REMOTE_REPOSITORY)) { + String uri = repoNode.getProperty(ARGEO_URI).getString(); + if (uri.startsWith("http")) {// http, https + if (repoNode.hasProperty(ARGEO_USER_ID)) { + String userId = repoNode.getProperty(ARGEO_USER_ID) + .getString(); + char[] password = keyring.getAsChars(repoNode + .getPath() + '/' + ARGEO_PASSWORD); + credentials = new SimpleCredentials(userId, + password); + } + repository = ArgeoJcrUtils.getRepositoryByUri( + repositoryFactory, uri); + } else {// alias + String alias = uri; + repository = ArgeoJcrUtils.getRepositoryByAlias( + repositoryFactory, alias); + credentials = null; + } + defaultSession = repository.login(credentials); + } + } catch (RepositoryException e) { + throw new SlcException("Cannot connect to repository " + + repoNode, e); + } + } + + public String getLabel() { + try { + if (repoNode.isNodeType(NodeType.MIX_TITLE)) { + return repoNode.getProperty(Property.JCR_TITLE).getString(); + } else { + return repoNode.getName(); + } + } catch (RepositoryException e) { + throw new SlcException("Cannot read label of " + repoNode, e); + } + } + + public String toString() { + return repoNode.toString(); + } + + public Object[] getChildren() { + connect(); try { - defaultSession = repository.login(credentials); String[] workspaceNames = defaultSession.getWorkspace() .getAccessibleWorkspaceNames(); + List distributionElems = new ArrayList(); for (String workspace : workspaceNames) - addChild(new DistributionElem(repository, workspace, - credentials)); + distributionElems.add(new DistributionElem(repository, + workspace, credentials)); + return distributionElems.toArray(); } catch (RepositoryException e) { - ErrorFeedback.show("Cannot log to repository", e); + throw new SlcException( + "Cannot list workspaces for " + repoNode, e); } } - @Override - public synchronized void dispose() { - if (log.isTraceEnabled()) - log.trace("Disposing RepositoryElement"); + public void dispose() { JcrUtils.logoutQuietly(defaultSession); - super.dispose(); } } + /** Wraps a repository **/ + // private static class RepositoryElem extends TreeParent { + // // private final Repository repository; + // private Session defaultSession; + // + // public RepositoryElem(String name, Repository repository, + // Credentials credentials) { + // super(name); + // try { + // defaultSession = repository.login(credentials); + // String[] workspaceNames = defaultSession.getWorkspace() + // .getAccessibleWorkspaceNames(); + // for (String workspace : workspaceNames) + // addChild(new DistributionElem(repository, workspace, + // credentials)); + // } catch (RepositoryException e) { + // ErrorFeedback.show("Cannot log to repository", e); + // } + // } + // + // @Override + // public synchronized void dispose() { + // if (log.isTraceEnabled()) + // log.trace("Disposing RepositoryElement"); + // JcrUtils.logoutQuietly(defaultSession); + // super.dispose(); + // } + // } + private static class DistributionElem extends TreeParent { private final String workspaceName; private final Repository repository; @@ -292,8 +519,8 @@ public class DistributionsView extends ViewPart implements SlcNames { @Override public void dispose() { - for (RepositoryElem re : repositories) - re.dispose(); + // for (RepositoryElem re : repositories) + // re.dispose(); super.dispose(); } diff --git a/pom.xml b/pom.xml index bd52f409a..c22afef3e 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ org.argeo.commons argeo-commons - 1.1.4 + 1.1.5-SNAPSHOT org.argeo.slc argeo-slc diff --git a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/RepoConstants.java b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/RepoConstants.java index 6696bfb7b..4bba7e60f 100644 --- a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/RepoConstants.java +++ b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/RepoConstants.java @@ -17,10 +17,14 @@ package org.argeo.slc.repo; /** SLC repository constants */ public interface RepoConstants { + public final static String DEFAULT_JAVA_REPOSITORY_ALIAS = "java"; + public final static String DEFAULT_ARTIFACTS_BASE_PATH = "/"; public final static String REPO_BASEPATH = "/slc:repo"; public final static String PROXIED_REPOSITORIES = REPO_BASEPATH + "/slc:sources"; public final static String DISTRIBUTIONS_BASE_PATH = REPO_BASEPATH + "/slc:distributions"; + public final static String REPOSITORIES_BASE_PATH = REPO_BASEPATH + + "/slc:repositories"; }