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

  Source.Mapping.DictionaryIndexListMapper.cs

 
using System;
using System.Collections;

using BLToolkit.Common;
using BLToolkit.Reflection;

namespace BLToolkit.Mapping
{
    public class DictionaryIndexListMapper : IMapDataDestinationList
    {
        public DictionaryIndexListMapper(
            IDictionary  dic,
            MapIndex     index,
            ObjectMapper objectMapper)
        {
            _dic    = dic;
            _mapper = objectMapper;

            _fields = new NameOrIndexParameter[index.Fields.Length];
            _fromSource = new bool[index.Fields.Length];

            for (int i = 0; i < _fields.Length; i++)
            {
                bool fromSource = index.Fields[i].ByName && index.Fields[i].Name[0] == '@';

                _fields[i]     = fromSource? index.Fields[i].Name.Substring(1): index.Fields[i];
                _fromSource[i] = fromSource;
                _isFromSource  = _isFromSource ||  fromSource;
                _isFromDest    = _isFromDest   || !fromSource;
            }
        }

        private readonly NameOrIndexParameter[] _fields;
        private readonly IDictionary            _dic;
        private readonly bool[]                 _fromSource;
        private readonly bool                   _isFromSource;
        private readonly bool                   _isFromDest;
        private          ObjectMapper           _mapper;
        private          object                 _newObject;
        private          object[]               _indexValue;

        #region IMapDataDestinationList Members

        private void AddObject()
        {
            if (_newObject != null)
            {
                if (_isFromDest)
                    for (int i = 0; i < _fields.Length; i++)
                        if (!_fromSource[i])
                            _indexValue[i] = _mapper.TypeAccessor[_fields[i]].GetValue(_newObject);

                _dic[new CompoundValue(_indexValue)] = _newObject;
            }
        }

        public virtual void InitMapping(InitContext initContext)
        {
            ISupportMapping sm = _dic as ISupportMapping;

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

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

        [CLSCompliant(false)]
        public virtual IMapDataDestination GetDataDestination(InitContext initContext)
        {
            return _mapper;
        }

        public virtual object GetNextObject(InitContext initContext)
        {
            AddObject();

            _indexValue = new object[_fields.Length];

            if (_isFromSource)
                for (int i = 0; i < _fields.Length; i++)
                    if (_fromSource[i])
                        _indexValue[i] = _fields[i].ByName ?
                            initContext.DataSource.GetValue( initContext.SourceObject, _fields[i].Name) :
                            initContext.DataSource.GetValue( initContext.SourceObject, _fields[i].Index);

            return _newObject = _mapper.CreateInstance(initContext);
        }

        public virtual void EndMapping(InitContext initContext)
        {
            AddObject();

            ISupportMapping sm = _dic as ISupportMapping;

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

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