From b8a687b86a945536de56299a0f07213d785a210c Mon Sep 17 00:00:00 2001 From: markpollack Date: Tue, 16 Nov 2010 17:35:00 +0000 Subject: [PATCH] SPRNET-1366 - Allow for configuration of UTF8 preamble generation and the check for invalid bytes in XmlMessageConverter. --- .../Support/Converter/XmlMessageConverter.cs | 88 +++++++++++-------- .../Support/Converter/XmlMessageConverter.cs | 87 +++++++++++------- 2 files changed, 107 insertions(+), 68 deletions(-) diff --git a/src/Spring/Spring.Messaging.Ems/Messaging/Ems/Support/Converter/XmlMessageConverter.cs b/src/Spring/Spring.Messaging.Ems/Messaging/Ems/Support/Converter/XmlMessageConverter.cs index 9f7cfdb1..e7dcf219 100644 --- a/src/Spring/Spring.Messaging.Ems/Messaging/Ems/Support/Converter/XmlMessageConverter.cs +++ b/src/Spring/Spring.Messaging.Ems/Messaging/Ems/Support/Converter/XmlMessageConverter.cs @@ -20,6 +20,10 @@ namespace Spring.Messaging.Ems.Support.Converter private ITypeMapper typeMapper; + private bool encoderShouldEmitUTF8Identifier = false; + + private bool throwOnInvalidBytes = true; + /// /// Sets the type mapper. @@ -30,6 +34,29 @@ namespace Spring.Messaging.Ems.Support.Converter set { typeMapper = value; } } + /// + /// Gets or sets a value indicating whether encoder should emit UTF8 byte order mark. Default is false. + /// + /// + /// true to specify that a Unicode byte order mark is provided; otherwise, false. + /// + public bool EncoderShouldEmitUtf8Identifier + { + get { return encoderShouldEmitUTF8Identifier; } + set { encoderShouldEmitUTF8Identifier = value; } + } + + /// + /// Gets or sets a value indicating whether to throw an exception on invalid bytes. Default is true. + /// + /// true to specify that an exception be thrown when an invalid encoding is detected; otherwise, false. + /// + public bool ThrowOnInvalidBytes + { + get { return throwOnInvalidBytes; } + set { throwOnInvalidBytes = value; } + } + /// /// Convert a .NET object to a EMS Message using the supplied session /// to create the message object. @@ -53,13 +80,10 @@ namespace Spring.Messaging.Ems.Support.Converter { return defaultMessageConverter.ToMessage(objectToConvert, session); } - else - { - string xmlString = GetXmlString(objectToConvert); - Message msg = session.CreateTextMessage(xmlString); - msg.SetStringProperty(typeMapper.TypeIdFieldName, typeMapper.FromType(objectToConvert.GetType())); - return msg; - } + string xmlString = GetXmlString(objectToConvert); + Message msg = session.CreateTextMessage(xmlString); + msg.SetStringProperty(typeMapper.TypeIdFieldName, typeMapper.FromType(objectToConvert.GetType())); + return msg; } catch (Exception e) { @@ -75,24 +99,21 @@ namespace Spring.Messaging.Ems.Support.Converter protected virtual string GetXmlString(object objectToConvert) { string xmlString; - XmlTextWriter xmlTextWriter = null; - MemoryStream memoryStream = null; try { - memoryStream = new MemoryStream(); - xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8); - XmlSerializer xs = new XmlSerializer(objectToConvert.GetType()); - xs.Serialize(xmlTextWriter, objectToConvert); - xmlString = UTF8ByteArrayToString(((MemoryStream)xmlTextWriter.BaseStream).ToArray()); - } - catch (Exception e) + using (MemoryStream memoryStream = new MemoryStream()) + { + using (XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8)) + { + XmlSerializer xs = new XmlSerializer(objectToConvert.GetType()); + xs.Serialize(xmlTextWriter, objectToConvert); + xmlString = UTF8ByteArrayToString(((MemoryStream) xmlTextWriter.BaseStream).ToArray()); + } + } + } catch (Exception e) { throw new MessageConversionException("Can't convert object of type " + objectToConvert.GetType(), e); - } - finally - { - if (memoryStream != null) memoryStream.Close(); - } + } return xmlString; } @@ -115,22 +136,19 @@ namespace Spring.Messaging.Ems.Support.Converter { return defaultMessageConverter.FromMessage(messageToConvert); } - else + TextMessage textMessage = messageToConvert as TextMessage; + if (textMessage == null) { - TextMessage textMessage = messageToConvert as TextMessage; - if (textMessage == null) - { - throw new MessageConversionException("Can't convert message of type " + - messageToConvert.GetType()); - } + throw new MessageConversionException("Can't convert message of type " + + messageToConvert.GetType()); + } - using (MemoryStream memoryStream = new MemoryStream(StringToUTF8ByteArray(textMessage.Text))) - { + using (MemoryStream memoryStream = new MemoryStream(StringToUTF8ByteArray(textMessage.Text))) + { - XmlSerializer xs = new XmlSerializer(GetTargetType(textMessage)); - XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8); - return xs.Deserialize(memoryStream); - } + XmlSerializer xs = new XmlSerializer(GetTargetType(textMessage)); + XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8); + return xs.Deserialize(memoryStream); } } catch (Exception e) @@ -157,7 +175,7 @@ namespace Spring.Messaging.Ems.Support.Converter /// UTF8 string protected virtual String UTF8ByteArrayToString(Byte[] characters) { - UTF8Encoding encoding = new UTF8Encoding(); + UTF8Encoding encoding = new UTF8Encoding(EncoderShouldEmitUtf8Identifier, ThrowOnInvalidBytes); String constructedString = encoding.GetString(characters); diff --git a/src/Spring/Spring.Messaging.Nms/Messaging/Nms/Support/Converter/XmlMessageConverter.cs b/src/Spring/Spring.Messaging.Nms/Messaging/Nms/Support/Converter/XmlMessageConverter.cs index a8f75e68..2b88352e 100644 --- a/src/Spring/Spring.Messaging.Nms/Messaging/Nms/Support/Converter/XmlMessageConverter.cs +++ b/src/Spring/Spring.Messaging.Nms/Messaging/Nms/Support/Converter/XmlMessageConverter.cs @@ -20,6 +20,10 @@ namespace Spring.Messaging.Nms.Support.Converter private ITypeMapper typeMapper = new TypeMapper(); + private bool encoderShouldEmitUTF8Identifier = false; + + private bool throwOnInvalidBytes = true; + /// /// Sets the type mapper. @@ -30,6 +34,29 @@ namespace Spring.Messaging.Nms.Support.Converter set { typeMapper = value; } } + /// + /// Gets or sets a value indicating whether encoder should emit UTF8 byte order mark. Default is false. + /// + /// + /// true to specify that a Unicode byte order mark is provided; otherwise, false. + /// + public bool EncoderShouldEmitUtf8Identifier + { + get { return encoderShouldEmitUTF8Identifier; } + set { encoderShouldEmitUTF8Identifier = value; } + } + + /// + /// Gets or sets a value indicating whether to throw an exception on invalid bytes. Default is true. + /// + /// true to specify that an exception be thrown when an invalid encoding is detected; otherwise, false. + /// + public bool ThrowOnInvalidBytes + { + get { return throwOnInvalidBytes; } + set { throwOnInvalidBytes = value; } + } + /// /// Convert a .NET object to a NMS Message using the supplied session /// to create the message object. @@ -53,13 +80,10 @@ namespace Spring.Messaging.Nms.Support.Converter { return defaultMessageConverter.ToMessage(objectToConvert, session); } - else - { - string xmlString = GetXmlString(objectToConvert); - IMessage msg = session.CreateTextMessage(xmlString); - msg.Properties.SetString(typeMapper.TypeIdFieldName, typeMapper.FromType(objectToConvert.GetType())); - return msg; - } + string xmlString = GetXmlString(objectToConvert); + IMessage msg = session.CreateTextMessage(xmlString); + msg.Properties.SetString(typeMapper.TypeIdFieldName, typeMapper.FromType(objectToConvert.GetType())); + return msg; } catch (Exception e) { throw new MessageConversionException("Can't convert object of type " + objectToConvert.GetType(), e); @@ -74,21 +98,21 @@ namespace Spring.Messaging.Nms.Support.Converter protected virtual string GetXmlString(object objectToConvert) { string xmlString; - XmlTextWriter xmlTextWriter = null; - MemoryStream memoryStream = null; try { - memoryStream = new MemoryStream(); - xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8); - XmlSerializer xs = new XmlSerializer(objectToConvert.GetType()); - xs.Serialize(xmlTextWriter, objectToConvert); - xmlString = UTF8ByteArrayToString(((MemoryStream) xmlTextWriter.BaseStream).ToArray()); - } catch (Exception e) + using (MemoryStream memoryStream = new MemoryStream()) + { + using (XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8)) + { + XmlSerializer xs = new XmlSerializer(objectToConvert.GetType()); + xs.Serialize(xmlTextWriter, objectToConvert); + xmlString = UTF8ByteArrayToString(((MemoryStream)xmlTextWriter.BaseStream).ToArray()); + } + } + } + catch (Exception e) { - throw new MessageConversionException("Can't convert object of type " + objectToConvert.GetType(), e); - } finally - { - if (memoryStream != null) memoryStream.Close(); + throw new MessageConversionException("Can't convert object of type " + objectToConvert.GetType(), e); } return xmlString; } @@ -112,22 +136,19 @@ namespace Spring.Messaging.Nms.Support.Converter { return defaultMessageConverter.FromMessage(messageToConvert); } - else + ITextMessage textMessage = messageToConvert as ITextMessage; + if (textMessage == null) { - ITextMessage textMessage = messageToConvert as ITextMessage; - if (textMessage == null) - { - throw new MessageConversionException("Can't convert message of type " + - messageToConvert.GetType()); - } + throw new MessageConversionException("Can't convert message of type " + + messageToConvert.GetType()); + } - using (MemoryStream memoryStream = new MemoryStream(StringToUTF8ByteArray(textMessage.Text))) - { + using (MemoryStream memoryStream = new MemoryStream(StringToUTF8ByteArray(textMessage.Text))) + { - XmlSerializer xs = new XmlSerializer(GetTargetType(textMessage)); - XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8); - return xs.Deserialize(memoryStream); - } + XmlSerializer xs = new XmlSerializer(GetTargetType(textMessage)); + XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8); + return xs.Deserialize(memoryStream); } } catch (Exception e) { @@ -153,7 +174,7 @@ namespace Spring.Messaging.Nms.Support.Converter /// UTF8 string protected virtual String UTF8ByteArrayToString(Byte[] characters) { - UTF8Encoding encoding = new UTF8Encoding(); + UTF8Encoding encoding = new UTF8Encoding(EncoderShouldEmitUtf8Identifier, ThrowOnInvalidBytes); String constructedString = encoding.GetString(characters);