blob: 689765bd08aeffacddfeffc3c85e7e145e9902e1 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.Collections;
namespace Apache.NMS.Util
{
/// <summary>
/// This class provides a mechanism to intercept calls to a IPrimitiveMap
/// instance and perform validation, handle type conversion, or some other
/// function necessary to use the PrimitiveMap in a Message or other NMS
/// object.
///
/// Be default this class enforces the standard conversion policy for primitive
/// types in NMS shown in the table below:
///
/// | | boolean byte short char int long float double String byte[]
/// |----------------------------------------------------------------------
/// |boolean | X X
/// |byte | X X X X X
/// |short | X X X X
/// |char | X X
/// |int | X X X
/// |long | X X
/// |float | X X X
/// |double | X X
/// |String | X X X X X X X X
/// |byte[] | X
/// |----------------------------------------------------------------------
///
/// </summary>
public class PrimitiveMapInterceptor : IPrimitiveMap
{
protected IMessage message;
protected IPrimitiveMap properties;
private bool readOnly = false;
private bool allowByteArrays = true;
public PrimitiveMapInterceptor(IMessage message, IPrimitiveMap properties)
{
this.message = message;
this.properties = properties;
}
public PrimitiveMapInterceptor(IMessage message, IPrimitiveMap properties, bool readOnly)
{
this.message = message;
this.properties = properties;
this.readOnly = readOnly;
}
public PrimitiveMapInterceptor(IMessage message, IPrimitiveMap properties, bool readOnly, bool allowByteArrays)
{
this.message = message;
this.properties = properties;
this.readOnly = readOnly;
this.allowByteArrays = allowByteArrays;
}
protected virtual object GetObjectProperty(string name)
{
return this.properties[name];
}
protected virtual void SetObjectProperty(string name, object value)
{
FailIfReadOnly();
try
{
if(!this.allowByteArrays && (value is byte[]))
{
throw new NotSupportedException("Byte Arrays not allowed in this PrimitiveMap");
}
this.properties[name] = value;
}
catch(Exception ex)
{
throw NMSExceptionSupport.CreateMessageFormatException(ex);
}
}
#region IPrimitiveMap Members
public void Clear()
{
FailIfReadOnly();
this.properties.Clear();
}
public bool Contains(object key)
{
return this.properties.Contains(key);
}
public void Remove(object key)
{
FailIfReadOnly();
this.properties.Remove(key);
}
public int Count
{
get { return this.properties.Count; }
}
public System.Collections.ICollection Keys
{
get { return this.properties.Keys; }
}
public System.Collections.ICollection Values
{
get { return this.properties.Values; }
}
public object this[string key]
{
get { return GetObjectProperty(key); }
set { SetObjectProperty(key, value); }
}
public string GetString(string key)
{
Object value = GetObjectProperty(key);
if(value == null)
{
return null;
}
else if((value is IList) || (value is IDictionary))
{
throw new MessageFormatException(" cannot read a boolean from " + value.GetType().Name);
}
return value.ToString();
}
public void SetString(string key, string value)
{
SetObjectProperty(key, value);
}
public bool GetBool(string key)
{
Object value = GetObjectProperty(key);
try
{
if(value is Boolean)
{
return (bool) value;
}
else if(value is String)
{
return ((string) value).ToLower() == "true";
}
else
{
throw new MessageFormatException(" cannot read a boolean from " + value.GetType().Name);
}
}
catch(FormatException ex)
{
throw NMSExceptionSupport.CreateMessageFormatException(ex);
}
}
public void SetBool(string key, bool value)
{
SetObjectProperty(key, value);
}
public byte GetByte(string key)
{
Object value = GetObjectProperty(key);
try
{
if(value is Byte)
{
return (byte) value;
}
else if(value is String)
{
return Convert.ToByte(value);
}
else
{
throw new MessageFormatException(" cannot read a byte from " + value.GetType().Name);
}
}
catch(FormatException ex)
{
throw NMSExceptionSupport.CreateMessageFormatException(ex);
}
}
public void SetByte(string key, byte value)
{
SetObjectProperty(key, value);
}
public char GetChar(string key)
{
Object value = GetObjectProperty(key);
try
{
if(value is Char)
{
return (char) value;
}
else if(value is String)
{
string svalue = value as string;
if(svalue.Length == 1)
{
return svalue.ToCharArray()[0];
}
}
throw new MessageFormatException(" cannot read a char from " + value.GetType().Name);
}
catch(FormatException ex)
{
throw NMSExceptionSupport.CreateMessageFormatException(ex);
}
}
public void SetChar(string key, char value)
{
SetObjectProperty(key, value);
}
public short GetShort(string key)
{
Object value = GetObjectProperty(key);
try
{
if(value is Int16)
{
return (short) value;
}
else if(value is Byte || value is String)
{
return Convert.ToInt16(value);
}
else
{
throw new MessageFormatException(" cannot read a short from " + value.GetType().Name);
}
}
catch(FormatException ex)
{
throw NMSExceptionSupport.CreateMessageFormatException(ex);
}
}
public void SetShort(string key, short value)
{
SetObjectProperty(key, value);
}
public int GetInt(string key)
{
Object value = GetObjectProperty(key);
try
{
if(value is Int32)
{
return (int) value;
}
else if(value is Int16 || value is Byte || value is String)
{
return Convert.ToInt32(value);
}
else
{
throw new MessageFormatException(" cannot read a int from " + value.GetType().Name);
}
}
catch(FormatException ex)
{
throw NMSExceptionSupport.CreateMessageFormatException(ex);
}
}
public void SetInt(string key, int value)
{
SetObjectProperty(key, value);
}
public long GetLong(string key)
{
Object value = GetObjectProperty(key);
try
{
if(value is Int64)
{
return (long) value;
}
else if(value is Int32 || value is Int16 || value is Byte || value is String)
{
return Convert.ToInt64(value);
}
else
{
throw new MessageFormatException(" cannot read a long from " + value.GetType().Name);
}
}
catch(FormatException ex)
{
throw NMSExceptionSupport.CreateMessageFormatException(ex);
}
}
public void SetLong(string key, long value)
{
SetObjectProperty(key, value);
}
public float GetFloat(string key)
{
Object value = GetObjectProperty(key);
try
{
if(value is Single)
{
return (float) value;
}
else if(value is String)
{
return Convert.ToSingle(value);
}
else
{
throw new MessageFormatException(" cannot read a float from " + value.GetType().Name);
}
}
catch(FormatException ex)
{
throw NMSExceptionSupport.CreateMessageFormatException(ex);
}
}
public void SetFloat(string key, float value)
{
SetObjectProperty(key, value);
}
public double GetDouble(string key)
{
Object value = GetObjectProperty(key);
try
{
if(value is Double)
{
return (double) value;
}
else if(value is Single || value is String)
{
return Convert.ToDouble(value);
}
else
{
throw new MessageFormatException(" cannot read a double from " + value.GetType().Name);
}
}
catch(FormatException ex)
{
throw NMSExceptionSupport.CreateMessageFormatException(ex);
}
}
public void SetDouble(string key, double value)
{
SetObjectProperty(key, value);
}
public void SetBytes(String key, byte[] value)
{
this.SetBytes(key, value, 0, value.Length);
}
public void SetBytes(String key, byte[] value, int offset, int length)
{
byte[] copy = new byte[length];
Array.Copy(value, offset, copy, 0, length);
SetObjectProperty(key, value);
}
public byte[] GetBytes(string key)
{
Object value = GetObjectProperty(key);
try
{
if(value is Byte[])
{
return (byte[]) value;
}
else
{
throw new MessageFormatException(" cannot read a byte[] from " + value.GetType().Name);
}
}
catch(FormatException ex)
{
throw NMSExceptionSupport.CreateMessageFormatException(ex);
}
}
public System.Collections.IList GetList(string key)
{
return (System.Collections.IList) GetObjectProperty(key);
}
public void SetList(string key, System.Collections.IList list)
{
SetObjectProperty(key, list);
}
public System.Collections.IDictionary GetDictionary(string key)
{
return (System.Collections.IDictionary) GetObjectProperty(key);
}
public void SetDictionary(string key, System.Collections.IDictionary dictionary)
{
SetObjectProperty(key, dictionary);
}
#endregion
public bool ReadOnly
{
get{ return this.readOnly; }
set{ this.readOnly = value; }
}
public bool AllowByteArrays
{
get{ return this.allowByteArrays; }
set{ this.allowByteArrays = value; }
}
protected virtual void FailIfReadOnly()
{
if(this.ReadOnly == true)
{
throw new MessageNotWriteableException("Properties are in Read-Only mode.");
}
}
}
}