示例#1
0
        public OrganizationResponse Execute(OrganizationRequest request)
        {
            OrganizationResponse res = null;

            if (request != null)
            {
                if (request.GetType() == typeof(WhoAmIRequest))
                {
                    if (_connectionString == "INCORRECT_CONNECTION_STRING")
                    {
                        throw new Exception("incorrect connection string");
                    }
                    res = new WhoAmIResponse();
                    res["BusinessUnitId"] = new Guid("73174763-ed0e-4aeb-b02a-9f6dc078260a");
                    res["OrganizationId"] = new Guid("73174763-ed0e-4aeb-b02a-9f6dc078260a");
                    res["UserId"]         = new Guid("73174763-ed0e-4aeb-b02a-9f6dc078260a");
                }
                else if (request.GetType() == typeof(RetrieveEntityRequest))
                {
                    var em = new EntityMetadata()
                    {
                        SchemaName = "myEntity"
                    };
                    AttributeMetadata attr1 = (AttributeMetadata)typeof(AttributeMetadata).GetConstructor(BindingFlags.NonPublic | BindingFlags.CreateInstance | BindingFlags.Instance, null, new Type[] { typeof(AttributeTypeCode), typeof(string) }, null)
                                              .Invoke(new Object[] { AttributeTypeCode.Integer, "prop1" });
                    attr1.LogicalName = "prop1";
                    var attrs = new AttributeMetadata[] { attr1 };
                    em.GetType().GetProperty("Attributes").SetValue((object)em, (object)attrs);
                    res = new RetrieveEntityResponse();
                    res["EntityMetadata"] = em;
                }
            }
            return(res);
        }
示例#2
0
        public OrganizationResponse Execute(OrganizationRequest request)
        {
            if (request.GetType().Name == "RetrieveMultipleRequest")
            {
                RetrieveMultipleResponse response = new RetrieveMultipleResponse();
                EntityCollection         result   = RetrieveMultiple((( RetrieveMultipleRequest )request).Query);
                response.Results["EntityCollection"] = result;
                return(response);
            }
            else if (request.GetType().Name == "RetrieveRequest")
            {
                RetrieveResponse response        = new RetrieveResponse();
                RetrieveRequest  retrieveRequest = ( RetrieveRequest )request;
                EntityReference  target          = retrieveRequest.Target;


                if (target.GetType().Name == "TargetRetrieveDynamic")
                {
                    /*
                     * TargetRetrieveDynamic trd = ( TargetRetrieveDynamic )target;
                     *      response.Entity = Retrieve( trd.EntityName, trd.EntityId, retrieveRequest.ColumnSet );
                     */
                }


                // TODO: entity is readonly .. will have to set this with reflection
                // response.Entity = Retrieve( target.LogicalName, target.Id, retrieveRequest.ColumnSet );

                else
                {
                    // request sent using a specific strongly-typed business entity
                    // rather than a DynamicEntity
                    throw new NotImplementedException();
                }
                return(response);
            }
            else if (request.GetType().Name == "CreateRequest")
            {
                CreateResponse response = new CreateResponse();
                Guid           result   = Create((( CreateRequest )request).Target);
                response.Results["id"] = result;
                return(response);
            }
            else if (request.GetType().Name == "UpdateRequest")
            {
                UpdateResponse response = new UpdateResponse();
                Update((( UpdateRequest )request).Target);
                return(response);
            }
            else
            {
                throw new NotImplementedException();
            }
        }
示例#3
0
        private Tuple <object, string, Guid> GetEntityInfo(OrganizationRequest request)
        {
            Mappings.EntityImageProperty.TryGetValue(request.GetType(), out string key);
            object obj = null;

            if (key != null)
            {
                obj = request.Parameters[key];
            }
            if (request is WinOpportunityRequest || request is LoseOpportunityRequest)
            {
                var close = request is WinOpportunityRequest
                    ? (request as WinOpportunityRequest).OpportunityClose
                    : (request as LoseOpportunityRequest).OpportunityClose;
                obj = close.GetAttributeValue <EntityReference>("opportunityid");
            }

            if (obj != null)
            {
                var entity    = obj as Entity;
                var entityRef = obj as EntityReference;

                if (entity != null)
                {
                    return(new Tuple <object, string, Guid>(obj, entity.LogicalName, entity.Id));
                }
                else
                {
                    return(new Tuple <object, string, Guid>(obj, entityRef.LogicalName, entityRef.Id));
                }
            }
            return(null);
        }
示例#4
0
        private Tuple <object, string, Guid> GetEntityInfo(OrganizationRequest request)
        {
            Mappings.EntityImageProperty.TryGetValue(request.GetType(), out string key);
            object obj = null;

            if (key != null)
            {
                obj = request.Parameters[key];
            }

            if (request is WinOpportunityRequest || request is LoseOpportunityRequest)
            {
                var close = request is WinOpportunityRequest
                    ? (request as WinOpportunityRequest).OpportunityClose
                    : (request as LoseOpportunityRequest).OpportunityClose;
                obj = close.GetAttributeValue <EntityReference>("opportunityid");
            }
            else if (request is RetrieveMultipleRequest)
            {
                var retrieve = request as RetrieveMultipleRequest;

                string entityName = null;
                switch (retrieve.Query)
                {
                case FetchExpression fe:
                    var qe = XmlHandling.FetchXmlToQueryExpression(fe.Query);
                    entityName = qe.EntityName;
                    break;

                case QueryExpression query:
                    entityName = query.EntityName;
                    break;

                case QueryByAttribute qba:
                    entityName = qba.EntityName;
                    break;
                }

                if (entityName != null)
                {
                    return(new Tuple <object, string, Guid>(new EntityReference
                    {
                        LogicalName = entityName,
                        Id = Guid.Empty
                    }, entityName, Guid.Empty));
                }
            }

            if (obj is Entity entity)
            {
                return(new Tuple <object, string, Guid>(obj, entity.LogicalName, entity.Id));
            }

            if (obj is EntityReference entityRef)
            {
                return(new Tuple <object, string, Guid>(obj, entityRef.LogicalName, entityRef.Id));
            }

            return(null);
        }
        public static void SetRequest(this XrmFakedPluginExecutionContext context, OrganizationRequest request)
        {
            var clone      = (OrganizationRequest)Activator.CreateInstance(request.GetType());
            var properties = request.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public)
                             .Where(p => p.GetCustomAttribute <DataMemberAttribute>() == null)
                             .Where(p => !p.GetIndexParameters().Any())
                             .Where(p => p.CanRead && p.CanWrite);

            foreach (var propertyInfo in properties)
            {
                propertyInfo.SetValue(clone, propertyInfo.GetValue(request));
            }

            context.MessageName = clone.RequestName;
            foreach (var parameter in clone.Parameters)
            {
                context.InputParameters[parameter.Key] = parameter.Value;
            }
        }
示例#6
0
        /// <summary>
        /// Выполнение запроса.
        /// </summary>
        /// <param name="request">Содержимое запроса.</param>
        /// <returns>
        /// Метод возвращает ответ, на запрос.
        /// </returns>
        /// <remarks>
        /// <para>Поддерживаемые типы запросов:</para>
        /// <list type="bullet">
        /// <item><see cref="Microsoft.Xrm.Sdk.Messages.RetrieveAttributeRequest"/></item>
        /// <item><see cref="RetrieveEntityRequest"/></item>
        /// <item><see cref="RetrieveAllEntitiesRequest"/></item>
        /// <item><see cref="Microsoft.Xrm.Sdk.Messages.ExecuteMultipleRequest"/></item>
        /// </list>
        /// </remarks>
        public virtual OrganizationResponse Execute(OrganizationRequest request)
        {
            ExecutedRequests.Add(request);
            var sb = new StringBuilder();
            OrganizationResponse response;

            try
            {
                switch (request)
                {
                case RetrieveAttributeRequest retrieveAttributeRequest:
                    sb.AppendLine("=== Retrieve Attribute Request ===");
                    sb.AppendLine();
                    response = UseRetrieveAttributeRequest(retrieveAttributeRequest);
                    break;

                case RetrieveEntityRequest retrieveEntityRequest:
                    sb.AppendLine("=== Retrieve Entity Request ===");
                    sb.AppendLine();
                    response = UseRetrieveEntityRequest(retrieveEntityRequest);
                    break;

                case RetrieveAllEntitiesRequest retrieveAllEntitiesRequest:
                    sb.AppendLine("=== Retrieve All Entities Request ===");
                    sb.AppendLine();
                    response = UseRetrieveAllEntitiesRequest(retrieveAllEntitiesRequest);
                    break;

                case ExecuteMultipleRequest executeMultipleRequest:
                    sb.AppendLine("=== Set State Request ===");
                    sb.AppendLine();
                    response = UseExecuteMultipleRequest(executeMultipleRequest);
                    break;

                case SetStateRequest setStateRequest:
                    sb.AppendLine("=== Set State Request ===");
                    sb.AppendLine();
                    sb.AppendLine(setStateRequest.ToPlainText());
                    response = UseSetStateRequest(setStateRequest);
                    break;

                default:
                    throw new NotImplementedException(request.GetType().ToString());
                }
            }
            catch (Exception)
            {
                System.Diagnostics.Trace.WriteLine(sb.ToString());
                throw;
            }
            System.Diagnostics.Trace.WriteLine(sb.ToString());
            return(response);
        }
        public OrganizationResponse Execute(OrganizationRequest request)
        {
            Log.Debug(
                $"Executing {request.RequestName} message ({(!_readOnly ? "Live execution on Dynamics" : "Simulation only")})...");

            if (_readOnly &&
                !_allowedMessagesWhenActionChangesDisabled.Contains(request.GetType()))
            {
                Log.Debug($"Message type {request} has been simulated because connection is Read Only...");
                return(null);
            }

            Log.Debug(
                $"Executing {request.RequestName} message on Dynamics...");
            return(_crmService.Execute(request));
        }
示例#8
0
        private static string GetRequestDescription(OrganizationRequest request)
        {
            var result = request.GetType().Name;

            if (request is CreateRequest)
            {
                return(result + " - Type = " + ((CreateRequest)request).Target.LogicalName);
            }
            else if (request is UpdateRequest)
            {
                var tRequest = ((UpdateRequest)request);
                return(result + " Type = " + tRequest.Target.LogicalName + ", Id = " + tRequest.Target.Id);
            }
            else if (request is RetrieveRequest)
            {
                var tRequest = ((RetrieveRequest)request);
                return(result + " Type = " + tRequest.Target.LogicalName + ", Id = " + tRequest.Target.Id);
            }
            else if (request is RetrieveMultipleRequest)
            {
                var tRequest = ((RetrieveMultipleRequest)request);
                if (tRequest.Query is QueryExpression)
                {
                    return(result + " Type = " + ((QueryExpression)tRequest.Query).EntityName);
                }
            }
            else if (request is RetrieveEntityRequest)
            {
                var tRequest = ((RetrieveEntityRequest)request);
                return(result + " Type = " + tRequest.LogicalName + ", Filters = " + tRequest.EntityFilters);
            }
            else if (request is AssociateRequest)
            {
                var tRequest = ((AssociateRequest)request);
                return(result + " Relationship = " + tRequest.Relationship.SchemaName + ", Type = " +
                       tRequest.Target.LogicalName + ", Id = " + tRequest.Target.Id + ", Related = " +
                       String.Join <Guid?>(", ", tRequest.RelatedEntities.Select(XrmEntity.GetLookupGuid)));
            }
            else if (request is DisassociateRequest)
            {
                var tRequest = ((DisassociateRequest)request);
                return(result + " Relationship = " + tRequest.Relationship.SchemaName + ", Type = " +
                       tRequest.Target.LogicalName + ", Id = " + tRequest.Target.Id + ", Related = " +
                       String.Join <Guid?>(", ", tRequest.RelatedEntities.Select(XrmEntity.GetLookupGuid)));
            }
            return(result);
        }
示例#9
0
        private OrganizationResponse ExecuteWithSyncMetadataHandling(OrganizationRequest request)
        {
            ThrowExceptionIfDisposed();

            try
            {
                var response = _serviceProxy.Execute(request);

                if (response is RetrieveEntityResponse retrieveEntityResponse && retrieveEntityResponse.EntityMetadata != null)
                {
                    this.ConnectionData.EntitiesIntellisenseData.LoadData(retrieveEntityResponse.EntityMetadata);
                }

                //if (response is RetrieveAttributeResponse retrieveAttributeResponse && retrieveAttributeResponse.AttributeMetadata != null)
                //{
                //    this.ConnectionData.IntellisenseData.LoadData(retrieveAttributeResponse.AttributeMetadata);
                //}

                //if (response is RetrieveRelationshipResponse retrieveRelationshipResponse && retrieveRelationshipResponse.RelationshipMetadata != null)
                //{
                //    this.ConnectionData.IntellisenseData.LoadData(retrieveRelationshipResponse.RelationshipMetadata);
                //}

                if (response is RetrieveMetadataChangesResponse retrieveMetadataChangesResponse && retrieveMetadataChangesResponse.EntityMetadata != null)
                {
                    this.ConnectionData.EntitiesIntellisenseData.LoadSomeData(retrieveMetadataChangesResponse.EntityMetadata);
                }

                if (response is RetrieveAllEntitiesResponse retrieveAllEntitiesResponse && retrieveAllEntitiesResponse.EntityMetadata != null)
                {
                    this.ConnectionData.EntitiesIntellisenseData.LoadFullData(retrieveAllEntitiesResponse.EntityMetadata);
                }

                return(response);
            }
            catch (Exception ex)
            {
                var serializer = new DataContractSerializer(request.GetType());

                string serializeString = GetSerializedString(serializer, request);

                Helpers.DTEHelper.WriteExceptionToLog(ex, $"OrganizationServiceExtentedProxy.ExecuteWithSyncMetadataHandling{Environment.NewLine}{serializeString}");
                throw;
            }
        }
        public OrganizationResponse Execute(OrganizationRequest request)
        {
            if (request.GetType() == typeof(Microsoft.Xrm.Sdk.Messages.RetrieveMultipleRequest))
            {
                var req     = (Microsoft.Xrm.Sdk.Messages.RetrieveMultipleRequest)request;
                var results = this.RetrieveMultiple(req.Query);

                var response = new Microsoft.Xrm.Sdk.Messages.RetrieveMultipleResponse()
                {
                    Results = new ParameterCollection
                    {
                        { "EntityCollection", results }
                    }
                };
                return(response);
            }

            throw new NotImplementedException();
        }
示例#11
0
        /// <summary>
        /// Executa múltiplas requisições.
        /// </summary>
        /// <param name="collection">Registros a serem atualizados, criados ou deletados.</param>
        /// <param name="requestOperation">Operações válidas são UpdateRequest, CreateRequest e DeleteRequest.</param>
        public virtual KeyValuePair <ExecuteMultipleResponse, ExecuteMultipleRequest> ExecuteMultiple(List <T> collection, OrganizationRequest requestOperation)
        {
            ExecuteMultipleRequest request      = new ExecuteMultipleRequest();
            EntityCollection       listEntities = new EntityCollection();

            request.Settings = new ExecuteMultipleSettings()
            {
                ContinueOnError = true,
                ReturnResponses = true
            };

            request.Requests = new OrganizationRequestCollection();

            foreach (T entity in collection)
            {
                var ent = EntityConvert.Convert <T>(entity, this.OrganizationName, this.IsOffline);
                listEntities.Entities.Add(ent);
            }

            foreach (var entity in listEntities.Entities)
            {
                if (requestOperation.GetType() == typeof(UpdateRequest))
                {
                    requestOperation = new UpdateRequest()
                    {
                        Target = entity
                    };
                }
                else if (requestOperation.GetType() == typeof(CreateRequest))
                {
                    requestOperation = new CreateRequest()
                    {
                        Target = entity
                    };
                }

                request.Requests.Add(requestOperation);
            }

            return(new KeyValuePair <ExecuteMultipleResponse, ExecuteMultipleRequest>((ExecuteMultipleResponse)this.Provider.Execute(request), request));
        }
示例#12
0
        public OrganizationResponse Execute(OrganizationRequest request)
        {
            var message = new RemoteDebuggerMessage(RemoteDebuggerMessageType.Request, request, Context.Id)
            {
                UserId = UserId
            };

            var hybridResponse = _onRequestSent(message);

            var responseTemp = hybridResponse.GetOrganizationResponse();

            var typeName = request.GetType().AssemblyQualifiedName.Replace("Request", "Response");

            var type = Type.GetType(typeName);

            var response = (OrganizationResponse)Activator.CreateInstance(type);

            response.Results = responseTemp.Results;

            return(response);
        }
示例#13
0
        internal OrganizationResponse Execute(OrganizationRequest request, EntityReference userRef, PluginContext parentPluginContext)
        {
            // Setup
            dataMethods.HandleInternalPreOperations(request, userRef);

            var primaryRef = Mappings.GetPrimaryEntityReferenceFromRequest(request);

            // Create the plugin context
            var pluginContext = new PluginContext()
            {
                UserId            = userRef.Id,
                InitiatingUserId  = userRef.Id,
                MessageName       = RequestNameToMessageName(request.RequestName),
                Depth             = 1,
                OrganizationName  = dataMethods.OrganizationName,
                OrganizationId    = dataMethods.OrganizationId,
                PrimaryEntityName = primaryRef?.LogicalName,
            };

            if (primaryRef != null)
            {
                pluginContext.PrimaryEntityId = dataMethods.GetEntityId(primaryRef).GetValueOrDefault();
            }

            foreach (var prop in request.Parameters)
            {
                pluginContext.InputParameters[prop.Key] = prop.Value;
            }
            if (parentPluginContext != null)
            {
                pluginContext.ParentContext = parentPluginContext;
                pluginContext.Depth         = parentPluginContext.Depth + 1;
            }
            var buRef = GetBusinessUnit(userRef);

            Console.WriteLine($"User GUID: {userRef.Id}");
            Console.WriteLine($"BU GUID: {buRef.Id}");
            pluginContext.BusinessUnitId = buRef.Id;

            Mappings.RequestToEventOperation.TryGetValue(request.GetType(), out EventOperation? eventOp);

            var    entityInfo = GetEntityInfo(request);
            Entity preImage   = null;
            Entity postImage  = null;

            var settings = MockupExecutionContext.GetSettings(request);

            // Validation
            if (!settings.SetUnsettableFields && (request is UpdateRequest || request is CreateRequest))
            {
                var entity = request is UpdateRequest ? (request as UpdateRequest).Target : (request as CreateRequest).Target;
                dataMethods.RemoveUnsettableAttributes(request.RequestName, entity);
            }


            // Pre operation
            if (settings.TriggerProcesses && entityInfo != null)
            {
                preImage = TryRetrieve(primaryRef);
                if (preImage != null)
                {
                    primaryRef.Id = preImage.Id;
                }
                if (eventOp.HasValue)
                {
                    pluginManager.Trigger(eventOp.Value, ExecutionStage.PreOperation, entityInfo.Item1, preImage, postImage, pluginContext, this);
                    workflowManager.Trigger(eventOp.Value, ExecutionStage.PreOperation, entityInfo.Item1, preImage, postImage, pluginContext, this);
                }
            }
            // Core operation
            OrganizationResponse response = ExecuteRequest(request, userRef, parentPluginContext);


            // Post operation
            if (settings.TriggerProcesses && entityInfo != null)
            {
                postImage = TryRetrieve(primaryRef);
                if (eventOp.HasValue)
                {
                    pluginManager.Trigger(eventOp.Value, ExecutionStage.PostOperation, entityInfo.Item1, preImage, postImage, pluginContext, this);
                    workflowManager.Trigger(eventOp.Value, ExecutionStage.PostOperation, entityInfo.Item1, preImage, postImage, pluginContext, this);
                }
                workflowManager.ExecuteWaitingWorkflows(pluginContext, this);
            }

            return(response);
        }
示例#14
0
        internal OrganizationResponse Execute(OrganizationRequest request, EntityReference userRef, PluginContext parentPluginContext)
        {
            // Setup
            HandleInternalPreOperations(request, userRef);

            var primaryRef = Mappings.GetPrimaryEntityReferenceFromRequest(request);

            // Create the plugin context
            var pluginContext = new PluginContext()
            {
                UserId            = userRef.Id,
                InitiatingUserId  = userRef.Id,
                MessageName       = RequestNameToMessageName(request.RequestName),
                Depth             = 1,
                OrganizationName  = this.OrganizationName,
                OrganizationId    = this.OrganizationId,
                PrimaryEntityName = primaryRef?.LogicalName,
            };

            if (primaryRef != null)
            {
                var refEntity = db.GetEntityOrNull(primaryRef);
                pluginContext.PrimaryEntityId = refEntity == null ? Guid.Empty : refEntity.Id;
            }

            foreach (var prop in request.Parameters)
            {
                pluginContext.InputParameters[prop.Key] = prop.Value;
            }
            if (parentPluginContext != null)
            {
                pluginContext.ParentContext = parentPluginContext;
                pluginContext.Depth         = parentPluginContext.Depth + 1;
            }
            var buRef = GetBusinessUnit(userRef);

            pluginContext.BusinessUnitId = buRef.Id;

            Mappings.RequestToEventOperation.TryGetValue(request.GetType(), out EventOperation? eventOp);

            var entityInfo = GetEntityInfo(request);

            var settings = MockupExecutionContext.GetSettings(request);

            // Validation
            if (!settings.SetUnsettableFields && (request is UpdateRequest || request is CreateRequest))
            {
                var entity = request is UpdateRequest ? (request as UpdateRequest).Target : (request as CreateRequest).Target;
                Utility.RemoveUnsettableAttributes(request.RequestName, metadata.EntityMetadata.GetMetadata(entity.LogicalName), entity);
            }

            Entity preImage  = null;
            Entity postImage = null;

            if (settings.TriggerProcesses && entityInfo != null)
            {
                preImage = TryRetrieve(primaryRef);
                if (preImage != null)
                {
                    primaryRef.Id = preImage.Id;
                }
            }

            if (settings.TriggerProcesses && entityInfo != null && eventOp.HasValue)
            {
                // System Pre-validation
                pluginManager.TriggerSystem(eventOp.Value, ExecutionStage.PreValidation, entityInfo.Item1, preImage, postImage, pluginContext, this);
                // Pre-validation
                pluginManager.Trigger(eventOp.Value, ExecutionStage.PreValidation, entityInfo.Item1, preImage, postImage, pluginContext, this);

                // Shared variables should be moved to parent context when transitioning from 10 to 20.
                pluginContext.ParentContext = pluginContext.Clone();
                pluginContext.SharedVariables.Clear();

                // Pre-operation
                pluginManager.Trigger(eventOp.Value, ExecutionStage.PreOperation, entityInfo.Item1, preImage, postImage, pluginContext, this);
                workflowManager.Trigger(eventOp.Value, ExecutionStage.PreOperation, entityInfo.Item1, preImage, postImage, pluginContext, this);

                // System Pre-operation
                pluginManager.TriggerSystem(eventOp.Value, ExecutionStage.PreOperation, entityInfo.Item1, preImage, postImage, pluginContext, this);
            }

            // Core operation
            OrganizationResponse response = ExecuteRequest(request, userRef, parentPluginContext);

            // Post-operation
            if (settings.TriggerProcesses && entityInfo != null)
            {
                postImage = TryRetrieve(primaryRef);
                if (eventOp.HasValue)
                {
                    pluginManager.TriggerSystem(eventOp.Value, ExecutionStage.PostOperation, entityInfo.Item1, preImage, postImage, pluginContext, this);
                    pluginManager.Trigger(eventOp.Value, ExecutionStage.PostOperation, entityInfo.Item1, preImage, postImage, pluginContext, this);
                    workflowManager.Trigger(eventOp.Value, ExecutionStage.PostOperation, entityInfo.Item1, preImage, postImage, pluginContext, this);
                }
                workflowManager.ExecuteWaitingWorkflows(pluginContext, this);
            }

            return(response);
        }
 public OrganizationResponse Execute(OrganizationRequest request, XrmFakedContext ctx)
 {
     throw PullRequestException.NotImplementedOrganizationRequest(request.GetType());
 }
示例#16
0
 public OrganizationResponse Execute(OrganizationRequest request, XrmFakedContext ctx)
 {
     throw PullRequestException.NotImplementedOrganizationRequest(request.GetType());
 }
示例#17
0
        internal OrganizationResponse Execute(OrganizationRequest request, EntityReference userRef, PluginContext parentPluginContext)
        {
            // Setup
            HandleInternalPreOperations(request, userRef);

            var primaryRef = Mappings.GetPrimaryEntityReferenceFromRequest(request);

            // Create the plugin context
            var pluginContext = new PluginContext()
            {
                UserId            = userRef.Id,
                InitiatingUserId  = userRef.Id,
                MessageName       = RequestNameToMessageName(request.RequestName),
                Depth             = 1,
                OrganizationName  = this.OrganizationName,
                OrganizationId    = this.OrganizationId,
                PrimaryEntityName = primaryRef?.LogicalName,
            };

            if (primaryRef != null)
            {
                var refEntity = db.GetEntityOrNull(primaryRef);
                pluginContext.PrimaryEntityId = refEntity == null ? Guid.Empty : refEntity.Id;
            }

            foreach (var prop in request.Parameters)
            {
                pluginContext.InputParameters[prop.Key] = prop.Value;
            }
            if (parentPluginContext != null)
            {
                pluginContext.ParentContext = parentPluginContext;
                pluginContext.Depth         = parentPluginContext.Depth + 1;
            }
            var buRef = GetBusinessUnit(userRef);

            pluginContext.BusinessUnitId = buRef.Id;

            Mappings.RequestToEventOperation.TryGetValue(request.GetType(), out string eventOp);
            if (string.IsNullOrEmpty(eventOp))
            {
                //then this may be a custom action request, so continue with the request name
                if (request.RequestName.Contains("_")) //if we have a prefix then assume it is a custom action
                {
                    eventOp = request.RequestName.ToLower();
                }
            }


            var entityInfo = GetEntityInfo(request);

            var settings = MockupExecutionContext.GetSettings(request);

            // Validation
            if (!settings.SetUnsettableFields && (request is UpdateRequest || request is CreateRequest))
            {
                var entity = request is UpdateRequest ? (request as UpdateRequest).Target : (request as CreateRequest).Target;
                Utility.RemoveUnsettableAttributes(request.RequestName, metadata.EntityMetadata.GetMetadata(entity.LogicalName), entity);
            }

            Entity preImage  = null;
            Entity postImage = null;

            if (settings.TriggerProcesses && entityInfo != null)
            {
                preImage = TryRetrieve(primaryRef);
                if (preImage != null)
                {
                    primaryRef.Id = preImage.Id;
                }
            }

            if (settings.TriggerProcesses && entityInfo != null && !string.IsNullOrEmpty(eventOp))
            {
                // System Pre-validation
                pluginManager.TriggerSystem(eventOp, ExecutionStage.PreValidation, entityInfo.Item1, preImage, postImage, pluginContext, this);
                // Pre-validation
                pluginManager.Trigger(eventOp, ExecutionStage.PreValidation, entityInfo.Item1, preImage, postImage, pluginContext, this);

                // Shared variables should be moved to parent context when transitioning from 10 to 20.
                pluginContext.ParentContext = pluginContext.Clone();
                pluginContext.SharedVariables.Clear();

                // Pre-operation
                pluginManager.Trigger(eventOp, ExecutionStage.PreOperation, entityInfo.Item1, preImage, postImage, pluginContext, this);
                workflowManager.TriggerSync(eventOp, ExecutionStage.PreOperation, entityInfo.Item1, preImage, postImage, pluginContext, this);

                // System Pre-operation
                pluginManager.TriggerSystem(eventOp, ExecutionStage.PreOperation, entityInfo.Item1, preImage, postImage, pluginContext, this);
            }

            // Core operation
            OrganizationResponse response = ExecuteRequest(request, userRef, parentPluginContext);

            // Post-operation
            if (settings.TriggerProcesses && entityInfo != null)
            {
                postImage = TryRetrieve(primaryRef);

                // In RetrieveMultipleRequests, the OutputParameters bag contains the entity collection
                if (request is RetrieveMultipleRequest)
                {
                    pluginContext.OutputParameters["BusinessEntityCollection"] = (response as RetrieveMultipleResponse)?.EntityCollection;
                }

                if (!string.IsNullOrEmpty(eventOp))
                {
                    //copy the createon etc system attributes onto the target so they are available for postoperation processing
                    CopySystemAttributes(postImage, entityInfo.Item1 as Entity);

                    pluginManager.TriggerSystem(eventOp, ExecutionStage.PostOperation, entityInfo.Item1, preImage, postImage, pluginContext, this);
                    pluginManager.TriggerSync(eventOp, ExecutionStage.PostOperation, entityInfo.Item1, preImage, postImage, pluginContext, this);
                    pluginManager.StageAsync(eventOp, ExecutionStage.PostOperation, entityInfo.Item1, preImage, postImage, pluginContext, this);

                    workflowManager.TriggerSync(eventOp, ExecutionStage.PostOperation, entityInfo.Item1, preImage, postImage, pluginContext, this);
                    workflowManager.StageAsync(eventOp, ExecutionStage.PostOperation, entityInfo.Item1, preImage, postImage, pluginContext, this);
                }

                //When last Sync has been executed we trigger the Async jobs.
                if (parentPluginContext == null)
                {
                    pluginManager.TriggerAsyncWaitingJobs();
                    workflowManager.TriggerAsync(this);
                }
                workflowManager.ExecuteWaitingWorkflows(pluginContext, this);
            }
            return(response);
        }
示例#18
0
 public OrganizationResponse Execute(OrganizationRequest request)
 {
     OrganizationResponse res = null;
     if (request != null)
     {
         if (request.GetType() == typeof(WhoAmIRequest))
         {
             if (_connectionString == "INCORRECT_CONNECTION_STRING") throw new Exception("incorrect connection string");
             res = new WhoAmIResponse();
             res["BusinessUnitId"] = new Guid("73174763-ed0e-4aeb-b02a-9f6dc078260a");
             res["OrganizationId"] = new Guid("73174763-ed0e-4aeb-b02a-9f6dc078260a");
             res["UserId"] = new Guid("73174763-ed0e-4aeb-b02a-9f6dc078260a");
         }
         else if (request.GetType() == typeof(RetrieveEntityRequest))
         {
             var em = new EntityMetadata() { SchemaName = "myEntity" };
             AttributeMetadata attr1 = (AttributeMetadata)typeof(AttributeMetadata).GetConstructor(BindingFlags.NonPublic | BindingFlags.CreateInstance | BindingFlags.Instance, null, new Type[] { typeof(AttributeTypeCode), typeof(string) }, null)
                                         .Invoke(new Object[] { AttributeTypeCode.Integer, "prop1" });
             attr1.LogicalName = "prop1";
             var attrs = new AttributeMetadata[] { attr1 };
             em.GetType().GetProperty("Attributes").SetValue(em, attrs);
             res = new RetrieveEntityResponse();
             res["EntityMetadata"] = em;
         }
     }
     return res;
 }
示例#19
0
        internal OrganizationResponse Execute(OrganizationRequest request, EntityReference userRef,
                                              PluginContext parentPluginContext)
        {
            // Setup
            HandleInternalPreOperations(request, userRef);

            var primaryRef = Mappings.GetPrimaryEntityReferenceFromRequest(request);

            // Create the plugin context
            var pluginContext = new PluginContext()
            {
                UserId            = userRef.Id,
                InitiatingUserId  = userRef.Id,
                MessageName       = RequestNameToMessageName(request.RequestName),
                Depth             = 1,
                ExtensionDepth    = 1,
                OrganizationName  = this.OrganizationName,
                OrganizationId    = this.OrganizationId,
                PrimaryEntityName = primaryRef?.LogicalName,
            };

            if (primaryRef != null)
            {
                var refEntity = db.GetEntityOrNull(primaryRef);
                pluginContext.PrimaryEntityId = refEntity == null ? Guid.Empty : refEntity.Id;
            }

            foreach (var prop in request.Parameters)
            {
                pluginContext.InputParameters[prop.Key] = prop.Value;
            }

            if (parentPluginContext != null)
            {
                pluginContext.ParentContext        = parentPluginContext;
                pluginContext.Depth                = parentPluginContext.Depth + 1;
                pluginContext.ExtensionDepth       = parentPluginContext.ExtensionDepth + 1;
                parentPluginContext.ExtensionDepth = pluginContext.ExtensionDepth;
            }

            var buRef = GetBusinessUnit(userRef);

            pluginContext.BusinessUnitId = buRef.Id;

            Mappings.RequestToEventOperation.TryGetValue(request.GetType(), out string eventOp);

            var entityInfo = GetEntityInfo(request);

            var settings = MockupExecutionContext.GetSettings(request);

            // Validation
            if (!settings.SetUnsettableFields && (request is UpdateRequest || request is CreateRequest))
            {
                var entity = request is UpdateRequest
                    ? (request as UpdateRequest).Target
                    : (request as CreateRequest).Target;
                Utility.RemoveUnsettableAttributes(request.RequestName,
                                                   metadata.EntityMetadata.GetMetadata(entity.LogicalName), entity);
            }

            Entity preImage  = null;
            Entity postImage = null;

            if (settings.TriggerProcesses && entityInfo != null)
            {
                preImage = TryRetrieve(primaryRef);
                if (preImage != null)
                {
                    primaryRef.Id = preImage.Id;
                }
            }

            if (settings.TriggerProcesses && entityInfo != null)
            {
                // System Pre-validation
                pluginManager.TriggerSystem(eventOp, ExecutionStage.PreValidation, entityInfo.Item1, preImage, postImage, pluginContext, this);
                // Pre-validation
                pluginManager.Trigger(eventOp, ExecutionStage.PreValidation, entityInfo.Item1, preImage, postImage, pluginContext, this);
            }

            //perform security checks for the request
            CheckRequestSecurity(request, userRef);

            if (settings.TriggerProcesses && entityInfo != null)
            {
                // Shared variables should be moved to parent context when transitioning from 10 to 20.
                pluginContext.ParentContext = pluginContext.Clone();
                pluginContext.SharedVariables.Clear();

                // Pre-operation
                pluginManager.Trigger(eventOp, ExecutionStage.PreOperation, entityInfo.Item1, preImage, postImage, pluginContext, this);
                workflowManager.TriggerSync(eventOp, ExecutionStage.PreOperation, entityInfo.Item1, preImage, postImage, pluginContext, this);

                // System Pre-operation
                pluginManager.TriggerSystem(eventOp, ExecutionStage.PreOperation, entityInfo.Item1, preImage, postImage, pluginContext, this);
            }

            // Core operation
            OrganizationResponse response = ExecuteRequest(request, userRef, parentPluginContext);

            // Post-operation
            if (settings.TriggerProcesses && entityInfo != null)
            {
                postImage = TryRetrieve(primaryRef);

                // In RetrieveMultipleRequests, the OutputParameters bag contains the entity collection
                if (request is RetrieveMultipleRequest)
                {
                    pluginContext.OutputParameters["BusinessEntityCollection"] =
                        (response as RetrieveMultipleResponse)?.EntityCollection;
                }

                if (!string.IsNullOrEmpty(eventOp))
                {
                    //copy the createon etc system attributes onto the target so they are available for postoperation processing
                    CopySystemAttributes(postImage, entityInfo.Item1 as Entity);

                    pluginManager.TriggerSystem(eventOp, ExecutionStage.PostOperation, entityInfo.Item1, preImage, postImage, pluginContext, this);
                    pluginManager.TriggerSync(eventOp, ExecutionStage.PostOperation, entityInfo.Item1, preImage, postImage, pluginContext, this);
                    pluginManager.StageAsync(eventOp, ExecutionStage.PostOperation, entityInfo.Item1, preImage, postImage, pluginContext, this);

                    workflowManager.TriggerSync(eventOp, ExecutionStage.PostOperation, entityInfo.Item1, preImage, postImage, pluginContext, this);
                    workflowManager.StageAsync(eventOp, ExecutionStage.PostOperation, entityInfo.Item1, preImage, postImage, pluginContext, this);
                }

                //When last Sync has been executed we trigger the Async jobs.
                if (parentPluginContext == null)
                {
                    pluginManager.TriggerAsyncWaitingJobs();
                    workflowManager.TriggerAsync(this);
                }

                workflowManager.ExecuteWaitingWorkflows(pluginContext, this);
            }

#if XRM_MOCKUP_365
            // Trigger Extension
            if (this.settings.MockUpExtensions.Any())
            {
                /*
                 * When moving business units, more than eight layers occur...
                 */
                if (pluginContext.ExtensionDepth > 8)
                {
                    throw new FaultException(
                              "This workflow job was canceled because the workflow that started it included an infinite loop." +
                              " Correct the workflow logic and try again.");
                }
            }

            switch (request.RequestName)
            {
            case "Create":
                var createResponse    = (CreateResponse)response;
                var entityLogicalName = ((Entity)request.Parameters["Target"]).LogicalName;

                var createdEntity =
                    GetDbRow(new EntityReference(entityLogicalName, createResponse.id))
                    .ToEntity();
                TriggerExtension(
                    new XrmExtension(this, userRef, pluginContext), request,
                    createdEntity, null, userRef);
                break;

            case "Update":
                var target        = (Entity)request.Parameters["Target"];
                var updatedEntity = GetDbRow(target.ToEntityReferenceWithKeyAttributes()).ToEntity();
                TriggerExtension(
                    new XrmExtension(this, userRef, pluginContext), request,
                    updatedEntity, preImage, userRef);
                break;

            case "Delete":
                TriggerExtension(
                    new XrmExtension(this, userRef, pluginContext), request,
                    null, preImage, userRef);
                break;
            }
#endif

            return(response);
        }
示例#20
0
 private static string GetRequestDescription(OrganizationRequest request)
 {
     var result = request.GetType().Name;
     if (request is CreateRequest)
     {
         return result + " - Type = " + ((CreateRequest) request).Target.LogicalName;
     }
     else if (request is UpdateRequest)
     {
         var tRequest = ((UpdateRequest) request);
         return result + " Type = " + tRequest.Target.LogicalName + ", Id = " + tRequest.Target.Id;
     }
     else if (request is RetrieveRequest)
     {
         var tRequest = ((RetrieveRequest) request);
         return result + " Type = " + tRequest.Target.LogicalName + ", Id = " + tRequest.Target.Id;
     }
     else if (request is RetrieveMultipleRequest)
     {
         var tRequest = ((RetrieveMultipleRequest) request);
         if (tRequest.Query is QueryExpression)
             return result + " Type = " + ((QueryExpression) tRequest.Query).EntityName;
     }
     else if (request is RetrieveEntityRequest)
     {
         var tRequest = ((RetrieveEntityRequest) request);
         return result + " Type = " + tRequest.LogicalName + ", Filters = " + tRequest.EntityFilters;
     }
     else if (request is AssociateRequest)
     {
         var tRequest = ((AssociateRequest) request);
         return result + " Relationship = " + tRequest.Relationship.SchemaName + ", Type = " +
                tRequest.Target.LogicalName + ", Id = " + tRequest.Target.Id + ", Related = " +
                String.Join<Guid?>(", ", tRequest.RelatedEntities.Select(XrmEntity.GetLookupGuid));
     }
     else if (request is DisassociateRequest)
     {
         var tRequest = ((DisassociateRequest) request);
         return result + " Relationship = " + tRequest.Relationship.SchemaName + ", Type = " +
                tRequest.Target.LogicalName + ", Id = " + tRequest.Target.Id + ", Related = " +
                String.Join<Guid?>(", ", tRequest.RelatedEntities.Select(XrmEntity.GetLookupGuid));
     }
     return result;
 }
示例#21
0
        /// <summary>
        ///     Generates an organisation request that reverts the actions taken by the given request.
        /// </summary>
        /// <param name="service">The service.</param>
        /// <param name="request">The request to create a reverse for.</param>
        /// <returns>The reversion request.</returns>
        /// <exception cref="Exception">Undefined undo logic for request type!</exception>
        internal static OrganizationRequest GenerateReverseRequest(IOrganizationService service,
                                                                   OrganizationRequest request)
        {
            if (UndoLogicCache.ContainsKey(request.GetType()))
            {
                return(UndoLogicCache[request.GetType()](service, request));
            }

            if (request is ExecuteMultipleRequest)
            {
                var reversedRequest =
                    new ExecuteMultipleRequest
                {
                    Requests = new OrganizationRequestCollection(),
                    Settings =
                        new ExecuteMultipleSettings
                    {
                        ContinueOnError = true,
                        ReturnResponses = false
                    }
                };

                var requests = ((ExecuteMultipleRequest)request).Requests.ToList();

                requests.ForEach(requestQ => reversedRequest.Requests.Add(GenerateReverseRequest(service, requestQ)));

                return(reversedRequest);
            }

            if (request is CreateRequest)
            {
                if (((CreateRequest)request).Target.Id == Guid.Empty)
                {
                    ((CreateRequest)request).Target.Id = Guid.NewGuid();
                }

                return(new DeleteRequest
                {
                    Target = ((CreateRequest)request).Target.ToEntityReference()
                });
            }

            if (request is DeleteRequest)
            {
                var target    = ((DeleteRequest)request).Target;
                var oldTarget = service.Retrieve(target.LogicalName, target.Id, new ColumnSet(true));
                return(new CreateRequest
                {
                    Target = oldTarget
                });
            }

            if (request is AssociateRequest)
            {
                var requestTemp = (AssociateRequest)request;
                return(new DisassociateRequest
                {
                    Target = requestTemp.Target,
                    Relationship = requestTemp.Relationship,
                    RelatedEntities = requestTemp.RelatedEntities
                });
            }

            if (request is DisassociateRequest)
            {
                var requestTemp = (DisassociateRequest)request;
                return(new AssociateRequest
                {
                    Target = requestTemp.Target,
                    Relationship = requestTemp.Relationship,
                    RelatedEntities = requestTemp.RelatedEntities
                });
            }

            if (request is UpdateRequest)
            {
                var target  = ((UpdateRequest)request).Target;
                var columns = target.Attributes
                              .Where(pair => pair.Value != null)
                              .Select(pair => pair.Key).ToArray();
                var oldTarget = service.Retrieve(target.LogicalName, target.Id, new ColumnSet(columns));
                return(new UpdateRequest
                {
                    Target = oldTarget
                });
            }

            throw new Exception("Undefined undo for request type!");
        }
示例#22
0
 public bool CanExecute(OrganizationRequest request)
 {
     return(request.GetType().Equals(GetResponsibleRequestType()));
 }
示例#23
0
        public OrganizationResponse Execute( OrganizationRequest request )
        {
            if( request.GetType().Name == "RetrieveMultipleRequest" ) {
                RetrieveMultipleResponse response = new RetrieveMultipleResponse();
                EntityCollection result = RetrieveMultiple( ( ( RetrieveMultipleRequest )request ).Query );
                response.Results[ "EntityCollection" ] = result;
                return response;
            }
            else if(request.GetType().Name == "RetrieveRequest" ) {
                RetrieveResponse response = new RetrieveResponse();
                RetrieveRequest retrieveRequest = ( RetrieveRequest )request;
                EntityReference target = retrieveRequest.Target;

                if( target.GetType().Name == "TargetRetrieveDynamic" ) {
                /*
                    TargetRetrieveDynamic trd = ( TargetRetrieveDynamic )target;
                    response.Entity = Retrieve( trd.EntityName, trd.EntityId, retrieveRequest.ColumnSet );
                */
                }

                // TODO: entity is readonly .. will have to set this with reflection
                // response.Entity = Retrieve( target.LogicalName, target.Id, retrieveRequest.ColumnSet );

                else {
                        // request sent using a specific strongly-typed business entity
                        // rather than a DynamicEntity
                        throw new NotImplementedException();
                }
                return response;
            }
            else if( request.GetType().Name == "CreateRequest" ) {
                CreateResponse response = new CreateResponse();
                Guid result = Create( ( ( CreateRequest )request ).Target );
                response.Results[ "id" ] = result;
                return response;
            }
            else if( request.GetType().Name == "UpdateRequest" ) {
                UpdateResponse response = new UpdateResponse();
                Update( ( ( UpdateRequest )request).Target );
                return response;
            }
            else {
                throw new NotImplementedException();
            }
        }