From 2aee0719f283ed82e2b2866070c7fa400426e22f Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Tue, 29 May 2012 15:13:21 +0000 Subject: [PATCH] Introduce distribution editor git-svn-id: https://svn.argeo.org/slc/trunk@5318 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../META-INF/spring/views.xml | 2 +- .../org.argeo.slc.client.ui.dist/plugin.xml | 7 + .../ui/dist/editors/DistributionEditor.java | 103 ++++++++++++ .../dist/editors/DistributionEditorInput.java | 96 +++++++++++ .../editors/DistributionOverviewPage.java | 152 ++++++++++++++++++ .../ui/dist/views/DistributionsView.java | 146 +++++++++-------- 6 files changed, 437 insertions(+), 69 deletions(-) create mode 100644 eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/DistributionEditor.java create mode 100644 eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/DistributionEditorInput.java create mode 100644 eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/DistributionOverviewPage.java diff --git a/eclipse/plugins/org.argeo.slc.client.ui.dist/META-INF/spring/views.xml b/eclipse/plugins/org.argeo.slc.client.ui.dist/META-INF/spring/views.xml index 60f75faf6..0d3cba849 100644 --- a/eclipse/plugins/org.argeo.slc.client.ui.dist/META-INF/spring/views.xml +++ b/eclipse/plugins/org.argeo.slc.client.ui.dist/META-INF/spring/views.xml @@ -46,6 +46,6 @@ - + diff --git a/eclipse/plugins/org.argeo.slc.client.ui.dist/plugin.xml b/eclipse/plugins/org.argeo.slc.client.ui.dist/plugin.xml index f59c08ce9..003c8f92f 100644 --- a/eclipse/plugins/org.argeo.slc.client.ui.dist/plugin.xml +++ b/eclipse/plugins/org.argeo.slc.client.ui.dist/plugin.xml @@ -54,6 +54,13 @@ name="Artifact editor" icon="icons/artifactVersionBase.gif" default="false"> + + diff --git a/eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/DistributionEditor.java b/eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/DistributionEditor.java new file mode 100644 index 000000000..7a274480b --- /dev/null +++ b/eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/DistributionEditor.java @@ -0,0 +1,103 @@ +/* + * 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.editors; + +import java.util.List; + +import javax.jcr.Node; +import javax.jcr.NodeIterator; +import javax.jcr.RepositoryException; +import javax.jcr.Session; +import javax.jcr.query.QueryManager; +import javax.jcr.query.QueryResult; +import javax.jcr.query.qom.Ordering; +import javax.jcr.query.qom.QueryObjectModel; +import javax.jcr.query.qom.QueryObjectModelFactory; +import javax.jcr.query.qom.Selector; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.argeo.ArgeoException; +import org.argeo.eclipse.ui.ErrorFeedback; +import org.argeo.jcr.JcrUtils; +import org.argeo.slc.client.ui.dist.DistPlugin; +import org.argeo.slc.jcr.SlcNames; +import org.argeo.slc.jcr.SlcTypes; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jface.viewers.ColumnLabelProvider; +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.swt.SWT; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Table; +import org.eclipse.ui.IEditorInput; +import org.eclipse.ui.IEditorSite; +import org.eclipse.ui.PartInitException; +import org.eclipse.ui.forms.IManagedForm; +import org.eclipse.ui.forms.editor.FormEditor; +import org.eclipse.ui.forms.editor.FormPage; +import org.eclipse.ui.forms.widgets.ScrolledForm; +import org.osgi.framework.Constants; + +/** + * Editor to browse, analyze and modify an OSGi distribution + */ +public class DistributionEditor extends FormEditor implements SlcNames { + private final static Log log = LogFactory.getLog(DistributionEditor.class); + public final static String ID = DistPlugin.ID + ".distributionEditor"; + + private Session session; + + @Override + public void init(IEditorSite site, IEditorInput input) + throws PartInitException { + DistributionEditorInput dei = (DistributionEditorInput) input; + try { + session = dei.getRepository().login(dei.getWorkspaceName()); + } catch (RepositoryException e) { + throw new PartInitException("Cannot log to workspace " + + dei.getWorkspaceName(), e); + } + setPartName(dei.getWorkspaceName()); + super.init(site, input); + } + + @Override + protected void addPages() { + try { + addPage(new DistributionOverviewPage(this, "Overview", session)); + } catch (PartInitException e) { + throw new ArgeoException("Cannot add distribution editor pages", e); + } + } + + @Override + public void doSave(IProgressMonitor arg0) { + } + + @Override + public void doSaveAs() { + } + + @Override + public boolean isSaveAsAllowed() { + return false; + } + +} diff --git a/eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/DistributionEditorInput.java b/eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/DistributionEditorInput.java new file mode 100644 index 000000000..38d92549c --- /dev/null +++ b/eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/DistributionEditorInput.java @@ -0,0 +1,96 @@ +/* + * 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.editors; + +import javax.jcr.Repository; + +import org.argeo.slc.jcr.SlcNames; +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.ui.IEditorInput; +import org.eclipse.ui.IPersistableElement; + +/** + * An editor input pointing to a distribution + * */ +public class DistributionEditorInput implements IEditorInput, SlcNames { + + private Repository repository; + private String workspaceName; + private String artifactsBase = "/"; + + public DistributionEditorInput(Repository repository, String workspaceName, + String artifactsBase) { + super(); + this.repository = repository; + this.workspaceName = workspaceName; + this.artifactsBase = artifactsBase; + } + + public DistributionEditorInput(Repository repository, String workspaceName) { + this(repository, workspaceName, "/"); + } + + public Object getAdapter(@SuppressWarnings("rawtypes") Class adapter) { + return null; + } + + public boolean exists() { + return true; + } + + public ImageDescriptor getImageDescriptor() { + return null; + } + + // Dummy compulsory methods + public String getToolTipText() { + return workspaceName; + } + + public String getName() { + return workspaceName; + } + + public IPersistableElement getPersistable() { + return null; + } + + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (!(obj instanceof DistributionEditorInput)) + return false; + + DistributionEditorInput other = (DistributionEditorInput) obj; + return getRepository().equals(other.getRepository()) + && getWorkspaceName().equals(other.getWorkspaceName()); + } + + public Repository getRepository() { + return repository; + } + + public String getWorkspaceName() { + return workspaceName; + } + + public String getArtifactsBase() { + return artifactsBase; + } + +} diff --git a/eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/DistributionOverviewPage.java b/eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/DistributionOverviewPage.java new file mode 100644 index 000000000..632bd00ea --- /dev/null +++ b/eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/DistributionOverviewPage.java @@ -0,0 +1,152 @@ +package org.argeo.slc.client.ui.dist.editors; + +import java.util.List; + +import javax.jcr.Node; +import javax.jcr.NodeIterator; +import javax.jcr.RepositoryException; +import javax.jcr.Session; +import javax.jcr.query.QueryManager; +import javax.jcr.query.QueryResult; +import javax.jcr.query.qom.Ordering; +import javax.jcr.query.qom.QueryObjectModel; +import javax.jcr.query.qom.QueryObjectModelFactory; +import javax.jcr.query.qom.Selector; + +import org.argeo.eclipse.ui.ErrorFeedback; +import org.argeo.jcr.JcrUtils; +import org.argeo.slc.jcr.SlcNames; +import org.argeo.slc.jcr.SlcTypes; +import org.eclipse.jface.viewers.ColumnLabelProvider; +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.swt.SWT; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Table; +import org.eclipse.ui.forms.IManagedForm; +import org.eclipse.ui.forms.editor.FormEditor; +import org.eclipse.ui.forms.editor.FormPage; +import org.eclipse.ui.forms.widgets.ScrolledForm; +import org.osgi.framework.Constants; + +/** Table giving an overview of an OSGi distribution */ +class DistributionOverviewPage extends FormPage implements SlcNames { + private TableViewer viewer; + private Session session; + + public DistributionOverviewPage(FormEditor formEditor, String title, + Session session) { + super(formEditor, "distributionPage", title); + this.session = session; + } + + @Override + protected void createFormContent(IManagedForm managedForm) { + ScrolledForm form = managedForm.getForm(); + GridLayout layout = new GridLayout(1, false); + form.getBody().setLayout(layout); + + // Define the TableViewer + viewer = new TableViewer(form.getBody(), SWT.MULTI | SWT.H_SCROLL + | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER); + + TableViewerColumn col = new TableViewerColumn(viewer, SWT.NONE); + col.getColumn().setWidth(300); + col.getColumn().setText("Symbolic name"); + col.setLabelProvider(new ColumnLabelProvider() { + @Override + public String getText(Object element) { + return JcrUtils.get((Node) element, SLC_SYMBOLIC_NAME); + } + }); + col = new TableViewerColumn(viewer, SWT.NONE); + col.getColumn().setWidth(100); + col.getColumn().setText("Version"); + col.setLabelProvider(new ColumnLabelProvider() { + @Override + public String getText(Object element) { + return JcrUtils.get((Node) element, SLC_BUNDLE_VERSION); + } + }); + col = new TableViewerColumn(viewer, SWT.NONE); + col.getColumn().setWidth(150); + col.getColumn().setText("Group ID"); + col.setLabelProvider(new ColumnLabelProvider() { + @Override + public String getText(Object element) { + return JcrUtils.get((Node) element, SLC_GROUP_ID); + } + }); + col = new TableViewerColumn(viewer, SWT.NONE); + col.getColumn().setWidth(300); + col.getColumn().setText("Name"); + col.setLabelProvider(new ColumnLabelProvider() { + @Override + public String getText(Object element) { + return JcrUtils.get((Node) element, SLC_ + + Constants.BUNDLE_NAME); + } + }); + + final Table table = viewer.getTable(); + table.setHeaderVisible(true); + table.setLinesVisible(true); + table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + + viewer.setContentProvider(new DistributionsContentProvider()); + viewer.setInput(session); + } + + @Override + public void setFocus() { + viewer.getTable().setFocus(); + } + + static NodeIterator listBundleArtifacts(Session session) + throws RepositoryException { + QueryManager queryManager = session.getWorkspace().getQueryManager(); + QueryObjectModelFactory factory = queryManager.getQOMFactory(); + + final String bundleArtifactsSelector = "bundleArtifacts"; + Selector source = factory.selector(SlcTypes.SLC_BUNDLE_ARTIFACT, + bundleArtifactsSelector); + + Ordering order = factory.ascending(factory.propertyValue( + bundleArtifactsSelector, SlcNames.SLC_SYMBOLIC_NAME)); + Ordering[] orderings = { order }; + + QueryObjectModel query = factory.createQuery(source, null, orderings, + null); + + QueryResult result = query.execute(); + return result.getNodes(); + } + + private static class DistributionsContentProvider implements + IStructuredContentProvider { + private Session session; + + public void dispose() { + } + + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { + session = (Session) newInput; + } + + public Object[] getElements(Object arg0) { + try { + List nodes = JcrUtils + .nodeIteratorToList(listBundleArtifacts(session)); + return nodes.toArray(); + } catch (RepositoryException e) { + ErrorFeedback.show("Cannot list bundles", e); + return null; + } + } + + } + +} \ No newline at end of file diff --git a/eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/views/DistributionsView.java b/eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/views/DistributionsView.java index ec635c43e..7ec83600f 100644 --- a/eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/views/DistributionsView.java +++ b/eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/views/DistributionsView.java @@ -15,42 +15,34 @@ */ package org.argeo.slc.client.ui.dist.views; -import java.util.List; - -import javax.jcr.Node; -import javax.jcr.NodeIterator; import javax.jcr.Repository; import javax.jcr.RepositoryException; import javax.jcr.Session; -import javax.jcr.query.QueryManager; -import javax.jcr.query.QueryResult; -import javax.jcr.query.qom.Ordering; -import javax.jcr.query.qom.QueryObjectModel; -import javax.jcr.query.qom.QueryObjectModelFactory; -import javax.jcr.query.qom.Selector; 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.jcr.JcrUtils; +import org.argeo.eclipse.ui.TreeParent; import org.argeo.slc.client.ui.dist.DistPlugin; +import org.argeo.slc.client.ui.dist.editors.DistributionEditor; +import org.argeo.slc.client.ui.dist.editors.DistributionEditorInput; import org.argeo.slc.jcr.SlcNames; -import org.argeo.slc.jcr.SlcTypes; import org.eclipse.jface.viewers.ColumnLabelProvider; -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.viewers.DoubleClickEvent; +import org.eclipse.jface.viewers.IDoubleClickListener; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.TreeViewer; +import org.eclipse.jface.viewers.TreeViewerColumn; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.Tree; +import org.eclipse.ui.PartInitException; import org.eclipse.ui.part.ViewPart; /** - * Basic View to browse a maven based repository. - * - * By Default size of the various bundles is not computed but it can be - * activated the view command. + * Browse and manipulate distributions (like merge, rename, etc.). Only support + * one single repository currently. */ public class DistributionsView extends ViewPart implements SlcNames { @@ -58,96 +50,114 @@ public class DistributionsView extends ViewPart implements SlcNames { public final static String ID = DistPlugin.ID + ".distributionsView"; private Repository repository; - private String workspace; - private Session session; - private TableViewer viewer; + private TreeViewer viewer; @Override public void createPartControl(Composite parent) { - try { - session = repository.login(workspace); - } catch (RepositoryException e) { - ErrorFeedback.show("Cannot log to workspace " + workspace, e); - } - // Define the TableViewer - viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL - | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER); + viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL + | SWT.FULL_SELECTION | SWT.BORDER); - TableViewerColumn col = new TableViewerColumn(viewer, SWT.NONE); + TreeViewerColumn col = new TreeViewerColumn(viewer, SWT.NONE); col.getColumn().setWidth(200); col.getColumn().setText("Workspace"); col.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { - return JcrUtils.get((Node) element, SLC_SYMBOLIC_NAME); + return element.toString(); } }); - final Table table = viewer.getTable(); + final Tree table = viewer.getTree(); table.setHeaderVisible(true); table.setLinesVisible(true); viewer.setContentProvider(new DistributionsContentProvider()); - viewer.setInput(session); + viewer.addDoubleClickListener(new DistributionsDCL()); + viewer.setInput(getSite()); } @Override public void setFocus() { - viewer.getTable().setFocus(); + viewer.getTree().setFocus(); } public void setRepository(Repository repository) { this.repository = repository; } - public void setWorkspace(String workspace) { - this.workspace = workspace; - } - - private static class DistributionsContentProvider implements - IStructuredContentProvider { - private Session session; + private class DistributionsContentProvider extends + AbstractTreeContentProvider { - public void dispose() { + public Object[] getElements(Object arg0) { + return new Object[] { new RepositoryElem("java", repository) }; } - public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { - session = (Session) newInput; - } + } - public Object[] getElements(Object arg0) { + private static class RepositoryElem extends TreeParent { + private final Repository repository; + private Session defaultSession; + + public RepositoryElem(String name, Repository repository) { + super(name); + this.repository = repository; try { - List nodes = JcrUtils - .nodeIteratorToList(listBundleArtifacts(session)); - return nodes.toArray(); + defaultSession = repository.login(); + String[] workspaceNames = defaultSession.getWorkspace() + .getAccessibleWorkspaceNames(); + for (String workspace : workspaceNames) + addChild(new DistributionElem(repository, workspace)); } catch (RepositoryException e) { - ErrorFeedback.show("Cannot list bundles", e); - return null; + ErrorFeedback.show("Cannot log to repository", e); } } } - static NodeIterator listBundleArtifacts(Session session) - throws RepositoryException { - QueryManager queryManager = session.getWorkspace().getQueryManager(); - QueryObjectModelFactory factory = queryManager.getQOMFactory(); + private static class DistributionElem extends TreeParent { + private final String workspaceName; + private final Repository repository; - final String bundleArtifactsSelector = "bundleArtifacts"; - Selector source = factory.selector(SlcTypes.SLC_BUNDLE_ARTIFACT, - bundleArtifactsSelector); + public DistributionElem(Repository repository, String workspaceName) { + super(workspaceName); + this.workspaceName = workspaceName; + this.repository = repository; + } - Ordering order = factory.ascending(factory.propertyValue( - bundleArtifactsSelector, SlcNames.SLC_SYMBOLIC_NAME)); - Ordering[] orderings = { order }; + public String getWorkspaceName() { + return workspaceName; + } - QueryObjectModel query = factory.createQuery(source, null, orderings, - null); + public Repository getRepository() { + return repository; + } - QueryResult result = query.execute(); - return result.getNodes(); } + private class DistributionsDCL implements IDoubleClickListener { + + public void doubleClick(DoubleClickEvent event) { + if (event.getSelection() == null || event.getSelection().isEmpty()) + return; + Object obj = ((IStructuredSelection) event.getSelection()) + .getFirstElement(); + if (obj instanceof DistributionElem) { + DistributionElem distributionElem = (DistributionElem) obj; + DistributionEditorInput dei = new DistributionEditorInput( + distributionElem.getRepository(), + distributionElem.getWorkspaceName()); + try { + DistPlugin.getDefault().getWorkbench() + .getActiveWorkbenchWindow().getActivePage() + .openEditor(dei, DistributionEditor.ID); + } catch (PartInitException e) { + ErrorFeedback.show("Cannot open editor for " + + distributionElem.getWorkspaceName(), e); + } + } + } + + } } -- 2.39.2