/******************************************************************************* * 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(); } } }