Ejemplo n.º 1
0
        public string[] TransformModel(string xmlFilePath)
        {
            var xmlFile = FileSystem.ResolveFile(xmlFilePath);

            if (!xmlFile.Exists())
            {
                throw new FileNotFoundException(xmlFilePath);
            }
            var basePath = Path.GetDirectoryName(xmlFile.Name);

            TextReader inputXmlContent = null;

            using (var fsInputStream = xmlFile.Content.GetStream(FileAccess.Read)) {
                var vfsResolver = new VfsXmlResolver(FileSystem, basePath);
                var xmlRdr      = XmlReader.Create(
                    new StreamReader(fsInputStream), null,
                    new XmlParserContext(null, null, null, XmlSpace.Default)
                {
                    BaseURI = vfsResolver.AbsoluteBaseUri.ToString()
                });

                var xIncludingXmlRdr = new Mvp.Xml.XInclude.XIncludingReader(xmlRdr);
                xIncludingXmlRdr.XmlResolver = vfsResolver;

                var xPathDoc = new XPathDocument(xIncludingXmlRdr);
                var nav      = xPathDoc.CreateNavigator();
                inputXmlContent = new StringReader(nav.OuterXml);
            }

            return(TransformModel(inputXmlContent, basePath, Path.GetFileNameWithoutExtension(xmlFile.Name)));
        }
Ejemplo n.º 2
0
        public string Provide(Context ruleContext)
        {
            if (String.IsNullOrEmpty(ruleContext.Xml))
            {
                throw new Exception("xml missed");
            }
            if (String.IsNullOrEmpty(ruleContext.Xsl))
            {
                throw new Exception("xsl missed");
            }

            var xslTransformer = GetTransformer(ruleContext);

            StringWriter resWriter = new StringWriter();

            Mvp.Xml.XInclude.XIncludingReader xmlIncludeContentRdr = new Mvp.Xml.XInclude.XIncludingReader(new StringReader(ruleContext.Xml));
            xmlIncludeContentRdr.XmlResolver = new FileManagerXmlResolver(ruleContext.FileManager, ruleContext.XmlBasePath);
            // !!! Note: XIncludingReader has bug: when used directly with XslTransform (incorrect transformation occurs).
            XPathDocument xmlXPathDoc = new XPathDocument(xmlIncludeContentRdr);

            if (ruleContext.XmlSelectXPath != null)
            {
                if (log.IsEnabledFor(LogEvent.Debug))
                {
                    log.Write(LogEvent.Debug,
                              new{ Action = "select from XML", XmlSelectXPath = ruleContext.XmlSelectXPath });
                }
                try {
                    string selectedXmlContent = xmlXPathDoc.CreateNavigator().SelectSingleNode(ruleContext.XmlSelectXPath).OuterXml;
                    xmlXPathDoc = new XPathDocument(new StringReader(selectedXmlContent));
                } catch (Exception ex) {
                    log.Write(LogEvent.Error,
                              new{ Action = "select from XML", Exception = ex, XPath = ruleContext.XmlSelectXPath });
                    throw new Exception("Cannot select XML (XPath=" + ruleContext.XmlSelectXPath + "):" + ex.Message, ex);
                }
            }
            else
            {
                string allXmlContent = xmlXPathDoc.CreateNavigator().OuterXml;
                xmlXPathDoc = new XPathDocument(new StringReader(allXmlContent));
            }

            //xslTransformer.Transform(new XmlTextReader(new StringReader(xmlContent)), new XmlTextWriter(resWriter));
            xslTransformer.Transform(xmlXPathDoc, null,
                                     new XmlTextWriter(resWriter)
            {
                Formatting  = Formatting.Indented,
                IndentChar  = '\t',
                Indentation = 1
            });

            string resContent = resWriter.ToString();

            return(resContent);
        }
Ejemplo n.º 3
0
        internal protected void Read()
        {
            XmlSchemaSet      schemaSet;
            XmlSchema         schema;
            XmlReaderSettings xmlReaderSettings;

            schemaSet = new XmlSchemaSet(_nametable);

            schema = ResourceManager.GetXmlSchema("XInclude");
            schemaSet.Add(schema);
            schema = ResourceManager.GetXmlSchema(SCHEMA_NAME);
            schemaSet.Add(schema);


            xmlReaderSettings                         = new XmlReaderSettings();
            xmlReaderSettings.CloseInput              = false;
            xmlReaderSettings.ConformanceLevel        = ConformanceLevel.Document;
            xmlReaderSettings.IgnoreComments          = true;
            xmlReaderSettings.IgnoreWhitespace        = true;
            xmlReaderSettings.Schemas                 = schemaSet;
            xmlReaderSettings.ValidationFlags         = XmlSchemaValidationFlags.ReportValidationWarnings | XmlSchemaValidationFlags.AllowXmlAttributes | XmlSchemaValidationFlags.ProcessIdentityConstraints;
            xmlReaderSettings.ValidationType          = ValidationType.Schema;
            xmlReaderSettings.ValidationEventHandler += xmlReaderSettings_ValidationEventHandler;

            XmlDocument xml;

            xml = new XmlDocument(_nametable);

            _validationResult.Clear();

            XmlDocument tDoc = new XmlDocument();

            using (Mvp.Xml.XInclude.XIncludingReader rdr = new Mvp.Xml.XInclude.XIncludingReader(_reader))
            {
                rdr.XmlResolver = _xmlResolver;
                tDoc.Load(rdr);
            }
            using (MemoryStream ms = new MemoryStream())
            {
                using (XmlWriter wr = XmlWriter.Create(ms))
                {
                    tDoc.WriteTo(wr);
                }
                ms.Position = 0;
                using (XmlReader rdr = XmlReader.Create(ms, xmlReaderSettings))
                {
                    xml.Load(rdr);
                }
            }

            if (_validationResult.Count == 0)
            {
                _ormXmlDocument = xml;
            }
        }
Ejemplo n.º 4
0
        public object Create(object parent, object configContext, XmlNode section)
        {
            try {
                string componentsXml;
                if (section.Name == "components")
                {
                    componentsXml = section.OuterXml;
                }
                else
                {
                    StringBuilder tmpsb = new StringBuilder();
                    tmpsb.Append("<components>");
                    tmpsb.Append(section.InnerXml);
                    tmpsb.Append("</components>");
                    componentsXml = tmpsb.ToString();
                }

                string rootDir = GetAppBasePath();
                if (section.Attributes["includebasepath"] != null)
                {
                    var explicitBase = section.Attributes["includebasepath"].Value;
                    rootDir = Path.IsPathRooted(explicitBase) ? explicitBase : Path.Combine(rootDir, explicitBase);
                }

                var xmlRdr = XmlReader.Create(new StringReader(componentsXml), null,
                                              new XmlParserContext(null, null, null, XmlSpace.Default)
                {
                    BaseURI = rootDir
                });
                Mvp.Xml.XInclude.XIncludingReader xmlContentRdr = new Mvp.Xml.XInclude.XIncludingReader(xmlRdr);
                LocalFileManager fileManager = new LocalFileManager(rootDir);
                xmlContentRdr.XmlResolver = new FileManagerXmlResolver(fileManager, "./");
                XPathDocument xmlXPathDoc = new XPathDocument(xmlContentRdr);

                IModifyXmlDocumentHandler preprocessor = GetPreprocessor(section.Name, fileManager);

                XmlComponentsConfig config = new XmlComponentsConfig(
                    xmlXPathDoc.CreateNavigator().OuterXml, preprocessor);
                return(config);
            } catch (Exception ex) {
                throw new ConfigurationException(ex.Message, ex);
            }
        }
Ejemplo n.º 5
0
        public virtual object Create(object parent, object input, XmlNode section)
        {
            try {
                log.Write(LogEvent.Info, "Loading application configuration");

                var appBasePath = GetAppBasePath();
                var appFs       = new LocalFileSystem(appBasePath);

                var sourceFileNames = new List <string>();
                appFs.Open += (sender, args) => {
                    var fullFileName = Path.GetFullPath(Path.Combine(appBasePath, args.File.Name).Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar));
                    if (!sourceFileNames.Contains(fullFileName))
                    {
                        sourceFileNames.Add(fullFileName);
                    }
                };

                var vfsResolver = new NI.Vfs.VfsXmlResolver(appFs, "./");
                var xmlRdr      = XmlReader.Create(new StringReader(section.InnerXml), null,
                                                   new XmlParserContext(null, null, null, XmlSpace.Default)
                {
                    BaseURI = vfsResolver.AbsoluteBaseUri.ToString()
                });

                var xIncludingXmlRdr = new Mvp.Xml.XInclude.XIncludingReader(xmlRdr);
                xIncludingXmlRdr.XmlResolver = vfsResolver;

                // workaround for strange bug that prevents XPathNavigator to Select nodes with XIncludingReader
                var xPathDoc         = new XPathDocument(xIncludingXmlRdr);
                var fullConfigXmlRdr = XmlReader.Create(new StringReader(xPathDoc.CreateNavigator().OuterXml));

                var config = new NReco.Application.Ioc.XmlComponentConfiguration(fullConfigXmlRdr);
                config.SourceFileNames = sourceFileNames.ToArray();
                return(config);
            } catch (Exception ex) {
                throw new ConfigurationException(ex.Message, ex);
            }
        }
        public object Create(object parent, object configContext, XmlNode section)
        {
            try {
                string componentsXml;
                if (section.Name=="components") {
                    componentsXml = section.OuterXml;
                } else {
                    StringBuilder tmpsb = new StringBuilder();
                    tmpsb.Append("<components>");
                    tmpsb.Append(section.InnerXml);
                    tmpsb.Append("</components>");
                    componentsXml = tmpsb.ToString();
                }

                string rootDir = GetAppBasePath();
                if (section.Attributes["includebasepath"] != null) {
                    var explicitBase = section.Attributes["includebasepath"].Value;
                    rootDir = Path.IsPathRooted(explicitBase) ? explicitBase : Path.Combine(rootDir, explicitBase);
                }

                var xmlRdr = XmlReader.Create(new StringReader(componentsXml), null,
                        new XmlParserContext(null, null, null, XmlSpace.Default) { BaseURI = rootDir });
                Mvp.Xml.XInclude.XIncludingReader xmlContentRdr = new Mvp.Xml.XInclude.XIncludingReader(xmlRdr);
                LocalFileManager fileManager = new LocalFileManager(rootDir);
                xmlContentRdr.XmlResolver = new FileManagerXmlResolver(fileManager,"./");
                XPathDocument xmlXPathDoc = new XPathDocument(xmlContentRdr);

                IModifyXmlDocumentHandler preprocessor = GetPreprocessor(section.Name, fileManager);

                XmlComponentsConfig config = new XmlComponentsConfig(
                    xmlXPathDoc.CreateNavigator().OuterXml, preprocessor);
                return config;
            } catch (Exception ex) {
                throw new ConfigurationException(ex.Message, ex);
            }
        }
Ejemplo n.º 7
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]);
            }
        }