Changed Code Run activity to use generic UpdateAttributeIfNeededActivity

Few more source code comments and other minor cosmetic changes
master
Granfeldt_cp 2013-01-18 02:52:38 -08:00
parent fa136059fb
commit 58c857d05c
7 changed files with 42 additions and 154 deletions

Binary file not shown.

View File

@ -26,23 +26,12 @@ namespace Granfeldt.FIM.ActivityLibrary
private void InitializeComponent()
{
this.CanModifyActivities = true;
System.Workflow.Activities.CodeCondition codecondition1 = new System.Workflow.Activities.CodeCondition();
System.Workflow.ComponentModel.ActivityBind activitybind1 = new System.Workflow.ComponentModel.ActivityBind();
System.Workflow.ComponentModel.ActivityBind activitybind2 = new System.Workflow.ComponentModel.ActivityBind();
System.Workflow.Activities.CodeCondition codecondition1 = new System.Workflow.Activities.CodeCondition();
System.Workflow.Activities.CodeCondition codecondition2 = new System.Workflow.Activities.CodeCondition();
System.Workflow.Activities.CodeCondition codecondition3 = new System.Workflow.Activities.CodeCondition();
this.CatchAndArgumentException = new System.Workflow.Activities.CodeActivity();
this.faultHandlerActivity1 = new System.Workflow.ComponentModel.FaultHandlerActivity();
this.faultHandlersActivity3 = new System.Workflow.ComponentModel.FaultHandlersActivity();
this.UpdateTargetResource = new Microsoft.ResourceManagement.Workflow.Activities.UpdateResourceActivity();
this.NoUpdateNeeded = new System.Workflow.Activities.IfElseBranchActivity();
this.UpdateTarget = new System.Workflow.Activities.IfElseBranchActivity();
this.NullOrInvalidGrammar = new System.Workflow.Activities.CodeActivity();
this.CompareAndPrepareUpdate = new System.Workflow.Activities.IfElseActivity();
this.ReadTarget = new Microsoft.ResourceManagement.Workflow.Activities.ReadResourceActivity();
this.faultHandlerActivity2 = new System.Workflow.ComponentModel.FaultHandlerActivity();
this.ExitGracefully = new System.Workflow.Activities.CodeActivity();
this.UpdateIfNecessary = new System.Workflow.Activities.SequenceActivity();
this.UpdateTargetIfNeeded = new Granfeldt.FIM.ActivityLibrary.UpdateSingleValueAttributeAsNeededActivity();
this.faultHandlersActivity2 = new System.Workflow.ComponentModel.FaultHandlersActivity();
this.SaveResolvedParameterValue = new System.Workflow.Activities.CodeActivity();
this.ResolveParameterValue = new Microsoft.ResourceManagement.Workflow.Activities.ResolveGrammarActivity();
@ -50,84 +39,30 @@ namespace Granfeldt.FIM.ActivityLibrary
this.ConditionalUpdateTarget = new System.Workflow.Activities.IfElseBranchActivity();
this.faultHandlersActivity1 = new System.Workflow.ComponentModel.FaultHandlersActivity();
this.ResolveAndSave = new System.Workflow.Activities.SequenceActivity();
this.ShouldUpdateTarget = new System.Workflow.Activities.IfElseActivity();
this.ShouldUpdateTargetOrWorkflowData = new System.Workflow.Activities.IfElseActivity();
this.ExecuteCode = new System.Workflow.Activities.CodeActivity();
this.CompileCode = new System.Workflow.Activities.CodeActivity();
this.ResolveAllParameters = new System.Workflow.Activities.WhileActivity();
//
// CatchAndArgumentException
//
this.CatchAndArgumentException.Name = "CatchAndArgumentException";
this.CatchAndArgumentException.ExecuteCode += new System.EventHandler(this.CatchArgumentException_ExecuteCode);
//
// faultHandlerActivity1
//
this.faultHandlerActivity1.Activities.Add(this.CatchAndArgumentException);
this.faultHandlerActivity1.FaultType = typeof(System.ArgumentNullException);
this.faultHandlerActivity1.Name = "faultHandlerActivity1";
//
// faultHandlersActivity3
//
this.faultHandlersActivity3.Activities.Add(this.faultHandlerActivity1);
this.faultHandlersActivity3.Name = "faultHandlersActivity3";
//
// UpdateTargetResource
//
this.UpdateTargetResource.ActorId = new System.Guid("00000000-0000-0000-0000-000000000000");
this.UpdateTargetResource.ApplyAuthorizationPolicy = false;
this.UpdateTargetResource.Name = "UpdateTargetResource";
this.UpdateTargetResource.ResourceId = new System.Guid("00000000-0000-0000-0000-000000000000");
this.UpdateTargetResource.UpdateParameters = null;
//
// NoUpdateNeeded
//
this.NoUpdateNeeded.Name = "NoUpdateNeeded";
//
// UpdateTarget
//
this.UpdateTarget.Activities.Add(this.UpdateTargetResource);
this.UpdateTarget.Activities.Add(this.faultHandlersActivity3);
codecondition1.Condition += new System.EventHandler<System.Workflow.Activities.ConditionalEventArgs>(this.isTargetUpdateNeeded_Condition);
this.UpdateTarget.Condition = codecondition1;
this.UpdateTarget.Name = "UpdateTarget";
//
// NullOrInvalidGrammar
//
this.NullOrInvalidGrammar.Name = "NullOrInvalidGrammar";
this.NullOrInvalidGrammar.ExecuteCode += new System.EventHandler(this.NonExistingGrammarException_ExecuteCode);
//
// CompareAndPrepareUpdate
//
this.CompareAndPrepareUpdate.Activities.Add(this.UpdateTarget);
this.CompareAndPrepareUpdate.Activities.Add(this.NoUpdateNeeded);
this.CompareAndPrepareUpdate.Name = "CompareAndPrepareUpdate";
//
// ReadTarget
//
this.ReadTarget.ActorId = new System.Guid("00000000-0000-0000-0000-000000000000");
this.ReadTarget.Name = "ReadTarget";
activitybind1.Name = "CodeRunActivity";
activitybind1.Path = "TargetResource";
this.ReadTarget.ResourceId = new System.Guid("00000000-0000-0000-0000-000000000000");
this.ReadTarget.SelectionAttributes = null;
this.ReadTarget.SetBinding(Microsoft.ResourceManagement.Workflow.Activities.ReadResourceActivity.ResourceProperty, ((System.Workflow.ComponentModel.ActivityBind)(activitybind1)));
//
// faultHandlerActivity2
//
this.faultHandlerActivity2.Activities.Add(this.NullOrInvalidGrammar);
this.faultHandlerActivity2.FaultType = typeof(System.ArgumentException);
this.faultHandlerActivity2.Name = "faultHandlerActivity2";
//
// ExitGracefully
// UpdateTargetIfNeeded
//
this.ExitGracefully.Name = "ExitGracefully";
this.ExitGracefully.ExecuteCode += new System.EventHandler(this.ExitGracefully_ExecuteCode);
//
// UpdateIfNecessary
//
this.UpdateIfNecessary.Activities.Add(this.ReadTarget);
this.UpdateIfNecessary.Activities.Add(this.CompareAndPrepareUpdate);
this.UpdateIfNecessary.Name = "UpdateIfNecessary";
this.UpdateTargetIfNeeded.ActorId = new System.Guid("00000000-0000-0000-0000-000000000000");
this.UpdateTargetIfNeeded.AttributeName = null;
this.UpdateTargetIfNeeded.Name = "UpdateTargetIfNeeded";
this.UpdateTargetIfNeeded.NewValue = null;
this.UpdateTargetIfNeeded.TargetId = new System.Guid("00000000-0000-0000-0000-000000000000");
this.UpdateTargetIfNeeded.TargetResource = null;
//
// faultHandlersActivity2
//
@ -143,10 +78,10 @@ namespace Granfeldt.FIM.ActivityLibrary
//
this.ResolveParameterValue.GrammarExpression = null;
this.ResolveParameterValue.Name = "ResolveParameterValue";
activitybind2.Name = "CodeRunActivity";
activitybind2.Path = "ResolvedParameterExpression";
activitybind1.Name = "CodeRunActivity";
activitybind1.Path = "ResolvedParameterExpression";
this.ResolveParameterValue.WorkflowDictionaryKey = null;
this.ResolveParameterValue.SetBinding(Microsoft.ResourceManagement.Workflow.Activities.ResolveGrammarActivity.ResolvedExpressionProperty, ((System.Workflow.ComponentModel.ActivityBind)(activitybind2)));
this.ResolveParameterValue.SetBinding(Microsoft.ResourceManagement.Workflow.Activities.ResolveGrammarActivity.ResolvedExpressionProperty, ((System.Workflow.ComponentModel.ActivityBind)(activitybind1)));
//
// UpdateWorkflowData
//
@ -154,10 +89,9 @@ namespace Granfeldt.FIM.ActivityLibrary
//
// ConditionalUpdateTarget
//
this.ConditionalUpdateTarget.Activities.Add(this.UpdateIfNecessary);
this.ConditionalUpdateTarget.Activities.Add(this.ExitGracefully);
codecondition2.Condition += new System.EventHandler<System.Workflow.Activities.ConditionalEventArgs>(this.ShouldUpdateTarget_Condition);
this.ConditionalUpdateTarget.Condition = codecondition2;
this.ConditionalUpdateTarget.Activities.Add(this.UpdateTargetIfNeeded);
codecondition1.Condition += new System.EventHandler<System.Workflow.Activities.ConditionalEventArgs>(this.ShouldUpdateTarget_Condition);
this.ConditionalUpdateTarget.Condition = codecondition1;
this.ConditionalUpdateTarget.Name = "ConditionalUpdateTarget";
//
// faultHandlersActivity1
@ -171,11 +105,11 @@ namespace Granfeldt.FIM.ActivityLibrary
this.ResolveAndSave.Activities.Add(this.faultHandlersActivity2);
this.ResolveAndSave.Name = "ResolveAndSave";
//
// ShouldUpdateTarget
// ShouldUpdateTargetOrWorkflowData
//
this.ShouldUpdateTarget.Activities.Add(this.ConditionalUpdateTarget);
this.ShouldUpdateTarget.Activities.Add(this.UpdateWorkflowData);
this.ShouldUpdateTarget.Name = "ShouldUpdateTarget";
this.ShouldUpdateTargetOrWorkflowData.Activities.Add(this.ConditionalUpdateTarget);
this.ShouldUpdateTargetOrWorkflowData.Activities.Add(this.UpdateWorkflowData);
this.ShouldUpdateTargetOrWorkflowData.Name = "ShouldUpdateTargetOrWorkflowData";
//
// ExecuteCode
//
@ -191,8 +125,8 @@ namespace Granfeldt.FIM.ActivityLibrary
//
this.ResolveAllParameters.Activities.Add(this.ResolveAndSave);
this.ResolveAllParameters.Activities.Add(this.faultHandlersActivity1);
codecondition3.Condition += new System.EventHandler<System.Workflow.Activities.ConditionalEventArgs>(this.MoreParametersToResolve_Condition);
this.ResolveAllParameters.Condition = codecondition3;
codecondition2.Condition += new System.EventHandler<System.Workflow.Activities.ConditionalEventArgs>(this.MoreParametersToResolve_Condition);
this.ResolveAllParameters.Condition = codecondition2;
this.ResolveAllParameters.Name = "ResolveAllParameters";
//
// CodeRunActivity
@ -200,7 +134,7 @@ namespace Granfeldt.FIM.ActivityLibrary
this.Activities.Add(this.ResolveAllParameters);
this.Activities.Add(this.CompileCode);
this.Activities.Add(this.ExecuteCode);
this.Activities.Add(this.ShouldUpdateTarget);
this.Activities.Add(this.ShouldUpdateTargetOrWorkflowData);
this.Name = "CodeRunActivity";
this.CanModifyActivities = false;
@ -208,31 +142,13 @@ namespace Granfeldt.FIM.ActivityLibrary
#endregion
private CodeActivity CatchAndArgumentException;
private FaultHandlerActivity faultHandlerActivity1;
private FaultHandlersActivity faultHandlersActivity3;
private CodeActivity ExitGracefully;
private Microsoft.ResourceManagement.Workflow.Activities.UpdateResourceActivity UpdateTargetResource;
private IfElseBranchActivity NoUpdateNeeded;
private IfElseBranchActivity UpdateTarget;
private IfElseActivity CompareAndPrepareUpdate;
private Microsoft.ResourceManagement.Workflow.Activities.ReadResourceActivity ReadTarget;
private SequenceActivity UpdateIfNecessary;
private UpdateSingleValueAttributeAsNeededActivity UpdateTargetIfNeeded;
private IfElseBranchActivity UpdateWorkflowData;
private IfElseBranchActivity ConditionalUpdateTarget;
private IfElseActivity ShouldUpdateTarget;
private IfElseActivity ShouldUpdateTargetOrWorkflowData;
private FaultHandlersActivity faultHandlersActivity2;
@ -268,6 +184,12 @@ namespace Granfeldt.FIM.ActivityLibrary

View File

@ -3,6 +3,8 @@
// January 17, 2013 | Soren Granfeldt
// - changed activity name from CodeActivity to CodeRunActivity
// due to clashes with built-in naming convention
// January 18, 2013 | Soren Granfeldt
// - changed update to use helper update activity
using System;
using System.CodeDom.Compiler;
@ -175,9 +177,7 @@ namespace Granfeldt.FIM.ActivityLibrary
public CodeRunActivity()
{
Debugging.Log("Enter :: Initialize");
InitializeComponent();
Debugging.Log("Exit :: Initialize");
}
/// <summary>
@ -291,9 +291,10 @@ namespace Granfeldt.FIM.ActivityLibrary
else if (destinationObject.Equals("Target", StringComparison.OrdinalIgnoreCase))
{
e.Result = true;
ReadTarget.ActorId = WellKnownGuids.FIMServiceAccount;
ReadTarget.ResourceId = containingWorkflow.TargetId;
ReadTarget.SelectionAttributes = new string[] { destinationAttribute };
UpdateTargetIfNeeded.ActorId = WellKnownGuids.FIMServiceAccount;
UpdateTargetIfNeeded.AttributeName = destinationAttribute;
UpdateTargetIfNeeded.NewValue = codeReturnValue;
UpdateTargetIfNeeded.TargetId = containingWorkflow.TargetId;
}
}
else
@ -302,39 +303,6 @@ namespace Granfeldt.FIM.ActivityLibrary
}
}
private void isTargetUpdateNeeded_Condition(object sender, ConditionalEventArgs e)
{
List<UpdateRequestParameter> updateParameters = new List<UpdateRequestParameter>();
e.Result = false;
object currentValue = TargetResource[destinationAttribute];
if (object.Equals(currentValue, codeReturnValue))
{
Debugging.Log(string.Format("No need to update {0}. Value is already '{1}'", destinationAttribute, codeReturnValue));
}
else
{
e.Result = true;
// if code returns null then remove current value; otherwise
// update to new value
updateParameters.Add(new UpdateRequestParameter(destinationAttribute, codeReturnValue == null ? UpdateMode.Remove : UpdateMode.Modify, codeReturnValue == null ? currentValue : codeReturnValue));
Debugging.Log("Updating", containingWorkflow.TargetId);
UpdateTargetResource.ActorId = WellKnownGuids.FIMServiceAccount;
UpdateTargetResource.ResourceId = containingWorkflow.TargetId;
UpdateTargetResource.UpdateParameters = updateParameters.ToArray();
if (codeReturnValue == null)
{
Debugging.Log(string.Format("Removing existing value '{0}' from {1}", currentValue, destinationAttribute));
}
else
{
Debugging.Log(string.Format("Updating {0} from '{1}' to '{2}'", destinationAttribute, currentValue == null ? "(null)" : currentValue, codeReturnValue == null ? "(null)" : codeReturnValue));
}
}
}
private void CatchArgumentException_ExecuteCode(object sender, EventArgs e)
{
// if we get here, the resolve has failed. If the value that we're
@ -345,10 +313,5 @@ namespace Granfeldt.FIM.ActivityLibrary
Debugging.Log("Error: Argument Exception");
}
private void ExitGracefully_ExecuteCode(object sender, EventArgs e)
{
Debugging.Log("Activity exited");
}
}
}

View File

@ -105,7 +105,7 @@ namespace Granfeldt.FIM.ActivityLibrary
#endregion
private Microsoft.ResourceManagement.Workflow.Activities.ReadResourceActivity ReadResource;
//private Microsoft.ResourceManagement.Workflow.Activities.ReadResourceActivity ReadResource;
private IfElseBranchActivity UpdateWorkflowDataBranch;
private IfElseBranchActivity UpdateTargetBranch;
private IfElseActivity UpdateTargetOrWorkflowData;

View File

@ -121,6 +121,8 @@ namespace Granfeldt.FIM.ActivityLibrary
e.Result = false;
object CurrentValue = TargetResource[this.AttributeName];
Debugging.Log("Type current", CurrentValue == null ? "NULL" : CurrentValue.GetType().ToString());
Debugging.Log("Type new value", this.NewValue == null ? "NULL" : this.NewValue.GetType().ToString());
if (object.Equals(CurrentValue, this.NewValue))
{
Debugging.Log(string.Format("No need to update {0}. Value is already '{1}'", this.AttributeName, this.NewValue));

View File

@ -1,4 +1,5 @@
If you add one of the Helper workflow to an existing workflow and you get
the error 'Cannot use custom activities - failed to load toolbox item', it may
be because you have the target assembly Granfeldt.FIM.ActivityLibrary.dll
in the GAC already. Try removing it from C:\Windows\Assembly
in the GAC already. Try removing it from C:\Windows\Assembly or add
a version with a working activity compiled into it.