/******************************************************************************* * Copyright (c) 2010, 2011 Tasktop Technologies and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Markus Knittig - initial API and implementation *******************************************************************************/ package org.eclipse.mylyn.internal.builds.ui.actions; import java.util.List; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.mylyn.builds.core.BuildStatus; import org.eclipse.mylyn.builds.core.IBuild; import org.eclipse.mylyn.builds.core.IBuildPlan; import org.eclipse.mylyn.builds.core.IChange; import org.eclipse.mylyn.builds.core.IChangeArtifact; import org.eclipse.mylyn.builds.core.ITestCase; import org.eclipse.mylyn.builds.core.ITestSuite; import org.eclipse.mylyn.builds.core.TestCaseResult; import org.eclipse.mylyn.commons.core.DateUtil; import org.eclipse.mylyn.commons.workbench.WorkbenchUtil; import org.eclipse.mylyn.tasks.core.TaskMapping; import org.eclipse.mylyn.tasks.ui.TasksUiImages; import org.eclipse.mylyn.tasks.ui.TasksUiUtil; import org.eclipse.osgi.util.NLS; import org.eclipse.ui.actions.BaseSelectionListenerAction; /** * @author Steffen Pingel */ public class NewTaskFromBuildAction extends BaseSelectionListenerAction { public NewTaskFromBuildAction() { super("New Task from Build..."); setToolTipText("New Task from Build"); setImageDescriptor(TasksUiImages.TASK_NEW); } @Override protected boolean updateSelection(IStructuredSelection selection) { return (selection.getFirstElement() instanceof IBuildPlan || selection.getFirstElement() instanceof IBuild); } @Override public void run() { Object selection = getStructuredSelection().getFirstElement(); if (selection instanceof IBuild) { createTask((IBuild) selection); } } public static boolean createTask(final IBuild build) { TaskMapping mapping = new TaskMapping() { @Override public String getSummary() { BuildStatus status = build.getStatus(); if (status != null) { return NLS.bind("Build {0}: {1}", build.getLabel(), status.toString()); } else { return NLS.bind("Build {0}", build.getLabel()); } } @Override public String getDescription() { StringBuilder sb = new StringBuilder(); sb.append(NLS.bind("Build Results at {0} .\n", build.getUrl())); sb.append("\n"); if (build.getChangeSet() != null && build.getChangeSet().getChanges().size() > 0) { sb.append("= Changes =\n"); sb.append("\n"); sb.append("Changed Files:"); sb.append("\n"); for (IChange change : build.getChangeSet().getChanges()) { // if (change.getAuthor() != null) { // sb.append(NLS.bind("Changes by {0}", change.getAuthor().getLabel())); // sb.append("\n"); // } for (IChangeArtifact artifact : change.getArtifacts()) { sb.append(" " + artifact.getFile()); } sb.append("\n"); } sb.append("\n"); } if (build.getTestResult() != null) { sb.append("= Tests Results =\n"); sb.append(NLS.bind("Duration: {0}", DateUtil.getFormattedDurationShort(build.getTestResult().getDuration()))); sb.append("\n"); sb.append("Failed Tests:\n"); appendFailed(sb, build.getTestResult().getSuites()); sb.append("\n"); } return sb.toString(); } }; return TasksUiUtil.openNewTaskEditor(WorkbenchUtil.getShell(), mapping, null); } public static void appendFailed(StringBuilder sb, List<ITestSuite> suites) { for (ITestSuite suite : suites) { for (ITestCase testCase : suite.getCases()) { if (testCase.getStatus() == TestCaseResult.FAILED || testCase.getStatus() == TestCaseResult.REGRESSION) { append(sb, testCase); } } } } public static void append(StringBuilder sb, ITestSuite suite) { for (ITestCase testCase : suite.getCases()) { append(sb, testCase); } } public static void append(StringBuilder sb, ITestCase testCase) { if (testCase.getStackTrace() != null) { sb.append(testCase.getStackTrace()); } else { sb.append(" "); sb.append(testCase.getClassName()); if (testCase.getLabel() != null) { sb.append("."); sb.append(testCase.getLabel()); // emulate stack trace format to hyperlink tests in task editor sb.append("("); String className = testCase.getClassName(); int i = className.lastIndexOf("."); if (i != -1) { className = className.substring(i + 1); } i = className.lastIndexOf("$"); if (i != -1) { className = className.substring(0, i); } sb.append(className); sb.append(".java:0)"); } } sb.append("\n"); } }