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}");
        }
        public TransformAndLoadReport CreateNMSDelta(ConcreteModel cimConcreteModel, ModelResourcesDesc resourcesDesc)
        {
            Logger.LogInfo("Importing Outage Elements...");
            report        = new TransformAndLoadReport();
            concreteModel = cimConcreteModel;
            delta.ClearDeltaOperations();
            MridToPositiveGidFromServer.Clear();
            MridsFromConcreteModel.Clear();
            NegativeGidToMrid.Clear();

            if ((concreteModel != null) && (concreteModel.ModelMap != null))
            {
                try
                {
                    ConvertModelAndPopulateDelta(resourcesDesc);
                }
                catch (Exception ex)
                {
                    string message = $"{DateTime.Now} - ERROR in data import - {ex.Message}";
                    //LogManager.Log(message);
                    Logger.LogError(message, ex);
                    report.Report.AppendLine(ex.Message);
                    report.Success = false;
                }
            }
            Logger.LogInfo("Importing Outage Elements - END");
            return(report);
        }
        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);
                                }
                            }
                        }
                    }
                }
            }
        }
        private bool PopulateNmsDataFromServer(ModelResourcesDesc resourcesDesc)
        {
            bool   success = false;
            string message = "Getting nms data from server started.";

            Logger.LogInfo(message);

            using (NetworkModelGDAProxy nmsProxy = proxyFactory.CreateProxy <NetworkModelGDAProxy, INetworkModelGDAContract>(EndpointNames.NetworkModelGDAEndpoint))
            {
                if (nmsProxy == null)
                {
                    string errMessage = "NetworkModelGdaClient is null.";
                    Logger.LogWarn(errMessage);
                    throw new NullReferenceException(errMessage);
                }

                HashSet <ModelCode> requiredEntityTypes = new HashSet <ModelCode>();

                foreach (DMSType dmsType in Enum.GetValues(typeof(DMSType)))
                {
                    if (dmsType == DMSType.MASK_TYPE)
                    {
                        continue;
                    }

                    ModelCode mc = resourcesDesc.GetModelCodeFromType(dmsType);

                    if (!requiredEntityTypes.Contains(mc))
                    {
                        requiredEntityTypes.Add(mc);
                    }
                }

                List <ModelCode> mrIdProp = new List <ModelCode>()
                {
                    ModelCode.IDOBJ_MRID
                };

                foreach (ModelCode modelCodeType in requiredEntityTypes)
                {
                    int iteratorId        = 0;
                    int resourcesLeft     = 0;
                    int numberOfResources = 10000;                     //TODO: connfigurabilno

                    try
                    {
                        iteratorId    = nmsProxy.GetExtentValues(modelCodeType, mrIdProp);
                        resourcesLeft = nmsProxy.IteratorResourcesLeft(iteratorId);

                        while (resourcesLeft > 0)
                        {
                            List <ResourceDescription> gdaResult = nmsProxy.IteratorNext(numberOfResources, iteratorId);

                            foreach (ResourceDescription rd in gdaResult)
                            {
                                if (rd.Properties[0].Id != ModelCode.IDOBJ_MRID)
                                {
                                    continue;
                                }

                                string mrId = rd.Properties[0].PropertyValue.StringValue;

                                if (!MridToPositiveGidFromServer.ContainsKey(mrId))
                                {
                                    MridToPositiveGidFromServer.Add(mrId, rd.Id);
                                }
                                else
                                {
                                    throw new NotImplementedException("Method PopulateNmsDataFromServer() -> MridToPositiveGid.ContainsKey(mrId) == true");
                                }
                            }

                            resourcesLeft = nmsProxy.IteratorResourcesLeft(iteratorId);
                        }

                        nmsProxy.IteratorClose(iteratorId);

                        message = "Getting nms data from server successfully finished.";
                        Logger.LogInfo(message);
                        success = true;
                    }
                    catch (Exception e)
                    {
                        message = string.Format("Getting extent values method failed for {0}.\n\t{1}", modelCodeType, e.Message);
                        Logger.LogError(message);
                        success = false;
                    }
                }
            }

            return(success);
        }