SPRNET-1366 - Allow for configuration of UTF8 preamble generation and the check for invalid bytes in XmlMessageConverter.

This commit is contained in:
markpollack
2010-11-16 17:35:00 +00:00
parent fe79aa7aaa
commit b8a687b86a
2 changed files with 107 additions and 68 deletions

View File

@@ -20,6 +20,10 @@ namespace Spring.Messaging.Ems.Support.Converter
private ITypeMapper typeMapper;
private bool encoderShouldEmitUTF8Identifier = false;
private bool throwOnInvalidBytes = true;
/// <summary>
/// Sets the type mapper.
@@ -30,6 +34,29 @@ namespace Spring.Messaging.Ems.Support.Converter
set { typeMapper = value; }
}
/// <summary>
/// Gets or sets a value indicating whether encoder should emit UTF8 byte order mark. Default is false.
/// </summary>
/// <value>
/// <c>true</c> to specify that a Unicode byte order mark is provided; otherwise, <c>false</c>.
/// </value>
public bool EncoderShouldEmitUtf8Identifier
{
get { return encoderShouldEmitUTF8Identifier; }
set { encoderShouldEmitUTF8Identifier = value; }
}
/// <summary>
/// Gets or sets a value indicating whether to throw an exception on invalid bytes. Default is true. </summary>
/// <value>
/// <c>true</c> to specify that an exception be thrown when an invalid encoding is detected; otherwise, <c>false</c>.
/// </value>
public bool ThrowOnInvalidBytes
{
get { return throwOnInvalidBytes; }
set { throwOnInvalidBytes = value; }
}
/// <summary>
/// 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
/// <returns>UTF8 string</returns>
protected virtual String UTF8ByteArrayToString(Byte[] characters)
{
UTF8Encoding encoding = new UTF8Encoding();
UTF8Encoding encoding = new UTF8Encoding(EncoderShouldEmitUtf8Identifier, ThrowOnInvalidBytes);
String constructedString = encoding.GetString(characters);

View File

@@ -20,6 +20,10 @@ namespace Spring.Messaging.Nms.Support.Converter
private ITypeMapper typeMapper = new TypeMapper();
private bool encoderShouldEmitUTF8Identifier = false;
private bool throwOnInvalidBytes = true;
/// <summary>
/// Sets the type mapper.
@@ -30,6 +34,29 @@ namespace Spring.Messaging.Nms.Support.Converter
set { typeMapper = value; }
}
/// <summary>
/// Gets or sets a value indicating whether encoder should emit UTF8 byte order mark. Default is false.
/// </summary>
/// <value>
/// <c>true</c> to specify that a Unicode byte order mark is provided; otherwise, <c>false</c>.
/// </value>
public bool EncoderShouldEmitUtf8Identifier
{
get { return encoderShouldEmitUTF8Identifier; }
set { encoderShouldEmitUTF8Identifier = value; }
}
/// <summary>
/// Gets or sets a value indicating whether to throw an exception on invalid bytes. Default is true. </summary>
/// <value>
/// <c>true</c> to specify that an exception be thrown when an invalid encoding is detected; otherwise, <c>false</c>.
/// </value>
public bool ThrowOnInvalidBytes
{
get { return throwOnInvalidBytes; }
set { throwOnInvalidBytes = value; }
}
/// <summary>
/// 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
/// <returns>UTF8 string</returns>
protected virtual String UTF8ByteArrayToString(Byte[] characters)
{
UTF8Encoding encoding = new UTF8Encoding();
UTF8Encoding encoding = new UTF8Encoding(EncoderShouldEmitUtf8Identifier, ThrowOnInvalidBytes);
String constructedString = encoding.GetString(characters);