private void TriggerUpdateConditionally(string newValue, Entity target, ProcessorConfig config, IOrganizationService service) { if (!config.TriggerUpdate) { return; } if (string.IsNullOrEmpty(config.TargetField)) { throw new InvalidPluginExecutionException("Target field is required when setting the 'triggerUpdate' flag"); } if (config.ForceUpdate || !string.Equals(target.GetAttributeValue <string>(config.TargetField), newValue)) { var updateObject = new Entity { LogicalName = target.LogicalName, Id = target.Id }; updateObject[config.TargetField] = newValue; service.Update(updateObject); } }
private void HandleCustomAction(IPluginExecutionContext context, PersistentTracingService tracing, IOrganizationService service) { var config = ProcessorConfig.Parse(context.InputParameters["jsonInput"] as string); if (config.Target == null) { throw new InvalidPluginExecutionException("Target property inside JSON parameters is needed for custom actions"); } ColumnSet columnSet; if (config.TargetColumns != null) { columnSet = new ColumnSet(config.TargetColumns); } else { columnSet = new ColumnSet(true); } try { var dataSource = service.Retrieve(config.Target.LogicalName, config.Target.Id, columnSet); if (!CheckExecutionCriteria(config, dataSource, service, tracing)) { tracing.Trace("Execution criteria not met, aborting"); var abortResult = new ProcessingResult { Success = true, Result = config.Template, TraceLog = tracing.TraceLog }; context.OutputParameters["jsonOutput"] = SerializeResult(abortResult); return; } var output = ProcessTemplate(tracing, service, dataSource, config.Template); var result = new ProcessingResult { Success = true, Result = output, TraceLog = tracing.TraceLog }; context.OutputParameters["jsonOutput"] = SerializeResult(result); } catch (Exception ex) { var result = new ProcessingResult { Success = false, Error = ex.Message, TraceLog = tracing.TraceLog }; context.OutputParameters["jsonOutput"] = SerializeResult(result); } }
private bool CheckExecutionCriteria(ProcessorConfig config, Entity dataSource, IOrganizationService service, ITracingService tracing) { if (!string.IsNullOrEmpty(config.ExecutionCriteria)) { var criteriaInterpreter = new XTLInterpreter(config.ExecutionCriteria, dataSource, _organizationConfig, service, tracing); var result = criteriaInterpreter.Produce(); var criteriaMatched = false; bool.TryParse(result, out criteriaMatched); if (!criteriaMatched) { return(false); } return(true); } return(true); }
public XTLProcessor(string unsecure, string secure) { _config = ProcessorConfig.Parse(unsecure); _organizationConfig = OrganizationConfig.Parse(secure); }
private void HandleCustomAction(IPluginExecutionContext context, PersistentTracingService tracing, IOrganizationService service) { var config = ProcessorConfig.Parse(context.InputParameters["jsonInput"] as string); if (config.Target == null && config.TargetEntity == null) { throw new InvalidPluginExecutionException("Target property inside JSON parameters is needed for custom actions"); } ColumnSet columnSet; if (config.TargetColumns != null) { columnSet = new ColumnSet(config.TargetColumns); } else { columnSet = new ColumnSet(true); } try { var dataSource = config.TargetEntity != null ? config.TargetEntity : service.Retrieve(config.Target.LogicalName, config.Target.Id, columnSet); if (!CheckExecutionCriteria(config, dataSource, service, tracing)) { tracing.Trace("Execution criteria not met, aborting"); var abortResult = new ProcessingResult { Success = true, Result = config.Template, TraceLog = tracing.TraceLog }; context.OutputParameters["jsonOutput"] = SerializeResult(abortResult); return; } var templateText = RetrieveTemplate(config.Template, config.TemplateField, dataSource, service, tracing); if (string.IsNullOrEmpty(templateText)) { tracing.Trace("Template is empty, aborting"); return; } var output = TokenMatcher.ProcessTokens(templateText, dataSource, new OrganizationConfig { OrganizationUrl = config.OrganizationUrl }, service, tracing); var result = new ProcessingResult { Success = true, Result = output, TraceLog = tracing.TraceLog }; context.OutputParameters["jsonOutput"] = SerializeResult(result); TriggerUpdateConditionally(output, dataSource, config, service); } catch (Exception ex) { var result = new ProcessingResult { Success = false, Error = ex.Message, TraceLog = tracing.TraceLog }; context.OutputParameters["jsonOutput"] = SerializeResult(result); if (config.ThrowOnCustomActionError) { throw; } } }