blob: d533654768bbe4c9e09ecb977854ecaa165bfc32 [file] [log] [blame]
/*********************************************************************
* Copyright (c) 2009, 2012 SpringSource, a division of VMware, Inc.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
**********************************************************************/
package org.eclipse.virgo.ide.ui.editors;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.core.resources.ICommand;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.ui.ISharedImages;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.pde.core.plugin.IPluginModelBase;
import org.eclipse.pde.internal.ui.PDELabelProvider;
import org.eclipse.pde.internal.ui.PDEPlugin;
import org.eclipse.pde.internal.ui.PDEPluginImages;
import org.eclipse.pde.internal.ui.PDEUIMessages;
import org.eclipse.pde.internal.ui.editor.FormLayoutFactory;
import org.eclipse.pde.internal.ui.editor.PDEFormPage;
import org.eclipse.pde.internal.ui.util.SharedLabelProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTException;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.WorkspaceModifyOperation;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.editor.FormEditor;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.events.IHyperlinkListener;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.forms.widgets.FormText;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.forms.widgets.Section;
import org.eclipse.ui.forms.widgets.TableWrapData;
import org.eclipse.virgo.ide.bundlor.internal.core.BundlorCorePlugin;
import org.eclipse.virgo.ide.bundlor.ui.BundlorUiPlugin;
import org.eclipse.virgo.ide.export.BundleExportWizard;
import org.eclipse.virgo.ide.jdt.internal.core.classpath.ServerClasspathContainerUpdateJob;
import org.eclipse.virgo.ide.manifest.internal.core.BundleManifestManager;
import org.eclipse.virgo.ide.ui.ServerIdeUiPlugin;
import org.eclipse.virgo.ide.ui.StatusHandler;
/**
* @author Christian Dupuis
*/
public class BundleOverviewPage extends PDEFormPage implements IHyperlinkListener, IBundleManifestSaveListener {
public static final String PAGE_ID = "bundle_overview"; //$NON-NLS-1$
private BundleGeneralInfoSection fInfoSection;
private static final String BUNDLE_CONTENT_SECTION_TEXT = "<form><p>The content of the bundle is made up of two sections:</p><li style=\"image\" value=\"page\" bindent=\"5\"><a href=\"dependencies\">Dependencies</a>: lists all the bundles required on this bundle's classpath to compile and run.</li><li style=\"image\" value=\"page\" bindent=\"5\"><a href=\"runtime\">Runtime</a>: lists the packages that this bundle exports to other bundles.</li></form>";
private static final String BUNDLE_ACTION_SECTION_TEXT = "<form><p>Perform common actions on the bundle:</p>"
+ "<li style=\"image\" value=\"dependencies\" bindent=\"5\"><a href=\"refreshdependencies\">Refresh Bundle Dependencies</a>: refresh the Bundle Classpath Container to reflect changes in the MANIFEST.MF file.</li>"
+ "<li style=\"image\" value=\"export\" bindent=\"5\"><a href=\"exportbundle\">Export Bundle</a>: export the contents of the Bundle to a deployable JAR.</li>"
+ "</form>";
private static final String MANIFEST_ERRORS = "Overview: Please correct one or more errors in the manifest";
protected ScrolledForm form = null;
protected IResource resource = null;
public BundleOverviewPage(FormEditor editor) {
super(editor, PAGE_ID, "Overview");
}
@Override
protected void createFormContent(IManagedForm managedForm) {
super.createFormContent(managedForm);
IPluginModelBase model = (IPluginModelBase) ((BundleManifestEditor) this.getEditor()).getAggregateModel();
this.resource = model.getUnderlyingResource();
this.form = managedForm.getForm();
FormToolkit toolkit = managedForm.getToolkit();
this.form.setImage(ServerIdeUiPlugin.getImage("full/obj16/osgi_obj.gif"));
this.form.setText(PDEUIMessages.ManifestEditor_OverviewPage_title);
fillBody(managedForm, toolkit);
updateFormText();
}
public void manifestSaved() {
if (this.resource != null) {
updateFormText();
}
}
protected void updateFormText() {
if (this.resource != null) {
try {
// Wait for build
Job.getJobManager().join(ResourcesPlugin.FAMILY_AUTO_BUILD, null);
IMarker[] markers = this.resource.findMarkers(null, true, IResource.DEPTH_ZERO);
if (ManifestEditorUtils.hasErrorSeverityMarker(markers)) {
this.form.setText(MANIFEST_ERRORS);
this.form.setImage(ServerIdeUiPlugin.getImage("full/obj16/manifest_error.png"));
} else {
this.form.setText(PDEUIMessages.ManifestEditor_OverviewPage_title);
this.form.setImage(ServerIdeUiPlugin.getImage("full/obj16/osgi_obj.gif"));
}
} catch (OperationCanceledException e) {
StatusHandler.log(new Status(IStatus.ERROR, ServerIdeUiPlugin.PLUGIN_ID, "Could not update page title text", e));
} catch (InterruptedException e) {
StatusHandler.log(new Status(IStatus.ERROR, ServerIdeUiPlugin.PLUGIN_ID, "Could not update page title text", e));
} catch (CoreException e) {
StatusHandler.log(new Status(IStatus.ERROR, ServerIdeUiPlugin.PLUGIN_ID, "Could not update page title text", e));
}
}
}
private void fillBody(IManagedForm managedForm, FormToolkit toolkit) {
Composite body = managedForm.getForm().getBody();
body.setLayout(FormLayoutFactory.createFormTableWrapLayout(true, 2));
Composite left = toolkit.createComposite(body);
left.setLayout(FormLayoutFactory.createFormPaneTableWrapLayout(false, 1));
left.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
this.fInfoSection = new BundleGeneralInfoSection(this, left);
managedForm.addPart(this.fInfoSection);
managedForm.addPart(new BundleExecutionEnvironmentSection(this, left));
Composite right = toolkit.createComposite(body);
right.setLayout(FormLayoutFactory.createFormPaneTableWrapLayout(false, 1));
right.setLayoutData(new TableWrapData(TableWrapData.FILL));
createBundleActionSection(managedForm, right, toolkit);
createBundleContentSection(managedForm, right, toolkit);
}
private void createBundleContentSection(IManagedForm managedForm, Composite parent, FormToolkit toolkit) {
String sectionTitle;
sectionTitle = "Bundle Content";
Section section = createStaticSection(toolkit, parent, sectionTitle);
Composite container = createStaticSectionClient(toolkit, section);
FormText text = createClient(container, BUNDLE_CONTENT_SECTION_TEXT, true, toolkit);
PDELabelProvider lp = PDEPlugin.getDefault().getLabelProvider();
text.setImage("page", lp.get(PDEPluginImages.DESC_PAGE_OBJ, SharedLabelProvider.F_EDIT)); //$NON-NLS-1$
text.addHyperlinkListener(this);
section.setClient(container);
}
private void createBundleActionSection(IManagedForm managedForm, Composite parent, FormToolkit toolkit) {
String sectionTitle;
sectionTitle = "Bundle Actions";
Section section = createStaticSection(toolkit, parent, sectionTitle);
Composite container = createStaticSectionClient(toolkit, section);
FormText noteText = createClient(container,
"<form><p>OSGi dependency meta data in the MANIFEST.MF file can automatically be updated based on dependencies expressed in source code artifacts.</p><p>Java source files, Spring XML configuration, JPA persistence.xml and Hibernate .hbm mapping files will be analysed. The process will create Import-Package and Export-Package headers.</p><li style=\"image\" value=\"manifest\" bindent=\"5\"><a href=\"generate\">Update MANIFEST.MF</a>: automatically generate MANIFEST.MF file based on dependencies in source code artifacts.</li></form>",
true, toolkit);
noteText.setImage("manifest", ServerIdeUiPlugin.getImage("full/obj16/osgi_obj.gif")); //$NON-NLS-1$
noteText.addHyperlinkListener(this);
Button button = toolkit.createButton(container, "Automatically update MANIFEST.MF file in background.", SWT.CHECK);
button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
IRunnableWithProgress op = new WorkspaceModifyOperation() {
@Override
protected void execute(IProgressMonitor monitor) throws CoreException, InterruptedException {
IProject project = BundleOverviewPage.this.resource.getProject();
IProjectDescription description = project.getDescription();
try {
List<ICommand> cmds = Arrays.asList(description.getBuildSpec());
List<ICommand> newCmds = new ArrayList<ICommand>(cmds);
if (BundlorUiPlugin.isBundlorBuilding(project)) {
for (ICommand config : cmds) {
if (config.getBuilderName().equals(BundlorCorePlugin.BUILDER_ID)) {
newCmds.remove(config);
}
}
} else {
ICommand command = project.getDescription().newCommand();
command.setBuilderName(BundlorCorePlugin.BUILDER_ID);
newCmds.add(command);
}
if (!cmds.equals(newCmds)) {
description.setBuildSpec(newCmds.toArray(new ICommand[] {}));
project.setDescription(description, monitor);
}
} catch (CoreException e1) {
}
}
};
try {
PlatformUI.getWorkbench().getProgressService().runInUI(PDEPlugin.getActiveWorkbenchWindow(), op,
PDEPlugin.getWorkspace().getRoot());
} catch (InvocationTargetException e1) {
} catch (InterruptedException e1) {
}
}
});
TableWrapData data = new TableWrapData(TableWrapData.FILL_GRAB);
data.indent = 5;
button.setLayoutData(data);
boolean building = this.resource != null && BundlorUiPlugin.isBundlorBuilding(this.resource.getProject());
button.setSelection(building);
toolkit.createLabel(container, "");
FormText text = createClient(container, BUNDLE_ACTION_SECTION_TEXT, true, toolkit);
PDELabelProvider lp = PDEPlugin.getDefault().getLabelProvider();
text.setImage("page", lp.get(PDEPluginImages.DESC_PAGE_OBJ, SharedLabelProvider.F_EDIT)); //$NON-NLS-1$
text.setImage("dependencies", JavaUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_EXTERNAL_ARCHIVE_WITH_SOURCE)); //$NON-NLS-1$
// TODO Replace these with appropriate images as needed. MTP
// text.setImage("export", BeansGraphImages.getImage(BeansGraphImages.IMG_OBJS_EXPORT_ENABLED));
text.addHyperlinkListener(this);
section.setClient(container);
}
protected final Section createStaticSection(FormToolkit toolkit, Composite parent, String text) {
Section section = toolkit.createSection(parent, ExpandableComposite.TITLE_BAR);
section.clientVerticalSpacing = FormLayoutFactory.SECTION_HEADER_VERTICAL_SPACING;
section.setText(text);
section.setLayout(FormLayoutFactory.createClearTableWrapLayout(false, 1));
TableWrapData data = new TableWrapData(TableWrapData.FILL_GRAB);
section.setLayoutData(data);
return section;
}
protected Composite createStaticSectionClient(FormToolkit toolkit, Composite parent) {
Composite container = toolkit.createComposite(parent, SWT.NONE);
container.setLayout(FormLayoutFactory.createSectionClientTableWrapLayout(false, 1));
TableWrapData data = new TableWrapData(TableWrapData.FILL_GRAB);
container.setLayoutData(data);
return container;
}
protected final FormText createClient(Composite section, String content, boolean parseTags, FormToolkit toolkit) {
FormText text = toolkit.createFormText(section, true);
try {
text.setText(content, parseTags, false);
} catch (SWTException e) {
text.setText(e.getMessage(), false, false);
}
return text;
}
public void linkActivated(HyperlinkEvent e) {
if (e.getHref().equals("dependencies")) {
getEditor().setActivePage(BundleDependenciesPage.PAGE_ID);
} else if (e.getHref().equals("runtime")) {
getEditor().setActivePage(BundleRuntimePage.PAGE_ID);
} else if (e.getHref().equals("refreshdependencies")) {
IRunnableWithProgress op = new WorkspaceModifyOperation() {
@Override
protected void execute(IProgressMonitor monitor) throws CoreException, InterruptedException {
ServerClasspathContainerUpdateJob.scheduleClasspathContainerUpdateJob(
JavaCore.create(BundleOverviewPage.this.resource.getProject()), BundleManifestManager.IMPORTS_CHANGED);
}
};
try {
PlatformUI.getWorkbench().getProgressService().runInUI(PDEPlugin.getActiveWorkbenchWindow(), op, PDEPlugin.getWorkspace().getRoot());
} catch (InvocationTargetException e1) {
} catch (InterruptedException e1) {
}
} else if (e.getHref().equals("generate")) {
BundlorUiPlugin.runBundlorOnProject(JavaCore.create(this.resource.getProject()));
} else if (e.getHref().equals("exportbundle")) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
BundleExportWizard wizard = new BundleExportWizard();
WizardDialog dialog = new WizardDialog(Display.getDefault().getActiveShell(), wizard);
wizard.init(PlatformUI.getWorkbench(),
new StructuredSelection(new Object[] { JavaCore.create(BundleOverviewPage.this.resource.getProject()) }));
dialog.open();
}
});
}
}
public void linkEntered(HyperlinkEvent e) {
// Nothing to do
}
public void linkExited(HyperlinkEvent e) {
// Nothing to do
}
/** For JUnit testing only * */
public BundleGeneralInfoSection getBundleGeneralInfoSection() {
return this.fInfoSection;
}
}