using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml;
namespace SaxonOutputBug
{
class Program
{
static void Main(string[] args)
{
// Cache the default Console TextWriter so we can use it again later.
TextWriter defaultWriter = Console.Out;
// Create a RecordingTextWriter and set it to be used for Console.Out and Console.Error
RecordingTextWriter writer = new RecordingTextWriter();
Console.SetOut(writer);
Console.SetError(writer);
// Perform some operations that will write to the Console, which has been set to the RecordingTextWriter.
performOperation();
// Now that everything is done, set Console.Out back to the default value and display the result:
Console.SetOut(defaultWriter);
Console.WriteLine("The RecordingTextWriter object recorded the following string:\n" + writer.Record.ToString());
}
private static void performOperation()
{
TextWriterByteArrayOutputStream os = new TextWriterByteArrayOutputStream(Console.Out);
java.io.PrintStream ps = new java.io.PrintStream(os);
java.lang.System.setErr(ps);
java.lang.System.setOut(ps);
// Will record to the RecordingTextWriter class
Console.WriteLine("I'm writing on the default Console. Next, I want to see what Saxon writes on the default Console.");
Saxon.Api.Processor processor = null;
Saxon.Api.XdmNode xsltInput = null;
Saxon.Api.XsltCompiler xsltCompiler = null;
Saxon.Api.XsltExecutable xsltExecutable = null;
Saxon.Api.XsltTransformer xsltTransformer = null;
Saxon.Api.Serializer dataSerializer = null;
// Next, create some Saxon classes and make them dump errors on the Console.
try
{
processor = new Saxon.Api.Processor();
XmlDocument invalidXsltDocument = new XmlDocument();
invalidXsltDocument.LoadXml(@"");
xsltInput = processor.NewDocumentBuilder().Build(invalidXsltDocument);
xsltCompiler = processor.NewXsltCompiler();
xsltExecutable = xsltCompiler.Compile(xsltInput);
xsltTransformer = xsltExecutable.Load();
XmlDocument document = new XmlDocument();
document.LoadXml("");
Stream transformedStream = new MemoryStream();
xsltTransformer.InitialContextNode = processor.NewDocumentBuilder().Build(document);
dataSerializer = processor.NewSerializer(transformedStream);
xsltTransformer.Run(dataSerializer);
}
catch (Exception ex)
{
Console.Error.WriteLine("Oh no! There was an error!");
Console.Error.WriteLine(ex.ToString());
}
}
}
public class RecordingTextWriter : TextWriter
{
public StringBuilder Record { get; private set; }
public RecordingTextWriter()
{
Record = new StringBuilder();
}
// Override Write and WriteLine so that the values recorded go to the Record StringBuilder.
public override void Write(string value)
{
Record.Append(value);
}
public override void WriteLine(string value)
{
Record.AppendLine(value);
}
public override void WriteLine()
{
Record.AppendLine();
}
public override Encoding Encoding
{
get { throw new NotImplementedException(); }
}
}
public class TextWriterByteArrayOutputStream : java.io.ByteArrayOutputStream
{
TextWriter TextWriter { get; set; }
public TextWriterByteArrayOutputStream(TextWriter writer)
{
TextWriter = writer;
}
public override void write(byte[] b)
{
string s = Encoding.UTF8.GetString(b);
TextWriter.Write(s);
}
public override void write(byte[] b, int off, int len)
{
string s = Encoding.UTF8.GetString(b, off, len);
TextWriter.Write(s);
}
public override void write(int b)
{
TextWriter.Write(b);
}
}
}