blob: 64001d143f8e836f0b00f120bf5acc8e5862f6fc [file] [log] [blame]
/*******************************************************************************
* 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");
}
}