blob: ba4b8665a9b6c73fedc883deadeeaaff8693cf19 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2013 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:
* Tasktop Technologies - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.internal.bugzilla.core;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.mylyn.commons.net.AuthenticationCredentials;
import org.eclipse.mylyn.commons.net.AuthenticationType;
import org.eclipse.mylyn.commons.net.Policy;
import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCustomField.FieldType;
import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants.BUGZILLA_REPORT_STATUS_4_0;
import org.eclipse.mylyn.tasks.core.ITask;
import org.eclipse.mylyn.tasks.core.ITaskMapping;
import org.eclipse.mylyn.tasks.core.RepositoryResponse;
import org.eclipse.mylyn.tasks.core.RepositoryStatus;
import org.eclipse.mylyn.tasks.core.TaskRepository;
import org.eclipse.mylyn.tasks.core.data.AbstractTaskDataHandler;
import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper;
import org.eclipse.mylyn.tasks.core.data.TaskData;
import org.eclipse.mylyn.tasks.core.data.TaskDataCollector;
import org.eclipse.mylyn.tasks.core.data.TaskMapper;
/**
* @author Mik Kersten
* @author Rob Elves
*/
public class BugzillaTaskDataHandler extends AbstractTaskDataHandler {
private enum TaskDataVersion {
VERSION_0(0f) {
@Override
void migrate(TaskRepository repository, TaskData data, BugzillaRepositoryConnector connector) {
// ignore
}
},
VERSION_1_0(1.0f) {
@Override
void migrate(TaskRepository repository, TaskData data, BugzillaRepositoryConnector connector) {
// 1: the value was stored in the attribute rather than the key
for (TaskAttribute attribute : new ArrayList<TaskAttribute>(data.getRoot().getAttributes().values())) {
if (attribute.getId().equals(BugzillaAttribute.DESC.getKey())) {
TaskAttribute attrLongDesc = createAttribute(data, BugzillaAttribute.LONG_DESC);
attrLongDesc.setValue(attribute.getValue());
data.getRoot().removeAttribute(BugzillaAttribute.DESC.getKey());
}
}
// Old actions not saved so recreate them upon migration
// delete legacy operations:
Set<TaskAttribute> operationsToRemove = new HashSet<TaskAttribute>();
for (TaskAttribute attribute : data.getAttributeMapper().getAttributesByType(data,
TaskAttribute.TYPE_OPERATION)) {
operationsToRemove.add(attribute);
}
for (TaskAttribute taskAttribute : operationsToRemove) {
data.getRoot().removeAttribute(taskAttribute.getId());
}
RepositoryConfiguration configuration = connector.getRepositoryConfiguration(repository.getRepositoryUrl());
if (configuration != null) {
configuration.addValidOperations(data);
}
}
},
VERSION_2_0(2.0f) {
@Override
void migrate(TaskRepository repository, TaskData data, BugzillaRepositoryConnector connector) {
updateAttribute(data, BugzillaAttribute.LONG_DESC);
}
},
VERSION_3_0(3.0f) {
@Override
void migrate(TaskRepository repository, TaskData data, BugzillaRepositoryConnector connector) {
updateAttribute(data, BugzillaAttribute.NEW_COMMENT);
}
},
VERSION_4_0(4.0f) {
@Override
void migrate(TaskRepository repository, TaskData data, BugzillaRepositoryConnector connector) {
updateAttribute(data, BugzillaAttribute.DEADLINE);
updateAttribute(data, BugzillaAttribute.ACTUAL_TIME);
}
},
VERSION_4_1(4.1f) {
@Override
void migrate(TaskRepository repository, TaskData data, BugzillaRepositoryConnector connector) {
updateAttribute(data, BugzillaAttribute.VOTES);
TaskAttribute attrDeadline = data.getRoot().getMappedAttribute(BugzillaAttribute.VOTES.getKey());
if (attrDeadline != null) {
attrDeadline.getMetaData().setType(BugzillaAttribute.VOTES.getType());
}
}
},
VERSION_4_2(4.2f) {
@Override
void migrate(TaskRepository repository, TaskData data, BugzillaRepositoryConnector connector) {
updateAttribute(data, BugzillaAttribute.CC);
updateAttribute(data, BugzillaAttribute.DEPENDSON);
updateAttribute(data, BugzillaAttribute.BLOCKED);
updateAttribute(data, BugzillaAttribute.BUG_FILE_LOC);
updateAttribute(data, BugzillaAttribute.KEYWORDS);
updateAttribute(data, BugzillaAttribute.STATUS_WHITEBOARD);
updateAttribute(data, BugzillaAttribute.QA_CONTACT);
updateAttribute(data, BugzillaAttribute.NEWCC);
}
},
VERSION_4_3(4.3f) {
@Override
void migrate(TaskRepository repository, TaskData data, BugzillaRepositoryConnector connector) {
// migrate custom attributes
for (TaskAttribute attribute : data.getRoot().getAttributes().values()) {
if (attribute.getId().startsWith(BugzillaCustomField.CUSTOM_FIELD_PREFIX)) {
attribute.getMetaData().setKind(TaskAttribute.KIND_DEFAULT);
attribute.getMetaData().setReadOnly(false);
if (attribute.getOptions().size() > 0) {
attribute.getMetaData().setType(TaskAttribute.TYPE_SINGLE_SELECT);
} else {
attribute.getMetaData().setType(TaskAttribute.TYPE_SHORT_TEXT);
}
}
}
}
},
VERSION_4_4(4.4f) {
@Override
void migrate(TaskRepository repository, TaskData data, BugzillaRepositoryConnector connector) {
// summary didn't have spell checking, update to short rich text
updateAttribute(data, BugzillaAttribute.SHORT_DESC);
}
},
VERSION_4_5(4.5f) {
@Override
void migrate(TaskRepository repository, TaskData data, BugzillaRepositoryConnector connector) {
// migrate custom attributes
RepositoryConfiguration configuration = connector.getRepositoryConfiguration(repository.getRepositoryUrl());
if (configuration == null) {
return;
}
for (TaskAttribute attribute : data.getRoot().getAttributes().values()) {
if (attribute.getId().startsWith(BugzillaCustomField.CUSTOM_FIELD_PREFIX)) {
BugzillaCustomField customField = null;
String actName = attribute.getId();
for (BugzillaCustomField bugzillaCustomField : configuration.getCustomFields()) {
if (actName.equals(bugzillaCustomField.getName())) {
customField = bugzillaCustomField;
break;
}
}
if (customField != null) {
String desc = customField.getDescription();
attribute.getMetaData().defaults().setLabel(desc).setReadOnly(false);
attribute.getMetaData().setKind(TaskAttribute.KIND_DEFAULT);
attribute.getMetaData().setType(TaskAttribute.TYPE_SHORT_TEXT);
switch (customField.getFieldType()) {
case FreeText:
attribute.getMetaData().setType(TaskAttribute.TYPE_SHORT_TEXT);
break;
case DropDown:
attribute.getMetaData().setType(TaskAttribute.TYPE_SINGLE_SELECT);
break;
case MultipleSelection:
attribute.getMetaData().setType(TaskAttribute.TYPE_MULTI_SELECT);
break;
case LargeText:
attribute.getMetaData().setType(TaskAttribute.TYPE_LONG_TEXT);
break;
case DateTime:
attribute.getMetaData().setType(TaskAttribute.TYPE_DATETIME);
break;
default:
List<String> options = customField.getOptions();
if (options.size() > 0) {
attribute.getMetaData().setType(TaskAttribute.TYPE_SINGLE_SELECT);
} else {
attribute.getMetaData().setType(TaskAttribute.TYPE_SHORT_TEXT);
}
}
attribute.getMetaData().setReadOnly(false);
}
}
}
}
},
VERSION_4_6(4.6f) {
@Override
void migrate(TaskRepository repository, TaskData data, BugzillaRepositoryConnector connector) {
// set kind for flags
String bugzillaVersionString = repository.getVersion();
BugzillaVersion bugzillaVersion = new BugzillaVersion(bugzillaVersionString);
if (bugzillaVersion.compareTo(BugzillaVersion.BUGZILLA_3_2) >= 0) {
for (TaskAttribute attribute : data.getRoot().getAttributes().values()) {
if (attribute.getId().startsWith(BugzillaAttribute.KIND_FLAG)) {
attribute.getMetaData().setKind(BugzillaAttribute.KIND_FLAG);
}
}
}
}
},
VERSION_4_7(4.7f) {
@Override
void migrate(TaskRepository repository, TaskData data, BugzillaRepositoryConnector connector) {
TaskAttribute exporter = data.getRoot().getAttribute(BugzillaAttribute.EXPORTER_NAME.getKey());
if (exporter == null) {
String exporterName = repository.getUserName();
if (exporterName != null && !exporterName.equals("")) { //$NON-NLS-1$
exporter = data.getRoot().createAttribute(BugzillaAttribute.EXPORTER_NAME.getKey());
exporter.setValue(exporterName);
}
}
}
},
VERSION_CURRENT(4.8f) {
@Override
void migrate(TaskRepository repository, TaskData data, BugzillaRepositoryConnector connector) {
data.setVersion(TaskDataVersion.VERSION_CURRENT.toString());
}
};
private float versionNumber = 0;
TaskDataVersion(float verNum) {
versionNumber = verNum;
}
public float getVersionNum() {
return versionNumber;
}
abstract void migrate(TaskRepository repository, TaskData data, BugzillaRepositoryConnector connector);
@Override
public String toString() {
return "" + getVersionNum(); //$NON-NLS-1$
}
private static void updateAttribute(TaskData data, BugzillaAttribute bugAttribute) {
TaskAttribute attribute = data.getRoot().getMappedAttribute(bugAttribute.getKey());
if (attribute != null) {
attribute.getMetaData().setType(bugAttribute.getType());
attribute.getMetaData().setReadOnly(bugAttribute.isReadOnly());
attribute.getMetaData().setKind(bugAttribute.getKind());
}
}
}
protected final BugzillaRepositoryConnector connector;
public BugzillaTaskDataHandler(BugzillaRepositoryConnector connector) {
this.connector = connector;
}
public TaskData getTaskData(TaskRepository repository, String taskId, IProgressMonitor monitor)
throws CoreException {
Set<String> taskIds = new HashSet<String>();
taskIds.add(taskId);
final TaskData[] retrievedData = new TaskData[1];
TaskDataCollector collector = new TaskDataCollector() {
@Override
public void accept(TaskData taskData) {
retrievedData[0] = taskData;
}
};
getMultiTaskData(repository, taskIds, collector, monitor);
if (retrievedData[0] == null) {
throw new CoreException(new Status(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
"Task data could not be retrieved. Please re-synchronize task")); //$NON-NLS-1$
}
return retrievedData[0];
// monitor = Policy.monitorFor(monitor);
// try {
// monitor.beginTask("Receiving task", IProgressMonitor.UNKNOWN);
// BugzillaClient client = connector.getClientManager().getClient(repository, monitor);
// int bugId = BugzillaRepositoryConnector.getBugId(taskId);
// TaskData taskData = client.getTaskData(bugId, getAttributeMapper(repository), monitor);
// if (taskData == null) {
// throw new CoreException(new Status(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
// "Task data could not be retrieved. Please re-synchronize task"));
// }
// return taskData;
// } catch (IOException e) {
// throw new CoreException(new BugzillaStatus(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
// RepositoryStatus.ERROR_IO, repository.getRepositoryUrl(), e));
// } finally {
// monitor.done();
// }
}
@Override
public void getMultiTaskData(final TaskRepository repository, Set<String> taskIds,
final TaskDataCollector collector, IProgressMonitor monitor) throws CoreException {
monitor = Policy.monitorFor(monitor);
try {
monitor.beginTask(Messages.BugzillaTaskDataHandler_Receiving_tasks, taskIds.size());
final BugzillaClient client = connector.getClientManager().getClient(repository, monitor);
final CoreException[] collectionException = new CoreException[1];
final Boolean[] updateConfig = new Boolean[1];
class CollectorWrapper extends TaskDataCollector {
private final IProgressMonitor monitor2;
private final TaskDataCollector collector;
@Override
public void failed(String taskId, IStatus status) {
collector.failed(taskId, status);
}
public CollectorWrapper(TaskDataCollector collector, IProgressMonitor monitor2) {
this.collector = collector;
this.monitor2 = monitor2;
}
@Override
public void accept(TaskData taskData) {
try {
initializeTaskData(repository, taskData, null, new SubProgressMonitor(monitor2, 1));
} catch (CoreException e) {
// this info CoreException is only used internal
if (e.getStatus().getCode() == IStatus.INFO && e.getMessage().contains("Update Config")) { //$NON-NLS-1$
if (updateConfig[0] == null) {
updateConfig[0] = new Boolean(true);
}
} else if (collectionException[0] == null) {
collectionException[0] = e;
}
}
collector.accept(taskData);
monitor2.worked(1);
}
}
TaskDataCollector collector2 = new CollectorWrapper(collector, monitor);
client.getTaskData(taskIds, collector2, getAttributeMapper(repository), monitor);
if (collectionException[0] != null) {
throw collectionException[0];
}
if (updateConfig[0] != null) {
SubProgressMonitor subMonitor = new SubProgressMonitor(monitor, 1);
client.getRepositoryConfiguration(subMonitor, null);
subMonitor.done();
}
} catch (IOException e) {
throw new CoreException(new BugzillaStatus(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
RepositoryStatus.ERROR_IO, repository.getRepositoryUrl(), e));
} finally {
monitor.done();
}
}
@Override
public void migrateTaskData(TaskRepository taskRepository, TaskData taskData) {
float bugzillaTaskDataVersion = 0;
{
String taskDataVersion = taskData.getVersion();
if (taskDataVersion != null) {
try {
bugzillaTaskDataVersion = Float.parseFloat(taskDataVersion);
} catch (NumberFormatException e) {
bugzillaTaskDataVersion = 0;
}
}
}
for (TaskDataVersion version : TaskDataVersion.values()) {
if (bugzillaTaskDataVersion <= version.getVersionNum()) {
version.migrate(taskRepository, taskData, connector);
}
}
}
@Override
public RepositoryResponse postTaskData(TaskRepository repository, TaskData taskData,
Set<TaskAttribute> changedAttributes, IProgressMonitor monitor) throws CoreException {
monitor = Policy.monitorFor(monitor);
try {
monitor.beginTask(Messages.BugzillaTaskDataHandler_Submitting_task, IProgressMonitor.UNKNOWN);
BugzillaClient client = connector.getClientManager().getClient(repository, monitor);
try {
return client.postTaskData(taskData, monitor);
} catch (CoreException e) {
throw e;
}
} catch (IOException e) {
throw new CoreException(new BugzillaStatus(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
RepositoryStatus.ERROR_IO, repository.getRepositoryUrl(), e));
} finally {
monitor.done();
}
}
@Override
public boolean initializeTaskData(TaskRepository repository, TaskData taskData, ITaskMapping initializationData,
IProgressMonitor monitor) throws CoreException {
// Note: setting current version to latest assumes the data arriving here is either for a new task or is
// fresh from the repository (not locally stored data that may not have been migrated).
taskData.setVersion(TaskDataVersion.VERSION_CURRENT.toString());
try {
monitor = Policy.monitorFor(monitor);
monitor.beginTask("Initialize Task Data", IProgressMonitor.UNKNOWN); //$NON-NLS-1$
RepositoryConfiguration repositoryConfiguration = connector.getRepositoryConfiguration(repository, false,
monitor);
if (repositoryConfiguration == null) {
throw new CoreException(new BugzillaStatus(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
RepositoryStatus.ERROR_REPOSITORY_LOGIN, repository.getRepositoryUrl(),
"Retrieving repository configuration failed.")); //$NON-NLS-1$
}
if (taskData.isNew()) {
String product = null;
String component = null;
if (initializationData == null || initializationData.getProduct() == null) {
if (repositoryConfiguration.getOptionValues(BugzillaAttribute.PRODUCT).size() > 0) {
product = repositoryConfiguration.getOptionValues(BugzillaAttribute.PRODUCT).get(0);
}
} else {
product = initializationData.getProduct();
}
if (product == null) {
return false;
}
if (initializationData != null && initializationData.getComponent() != null
&& initializationData.getComponent().length() > 0) {
component = initializationData.getComponent();
}
initializeNewTaskDataAttributes(repositoryConfiguration, taskData, product, component, monitor);
if (connector != null) {
connector.setPlatformDefaultsOrGuess(repository, taskData);
}
return true;
} else {
boolean shortLogin = Boolean.parseBoolean(repository.getProperty(IBugzillaConstants.REPOSITORY_SETTING_SHORT_LOGIN));
repositoryConfiguration.configureTaskData(taskData, shortLogin, connector);
}
// boolean updateConfig = false;
for (TaskAttribute taskAttribute : taskData.getRoot().getAttributes().values()) {
Map<String, String> opt = taskAttribute.getOptions();
if (opt != null && !opt.isEmpty()) {
List<String> values = taskAttribute.getValues();
for (String value : values) {
if (!opt.containsKey(value)) {
taskAttribute.putOption(value, value);
// updateConfig = true;
}
}
}
}
//TODO: enable this if we want to do the Configuration update
// if (updateConfig) {
// // this info CoreException is only used internal
// throw new CoreException(new BugzillaStatus(IStatus.INFO, BugzillaCorePlugin.ID_PLUGIN, IStatus.INFO,
// repository.getRepositoryUrl(), "Update Config")); //$NON-NLS-1$
// }
} finally {
monitor.done();
}
return true;
}
/**
* Only new, unsubmitted task data or freshly received task data from the repository can be passed in here.
*
* @param component
*/
private boolean initializeNewTaskDataAttributes(RepositoryConfiguration repositoryConfiguration, TaskData taskData,
String product, String component, IProgressMonitor monitor) {
TaskAttribute productAttribute = createAttribute(taskData, BugzillaAttribute.PRODUCT);
productAttribute.setValue(product);
List<String> optionValues = repositoryConfiguration.getOptionValues(BugzillaAttribute.PRODUCT);
Collections.sort(optionValues);
for (String optionValue : optionValues) {
productAttribute.putOption(optionValue, optionValue);
}
TaskAttribute attributeStatus = createAttribute(taskData, BugzillaAttribute.BUG_STATUS);
optionValues = repositoryConfiguration.getOptionValues(BugzillaAttribute.BUG_STATUS);
for (String option : optionValues) {
attributeStatus.putOption(option, option);
}
BugzillaVersion bugzillaVersion = repositoryConfiguration.getInstallVersion();
if (bugzillaVersion == null) {
bugzillaVersion = BugzillaVersion.MIN_VERSION;
}
if (bugzillaVersion.compareMajorMinorOnly(BugzillaVersion.BUGZILLA_4_0) < 0) {
attributeStatus.setValue(repositoryConfiguration.getStartStatus());
} else {
if (repositoryConfiguration.getOptionValues(BugzillaAttribute.BUG_STATUS).contains(
BUGZILLA_REPORT_STATUS_4_0.IN_PROGRESS.toString())
|| repositoryConfiguration.getOptionValues(BugzillaAttribute.BUG_STATUS).contains(
BUGZILLA_REPORT_STATUS_4_0.CONFIRMED.toString())) {
attributeStatus.setValue(IBugzillaConstants.BUGZILLA_REPORT_STATUS_4_0.START.toString());
repositoryConfiguration.addValidOperations(taskData);
} else {
attributeStatus.setValue(repositoryConfiguration.getStartStatus());
}
}
createAttribute(taskData, BugzillaAttribute.SHORT_DESC);
TaskAttribute attributeVersion = createAttribute(taskData, BugzillaAttribute.VERSION);
optionValues = repositoryConfiguration.getProductOptionValues(BugzillaAttribute.VERSION,
productAttribute.getValue());
Collections.sort(optionValues);
for (String option : optionValues) {
attributeVersion.putOption(option, option);
}
if (optionValues.size() > 0) {
attributeVersion.setValue(optionValues.get(optionValues.size() - 1));
}
TaskAttribute attributeComponent = createAttribute(taskData, BugzillaAttribute.COMPONENT);
optionValues = repositoryConfiguration.getProductOptionValues(BugzillaAttribute.COMPONENT,
productAttribute.getValue());
Collections.sort(optionValues);
for (String option : optionValues) {
attributeComponent.putOption(option, option);
}
if (optionValues.size() == 1) {
attributeComponent.setValue(optionValues.get(0));
}
if (component != null && optionValues.contains(component)) {
attributeComponent.setValue(component);
}
TaskRepository taskRepository = taskData.getAttributeMapper().getTaskRepository();
if (BugzillaUtil.getTaskPropertyWithDefaultTrue(taskRepository,
IBugzillaConstants.BUGZILLA_PARAM_USETARGETMILESTONE)) {
optionValues = repositoryConfiguration.getProductOptionValues(BugzillaAttribute.TARGET_MILESTONE,
productAttribute.getValue());
if (optionValues.size() > 0) {
TaskAttribute attributeTargetMilestone = createAttribute(taskData, BugzillaAttribute.TARGET_MILESTONE);
for (String option : optionValues) {
attributeTargetMilestone.putOption(option, option);
}
if (product != null && !product.equals("")) { //$NON-NLS-1$
String defaultMilestone = repositoryConfiguration.getDefaultMilestones(product);
if (defaultMilestone != null) {
attributeTargetMilestone.setValue(defaultMilestone);
} else {
if (optionValues.contains("---")) { //$NON-NLS-1$
attributeTargetMilestone.setValue("---"); //$NON-NLS-1$
}
}
} else {
if (optionValues.contains("---")) { //$NON-NLS-1$
attributeTargetMilestone.setValue("---"); //$NON-NLS-1$
}
}
}
}
TaskAttribute attributePlatform = createAttribute(taskData, BugzillaAttribute.REP_PLATFORM);
optionValues = repositoryConfiguration.getOptionValues(BugzillaAttribute.REP_PLATFORM);
for (String option : optionValues) {
attributePlatform.putOption(option, option);
}
if (optionValues.size() > 0) {
// bug 159397 choose first platform: All
attributePlatform.setValue(optionValues.get(0));
}
TaskAttribute attributeOPSYS = createAttribute(taskData, BugzillaAttribute.OP_SYS);
optionValues = repositoryConfiguration.getOptionValues(BugzillaAttribute.OP_SYS);
for (String option : optionValues) {
attributeOPSYS.putOption(option, option);
}
if (optionValues.size() > 0) {
// bug 159397 change to choose first op_sys All
attributeOPSYS.setValue(optionValues.get(0));
}
TaskAttribute attributePriority = createAttribute(taskData, BugzillaAttribute.PRIORITY);
optionValues = repositoryConfiguration.getOptionValues(BugzillaAttribute.PRIORITY);
for (String option : optionValues) {
attributePriority.putOption(option, option);
}
if (optionValues.size() > 0) {
// choose middle priority
attributePriority.setValue(optionValues.get((optionValues.size() / 2)));
}
TaskAttribute attributeSeverity = createAttribute(taskData, BugzillaAttribute.BUG_SEVERITY);
optionValues = repositoryConfiguration.getOptionValues(BugzillaAttribute.BUG_SEVERITY);
for (String option : optionValues) {
attributeSeverity.putOption(option, option);
}
if (optionValues.size() > 0) {
// choose middle severity
attributeSeverity.setValue(optionValues.get((optionValues.size() / 2)));
}
TaskAttribute attributeAssignedTo = createAttribute(taskData, BugzillaAttribute.ASSIGNED_TO);
attributeAssignedTo.setValue(""); //$NON-NLS-1$
if (BugzillaUtil.getTaskPropertyWithDefaultTrue(taskRepository, IBugzillaConstants.BUGZILLA_PARAM_USEQACONTACT)) {
TaskAttribute attributeQAContact = createAttribute(taskData, BugzillaAttribute.QA_CONTACT);
attributeQAContact.setValue(""); //$NON-NLS-1$
}
TaskAttribute attributeBugFileLoc = createAttribute(taskData, BugzillaAttribute.BUG_FILE_LOC);
attributeBugFileLoc.setValue("http://"); //$NON-NLS-1$
createAttribute(taskData, BugzillaAttribute.DEPENDSON);
createAttribute(taskData, BugzillaAttribute.BLOCKED);
createAttribute(taskData, BugzillaAttribute.NEWCC);
createAttribute(taskData, BugzillaAttribute.LONG_DESC);
List<String> keywords = repositoryConfiguration.getOptionValues(BugzillaAttribute.KEYWORDS);
if (keywords.size() > 0) {
createAttribute(taskData, BugzillaAttribute.KEYWORDS);
}
TaskAttribute attrDescription = taskData.getRoot().getMappedAttribute(TaskAttribute.DESCRIPTION);
if (attrDescription != null) {
attrDescription.getMetaData().setReadOnly(false);
}
TaskAttribute attrOwner = taskData.getRoot().getMappedAttribute(TaskAttribute.USER_ASSIGNED);
if (attrOwner != null) {
attrOwner.getMetaData().setReadOnly(false);
}
TaskAttribute attrAddSelfToCc = taskData.getRoot().getMappedAttribute(TaskAttribute.ADD_SELF_CC);
if (attrAddSelfToCc != null) {
attrAddSelfToCc.getMetaData().setKind(null);
}
List<BugzillaCustomField> customFields = new ArrayList<BugzillaCustomField>();
if (repositoryConfiguration != null) {
customFields = repositoryConfiguration.getCustomFields();
}
for (BugzillaCustomField bugzillaCustomField : customFields) {
if (bugzillaCustomField.isEnterBug()) {
List<String> options = bugzillaCustomField.getOptions();
FieldType fieldType = bugzillaCustomField.getFieldType();
if (options.size() < 1
&& (fieldType.equals(FieldType.DropDown) || fieldType.equals(FieldType.MultipleSelection))) {
continue;
}
TaskAttribute attribute = taskData.getRoot().createAttribute(bugzillaCustomField.getName());
if (attribute != null) {
attribute.getMetaData().defaults().setLabel(bugzillaCustomField.getDescription());
attribute.getMetaData().setKind(TaskAttribute.KIND_DEFAULT);
switch (bugzillaCustomField.getFieldType()) {
case FreeText:
attribute.getMetaData().setType(TaskAttribute.TYPE_SHORT_TEXT);
break;
case DropDown:
attribute.getMetaData().setType(TaskAttribute.TYPE_SINGLE_SELECT);
break;
case MultipleSelection:
attribute.getMetaData().setType(TaskAttribute.TYPE_MULTI_SELECT);
break;
case LargeText:
attribute.getMetaData().setType(TaskAttribute.TYPE_LONG_TEXT);
break;
case DateTime:
attribute.getMetaData().setType(TaskAttribute.TYPE_DATETIME);
break;
default:
if (options.size() > 0) {
attribute.getMetaData().setType(TaskAttribute.TYPE_SINGLE_SELECT);
} else {
attribute.getMetaData().setType(TaskAttribute.TYPE_SHORT_TEXT);
}
}
attribute.getMetaData().setReadOnly(false);
for (String option : options) {
attribute.putOption(option, option);
}
if (bugzillaCustomField.getFieldType() == BugzillaCustomField.FieldType.DropDown
&& options.size() > 0) {
attribute.setValue(options.get(0));
}
}
}
}
return true;
}
@Override
public boolean canGetMultiTaskData(TaskRepository taskRepository) {
return true;
}
@Override
public boolean canInitializeSubTaskData(TaskRepository taskRepository, ITask task) {
return true;
}
@Override
public boolean initializeSubTaskData(TaskRepository repository, TaskData subTaskData, TaskData parentTaskData,
IProgressMonitor monitor) throws CoreException {
TaskMapper mapper = new TaskMapper(parentTaskData);
if (initializeTaskData(repository, subTaskData, mapper, monitor)) {
new TaskMapper(subTaskData).merge(mapper);
subTaskData.getRoot().getMappedAttribute(BugzillaAttribute.DEPENDSON.getKey()).setValue(""); //$NON-NLS-1$
subTaskData.getRoot().getMappedAttribute(TaskAttribute.DESCRIPTION).setValue(""); //$NON-NLS-1$
subTaskData.getRoot().getMappedAttribute(TaskAttribute.SUMMARY).setValue(""); //$NON-NLS-1$
TaskAttribute keywords = subTaskData.getRoot().getMappedAttribute(TaskAttribute.KEYWORDS);
if (keywords != null) {
// only if the repository has keywords this attribut exists
keywords.setValue(""); //$NON-NLS-1$
}
subTaskData.getRoot().getAttribute(BugzillaAttribute.BLOCKED.getKey()).setValue(parentTaskData.getTaskId());
TaskAttribute parentAttributeAssigned = parentTaskData.getRoot().getMappedAttribute(
TaskAttribute.USER_ASSIGNED);
subTaskData.getRoot()
.getAttribute(BugzillaAttribute.ASSIGNED_TO.getKey())
.setValue(parentAttributeAssigned.getValue());
return true;
} else {
return false;
}
}
@Override
public TaskAttributeMapper getAttributeMapper(TaskRepository taskRepository) {
return new BugzillaAttributeMapper(taskRepository, connector);
}
public static TaskAttribute createAttribute(TaskData data, BugzillaAttribute key) {
return createAttribute(data.getRoot(), key);
}
public static TaskAttribute createAttribute(TaskAttribute parent, BugzillaAttribute key) {
TaskAttribute attribute = parent.createAttribute(key.getKey());
attribute.getMetaData()
.defaults()
.setReadOnly(key.isReadOnly())
.setKind(key.getKind())
.setLabel(key.toString())
.setType(key.getType());
if (key == BugzillaAttribute.STATUS_WHITEBOARD) {
attribute.getMetaData().putValue(TaskAttribute.META_INDEXED_AS_CONTENT, Boolean.TRUE.toString());
}
return attribute;
}
public void postUpdateAttachment(TaskRepository repository, TaskAttribute taskAttribute, String action,
IProgressMonitor monitor) throws CoreException {
monitor = Policy.monitorFor(monitor);
try {
monitor.beginTask(Messages.BugzillaTaskDataHandler_updating_attachment, IProgressMonitor.UNKNOWN);
BugzillaClient client = connector.getClientManager().getClient(repository, monitor);
try {
client.postUpdateAttachment(taskAttribute, action, monitor);
} catch (CoreException e) {
// TODO: Move retry handling into client
if (e.getStatus().getCode() == RepositoryStatus.ERROR_REPOSITORY_LOGIN) {
AuthenticationCredentials creds = repository.getCredentials(AuthenticationType.REPOSITORY);
if (creds != null && creds.getUserName() != null && creds.getUserName().length() > 0) {
client.postUpdateAttachment(taskAttribute, action, monitor);
} else {
throw e;
}
} else {
throw e;
}
}
} catch (IOException e) {
throw new CoreException(new BugzillaStatus(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
RepositoryStatus.ERROR_IO, repository.getRepositoryUrl(), e));
} finally {
monitor.done();
}
}
}