<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>
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 -->
--- /dev/null
+/*
+ * 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;
+ }
+
+}
--- /dev/null
+/*
+ * 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;
+ }
+
+}
--- /dev/null
+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
*/
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 {
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);
+ }
+ }
+ }
+
+ }
}