From 013d55357bd9969b7202668c7316483efa239d20 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Sun, 12 Jan 2014 17:42:28 +0100 Subject: [PATCH] Added Workflow State token provider. This token provider enables tokenized fields to access WorkflowContext state values. Example: {Workflow.State:MyData.MyProperty.SubProperty} --- .../Orchard.Workflows.csproj | 1 + .../Orchard.Workflows/Tokens/StateTokens.cs | 38 +++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 src/Orchard.Web/Modules/Orchard.Workflows/Tokens/StateTokens.cs diff --git a/src/Orchard.Web/Modules/Orchard.Workflows/Orchard.Workflows.csproj b/src/Orchard.Web/Modules/Orchard.Workflows/Orchard.Workflows.csproj index 5288fa22d..1f3c3cec5 100644 --- a/src/Orchard.Web/Modules/Orchard.Workflows/Orchard.Workflows.csproj +++ b/src/Orchard.Web/Modules/Orchard.Workflows/Orchard.Workflows.csproj @@ -176,6 +176,7 @@ + diff --git a/src/Orchard.Web/Modules/Orchard.Workflows/Tokens/StateTokens.cs b/src/Orchard.Web/Modules/Orchard.Workflows/Tokens/StateTokens.cs new file mode 100644 index 000000000..46bcf54ed --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Workflows/Tokens/StateTokens.cs @@ -0,0 +1,38 @@ +using System; +using System.Linq; +using Orchard.Tokens; +using Orchard.Workflows.Models; + +namespace Orchard.Workflows.Tokens { + public class StateTokens : Component, ITokenProvider { + + public void Describe(DescribeContext context) { + context.For("Workflow", T("Workflow"), T("Workflow tokens.")) + .Token("State:*", T("State:"), T("The workflow context state to access. Workflow.State:MyData.MyProperty.SubProperty")) + ; + } + + public void Evaluate(EvaluateContext context) { + context.For("Workflow") + .Token(token => token.StartsWith("State:", StringComparison.OrdinalIgnoreCase) ? token.Substring("State:".Length) : null, ParseState); + } + + /// + /// Resolves the specified expression into an object stored in WorkflowContext. + /// + /// The expression resolving to the state stored in WorkflowContext. E.g. "MyData.MyProperty.MySubProperty" + private object ParseState(string expression, WorkflowContext workflowContext) { + var path = expression.Split(new[] {'.'}, StringSplitOptions.RemoveEmptyEntries); + var first = path.First(); + var obj = (dynamic)workflowContext.GetState(first); + + if (path.Length > 1) { + foreach (var property in path.Skip(1)) { + obj = obj[property]; + } + } + + return obj; + } + } +} \ No newline at end of file