Introduce distribution editor
authorMathieu Baudier <mbaudier@argeo.org>
Tue, 29 May 2012 15:13:21 +0000 (15:13 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Tue, 29 May 2012 15:13:21 +0000 (15:13 +0000)
git-svn-id: https://svn.argeo.org/slc/trunk@5318 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

eclipse/plugins/org.argeo.slc.client.ui.dist/META-INF/spring/views.xml
eclipse/plugins/org.argeo.slc.client.ui.dist/plugin.xml
eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/DistributionEditor.java [new file with mode: 0644]
eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/DistributionEditorInput.java [new file with mode: 0644]
eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/DistributionOverviewPage.java [new file with mode: 0644]
eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/views/DistributionsView.java

index 60f75faf60f10c9a34c8ec1c5d94977a96326644..0d3cba849ce7b00f9fdb5741439e0f75fe83b4de 100644 (file)
@@ -46,6 +46,6 @@
        <bean id="distributionsView" class="org.argeo.slc.client.ui.dist.views.DistributionsView"
                scope="prototype">
                <property name="repository" ref="javaRepository" />
-               <property name="workspace" value="argeo-tp-1-staging" />
+<!--           <property name="workspace" value="argeo-tp-1-staging" /> -->
        </bean>
 </beans>
index f59c08ce90f54fa5d583138020fcf8fd0a4ec77e..003c8f92f36ad4b1a91ab5ea1de4bcdc3c3e3e63 100644 (file)
               name="Artifact editor"
               icon="icons/artifactVersionBase.gif"
               default="false">
+        </editor>
+            <editor
+                 class="org.argeo.slc.client.ui.dist.editors.DistributionEditor"
+              id="org.argeo.slc.client.ui.dist.distributionEditor"
+              name="Distribution editor"
+              icon="icons/distribution_perspective.gif"
+              default="false">
         </editor>
     </extension>
     <!-- Commands --> 
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 (file)
index 0000000..7a27448
--- /dev/null
@@ -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 (file)
index 0000000..38d9254
--- /dev/null
@@ -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 (file)
index 0000000..632bd00
--- /dev/null
@@ -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<Node> 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
index ec635c43e85de6a221883032a5c4bfda1bcce0c1..7ec83600f2e13abb07c9bb59115ddcd6351c9475 100644 (file)
  */
 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<Node> 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);
+                               }
+                       }
+               }
+
+       }
 }