Business Logic Toolkit for .NET
www.bltoolkit.net
|  Home   |  Download   |  Documentation   |  Discussions   |  License   |

  Source.Mapping.ObjectListMapper.cs

 
using System.Collections;

using BLToolkit.Reflection;

namespace BLToolkit.Mapping
{
    public class ObjectListMapper : IMapDataSourceList, IMapDataDestinationList
    {
        public ObjectListMapper(IList list, ObjectMapper objectMapper)
        {
            _list   = list;
            _mapper = objectMapper;
        }

        private readonly IList        _list;
        private          ObjectMapper _mapper;
        private          int          _currentItem;

        #region IMapDataSourceList Members

        void IMapDataSourceList.InitMapping(InitContext initContext)
        {
            initContext.DataSource = _mapper;
        }

        bool IMapDataSourceList.SetNextDataSource(InitContext initContext)
        {
            if (_currentItem >= _list.Count)
                return false;

            initContext.SourceObject = _list[_currentItem];
            _currentItem++;

            return true;
        }

        void IMapDataSourceList.EndMapping(InitContext initContext)
        {
        }

        #endregion

        #region IMapDataDestinationList Members

        void IMapDataDestinationList.InitMapping(InitContext initContext)
        {
            ISupportMapping sm = _list as ISupportMapping;

            if (sm != null)
            {
                sm.BeginMapping(initContext);

                if (initContext.ObjectMapper != null && _mapper != initContext.ObjectMapper)
                    _mapper = initContext.ObjectMapper;
            }
        }

        IMapDataDestination IMapDataDestinationList.GetDataDestination(InitContext initContext)
        {
            return _mapper;
        }

        private object _currentObject;

        private void AddCurrent()
        {
            if (_currentObject != null)
            {
                _list.Add(_currentObject);
                _currentObject = null;
            }
        }

        object IMapDataDestinationList.GetNextObject(InitContext initContext)
        {
            AddCurrent();

            return _currentObject = _mapper.CreateInstance(initContext);
        }

        void IMapDataDestinationList.EndMapping(InitContext initContext)
        {
            AddCurrent();

            ISupportMapping sm = _list as ISupportMapping;

            if (sm != null)
                sm.EndMapping(initContext);
        }

        #endregion
    }
}
 
© 2010 www.bltoolkit.net
support@bltoolkit.net