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); }
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(); } }
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); }
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; } }
/// <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)); }
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); }
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(); }
/// <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)); }
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); }
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); }
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()); }
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); }
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; }
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); }
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; }
/// <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!"); }
public bool CanExecute(OrganizationRequest request) { return(request.GetType().Equals(GetResponsibleRequestType())); }
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(); } }