From a2baaa0997a43a20091515cde6ae13d089a83115 Mon Sep 17 00:00:00 2001 From: Dale Ragan Date: Mon, 7 Jun 2010 23:26:57 -0400 Subject: [PATCH] Changes to make the SpecFlow.exe tool work properly. The changes should work in .NET also, but these will need to be tested to be sure. One of the major changes was to remove the reflection code that was tranforming the CompiledXslTransform and use one of the public facing methods instead. The other major change was in XmlResourceResolver.cs. Needed to add code to resolve assembly names correctly and also resolve resource URI's. --- .../NUnitExecutionReport.xslt | 2 +- .../StepDefinitionReport.xslt | 2 +- Reporting/XmlResourceResolver.cs | 58 +++++++++++++++++-- Reporting/XsltHelper.cs | 28 ++------- 4 files changed, 60 insertions(+), 30 deletions(-) diff --git a/Reporting/NUnitExecutionReport/NUnitExecutionReport.xslt b/Reporting/NUnitExecutionReport/NUnitExecutionReport.xslt index 2f44b0876..4ccd43b13 100644 --- a/Reporting/NUnitExecutionReport/NUnitExecutionReport.xslt +++ b/Reporting/NUnitExecutionReport/NUnitExecutionReport.xslt @@ -8,7 +8,7 @@ exclude-result-prefixes="msxsl"> - + diff --git a/Reporting/StepDefinitionReport/StepDefinitionReport.xslt b/Reporting/StepDefinitionReport/StepDefinitionReport.xslt index 45435beca..8349c35c5 100644 --- a/Reporting/StepDefinitionReport/StepDefinitionReport.xslt +++ b/Reporting/StepDefinitionReport/StepDefinitionReport.xslt @@ -7,7 +7,7 @@ exclude-result-prefixes="msxsl"> - + diff --git a/Reporting/XmlResourceResolver.cs b/Reporting/XmlResourceResolver.cs index df8cf2e3a..7b8c9c928 100644 --- a/Reporting/XmlResourceResolver.cs +++ b/Reporting/XmlResourceResolver.cs @@ -10,18 +10,66 @@ public class XmlResourceResolver : XmlResolver { private ICredentials credentials; - public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn) + public override Uri ResolveUri(Uri baseUri, string relativeUri) + { + if (baseUri == null) + { + if (relativeUri == null) + throw new ArgumentNullException ("Either baseUri or relativeUri are required."); + + if (relativeUri.StartsWith ("resource:")) + { + return new Uri(relativeUri); + } + else + { + return base.ResolveUri(baseUri, relativeUri); + } + } + + return base.ResolveUri(baseUri, relativeUri); + } + + public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn) { string resourceName = absoluteUri.AbsolutePath.TrimStart(Path.AltDirectorySeparatorChar).Replace(Path.AltDirectorySeparatorChar, Type.Delimiter); - string assemblyName = absoluteUri.Host; - - Assembly assembly = Assembly.Load(assemblyName); - return new ResourceXmlReader(assembly, resourceName); + Assembly assembly = GetAssemblyFor(absoluteUri.Host); + + if (ofObjectToReturn != null) + { + if (ofObjectToReturn == typeof(ResourceXmlReader) || ofObjectToReturn == typeof(XmlTextReader)) + { + return new ResourceXmlReader(assembly, resourceName); + } + else if (ofObjectToReturn == typeof(Stream)) + { + return assembly.GetManifestResourceStream(resourceName); + } + } + + return assembly.GetManifestResourceStream(resourceName); } public override ICredentials Credentials { set { credentials = value; } } + + private static Assembly GetAssemblyFor(string host) + { + Assembly locatedAssembly = null; + + foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies()) + { + AssemblyName assemblyName = assembly.GetName(); + + if (!assemblyName.Name.Equals(host, StringComparison.CurrentCultureIgnoreCase)) + continue; + + locatedAssembly = assembly; + } + + return locatedAssembly; + } } } \ No newline at end of file diff --git a/Reporting/XsltHelper.cs b/Reporting/XsltHelper.cs index b4ce57683..6fbb2856e 100644 --- a/Reporting/XsltHelper.cs +++ b/Reporting/XsltHelper.cs @@ -40,7 +40,7 @@ public static void TransformHtml(XmlSerializer serializer, object report, Type r var reportName = reportType.Name.Replace("Generator", ""); using (var xsltReader = new ResourceXmlReader(reportType, reportName + ".xslt")) { - xslt.Load(xsltReader, xsltSettings, resourceResolver); + xslt.Load(xsltReader, xsltSettings, resourceResolver); } var xmlOutputReader = new XmlTextReader(new StringReader(xmlOutputWriter.ToString())); @@ -48,30 +48,12 @@ public static void TransformHtml(XmlSerializer serializer, object report, Type r XsltArgumentList argumentList = new XsltArgumentList(); argumentList.AddParam("feature-language", "", generatorConfiguration.FeatureLanguage.Name); argumentList.AddParam("tool-language", "", generatorConfiguration.ToolLanguage.Name); - using (var outFileStream = new FileStream(outputFilePath, FileMode.Create, FileAccess.Write)) + + using (var outFileStream = new FileStream(outputFilePath, FileMode.Create, FileAccess.Write)) + using (var xmlTextWriter = new XmlTextWriter(outFileStream, Encoding.UTF8)) { - xslt.Transform(xmlOutputReader, argumentList, outFileStream, resourceResolver); + xslt.Transform(xmlOutputReader, argumentList, xmlTextWriter, resourceResolver); } } - - static public void Transform(this XslCompiledTransform xslt, XmlReader input, XsltArgumentList arguments, Stream results, XmlResolver documentResolver) - { - //xslt.command.Execute(input, new XmlUrlResolver(), arguments, results); - - var command = xslt.GetType().GetField("command", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(xslt); - - var executeMethod = command.GetType().GetMethod("Execute", new Type[] { typeof(XmlReader), typeof(XmlResolver), typeof(XsltArgumentList), typeof(Stream) }); - - try - { - executeMethod.Invoke(command, new object[] {input, documentResolver, arguments, results}); - } - catch (TargetInvocationException invEx) - { - var ex = invEx.InnerException; - ex.PreserveStackTrace(); - throw ex; - } - } } }