Esempio n. 1
0
 public static CsvObject Create(SystemObjectEntity systemObject, AttributesObject attrObject)
 {
     return(new CsvObject
     {
         Id = systemObject.Id,
         ParentId = systemObject.ParentId,
         SystemId = systemObject.SystemId,
         ViewId = systemObject.ViewId,
         Descriptor = systemObject.Descriptor,
         UnitDescriptor = systemObject.UnitDescriptor,
         Designation = systemObject.Designation,
         Name = systemObject.Name,
         SystemName = systemObject.SystemName,
         ObjectId = systemObject.ObjectId,
         DefaultProperty = attrObject.DefaultProperty,
         DisciplineDescriptor = attrObject.DisciplineDescriptor,
         DisciplineId = attrObject.DisciplineId,
         FunctionDefaultProperty = attrObject.FunctionDefaultProperty,
         FunctionName = attrObject.FunctionName,
         ManagedType = attrObject.ManagedType,
         ManagedTypeName = attrObject.ManagedTypeName,
         SubDisciplineDescriptor = attrObject.SubDisciplineDescriptor,
         SubDisciplineId = attrObject.SubDisciplineId,
         SubTypeDescriptor = attrObject.SubTypeDescriptor,
         SubTypeId = attrObject.SubTypeId,
         TypeDescriptor = attrObject.TypeDescriptor,
         TypeId = attrObject.TypeId
     });
 }
 public async Task CreateSystemObject(bool bMultiThread, SystemObjectEntity SystemObject)
 {
     if (bMultiThread)
     {
         using (var context = _scope.CreateScope().ServiceProvider.GetService <SiemensDbContext>())
         {
             await Create(context, SystemObject);
         }
     }
     else
     {
         await Create(_dbContext, SystemObject);
     }
 }
        private async Task Create(SiemensDbContext context, SystemObjectEntity SystemObject)
        {
            var existing = context.SystemObjects.FirstOrDefault(x => x.SiteId == SystemObject.SiteId && x.ObjectId == SystemObject.ObjectId && x.Name == SystemObject.Name && x.Designation == SystemObject.Designation);

            if (existing != null)
            {
                SystemObject.Id = existing.Id;
                context.Entry(SystemObject).State = EntityState.Modified;
            }
            else
            {
                context.SystemObjects.Add(SystemObject);
            }
            await context.SaveChangesAsync();
        }
        private List <SystemObjectEntity> GetDbItemsRecursively(DataItem item, SystemObjectEntity parent = null)
        {
            var sObject = Map(item);

            if (parent != null)
            {
                sObject.Parent = parent;
            }

            var childrenObjects = new List <SystemObjectEntity>();

            foreach (var child in item.ChildrenItems)
            {
                childrenObjects.AddRange(GetDbItemsRecursively(child, sObject));
            }

            childrenObjects.Insert(0, sObject);

            return(childrenObjects);
        }
        private List <DataItem> ImportRecursive(HttpClient client, string url, LinkType linkType, int?parentSystemObjectId, SystemObjectEntity parentSystemObject, int MaxThreads, ScanRequest scanRequest)
        {
            var data = client.GetAsync(url).Result;

            if (!data.IsSuccessStatusCode)
            {
                _logger.LogWarning("Failed to invoke {statusCode} {url}", data.StatusCode, url);
                throw new Exception($"Failed to invoke {data.StatusCode} {url}");
                //return new List<DataItem>();
            }
            var strData = data.Content.ReadAsStringAsync().Result;

            strData = strData.Trim();
            _logger.LogInformation("URL: {url}", url);
            _logger.LogInformation("Response: {response}", strData);
            var items = linkType == LinkType.Systembrowser
                ? JsonConvert.DeserializeObject <List <DataItem> >(strData)
                : new List <DataItem> {
                JsonConvert.DeserializeObject <DataItem>(strData)
            };

            if (linkType == LinkType.Properties && parentSystemObject != null)
            {
                var dataItem = items.First();
                parentSystemObject.Properties         = dataItem.Properties?.ToString();
                parentSystemObject.FunctionProperties = dataItem.FunctionProperties?.ToString();
                return(new List <DataItem>());
            }

            Parallel.ForEach(items, new ParallelOptions {
                MaxDegreeOfParallelism = MaxThreads
            }, dataItem =>
            {
                var dbEntity = new SystemObjectEntity
                {
                    ParentId           = parentSystemObjectId,
                    Name               = dataItem.Name,
                    Descriptor         = dataItem.Descriptor,
                    Designation        = dataItem.Designation,
                    ObjectId           = dataItem.ObjectId,
                    SystemId           = dataItem.SystemId,
                    ViewId             = dataItem.ViewId,
                    SystemName         = dataItem.SystemName,
                    Attributes         = dataItem.Attributes?.ToString(),
                    Properties         = dataItem.Properties?.ToString(),
                    FunctionProperties = dataItem.FunctionProperties?.ToString(),
                    SiteId             = SiteId
                };

                _systemObjectService.CreateSystemObject(true, dbEntity).Wait();

                foreach (var dataItemLink in dataItem.Links)
                {
                    var lt = dataItemLink.Rel.Trim().ToLower() == "systembrowser"
                        ? LinkType.Systembrowser
                        : LinkType.Properties;

                    dataItem.ChildrenItems.AddRange(ImportRecursive(client, "api/" + dataItemLink.Href, lt, dbEntity.Id, dbEntity, 1, scanRequest));
                }

                ProcessingCount++;
                if (MaxThreads > 1)
                {
                    scanRequest.NumberOfPoints = ProcessingCount;
                    UpdateScanRequestInMultiThread(scanRequest).Wait();
                    _logger.LogInformation($"Processing Count : {ProcessingCount}");
                }
            });

            return(items);
        }
        private async Task <List <DataItem> > StartScan(HttpClient client, string url, LinkType linkType, SiteConfiguration siteConfiguration, ScanRequest scanRequest)
        {
            var data = await client.GetAsync(url);

            _logger.LogInformation("Started");
            if (!data.IsSuccessStatusCode)
            {
                _logger.LogWarning("Failed to invoke {statusCode} {url}", data.StatusCode, url);
                throw new Exception($"Failed to invoke {data.StatusCode} {url}");
                //return new List<DataItem>();
            }
            var strData = await data.Content.ReadAsStringAsync();

            strData = strData.Trim();
            _logger.LogInformation("URL: {url}", url);
            _logger.LogInformation("Response: {response}", strData);
            var items = linkType == LinkType.Systembrowser
                ? JsonConvert.DeserializeObject <List <DataItem> >(strData)
                : new List <DataItem> {
                JsonConvert.DeserializeObject <DataItem>(strData)
            };

            // ------- for local testing ----------

            //var items = new List<DataItem>();
            //for(int i=0; i<100; i++)
            //{
            //    items.Add(new DataItem() { SystemId = i });
            //}

            //---------------------------------


            foreach (var dataItem in items)
            {
                var dbEntity = new SystemObjectEntity
                {
                    ParentId           = null,
                    Name               = dataItem.Name,
                    Descriptor         = dataItem.Descriptor,
                    Designation        = dataItem.Designation,
                    ObjectId           = dataItem.ObjectId,
                    SystemId           = dataItem.SystemId,
                    ViewId             = dataItem.ViewId,
                    SystemName         = dataItem.SystemName,
                    Attributes         = dataItem.Attributes?.ToString(),
                    Properties         = dataItem.Properties?.ToString(),
                    FunctionProperties = dataItem.FunctionProperties?.ToString(),
                    SiteId             = SiteId
                };

                _systemObjectService.CreateSystemObject(true, dbEntity).Wait();

                foreach (var dataItemLink in dataItem.Links)
                {
                    var lt = dataItemLink.Rel.Trim().ToLower() == "systembrowser"
                        ? LinkType.Systembrowser
                        : LinkType.Properties;

                    dataItem.ChildrenItems.AddRange(ImportRecursive(client, "api/" + dataItemLink.Href, lt, dbEntity.Id, dbEntity, siteConfiguration.MaxThreads, scanRequest));
                }
                ProcessingCount++;
                scanRequest.NumberOfPoints = ProcessingCount;
                UpdateScanRequestInMultiThread(scanRequest).Wait();
                _logger.LogInformation($"Processing Count : {ProcessingCount}");
            }

            scanRequest.Status         = ScanRequestStatus.Completed;
            scanRequest.EndTime        = DateTime.UtcNow;
            scanRequest.NumberOfPoints = ProcessingCount;
            await UpdateScanRequestInMultiThread(scanRequest);

            _logger.LogInformation($"Completed. Total Processed Count : {ProcessingCount}");
            return(items);
        }
Esempio n. 7
0
        private async Task <List <StoreItemTask> > ScanItemRecursive(HttpClient client, Guid siteId, ScanItemTask scanItemTask)
        {
            Interlocked.Increment(ref _scansInProcess);
            try
            {
                _logger.LogInformation($"Scanning url: " + scanItemTask.Url);

                var data = await client.GetAsync(scanItemTask.Url);

                if (!data.IsSuccessStatusCode)
                {
                    _logger.LogWarning("Failed to invoke {statusCode} {url}", data.StatusCode, scanItemTask.Url);
                    return(new List <StoreItemTask>());
                }

                var strData = (await data.Content.ReadAsStringAsync()).Trim();

                var items = JsonConvert.DeserializeObject <List <DataItem> >(strData);

                var dbEntities = new Dictionary <SystemObjectEntity, TaskCompletionSource <bool> >();
                foreach (var dataItem in items)
                {
                    var dbEntity = new SystemObjectEntity
                    {
                        Name               = dataItem.Name,
                        Descriptor         = dataItem.Descriptor,
                        Designation        = dataItem.Designation,
                        ObjectId           = dataItem.ObjectId,
                        SystemId           = dataItem.SystemId,
                        ViewId             = dataItem.ViewId,
                        SystemName         = dataItem.SystemName,
                        Attributes         = dataItem.Attributes?.ToString(),
                        Properties         = dataItem.Properties?.ToString(),
                        FunctionProperties = dataItem.FunctionProperties?.ToString(),
                        SiteId             = siteId
                    };

                    var propertyLink = dataItem.Links.FirstOrDefault(l => l.Rel.ToLowerInvariant() != "systembrowser");
                    if (propertyLink != null)
                    {
                        var propertyData = await client.GetAsync("api/" + propertyLink.Href);

                        if (propertyData.IsSuccessStatusCode)
                        {
                            var propertyStrData = (await propertyData.Content.ReadAsStringAsync()).Trim();
                            var propertyItem    = JsonConvert.DeserializeObject <DataItem>(propertyStrData);
                            dbEntity.Properties         = propertyItem?.Properties?.ToString();
                            dbEntity.FunctionProperties = propertyItem?.FunctionProperties?.ToString();

                            if (!string.IsNullOrEmpty(dbEntity.Attributes))
                            {
                                var attributesObject = JsonConvert.DeserializeObject <AttributesObject>(dbEntity.Attributes);

                                var defaultPropertyName = attributesObject.DefaultProperty;

                                if (!string.IsNullOrEmpty(defaultPropertyName))
                                {
                                    var url      = "API/API/properties/" + dbEntity.ObjectId;
                                    var response = await client.GetAsync(url);

                                    if (response.IsSuccessStatusCode)
                                    {
                                        var strResponse = await response.Content.ReadAsStringAsync();

                                        var propertiesData  = JsonConvert.DeserializeObject <List <PropertyResponse> >(strResponse);
                                        var properties      = propertiesData.First().Properties;
                                        var defaultProperty = properties.FirstOrDefault(p => p.PropertyName == defaultPropertyName);
                                        dbEntity.UnitDescriptor = defaultProperty?.UnitDescriptor;
                                    }
                                }
                            }
                        }
                    }

                    var sytemBrowserLinks =
                        dataItem.Links.Where(l => l.Rel.ToLowerInvariant() == "systembrowser").ToList();

                    var objectStored = new TaskCompletionSource <bool>();
                    dbEntities.Add(dbEntity, objectStored);
                    foreach (var sytemBrowserLink in sytemBrowserLinks)
                    {
                        await InputQueue.SendAsync(new ScanItemTask
                        {
                            ParentSystemObject = dbEntity, Url = "api/" + sytemBrowserLink.Href,
                            ScanRequest        = scanItemTask.ScanRequest, ParentObjectStored = objectStored
                        });
                    }
                }

                return(dbEntities.Select(e => new StoreItemTask
                {
                    SystemObject = e.Key,
                    ObjectStored = e.Value,
                    ParentSystemObject = scanItemTask.ParentSystemObject,
                    ParentObjectStored = scanItemTask.ParentObjectStored,
                    ScanRequest = scanItemTask.ScanRequest
                }).ToList());
            }
            finally
            {
                var scansInProcess  = Interlocked.Decrement(ref _scansInProcess);
                var scanQueueLength = InputQueue.Count;

                _logger.LogInformation($"Scans in process: {scansInProcess}, Queue length: {scanQueueLength}");
                if (scansInProcess == 0 && scanQueueLength == 0)
                {
                    _logger.LogInformation($"Queue is empty, last scan task finished, completing the pipeline");
                    InputQueue.Complete();
                }
            }
        }