| package org.eclipse.epp.logging.aeri.ide.manual; |
| |
| import java.io.File; |
| import java.io.IOException; |
| import java.net.URI; |
| import java.net.URISyntaxException; |
| import java.net.URL; |
| import java.text.MessageFormat; |
| import java.util.Enumeration; |
| import java.util.List; |
| import java.util.Map.Entry; |
| |
| import org.eclipse.core.runtime.FileLocator; |
| import org.eclipse.core.runtime.ILog; |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.Platform; |
| import org.eclipse.core.runtime.Status; |
| import org.eclipse.core.runtime.jobs.Job; |
| import org.eclipse.epp.logging.aeri.tests.scenarios.Scenario; |
| import org.eclipse.epp.logging.aeri.tests.scenarios.ScenarioParser; |
| import org.eclipse.epp.logging.aeri.tests.util.StackTraceParser; |
| import org.eclipse.jface.dialogs.MessageDialog; |
| 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.graphics.Rectangle; |
| import org.eclipse.swt.program.Program; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Control; |
| import org.eclipse.swt.widgets.Display; |
| import org.eclipse.swt.widgets.Menu; |
| import org.eclipse.swt.widgets.MenuItem; |
| import org.eclipse.swt.widgets.ToolBar; |
| import org.eclipse.swt.widgets.ToolItem; |
| import org.osgi.framework.Bundle; |
| import org.osgi.framework.FrameworkUtil; |
| |
| import com.google.common.base.Strings; |
| import com.google.common.io.Files; |
| |
| public class TestScenariosContribution extends org.eclipse.ui.menus.WorkbenchWindowControlContribution { |
| |
| private ILog log = Platform.getLog(FrameworkUtil.getBundle(getClass())); |
| public static final String PROP_SCENARIOS_DIR = "aeri.test.scenarios.dir"; |
| |
| public TestScenariosContribution() { |
| } |
| |
| public TestScenariosContribution(String id) { |
| super(id); |
| } |
| |
| @Override |
| protected Control createControl(Composite parent) { |
| |
| ToolBar toolBar = new ToolBar(parent, SWT.FLAT); |
| |
| ToolItem toolItem = new ToolItem(toolBar, SWT.DROP_DOWN); |
| toolItem.setText("Log..."); |
| toolItem.addSelectionListener(new SelectionAdapter() { |
| @Override |
| public void widgetSelected(SelectionEvent e) { |
| Rectangle rect = ((ToolItem) e.getSource()).getBounds(); |
| Point pt = new Point(rect.x, rect.y + rect.height); |
| pt = toolBar.toDisplay(pt); |
| Menu menu = new Menu(toolBar); |
| hookFillMenu(menu); |
| menu.setLocation(pt.x, pt.y); |
| menu.setVisible(true); |
| } |
| }); |
| |
| return toolBar; |
| } |
| |
| private void hookFillMenu(Menu menu) { |
| File scenariosDir = getScenariosDir(); |
| try { |
| hookDirectoryScenarios(menu, scenariosDir); |
| } catch (IOException e) { |
| e.printStackTrace(); |
| } |
| new MenuItem(menu, SWT.SEPARATOR); |
| MenuItem menuItemCategory = new MenuItem(menu, SWT.CASCADE); |
| menuItemCategory.setText("Open scenarios directory\u2026"); |
| menuItemCategory.addSelectionListener(new SelectionAdapter() { |
| @Override |
| public void widgetSelected(SelectionEvent e) { |
| Program.launch(scenariosDir.getAbsolutePath()); |
| } |
| }); |
| new MenuItem(menu, SWT.SEPARATOR); |
| hookPredefinedScenarios(menu); |
| |
| } |
| |
| private File getScenariosDir() { |
| String scenariosDirProperty = System.getProperty(PROP_SCENARIOS_DIR); |
| File scenariosDir = null; |
| if (scenariosDirProperty != null) { |
| scenariosDir = new File(scenariosDirProperty); |
| if (!scenariosDir.exists() && !scenariosDir.mkdirs()) { |
| throw new IllegalStateException("Could not create test scenarios directory " + scenariosDir); |
| } |
| } |
| if (scenariosDir == null || !scenariosDir.isDirectory()) { |
| Bundle bundle = FrameworkUtil.getBundle(getClass()); |
| scenariosDir = Platform.getStateLocation(bundle).toFile(); |
| } |
| return scenariosDir; |
| } |
| |
| private void hookDirectoryScenarios(Menu menu, File scenarioDirectory) throws IOException { |
| if (isEmptyPluginStateLocation(scenarioDirectory)) { |
| copyTestResourcesScenarios(scenarioDirectory); |
| } |
| ScenarioParser parser = new ScenarioParser(); |
| for (File f : scenarioDirectory.listFiles()) { |
| List<Scenario> scenarios = parser.parseScenarios(f); |
| if (scenarios.isEmpty()) { |
| continue; |
| } |
| |
| MenuItem menuItemCategory = new MenuItem(menu, SWT.CASCADE); |
| menuItemCategory.setText(f.getName()); |
| |
| Menu menuScenarios = new Menu(menu); |
| for (Scenario scenario : scenarios) { |
| addScenarioMenuItem(scenario, menuScenarios); |
| } |
| menuItemCategory.setMenu(menuScenarios); |
| } |
| } |
| |
| private boolean isEmptyPluginStateLocation(File dir) { |
| return System.getProperty(PROP_SCENARIOS_DIR) == null && dir.listFiles().length == 0; |
| } |
| |
| private void hookPredefinedScenarios(Menu menu) { |
| MenuItem defaultScenarios = new MenuItem(menu, SWT.CASCADE); |
| defaultScenarios.setText("Hardcoded"); |
| Menu scenarios = new Menu(menu); |
| for (Entry<String, Runnable> entry : TestScenarios.TEST_SCENARIOS.entrySet()) { |
| MenuItem menuItem = new MenuItem(scenarios, SWT.NONE); |
| menuItem.setText(entry.getKey()); |
| menuItem.addSelectionListener(new SelectionAdapter() { |
| @Override |
| public void widgetSelected(SelectionEvent e) { |
| ensureBuildIdIsSet(); |
| entry.getValue().run(); |
| } |
| }); |
| } |
| defaultScenarios.setMenu(scenarios); |
| } |
| |
| private void copyTestResourcesScenarios(File toDirectory) { |
| Bundle bundle = Platform.getBundle(org.eclipse.epp.logging.aeri.tests.Constants.BUNDLE_ID); |
| Enumeration<String> entryPaths = bundle.getEntryPaths("/resources/"); |
| while (entryPaths.hasMoreElements()) { |
| String entryPath = entryPaths.nextElement(); |
| URL entryUrl = bundle.getEntry(entryPath); |
| try { |
| URL fileUrl = FileLocator.toFileURL(entryUrl); |
| URI resolved = new URI(fileUrl.getProtocol(), fileUrl.getPath(), null); |
| File file = new File(resolved); |
| Files.copy(file, new File(toDirectory, file.getName())); |
| } catch (URISyntaxException e) { |
| e.printStackTrace(); |
| continue; |
| } catch (IOException e) { |
| e.printStackTrace(); |
| continue; |
| } |
| } |
| } |
| |
| private void addScenarioMenuItem(Scenario scenario, Menu menuScenarios) { |
| String name = scenario.getName(); |
| if (name.equals("---")) { |
| new MenuItem(menuScenarios, SWT.SEPARATOR); |
| } else if (name.startsWith("-")) { |
| MenuItem menuItem = new MenuItem(menuScenarios, SWT.NONE); |
| menuItem.setText(name); |
| menuItem.setEnabled(false); |
| } else { |
| |
| MenuItem menuItemScenario = new MenuItem(menuScenarios, SWT.NONE); |
| menuItemScenario.setText(name); |
| |
| String description = Strings.emptyToNull(scenario.getDescription()); |
| if (description != null) { |
| menuItemScenario.setToolTipText(description); |
| } |
| |
| menuItemScenario.addSelectionListener(new SelectionAdapter() { |
| @Override |
| public void widgetSelected(SelectionEvent e) { |
| executeScenario(scenario); |
| } |
| }); |
| } |
| } |
| |
| private void executeScenario(Scenario scenario) { |
| ensureBuildIdIsSet(); |
| new Job("log error") { |
| |
| @Override |
| protected IStatus run(IProgressMonitor monitor) { |
| try { |
| Throwable throwable = StackTraceParser.parse(scenario.getStackTrace()); |
| Status status = new Status(IStatus.ERROR, scenario.getLoggingPlugin(), scenario.getName(), throwable); |
| log.log(status); |
| } catch (Exception e) { |
| Display.getDefault().asyncExec(() -> MessageDialog.openError(null, "Scenario failed", |
| MessageFormat.format("Scenario \u2018{0}\u2019 failed with exception: {1}", scenario.getName(), e))); |
| |
| } |
| return Status.OK_STATUS; |
| } |
| }.schedule(); |
| } |
| |
| /** |
| * logged statuses are filtered if no build id is set (e.g. in a runtime Eclipse) |
| */ |
| private void ensureBuildIdIsSet() { |
| if (System.getProperty("eclipse.buildId") == null) { |
| System.setProperty("eclipse.buildId", "unit-tests"); |
| } |
| } |
| } |