public async Task <bool> LoadPlugin(string pluginUrl) { try { string filepath = null; if (File.Exists(pluginUrl)) { filepath = pluginUrl; } else { Uri uri = new Uri(pluginUrl); filepath = FindLocalisedPlugin(uri); if (filepath is null) { using (HttpClient client = new HttpClient()) { var streamTask = client.GetStreamAsync(uri); string localDir = LocalDirectory(uri); if (!Directory.Exists(localDir)) { Directory.CreateDirectory(localDir); } var stream = await streamTask; string localisedFile = Path.Combine(localDir, Path.GetFileName(pluginUrl)); using (FileStream fstream = new FileStream(localisedFile, FileMode.CreateNew)) { await stream.CopyToAsync(fstream); } if (Path.GetExtension(pluginUrl).Equals(".zip", StringComparison.OrdinalIgnoreCase)) { ZipFile.ExtractToDirectory(localisedFile, localDir); } } } filepath = FindLocalisedPlugin(uri); } if (filepath != null && File.Exists(filepath)) { Assembly.LoadFrom(filepath); XMeeplangDeserialiser.InvalidateCache(); DataSelector.InvalidateCache(); return(true); } } catch (Exception ex) { logger.Error(ex, "{0} thrown trying to load plugin {1}: {2}", ex.GetType().Name, pluginUrl, ex.Message); } return(false); }
public override async Task <Message> HandleMessage(Message msg) { XmlReader reader; if (msg is XMLMessage) { reader = ((XMLMessage)msg).GetReader(); } else if (msg is IStreamMessage) { reader = XmlReader.Create(await((IStreamMessage)msg).GetStream()); } else if (msg is IStringMessage) { reader = XmlReader.Create(new StringReader(((IStringMessage)msg).Value)); } else { return(null); } return(await Task.Run <Message>(() => { try { // Chain XmlReaders together to handle XIncludes, plugins // and macro expansion. // A pipeline within a pipeline within a pipeline. XIncludingReader includingReader = new XIncludingReader(reader); XPluginReader pluginReader = new XPluginReader(includingReader); XDownstreamReader downstreamReader = new XDownstreamReader(pluginReader); XUpstreamReader upstreamReader = new XUpstreamReader(downstreamReader); var deserialiser = new XMeeplangDeserialiser(); var tree = deserialiser.Deserialise(upstreamReader); return new DeserialisedPipeline { DerivedFrom = msg, Tree = tree }; } catch (Exception ex) { logger.Error(ex, "{0} thrown when deserialising pipeline definition: {1}", ex.GetType().Name, ex.Message); return null; } })); }
public override bool Read() { bool read = base.Read(); if (read && _Reader.NodeType == XmlNodeType.Element) { if (_Reader.NamespaceURI == ANamable.DefaultNamespace && _Reader.LocalName == "Plugin") { try { string filename = GetAttribute("File"); if (filename != null) { string filepath = null; if (File.Exists(filename)) { filepath = filename; } else { filepath = Path.Combine(pluginDir, filename); } if (File.Exists(filepath)) { Assembly.LoadFrom(filepath); XMeeplangDeserialiser.InvalidateCache(); } else { logger.Warn($"Plugin {filename} not found"); } } } catch (Exception ex) { logger.Error(ex, $"{ex.GetType().Name} thrown when loading plugin: {ex.Message}"); } } } return(read); }