Example #1
0
        public OrganizationResponse Execute(OrganizationRequest request, XrmFakedContext ctx)
        {
            var req = request as InitializeFromRequest;

            if (req == null)
            {
                throw new FaultException <OrganizationServiceFault>(new OrganizationServiceFault(), "Cannot execute InitializeFromRequest without the request");
            }

            //TODO: Implement logic to filter mapping attributes based on the req.TargetFieldType
            if (req.TargetFieldType != TargetFieldType.All)
            {
                throw PullRequestException.PartiallyNotImplementedOrganizationRequest(req.GetType(), "logic for filtering attributes based on TargetFieldType other than All is missing");
            }

            var service          = ctx.GetOrganizationService();
            var fetchXml         = string.Format(FetchMappingsByEntity, req.EntityMoniker.LogicalName, req.TargetEntityName);
            var mapping          = service.RetrieveMultiple(new FetchExpression(fetchXml));
            var sourceAttributes = mapping.Entities.Select(a => a.GetAttributeValue <AliasedValue>("attributemap.sourceattributename").Value.ToString()).ToArray();
            var columnSet        = sourceAttributes.Length == 0 ? new ColumnSet(true) : new ColumnSet(sourceAttributes);
            var source           = service.Retrieve(req.EntityMoniker.LogicalName, req.EntityMoniker.Id, columnSet);

            var entity = new Entity
            {
                LogicalName = req.TargetEntityName,
                Id          = Guid.NewGuid()
            };

            if (mapping.Entities.Count > 0)
            {
                foreach (var attr in source.Attributes)
                {
                    var mappingEntity = mapping.Entities.FirstOrDefault(e => e.GetAttributeValue <AliasedValue>("attributemap.sourceattributename").Value.ToString() == attr.Key);
                    if (mappingEntity == null)
                    {
                        continue;
                    }
                    var targetAttribute = mappingEntity.GetAttributeValue <AliasedValue>("attributemap.targetattributename").Value.ToString();
                    entity[targetAttribute] = attr.Value;
                }
            }

            var response = new InitializeFromResponse
            {
                Results =
                {
                    ["Entity"] = entity
                }
            };

            return(response);
        }
        public static ConditionExpression ToConditionExpression(this XElement elem, XrmFakedContext ctx)
        {
            var conditionExpression = new ConditionExpression();

            var conditionEntityName = "";

            var attributeName    = elem.GetAttribute("attribute").Value;
            ConditionOperator op = ConditionOperator.Equal;

            string value = null;

            if (elem.GetAttribute("value") != null)
            {
                value = elem.GetAttribute("value").Value;
            }
            if (elem.GetAttribute("entityname") != null)
            {
                conditionEntityName = elem.GetAttribute("entityname").Value;
            }

            switch (elem.GetAttribute("operator").Value)
            {
            case "eq":
                op = ConditionOperator.Equal;
                break;

            case "ne":
            case "neq":
                op = ConditionOperator.NotEqual;
                break;

            case "begins-with":
                op = ConditionOperator.BeginsWith;
                break;

            case "not-begin-with":
                op = ConditionOperator.DoesNotBeginWith;
                break;

            case "ends-with":
                op = ConditionOperator.EndsWith;
                break;

            case "not-end-with":
                op = ConditionOperator.DoesNotEndWith;
                break;

            case "in":
                op = ConditionOperator.In;
                break;

            case "not-in":
                op = ConditionOperator.NotIn;
                break;

            case "null":
                op = ConditionOperator.Null;
                break;

            case "not-null":
                op = ConditionOperator.NotNull;
                break;

            case "like":
                op = ConditionOperator.Like;

                if (value != null)
                {
                    if (value.StartsWith("%") && !value.EndsWith("%"))
                    {
                        op = ConditionOperator.EndsWith;
                    }
                    else if (!value.StartsWith("%") && value.EndsWith("%"))
                    {
                        op = ConditionOperator.BeginsWith;
                    }

                    value = value.Replace("%", "");
                }
                break;

            case "not-like":
                op = ConditionOperator.NotLike;

                if (value != null)
                {
                    if (value.StartsWith("%") && !value.EndsWith("%"))
                    {
                        op = ConditionOperator.DoesNotEndWith;
                    }
                    else if (!value.StartsWith("%") && value.EndsWith("%"))
                    {
                        op = ConditionOperator.DoesNotBeginWith;
                    }

                    value = value.Replace("%", "");
                }
                break;

            case "gt":
                op = ConditionOperator.GreaterThan;
                break;

            case "ge":
                op = ConditionOperator.GreaterEqual;
                break;

            case "lt":
                op = ConditionOperator.LessThan;
                break;

            case "le":
                op = ConditionOperator.LessEqual;
                break;

            case "on":
                op = ConditionOperator.On;
                break;

            case "on-or-before":
                op = ConditionOperator.OnOrBefore;
                break;

            case "on-or-after":
                op = ConditionOperator.OnOrAfter;
                break;

            case "today":
                op = ConditionOperator.Today;
                break;

            case "yesterday":
                op = ConditionOperator.Yesterday;
                break;

            case "tomorrow":
                op = ConditionOperator.Tomorrow;
                break;

            case "between":
                op = ConditionOperator.Between;
                break;

            case "not-between":
                op = ConditionOperator.NotBetween;
                break;

            case "eq-userid":
                op = ConditionOperator.EqualUserId;
                break;

            case "ne-userid":
                op = ConditionOperator.NotEqualUserId;
                break;

            default:
                throw PullRequestException.FetchXmlOperatorNotImplemented(elem.GetAttribute("operator").Value);
            }

            //Process values
            object[] values = null;


            var entityName = GetAssociatedEntityNameForConditionExpression(elem);

            //Find values inside the condition expression, if apply
            values = elem
                     .Elements()    //child nodes of this filter
                     .Where(el => el.Name.LocalName.Equals("value"))
                     .Select(el => el.ToValue(ctx, entityName, attributeName))
                     .ToArray();


            //Otherwise, a single value was used
            if (value != null)
            {
#if FAKE_XRM_EASY_2013 || FAKE_XRM_EASY_2015 || FAKE_XRM_EASY_2016 || FAKE_XRM_EASY_365
                if (string.IsNullOrWhiteSpace(conditionEntityName))
                {
                    return(new ConditionExpression(attributeName, op, GetConditionExpressionValueCast(value, ctx, entityName, attributeName)));
                }
                else
                {
                    return(new ConditionExpression(conditionEntityName, attributeName, op, GetConditionExpressionValueCast(value, ctx, entityName, attributeName)));
                }
#else
                return(new ConditionExpression(attributeName, op, GetConditionExpressionValueCast(value, ctx, entityName, attributeName)));
#endif
            }

#if FAKE_XRM_EASY_2013 || FAKE_XRM_EASY_2015 || FAKE_XRM_EASY_2016 || FAKE_XRM_EASY_365
            if (string.IsNullOrWhiteSpace(conditionEntityName))
            {
                return(new ConditionExpression(attributeName, op, values));
            }
            else
            {
                return(new ConditionExpression(conditionEntityName, attributeName, op, values));
            }
#else
            return(new ConditionExpression(attributeName, op, values));
#endif
        }
        public OrganizationResponse Execute(OrganizationRequest request, XrmFakedContext ctx)
        {
            var req = request as InitializeFromRequest;

            if (req == null)
            {
                throw new FaultException <OrganizationServiceFault>(new OrganizationServiceFault(), "Cannot execute InitializeFromRequest without the request");
            }

            //TODO: Implement logic to filter mapping attributes based on the req.TargetFieldType
            if (req.TargetFieldType != TargetFieldType.All)
            {
                throw PullRequestException.PartiallyNotImplementedOrganizationRequest(req.GetType(), "logic for filtering attributes based on TargetFieldType other than All is missing");
            }

            var service          = ctx.GetOrganizationService();
            var fetchXml         = string.Format(FetchMappingsByEntity, req.EntityMoniker.LogicalName, req.TargetEntityName);
            var mapping          = service.RetrieveMultiple(new FetchExpression(fetchXml));
            var sourceAttributes = mapping.Entities.Select(a => a.GetAttributeValue <AliasedValue>("attributemap.sourceattributename").Value.ToString()).ToArray();
            var columnSet        = sourceAttributes.Length == 0 ? new ColumnSet(true) : new ColumnSet(sourceAttributes);
            var source           = service.Retrieve(req.EntityMoniker.LogicalName, req.EntityMoniker.Id, columnSet);

            // If we are using proxy types, and the appropriate proxy type is found in
            // the assembly create an instance of the appropiate class
            // Othersise return a simple Entity
            Entity entity = new Entity
            {
                LogicalName = req.TargetEntityName,
                Id          = Guid.Empty
            };

            if (ctx.ProxyTypesAssembly != null)
            {
                var subClassType = ctx.FindReflectedType(req.TargetEntityName);
                if (subClassType != null)
                {
                    var instance = Activator.CreateInstance(subClassType);
                    entity = (Entity)instance;
                }
            }

            if (mapping.Entities.Count > 0)
            {
                foreach (var attr in source.Attributes)
                {
                    var mappingEntity = mapping.Entities.FirstOrDefault(e => e.GetAttributeValue <AliasedValue>("attributemap.sourceattributename").Value.ToString() == attr.Key);
                    if (mappingEntity == null)
                    {
                        continue;
                    }
                    var targetAttribute = mappingEntity.GetAttributeValue <AliasedValue>("attributemap.targetattributename").Value.ToString();
                    entity[targetAttribute] = attr.Value;

                    var isEntityReference = string.Equals(attr.Key, source.LogicalName + "id", StringComparison.CurrentCultureIgnoreCase);
                    if (isEntityReference)
                    {
                        entity[targetAttribute] = new EntityReference(source.LogicalName, (Guid)attr.Value);
                    }
                    else
                    {
                        entity[targetAttribute] = attr.Value;
                    }
                }
            }

            var response = new InitializeFromResponse
            {
                Results =
                {
                    ["Entity"] = entity
                }
            };

            return(response);
        }
Example #4
0
        public OrganizationResponse Execute(OrganizationRequest req, XrmFakedContext ctx)
        {
            var           request  = req as RetrieveMultipleRequest;
            List <Entity> list     = null;
            PagingInfo    pageInfo = null;
            int?          topCount = null;

            if (request.Query is QueryExpression)
            {
                var qe = request.Query as QueryExpression;

                pageInfo = qe.PageInfo;
                topCount = qe.TopCount;

                //need to request 1 extra to get a fill if there are more records
                if (topCount != null)
                {
                    qe.TopCount = topCount + 1;
                }


                if (qe.PageInfo.Count > 0)
                {
                    qe.TopCount = qe.PageInfo.Count + 1;
                }

                var linqQuery = XrmFakedContext.TranslateQueryExpressionToLinq(ctx, request.Query as QueryExpression);
                list = linqQuery.ToList();
            }
            else if (request.Query is FetchExpression)
            {
                var fetchXml        = (request.Query as FetchExpression).Query;
                var xmlDoc          = XrmFakedContext.ParseFetchXml(fetchXml);
                var queryExpression = XrmFakedContext.TranslateFetchXmlDocumentToQueryExpression(ctx, xmlDoc);

                pageInfo = queryExpression.PageInfo;
                topCount = queryExpression.TopCount;

                //need to request 1 extra to get a fill if there are more records
                if (topCount != null)
                {
                    queryExpression.TopCount = topCount + 1;
                }
                if (queryExpression.PageInfo.Count > 0)
                {
                    queryExpression.TopCount = queryExpression.PageInfo.Count + 1;
                }

                var linqQuery = XrmFakedContext.TranslateQueryExpressionToLinq(ctx, queryExpression);
                list = linqQuery.ToList();

                if (xmlDoc.IsAggregateFetchXml())
                {
                    list = XrmFakedContext.ProcessAggregateFetchXml(ctx, xmlDoc, list);
                }
            }
            else if (request.Query is QueryByAttribute)
            {
                //We instantiate a QueryExpression to be executed as we have the implementation done already
                var query = request.Query as QueryByAttribute;
                var qe    = new QueryExpression(query.EntityName);

                qe.ColumnSet = query.ColumnSet;
                qe.Criteria  = new FilterExpression();
                for (var i = 0; i < query.Attributes.Count; i++)
                {
                    qe.Criteria.AddCondition(new ConditionExpression(query.Attributes[i], ConditionOperator.Equal, query.Values[i]));
                }

                pageInfo = qe.PageInfo;
                topCount = qe.TopCount;

                //need to request 1 extra to be able check if there are more records
                if (topCount != null)
                {
                    qe.TopCount = topCount + 1;
                }
                if (qe.PageInfo.Count > 0)
                {
                    qe.TopCount = qe.PageInfo.Count + 1;
                }


                //QueryExpression now done... execute it!
                var linqQuery = XrmFakedContext.TranslateQueryExpressionToLinq(ctx, qe as QueryExpression);
                list = linqQuery.ToList();
            }
            else
            {
                throw PullRequestException.NotImplementedOrganizationRequest(request.Query.GetType());
            }


            list.ForEach(e => e.ApplyDateBehaviour(ctx));
            list.ForEach(e => PopulateFormattedValues(e));
            var recordCount = list.Count();
            var pageSize    = recordCount;
            int pageNumber  = 1;

            if (pageInfo != null && pageInfo.PageNumber > 0 && pageInfo.Count > 0)
            {
                pageSize   = pageInfo.Count;
                pageNumber = pageInfo.PageNumber;
            }
            else if (topCount != null)
            {
                pageSize = topCount.Value;
            }

            var response = new RetrieveMultipleResponse
            {
                Results = new ParameterCollection
                {
                    { "EntityCollection", new EntityCollection(list.Take(pageSize).ToList()) }
                }
            };

            response.EntityCollection.MoreRecords = recordCount > pageSize;
            if (response.EntityCollection.MoreRecords)
            {
                var first = response.EntityCollection.Entities.First();
                var last  = response.EntityCollection.Entities.Last();
                response.EntityCollection.PagingCookie = String.Format(
                    "<cookie page=\"{0}\"><{1}id last=\"{2}\" first=\"{3}\" /></cookie>",
                    pageNumber, first.LogicalName, last.Id.ToString("B").ToUpper(), first.Id.ToString("B").ToUpper());
            }

            return(response);
        }
Example #5
0
 public OrganizationResponse Execute(OrganizationRequest request, XrmFakedContext ctx)
 {
     throw PullRequestException.NotImplementedOrganizationRequest(request.GetType());
 }
Example #6
0
        public OrganizationResponse Execute(OrganizationRequest req, XrmFakedContext ctx)
        {
            var             request  = req as RetrieveMultipleRequest;
            List <Entity>   list     = null;
            PagingInfo      pageInfo = null;
            QueryExpression qe;

            string entityName = null;

            if (request.Query is QueryExpression)
            {
                qe         = (request.Query as QueryExpression).Clone();
                entityName = qe.EntityName;

                var linqQuery = XrmFakedContext.TranslateQueryExpressionToLinq(ctx, qe);
                list = linqQuery.ToList();
            }
            else if (request.Query is FetchExpression)
            {
                var fetchXml = (request.Query as FetchExpression).Query;
                var xmlDoc   = XrmFakedContext.ParseFetchXml(fetchXml);
                qe         = XrmFakedContext.TranslateFetchXmlDocumentToQueryExpression(ctx, xmlDoc);
                entityName = qe.EntityName;

                var linqQuery = XrmFakedContext.TranslateQueryExpressionToLinq(ctx, qe);
                list = linqQuery.ToList();

                if (xmlDoc.IsAggregateFetchXml())
                {
                    list = XrmFakedContext.ProcessAggregateFetchXml(ctx, xmlDoc, list);
                }
            }
            else if (request.Query is QueryByAttribute)
            {
                // We instantiate a QueryExpression to be executed as we have the implementation done already
                var query = request.Query as QueryByAttribute;
                qe         = new QueryExpression(query.EntityName);
                entityName = qe.EntityName;

                qe.ColumnSet = query.ColumnSet;
                qe.Criteria  = new FilterExpression();
                for (var i = 0; i < query.Attributes.Count; i++)
                {
                    qe.Criteria.AddCondition(new ConditionExpression(query.Attributes[i], ConditionOperator.Equal, query.Values[i]));
                }

                qe.PageInfo = query.PageInfo;

                // QueryExpression now done... execute it!
                var linqQuery = XrmFakedContext.TranslateQueryExpressionToLinq(ctx, qe);
                list = linqQuery.ToList();
            }
            else
            {
                throw PullRequestException.NotImplementedOrganizationRequest(request.Query.GetType());
            }

            if (qe.Distinct)
            {
                list = GetDistinctEntities(list);
            }

            // Handle the top count before taking paging into account
            if (qe.TopCount != null && qe.TopCount.Value < list.Count)
            {
                list = list.Take(qe.TopCount.Value).ToList();
            }

            // Handle TotalRecordCount here?
            int totalRecordCount = -1;

            if (qe?.PageInfo?.ReturnTotalRecordCount == true)
            {
                totalRecordCount = list.Count;
            }

            // Handle paging
            var pageSize = ctx.MaxRetrieveCount;

            pageInfo = qe.PageInfo;
            int pageNumber = 1;

            if (pageInfo != null && pageInfo.PageNumber > 0)
            {
                pageNumber = pageInfo.PageNumber;
                pageSize   = pageInfo.Count == 0 ? ctx.MaxRetrieveCount : pageInfo.Count;
            }

            // Figure out where in the list we need to start and how many items we need to grab
            int numberToGet   = pageSize;
            int startPosition = 0;

            if (pageNumber != 1)
            {
                startPosition = (pageNumber - 1) * pageSize;
            }

            if (list.Count < pageSize)
            {
                numberToGet = list.Count;
            }
            else if (list.Count - pageSize * (pageNumber - 1) < pageSize)
            {
                numberToGet = list.Count - (pageSize * (pageNumber - 1));
            }

            var recordsToReturn = startPosition + numberToGet > list.Count ? new List <Entity>() : list.GetRange(startPosition, numberToGet);

            recordsToReturn.ForEach(e => e.ApplyDateBehaviour(ctx));
            recordsToReturn.ForEach(e => PopulateFormattedValues(e));

            var response = new RetrieveMultipleResponse
            {
                Results = new ParameterCollection
                {
                    { "EntityCollection", new EntityCollection(recordsToReturn) }
                }
            };

            response.EntityCollection.EntityName       = entityName;
            response.EntityCollection.MoreRecords      = (list.Count - pageSize * pageNumber) > 0;
            response.EntityCollection.TotalRecordCount = totalRecordCount;

            if (response.EntityCollection.MoreRecords)
            {
                var first = response.EntityCollection.Entities.First();
                var last  = response.EntityCollection.Entities.Last();
                response.EntityCollection.PagingCookie = $"<cookie page=\"{pageNumber}\"><{first.LogicalName}id last=\"{last.Id.ToString("B").ToUpper()}\" first=\"{first.Id.ToString("B").ToUpper()}\" /></cookie>";
            }

            return(response);
        }
Example #7
0
        public OrganizationResponse Execute(OrganizationRequest req, XrmFakedContext ctx)
        {
            var request = req as RetrieveMultipleRequest;

            if (request.Query is QueryExpression)
            {
                var linqQuery = XrmFakedContext.TranslateQueryExpressionToLinq(ctx, request.Query as QueryExpression);
                var list      = linqQuery.ToList();
                list.ForEach(e => PopulateFormattedValues(e));

                var response = new RetrieveMultipleResponse
                {
                    Results = new ParameterCollection
                    {
                        { "EntityCollection", new EntityCollection(list) }
                    }
                };
                return(response);
            }
            else if (request.Query is FetchExpression)
            {
                var fetchXml        = (request.Query as FetchExpression).Query;
                var xmlDoc          = XrmFakedContext.ParseFetchXml(fetchXml);
                var queryExpression = XrmFakedContext.TranslateFetchXmlDocumentToQueryExpression(ctx, xmlDoc);

                var linqQuery = XrmFakedContext.TranslateQueryExpressionToLinq(ctx, queryExpression);
                var list      = linqQuery.ToList();

                if (xmlDoc.IsAggregateFetchXml())
                {
                    list = XrmFakedContext.ProcessAggregateFetchXml(ctx, xmlDoc, list);
                }
                list.ForEach(e => PopulateFormattedValues(e));

                var response = new RetrieveMultipleResponse
                {
                    Results = new ParameterCollection
                    {
                        { "EntityCollection", new EntityCollection(list) }
                    }
                };
                return(response);
            }
            else if (request.Query is QueryByAttribute)
            {
                //We instantiate a QueryExpression to be executed as we have the implementation done already
                var query = request.Query as QueryByAttribute;
                var qe    = new QueryExpression(query.EntityName);

                qe.ColumnSet = query.ColumnSet;
                qe.Criteria  = new FilterExpression();
                for (var i = 0; i < query.Attributes.Count; i++)
                {
                    qe.Criteria.AddCondition(new ConditionExpression(query.Attributes[i], ConditionOperator.Equal, query.Values[i]));
                }

                //QueryExpression now done... execute it!
                var linqQuery = XrmFakedContext.TranslateQueryExpressionToLinq(ctx, qe as QueryExpression);
                var list      = linqQuery.ToList();
                list.ForEach(e => PopulateFormattedValues(e));

                var response = new RetrieveMultipleResponse
                {
                    Results = new ParameterCollection
                    {
                        { "EntityCollection", new EntityCollection(list) }
                    }
                };
                return(response);
            }
            else
            {
                throw PullRequestException.NotImplementedOrganizationRequest(request.Query.GetType());
            }
        }