public void OnRuleExecuting(object sender, FileRuleEventArgs e) { if (RuleDependencies.ContainsKey(e.RuleFileName)) { // because one file may contain more than one rule, lets just accumulate all deps //RuleDependencies[e.RuleFileName].Clear(); } else { RuleDependencies[e.RuleFileName] = new RuleDepInfo(); RuleDependencies[e.RuleFileName].Uses.Add(e.RuleFileName); } CurrentRule = e; }
public void OnRuleExecuted(object sender, FileRuleEventArgs e) { CurrentRule = null; }
public void ExecuteForFiles(string[] files) { var matchRuleFileNameRegex = new Regex(RuleFileNameRegexPattern, RegexOptions.Compiled | RegexOptions.Singleline); // sort files - processing order is defined Array.Sort <string>(files); IList <string> executionPlan = new List <string>(); // build execution plan foreach (string filePath in files) { string fName = Path.GetFileName(filePath); if (fName.Length > 0 && matchRuleFileNameRegex.IsMatch(fName)) { executionPlan.Add(Path.GetFullPath(filePath)); } } log.Write(LogEvent.Info, "Found {0} rule file(s)", executionPlan.Count); // stats IDictionary <IFileRule, int> counters = new Dictionary <IFileRule, int>(); foreach (var rule in Rules) { counters[rule] = 0; } // execute in exact order foreach (string ruleFile in executionPlan) { string fileContent = FileManager.Read(ruleFile); log.Write(LogEvent.Info, "Processing rule file: {0}", ruleFile); var ruleFileReadArgs = new FileRuleEventArgs(ruleFile, null); // raise event if (RuleFileReadStart != null) { RuleFileReadStart(this, ruleFileReadArgs); } Mvp.Xml.XInclude.XIncludingReader xmlIncludeContentRdr = new Mvp.Xml.XInclude.XIncludingReader(new StringReader(fileContent)); xmlIncludeContentRdr.XmlResolver = new FileManagerXmlResolver(FileManager, Path.GetDirectoryName(ruleFile)); XPathDocument ruleXPathDoc = new XPathDocument(xmlIncludeContentRdr); XPathNavigator ruleFileNav = ruleXPathDoc.CreateNavigator(); XPathNodeIterator ruleNavs = ruleFileNav.SelectSingleNode("rules") != null? ruleFileNav.Select("rules/*") : ruleFileNav.Select("*"); // raise event if (RuleFileReadEnd != null) { RuleFileReadEnd(this, ruleFileReadArgs); } foreach (XPathNavigator ruleNav in ruleNavs) { for (int i = 0; i < Rules.Length; i++) { if (Rules[i].IsMatch(ruleNav)) { var r = Rules[i]; // for now its hardcoded rule that handles XslTransformRule caching issue if (r is XslTransformFileRule) { ((XslTransformFileRule)r).TransformRule.CacheEnabled = false; } var ruleContext = new FileRuleContext(ruleFile, FileManager, ruleNav); if (RuleExecuting != null) { RuleExecuting(this, new FileRuleEventArgs(ruleFile, r)); } try { Rules[i].Execute(ruleContext); } catch (Exception ex) { throw new Exception(String.Format("Rule processing failed: {0} ({1})", ex.Message, ruleContext), ex); } if (RuleExecuted != null) { RuleExecuted(this, new FileRuleEventArgs(ruleFile, r)); } counters[Rules[i]]++; } } } } foreach (var rule in Rules) { log.Write(LogEvent.Info, "Applied {0} for {1} file(s)", rule, counters[rule]); } }
public void ExecuteForFiles(string[] files) { var matchRuleFileNameRegex = new Regex(RuleFileNameRegexPattern, RegexOptions.Compiled | RegexOptions.Singleline); // sort files - processing order is defined Array.Sort<string>(files); IList<string> executionPlan = new List<string>(); // build execution plan foreach (string filePath in files) { string fName = Path.GetFileName(filePath); if (fName.Length > 0 && matchRuleFileNameRegex.IsMatch(fName) ) { executionPlan.Add(Path.GetFullPath(filePath)); } } log.Write(LogEvent.Info, "Found {0} rule file(s)", executionPlan.Count); // stats IDictionary<IFileRule, int> counters = new Dictionary<IFileRule, int>(); foreach (var rule in Rules) counters[rule] = 0; // execute in exact order foreach (string ruleFile in executionPlan) { string fileContent = FileManager.Read(ruleFile); log.Write(LogEvent.Info, "Processing rule file: {0}", ruleFile); var ruleFileReadArgs = new FileRuleEventArgs(ruleFile, null); // raise event if (RuleFileReadStart != null) RuleFileReadStart(this, ruleFileReadArgs); Mvp.Xml.XInclude.XIncludingReader xmlIncludeContentRdr = new Mvp.Xml.XInclude.XIncludingReader(new StringReader(fileContent)); xmlIncludeContentRdr.XmlResolver = new FileManagerXmlResolver(FileManager, Path.GetDirectoryName(ruleFile)); XPathDocument ruleXPathDoc = new XPathDocument(xmlIncludeContentRdr); XPathNavigator ruleFileNav = ruleXPathDoc.CreateNavigator(); XPathNodeIterator ruleNavs = ruleFileNav.SelectSingleNode("rules")!=null ? ruleFileNav.Select("rules/*") : ruleFileNav.Select("*"); // raise event if (RuleFileReadEnd != null) RuleFileReadEnd(this, ruleFileReadArgs); foreach (XPathNavigator ruleNav in ruleNavs) { for (int i = 0; i < Rules.Length; i++) if (Rules[i].IsMatch(ruleNav)) { var r = Rules[i]; // for now its hardcoded rule that handles XslTransformRule caching issue if (r is XslTransformFileRule) ((XslTransformFileRule)r).TransformRule.CacheEnabled = false; var ruleContext = new FileRuleContext(ruleFile, FileManager, ruleNav); if (RuleExecuting != null) RuleExecuting(this, new FileRuleEventArgs(ruleFile, r)); try { Rules[i].Execute(ruleContext); } catch (Exception ex) { throw new Exception(String.Format("Rule processing failed: {0} ({1})", ex.Message, ruleContext), ex); } if (RuleExecuted != null) RuleExecuted(this, new FileRuleEventArgs(ruleFile, r)); counters[Rules[i]]++; } } } foreach (var rule in Rules) { log.Write(LogEvent.Info, "Applied {0} for {1} file(s)", rule, counters[rule]); } }