blob: 547a82e75ac0e90b8d469fecbfa0e16dbb550200 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2013 Tasktop Technologies and others.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* https://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Tasktop Technologies - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.internal.tasks.bugs;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Date;
import java.util.Map;
import org.eclipse.core.runtime.IBundleGroup;
import org.eclipse.core.runtime.IProduct;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.mylyn.internal.tasks.bugs.wizards.ErrorLogStatus;
import org.eclipse.mylyn.internal.tasks.bugs.wizards.ProductStatus;
import org.eclipse.mylyn.tasks.bugs.AbstractSupportHandler;
import org.eclipse.mylyn.tasks.bugs.ISupportRequest;
import org.eclipse.mylyn.tasks.bugs.ISupportResponse;
import org.eclipse.mylyn.tasks.bugs.ITaskContribution;
import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
import org.eclipse.mylyn.tasks.core.ITaskMapping;
import org.eclipse.mylyn.tasks.core.TaskMapping;
import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
import org.eclipse.mylyn.tasks.core.data.TaskData;
import org.eclipse.mylyn.tasks.ui.TasksUi;
import org.eclipse.osgi.util.NLS;
import org.osgi.framework.Bundle;
/**
* @author Steffen Pingel
* @author Frank Becker
*/
public class DefaultSupportHandler extends AbstractSupportHandler {
@Override
public void preProcess(ISupportRequest request) {
ITaskContribution contribution = request.getDefaultContribution();
String description = getDescription(contribution.getStatus());
if (description != null) {
contribution.appendToDescription(description);
}
}
@Override
public void process(ITaskContribution contribution, IProgressMonitor monitor) {
if (contribution.getAttribute(IRepositoryConstants.DESCRIPTION) == null) {
String description = getDescription(contribution.getStatus());
if (description != null) {
contribution.appendToDescription(description);
}
}
}
@Override
public void postProcess(ISupportResponse response, IProgressMonitor monitor) {
IStatus contribution = response.getStatus();
TaskData taskData = response.getTaskData();
if (contribution instanceof ProductStatus) {
if (response instanceof AttributeTaskMapper) {
if (((AttributeTaskMapper) response).getAttribute("severity") == null) { //$NON-NLS-1$
AbstractRepositoryConnector connector = TasksUi.getRepositoryConnector(taskData.getConnectorKind());
ITaskMapping mapping = connector.getTaskMapping(taskData);
mapping.merge(new TaskMapping() {
@Override
public String getSeverity() {
return "enhancement"; //$NON-NLS-1$
}
});
}
}
}
if (response.getProduct() != null) {
SupportProduct supportProduct = (SupportProduct) response.getProduct();
IBundleGroup bundleGroup = getBundleGroup(supportProduct);
if (bundleGroup != null) {
TaskAttribute attribute = taskData.getRoot().getMappedAttribute(TaskAttribute.VERSION);
if (attribute != null) {
final String version = getBestMatch(bundleGroup.getVersion(), attribute.getOptions());
if (version.length() > 0) {
AbstractRepositoryConnector connector = TasksUi
.getRepositoryConnector(taskData.getConnectorKind());
ITaskMapping mapping = connector.getTaskMapping(taskData);
mapping.merge(new TaskMapping() {
@Override
public String getVersion() {
return version;
}
});
}
}
}
}
}
private IBundleGroup getBundleGroup(SupportProduct supportProduct) {
IBundleGroup bundleGroup = supportProduct.getVersioningBundleGroup();
if (bundleGroup == null) {
bundleGroup = supportProduct.getBundleGroup();
}
return bundleGroup;
}
private String getBestMatch(String version, Map<String, String> options) {
String match = ""; //$NON-NLS-1$
for (String option : options.values()) {
if (version.startsWith(option) && option.length() > match.length()) {
match = option;
}
}
return match;
}
public void appendErrorDetails(StringBuilder sb, IStatus status, Date date) {
sb.append("\n\n"); //$NON-NLS-1$
sb.append(Messages.DefaultTaskContributor_Error_Details);
if (date != null) {
sb.append("\n"); //$NON-NLS-1$
sb.append(NLS.bind(Messages.DefaultSupportHandler_Date_X, date));
}
sb.append("\n"); //$NON-NLS-1$
sb.append(NLS.bind(Messages.DefaultSupportHandler_Message_X, status.getMessage()));
sb.append("\n"); //$NON-NLS-1$
sb.append(NLS.bind(Messages.DefaultSupportHandler_Severity_X, getSeverityText(status.getSeverity())));
appendProductInformation(sb);
sb.append("\n"); //$NON-NLS-1$
sb.append(NLS.bind(Messages.DefaultSupportHandler_Plugin_X, status.getPlugin()));
}
private void appendProductInformation(StringBuilder sb) {
IProduct product = Platform.getProduct();
if (product != null) {
sb.append("\n"); //$NON-NLS-1$
if (product.getName() != null) {
sb.append(NLS.bind(Messages.DefaultSupportHandler_Product_X, product.getName()));
} else {
sb.append(NLS.bind(Messages.DefaultSupportHandler_Product_X, product.getId()));
}
Bundle definingBundle = product.getDefiningBundle();
if (definingBundle != null) {
Object version = definingBundle.getHeaders().get("Bundle-Version"); //$NON-NLS-1$
if (version != null) {
sb.append(" "); //$NON-NLS-1$
sb.append(version);
}
}
if (product.getName() != null) {
sb.append(NLS.bind(" ({0})", product.getId())); //$NON-NLS-1$
}
}
}
public String getDescription(IStatus status) {
if (status instanceof ProductStatus) {
SupportProduct product = (SupportProduct) ((ProductStatus) status).getProduct();
IBundleGroup bundleGroup = product.getBundleGroup();
if (bundleGroup != null) {
StringBuilder sb = new StringBuilder();
sb.append("\n\n\n"); //$NON-NLS-1$
sb.append(Messages.DefaultSupportHandler_Configuration_Details);
appendProductInformation(sb);
sb.append(Messages.DefaultSupportHandler_Installed_Features);
appendBundleGroup(bundleGroup, sb);
IBundleGroup versioningBundleGroup = product.getVersioningBundleGroup();
if (versioningBundleGroup != null) {
sb.append(Messages.DefaultSupportHandler_VersioningPlugin);
appendBundleGroup(versioningBundleGroup, sb);
}
return sb.toString();
}
} else if (status instanceof ErrorLogStatus) {
ErrorLogStatus errorLogStatus = (ErrorLogStatus) status;
StringBuilder sb = new StringBuilder();
sb.append("\n\n"); //$NON-NLS-1$
sb.append(Messages.DefaultSupportHandler_What_steps_message);
sb.append("\n"); //$NON-NLS-1$
sb.append(Messages.DefaultSupportHandler_Step_1);
sb.append(Messages.DefaultSupportHandler_Step_2);
sb.append(Messages.DefaultSupportHandler_Step_3);
appendStatus(errorLogStatus, sb, true);
return sb.toString();
} else {
StringBuilder sb = new StringBuilder();
appendErrorDetails(sb, status, new Date());
if (status.getException() != null) {
sb.append(Messages.DefaultTaskContributor_EXCEPTION_STACK_TRACE);
StringWriter writer = new StringWriter();
status.getException().printStackTrace(new PrintWriter(writer));
sb.append(writer.getBuffer());
}
return sb.toString();
}
return null;
}
private void appendBundleGroup(IBundleGroup bundleGroup, StringBuilder sb) {
sb.append("\n"); //$NON-NLS-1$
sb.append(" "); //$NON-NLS-1$
sb.append(bundleGroup.getIdentifier());
sb.append(" "); //$NON-NLS-1$
sb.append(bundleGroup.getVersion());
sb.append("\n"); //$NON-NLS-1$
}
private void appendStatus(IStatus status, StringBuilder sb, boolean includeSessionData) {
Date date = (status instanceof ErrorLogStatus) ? ((ErrorLogStatus) status).getDate() : null;
appendErrorDetails(sb, status, date);
if (status instanceof ErrorLogStatus) {
ErrorLogStatus errorStatus = (ErrorLogStatus) status;
if (includeSessionData && errorStatus.getLogSessionData() != null) {
sb.append(Messages.DefaultTaskContributor_SESSION_DATA);
sb.append(errorStatus.getLogSessionData());
}
if (errorStatus.getStack() != null) {
sb.append(Messages.DefaultTaskContributor_EXCEPTION_STACK_TRACE);
sb.append(errorStatus.getStack());
}
}
IStatus[] children = status.getChildren();
if (children != null) {
for (IStatus child : children) {
appendStatus(child, sb, false);
}
}
}
private String getSeverityText(int severity) {
switch (severity) {
case IStatus.ERROR:
return Messages.DefaultTaskContributor_Error;
case IStatus.WARNING:
return Messages.DefaultTaskContributor_Warning;
case IStatus.INFO:
return Messages.DefaultTaskContributor_Info;
case IStatus.OK:
return Messages.DefaultTaskContributor_OK;
}
return "?"; //$NON-NLS-1$
}
}