예제 #1
0
        private static IEnumerable <IDataSource> EnumerateDataSources(DataSourceFindContext context)
        {
            foreach (var factory in _memberDataSourceFactories)
            {
                foreach (var dataSource in factory.Invoke(context))
                {
                    if (!dataSource.IsValid)
                    {
                        continue;
                    }

                    yield return(dataSource);

                    if (!dataSource.IsConditional)
                    {
                        yield break;
                    }

                    ++context.DataSourceIndex;
                }

                if (context.StopFind)
                {
                    yield break;
                }
            }
        }
예제 #2
0
        public static IDataSourceSet CreateFor(DataSourceFindContext findContext)
        {
            var validDataSources = EnumerateDataSources(findContext).ToArray();

            return(DataSourceSet.For(
                       validDataSources,
                       findContext,
                       ValueExpressionBuilders.ValueTree));
        }
예제 #3
0
        public static IEnumerable <IDataSource> Create(DataSourceFindContext context)
        {
            if (context.TargetMember.IsCustom)
            {
                yield break;
            }

            if (context.DoNotUseSourceMemberDataSource())
            {
                if (context.DataSourceIndex == 0)
                {
                    if (context.UseFallbackComplexTypeDataSource())
                    {
                        yield return(ComplexTypeDataSource.Create(context.DataSourceIndex, context.MemberMappingData));
                    }
                }
                else if (context.UseFallbackForConditionalConfiguredDataSource())
                {
                    yield return(context.GetFallbackDataSource());
                }

                if (context.UseConfiguredDataSourcesOnly())
                {
                    yield break;
                }
            }

            if (context.ReturnSimpleTypeToTargetDataSources())
            {
                var updatedMapperData = new ChildMemberMapperData(
                    context.MatchingSourceMemberDataSource.SourceMember,
                    context.TargetMember,
                    context.MemberMapperData.Parent);

                var configuredRootDataSources = context
                                                .MapperContext
                                                .UserConfigurations
                                                .GetDataSourcesForToTarget(updatedMapperData);

                foreach (var configuredRootDataSource in configuredRootDataSources)
                {
                    yield return(configuredRootDataSource);
                }
            }

            yield return(context.MatchingSourceMemberDataSource);

            if (context.UseFallbackDataSource())
            {
                yield return(context.GetFallbackDataSource());
            }
        }
        public static IEnumerable <IDataSource> Create(DataSourceFindContext context)
        {
            if (TryGetMetaMemberNameParts(context, out var memberNameParts) &&
                TryGetMetaMember(memberNameParts, context, out var metaMember))
            {
                var dataSource = metaMember.GetDataSource();

                yield return(context.GetFinalDataSource(dataSource));

                if (dataSource.IsConditional)
                {
                    yield return(context.GetFallbackDataSource());
                }
            }
        }
        private static bool UseMaptimeDataSources(
            DataSourceFindContext context,
            out IEnumerable <IDataSource> maptimeDataSources)
        {
            foreach (var mapTimeDataSourceFactorySource in _mapTimeDataSourceFactorySources)
            {
                if (mapTimeDataSourceFactorySource.Invoke(context.MemberMapperData, out var factory))
                {
                    maptimeDataSources = factory.Invoke(context.MemberMappingData);
                    return(true);
                }
            }

            maptimeDataSources = null;
            return(false);
        }
        private static bool UseMaptimeDataSources(
            DataSourceFindContext context,
            out IEnumerable <IDataSource> maptimeDataSources)
        {
            var applicableFactory = _mapTimeDataSourceFactories
                                    .FirstOrDefault(context.MemberMapperData, (md, factory) => factory.IsFor(md));

            if (applicableFactory == null)
            {
                maptimeDataSources = null;
                return(false);
            }

            maptimeDataSources = applicableFactory.Create(context.MemberMappingData);
            return(true);
        }
        public static IEnumerable <IDataSource> Create(DataSourceFindContext context)
        {
            if (context.ConfiguredDataSources.None())
            {
                yield break;
            }

            foreach (var dataSource in context.ConfiguredDataSources)
            {
                yield return(context.GetFinalDataSource(dataSource));

                if (!dataSource.IsConditional)
                {
                    yield break;
                }
            }
        }
예제 #8
0
        public static IEnumerable <IDataSource> Create(DataSourceFindContext context)
        {
            if (context.UseSourceMemberDataSource())
            {
                yield break;
            }

            var matchingSourceMember = context.BestSourceMemberMatch.SourceMember;

            if (matchingSourceMember != null)
            {
                yield return(ConfiguredMappingDataSource.Create(
                                 matchingSourceMember,
                                 context.DataSourceIndex,
                                 context.MemberMappingData));
            }
        }
        public static IEnumerable <IDataSource> Create(DataSourceFindContext context)
        {
            if (!UseMaptimeDataSources(context, out var maptimeDataSources))
            {
                yield break;
            }

            context.StopFind = true;

            foreach (var maptimeDataSource in maptimeDataSources)
            {
                yield return(context.GetFinalDataSource(maptimeDataSource));

                if (maptimeDataSource.IsConditional)
                {
                    continue;
                }

                yield break;
            }

            yield return(context.GetFallbackDataSource());
        }
예제 #10
0
 private static bool UseFallbackForConditionalConfiguredDataSource(this DataSourceFindContext context)
 {
     return(context.ConfiguredDataSources.Any() &&
            context.ConfiguredDataSources.Last().IsConditional&&
            (context.MatchingSourceMemberDataSource.SourceMember != null));
 }
예제 #11
0
        private static bool UseFallbackComplexTypeDataSource(this DataSourceFindContext context)
        {
            var targetMember = context.TargetMember;

            return(targetMember.IsComplex && !targetMember.IsDictionary && (targetMember.Type != typeof(object)));
        }
        private static bool TryGetMetaMemberNameParts(
            DataSourceFindContext context,
            out IList <string> memberNameParts)
        {
            memberNameParts = default(IList <string>);

            var targetMemberName         = context.TargetMember.Name;
            var previousNamePartEndIndex = targetMemberName.Length;
            var currentMemberName        = string.Empty;
            var noMetaMemberAdded        = true;

            for (var i = previousNamePartEndIndex - 1; i >= 0; --i)
            {
                if (!char.IsUpper(targetMemberName[i]))
                {
                    continue;
                }

                if (memberNameParts == null)
                {
                    if (i == 0)
                    {
                        return(false);
                    }

                    memberNameParts = new List <string>();
                }

                var memberNamePart = targetMemberName.Substring(i, previousNamePartEndIndex - i);

                switch (memberNamePart)
                {
                case HasMetaMemberPart.Name:
                case FirstMetaMemberPart.Name:
                case LastMetaMemberPart.Name:
                case CountMetaMemberPart.Name:
                    if (currentMemberName.Length != 0)
                    {
                        memberNameParts.Add(GetFinalMemberName(currentMemberName, memberNamePart));
                        currentMemberName = string.Empty;
                    }

                    memberNameParts.Add(memberNamePart);
                    noMetaMemberAdded = false;
                    break;

                default:
                    currentMemberName = memberNamePart + currentMemberName;

                    if (currentMemberName.StartsWith(NumberOfMetaMemberPart.Name, StringComparison.Ordinal))
                    {
                        currentMemberName = currentMemberName.Substring(NumberOfMetaMemberPart.Name.Length);
                        memberNameParts.Add(currentMemberName);
                        memberNameParts.Add(NumberOfMetaMemberPart.Name);
                        currentMemberName = string.Empty;
                        noMetaMemberAdded = false;
                    }
                    break;
                }

                previousNamePartEndIndex = i;
            }

            if (noMetaMemberAdded)
            {
                return(false);
            }

            if (currentMemberName.Length == 0)
            {
                return(memberNameParts.Any());
            }

            memberNameParts.Add(GetFinalMemberName(
                                    currentMemberName,
                                    memberNameParts[memberNameParts.Count - 1]));

            return(true);
        }
예제 #13
0
        public static IDataSourceSet CreateFor(DataSourceFindContext findContext)
        {
            var validDataSources = EnumerateDataSources(findContext).ToArray();

            return(DataSourceSet.For(validDataSources, findContext.MemberMapperData));
        }
예제 #14
0
 private static bool DoNotUseSourceMemberDataSource(this DataSourceFindContext context)
 {
     return(!context.BestSourceMemberMatch.IsUseable ||
            context.ConfiguredDataSources.Any(context.MatchingSourceMemberDataSource, (msmds, cds) => cds.IsSameAs(msmds)));
 }
        private static bool TryGetMetaMember(
            IList <string> memberNameParts,
            DataSourceFindContext context,
            out MetaMemberPartBase metaMember)
        {
            var currentMappingData  = default(IObjectMappingData);
            var currentSourceMember = default(IQualifiedMember);
            var currentTargetMember = default(QualifiedMember);
            var currentMemberPart   = metaMember = default(MetaMemberPartBase);

            Func <IQualifiedMember, QualifiedMember, IObjectMappingData, DataSourceFindContext, IObjectMappingData> currentMappingDataFactory =
                (_, _, _, c) => c.MemberMappingData.Parent;

            for (var i = memberNameParts.Count - 1; i >= 0; --i)
            {
                var memberNamePart = memberNameParts[i];

                switch (memberNamePart)
                {
                case HasMetaMemberPart.Name:
                    if (HasMetaMemberPart.TryCreateFor(context.MemberMapperData, ref currentMemberPart))
                    {
                        break;
                    }

                    return(false);

                case FirstMetaMemberPart.Name:
                    currentMemberPart = new FirstMetaMemberPart(context.MemberMapperData);
                    break;

                case LastMetaMemberPart.Name:
                    currentMemberPart = new LastMetaMemberPart(context.MemberMapperData);
                    break;

                case CountMetaMemberPart.Name:
                    if (CountMetaMemberPart.TryCreateFor(context.MemberMapperData, ref currentMemberPart))
                    {
                        break;
                    }

                    return(false);

                case NumberOfMetaMemberPart.Name:
                    if (NumberOfMetaMemberPart.TryCreateFor(context.MemberMapperData, ref currentMemberPart))
                    {
                        break;
                    }

                    return(false);

                default:
                    currentMappingData = currentMappingDataFactory.Invoke(
                        currentSourceMember,
                        currentTargetMember,
                        currentMappingData,
                        context);

                    var currentMapperData = currentMappingData.MapperData;

                    var matchingTargetMember = GlobalContext.Instance
                                               .MemberCache
                                               .GetTargetMembers(currentMapperData.TargetType)
                                               .FirstOrDefault(memberNamePart, (mnp, m) => m.Name == mnp);

                    if (matchingTargetMember == null)
                    {
                        matchingTargetMember = GlobalContext.Instance
                                               .MemberCache
                                               .GetSourceMembers(currentMapperData.SourceType)
                                               .FirstOrDefault(memberNamePart, (mnp, m) => m.Name == mnp);

                        if (matchingTargetMember == null)
                        {
                            return(false);
                        }
                    }

                    currentTargetMember = currentMapperData.TargetMember.Append(matchingTargetMember);

                    var childMemberMapperData = new ChildMemberMapperData(currentTargetMember, currentMapperData);

                    var memberMappingData = currentMappingData.GetChildMappingData(childMemberMapperData);

                    var currentSourceMemberMatch = SourceMemberMatcher.GetMatchFor(
                        memberMappingData,
                        searchParentContexts: false);

                    if (!currentSourceMemberMatch.IsUseable)
                    {
                        return(false);
                    }

                    currentSourceMember = currentSourceMemberMatch.SourceMember;

                    currentMemberPart = new SourceMemberMetaMemberPart(
                        currentSourceMember,
                        currentMapperData,
                        isRootMemberPart: currentMemberPart == null);

                    currentMappingDataFactory = (sm, tm, md, c) =>
                    {
                        var mappingData = ObjectMappingDataFactory.ForChild(sm, tm, 0, md);

                        return(sm.IsEnumerable
                                ? ObjectMappingDataFactory.ForElement(mappingData)
                                : mappingData);
                    };

                    break;
                }

                if (metaMember == null)
                {
                    metaMember = currentMemberPart;
                    continue;
                }

                if (!metaMember.TrySetNextPart(currentMemberPart))
                {
                    return(false);
                }
            }

            return(true);
        }
예제 #16
0
 private static bool UseFallbackDataSource(this DataSourceFindContext context)
 {
     return(!context.TargetMember.IsReadOnly &&
            context.MatchingSourceMemberDataSource.IsConditional &&
            (context.MatchingSourceMemberDataSource.IsValid || context.ConfiguredDataSources.Any()));
 }
예제 #17
0
 private static bool ReturnSimpleTypeToTargetDataSources(this DataSourceFindContext context)
 {
     return(context.MatchingSourceMemberDataSource.SourceMember.IsSimple &&
            context.MapperContext.UserConfigurations.HasConfiguredToTargetDataSources);
 }
예제 #18
0
 private static bool UseConfiguredDataSourcesOnly(this DataSourceFindContext context)
 {
     return(context.BestSourceMemberMatch.IsUseable ||
            (context.MatchingSourceMemberDataSource.SourceMember == null));
 }