Exemplo n.º 1
0
 public void AddRule(IRule r)
 {
     m_rules.Add(r);
 }
Exemplo n.º 2
0
        public void LoadRules(TextReader rules)
        {
            using (JsonTextReader reader = new JsonTextReader(rules))
            {
                JObject jsonObject = JObject.Load(reader);
                JToken  parseToken;

                // Read the version string
                if (jsonObject.TryGetValue("Version", out parseToken) == true)
                {
                    m_ruleVersion = parseToken.ToString();
                }

                // Parse the rules from the data
                if (jsonObject.TryGetValue("Rules", out parseToken) == true)
                {
                    var ruleParameters = parseToken as JArray;

                    // Loop over each rule in the array
                    foreach (var ruleDef in ruleParameters)
                    {
                        var ruleName = ruleDef["Type"].ToString();
                        // Using C# reflection look up the rule's type
                        // This way we can just make the rules and not worry about adding it to the RuleEngine
                        // This does require that rules are named in this format: {RuleName}Rule. ie- CallFrequency/Rule/.
                        Type ruleType = Type.GetType("XboxLiveTrace." + ruleName + "Rule");

                        // If the rule isn't a built in rule, check for a custom rule.
                        if (ruleType == null)
                        {
                            var assemblies = AppDomain.CurrentDomain.GetAssemblies();

                            foreach (var assembly in assemblies.Where(a => a.GlobalAssemblyCache == false))
                            {
                                foreach (var type in assembly.GetTypes().Where(t => typeof(IRule).IsAssignableFrom(t)))
                                {
                                    if (type.Name.EndsWith(ruleName))
                                    {
                                        ruleType = type;
                                        break;
                                    }
                                }

                                if (ruleType != null)
                                {
                                    break;
                                }
                            }
                        }

                        // Make sure the type was value
                        if (ruleDef["Type"] != null && ruleType != null)
                        {
                            // Create the rule and cast to Rule
                            IRule rule = Activator.CreateInstance(ruleType) as IRule;

                            // Fill in the data
                            if (ruleDef["Name"] != null)
                            {
                                rule.Name = ruleDef["Name"].ToString();
                            }
                            if (ruleDef["Endpoint"] != null)
                            {
                                rule.Endpoint = ruleDef["Endpoint"].ToString();
                            }
                            if (ruleDef["Properties"] != null)
                            {
                                rule.DeserializeJson(ruleDef["Properties"] as JObject);
                            }

                            m_rules.Add(rule);
                        }
                        else
                        {
                            throw new Exception("Invalid rule type " + ruleDef["Name"] + " in rule definition file.");
                        }
                    }
                }
            }
        }