public override void Apply(T ruleContext)
        {
            SC.Diagnostics.Assert.ArgumentNotNull(ruleContext, "ruleContext");
            SC.Diagnostics.Assert.ArgumentNotNull(
                ruleContext.Item,
                "ruleContext.Item");

            if (ruleContext.Item.IsStandardValuesOrBranchTemplate())
            {
                return;
            }

            SC.Diagnostics.Assert.ArgumentNotNullOrEmpty(
                this.WorkflowStateID,
                "WorkflowStateID");
            SC.Data.Items.Item workflowState =
                ruleContext.Item.Database.GetItem(this.WorkflowStateID);
            SC.Diagnostics.Assert.IsNotNull(workflowState, "workflowState");
            SC.Data.Templates.Template checkTemplate =
                SC.Data.Managers.TemplateManager.GetTemplate(workflowState);
            SC.Diagnostics.Assert.IsTrue(
                checkTemplate.InheritsFrom(SC.TemplateIDs.WorkflowState),
                "workflow state template");

            // when placing an item in a workflow state,
            // ensure the item is also in that workflow
            SC.Data.Items.Item workflow = workflowState.GetAncestorWithTemplateThatIsOrInheritsFrom(
                SC.TemplateIDs.Workflow);

            if (workflow == null)
            {
                throw new Exception("Unable to determine workflow from workflow command");
            }

            if (ruleContext.Item[SC.FieldIDs.WorkflowState] == this.WorkflowStateID &&
                ruleContext.Item[SC.FieldIDs.Workflow] == workflow.ID.ToString())
            {
                return;
            }

            using (new SC.Data.Items.EditContext(ruleContext.Item))
            {
                ruleContext.Item[SC.FieldIDs.WorkflowState] = this.WorkflowStateID;
                ruleContext.Item[SC.FieldIDs.Workflow]      = workflow.ID.ToString();
            }
        }
        public override void Apply(T ruleContext)
        {
            SC.Diagnostics.Assert.ArgumentNotNull(ruleContext, "ruleContext");
            SC.Diagnostics.Assert.ArgumentNotNull(
                ruleContext.Item,
                "ruleContext.Item");

            if (ruleContext.Item.IsStandardValuesOrBranchTemplate())
            {
                return;
            }

            SC.Diagnostics.Assert.ArgumentNotNullOrEmpty(
                this.WorkflowCommandID,
                "WorkflowCommandID");
            SC.Diagnostics.Assert.ArgumentNotNullOrEmpty(
                this.Comment,
                "Comment");
            SC.Data.Items.Item workflowCommand =
                ruleContext.Item.Database.GetItem(this.WorkflowCommandID);
            SC.Diagnostics.Assert.IsNotNull(workflowCommand, "workflowCommand");
            SC.Data.Templates.Template checkTemplate =
                SC.Data.Managers.TemplateManager.GetTemplate(workflowCommand);
            SC.Diagnostics.Assert.IsTrue(
                checkTemplate.InheritsFrom(SC.TemplateIDs.WorkflowCommand),
                "workflow command template");
            SC.Data.Items.Item commandWorkflow = workflowCommand.GetAncestorWithTemplateThatIsOrInheritsFrom(
                SC.TemplateIDs.Workflow);

            // before invoking a workflow command,
            // put the item in the appropriate workflow and workflow state
            if (commandWorkflow == null)
            {
                throw new Exception("Unable to determine workflow from workflow command");
            }

            SC.Data.Items.Item commandState = workflowCommand.GetAncestorWithTemplateThatIsOrInheritsFrom(
                SC.TemplateIDs.WorkflowState);

            if (commandState == null)
            {
                throw new Exception("Unable to determine workflow state from workflow command");
            }

            if (ruleContext.Item[SC.FieldIDs.Workflow] != commandWorkflow.ID.ToString())
            {
                using (new SC.Data.Items.EditContext(ruleContext.Item))
                {
                    ruleContext.Item[SC.FieldIDs.Workflow] = commandWorkflow.ID.ToString();
                }
            }

            if (ruleContext.Item[SC.FieldIDs.WorkflowState] != commandState.ID.ToString())
            {
                using (new SC.Data.Items.EditContext(ruleContext.Item))
                {
                    ruleContext.Item[SC.FieldIDs.WorkflowState] = commandState.ID.ToString();
                }
            }

            SC.Workflows.IWorkflow workflow = ruleContext.Item.State.GetWorkflow();
            SC.Diagnostics.Assert.IsNotNull(workflow, "workflow");
            workflow.Execute(
                this.WorkflowCommandID,
                ruleContext.Item,
                this.Comment,
                false,
                new object[] {});
        }