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); }
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); }
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); }
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); }