// Return an EnterpriseChangeRequest with mapped values needed for the state transiton // If there is a fail with mapping some values, this will be captured in event log. // TODO: This could likely be described in a xml mapping file for configuration public static EnterpriseChangeRequest mapFromWorkitem( Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItem workItem, Uri about, String action) { EnterpriseChangeRequest newEcr = new EnterpriseChangeRequest(); newEcr.SetAbout(about); // Create a mapped ECR based on suggested action switch (action) { case ACTION_CREATE: newEcr.SetTitle(AttributesMapper.GetTfsValueForEcrKey(TFSMapper.ECM_TITLE, workItem)); newEcr.SetDescription(AttributesMapper.GetTfsValueForEcrKey(TFSMapper.ECM_DESCRIPTION, workItem)); newEcr.SetCurrentMho(AttributesMapper.GetTfsValueForEcrKey(TFSMapper.ECM_CURRENT_MHO, workItem)); newEcr.SetCustomer(AttributesMapper.GetTfsValueForEcrKey(TFSMapper.ECM_CUSTOMER, workItem)); newEcr.SetProduct(AttributesMapper.GetTfsValueForEcrKey(TFSMapper.ECM_PRODUCT, workItem)); newEcr.SetProductRevision(AttributesMapper.GetTfsValueForEcrKey(TFSMapper.ECM_PRODUCT_REVISION, workItem)); newEcr.SetNodeProduct(AttributesMapper.GetTfsValueForEcrKey(TFSMapper.ECM_NODE_PRODUCT, workItem)); newEcr.SetNodeProductRevision(AttributesMapper.GetTfsValueForEcrKey(TFSMapper.ECM_NODE_PRODUCT_REVISION, workItem)); // Note: The field firstTechnicalContact also is needed for TR creation. This we retrieve from // the user in the create notification, and put in the REST call header as required by MHWeb. // Formally we have mapping specified in ERICSSON_DEFECT_CREATOR_SIGNUM, but not used. // Add the connected Bug as related link Uri relatedBug = new Uri(HandlerSettings.GetUriForBug(workItem.Id.ToString())); String label = workItem.Id.ToString() + ": " + workItem.Title; OSLC4Net.Core.Model.Link link = new OSLC4Net.Core.Model.Link(relatedBug, label); newEcr.AddRelatedChangeRequest(link); break; case ACTION_REGISTER_ROUTE: newEcr.SetAction(ACTION_REGISTER_ROUTE); newEcr.SetImpactOnISP(AttributesMapper.GetTfsValueForEcrKey(TFSMapper.ECM_IMPACT_ON_ISP, workItem)); newEcr.SetPriority(AttributesMapper.GetTfsValueForEcrKey(TFSMapper.ECM_PRIORITY, workItem)); newEcr.SetDiddet(AttributesMapper.GetTfsValueForEcrKey(TFSMapper.ECM_DIDDET, workItem)); newEcr.SetActivity(AttributesMapper.GetTfsValueForEcrKey(TFSMapper.ECM_ACTIVITY, workItem)); newEcr.SetFirstTechContactInfo(AttributesMapper.GetTfsValueForEcrKey(TFSMapper.ECM_FIRST_TECHNICAL_CONTACT_INFO, workItem)); newEcr.SetCountry(AttributesMapper.GetTfsValueForEcrKey(TFSMapper.ECM_COUNTRY, workItem)); newEcr.SetSite(AttributesMapper.GetTfsValueForEcrKey(TFSMapper.ECM_SITE, workItem)); break; case ACTION_ASSIGN: newEcr.SetAction(ACTION_ASSIGN); newEcr.SetOwner(AttributesMapper.GetTfsValueForEcrKey(TFSMapper.ECM_OWNER, workItem)); break; case ACTION_PROPOSE: newEcr.SetAction(ACTION_PROPOSE); newEcr.SetDiddet(AttributesMapper.GetTfsValueForEcrKey(TFSMapper.ECM_DIDDET, workItem)); newEcr.SetActivity(AttributesMapper.GetTfsValueForEcrKey(TFSMapper.ECM_ACTIVITY, workItem)); newEcr.SetFirstTechContactInfo(AttributesMapper.GetTfsValueForEcrKey(TFSMapper.ECM_FIRST_TECHNICAL_CONTACT_INFO, workItem)); newEcr.SetExpectedImpactOnISP(AttributesMapper.GetTfsValueForEcrKey(TFSMapper.ECM_EXPECTED_IMPACT_ON_ISP, workItem)); newEcr.SetAnswer(AttributesMapper.GetTfsValueForEcrKey(TFSMapper.ECM_ANSWER, workItem)); newEcr.SetFaultCode(AttributesMapper.GetTfsValueForEcrKey(TFSMapper.ECM_FAULTCODE, workItem)); newEcr.SetAnswerCode(AttributesMapper.GetTfsValueForEcrKey(TFSMapper.ECM_ANSWER_CODE, workItem)); // Corrected Product info is mandatory for some answerCodes and optional for others. Here // we pass in all cases and let the bug.xml handle mandatoryness and mhweb complain if not // present. newEcr.SetCorrectedProduct( AttributesMapper.GetTfsValueForEcrKey(TFSMapper.ECM_CORRECTED_PRODUCT, workItem)); newEcr.SetCorrectedProductRevision( AttributesMapper.GetTfsValueForEcrKey(TFSMapper.ECM_CORRECTED_PRODUCT_REVISION, workItem)); newEcr.SetCorrectedNodeProduct( AttributesMapper.GetTfsValueForEcrKey(TFSMapper.ECM_CORRECTED_NODE_PRODUCT, workItem)); newEcr.SetCorrectedNodeProductRevision( AttributesMapper.GetTfsValueForEcrKey(TFSMapper.ECM_CORRECTED_NODE_PRODUCT_REVISION, workItem)); break; case ACTION_APPROVE: newEcr.SetAction(ACTION_APPROVE); break; case ACTION_VERIFY: newEcr.SetAction(ACTION_VERIFY); newEcr.SetCorrectedNodeProduct( AttributesMapper.GetTfsValueForEcrKey(TFSMapper.ECM_CORRECTED_NODE_PRODUCT, workItem)); newEcr.SetCorrectedNodeProductRevision( AttributesMapper.GetTfsValueForEcrKey(TFSMapper.ECM_CORRECTED_NODE_PRODUCT_REVISION, workItem)); break; case ACTION_ANSWER: newEcr.SetAction(ACTION_ANSWER); newEcr.SetCorrectedNodeProduct( AttributesMapper.GetTfsValueForEcrKey(TFSMapper.ECM_CORRECTED_NODE_PRODUCT, workItem)); newEcr.SetCorrectedNodeProductRevision( AttributesMapper.GetTfsValueForEcrKey(TFSMapper.ECM_CORRECTED_NODE_PRODUCT_REVISION, workItem)); break; case ACTION_ACCEPT: newEcr.SetAction(ACTION_ACCEPT); break; case ACTION_REJECT: newEcr.SetAction(ACTION_REJECT); newEcr.SetNotebook(AttributesMapper.GetTfsValueForEcrKey(TFSMapper.ECM_NOTEBOOK, workItem)); break; case ACTION_DUPLICATE: newEcr.SetAction(ACTION_DUPLICATE); newEcr.SetPrimaryTR(AttributesMapper.GetTfsValueForEcrKey(TFSMapper.ECM_PRIMARYTR, workItem)); break; case ACTION_UNDUPLICATE: newEcr.SetAction(ACTION_UNDUPLICATE); break; case ACTION_CHANGE_PRODUCT: newEcr.SetAction(ACTION_CHANGE_PRODUCT); newEcr.SetProduct(AttributesMapper.GetTfsValueForEcrKey(TFSMapper.ECM_PRODUCT, workItem)); newEcr.SetProductRevision(AttributesMapper.GetTfsValueForEcrKey(TFSMapper.ECM_PRODUCT_REVISION, workItem)); newEcr.SetNodeProduct(AttributesMapper.GetTfsValueForEcrKey(TFSMapper.ECM_NODE_PRODUCT, workItem)); newEcr.SetNodeProductRevision(AttributesMapper.GetTfsValueForEcrKey(TFSMapper.ECM_NODE_PRODUCT_REVISION, workItem)); break; case ACTION_REACTIVATE: newEcr.SetAction(ACTION_REACTIVATE); break; case ACTION_FINISH: newEcr.SetAction(ACTION_FINISH); break; case ACTION_DISCONNECT: newEcr.SetAction(ACTION_DISCONNECT); break; } return(newEcr); }
// Return an EnterpriseChangeRequest with mapped values for the update public static EnterpriseChangeRequest mapFromUpdatedWorkitem( Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItem workItem, Uri about, WorkItemChangedEvent notification) { EnterpriseChangeRequest newEcr = new EnterpriseChangeRequest(); newEcr.SetAbout(about); // The notification contain all changed fields. To understand what to // propagate to the client, we need to check which ecm fields that are // affected by the changes and are configured for notifyChange int noOfMappedChanged = 0; if (notification.ChangedFields != null) { // Most fields are String fields StringField[] changedStrFields = notification.ChangedFields.StringFields; if (changedStrFields != null) { for (int i = 0; i < changedStrFields.Length; i++) { String fieldName = changedStrFields[i].ReferenceName; noOfMappedChanged += mapFromUpdated(workItem, newEcr, fieldName); } } // For example Priority is an Integer field IntegerField[] changedIntFields = notification.ChangedFields.IntegerFields; if (changedIntFields != null) { for (int i = 0; i < changedIntFields.Length; i++) { String fieldName = changedIntFields[i].ReferenceName; noOfMappedChanged += mapFromUpdated(workItem, newEcr, fieldName); } } } // For example the Description is a Text field TextField[] changedTextFields = notification.TextFields; if (changedTextFields != null) { for (int i = 0; i < changedTextFields.Length; i++) { String fieldName = changedTextFields[i].ReferenceName; noOfMappedChanged += mapFromUpdated(workItem, newEcr, fieldName); } } // To find a change in the Comment/History one need to look at revision - 1. noOfMappedChanged += mapFromUpdated(workItem, newEcr, TFSMapper.TFS_HISTORY); // Need to send list of attachments in all cases when we have another update. So if we already have // an update (noOfMappedChanged > 0), send - otherwise, check if changed then send. if ((noOfMappedChanged > 0 || TFSMapper.getInstance().hasLinksChanged(workItem))) { noOfMappedChanged += mapFromUpdated(workItem, newEcr, TFSMapper.ERICSSON_DEFECT_HYPERLINK); } if (noOfMappedChanged > 0) { // More than 1 field that was mapped changed return(newEcr); } else { // No field of interest was changed HandlerSettings.LogMessage( String.Format("No mapped fields was updated for: {0}", workItem.Title), HandlerSettings.LoggingLevel.INFO); return(null); } }