Beispiel #1
0
        public void QueryBuild_ShouldGenerateSameSearchQuery_WithOrWithoutSpaceAfterActionKeyword()
        {
            // Arrange
            var plugin = new PluginPair {
                Metadata = new PluginMetadata {
                    ActionKeywords = new List <string> {
                        "a"
                    }
                }
            };
            var nonGlobalPlugins = new Dictionary <string, PluginPair>
            {
                { "a", plugin },
            };

            var firstQueryText  = "asearch";
            var secondQueryText = "a search";

            // Act
            var firstPluginQueryPair = QueryBuilder.Build(ref firstQueryText, nonGlobalPlugins);
            var firstQuery           = firstPluginQueryPair.GetValueOrDefault(plugin);

            var secondPluginQueryPairs = QueryBuilder.Build(ref secondQueryText, nonGlobalPlugins);
            var secondQuery            = secondPluginQueryPairs.GetValueOrDefault(plugin);

            // Assert
            Assert.IsTrue(firstQuery.Search.Equals(secondQuery.Search));
            Assert.IsTrue(firstQuery.ActionKeyword.Equals(secondQuery.ActionKeyword));
        }
Beispiel #2
0
        public static void Init()
        {
            plugins.Clear();
            BasePluginLoader.ParsePluginsConfig();

            plugins.AddRange(new PythonPluginLoader().LoadPlugin());
            plugins.AddRange(new CSharpPluginLoader().LoadPlugin());
            foreach (IPlugin plugin in plugins.Select(pluginPair => pluginPair.Plugin))
            {
                IPlugin    plugin1    = plugin;
                PluginPair pluginPair = plugins.FirstOrDefault(o => o.Plugin == plugin1);
                if (pluginPair != null)
                {
                    PluginMetadata metadata = pluginPair.Metadata;
                    ThreadPool.QueueUserWorkItem(o => plugin1.Init(new PluginInitContext()
                    {
                        Plugins = plugins,
                        CurrentPluginMetadata = metadata,
                        ChangeQuery           = s => App.Window.ChangeQuery(s),
                        CloseApp                     = App.Window.CloseApp,
                        HideApp                      = App.Window.HideApp,
                        ShowApp                      = () => App.Window.ShowApp(),
                        ShowMsg                      = (title, subTitle, iconPath) => App.Window.ShowMsg(title, subTitle, iconPath),
                        OpenSettingDialog            = () => App.Window.OpenSettingDialog(),
                        ShowCurrentResultItemTooltip = (msg) => App.Window.ShowCurrentResultItemTooltip(msg)
                    }));
                }
            }
        }
Beispiel #3
0
        public override void Dispatch(Query query)
        {
            foreach (PluginPair pair in Plugins.AllPlugins.Where(o => o.Metadata.PluginType == PluginType.System))
            {
                PluginPair pair1 = pair;
                ThreadPool.QueueUserWorkItem(state =>
                {
                    pair1.InitContext.PushResults = (q, r) =>
                    {
                        if (r == null || r.Count == 0)
                        {
                            return;
                        }
                        foreach (Result result in r)
                        {
                            result.PluginDirectory = pair1.Metadata.PluginDirecotry;
                            result.OriginQuery     = q;
                            result.AutoAjustScore  = true;
                        }
                        UpdateResultView(r);
                    };

                    List <Result> results = pair1.Plugin.Query(query);
                    pair1.InitContext.PushResults(query, results);
                });
            }
        }
Beispiel #4
0
        public static List <Result> QueryForPlugin(PluginPair pair, Query query, bool delayedExecution = false)
        {
            try
            {
                List <Result> results      = null;
                var           metadata     = pair.Metadata;
                var           milliseconds = Stopwatch.Debug($"|PluginManager.QueryForPlugin|Cost for {metadata.Name}", () =>
                {
                    if (delayedExecution && (pair.Plugin is IDelayedExecutionPlugin))
                    {
                        results = ((IDelayedExecutionPlugin)pair.Plugin).Query(query, delayedExecution) ?? new List <Result>();
                    }
                    else if (!delayedExecution)
                    {
                        results = pair.Plugin.Query(query) ?? new List <Result>();
                    }

                    if (results != null)
                    {
                        UpdatePluginMetadata(results, metadata, query);
                        UpdateResultWithActionKeyword(results, query);
                    }
                });
                metadata.QueryCount  += 1;
                metadata.AvgQueryTime = metadata.QueryCount == 1 ? milliseconds : (metadata.AvgQueryTime + milliseconds) / 2;
                return(results);
            }
            catch (Exception e)
            {
                Log.Exception($"|PluginManager.QueryForPlugin|Exception for plugin <{pair.Metadata.Name}> when query <{query}>", e);
                return(new List <Result>());
            }
        }
        public void QueryBuilderShouldSetTermsCorrectlyWhenCalled()
        {
            // Arrange
            string searchQuery = "MyTest search term";
            var    plugin      = new PluginPair(new PluginMetadata {
                ActionKeyword = "My", ID = "plugin1"
            });

            PluginManager.SetAllPlugins(new List <PluginPair>()
            {
                plugin,
            });

            // Act
            var pluginQueryPairs = QueryBuilder.Build(searchQuery);

            var builtQuery = pluginQueryPairs.GetValueOrDefault(plugin);

            // Assert
            // Using Ordinal since this is used internally
            Assert.IsTrue(builtQuery.Terms.Count == 3 &&
                          builtQuery.Terms[0].Equals("Test", StringComparison.Ordinal) &&
                          builtQuery.Terms[1].Equals("search", StringComparison.Ordinal) &&
                          builtQuery.Terms[2].Equals("term", StringComparison.Ordinal));
        }
        public void QueryBuildShouldGenerateQueriesOnlyForPluginsWhoseActionKeywordsAreLongestIfMultipleMatch()
        {
            // Arrange
            string firstSearchQuery  = "MyKeyword";
            string secondSearchQuery = "My Keyword";
            var    firstPlugin       = new PluginPair(new PluginMetadata {
                ActionKeyword = "My", ID = "plugin1"
            });
            var secondPlugin = new PluginPair(new PluginMetadata {
                ActionKeyword = "MyKey", ID = "plugin2"
            });

            PluginManager.SetAllPlugins(new List <PluginPair>()
            {
                firstPlugin,
                secondPlugin,
            });

            // Act
            var firstSearchQueryPluginPair   = QueryBuilder.Build(firstSearchQuery);
            var firstSearchQueryFirstPlugin  = firstSearchQueryPluginPair.GetValueOrDefault(firstPlugin);
            var firstSearchQuerySecondPlugin = firstSearchQueryPluginPair.GetValueOrDefault(secondPlugin);

            var secondSearchQueryPluginPair   = QueryBuilder.Build(secondSearchQuery);
            var secondSearchQueryFirstPlugin  = secondSearchQueryPluginPair.GetValueOrDefault(firstPlugin);
            var secondSearchQuerySecondPlugin = secondSearchQueryPluginPair.GetValueOrDefault(secondPlugin);

            // Assert
            Assert.IsTrue(AreEqual(firstSearchQueryFirstPlugin, null));
            Assert.IsTrue(AreEqual(firstSearchQuerySecondPlugin, new Query(firstSearchQuery, secondPlugin.Metadata.ActionKeyword)));
            Assert.IsTrue(AreEqual(secondSearchQueryFirstPlugin, new Query(secondSearchQuery, firstPlugin.Metadata.ActionKeyword)));
            Assert.IsTrue(AreEqual(secondSearchQuerySecondPlugin, null));
        }
Beispiel #7
0
        public void QueryBuilder_ShouldSetTermsCorrently_WhenCalled()
        {
            // Arrange
            string searchQuery = "abcd efgh";
            var    firstPlugin = new PluginPair {
                Metadata = new PluginMetadata {
                    ActionKeyword = "ab", ID = "plugin1"
                }
            };
            var secondPlugin = new PluginPair {
                Metadata = new PluginMetadata {
                    ActionKeyword = "abcd", ID = "plugin2"
                }
            };

            var nonGlobalPlugins = new Dictionary <string, PluginPair>
            {
                { "ab", firstPlugin },
                { "abcd", secondPlugin },
            };

            // Act
            var pluginQueryPairs = QueryBuilder.Build(ref searchQuery, nonGlobalPlugins);

            var firstQuery  = pluginQueryPairs.GetValueOrDefault(firstPlugin);
            var secondQuery = pluginQueryPairs.GetValueOrDefault(secondPlugin);

            // Assert
            Assert.IsTrue(firstQuery.Terms[0].Equals("cd") && firstQuery.Terms[1].Equals("efgh") && firstQuery.Terms.Length == 2);
            Assert.IsTrue(secondQuery.Terms[0].Equals("efgh") && secondQuery.Terms.Length == 1);
        }
Beispiel #8
0
 internal static void ExecutePluginQuery(PluginPair pair, Query query)
 {
     try
     {
         Stopwatch sw = new Stopwatch();
         sw.Start();
         List <Result> results = pair.Plugin.Query(query) ?? new List <Result>();
         results.ForEach(o =>
         {
             o.PluginID = pair.Metadata.ID;
         });
         sw.Stop();
         DebugHelper.WriteLine(string.Format("Plugin query: {0} - {1}", pair.Metadata.Name, sw.ElapsedMilliseconds));
         pair.QueryCount += 1;
         if (pair.QueryCount == 1)
         {
             pair.AvgQueryTime = sw.ElapsedMilliseconds;
         }
         else
         {
             pair.AvgQueryTime = (pair.AvgQueryTime + sw.ElapsedMilliseconds) / 2;
         }
         API.PushResults(query, pair.Metadata, results);
     }
     catch (System.Exception e)
     {
         throw new WoxPluginException(pair.Metadata.Name, e);
     }
 }
Beispiel #9
0
 public void Dispatch(Query query)
 {
     foreach (PluginPair pair in GetPlugins(query))
     {
         var customizedPluginConfig = UserSettingStorage.Instance.
                                      CustomizedPluginConfigs.FirstOrDefault(o => o.ID == pair.Metadata.ID);
         if (customizedPluginConfig != null && customizedPluginConfig.Disabled)
         {
             return;
         }
         PluginPair localPair = pair;
         if (query.IsIntantQuery && PluginManager.IsInstantSearchPlugin(pair.Metadata))
         {
             DebugHelper.WriteLine(string.Format("Plugin {0} is executing instant search.", pair.Metadata.Name));
             using (new Timeit("  => instant search took: "))
             {
                 PluginManager.ExecutePluginQuery(localPair, query);
             }
         }
         else
         {
             ThreadPool.QueueUserWorkItem(state =>
             {
                 PluginManager.ExecutePluginQuery(localPair, query);
             });
         }
     }
 }
Beispiel #10
0
        public void QueryBuildShouldGenerateSameSearchQueryWithOrWithoutSpaceAfterActionKeyword()
        {
            // Arrange
            var plugin = new PluginPair {
                Metadata = new PluginMetadata()
                {
                    ActionKeyword = "a"
                }
            };

            PluginManager.SetAllPlugins(new List <PluginPair>()
            {
                plugin,
            });

            var firstQueryText  = "asearch";
            var secondQueryText = "a search";

            // Act
            var firstPluginQueryPair = QueryBuilder.Build(firstQueryText);
            var firstQuery           = firstPluginQueryPair.GetValueOrDefault(plugin);

            var secondPluginQueryPairs = QueryBuilder.Build(secondQueryText);
            var secondQuery            = secondPluginQueryPairs.GetValueOrDefault(plugin);

            // Assert
            // Using Ordinal since this is used internally
            Assert.IsTrue(firstQuery.Search.Equals(secondQuery.Search, StringComparison.Ordinal));
            Assert.IsTrue(firstQuery.ActionKeyword.Equals(secondQuery.ActionKeyword, StringComparison.Ordinal));
        }
Beispiel #11
0
        public void QueryBuilderShouldReturnAllPluginsWithTheActionWord()
        {
            // Arrange
            string searchQuery = "!efgh";
            var    firstPlugin = new PluginPair {
                Metadata = new PluginMetadata {
                    ActionKeyword = "!", ID = "plugin1"
                }
            };
            var secondPlugin = new PluginPair {
                Metadata = new PluginMetadata {
                    ActionKeyword = "!", ID = "plugin2"
                }
            };

            PluginManager.SetAllPlugins(new List <PluginPair>()
            {
                firstPlugin,
                secondPlugin,
            });

            // Act
            var pluginQueryPairs = QueryBuilder.Build(searchQuery);

            // Assert
            Assert.AreEqual(2, pluginQueryPairs.Count);
        }
Beispiel #12
0
        /// <summary>
        /// Check if a query contains valid action keyword
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public static bool IsActionKeywordQuery(Query query)
        {
            if (string.IsNullOrEmpty(query.RawQuery))
            {
                return(false);
            }
            var strings = query.RawQuery.Split(' ');

            if (strings.Length == 1)
            {
                return(false);
            }

            var actionKeyword = strings[0].Trim();

            if (string.IsNullOrEmpty(actionKeyword))
            {
                return(false);
            }

            PluginPair pair = plugins.FirstOrDefault(o => o.Metadata.ActionKeyword == actionKeyword);

            if (pair != null)
            {
                var customizedPluginConfig = UserSettingStorage.Instance.CustomizedPluginConfigs.FirstOrDefault(o => o.ID == pair.Metadata.ID);
                if (customizedPluginConfig != null && customizedPluginConfig.Disabled)
                {
                    return(false);
                }

                return(true);
            }

            return(false);
        }
Beispiel #13
0
        public void QueryBuilderShouldSetTermsCorrectlyWhenCalled()
        {
            // Arrange
            string searchQuery = "abcd efgh";
            var    firstPlugin = new PluginPair {
                Metadata = new PluginMetadata {
                    ActionKeyword = "ab", ID = "plugin1"
                }
            };
            var secondPlugin = new PluginPair {
                Metadata = new PluginMetadata {
                    ActionKeyword = "abcd", ID = "plugin2"
                }
            };

            PluginManager.SetAllPlugins(new List <PluginPair>()
            {
                firstPlugin,
                secondPlugin,
            });

            // Act
            var pluginQueryPairs = QueryBuilder.Build(searchQuery);

            var firstQuery  = pluginQueryPairs.GetValueOrDefault(firstPlugin);
            var secondQuery = pluginQueryPairs.GetValueOrDefault(secondPlugin);

            // Assert
            // Using Ordinal since this is used internally
            Assert.IsTrue(firstQuery.Terms[0].Equals("cd", StringComparison.Ordinal) && firstQuery.Terms[1].Equals("efgh", StringComparison.Ordinal) && firstQuery.Terms.Count == 2);
            Assert.IsTrue(secondQuery.Terms[0].Equals("efgh", StringComparison.Ordinal) && secondQuery.Terms.Count == 1);
        }
Beispiel #14
0
        public override void Dispatch(Query query)
        {
            PluginPair thirdPlugin = Plugins.AllPlugins.FirstOrDefault(o => o.Metadata.ActionKeyword == query.ActionName);

            if (thirdPlugin != null && !string.IsNullOrEmpty(thirdPlugin.Metadata.ActionKeyword))
            {
                var customizedPluginConfig = UserSettingStorage.Instance.CustomizedPluginConfigs.FirstOrDefault(o => o.ID == thirdPlugin.Metadata.ID);
                if (customizedPluginConfig != null && customizedPluginConfig.Disabled)
                {
                    //need to stop the loading animation
                    UpdateResultView(null);
                    return;
                }

                ThreadPool.QueueUserWorkItem(t =>
                {
                    try
                    {
                        List <Result> results = thirdPlugin.Plugin.Query(query) ?? new List <Result>();
                        App.Window.PushResults(query, thirdPlugin.Metadata, results);
                    }
                    catch (Exception queryException)
                    {
                        Log.Error(string.Format("Plugin {0} query failed: {1}", thirdPlugin.Metadata.Name,
                                                queryException.Message));
#if (DEBUG)
                        {
                            throw;
                        }
#endif
                    }
                });
            }
        }
Beispiel #15
0
        public static List <Result> GetContextMenusForPlugin(Result result)
        {
            PluginPair pluginPair = _contextMenuPlugins.FirstOrDefault(o => o.Metadata.ID == result.PluginID);

            if (pluginPair != null)
            {
                PluginMetadata metadata = pluginPair.Metadata;
                IContextMenu   plugin   = (IContextMenu)pluginPair.Plugin;

                try {
                    List <Result> results = plugin.LoadContextMenus(result);
                    foreach (Result r in results)
                    {
                        r.PluginDirectory = metadata.PluginDirectory;
                        r.PluginID        = metadata.ID;
                        r.OriginQuery     = result.OriginQuery;
                    }

                    return(results);
                } catch (Exception e) {
                    Log.Exception(
                        $"|PluginManager.GetContextMenusForPlugin|Can't load context menus for plugin <{metadata.Name}>",
                        e);
                    return(new List <Result>());
                }
            }

            return(new List <Result>());
        }
Beispiel #16
0
        public void QueryBuilderShouldSetTermsCorrentlyWhenCalled()
        {
            // Arrange
            string searchQuery = "abcd efgh";
            var    firstPlugin = new PluginPair {
                Metadata = new PluginMetadata {
                    ActionKeyword = "ab", ID = "plugin1"
                }
            };
            var secondPlugin = new PluginPair {
                Metadata = new PluginMetadata {
                    ActionKeyword = "abcd", ID = "plugin2"
                }
            };

            var nonGlobalPlugins = new Dictionary <string, PluginPair>
            {
                { "ab", firstPlugin },
                { "abcd", secondPlugin },
            };

            // Act
            var pluginQueryPairs = QueryBuilder.Build(ref searchQuery, nonGlobalPlugins);

            var firstQuery  = pluginQueryPairs.GetValueOrDefault(firstPlugin);
            var secondQuery = pluginQueryPairs.GetValueOrDefault(secondPlugin);

            // Assert
            // Using Ordinal since this is used internally
            Assert.IsTrue(firstQuery.Terms[0].Equals("cd", StringComparison.Ordinal) && firstQuery.Terms[1].Equals("efgh", StringComparison.Ordinal) && firstQuery.Terms.Count == 2);
            Assert.IsTrue(secondQuery.Terms[0].Equals("efgh", StringComparison.Ordinal) && secondQuery.Terms.Count == 1);
        }
Beispiel #17
0
        public void QueryBuildShouldGenerateSameSearchQueryWithOrWithoutSpaceAfterActionKeyword()
        {
            // Arrange
            var plugin = new PluginPair {
                Metadata = new PluginMetadata(new List <string> {
                    "a"
                })
            };
            var nonGlobalPlugins = new Dictionary <string, PluginPair>
            {
                { "a", plugin },
            };

            var firstQueryText  = "asearch";
            var secondQueryText = "a search";

            // Act
            var firstPluginQueryPair = QueryBuilder.Build(ref firstQueryText, nonGlobalPlugins);
            var firstQuery           = firstPluginQueryPair.GetValueOrDefault(plugin);

            var secondPluginQueryPairs = QueryBuilder.Build(ref secondQueryText, nonGlobalPlugins);
            var secondQuery            = secondPluginQueryPairs.GetValueOrDefault(plugin);

            // Assert
            // Using Ordinal since this is used internally
            Assert.IsTrue(firstQuery.Search.Equals(secondQuery.Search, StringComparison.Ordinal));
            Assert.IsTrue(firstQuery.ActionKeyword.Equals(secondQuery.ActionKeyword, StringComparison.Ordinal));
        }
Beispiel #18
0
        public void QueryBuildShouldGenerateCorrectQueryForPluginsWhoseActionKeywordsHaveSamePrefix()
        {
            // Arrange
            string searchQuery = "abcdefgh";
            var    firstPlugin = new PluginPair {
                Metadata = new PluginMetadata {
                    ActionKeyword = "ab", ID = "plugin1"
                }
            };
            var secondPlugin = new PluginPair {
                Metadata = new PluginMetadata {
                    ActionKeyword = "abcd", ID = "plugin2"
                }
            };

            var nonGlobalPlugins = new Dictionary <string, PluginPair>
            {
                { "ab", firstPlugin },
                { "abcd", secondPlugin },
            };

            // Act
            var pluginQueryPairs = QueryBuilder.Build(ref searchQuery, nonGlobalPlugins);

            var firstQuery  = pluginQueryPairs.GetValueOrDefault(firstPlugin);
            var secondQuery = pluginQueryPairs.GetValueOrDefault(secondPlugin);

            // Assert
            Assert.IsTrue(AreEqual(firstQuery, new Query {
                RawQuery = searchQuery, Search = searchQuery.Substring(firstPlugin.Metadata.ActionKeyword.Length), ActionKeyword = firstPlugin.Metadata.ActionKeyword
            }));
            Assert.IsTrue(AreEqual(secondQuery, new Query {
                RawQuery = searchQuery, Search = searchQuery.Substring(secondPlugin.Metadata.ActionKeyword.Length), ActionKeyword = secondPlugin.Metadata.ActionKeyword
            }));
        }
Beispiel #19
0
        public override void Dispatch(Query query)
        {
            var allSytemPlugins = Plugins.AllPlugins.Where(o => o.Metadata.PluginType == PluginType.System);

            if (UserSettingStorage.Instance.WebSearches.Exists(o => o.ActionWord == query.ActionName && o.Enabled))
            {
                //websearch mode
                allSytemPlugins = new List <PluginPair>()
                {
                    allSytemPlugins.First(o => ((ISystemPlugin)o.Plugin).ID == "565B73353DBF4806919830B9202EE3BF")
                };
            }

            foreach (PluginPair pair in allSytemPlugins)
            {
                PluginPair pair1 = pair;
                ThreadPool.QueueUserWorkItem(state =>
                {
                    List <Result> results = pair1.Plugin.Query(query);
                    results.ForEach(o => { o.AutoAjustScore = true; });

                    App.Window.PushResults(query, pair1.Metadata, results);
                });
            }
        }
Beispiel #20
0
        public void QueryBuilderShouldGenerateCorrectQueriesForPluginsWithMultipleActionKeywords()
        {
            // Arrange
            var plugin = new PluginPair {
                Metadata = new PluginMetadata(new List <string> {
                    "a", "b"
                })
            };
            var nonGlobalPlugins = new Dictionary <string, PluginPair>
            {
                { "a", plugin },
                { "b", plugin },
            };

            var firstQueryText  = "asearch";
            var secondQueryText = "bsearch";

            // Act
            var firstPluginQueryPair = QueryBuilder.Build(ref firstQueryText, nonGlobalPlugins);
            var firstQuery           = firstPluginQueryPair.GetValueOrDefault(plugin);

            var secondPluginQueryPairs = QueryBuilder.Build(ref secondQueryText, nonGlobalPlugins);
            var secondQuery            = secondPluginQueryPairs.GetValueOrDefault(plugin);

            // Assert
            Assert.IsTrue(AreEqual(firstQuery, new Query {
                ActionKeyword = "a", RawQuery = "asearch", Search = "search"
            }));
            Assert.IsTrue(AreEqual(secondQuery, new Query {
                ActionKeyword = "b", RawQuery = "bsearch", Search = "search"
            }));
        }
Beispiel #21
0
        public void QueryBuildShouldGenerateCorrectQueryForPluginsWhoseActionKeywordsHaveSamePrefix()
        {
            // Arrange
            string searchQuery = "abcdefgh";
            var    firstPlugin = new PluginPair {
                Metadata = new PluginMetadata {
                    ActionKeyword = "ab", ID = "plugin1"
                }
            };
            var secondPlugin = new PluginPair {
                Metadata = new PluginMetadata {
                    ActionKeyword = "abcd", ID = "plugin2"
                }
            };

            PluginManager.SetAllPlugins(new List <PluginPair>()
            {
                firstPlugin,
                secondPlugin,
            });

            // Act
            var pluginQueryPairs = QueryBuilder.Build(searchQuery);

            var firstQuery  = pluginQueryPairs.GetValueOrDefault(firstPlugin);
            var secondQuery = pluginQueryPairs.GetValueOrDefault(secondPlugin);

            // Assert
            Assert.IsTrue(AreEqual(firstQuery, new Query(searchQuery, firstPlugin.Metadata.ActionKeyword)));
            Assert.IsTrue(AreEqual(secondQuery, new Query(searchQuery, secondPlugin.Metadata.ActionKeyword)));
        }
Beispiel #22
0
 private static bool IsInstantQueryPlugin(PluginPair plugin)
 {
     //any plugin that takes more than 200ms for AvgQueryTime won't be treated as IInstantQuery plugin anymore.
     return(plugin.AvgQueryTime < 200 &&
            plugin.Plugin is IInstantQuery &&
            InstantQueryPlugins.Any(p => p.Metadata.ID == plugin.Metadata.ID));
 }
Beispiel #23
0
        public static List <Result> QueryForPlugin(PluginPair pair, Query query)
        {
            var results = new List <Result>();

            try
            {
                var milliseconds = Stopwatch.Normal($"Plugin.Query cost for {pair.Metadata.Name}", () =>
                {
                    results = pair.Plugin.Query(query) ?? results;
                    results.ForEach(o =>
                    {
                        o.PluginDirectory = pair.Metadata.PluginDirectory;
                        o.PluginID        = pair.Metadata.ID;
                        o.OriginQuery     = query;
                    });
                });
                pair.QueryCount  += 1;
                pair.AvgQueryTime = pair.QueryCount == 1 ? milliseconds : (pair.AvgQueryTime + milliseconds) / 2;
            }
            catch (Exception e)
            {
                throw new WoxPluginException(pair.Metadata.Name, $"QueryForPlugin failed", e);
            }
            return(results);
        }
Beispiel #24
0
        public static IEnumerable <PluginPair> CSharpPlugins(List <PluginMetadata> source)
        {
            var plugins   = new List <PluginPair>();
            var metadatas = source.Where(o => o.Language.ToUpper() == AllowedLanguage.CSharp);

            foreach (var metadata in metadatas)
            {
                var milliseconds = Stopwatch.Debug($"|PluginsLoader.CSharpPlugins|Constructor init cost for {metadata.Name}", () =>
                {
#if DEBUG
                    var assembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(metadata.ExecuteFilePath);
                    var types    = assembly.GetTypes();
                    var type     = types.First(o => o.IsClass && !o.IsAbstract && o.GetInterfaces().Contains(typeof(IPlugin)));
                    var plugin   = (IPlugin)Activator.CreateInstance(type);
#else
                    Assembly assembly;
                    try
                    {
                        assembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(metadata.ExecuteFilePath);
                    }
                    catch (Exception e)
                    {
                        Log.Exception($"|PluginsLoader.CSharpPlugins|Couldn't load assembly for {metadata.Name}", e);
                        return;
                    }
                    var types = assembly.GetTypes();
                    Type type;
                    try
                    {
                        type = types.First(o => o.IsClass && !o.IsAbstract && o.GetInterfaces().Contains(typeof(IPlugin)));
                    }
                    catch (InvalidOperationException e)
                    {
                        Log.Exception($"|PluginsLoader.CSharpPlugins|Can't find class implement IPlugin for <{metadata.Name}>", e);
                        return;
                    }
                    IPlugin plugin;
                    try
                    {
                        plugin = (IPlugin)Activator.CreateInstance(type);
                    }
                    catch (Exception e)
                    {
                        Log.Exception($"|PluginsLoader.CSharpPlugins|Can't create instance for <{metadata.Name}>", e);
                        return;
                    }
#endif
                    PluginPair pair = new PluginPair
                    {
                        Plugin   = plugin,
                        Metadata = metadata
                    };
                    plugins.Add(pair);
                });
                metadata.InitTime += milliseconds;
            }

            return(plugins);
        }
Beispiel #25
0
        /// <summary>
        /// Load and init all Wox plugins
        /// </summary>
        public static void Init(IPublicAPI api)
        {
            if (api == null)
            {
                throw new WoxFatalException("api is null");
            }

            SetupPluginDirectories();
            API = api;

            var metadatas = PluginConfig.Parse(pluginDirectories);

            AllPlugins = (new CSharpPluginLoader().LoadPlugin(metadatas)).
                         Concat(new JsonRPCPluginLoader <PythonPlugin>().LoadPlugin(metadatas));

            //load plugin i18n languages
            ResourceMerger.UpdatePluginLanguages();

            foreach (PluginPair pluginPair in AllPlugins)
            {
                PluginPair pair = pluginPair;
                ThreadPool.QueueUserWorkItem(o =>
                {
                    var milliseconds = Stopwatch.Normal($"Plugin init: {pair.Metadata.Name}", () =>
                    {
                        pair.Plugin.Init(new PluginInitContext
                        {
                            CurrentPluginMetadata = pair.Metadata,
                            Proxy = HttpProxy.Instance,
                            API   = API
                        });
                    });
                    pair.InitTime = milliseconds;
                    InternationalizationManager.Instance.UpdatePluginMetadataTranslations(pair);
                });
            }

            ThreadPool.QueueUserWorkItem(o =>
            {
                InstantQueryPlugins = GetPluginsForInterface <IInstantQuery>();
                contextMenuPlugins  = GetPluginsForInterface <IContextMenu>();
                foreach (var plugin in AllPlugins)
                {
                    if (IsGlobalPlugin(plugin.Metadata))
                    {
                        GlobalPlugins.Add(plugin);
                    }
                    else
                    {
                        foreach (string actionKeyword in plugin.Metadata.ActionKeywords)
                        {
                            NonGlobalPlugins[actionKeyword] = plugin;
                        }
                    }
                }
            });
        }
Beispiel #26
0
        public static void UpdateActionKeywordForPlugin(PluginPair plugin, string oldActionKeyword, string newActionKeyword)
        {
            var actionKeywords = plugin.Metadata.ActionKeywords;

            if (string.IsNullOrEmpty(newActionKeyword))
            {
                string msg = InternationalizationManager.Instance.GetTranslation("newActionKeywordsCannotBeEmpty");
                throw new WoxPluginException(plugin.Metadata.Name, msg);
            }
            // do nothing if they are same
            if (oldActionKeyword == newActionKeyword)
            {
                return;
            }
            if (NonGlobalPlugins.ContainsKey(newActionKeyword))
            {
                string msg = InternationalizationManager.Instance.GetTranslation("newActionKeywordsHasBeenAssigned");
                throw new WoxPluginException(plugin.Metadata.Name, msg);
            }

            // add new action keyword
            if (string.IsNullOrEmpty(oldActionKeyword))
            {
                actionKeywords.Add(newActionKeyword);
                if (newActionKeyword == Query.GlobalPluginWildcardSign)
                {
                    GlobalPlugins.Add(plugin);
                }
                else
                {
                    NonGlobalPlugins[newActionKeyword] = plugin;
                }
            }
            // update existing action keyword
            else
            {
                int index = actionKeywords.IndexOf(oldActionKeyword);
                actionKeywords[index] = newActionKeyword;
                if (oldActionKeyword == Query.GlobalPluginWildcardSign)
                {
                    GlobalPlugins.Remove(plugin);
                }
                else
                {
                    NonGlobalPlugins.Remove(oldActionKeyword);
                }
                if (newActionKeyword == Query.GlobalPluginWildcardSign)
                {
                    GlobalPlugins.Add(plugin);
                }
                else
                {
                    NonGlobalPlugins[newActionKeyword] = plugin;
                }
            }
        }
Beispiel #27
0
 public ActionKeywords(string pluginId)
 {
     InitializeComponent();
     _plugin = PluginManager.GetPluginForId(pluginId);
     if (_plugin == null)
     {
         MessageBox.Show(InternationalizationManager.Instance.GetTranslation("cannotFindSpecifiedPlugin"));
         Close();
     }
 }
Beispiel #28
0
 public ActionKeywords(string pluginId, Settings settings)
 {
     InitializeComponent();
     _plugin   = PluginManager.GetPluginForId(pluginId);
     _settings = settings;
     if (_plugin == null)
     {
         MessageBox.Show(_translator.GetTranslation("cannotFindSpecifiedPlugin"));
         Close();
     }
 }
Beispiel #29
0
        public static IEnumerable <PluginPair> CSharpPlugins(List <PluginMetadata> source)
        {
            var plugins   = new List <PluginPair>();
            var metadatas = source.Where(o => o.Language.ToUpper() == AllowedLanguage.CSharp);

            foreach (var metadata in metadatas)
            {
#if DEBUG
                var assembly = Assembly.Load(AssemblyName.GetAssemblyName(metadata.ExecuteFilePath));
                var types    = assembly.GetTypes();
                var type     = types.First(o => o.IsClass && !o.IsAbstract && o.GetInterfaces().Contains(typeof(IPlugin)));
                var plugin   = (IPlugin)Activator.CreateInstance(type);
#else
                Assembly assembly;
                try
                {
                    assembly = Assembly.Load(AssemblyName.GetAssemblyName(metadata.ExecuteFilePath));
                }
                catch (Exception e)
                {
                    Log.Exception(new WoxPluginException(metadata.Name, "Couldn't load assembly", e));
                    continue;
                }
                var  types = assembly.GetTypes();
                Type type;
                try
                {
                    type = types.First(o => o.IsClass && !o.IsAbstract && o.GetInterfaces().Contains(typeof(IPlugin)));
                }
                catch (InvalidOperationException e)
                {
                    Log.Exception(new WoxPluginException(metadata.Name, "Can't find class implement IPlugin", e));
                    continue;
                }
                IPlugin plugin;
                try
                {
                    plugin = (IPlugin)Activator.CreateInstance(type);
                }
                catch (Exception e)
                {
                    Log.Exception(new WoxPluginException(metadata.Name, "Can't create instance", e));
                    continue;
                }
#endif
                PluginPair pair = new PluginPair
                {
                    Plugin   = plugin,
                    Metadata = metadata
                };
                plugins.Add(pair);
            }
            return(plugins);
        }
 public PriorityChangeWindow(string pluginId, Settings settings, PluginViewModel pluginViewModel)
 {
     InitializeComponent();
     plugin               = PluginManager.GetPluginForId(pluginId);
     this.settings        = settings;
     this.pluginViewModel = pluginViewModel;
     if (plugin == null)
     {
         MessageBox.Show(translater.GetTranslation("cannotFindSpecifiedPlugin"));
         Close();
     }
 }