private void CreateAndInsertDeltaOperation(string mrid, ResourceDescription rd) { long negGid = 0; DeltaOpType deltaOp = DeltaOpType.Insert; DMSType type = (DMSType)ModelCodeHelper.ExtractTypeFromGlobalId(rd.Id); if (ModelCodeHelper.ExtractEntityIdFromGlobalId(rd.Id) < 0 && !NegativeGidToMrid.ContainsKey(rd.Id)) { negGid = rd.Id; NegativeGidToMrid.Add(rd.Id, mrid); } if (MridToPositiveGidFromServer.ContainsKey(mrid)) { rd.Id = MridToPositiveGidFromServer[mrid]; deltaOp = DeltaOpType.Update; } delta.AddDeltaOperation(deltaOp, rd, true); if (!MridsFromConcreteModel.Contains(mrid)) { MridsFromConcreteModel.Add(mrid); } report.Report.Append("Operation: ").Append(deltaOp).Append(" ").Append(type) .Append(" mrid: ").Append(mrid) .Append(" ID: ").Append(string.Format("0x{0:X16}", negGid)) .Append(" after correction is GID: ").AppendLine($"0x{rd.Id:X16}"); }
private void ImportSubstation() { SortedDictionary <string, object> cimBaseVoltages = concreteModel.GetAllObjectsOfType("FTN.Substation"); if (cimBaseVoltages != null) { foreach (KeyValuePair <string, object> cimBaseVoltagePair in cimBaseVoltages) { FTN.Substation cimBaseVoltage = cimBaseVoltagePair.Value as FTN.Substation; ResourceDescription rd = CreateSubstationResourceDescription(cimBaseVoltage); if (rd != null) { if (ModelCodeHelper.ExtractEntityIdFromGlobalId(rd.Id) > 0) { delta.AddDeltaOperation(DeltaOpType.Update, rd, true); report.Report.Append("Substation ID = ").Append(cimBaseVoltage.ID).Append(" SUCCESSFULLY converted to GID = ").AppendLine(rd.Id.ToString()); } else { delta.AddDeltaOperation(DeltaOpType.Insert, rd, true); report.Report.Append("Substation ID = ").Append(cimBaseVoltage.ID).Append(" SUCCESSFULLY converted to GID = ").AppendLine(rd.Id.ToString()); } } else { report.Report.Append("Substation ID = ").Append(cimBaseVoltage.ID).AppendLine(" FAILED to be converted"); } } report.Report.AppendLine(); } }
private void CorrectNegativeReferences() { foreach (ResourceDescription rd in delta.InsertOperations) { foreach (Property prop in rd.Properties) { if (prop.Type == PropertyType.Reference) { long targetGid = prop.AsLong(); if (ModelCodeHelper.ExtractEntityIdFromGlobalId(targetGid) < 0) { if (NegativeGidToMrid.ContainsKey(targetGid)) { string mrid = NegativeGidToMrid[targetGid]; if (MridToPositiveGidFromServer.ContainsKey(mrid)) { long positiveGid = MridToPositiveGidFromServer[mrid]; prop.SetValue(positiveGid); } } } } } } foreach (ResourceDescription rd in delta.UpdateOperations) { foreach (Property prop in rd.Properties) { if (prop.Type == PropertyType.Reference) { long targetGid = prop.AsLong(); if (ModelCodeHelper.ExtractEntityIdFromGlobalId(targetGid) < 0) { if (NegativeGidToMrid.ContainsKey(targetGid)) { string mrid = NegativeGidToMrid[targetGid]; if (MridToPositiveGidFromServer.ContainsKey(mrid)) { long positiveGid = MridToPositiveGidFromServer[mrid]; prop.SetValue(positiveGid); } } } } } } }
public void FixNegativeToPositiveIds(ref Dictionary <short, int> typesCounters, ref Dictionary <long, long> globaldChanges) { string message = String.Format("Fixing negative to positive IDs for delta with ID: {0} started.", GetCompositeId(id)); Logger.LogDebug(message); if (globaldChanges == null) { globaldChanges = new Dictionary <long, long>(); } // fix ids in insert operations - generate positive ids foreach (ResourceDescription rd in insertOps) { long gidOld = rd.Id; int idOld = ModelCodeHelper.ExtractEntityIdFromGlobalId(rd.Id); if (idOld < 0) { if (!globaldChanges.ContainsKey(gidOld)) { short type = ModelCodeHelper.ExtractTypeFromGlobalId(rd.Id); if (type <= 0) { throw new ModelException(ErrorCode.InvalidDelta, gidOld, 0, string.Format("Invalid DMS type found in insert delta operation ID: 0x{0:X16}.", rd.Id)); } int idNew = typesCounters[type] + 1; typesCounters[type] = idNew; long gidNew = ChangeEntityIdInGlobalId(gidOld, idNew); gidNew = IncorporateSystemIdToValue(gidNew, 0); globaldChanges[gidOld] = gidNew; rd.Id = gidNew; } else { message = String.Format("Failed to fix negative to positive IDs in insert delta operations for delta with ID: {0} because negative resource ID: 0x{1:X16} already exists in previous insert delta operations.", GetCompositeId(id), gidOld); Logger.LogError(message); string exceptionMessage = String.Format("Invalid delta. Negative resource ID: 0x{0:X16} already exists in previous insert delta operations.", gidOld); throw new Exception(exceptionMessage); } } else if (!this.positiveIdsAllowed) { message = String.Format("Failed to fix negative to positive IDs in insert delta operations for delta with ID: {0} because resource ID: 0x{1:X16} must not be positive.", GetCompositeId(id), gidOld); Logger.LogError(message); string exceptionMessage = String.Format("Invalid insert delta operation. Resource ID: 0x{0:X16} must not be positive.", gidOld); throw new Exception(exceptionMessage); } } // change reference ids in insert operations foreach (ResourceDescription rd in insertOps) { foreach (Property p in rd.Properties) { if (p.Type == PropertyType.Reference) { long gidOld = p.AsReference(); int idOld = ModelCodeHelper.ExtractEntityIdFromGlobalId(gidOld); if (idOld < 0) { if (globaldChanges.ContainsKey(gidOld)) { p.SetValue(globaldChanges[gidOld]); } else { message = String.Format("Failed to fix negative to positive IDs in insert delta operations for delta with ID: {0} because negative reference (property code: {1}, value: 0x{2:X16}) does not exist in insert delta operations. Resource ID: 0x{3:X16}. ", GetCompositeId(id), p.Id, gidOld, rd.Id); Logger.LogError(message); string exceptionMessage = String.Format("Invalid insert delta operation. Negative reference (property code: {0}, value: 0x{1:X16}) does not exist in insert delta operations. Resource ID: 0x{2:X16}. ", p.Id, gidOld, rd.Id); throw new Exception(exceptionMessage); } } } else if (p.Type == PropertyType.ReferenceVector) { bool changed = false; List <long> gidsRef = p.AsReferences(); for (int i = 0; i < gidsRef.Count; i++) { long gidOldRef = gidsRef[i]; int idOldRef = ModelCodeHelper.ExtractEntityIdFromGlobalId(gidOldRef); if (idOldRef < 0) { if (globaldChanges.ContainsKey(gidOldRef)) { gidsRef[i] = globaldChanges[gidOldRef]; changed = true; } else { message = String.Format("Failed to fix negative to positive IDs in insert delta operations for delta with ID: {0} because negative reference (property code: {1}, value: 0x{2:X16}) does not exist in insert delta operations. Resource ID: 0x{3:X16}. ", GetCompositeId(id), p.Id, gidOldRef, rd.Id); Logger.LogError(message); string exceptionMessage = String.Format("Invalid insert delta operation. Negative reference (property code: {0}, value: 0x{1:X16}) does not exist in insert delta operations. Resource ID: 0x{2:X16}. ", p.Id, gidOldRef, rd.Id); throw new Exception(exceptionMessage); } } } if (changed) { p.SetValue(gidsRef); } } } } // change ids and reference ids in update operations foreach (ResourceDescription rd in updateOps) { long gidOld = rd.Id; int idOld = ModelCodeHelper.ExtractEntityIdFromGlobalId(rd.Id); if (idOld < 0) { if (globaldChanges.ContainsKey(gidOld)) { rd.Id = globaldChanges[gidOld]; } else { message = String.Format("Failed to fix negative to positive IDs in update delta operations for delta with ID {0} because negative resource ID: 0x{1:X16} does not exists in insert delta operations.", GetCompositeId(id), gidOld); Logger.LogError(message); string exceptionMessage = String.Format("Invalid update delta operation. Negative resource ID: 0x{0:X16} does not exists in insert delta operations.", gidOld); throw new Exception(exceptionMessage); } } foreach (Property p in rd.Properties) { if (p.Type == PropertyType.Reference) { long gidOldRef = p.AsReference(); int idOldRef = ModelCodeHelper.ExtractEntityIdFromGlobalId(gidOldRef); if (idOldRef < 0) { if (globaldChanges.ContainsKey(gidOldRef)) { p.SetValue(globaldChanges[gidOldRef]); } else { message = String.Format("Failed to fix negative to positive IDs in update delta operations for delta with ID: {0} because negative reference (property code: {1}, value: 0x{2:X16}) does not exist in insert delta operations. Resource ID: 0x{3:X16}. ", GetCompositeId(id), p.Id, gidOldRef, rd.Id); Logger.LogError(message); string exceptionMessage = String.Format("Invalid update delta operation. Negative reference (property code: {0}, value: 0x{1:X16}) does not exist in insert delta operations. Resource ID: 0x{2:X16}. ", p.Id, gidOldRef, rd.Id); throw new Exception(exceptionMessage); } } } else if (p.Type == PropertyType.ReferenceVector) { bool changed = false; List <long> gidsRef = p.AsReferences(); for (int i = 0; i < gidsRef.Count; i++) { long gidOldRef = gidsRef[i]; int idOldRef = ModelCodeHelper.ExtractEntityIdFromGlobalId(gidOldRef); if (idOldRef < 0) { if (globaldChanges.ContainsKey(gidOldRef)) { gidsRef[i] = globaldChanges[gidOldRef]; changed = true; } else { message = String.Format("Failed to fix negative to positive IDs in update delta operations for delta with ID: {0} because negative reference (property code: {1}, value: 0x{2:X16}) does not exist in insert delta operations. Resource ID: 0x{3:X16}. ", GetCompositeId(id), p.Id, gidOldRef, rd.Id); Logger.LogError(message); string exceptionMessage = String.Format("Invalid update delta operation. Negative reference (property code: {0}, value: 0x{1:X16}) does not exist in insert delta operations. Resource ID: 0x{2:X16}. ", p.Id, gidOldRef, rd.Id); throw new Exception(exceptionMessage); } } } if (changed) { p.SetValue(gidsRef); } } } } // change ids in delete operations foreach (ResourceDescription rd in deleteOps) { long gidOld = rd.Id; int idOld = ModelCodeHelper.ExtractEntityIdFromGlobalId(rd.Id); if (idOld < 0) { if (globaldChanges.ContainsKey(gidOld)) { rd.Id = globaldChanges[gidOld]; } else { message = String.Format("Failed to fix negative to positive IDs in delete delta operations for delta with ID: {0} because negative resource ID: 0x{1:X16} does not exists in insert delta operations.", GetCompositeId(id), gidOld); Logger.LogError(message); string exceptionMessage = String.Format("Invalid delete delta operation. Negative resource ID: 0x{0:X16} does not exists in insert delta operations.", gidOld); throw new Exception(message); } } } message = String.Format("Fixing negative to positive IDs for delta with ID: {0} completed successfully.", GetCompositeId(id)); Logger.LogDebug(message); }