< Summary

Class:DCL.PluginSystem
Assembly:PluginSystem
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/PluginSystem/PluginSystem.cs
Covered lines:43
Uncovered lines:19
Coverable lines:62
Total lines:192
Line coverage:69.3% (43 of 62)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
PluginSystem()0%110100%
PluginSystem()0%110100%
IsEnabled(...)0%2.152066.67%
RegisterWithFlag(...)0%110100%
Register(...)0%220100%
Unregister(...)0%6200%
BindFlag(...)0%220100%
SetFlag(...)0%2.52050%
EnableFlag(...)0%330100%
DisableFlag(...)0%12300%
SetFeatureFlagsData(...)0%2.022083.33%
OnFeatureFlagsChange(...)0%220100%
Dispose()0%330100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/PluginSystem/PluginSystem.cs

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3using UnityEngine;
 4using UnityEngine.Assertions;
 5
 6namespace DCL
 7{
 8    public delegate IPlugin PluginBuilder();
 9
 10    /// <summary>
 11    /// This class implements a plugin system pattern.
 12    ///
 13    /// - Many plugins can share the same feature flag
 14    /// - Plugins are registered by using a PluginBuilder delegate that must create and return the plugin instance.
 15    /// - Any active plugin is an instantiated plugin. A disabled plugin is a never created or disposed plugin.
 16    /// - No Initialize() pattern. Plugins abide to RAII idiom.
 17    /// - Feature flags can be set automatically by using SetFeatureFlagsData.
 18    /// </summary>
 19    public class PluginSystem : IDisposable
 20    {
 121        private static ILogger logger = new Logger(Debug.unityLogger);
 722        private PluginGroup allPlugins = new PluginGroup();
 723        private Dictionary<string, PluginGroup> pluginGroupByFlag = new Dictionary<string, PluginGroup>();
 24        private BaseVariable<FeatureFlag> featureFlagsDataSource;
 25
 26        /// <summary>
 27        /// Returns true if the plugin defined by the PluginBuilder delegate is currently enabled.
 28        ///
 29        /// An enabled plugin is an instantiated and currently active plugin.
 30        /// </summary>
 31        /// <param name="pluginBuilder">The PluginBuilder delegate instance used to instance this plugin.</param>
 32        /// <returns>True if the plugin defined by the PluginBuilder delegate is currently enabled</returns>
 33        public bool IsEnabled(PluginBuilder pluginBuilder)
 34        {
 1435            if (!allPlugins.plugins.ContainsKey(pluginBuilder))
 036                return false;
 37
 1438            return allPlugins.plugins[pluginBuilder].isEnabled;
 39        }
 40
 41        /// <summary>
 42        /// Registers a plugin builder and binds it to a feature flag.
 43        /// </summary>
 44        /// <param name="pluginBuilder">The builder used to construct the plugin.</param>
 45        /// <param name="featureFlag">The flag to be bounded. When this flag is true, the plugin will be created.</param
 46        public void RegisterWithFlag(PluginBuilder pluginBuilder, string featureFlag)
 47        {
 848            Register(pluginBuilder, false);
 849            BindFlag(pluginBuilder, featureFlag);
 850        }
 51
 52        /// <summary>
 53        /// Registers a new plugin to be built by the PluginBuilder delegate.
 54        /// </summary>
 55        /// <param name="pluginBuilder">The pluginBuilder instance. This instance will create the plugin when enabled.</
 56        /// <param name="enable">If true, the plugin will be constructed as soon as this method is called.</param>
 57        public void Register(PluginBuilder pluginBuilder, bool enable = true)
 58        {
 959            Assert.IsNotNull(pluginBuilder);
 60
 961            PluginInfo pluginInfo = new PluginInfo() { builder = pluginBuilder };
 962            allPlugins.Add(pluginBuilder, pluginInfo);
 63
 964            if (enable)
 165                pluginInfo.Enable();
 966        }
 67
 68        /// <summary>
 69        /// Unregisters a registered plugin. If the plugin was active, it will be disposed.
 70        /// </summary>
 71        /// <param name="plugin">The plugin builder instance used to register the plugin.</param>
 72        public void Unregister(PluginBuilder plugin)
 73        {
 074            if ( !allPlugins.plugins.ContainsKey(plugin))
 075                return;
 76
 077            PluginInfo info = allPlugins.plugins[plugin];
 078            info.Disable();
 79
 080            string flag = info.flag;
 81
 082            allPlugins.Remove(plugin);
 083            pluginGroupByFlag[flag].Remove(plugin);
 084        }
 85
 86        /// <summary>
 87        /// Bind a feature flag to the given plugin builder.
 88        /// When the given feature flag is set to true, this class will construct the plugin, initializing it.
 89        /// </summary>
 90        /// <param name="plugin">The given plugin builder.</param>
 91        /// <param name="featureFlag">The given feature flag. If this feature flag is set to true the plugin will be cre
 92        public void BindFlag(PluginBuilder plugin, string featureFlag)
 93        {
 894            Assert.IsNotNull(plugin);
 95
 896            if ( !pluginGroupByFlag.ContainsKey(featureFlag) )
 497                pluginGroupByFlag.Add(featureFlag, new PluginGroup());
 98
 899            pluginGroupByFlag[featureFlag].Add(plugin, allPlugins.plugins[plugin]);
 8100        }
 101
 102        /// <summary>
 103        /// Sets a feature flag. Disabling or enabling any plugin that was bounded to it.
 104        /// </summary>
 105        /// <param name="featureFlag">The given feature flag to set.</param>
 106        /// <param name="enabled">The feature flag is enabled?</param>
 107        public void SetFlag(string featureFlag, bool enabled)
 108        {
 5109            if (enabled)
 5110                EnableFlag(featureFlag);
 111            else
 0112                DisableFlag(featureFlag);
 0113        }
 114
 115        /// <summary>
 116        /// Enables a given feature flag. This enables any plugin that was bounded to it.
 117        /// Enabling a plugin means that the plugin instance will be created.
 118        /// </summary>
 119        /// <param name="featureFlag">The feature flag to enable</param>
 120        public void EnableFlag(string featureFlag)
 121        {
 5122            if ( !pluginGroupByFlag.ContainsKey(featureFlag) )
 1123                return;
 124
 4125            PluginGroup pluginGroup = pluginGroupByFlag[featureFlag];
 126
 24127            foreach ( var feature in pluginGroup.plugins )
 128            {
 8129                PluginInfo info = feature.Value;
 8130                info.Enable();
 131            }
 4132        }
 133
 134        /// <summary>
 135        /// Disables a given feature flag. This disables any plugin that was bounded to it.
 136        /// Disabling a plugin means that the plugin instance will be disposed.
 137        /// </summary>
 138        /// <param name="featureFlag">The feature flag to enable</param>
 139        public void DisableFlag(string featureFlag)
 140        {
 0141            if ( !pluginGroupByFlag.ContainsKey(featureFlag) )
 0142                return;
 143
 0144            PluginGroup pluginGroup = pluginGroupByFlag[featureFlag];
 145
 0146            foreach ( var feature in pluginGroup.plugins )
 147            {
 0148                PluginInfo info = feature.Value;
 0149                info.Disable();
 150            }
 0151        }
 152
 153        /// <summary>
 154        /// Sets the FeatureFlag instance used to listen for feature flag changes.
 155        ///
 156        /// After setting the feature flags data of the given instance, the PluginSystem
 157        /// will react to all the feature flag changes.
 158        /// </summary>
 159        /// <param name="featureFlagsBaseVariable">The data object to listen to.</param>
 160        public void SetFeatureFlagsData(BaseVariable<FeatureFlag> featureFlagsBaseVariable)
 161        {
 4162            if ( featureFlagsDataSource != null )
 0163                featureFlagsDataSource.OnChange -= OnFeatureFlagsChange;
 164
 4165            featureFlagsDataSource = featureFlagsBaseVariable;
 4166            featureFlagsDataSource.OnChange += OnFeatureFlagsChange;
 4167            OnFeatureFlagsChange(featureFlagsBaseVariable.Get(), featureFlagsBaseVariable.Get());
 4168        }
 169
 170        private void OnFeatureFlagsChange(FeatureFlag current, FeatureFlag previous)
 171        {
 6172            Assert.IsNotNull(current, "Current feature flags object should never be null!");
 173
 22174            foreach ( var flag in current.flags )
 175            {
 5176                SetFlag(flag.Key, flag.Value);
 177            }
 6178        }
 179
 180        public void Dispose()
 181        {
 32182            foreach ( var kvp in allPlugins.plugins )
 183            {
 9184                PluginInfo info = kvp.Value;
 9185                info.Disable();
 186            }
 187
 7188            if ( featureFlagsDataSource != null )
 4189                featureFlagsDataSource.OnChange -= OnFeatureFlagsChange;
 7190        }
 191    }
 192}