public void UpdateStatusFromExternalId_IssueNotExisting()
        {
            string externalSystemName = Enviornment.instance.GetVersionOneSource;
            string externalFieldName = Enviornment.instance.GetVersionOneReference;
            string externalId = "NOT-EXISTING-ISSUE";
            string statusId = "StoryStatus:133";
            UpdateResult result = new UpdateResult();

            bool success = v1processor.UpdateWorkitem(externalFieldName, externalId, externalSystemName, statusId, result);
            Assert.IsFalse(success);
            Assert.IsTrue(result.isDefault());
            Assert.IsTrue(result.modificationTime == DateTime.MinValue);
            Assert.IsTrue(string.IsNullOrEmpty(result.number));
        }
 public bool isNewer( UpdateResult newer )
 {
     if (newer.modificationTime > this.modificationTime)
         return true;
     return false;
 }
        public bool UpdateWorkitem(string externalFieldName, string externalId, string externalSystemName, string statusId, UpdateResult result)
        {
            var defectType = metaModel.GetAssetType(PrimaryWorkitemType);
            IAttributeDefinition externalFieldAttribute = defectType.GetAttributeDefinition(externalFieldName);
            IAttributeDefinition statusAttribute = defectType.GetAttributeDefinition(Entity.StatusProperty);
            IAttributeDefinition modificationTimeAttrubute = defectType.GetAttributeDefinition(Entity.ChangeDateUtcProperty);
            IAttributeDefinition numberAttribute = defectType.GetAttributeDefinition(PrimaryWorkitem.NumberProperty);

            var filters = new List<IFilter> {
                    Filter.Closed(false),
                    Filter.OfTypes(VersionOneProcessor.StoryType, VersionOneProcessor.DefectType),
                    Filter.Equal(Entity.SourceNameProperty, externalSystemName),
                    Filter.Equal(externalFieldName, externalId),
                };

            var filter = GroupFilter.And(filters.ToArray());
            var filterTerms = filter.GetFilter(defectType);

            var query = new Query(defectType) { Filter = filterTerms };
            query.Selection.Add(statusAttribute);
            query.Selection.Add(externalFieldAttribute);
            query.Selection.Add(modificationTimeAttrubute);
            query.Selection.Add(numberAttribute);

            try {

                var queryResult = services.Retrieve(query);
                if (queryResult.Assets.Count <= 0) {
                    logger.Log(LogMessage.SeverityType.Error, string.Format("Failed to update {0} - issue not found", externalId ));
                    return false;
                }

                var workitem = queryResult.Assets.First();

                string existingStatusId = workitem.GetAttribute(statusAttribute).Value.ToString();
                if (existingStatusId.Equals(statusId) == false) {
                    logger.Log(LogMessage.SeverityType.Debug, string.Format("Updating issue {0} with modification time: {1}", externalId, workitem.GetAttribute(modificationTimeAttrubute).Value));
                    workitem.SetAttributeValue(statusAttribute, statusId);
                    services.Save(workitem);

                    result.number = workitem.GetAttribute(numberAttribute).Value.ToString();
                    result.modificationTime =  (DateTime)workitem.GetAttribute(modificationTimeAttrubute).Value;
                    return true;
                } else {
                    logger.Log(LogMessage.SeverityType.Debug, string.Format("Skipping update of {0} in VersionOne since status is already set to {1}", externalId, statusId));
                }
            }
            catch (V1Exception ex) {
                logger.Log(LogMessage.SeverityType.Error, string.Format(GetMessageFromException(ex)));
            }
            catch (Exception ex) {
                logger.Log(LogMessage.SeverityType.Error, "Internal error: " + ex.Message);
            }

            return false;
        }
        private void SynchronizeItemsToVersionOne(List<Workitem> readyForSynachronizationToVersionOne)
        {
            if (readyForSynachronizationToVersionOne.Count <= 0) {
                logger.Log(LogMessage.SeverityType.Info, string.Format("Skipping VersionOne update - nothing to synchronize"));
                return;
            }

            UpdateResult theNewestUpdate = new UpdateResult(DateTime.MinValue, string.Empty);

            logger.Log(LogMessage.SeverityType.Info, string.Format("There are {0} items to update in VersionOne.", readyForSynachronizationToVersionOne.Count));
            foreach (var item in readyForSynachronizationToVersionOne) {
                var result = workitemWriter.UpdateWorkitem(item);

                if (result != null && result.isDefault() == false && result.isNewer(theNewestUpdate) == true) {
                    theNewestUpdate = result;
                }
            }

            if (theNewestUpdate.modificationTime > lastValidSynchronisationProfile.LastCheckForSynchronizedWorkitems) {
                lastValidSynchronisationProfile.LastCheckForSynchronizedWorkitems = theNewestUpdate.modificationTime;
                lastValidSynchronisationProfile.LastClosedWorkitemId = theNewestUpdate.number;

                logger.Log(LogMessage.SeverityType.Debug, string.Format("Updating last synchronization time to {0} on item {1}.",
                lastValidSynchronisationProfile.LastCheckForClosedWorkitems, lastValidSynchronisationProfile.LastClosedWorkitemId));
            }
        }
        public UpdateResult UpdateWorkitem(Workitem item)
        {
            if (item == null)
                return null;

            if(statusMapping == null)
                statusMapping = v1Processor.GetAvailableStatuses();

            try {

                string externalId = item.ExternalId;
                string externalSystemName = item.ExternalSystemName;
                string statusId = ResolveStatusIdFromName(item.Status);
                UpdateResult result = new UpdateResult();
                v1Processor.UpdateWorkitem(externalFieldName, externalId, externalSystemName, statusId, result);
                return result;

            }catch (Exception ex) {
                logger.Log(LogMessage.SeverityType.Error, string.Format("Faild to update item in versionOne, reason: \"{0}\"", ex.Message));
            }

            return null;
        }