private void EnsureKeys(OrgUnitData unit) { unit.ShortKey = (unit.ShortKey != null) ? unit.ShortKey : IdUtil.GenerateShortKey(); }
private void EnsureKeys(PersonData person) { person.Uuid = (person.Uuid != null) ? person.Uuid : IdUtil.GenerateUuid(); person.ShortKey = (person.ShortKey != null) ? person.ShortKey : IdUtil.GenerateShortKey(); }
// this method only performs a call to Ret on Organisation if there are actual changes public void Ret(string uuid, string newName, string newCpr, DateTime timestamp) { log.Debug("Attempting Ret on Person with uuid " + uuid); // this should never fail - we always import the Person before the User, and we have a User with a reference to this object RegistreringType1 registration = GetLatestRegistration(uuid); if (registration == null) { log.Debug("Cannot call Ret on Person with uuid " + uuid + " because it does not exist in Organisation"); return; } PersonPortType channel = StubUtil.CreateChannel <PersonPortType>(PersonStubHelper.SERVICE, "Ret", helper.CreatePort()); try { RetInputType1 input = new RetInputType1(); input.UUIDIdentifikator = uuid; input.AttributListe = registration.AttributListe; input.TilstandListe = registration.TilstandListe; input.RelationListe = registration.RelationListe; // compare latest property to the local object EgenskabType latestProperty = StubUtil.GetLatestProperty(input.AttributListe); if (latestProperty == null || string.Compare(latestProperty.NavnTekst, newName) != 0 || string.Compare(latestProperty.CPRNummerTekst, newCpr) != 0) { // create a new property EgenskabType newProperty = new EgenskabType(); newProperty.Virkning = helper.GetVirkning(timestamp); newProperty.BrugervendtNoegleTekst = ((latestProperty != null) ? latestProperty.BrugervendtNoegleTekst : IdUtil.GenerateShortKey()); newProperty.NavnTekst = newName; newProperty.CPRNummerTekst = newCpr; // overwrite existing property set input.AttributListe = new EgenskabType[1]; input.AttributListe[0] = newProperty; } else { log.Debug("No changes on Person, so returning without calling Organisation"); // if there are no changes to the attributes, we do not call the Organisation service return; } // send Ret request retRequest request = new retRequest(); request.RetRequest1 = new RetRequestType(); request.RetRequest1.RetInput = input; request.RetRequest1.AuthorityContext = new AuthorityContextType(); request.RetRequest1.AuthorityContext.MunicipalityCVR = OrganisationRegistryProperties.GetCurrentMunicipality(); retResponse response = channel.ret(request); int statusCode = Int32.Parse(response.RetResponse1.RetOutput.StandardRetur.StatusKode); if (statusCode != 20) { if (statusCode == 49) { log.Warn("Ret failed on Person " + uuid + " as Organisation returned status 49. The most likely cause is that the object has been Passiveret"); return; } string message = StubUtil.ConstructSoapErrorMessage(statusCode, "Ret", PersonStubHelper.SERVICE, response.RetResponse1.RetOutput.StandardRetur.FejlbeskedTekst); log.Error(message); throw new SoapServiceException(message); } log.Debug("Ret successful on Person with uuid " + uuid); } catch (Exception ex) when(ex is CommunicationException || ex is IOException || ex is TimeoutException || ex is WebException) { throw new ServiceNotFoundException("Failed to establish connection to the Ret service on Person", ex); } }
private void EnsureKeys(AddressData address) { address.Uuid = (address.Uuid != null) ? address.Uuid : IdUtil.GenerateUuid(); address.ShortKey = (address.ShortKey != null) ? address.ShortKey : IdUtil.GenerateShortKey(); }
public object BeforeSendRequest(ref Message request, IClientChannel channel) { request.Headers.Add(new RequestHeader(IdUtil.GenerateUuid())); return(null); }
private void EnsureKeys(UserData bruger) { bruger.ShortKey = (bruger.ShortKey != null) ? bruger.ShortKey : IdUtil.GenerateShortKey(); }
private void EnsureKeys(OrgFunctionData orgFunction) { orgFunction.Uuid = (orgFunction.Uuid != null) ? orgFunction.Uuid : IdUtil.GenerateUuid(); orgFunction.ShortKey = (orgFunction.ShortKey != null) ? orgFunction.ShortKey : IdUtil.GenerateShortKey(); }
public void Ret(OrgFunctionData orgFunction, UpdateIndicator userIndicator, UpdateIndicator unitIndicator, UpdateIndicator taskIndicator) { log.Debug("Attempting Ret on OrganisationFunction with uuid " + orgFunction.Uuid); RegistreringType1 registration = GetLatestRegistration(orgFunction.Uuid); if (registration == null) { log.Debug("Cannot call Ret on OrganisationFunktion with uuid " + orgFunction.Uuid + " because it does not exist in Organisation"); return; } VirkningType virkning = helper.GetVirkning(orgFunction.Timestamp); OrganisationFunktionPortType channel = StubUtil.CreateChannel <OrganisationFunktionPortType>(OrganisationFunktionStubHelper.SERVICE, "Ret", helper.CreatePort()); try { bool changes = false; RetInputType1 input = new RetInputType1(); input.UUIDIdentifikator = orgFunction.Uuid; input.AttributListe = registration.AttributListe; input.TilstandListe = registration.TilstandListe; input.RelationListe = registration.RelationListe; changes = helper.SetTilstandToActive(virkning, registration, orgFunction.Timestamp) | changes; #region Update attributes if needed EgenskabType latestProperty = StubUtil.GetLatestProperty(input.AttributListe.Egenskab); if (latestProperty == null || latestProperty.FunktionNavn == null || (orgFunction.Name != null && !latestProperty.FunktionNavn.Equals(orgFunction.Name)) || (orgFunction.ShortKey != null && !latestProperty.BrugervendtNoegleTekst.Equals(orgFunction.ShortKey))) { if (latestProperty == null) { orgFunction.ShortKey = (orgFunction.ShortKey != null) ? orgFunction.ShortKey : IdUtil.GenerateShortKey(); // special case where editing a function that has been orphaned, without supplying a name - should never really happen, but the API allows it orgFunction.Name = (orgFunction.Name != null) ? orgFunction.Name : "Unknown Function"; } // create a new property EgenskabType newProperty = new EgenskabType(); newProperty.Virkning = helper.GetVirkning(orgFunction.Timestamp); newProperty.BrugervendtNoegleTekst = (orgFunction.ShortKey != null) ? orgFunction.ShortKey : latestProperty.BrugervendtNoegleTekst; newProperty.FunktionNavn = (orgFunction.Name != null) ? orgFunction.Name : latestProperty.FunktionNavn; // create a new set of properties input.AttributListe.Egenskab = new EgenskabType[1]; input.AttributListe.Egenskab[0] = newProperty; changes = true; } #endregion #region update tasks if needed if (taskIndicator.Equals(UpdateIndicator.COMPARE)) { // terminate the Virkning on all address relationships that no longer exists locally changes = StubUtil.TerminateObjectsInOrgNoLongerPresentLocally(input.RelationListe.Opgaver, orgFunction.Tasks, orgFunction.Timestamp, true) || changes; // add references to address objects that are new List <string> taskUuidsToAdd = StubUtil.FindAllObjectsInLocalNotInOrg(input.RelationListe.Opgaver, orgFunction.Tasks, true); if (taskUuidsToAdd.Count > 0) { int size = taskUuidsToAdd.Count + ((input.RelationListe.Opgaver != null) ? input.RelationListe.Opgaver.Length : 0); KlasseFlerRelationType[] newTasks = new KlasseFlerRelationType[size]; int i = 0; if (input.RelationListe.Opgaver != null) { foreach (var taskInOrg in input.RelationListe.Opgaver) { newTasks[i++] = taskInOrg; } } foreach (string uuidToAdd in taskUuidsToAdd) { foreach (var taskInLocal in orgFunction.Tasks) { if (taskInLocal.Equals(uuidToAdd)) { KlasseFlerRelationType newTask = helper.CreateOpgaveRelation(uuidToAdd, virkning); newTasks[i++] = newTask; } } } input.RelationListe.Opgaver = newTasks; changes = true; } } #endregion #region Update TilknyttedeBrugere relationships // terminate references if (userIndicator.Equals(UpdateIndicator.COMPARE)) { // terminate the references in Org that no longer exist locally changes = StubUtil.TerminateObjectsInOrgNoLongerPresentLocally(input.RelationListe.TilknyttedeBrugere, orgFunction.Users, orgFunction.Timestamp, false) || changes; } else if (userIndicator.Equals(UpdateIndicator.REMOVE)) { changes = TerminateObjectsInOrgThatAreInLocal(input.RelationListe.TilknyttedeBrugere, orgFunction.Users, orgFunction.Timestamp) || changes; } if (userIndicator.Equals(UpdateIndicator.COMPARE) || userIndicator.Equals(UpdateIndicator.ADD)) { // get the set of new local objects only List <string> uuidsToAdd = StubUtil.FindAllObjectsInLocalNotInOrg(input.RelationListe.TilknyttedeBrugere, orgFunction.Users, false); // add all the new references if (uuidsToAdd.Count > 0) { int size = uuidsToAdd.Count + ((input.RelationListe.TilknyttedeBrugere != null) ? input.RelationListe.TilknyttedeBrugere.Length : 0); BrugerFlerRelationType[] newUsers = new BrugerFlerRelationType[size]; int i = 0; if (input.RelationListe.TilknyttedeBrugere != null) { foreach (var usersInOrg in input.RelationListe.TilknyttedeBrugere) { newUsers[i++] = usersInOrg; } } foreach (string uuidToAdd in uuidsToAdd) { newUsers[i++] = helper.CreateBrugerRelation(uuidToAdd, virkning); } input.RelationListe.TilknyttedeBrugere = newUsers; changes = true; } } #endregion #region Update TilknyttedeEnheder relationships // terminate references if (unitIndicator.Equals(UpdateIndicator.COMPARE)) { // terminate the references in Org that no longer exist locally changes = StubUtil.TerminateObjectsInOrgNoLongerPresentLocally(input.RelationListe.TilknyttedeEnheder, orgFunction.OrgUnits, orgFunction.Timestamp, false) || changes; } else if (unitIndicator.Equals(UpdateIndicator.REMOVE)) { changes = TerminateObjectsInOrgThatAreInLocal(input.RelationListe.TilknyttedeEnheder, orgFunction.OrgUnits, orgFunction.Timestamp) || changes; } if (unitIndicator.Equals(UpdateIndicator.COMPARE) || unitIndicator.Equals(UpdateIndicator.ADD)) { // get the set of new local objects List <string> uuidsToAdd = StubUtil.FindAllObjectsInLocalNotInOrg(input.RelationListe.TilknyttedeEnheder, orgFunction.OrgUnits, false); // add all the new references if (uuidsToAdd.Count > 0) { int size = uuidsToAdd.Count + ((input.RelationListe.TilknyttedeEnheder != null) ? input.RelationListe.TilknyttedeEnheder.Length : 0); OrganisationEnhedFlerRelationType[] newUnits = new OrganisationEnhedFlerRelationType[size]; int i = 0; if (input.RelationListe.TilknyttedeEnheder != null) { foreach (var unit in input.RelationListe.TilknyttedeEnheder) { newUnits[i++] = unit; } } foreach (string uuidToAdd in uuidsToAdd) { newUnits[i++] = helper.CreateOrgEnhedRelation(uuidToAdd, virkning); } input.RelationListe.TilknyttedeEnheder = newUnits; changes = true; } } #endregion #region Update organisation relationship bool foundExistingValidOrganisationRelation = false; if (registration.RelationListe.TilknyttedeOrganisationer != null && registration.RelationListe.TilknyttedeOrganisationer.Length > 0) { foreach (OrganisationFlerRelationType orgRelation in registration.RelationListe.TilknyttedeOrganisationer) { // make sure that the pointer is set correctly if (!StubUtil.GetMunicipalityOrganisationUUID().Equals(orgRelation.ReferenceID.Item)) { orgRelation.ReferenceID.Item = StubUtil.GetMunicipalityOrganisationUUID(); changes = true; } // update the Virkning on the TilknyttedeOrganisationer relationship if needed (undelete feature) object endTime = orgRelation.Virkning.TilTidspunkt.Item; // endTime is bool => ok // endTime is DateTime, but Now is before endTime => ok if (!(endTime is DateTime) || (DateTime.Compare(DateTime.Now, (DateTime)endTime) < 0)) { foundExistingValidOrganisationRelation = true; } } } if (!foundExistingValidOrganisationRelation) { helper.AddOrganisationRelation(StubUtil.GetMunicipalityOrganisationUUID(), virkning, registration); changes = true; } #endregion // TODO: addresses are not currently used for functions, this is a left-over from the days of it-systems and JumpUrls #region Update Address relationships // terminate the Virkning on all address relationships that no longer exists locally changes = StubUtil.TerminateObjectsInOrgNoLongerPresentLocally(input.RelationListe.Adresser, orgFunction.Addresses, orgFunction.Timestamp, true) || changes; // add references to address objects that are new List <string> addressUuidsToAdd = StubUtil.FindAllObjectsInLocalNotInOrg(input.RelationListe.Adresser, orgFunction.Addresses, true); if (addressUuidsToAdd.Count > 0) { int size = addressUuidsToAdd.Count + ((input.RelationListe.Adresser != null) ? input.RelationListe.Adresser.Length : 0); AdresseFlerRelationType[] newAdresser = new AdresseFlerRelationType[size]; int i = 0; if (input.RelationListe.Adresser != null) { foreach (var addressInOrg in input.RelationListe.Adresser) { newAdresser[i++] = addressInOrg; } } foreach (string uuidToAdd in addressUuidsToAdd) { foreach (var addressInLocal in orgFunction.Addresses) { if (addressInLocal.Uuid.Equals(uuidToAdd)) { string roleUuid = null; switch (addressInLocal.Type) { case AddressRelationType.URL: roleUuid = UUIDConstants.ADDRESS_ROLE_ORGFUNCTION_URL; break; default: log.Warn("Cannot add relationship to address of type " + addressInLocal.Type + " with uuid " + addressInLocal.Uuid + " as the type is unknown"); continue; } AdresseFlerRelationType newAddress = helper.CreateAddressReference(uuidToAdd, (i + 1), roleUuid, virkning); newAdresser[i++] = newAddress; } } } input.RelationListe.Adresser = newAdresser; changes = true; } #endregion // if no changes are made, we do not call the service if (!changes) { log.Debug("Ret on OrganisationFunktion with uuid " + orgFunction.Uuid + " cancelled because of no changes"); return; } // send Ret request retRequest request = new retRequest(); request.RetRequest1 = new RetRequestType(); request.RetRequest1.RetInput = input; request.RetRequest1.AuthorityContext = new AuthorityContextType(); request.RetRequest1.AuthorityContext.MunicipalityCVR = OrganisationRegistryProperties.GetMunicipality(); retResponse response = channel.ret(request); int statusCode = Int32.Parse(response.RetResponse1.RetOutput.StandardRetur.StatusKode); if (statusCode != 20) { string message = StubUtil.ConstructSoapErrorMessage(statusCode, "Ret", OrganisationFunktionStubHelper.SERVICE, response.RetResponse1.RetOutput.StandardRetur.FejlbeskedTekst); log.Error(message); throw new SoapServiceException(message); } log.Debug("Ret succesful on OrganisationFunktion with uuid " + orgFunction.Uuid); } catch (Exception ex) when(ex is CommunicationException || ex is IOException || ex is TimeoutException || ex is WebException) { throw new ServiceNotFoundException("Failed to establish connection to the Ret service on OrganisationFunktion", ex); } }