Пример #1
0
 public void LoadAll(Type[] t, IImportProvider ip)
 {
     foreach (var type in t)
     {
         Load(type, ip);
     }
 }
Пример #2
0
        /// <summary>
        ///     Root load function. Loads <paramref name="value" /> of type <paramref name="type" /> using the
        ///     specified <see cref="IImportProvider" /> <paramref name="ip" />.
        /// </summary>
        /// <param name="value">Value of type <paramref name="type" /> to load</param>
        /// <param name="type"><see cref="MetaType" /> of <paramref name="value" /></param>
        /// <param name="ip"><see cref="IImportProvider" /> to use to load components</param>
        /// <typeparam name="T">Type of <paramref name="value" /></typeparam>
        /// <returns><paramref name="value" />, fully loaded</returns>
        private T Load <T>(T value, Type type, IImportProvider ip)
        {
            if (IsBound(type))
            {
                return(value);
            }

            if (!IsAnnotated(type, out _))
            {
                throw Guard.ImportFail(NamespaceError);
            }

            if (UsingMap(type, out var mapField))
            {
                LoadMap(type, mapField);
                value = LoadComponents(value, type, ip, LoadMethod);
            }
            else
            {
                value = LoadComponents(value, type, ip);
            }

            m_boundTypes.Add(type);

            Global.Value.WriteVerbose(Id, "Completed loading {Name}", type.Name);

            return(value);
        }
Пример #3
0
 /// <summary>
 /// creates a new <see cref="WorkflowExecutionService"/>
 /// </summary>
 /// <param name="logger">access to logging</param>
 /// <param name="taskservice">access to task information</param>
 /// <param name="importprovider">access to host imports</param>
 /// <param name="workflowservice">provides workflow data</param>
 /// <param name="workflowcompiler">compiled workflow data to executable instances</param>
 public WorkflowExecutionService(ILogger <WorkflowExecutionService> logger, ITaskService taskservice, IMethodProviderService importprovider, IWorkflowService workflowservice, IWorkflowCompiler workflowcompiler)
 {
     this.logger           = logger;
     this.taskservice      = taskservice;
     this.importprovider   = importprovider;
     this.workflowservice  = workflowservice;
     this.workflowcompiler = workflowcompiler;
 }
Пример #4
0
        private static T LoadComponents <T>(T value,
                                            Type type,
                                            IImportProvider ip,
                                            LoadMethodFunction methodFn,
                                            LoadFieldFunction <T> fieldFn = null)
        {
            (MemberInfo[] members, ImportAttribute[] attributes) = type.GetAnnotated <ImportAttribute>();

            int lim = attributes.Length;

            if (lim == default)
            {
                return(value);
            }

            for (int i = 0; i < lim; i++)
            {
                var attr = attributes[i];
                var mem  = members[i];

                // Resolve the symbol

                string         id   = ResolveIdentifier(attr, mem);
                Pointer <byte> addr = ip.GetAddress(id);

                switch (mem.MemberType)
                {
                case MemberTypes.Property:
                    var propInfo = (PropertyInfo)mem;
                    var get      = propInfo.GetMethod;
                    methodFn(attr, get, addr);
                    break;

                case MemberTypes.Method:
                    // The import is a function or (ctor)
                    methodFn(attr, (MethodInfo)mem, addr);
                    break;

                case MemberTypes.Field:
                    fieldFn?.Invoke(ref value, ip, id, (MetaField)mem, attr);
                    break;

                default:
                    throw Guard.NotSupportedMemberFail(mem);
                }

                Global.Value.WriteVerbose(null, "Loaded member {Id} @ {Addr}", id, addr);
            }

            return(value);
        }
Пример #5
0
        public ParserOptions ReplaceImportProvider(
            IImportProvider provider,
            IImportProvider with)
        {
            var options = new ParserOptions();

            options.ImportProviders.AddRange(ImportProviders);
            var index = options.ImportProviders.IndexOf(provider);

            options.ImportProviders.Remove(provider);
            options.ImportProviders.Insert(index, with);

            return(options);
        }
Пример #6
0
        private void LoadField <T>(ref T value,
                                   IImportProvider ip,
                                   string identifier,
                                   MetaField field,
                                   ImportAttribute attr)
        {
            var            ifld      = (ImportFieldAttribute)attr;
            Pointer <byte> ptr       = ip.GetAddress(identifier);
            var            options   = ifld.FieldOptions;
            Pointer <byte> fieldAddr = field.GetValueAddress(ref value);

            object fieldValue;

            Global.Value.WriteDebug(Id, "Loading field {Id} with {Option}",
                                    field.Name, options);

            switch (options)
            {
            case ImportFieldOptions.CopyIn:
                fieldValue = CopyInField(ifld, field, ptr);
                break;

            case ImportFieldOptions.Proxy:
                fieldValue = ProxyLoadField(ifld, field, ptr);
                break;

            case ImportFieldOptions.Fast:
                FastLoadField(field, ptr, fieldAddr);
                return;

            default:
                throw new ArgumentOutOfRangeException();
            }

            if (field.FieldType.IsAnyPointer)
            {
                ptr.WritePointer((Pointer <byte>)fieldValue);
            }
            else
            {
                ptr.WriteAny(field.FieldType.RuntimeType, fieldValue);
            }
        }
Пример #7
0
 public DataService(IExportProvider exportProvider, IImportProvider importProvider)
 {
     this.exportProvider = exportProvider;
     this.importProvider = importProvider;
 }
Пример #8
0
        public async Task <ImportReport> PerformImport(ExportType exportType, bool fetchLiveData, APICredentials credentials, CoreReferenceData coreRefData, string outputPath, IImportProvider provider)
        {
            var p = ((BaseImportProvider)provider);

            p.ExportType = exportType;

            ImportReport resultReport = new ImportReport();

            resultReport.ProviderDetails = p;

            try
            {
                bool loadOK = false;

                if (fetchLiveData && p.IsAutoRefreshed && !String.IsNullOrEmpty(p.AutoRefreshURL))
                {
                    p.Log("Loading input data from URL..");
                    loadOK = p.LoadInputFromURL(p.AutoRefreshURL);
                }
                else
                {
                    if (p.IsStringData)
                    {
                        p.Log("Loading input data from file..");
                        loadOK = p.LoadInputFromFile(p.InputPath);
                    }
                    else
                    {
                        //binary streams pass as OK by default
                        loadOK = true;
                    }
                }

                if (!loadOK)
                {
                    //failed to load
                    p.Log("Failed to load input data.");
                    throw new Exception("Failed to fetch input data");
                }
                List <ChargePoint> duplicatesList = new List <ChargePoint>();

                p.Log("Processing input..");

                var list       = provider.Process(coreRefData);
                int numAdded   = 0;
                int numUpdated = 0;

                if (list.Count > 0)
                {
                    p.Log("De-Deuplicating list (" + p.ProviderName + ":: " + list.Count + " Items)..");

                    //de-duplicate and clean list based on existing data
                    //TODO: take original and replace in final update list, setting relevant updated properties (merge) and status
                    var finalList = await DeDuplicateList(list, true, coreRefData, resultReport);

                    //var finalList = list;

                    if (ImportUpdatesOnly)
                    {
                        finalList = finalList.Where(l => l.ID > 0).ToList();
                    }
                    //finalList = client.GetLocations(new SearchFilters { MaxResults = 10000 });

                    //export/apply updates
                    if (p.ExportType == ExportType.XML)
                    {
                        p.Log("Exporting XML..");

                        //output xml
                        p.ExportXMLFile(finalList, outputPath + p.OutputNamePrefix + ".xml");
                    }

                    if (p.ExportType == ExportType.CSV)
                    {
                        p.Log("Exporting CSV..");
                        //output csv
                        p.ExportCSVFile(finalList, outputPath + p.OutputNamePrefix + ".csv");
                    }

                    if (p.ExportType == ExportType.JSON)
                    {
                        p.Log("Exporting JSON..");
                        //output json
                        p.ExportJSONFile(finalList, outputPath + p.OutputNamePrefix + ".json");
                    }
                    if (p.ExportType == ExportType.API && p.IsProductionReady)
                    {
                        //publish list of locations to OCM via API
                        OCMClient ocmClient = new OCMClient(IsSandboxedAPIMode);
                        p.Log("Publishing via API..");
                        foreach (ChargePoint cp in finalList.Where(l => l.AddressInfo.Country != null))
                        {
                            ocmClient.UpdateItem(cp, credentials);
                            if (cp.ID == 0)
                            {
                                numAdded++;
                            }
                            else
                            {
                                numUpdated++;
                            }
                        }
                    }
                    if (p.ExportType == ExportType.POIModelList)
                    {
                        resultReport.Added   = finalList.Where(cp => cp.ID == 0).ToList();
                        resultReport.Updated = finalList.Where(cp => cp.ID > 0).ToList();
                    }
                }

                p.Log("Import Processed:" + provider.GetProviderName() + " Added:" + numAdded + " Updated:" + numUpdated);
            }
            catch (Exception exp)
            {
                p.Log("Import Failed:" + provider.GetProviderName() + " ::" + exp.ToString());
            }

            return(resultReport);
        }
Пример #9
0
        public async Task <ImportReport> PerformImport(ExportType exportType, bool fetchLiveData, APICredentials credentials, CoreReferenceData coreRefData, string outputPath, IImportProvider provider, bool cacheInputData, bool fetchExistingFromAPI = false)
        {
            var p = ((BaseImportProvider)provider);

            p.ExportType = exportType;

            ImportReport resultReport = new ImportReport();

            resultReport.ProviderDetails = p;

            try
            {
                bool loadOK = false;
                if (p.ImportInitialisationRequired && p is IImportProviderWithInit)
                {
                    ((IImportProviderWithInit)provider).InitImportProvider();
                }
                if (fetchLiveData && p.IsAutoRefreshed && !String.IsNullOrEmpty(p.AutoRefreshURL))
                {
                    Log("Loading input data from URL..");
                    loadOK = p.LoadInputFromURL(p.AutoRefreshURL);
                }
                else
                {
                    if (p.IsStringData && !p.UseCustomReader)
                    {
                        Log("Loading input data from file..");
                        loadOK = p.LoadInputFromFile(p.InputPath);
                    }
                    else
                    {
                        //binary streams pass as OK by default
                        loadOK = true;
                    }
                }

                if (!loadOK)
                {
                    //failed to load
                    Log("Failed to load input data.");
                    throw new Exception("Failed to fetch input data");
                }
                else
                {
                    if (fetchLiveData && cacheInputData)
                    {
                        //save input data
                        p.SaveInputFile(p.InputPath);
                    }
                }

                List <ChargePoint> duplicatesList = new List <ChargePoint>();

                Log("Processing input..");

                var list = provider.Process(coreRefData);

                int numAdded   = 0;
                int numUpdated = 0;

                if (list.Count > 0)
                {
                    if (p.MergeDuplicatePOIEquipment)
                    {
                        Log("Merging Equipment from Duplicate POIs");
                        list = MergeDuplicatePOIEquipment(list);
                    }

                    if (!p.IncludeInvalidPOIs)
                    {
                        Log("Cleaning invalid POIs");
                        var invalidPOIs = new List <ChargePoint>();
                        foreach (var poi in list)
                        {
                            if (!BaseImportProvider.IsPOIValidForImport(poi))
                            {
                                invalidPOIs.Add(poi);
                            }
                        }
                        foreach (var poi in invalidPOIs)
                        {
                            list.Remove(poi);
                        }
                    }

                    GC.Collect();

                    List <ChargePoint> finalList = new List <ChargePoint>();

                    if (!p.SkipDeduplication)
                    {
                        Log("De-Deuplicating list (" + p.ProviderName + ":: " + list.Count + " Items)..");

                        //de-duplicate and clean list based on existing data
                        //TODO: take original and replace in final update list, setting relevant updated properties (merge) and status
                        finalList = await DeDuplicateList(list.ToList(), true, coreRefData, resultReport, p.AllowDuplicatePOIWithDifferentOperator, fetchExistingFromAPI);

                        //var finalList = list;
                    }
                    else
                    {
                        //skip deduplication
                        finalList = list.ToList();
                    }

                    if (ImportUpdatesOnly)
                    {
                        finalList = finalList.Where(l => l.ID > 0).ToList();
                    }
                    //finalList = client.GetLocations(new SearchFilters { MaxResults = 10000 });

                    GC.Collect();

                    //export/apply updates
                    if (p.ExportType == ExportType.XML)
                    {
                        Log("Exporting XML..");

                        //output xml
                        p.ExportXMLFile(finalList, outputPath + p.OutputNamePrefix + ".xml");
                    }

                    if (p.ExportType == ExportType.CSV)
                    {
                        Log("Exporting CSV..");
                        //output csv
                        p.ExportCSVFile(finalList, outputPath + p.OutputNamePrefix + ".csv");
                    }

                    if (p.ExportType == ExportType.JSON)
                    {
                        Log("Exporting JSON..");
                        //output json
                        p.ExportJSONFile(finalList, outputPath + p.OutputNamePrefix + ".json");
                    }
                    if (p.ExportType == ExportType.API && p.IsProductionReady)
                    {
                        //publish list of locations to OCM via API
                        OCMClient ocmClient = new OCMClient(IsSandboxedAPIMode);
                        Log("Publishing via API..");
                        foreach (ChargePoint cp in finalList.Where(l => l.AddressInfo.Country != null))
                        {
                            ocmClient.UpdateItem(cp, credentials);
                            if (cp.ID == 0)
                            {
                                numAdded++;
                            }
                            else
                            {
                                numUpdated++;
                            }
                        }
                    }
                    if (p.ExportType == ExportType.POIModelList)
                    {
                        //result report contains POI lists
                    }
                }

                Log("Import Processed:" + provider.GetProviderName() + " Added:" + numAdded + " Updated:" + numUpdated);
            }
            catch (Exception exp)
            {
                Log("Import Failed:" + provider.GetProviderName() + " ::" + exp.ToString());
            }

            resultReport.Log  = "";
            resultReport.Log += p.ProcessingLog;

            resultReport.Log += ImportLog;
            return(resultReport);
        }
Пример #10
0
        public async Task<ImportReport> PerformImport(ExportType exportType, bool fetchLiveData, APICredentials credentials, CoreReferenceData coreRefData, string outputPath, IImportProvider provider, bool cacheInputData)
        {
            var p = ((BaseImportProvider)provider);
            p.ExportType = exportType;

            ImportReport resultReport = new ImportReport();
            resultReport.ProviderDetails = p;

            try
            {
                bool loadOK = false;
                if (p.ImportInitialisationRequired && p is IImportProviderWithInit)
                {
                    ((IImportProviderWithInit)provider).InitImportProvider();
                }
                if (fetchLiveData && p.IsAutoRefreshed && !String.IsNullOrEmpty(p.AutoRefreshURL))
                {
                    Log("Loading input data from URL..");
                    loadOK = p.LoadInputFromURL(p.AutoRefreshURL);
                }
                else
                {
                    if (p.IsStringData && !p.UseCustomReader)
                    {
                        Log("Loading input data from file..");
                        loadOK = p.LoadInputFromFile(p.InputPath);
                    }
                    else
                    {
                        //binary streams pass as OK by default
                        loadOK = true;
                    }
                }

                if (!loadOK)
                {
                    //failed to load
                    Log("Failed to load input data.");
                    throw new Exception("Failed to fetch input data");
                }
                else
                {
                    if (fetchLiveData && cacheInputData)
                    {
                        //save input data
                        p.SaveInputFile(p.InputPath);
                    }
                }

                List<ChargePoint> duplicatesList = new List<ChargePoint>();

                Log("Processing input..");

                var list = provider.Process(coreRefData);

                int numAdded = 0;
                int numUpdated = 0;

                if (list.Count > 0)
                {
                    if (p.MergeDuplicatePOIEquipment)
                    {
                        Log("Merging Equipment from Duplicate POIs");
                        list = MergeDuplicatePOIEquipment(list);
                    }

                    if (!p.IncludeInvalidPOIs)
                    {
                        Log("Cleaning invalid POIs");
                        var invalidPOIs = new List<ChargePoint>();
                        foreach (var poi in list)
                        {
                            if (!BaseImportProvider.IsPOIValidForImport(poi))
                            {
                                invalidPOIs.Add(poi);
                            }
                        }
                        foreach (var poi in invalidPOIs)
                        {
                            list.Remove(poi);
                        }
                    }

                    List<ChargePoint> finalList = new List<ChargePoint>();

                    if (!p.SkipDeduplication)
                    {
                        Log("De-Deuplicating list (" + p.ProviderName + ":: " + list.Count + " Items)..");

                        //de-duplicate and clean list based on existing data
                        //TODO: take original and replace in final update list, setting relevant updated properties (merge) and status
                        finalList = await DeDuplicateList(list.ToList(), true, coreRefData, resultReport, p.AllowDuplicatePOIWithDifferentOperator);
                        //var finalList = list;
                    }
                    else
                    {
                        //skip deduplication
                        finalList = list.ToList();
                    }

                    if (ImportUpdatesOnly)
                    {
                        finalList = finalList.Where(l => l.ID > 0).ToList();
                    }
                    //finalList = client.GetLocations(new SearchFilters { MaxResults = 10000 });

                    //export/apply updates
                    if (p.ExportType == ExportType.XML)
                    {
                        Log("Exporting XML..");

                        //output xml
                        p.ExportXMLFile(finalList, outputPath + p.OutputNamePrefix + ".xml");
                    }

                    if (p.ExportType == ExportType.CSV)
                    {
                        Log("Exporting CSV..");
                        //output csv
                        p.ExportCSVFile(finalList, outputPath + p.OutputNamePrefix + ".csv");
                    }

                    if (p.ExportType == ExportType.JSON)
                    {
                        Log("Exporting JSON..");
                        //output json
                        p.ExportJSONFile(finalList, outputPath + p.OutputNamePrefix + ".json");
                    }
                    if (p.ExportType == ExportType.API && p.IsProductionReady)
                    {
                        //publish list of locations to OCM via API
                        OCMClient ocmClient = new OCMClient(IsSandboxedAPIMode);
                        Log("Publishing via API..");
                        foreach (ChargePoint cp in finalList.Where(l => l.AddressInfo.Country != null))
                        {
                            ocmClient.UpdateItem(cp, credentials);
                            if (cp.ID == 0)
                            {
                                numAdded++;
                            }
                            else
                            {
                                numUpdated++;
                            }
                        }
                    }
                    if (p.ExportType == ExportType.POIModelList)
                    {
                        //result report contains POI lists
                    }
                }

                Log("Import Processed:" + provider.GetProviderName() + " Added:" + numAdded + " Updated:" + numUpdated);
            }
            catch (Exception exp)
            {
                Log("Import Failed:" + provider.GetProviderName() + " ::" + exp.ToString());
            }

            resultReport.Log = "";
            resultReport.Log += p.ProcessingLog;

            resultReport.Log += ImportLog;
            return resultReport;
        }
Пример #11
0
 private T LoadComponents <T>(T value, Type type, IImportProvider ip)
 {
     return(LoadComponents(value, type, ip, LoadMethod, LoadField));
 }
Пример #12
0
 /// <summary>
 ///     Loads any non-instance components of type <paramref name="t" />.
 /// </summary>
 /// <param name="t"><see cref="Type" /> to load</param>
 /// <param name="ip"><see cref="IImportProvider" /> to use</param>
 /// <returns>A <c>default</c> object of type <paramref name="t" /></returns>
 public object Load(Type t, IImportProvider ip) => Load(default(object), t, ip);
Пример #13
0
 /// <summary>
 ///     Loads <paramref name="value" /> using <paramref name="ip" />.
 /// </summary>
 /// <param name="value">Value to load</param>
 /// <param name="ip"><see cref="IImportProvider" /> to use</param>
 /// <typeparam name="T">Type of <paramref name="value" /></typeparam>
 /// <returns><paramref name="value" />, fully loaded</returns>
 public T Load <T>(T value, IImportProvider ip) => Load(value, value.GetType(), ip);