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}");
        }
Example #2
0
        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);
                                }
                            }
                        }
                    }
                }
            }
        }
Example #4
0
        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);
        }