예제 #1
0
        public void RemoveItemFromFileTest()
        {
            CreateTestDirectoryAndFiles();
            string test_text = "<text-remove file=\"test3.result.xml\" regex=\"bbb\"></text-remove>";

            string xmlContent = "<test><t2>bbb</t2></test>";

            ModifyTextFileRule modifyTextFileRule = new ModifyTextFileRule();
            IFileManager       fileManager        = new LocalFileManager(TestDiretoryPath);

            using (FileStream fs = File.Create(TestFilePath))
            {
                AddText(fs, test_text);
                fs.Flush();
                fs.Close();
            }
            using (FileStream fs = File.Create(TestXmlFilePath))
            {
                AddText(fs, xmlContent);
                fs.Flush();
                fs.Close();
            }
            XPathDocument  ruleXPathDoc = new XPathDocument(new StringReader(test_text));
            XPathNavigator ruleFileNav  = ruleXPathDoc.CreateNavigator().SelectSingleNode("/*");

            FileRuleContext fileRuleContext = new FileRuleContext(TestFilePath, fileManager, ruleFileNav);

            modifyTextFileRule.Execute(fileRuleContext);

            Assert.AreEqual(false, File.ReadAllText(TestXmlFilePath).Contains("bbb"));
        }
예제 #2
0
        public void InsertTextFileTest()
        {
            CreateTestDirectoryAndFiles();

            string insertNode = "test1";
            string test_text  = "<text-insert file=\"test3.result.xml\" start=\"&lt;test&gt;\"><" + insertNode + "/></text-insert>";

            string xmlContent = "<test><t2>bbb</t2></test>";

            ModifyTextFileRule modifyTextFileRule = new ModifyTextFileRule();
            IFileManager       fileManager        = new LocalFileManager(TestDiretoryPath);

            using (FileStream fs = File.Create(TestFilePath))
            {
                AddText(fs, test_text);
                fs.Flush();
                fs.Close();
            }
            using (FileStream fs = File.Create(TestXmlFilePath))
            {
                AddText(fs, xmlContent);
                fs.Flush();
                fs.Close();
            }

            XPathDocument  ruleXPathDoc = new XPathDocument(new StringReader(test_text));
            XPathNavigator ruleFileNav  = ruleXPathDoc.CreateNavigator().SelectSingleNode("/*");

            Console.WriteLine(ruleFileNav.LocalName);

            bool isMatched = modifyTextFileRule.IsMatch(ruleFileNav);

            Assert.AreEqual(true, isMatched);

            FileRuleContext fileRuleContext = new FileRuleContext(TestFilePath, fileManager, ruleFileNav);

            modifyTextFileRule.Execute(fileRuleContext);
            Assert.AreEqual(true, File.ReadAllText(TestXmlFilePath).Contains(insertNode));

            Assert.AreEqual(true, IsNodeInXmlFile(TestXmlFilePath, insertNode));
            DeleteTestDirectoryAndFiles();
        }
예제 #3
0
        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]);
            }
        }