public void LoadAll(Type[] t, IImportProvider ip) { foreach (var type in t) { Load(type, ip); } }
/// <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); }
/// <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; }
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); }
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); }
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); } }
public DataService(IExportProvider exportProvider, IImportProvider importProvider) { this.exportProvider = exportProvider; this.importProvider = importProvider; }
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); }
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); }
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; }
private T LoadComponents <T>(T value, Type type, IImportProvider ip) { return(LoadComponents(value, type, ip, LoadMethod, LoadField)); }
/// <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);
/// <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);