// Persist library : Persistence layer
// Copyright (C) 2003 Vincent Daron
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
using System;
using System.Data;
using System.Reflection;
using System.Collections;
using Persist.Attributes;
namespace Persist.Maps{
/// <summary>
/// Map a Database Column on a Class Attribute
/// </summary>
public class AttributeMap
{
private ColumnMap theColumnMap;
private AttributeMap theReference;
private System.Reflection.PropertyInfo thePropertyInfo;
private System.Reflection.FieldInfo theFieldInfo;
private string theName;
private bool isProxy;
private bool isOptimistCheckAttribute;
/// <summary>
/// Constructor
/// </summary>
/// <param name="name">the Attribute Map Name</param>
public AttributeMap(string name)
{
theName = name;
}
/// <summary>
/// Specified if this attribute is part of the Proxy object
/// </summary>
public bool IsProxy
{
get{return isProxy;}
set{isProxy = value;}
}
/// <summary>
/// Specified if this is the OptimistLock Attribute
/// </summary>
public bool IsOptimistCheckAttribute
{
get{return isOptimistCheckAttribute;}
set{isOptimistCheckAttribute = value;}
}
/// <summary>
/// The name of the Attribute to map
/// </summary>
public string Name
{
get{return theName;}
set{theName = value;}
}
/// <summary>
/// The Corresponding ColumnMap
/// </summary>
public ColumnMap ColumnMap
{
get
{
return theColumnMap;
}
set
{
theColumnMap = value;
}
}
/// <summary>
/// Unused for now (TODO :) )
/// </summary>
public AttributeMap Reference
{
get
{
return theReference;
}
set
{
theReference = value;
}
}
/// <summary>
/// Initialize the AttributeMap
/// </summary>
/// <param name="configuration">the Configuration</param>
internal void Init(Config.Configuration configuration)
{
if(theColumnMap != null)
{
theColumnMap.Init(configuration);
}
}
/// <summary>
/// Find by Reflection, the Attribute to Map
/// The search order is the following :
/// 1) Look for a corresponding AttributeNameAttribute
/// 2) Look for an Attribute with the corresponding name
/// </summary>
/// <param name="mapObjectType">the Type of object to look for attribute mapping</param>
internal void InitAccessors(Type mapObjectType)
{
theFieldInfo = null;
foreach(FieldInfo fieldInfo in mapObjectType.GetFields(BindingFlags.NonPublic|BindingFlags.Public|BindingFlags.GetField|BindingFlags.Instance))
{
foreach(AttributeNameAttribute attributeName in fieldInfo.GetCustomAttributes(typeof(AttributeNameAttribute),true))
{
if(attributeName.Name == Name)
{
theFieldInfo = fieldInfo;
break;
}
}
if(theFieldInfo != null)
{
break;
}
}
if(theFieldInfo == null)
{
theFieldInfo = mapObjectType.GetField(Name,BindingFlags.NonPublic|BindingFlags.Public|BindingFlags.GetField|BindingFlags.Instance);
if(theFieldInfo == null)
{
thePropertyInfo = mapObjectType.GetProperty(Name,BindingFlags.NonPublic|BindingFlags.Public|BindingFlags.GetProperty|BindingFlags.Instance);
if((thePropertyInfo == null)||(!thePropertyInfo.CanRead)||(!thePropertyInfo.CanWrite))
{
throw new Exception("Cannot find Field or Property "+Name+" in type "+mapObjectType);
}
}
}
}
/// <summary>
/// Get the value of the attribute for the specified object
/// </summary>
/// <param name="source">the object</param>
/// <returns>the Attribute value</returns>
public object GetValue(object source)
{
object result;
if(theFieldInfo != null)
{
result = theFieldInfo.GetValue(source);
}
else
{
result = thePropertyInfo.GetValue(source,null);
}
return result;
}
/// <summary>
/// Set the Attribute value of the object
/// </summary>
/// <param name="target">the object to modify</param>
/// <param name="value">the attribute value</param>
public void SetValue(object target,object value)
{
if(theFieldInfo != null)
{
theFieldInfo.SetValue(target,value);
}
else
{
thePropertyInfo.SetValue(target,value,null);
}
}
}
}
|