/// <summary> /// Ensures an update event is properly represented for a merge /// </summary> public RegistryStoreResult Merge(ComponentModel.RegistrationEvent mergeEvent, SVC.Core.Services.DataPersistenceMode mode) { mergeEvent.EventClassifier = RegistrationEventType.Register; mergeEvent.Mode = RegistrationEventType.Replace; // A merge must have at least one subjectOf var subjectOf = mergeEvent.FindAllComponents(HealthServiceRecordSiteRoleType.SubjectOf); if (subjectOf.Count == 0) { throw new ArgumentException("mergeEvent", "Merge event must have at least one subjectOf component"); } // Each subjectOf shall have a replacement foreach (Person cntr in subjectOf) { var rplc = cntr.FindAllComponents(HealthServiceRecordSiteRoleType.ReplacementOf).OfType <PersonRegistrationRef>(); if (rplc.Count() == 0) { throw new InvalidOperationException("Merge subjectOf has no replacement marker"); } } return(this.Update(mergeEvent, mode)); }
public RegistryStoreResult UnMerge(ComponentModel.RegistrationEvent evt, SVC.Core.Services.DataPersistenceMode mode) { throw new NotImplementedException(); }
/// <summary> /// Update the registration event /// </summary> public RegistryStoreResult Update(ComponentModel.RegistrationEvent evt, SVC.Core.Services.DataPersistenceMode mode) { RegistryStoreResult retVal = new RegistryStoreResult(); try { // Can't find persistence if (this.m_persistenceService == null) { retVal.Details.Add(new PersistenceResultDetail(ResultDetailType.Error, "Couldn't locate an implementation of a PersistenceService object, storage is aborted", null)); return(null); } else if (evt == null) { retVal.Details.Add(new PersistenceResultDetail(ResultDetailType.Error, "Can't register null health service record data", null)); return(null); } else if (retVal.Details.Count(o => o.Type == ResultDetailType.Error) > 0) { retVal.Details.Add(new PersistenceResultDetail(ResultDetailType.Error, "Won't attempt to persist invalid message", null)); return(null); } // Call the dss if (this.m_decisionSupportService != null) { foreach (var iss in this.m_decisionSupportService.RecordPersisting(evt)) { retVal.Details.Add(new DetectedIssueResultDetail(iss.Priority == SVC.Core.Issues.IssuePriorityType.Error ? ResultDetailType.Error : ResultDetailType.Warning, iss.Text, (string)null, iss)); } } // Any errors? if (retVal.Details.Count(o => o.Type == ResultDetailType.Error) > 0) { retVal.Details.Add(new PersistenceResultDetail(ResultDetailType.Error, "Won't attempt to persist message due to detected issues", null)); } // Persist retVal.VersionId = this.m_persistenceService.UpdateContainer(evt, mode); retVal.VersionId.UpdateMode = UpdateModeType.Update; // Call the dss if (this.m_decisionSupportService != null) { this.m_decisionSupportService.RecordPersisted(evt); } // Call sub if (this.m_subscriptionService != null) { this.m_subscriptionService.PublishContainer(evt); } // Register the document set if it is a document if (retVal != null && this.m_registrationService != null && !this.m_registrationService.RegisterRecord(evt, mode)) { retVal.Details.Add(new PersistenceResultDetail(ResultDetailType.Warning, "Wasn't able to register event in the event registry, event exists in repository but not in registry. You may not be able to query for this event", null)); } } catch (DuplicateNameException ex) // Already persisted stuff { Trace.TraceError(ex.ToString()); retVal.Details.Add(new PersistenceResultDetail(ResultDetailType.Error, m_localeService.GetString("DTPE005"), ex)); } catch (MissingPrimaryKeyException ex) // Already persisted stuff { Trace.TraceError(ex.ToString()); retVal.Details.Add(new PersistenceResultDetail(ResultDetailType.Error, m_localeService.GetString("DTPE005"), ex)); } catch (ConstraintException ex) { Trace.TraceError(ex.ToString()); retVal.Details.Add(new PersistenceResultDetail(ResultDetailType.Error, m_localeService.GetString("DTPE005"), ex)); } catch (Exception ex) { retVal.Details.Add(new ResultDetail(ResultDetailType.Error, ex.Message, ex)); } return(retVal); }