internal Activity GetActivity(JobDefinition definition, string xaml, string[] dependentWorkflows) { bool flag = false; IEnumerable <string> emptyEnumerable; JobDefinition jobDefinition = definition; string empty = string.Empty; string[] strArrays = dependentWorkflows; if (strArrays != null) { emptyEnumerable = (IEnumerable <string>)strArrays; } else { emptyEnumerable = WorkflowJobDefinition.EmptyEnumerable; } WorkflowJobDefinition workflowJobDefinition = new WorkflowJobDefinition(jobDefinition, empty, emptyEnumerable, string.Empty, xaml); Activity activityFromCache = this.GetActivityFromCache(workflowJobDefinition, out flag); Activity activity = activityFromCache; if (activityFromCache == null) { activity = this.CompileActivityAndSaveInCache(workflowJobDefinition, null, null, out flag); } Activity activity1 = activity; return(activity1); }
internal Activity GetActivity(JobDefinition definition, out bool windowsWorkflow) { WorkflowJobDefinition workflowJobDefinition = new WorkflowJobDefinition(definition); Activity activity = GetActivityFromCache(workflowJobDefinition, out windowsWorkflow) ?? CompileActivityAndSaveInCache(workflowJobDefinition, null, null, out windowsWorkflow); return(activity); }
internal string GetRuntimeAssemblyPath(WorkflowJobDefinition definition) { DefinitionCache.WorkflowDetails workflowDetail; if (this._workflowDetailsCache.TryGetValue(definition, out workflowDetail)) { return(workflowDetail.CompiledAssemblyPath); } else { return(null); } }
//only called from test internal Activity GetActivity(JobDefinition definition, string xaml) { bool windowsWorkflow; WorkflowJobDefinition workflowJobDefinition = new WorkflowJobDefinition(definition, string.Empty, WorkflowJobDefinition.EmptyEnumerable, string.Empty, xaml); Activity activity = GetActivityFromCache(workflowJobDefinition, out windowsWorkflow) ?? CompileActivityAndSaveInCache(workflowJobDefinition, null, null, out windowsWorkflow); return(activity); }
/// <summary> /// /// </summary> /// <param name="xaml"></param> /// <param name="workflowJobDefinition"></param> /// <returns></returns> internal Activity GetActivityFromCache(string xaml, out WorkflowJobDefinition workflowJobDefinition) { workflowJobDefinition = null; foreach (var definition in _workflowDetailsCache.Keys.Where(definition => string.Equals(definition.Xaml, xaml, StringComparison.OrdinalIgnoreCase))) { bool windowsWorkflow; workflowJobDefinition = definition; return(GetActivityFromCache(definition, out windowsWorkflow)); } return(null); }
internal Activity GetActivity(JobDefinition definition, out bool windowsWorkflow) { WorkflowJobDefinition workflowJobDefinition = new WorkflowJobDefinition(definition); Activity activityFromCache = this.GetActivityFromCache(workflowJobDefinition, out windowsWorkflow); Activity activity = activityFromCache; if (activityFromCache == null) { activity = this.CompileActivityAndSaveInCache(workflowJobDefinition, null, null, out windowsWorkflow); } Activity activity1 = activity; return(activity1); }
internal Activity GetActivity(JobDefinition definition, string xaml) { bool flag = false; WorkflowJobDefinition workflowJobDefinition = new WorkflowJobDefinition(definition, string.Empty, WorkflowJobDefinition.EmptyEnumerable, string.Empty, xaml); Activity activityFromCache = this.GetActivityFromCache(workflowJobDefinition, out flag); Activity activity = activityFromCache; if (activityFromCache == null) { activity = this.CompileActivityAndSaveInCache(workflowJobDefinition, null, null, out flag); } Activity activity1 = activity; return(activity1); }
internal static WorkflowJobDefinition AsWorkflowJobDefinition(JobDefinition definition) { WorkflowJobDefinition workflowJobDefinition = definition as WorkflowJobDefinition; WorkflowJobDefinition workflowJobDefinition1 = workflowJobDefinition; if (workflowJobDefinition == null) { WorkflowJobDefinition workflowJobDefinition2 = DefinitionCache.Instance.GetDefinition(definition.InstanceId) as WorkflowJobDefinition; workflowJobDefinition1 = workflowJobDefinition2; if (workflowJobDefinition2 == null) { workflowJobDefinition1 = new WorkflowJobDefinition(definition); } } return(workflowJobDefinition1); }
/// <summary> /// Remove a cached definition. Needed when functions are removed to release resources. /// </summary> /// <param name="definition">Xaml definition to remove.</param> /// <returns>True if succeeded.</returns> internal bool RemoveCachedActivity(JobDefinition definition) { Debug.Assert(definition != null); WorkflowJobDefinition workflowJobDefinition = new WorkflowJobDefinition(definition); Activity activity; _cachedActivities.TryRemove(workflowJobDefinition, out activity); lock (_syncObject) { if (_workflowDetailsCache.ContainsKey(workflowJobDefinition)) { return(_workflowDetailsCache.Remove(workflowJobDefinition)); } } return(false); }
// only called from test internal Activity GetActivity(Guid instanceId) { WorkflowJobDefinition workflowJobDefinition = new WorkflowJobDefinition(typeof(WorkflowJobSourceAdapter), string.Empty, string.Empty, string.Empty, WorkflowJobDefinition.EmptyEnumerable, string.Empty, null, string.Empty) { InstanceId = instanceId }; bool windowsWorkflow; Activity activity = GetActivityFromCache(workflowJobDefinition, out windowsWorkflow) ?? CompileActivityAndSaveInCache(workflowJobDefinition, null, null, out windowsWorkflow); return(activity); }
internal Activity GetActivity(Guid instanceId) { bool flag = false; WorkflowJobDefinition workflowJobDefinition = new WorkflowJobDefinition(typeof(WorkflowJobSourceAdapter), string.Empty, string.Empty, string.Empty, WorkflowJobDefinition.EmptyEnumerable, string.Empty, string.Empty); workflowJobDefinition.InstanceId = instanceId; WorkflowJobDefinition workflowJobDefinition1 = workflowJobDefinition; Activity activityFromCache = this.GetActivityFromCache(workflowJobDefinition1, out flag); Activity activity = activityFromCache; if (activityFromCache == null) { activity = this.CompileActivityAndSaveInCache(workflowJobDefinition1, null, null, out flag); } Activity activity1 = activity; return(activity1); }
internal bool RemoveCachedActivity(JobDefinition definition) { Activity activity = null; bool flag; WorkflowJobDefinition workflowJobDefinition = new WorkflowJobDefinition(definition); this._cachedActivities.TryRemove(workflowJobDefinition, out activity); lock (this._syncObject) { if (!this._workflowDetailsCache.ContainsKey(workflowJobDefinition)) { return(false); } else { flag = this._workflowDetailsCache.Remove(workflowJobDefinition); } } return(flag); }
internal Activity GetActivityFromCache(WorkflowJobDefinition definition, out bool windowsWorkflow) { DefinitionCache.WorkflowDetails workflowDetail; Activity activityTree = null; windowsWorkflow = false; if (this._workflowDetailsCache.TryGetValue(definition, out workflowDetail)) { windowsWorkflow = workflowDetail.IsWindowsActivity; if (workflowDetail.ActivityTree != null) { activityTree = workflowDetail.ActivityTree; } this._cachedActivities.TryGetValue(definition, out activityTree); if (activityTree == null) { activityTree = this.CompileActivityAndSaveInCache(definition, null, null, out windowsWorkflow); } } return(activityTree); }
internal Activity GetActivityFromCache(string xaml, out WorkflowJobDefinition workflowJobDefinition) { bool flag = false; Activity activityFromCache; workflowJobDefinition = null; IEnumerator <WorkflowJobDefinition> enumerator = this._workflowDetailsCache.Keys.Where <WorkflowJobDefinition>((WorkflowJobDefinition definition) => string.Equals(definition.Xaml, xaml, StringComparison.OrdinalIgnoreCase)).GetEnumerator(); using (enumerator) { if (enumerator.MoveNext()) { WorkflowJobDefinition current = enumerator.Current; workflowJobDefinition = current; activityFromCache = this.GetActivityFromCache(current, out flag); } else { return(null); } } return(activityFromCache); }
/// <summary> /// /// </summary> /// <param name="definition"></param> /// <param name="windowsWorkflow"></param> /// <returns></returns> internal Activity GetActivityFromCache(WorkflowJobDefinition definition, out bool windowsWorkflow) { Activity activity = null; WorkflowDetails workflowDetail; // initialize windowsWorkflow to false windowsWorkflow = false; if (_workflowDetailsCache.TryGetValue(definition, out workflowDetail)) { // if there is a workflow activity we would have already computed whether it is a // Windows workflow, set the same windowsWorkflow = workflowDetail.IsWindowsActivity; if (workflowDetail.ActivityTree != null) { if (!AllowExternalActivity) { Debug.Assert(false, "Product code should not contain passing an activity to definition cache"); } activity = workflowDetail.ActivityTree; } // if a cached value is available return the same _cachedActivities.TryGetValue(definition, out activity); if (activity == null) { // if activity is not available in cache recompile using info in // definition cache activity = CompileActivityAndSaveInCache(definition, null, null, out windowsWorkflow); } definition.LastUsedDateTime = DateTime.Now; } return(activity); }
internal Activity GetActivity(JobDefinition definition, out bool windowsWorkflow) { WorkflowJobDefinition workflowJobDefinition = new WorkflowJobDefinition(definition); Activity activityFromCache = this.GetActivityFromCache(workflowJobDefinition, out windowsWorkflow); Activity activity = activityFromCache; if (activityFromCache == null) { activity = this.CompileActivityAndSaveInCache(workflowJobDefinition, null, null, out windowsWorkflow); } Activity activity1 = activity; return activity1; }
internal string GetRuntimeAssemblyName(WorkflowJobDefinition definition) { WorkflowDetails workflowDetail; return(_workflowDetailsCache.TryGetValue(definition, out workflowDetail) ? workflowDetail.CompiledAssemblyName : null); }
/// <summary> /// Compiles the activity and adds it to the cache before returning it. /// </summary> /// <param name="definition">WorkflowJobDefinition defined to represent a compiled activity.</param> /// <param name="activityTree">Activity Tree used for external activities</param> /// <param name="requiredAssemblies"></param> /// <param name="windowsWorkflow">indicates if the specified xaml is a Windows workflow</param> /// <param name="rootWorkflowName">Optional, once assigned, only root Workflow will be compiled</param> /// <returns>Activity compiled from xaml given, or retrieved from cache. /// Null if not found.</returns> internal Activity CompileActivityAndSaveInCache(WorkflowJobDefinition definition, Activity activityTree, Dictionary <string, string> requiredAssemblies, out bool windowsWorkflow, string rootWorkflowName = null) { WorkflowDetails workflowDetail = new WorkflowDetails(); Activity activity = null; // initialize windows workflow to false windowsWorkflow = false; string resultingCompiledAssemblyPath = definition.DependentAssemblyPath; string modulePath = definition.ModulePath; string[] dependentWorkflows = definition.DependentWorkflows.ToArray(); Assembly resultingCompiledAssembly = null; string resultingCompiledAssemblyName = null; string xaml = definition.Xaml; if (activityTree != null) { _tracer.WriteMessage(string.Format(CultureInfo.InvariantCulture, "DefinitionCache: Caching activity for definition with instance ID: {0}. The activity Tree is passed.", definition.InstanceId)); workflowDetail.ActivityTree = activityTree; activity = activityTree; } else if (!String.IsNullOrEmpty(xaml)) { // we need to read the xaml from the specified path and compile the same _tracer.WriteMessage(string.Format(CultureInfo.InvariantCulture, "DefinitionCache: Caching activity for definition with instance ID: {0}. Xaml is passed", definition.InstanceId)); workflowDetail.ActivityTree = null; // check if specified workflow is a windows workflow if (!string.IsNullOrEmpty(modulePath)) { string resolvedPath = Environment.ExpandEnvironmentVariables(modulePath); string resolvedWindowsPath = Environment.ExpandEnvironmentVariables(WindowsPath); if (resolvedPath.IndexOf(resolvedWindowsPath, StringComparison.CurrentCultureIgnoreCase) != -1) { windowsWorkflow = true; } } if (definition.DependentAssemblyPath == null && dependentWorkflows.Length == 0) { activity = ImportWorkflowCommand.ConvertXamlToActivity(xaml); } else { if (rootWorkflowName == null || (definition.Command == rootWorkflowName)) { activity = ImportWorkflowCommand.ConvertXamlToActivity(xaml, dependentWorkflows, requiredAssemblies, ref resultingCompiledAssemblyPath, ref resultingCompiledAssembly, ref resultingCompiledAssemblyName); } else { activity = ImportWorkflowCommand.ConvertXamlToActivity(xaml); } } } if (activity != null) { workflowDetail.IsWindowsActivity = windowsWorkflow; workflowDetail.CompiledAssemblyPath = resultingCompiledAssemblyPath; workflowDetail.CompiledAssemblyName = resultingCompiledAssemblyName; lock (_syncObject) { WorkflowJobDefinition definitionToRemove = _workflowDetailsCache.Keys.FirstOrDefault(item => item.InstanceId == definition.InstanceId); if (definitionToRemove != null) { _workflowDetailsCache.Remove(definition); } _workflowDetailsCache.Add(definition, workflowDetail); } // If cached activity count reaches _cacheSize, // Removing the cached activity at index 0 and adding the new activity to the activity cache, // Old logic was to clear 1000 cached activities and recompiling them again when needed. // if (_cachedActivities.Count == _cacheSize) { Activity removedActivity; _cachedActivities.TryRemove(_cachedActivities.Keys.ElementAt <WorkflowJobDefinition>(0), out removedActivity); } _cachedActivities.TryAdd(definition, activity); return(activity); } // we should never hit this point under normal course of operations return(null); }
internal static WorkflowJobDefinition AsWorkflowJobDefinition(JobDefinition definition) { WorkflowJobDefinition workflowJobDefinition = definition as WorkflowJobDefinition; WorkflowJobDefinition workflowJobDefinition1 = workflowJobDefinition; if (workflowJobDefinition == null) { WorkflowJobDefinition workflowJobDefinition2 = DefinitionCache.Instance.GetDefinition(definition.InstanceId) as WorkflowJobDefinition; workflowJobDefinition1 = workflowJobDefinition2; if (workflowJobDefinition2 == null) { workflowJobDefinition1 = new WorkflowJobDefinition(definition); } } return workflowJobDefinition1; }
private Activity ValidateWorkflow(JobInvocationInfo invocationInfo, Activity activity, ref bool?isSuspendable) { PSWorkflowRuntime runtime = PSWorkflowRuntime.Instance; JobDefinition definition = invocationInfo.Definition; WorkflowJobDefinition workflowJobDefinition = WorkflowJobDefinition.AsWorkflowJobDefinition(definition); bool externalActivity = true; if (activity == null) { bool windowsWorkflow; activity = DefinitionCache.Instance.GetActivityFromCache(workflowJobDefinition, out windowsWorkflow); // Debug.Assert(activity != null, "WorkflowManager failed validation for a null activity"); if (activity == null) { throw new InvalidOperationException(); } externalActivity = false; // skip validation if it is a windows workflow if (windowsWorkflow) { return(activity); } } // If validation is disabled, just return the activity as is... if (!runtime.Configuration.EnableValidation) { return(activity); } if (externalActivity && !DefinitionCache.Instance.AllowExternalActivity) { // If there is a custom validator activity, then call it. If it returns true // then just return the activity. if (Validation.CustomHandler == null) { throw new InvalidOperationException(); } if (Validation.CustomHandler.Invoke(activity)) { return(activity); } string displayName = activity.DisplayName; if (string.IsNullOrEmpty(displayName)) { displayName = this.GetType().Name; } string message = string.Format(CultureInfo.CurrentCulture, Resources.InvalidActivity, displayName); throw new ValidationException(message); } PSWorkflowValidationResults validationResults = GetWorkflowValidator().ValidateWorkflow( definition.InstanceId, activity, DefinitionCache.Instance.GetRuntimeAssemblyName(workflowJobDefinition)); if (validationResults.Results != null) { GetWorkflowValidator().ProcessValidationResults(validationResults.Results); } isSuspendable = validationResults.IsWorkflowSuspendable; return(activity); }
/// <summary> /// Construct a PSWorkflowJob. /// </summary> /// <param name="runtime"></param> /// <param name="specification">JobInvocationInfo representing the command this job /// will invoke.</param> internal PSWorkflowJob(PSWorkflowRuntime runtime, JobInvocationInfo specification) : base(Validate(specification).Command) { Dbg.Assert(runtime != null, "runtime must not be null."); // If specification is null, ArgumentNullException would be raised from // the static validate method. StartParameters = specification.Parameters; _definition = WorkflowJobDefinition.AsWorkflowJobDefinition(specification.Definition); _runtime = runtime; CommonInit(); }
/// <summary> /// Construct a PSWorkflowJob. /// </summary> /// <param name="runtime"></param> /// <param name="specification">JobInvocationInfo representing the command this job will invoke.</param> /// <param name="JobInstanceId"></param> /// <param name="creationContext"></param> internal PSWorkflowJob(PSWorkflowRuntime runtime, JobInvocationInfo specification, Guid JobInstanceId, Dictionary<string, object> creationContext) : base(Validate(specification).Command, specification.Definition.Name, JobInstanceId) { Dbg.Assert(runtime != null, "runtime must not be null."); // If specification is null, ArgumentNullException would be raised from // the static validate method. StartParameters = specification.Parameters; _definition = WorkflowJobDefinition.AsWorkflowJobDefinition(specification.Definition); _jobCreationContext = creationContext; _runtime = runtime; CommonInit(); }
internal bool RemoveCachedActivity(JobDefinition definition) { Activity activity = null; bool flag; WorkflowJobDefinition workflowJobDefinition = new WorkflowJobDefinition(definition); this._cachedActivities.TryRemove(workflowJobDefinition, out activity); lock (this._syncObject) { if (!this._workflowDetailsCache.ContainsKey(workflowJobDefinition)) { return false; } else { flag = this._workflowDetailsCache.Remove(workflowJobDefinition); } } return flag; }
internal Activity CompileActivityAndSaveInCache(WorkflowJobDefinition definition, Activity activityTree, Dictionary<string, string> requiredAssemblies, out bool windowsWorkflow) { Activity activity = null; Func<WorkflowJobDefinition, bool> func = null; DefinitionCache.WorkflowDetails workflowDetail = new DefinitionCache.WorkflowDetails(); Activity activity1 = null; windowsWorkflow = false; string dependentAssemblyPath = definition.DependentAssemblyPath; string modulePath = definition.ModulePath; string[] array = definition.DependentWorkflows.ToArray(); Assembly assembly = null; string str = null; string xaml = definition.Xaml; if (activityTree == null) { if (!string.IsNullOrEmpty(xaml)) { object[] instanceId = new object[1]; instanceId[0] = definition.InstanceId; this._tracer.WriteMessage(string.Format(CultureInfo.InvariantCulture, "DefinitionCache: Caching activity for definition with instance ID: {0}. Xaml is passed", instanceId)); workflowDetail.ActivityTree = null; if (!string.IsNullOrEmpty(modulePath)) { string str1 = Environment.ExpandEnvironmentVariables(modulePath); string str2 = Environment.ExpandEnvironmentVariables("%windir%\\system32"); if (str1.IndexOf(str2, StringComparison.CurrentCultureIgnoreCase) != -1) { windowsWorkflow = true; } } if (definition.DependentAssemblyPath != null || (int)array.Length != 0) { activity1 = ImportWorkflowCommand.ConvertXamlToActivity(xaml, array, requiredAssemblies, ref dependentAssemblyPath, ref assembly, ref str); } else { activity1 = ImportWorkflowCommand.ConvertXamlToActivity(xaml); } } } else { object[] objArray = new object[1]; objArray[0] = definition.InstanceId; this._tracer.WriteMessage(string.Format(CultureInfo.InvariantCulture, "DefinitionCache: Caching activity for definition with instance ID: {0}. The activity Tree is passed.", objArray)); workflowDetail.ActivityTree = activityTree; activity1 = activityTree; } if (activity1 == null) { return null; } else { workflowDetail.IsWindowsActivity = (sbyte)windowsWorkflow; workflowDetail.CompiledAssemblyPath = dependentAssemblyPath; workflowDetail.CompiledAssemblyName = str; lock (this._syncObject) { var keys = this._workflowDetailsCache.Keys; if (func == null) { func = (WorkflowJobDefinition item) => item.InstanceId == definition.InstanceId; } WorkflowJobDefinition workflowJobDefinition = keys.FirstOrDefault<WorkflowJobDefinition>(func); if (workflowJobDefinition != null) { this._workflowDetailsCache.Remove(definition); } this._workflowDetailsCache.Add(definition, workflowDetail); } if (this._cachedActivities.Count == 0x3e8) { this._cachedActivities.TryRemove(this._cachedActivities.Keys.ElementAt<WorkflowJobDefinition>(0), out activity); } this._cachedActivities.TryAdd(definition, activity1); return activity1; } }
public static string CreateFunctionFromXaml(string name, string xaml, Dictionary<string, string> requiredAssemblies, string[] dependentWorkflows, string dependentAssemblyPath, Dictionary<string, ParameterAst> parameterValidation, string modulePath, bool scriptWorkflow, string workflowAttributes) { bool flag = false; if (Regex.IsMatch(name, "^[a-zA-Z0-9-_]*$")) { WorkflowJobDefinition workflowJobDefinition = null; Activity activityFromCache = null; if (scriptWorkflow) { activityFromCache = DefinitionCache.Instance.GetActivityFromCache(xaml, out workflowJobDefinition); } if (activityFromCache == null) { workflowJobDefinition = new WorkflowJobDefinition(typeof(WorkflowJobSourceAdapter), name, null, modulePath, dependentWorkflows, dependentAssemblyPath, xaml); workflowJobDefinition.IsScriptWorkflow = scriptWorkflow; activityFromCache = DefinitionCache.Instance.CompileActivityAndSaveInCache(workflowJobDefinition, null, requiredAssemblies, out flag); } DynamicActivity dynamicActivity = activityFromCache as DynamicActivity; StringBuilder stringBuilder = new StringBuilder(); StringBuilder stringBuilder1 = new StringBuilder(); Guid instanceId = workflowJobDefinition.InstanceId; string str = instanceId.ToString(); object[] objArray = new object[2]; objArray[0] = name; objArray[1] = str; ImportWorkflowCommand.Tracer.WriteMessage(string.Format(CultureInfo.InvariantCulture, "Generating function for name: {0}, WFGuid: {1}", objArray)); List<string> strs = new List<string>(); string str1 = ""; if (dynamicActivity != null) { foreach (DynamicActivityProperty property in dynamicActivity.Properties) { if (typeof(OutArgument).IsAssignableFrom(property.Type) || property.Name.Equals("PSComputerName", StringComparison.OrdinalIgnoreCase) || property.Name.Equals("PSPrivateMetadata", StringComparison.OrdinalIgnoreCase) || property.Name.Equals("InputObject", StringComparison.OrdinalIgnoreCase) || property.Name.Equals("AsJob", StringComparison.OrdinalIgnoreCase)) { continue; } string str2 = (string)LanguagePrimitives.ConvertTo(property.Type.GetGenericArguments()[0], typeof(string), CultureInfo.InvariantCulture); string str3 = ""; string str4 = ""; if (parameterValidation == null || !parameterValidation.ContainsKey(property.Name)) { if (typeof(InArgument).IsAssignableFrom(property.Type) && property.Attributes != null) { foreach (Attribute attribute in property.Attributes) { if (attribute.TypeId.GetType() != typeof(RequiredArgumentAttribute)) { continue; } str3 = "[Parameter(Mandatory=$true)] "; } } } else { ParameterAst item = parameterValidation[property.Name]; foreach (AttributeBaseAst attributeBaseAst in item.Attributes) { stringBuilder.Append(attributeBaseAst.ToString()); stringBuilder.Append("\n "); AttributeAst attributeAst = attributeBaseAst as AttributeAst; if (attributeAst == null || !string.Equals(attributeBaseAst.TypeName.Name, "Parameter", StringComparison.OrdinalIgnoreCase)) { if (string.Equals(attributeBaseAst.TypeName.FullName, "System.Management.Automation.CredentialAttribute", StringComparison.OrdinalIgnoreCase)) { continue; } stringBuilder1.Append(attributeBaseAst.ToString()); stringBuilder1.Append("\n "); } else { string str5 = "[Parameter("; bool flag1 = true; foreach (NamedAttributeArgumentAst namedArgument in attributeAst.NamedArguments) { if (string.Equals(namedArgument.ArgumentName, "Mandatory", StringComparison.OrdinalIgnoreCase)) { continue; } if (!string.Equals(namedArgument.ArgumentName, "ValueFromPipeline", StringComparison.OrdinalIgnoreCase) || !string.Equals(namedArgument.Argument.Extent.Text, "$true", StringComparison.OrdinalIgnoreCase)) { if (!flag1) { str5 = string.Concat(str5, ","); } flag1 = false; str5 = string.Concat(str5, namedArgument.ToString()); } else { throw new PSInvalidOperationException(Resources.ValueFromPipelineNotSupported); } } str5 = string.Concat(str5, ")]"); stringBuilder1.Append(str5); stringBuilder1.Append("\n "); } } if (item.DefaultValue != null) { str4 = string.Concat(" = ", item.DefaultValue.ToString()); strs.Add(string.Concat("'", property.Name, "'")); } } object[] objArray1 = new object[4]; objArray1[0] = str3; objArray1[1] = str2; objArray1[2] = property.Name; objArray1[3] = str4; stringBuilder.Append(string.Format(CultureInfo.InvariantCulture, "{0}[{1}] ${2}{3},\n ", objArray1)); object[] objArray2 = new object[3]; objArray2[0] = str2; objArray2[1] = property.Name; objArray2[2] = str4; stringBuilder1.Append(string.Format(CultureInfo.InvariantCulture, "[{0}] ${1}{2},\n ", objArray2)); } if (strs.Count <= 0) { str1 = "\r\n # None of the workflow parameters had default values\r\n $parametersWithDefaults = @()"; } else { str1 = string.Concat("\r\n # Update any parameters that had default values in the workflow\r\n $parametersWithDefaults = @(", string.Join(", ", strs.ToArray()), ")\n"); } string str6 = str1; string[] strArrays = new string[6]; strArrays[0] = str6; strArrays[1] = "\r\n trap { break }\r\n $parameterCollectionProcessed = $false\r\n $PSParameterCollectionDefaultsMember = $null\r\n if ($PSBoundParameters.ContainsKey('PSParameterCollection'))\r\n {\r\n # validate parameters used with PSParameterCollection\r\n foreach ($pa in $PSBoundParameters.Keys)\r\n {\r\n if ($pa -eq 'JobName' -or $pa -eq 'AsJob' -or $pa -eq 'InputObject' -or $pa -eq 'PSParameterCollection')\r\n {\r\n continue\r\n }\r\n $msg = [Microsoft.PowerShell.Commands.ImportWorkflowCommand]::InvalidPSParameterCollectionAdditionalErrorMessage;\r\n throw (New-Object System.Management.Automation.ErrorRecord $msg, StartWorkflow.InvalidArgument, InvalidArgument, $PSParameterCollection)\r\n }\r\n $parameterCollectionProcessed = $true\r\n\r\n # See if there is a defaults collection, indicated by '*'\r\n foreach ($collection in $PSParameterCollection)\r\n {\r\n if ($collection['PSComputerName'] -eq '*' )\r\n {\r\n if ($PSParameterCollectionDefaultsMember -ne $null)\r\n {\r\n $msg = [Microsoft.PowerShell.Commands.ImportWorkflowCommand]::ParameterErrorMessage;\r\n throw ( New-Object System.Management.Automation.ErrorRecord $msg, StartWorkflow.InvalidArgument, InvalidArgument, $PSParameterCollection)\r\n }\r\n $PSParameterCollectionDefaultsMember = $collection;\r\n foreach($parameter in $parametersWithDefaults)\r\n {\r\n if(! $collection.ContainsKey($parameter))\r\n {\r\n $collection[$parameter] = (Get-Variable $parameter).Value\r\n }\r\n }\r\n }\r\n }\r\n\r\n $PSParameterCollection = [Microsoft.PowerShell.Commands.ImportWorkflowCommand]::MergeParameterCollection(\r\n $PSParameterCollection, $PSParameterCollectionDefaultsMember)\r\n\r\n # canonicalize each collection...\r\n $PSParameterCollection = foreach ( $c in $PSParameterCollection) {\r\n if($c.containskey('AsJob') -or $c.containsKey('JobName') -or $c.containsKey('PSParameterCollection') -or $c.containsKey('InputObject'))\r\n {\r\n $msg = [Microsoft.PowerShell.Commands.ImportWorkflowCommand]::InvalidPSParameterCollectionEntryErrorMessage;\r\n throw ( New-Object System.Management.Automation.ErrorRecord $msg, StartWorkflow.InvalidArgument, InvalidArgument, $PSParameterCollection)\r\n }\r\n & \""; strArrays[2] = name; strArrays[3] = "\" @c\r\n }\r\n\r\n # If there was no '*' collection, added the paramter defaults\r\n # to each individual collection if the parameter isn't already there... \r\n if (-not $PSParameterCollectionDefaultsMember)\r\n {\r\n foreach ($collection in $PSParameterCollection)\r\n {\r\n foreach($parameter in $parametersWithDefaults)\r\n {\r\n if(! $collection.ContainsKey($parameter))\r\n {\r\n $collection[$parameter] = (Get-Variable $parameter).Value\r\n }\r\n }\r\n }\r\n }\r\n }\r\n else\r\n {\r\n # no PSParameterCollection so add the default values to PSBoundParameters\r\n foreach($parameter in $parametersWithDefaults)\r\n {\r\n if(! $PSBoundParameters.ContainsKey($parameter))\r\n {\r\n $PSBoundParameters[$parameter] = (Get-Variable $parameter).Value\r\n }\r\n }\r\n\r\n $PSBoundParameters = & \""; strArrays[4] = name; strArrays[5] = "\" @PSBoundParameters\r\n }\r\n "; str1 = string.Concat(strArrays); } modulePath = ImportWorkflowCommand.EscapeSingleQuotedString(modulePath); string str7 = ImportWorkflowCommand.AddCommonWfParameters(false, workflowAttributes); string str8 = ImportWorkflowCommand.AddCommonWfParameters(true, workflowAttributes); string str9 = stringBuilder1.ToString(); str9 = ImportWorkflowCommand.EscapeCurlyBracketString(str9); object[] objArray3 = new object[1]; objArray3[0] = str9; string str10 = string.Format(CultureInfo.InvariantCulture, str7, objArray3); string str11 = stringBuilder.ToString(); str11 = ImportWorkflowCommand.EscapeCurlyBracketString(str11); object[] objArray4 = new object[1]; objArray4[0] = string.Concat(str11, "$PSInputCollection"); string str12 = string.Format(CultureInfo.InvariantCulture, str8, objArray4); StringBuilder stringBuilder2 = new StringBuilder(); stringBuilder2.Append(str10); stringBuilder2.Append("\n begin {{\n"); stringBuilder2.Append(string.Concat(" function ", name, " {{\n")); stringBuilder2.Append(str12); stringBuilder2.Append(" $PSBoundParameters\n }}\n"); stringBuilder2.Append("\r\n\r\n $PSInputCollection = New-Object 'System.Collections.Generic.List[PSObject]'\r\n }}\r\n\r\n process {{\r\n if ($PSBoundParameters.ContainsKey('InputObject'))\r\n {{\r\n $PSInputCollection.Add($InputObject)\r\n }}\r\n }}\r\n \r\n end {{\r\n\r\n {0}\r\n if ($PSBoundParameters['PSCredential'])\r\n {{\r\n $CredentialTransform = New-Object System.Management.Automation.CredentialAttribute\r\n $LocalCredential = $CredentialTransform.Transform($ExecutionContext, $PSCredential)\r\n $PSBoundParameters['PSCredential'] = [system.management.automation.pscredential]$LocalCredential\r\n\r\n if (!$PSBoundParameters['PSComputerName'] -and !$PSBoundParameters['PSConnectionURI'])\r\n {{\r\n $PSBoundParameters['PSComputerName'] = New-Object string @(,'localhost')\r\n }}\r\n }}\r\n\r\n # Extract the job name if specified\r\n $jobName = ''\r\n if ($PSBoundParameters['JobName'])\r\n {{\r\n $jobName = $PSBoundParameters['JobName']\r\n [void] $PSBoundParameters.Remove('JobName');\r\n }}\r\n\r\n # Extract the PSParameterCollection if specified\r\n [hashtable[]] $jobSpecifications = @()\r\n $parametersCollection = $null;\r\n if ($PSBoundParameters['PSParameterCollection'])\r\n {{\r\n $parameterSCollection = $PSBoundParameters['PSParameterCollection']\r\n [void] $PSBoundParameters.Remove('PSParameterCollection');\r\n }}\r\n\r\n # Remove the InputObject parameter from the bound parameters collection\r\n if ($PSBoundParameters['InputObject'])\r\n {{\r\n [void] $PSBoundParameters.Remove('InputObject');\r\n }}\r\n\r\n # Remove parameters consumed by this function or PowerShell itself\r\n $null = $PSBoundParameters.Remove('AsJob')\r\n $null = $psBoundParameters.Remove('WarningVariable')\r\n $null = $psBoundParameters.Remove('ErrorVariable')\r\n $null = $psBoundParameters.Remove('OutVariable')\r\n $null = $psBoundParameters.Remove('OutBuffer')\r\n \r\n # Add parameter to add the path of the workflow module, needed by Import-LocalizedData\r\n # which uses this as a base path to find localized content files.\r\n $psBoundParameters['PSWorkflowRoot'] = '{2}'\r\n\r\n try\r\n {{\r\n $psBoundParameters['PSSenderInfo'] = $PSSenderInfo\r\n }}\r\n catch\r\n {{\r\n # Avoid the strict mode runtime exception\r\n }}\r\n\r\n $psBoundParameters['PSCurrentDirectory'] = $pwd.Path\r\n\r\n # Process author-specified metadata which is set using\r\n # the Private member in the module manifest\r\n $myCommand = $MyInvocation.MyCommand\r\n $myModule = $myCommand.Module\r\n if ($myModule)\r\n {{\r\n # The function was defined in a module so look for \r\n # the PrivateData member\r\n [Hashtable] $privateData = $myModule.PrivateData -as [Hashtable]\r\n \r\n if ($privateData)\r\n {{\r\n # Extract the nested hashtable corresponding to this\r\n # command\r\n [hashtable] $authorMetadata = $privateData[$myCommand.Name]\r\n if ($authorMetadata)\r\n {{\r\n # Copy the author-supplied hashtable so we can safely\r\n # modify it.\r\n $authorMetadata = @{{}} + $authorMetadata \r\n if ($psBoundParameters['PSPrivateMetadata'])\r\n {{\r\n # merge in the user-supplied metadata\r\n foreach ($pair in $psPrivateMetadata.GetEnumerator())\r\n {{\r\n $authorMetadata[$pair.Key] = $pair.Value\r\n }}\r\n }}\r\n # and update the bound parameter to include the merged data\r\n $psBoundParameters['PSPrivateMetadata'] = $authorMetadata\r\n }}\r\n }}\r\n }}\r\n\r\n # Add in the input collection if there wasn't one explicitly passed\r\n # which can only happen through PSParameterCollection \r\n if (! $PSBoundParameters['PSInputCollection'])\r\n {{\r\n $PSBoundParameters['PSInputCollection'] = $PSInputCollection\r\n }}\r\n\r\n $errorAction = \"Continue\"\r\n if ($PSBoundParameters['ErrorAction'] -eq \"SilentlyContinue\")\r\n {{\r\n $errorAction = \"SilentlyContinue\"\r\n }}\r\n\r\n if($PSBoundParameters['ErrorAction'] -eq \"Ignore\")\r\n {{\r\n $PSBoundParameters['ErrorAction'] = \"SilentlyContinue\"\r\n $errorAction = \"SilentlyContinue\"\r\n }}\r\n\r\n if ($PSBoundParameters['ErrorAction'] -eq \"Inquire\")\r\n {{\r\n $PSBoundParameters['ErrorAction'] = \"Continue\"\r\n $errorAction = \"Continue\"\r\n }}\r\n\r\n $warningAction = \"Continue\"\r\n if ($PSBoundParameters['WarningAction'] -eq \"SilentlyContinue\" -or $PSBoundParameters['WarningAction'] -eq \"Ignore\")\r\n {{\r\n $warningAction = \"SilentlyContinue\"\r\n }}\r\n\r\n if ($PSBoundParameters['WarningAction'] -eq \"Inquire\")\r\n {{\r\n $PSBoundParameters['WarningAction'] = \"Continue\"\r\n $warningAction = \"Continue\"\r\n }}\r\n\r\n # Create the final parameter collection...\r\n $finalParameterCollection = $null\r\n if ($PSParameterCollection -ne $null)\r\n {{\r\n $finalParameterCollection = $PSParameterCollection \r\n }}\r\n else\r\n {{\r\n $finalParameterCollection = $PSBoundParameters\r\n }}\r\n\r\n try\r\n {{\r\n # Start the workflow and return the job object... \r\n $job = [Microsoft.PowerShell.Commands.ImportWorkflowCommand]::StartWorkflowApplication(\r\n $PSCmdlet,\r\n $jobName,\r\n '{1}',\r\n $AsJob,\r\n $parameterCollectionProcessed,\r\n $finalParameterCollection)\r\n }}\r\n catch\r\n {{\r\n # extract exception from the error record\r\n $e = $_.Exception\r\n # this is probably a method invocation exception so we want the inner exception\r\n # if it exists\r\n if ($e -is [System.Management.Automation.MethodException] -and $e.InnerException)\r\n {{\r\n $e = $e.InnerException\r\n }}\r\n\r\n $msg = [Microsoft.PowerShell.Commands.ImportWorkflowCommand]::UnableToStartWorkflowMessageMessage -f `\r\n $MyInvocation.MyCommand.Name, $e.Message\r\n\r\n $newException = New-Object System.Management.Automation.RuntimeException $msg, $e\r\n\r\n throw (New-Object System.Management.Automation.ErrorRecord $newException, StartWorkflow.InvalidArgument, InvalidArgument, $finalParameterCollection)\r\n }}\r\n\r\n if (-not $AsJob -and $job -ne $null)\r\n {{\r\n try\r\n {{\r\n Receive-Job -Job $job -Wait -Verbose -Debug -ErrorAction $errorAction -WarningAction $warningAction\r\n\r\n $PSCmdlet.InvokeCommand.HasErrors = $job.State -eq 'failed'\r\n }}\r\n finally\r\n {{\r\n if($job.State -ne \"Suspended\" -and $job.State -ne \"Stopped\")\r\n {{\r\n Remove-Job -Job $job -Force\r\n }}\r\n else\r\n {{\r\n $job\r\n }}\r\n }}\r\n }}\r\n else\r\n {{\r\n $job\r\n }}\r\n }}\r\n"); object[] objArray5 = new object[3]; objArray5[0] = str1; objArray5[1] = str; objArray5[2] = modulePath; string str13 = string.Format(CultureInfo.InvariantCulture, stringBuilder2.ToString(), objArray5); str13 = Regex.Replace(str13, "^ *\\#.*$", "", RegexOptions.Multiline); return str13; } else { object[] objArray6 = new object[1]; objArray6[0] = name; throw new PSArgumentException(string.Format(CultureInfo.CurrentCulture, Resources.WorkflowNameInvalid, objArray6)); } }
private Activity ValidateWorkflow(JobInvocationInfo invocationInfo, Activity activity, ref bool?isSuspendable) { bool flag = false; PSWorkflowRuntime instance = PSWorkflowRuntime.Instance; JobDefinition definition = invocationInfo.Definition; WorkflowJobDefinition workflowJobDefinition = WorkflowJobDefinition.AsWorkflowJobDefinition(definition); bool flag1 = true; if (activity == null) { activity = DefinitionCache.Instance.GetActivityFromCache(workflowJobDefinition, out flag); if (activity != null) { flag1 = false; if (flag) { return(activity); } } else { throw new InvalidOperationException(); } } if (instance.Configuration.EnableValidation) { if (!flag1 || DefinitionCache.Instance.AllowExternalActivity) { PSWorkflowValidationResults pSWorkflowValidationResult = this.GetWorkflowValidator().ValidateWorkflow(definition.InstanceId, activity, DefinitionCache.Instance.GetRuntimeAssemblyName(workflowJobDefinition)); if (pSWorkflowValidationResult.Results != null) { this.GetWorkflowValidator().ProcessValidationResults(pSWorkflowValidationResult.Results); } isSuspendable = new bool?(pSWorkflowValidationResult.IsWorkflowSuspendable); return(activity); } else { if (Validation.CustomHandler != null) { if (!Validation.CustomHandler(activity)) { string displayName = activity.DisplayName; if (string.IsNullOrEmpty(displayName)) { displayName = base.GetType().Name; } object[] objArray = new object[1]; objArray[0] = displayName; string str = string.Format(CultureInfo.CurrentCulture, Resources.InvalidActivity, objArray); throw new ValidationException(str); } else { return(activity); } } else { throw new InvalidOperationException(); } } } else { return(activity); } }
internal Activity GetActivity(Guid instanceId) { bool flag = false; WorkflowJobDefinition workflowJobDefinition = new WorkflowJobDefinition(typeof(WorkflowJobSourceAdapter), string.Empty, string.Empty, string.Empty, WorkflowJobDefinition.EmptyEnumerable, string.Empty, string.Empty); workflowJobDefinition.InstanceId = instanceId; WorkflowJobDefinition workflowJobDefinition1 = workflowJobDefinition; Activity activityFromCache = this.GetActivityFromCache(workflowJobDefinition1, out flag); Activity activity = activityFromCache; if (activityFromCache == null) { activity = this.CompileActivityAndSaveInCache(workflowJobDefinition1, null, null, out flag); } Activity activity1 = activity; return activity1; }
internal Activity GetActivity(JobDefinition definition, string xaml) { bool flag = false; WorkflowJobDefinition workflowJobDefinition = new WorkflowJobDefinition(definition, string.Empty, WorkflowJobDefinition.EmptyEnumerable, string.Empty, xaml); Activity activityFromCache = this.GetActivityFromCache(workflowJobDefinition, out flag); Activity activity = activityFromCache; if (activityFromCache == null) { activity = this.CompileActivityAndSaveInCache(workflowJobDefinition, null, null, out flag); } Activity activity1 = activity; return activity1; }
internal Activity GetActivity(JobDefinition definition, string xaml, string[] dependentWorkflows) { bool flag = false; IEnumerable<string> emptyEnumerable; JobDefinition jobDefinition = definition; string empty = string.Empty; string[] strArrays = dependentWorkflows; if (strArrays != null) { emptyEnumerable = (IEnumerable<string>)strArrays; } else { emptyEnumerable = WorkflowJobDefinition.EmptyEnumerable; } WorkflowJobDefinition workflowJobDefinition = new WorkflowJobDefinition(jobDefinition, empty, emptyEnumerable, string.Empty, xaml); Activity activityFromCache = this.GetActivityFromCache(workflowJobDefinition, out flag); Activity activity = activityFromCache; if (activityFromCache == null) { activity = this.CompileActivityAndSaveInCache(workflowJobDefinition, null, null, out flag); } Activity activity1 = activity; return activity1; }
internal Activity GetActivityFromCache(WorkflowJobDefinition definition, out bool windowsWorkflow) { DefinitionCache.WorkflowDetails workflowDetail; Activity activityTree = null; windowsWorkflow = false; if (this._workflowDetailsCache.TryGetValue(definition, out workflowDetail)) { windowsWorkflow = workflowDetail.IsWindowsActivity; if (workflowDetail.ActivityTree != null) { activityTree = workflowDetail.ActivityTree; } this._cachedActivities.TryGetValue(definition, out activityTree); if (activityTree == null) { activityTree = this.CompileActivityAndSaveInCache(definition, null, null, out windowsWorkflow); } } return activityTree; }
internal Activity GetActivityFromCache(string xaml, out WorkflowJobDefinition workflowJobDefinition) { bool flag = false; Activity activityFromCache; workflowJobDefinition = null; IEnumerator<WorkflowJobDefinition> enumerator = this._workflowDetailsCache.Keys.Where<WorkflowJobDefinition>((WorkflowJobDefinition definition) => string.Equals(definition.Xaml, xaml, StringComparison.OrdinalIgnoreCase)).GetEnumerator(); using (enumerator) { if (enumerator.MoveNext()) { WorkflowJobDefinition current = enumerator.Current; workflowJobDefinition = current; activityFromCache = this.GetActivityFromCache(current, out flag); } else { return null; } } return activityFromCache; }
internal string GetWorkflowXaml(WorkflowJobDefinition definition) { return(definition.Xaml); }
internal string GetRuntimeAssemblyPath(WorkflowJobDefinition definition) { DefinitionCache.WorkflowDetails workflowDetail; if (this._workflowDetailsCache.TryGetValue(definition, out workflowDetail)) { return workflowDetail.CompiledAssemblyPath; } else { return null; } }
internal Activity CompileActivityAndSaveInCache(WorkflowJobDefinition definition, Activity activityTree, Dictionary <string, string> requiredAssemblies, out bool windowsWorkflow) { Activity activity = null; Func <WorkflowJobDefinition, bool> func = null; DefinitionCache.WorkflowDetails workflowDetail = new DefinitionCache.WorkflowDetails(); Activity activity1 = null; windowsWorkflow = false; string dependentAssemblyPath = definition.DependentAssemblyPath; string modulePath = definition.ModulePath; string[] array = definition.DependentWorkflows.ToArray(); Assembly assembly = null; string str = null; string xaml = definition.Xaml; if (activityTree == null) { if (!string.IsNullOrEmpty(xaml)) { object[] instanceId = new object[1]; instanceId[0] = definition.InstanceId; this._tracer.WriteMessage(string.Format(CultureInfo.InvariantCulture, "DefinitionCache: Caching activity for definition with instance ID: {0}. Xaml is passed", instanceId)); workflowDetail.ActivityTree = null; if (!string.IsNullOrEmpty(modulePath)) { string str1 = Environment.ExpandEnvironmentVariables(modulePath); string str2 = Environment.ExpandEnvironmentVariables("%windir%\\system32"); if (str1.IndexOf(str2, StringComparison.CurrentCultureIgnoreCase) != -1) { windowsWorkflow = true; } } if (definition.DependentAssemblyPath != null || (int)array.Length != 0) { activity1 = ImportWorkflowCommand.ConvertXamlToActivity(xaml, array, requiredAssemblies, ref dependentAssemblyPath, ref assembly, ref str); } else { activity1 = ImportWorkflowCommand.ConvertXamlToActivity(xaml); } } } else { object[] objArray = new object[1]; objArray[0] = definition.InstanceId; this._tracer.WriteMessage(string.Format(CultureInfo.InvariantCulture, "DefinitionCache: Caching activity for definition with instance ID: {0}. The activity Tree is passed.", objArray)); workflowDetail.ActivityTree = activityTree; activity1 = activityTree; } if (activity1 == null) { return(null); } else { workflowDetail.IsWindowsActivity = (sbyte)windowsWorkflow; workflowDetail.CompiledAssemblyPath = dependentAssemblyPath; workflowDetail.CompiledAssemblyName = str; lock (this._syncObject) { var keys = this._workflowDetailsCache.Keys; if (func == null) { func = (WorkflowJobDefinition item) => item.InstanceId == definition.InstanceId; } WorkflowJobDefinition workflowJobDefinition = keys.FirstOrDefault <WorkflowJobDefinition>(func); if (workflowJobDefinition != null) { this._workflowDetailsCache.Remove(definition); } this._workflowDetailsCache.Add(definition, workflowDetail); } if (this._cachedActivities.Count == 0x3e8) { this._cachedActivities.TryRemove(this._cachedActivities.Keys.ElementAt <WorkflowJobDefinition>(0), out activity); } this._cachedActivities.TryAdd(definition, activity1); return(activity1); } }
internal string GetWorkflowXaml(WorkflowJobDefinition definition) { return definition.Xaml; }
/// <summary> /// Creates a workflow activity based on the provided Xaml and returns PowerShell script that will /// run the workflow. /// </summary> /// <param name="name">Workflow name</param> /// <param name="xaml">Workflow Xaml definition</param> /// <param name="requiredAssemblies">Required assemblies</param> /// <param name="dependentWorkflows">Dependent workflows</param> /// <param name="dependentAssemblyPath">Path for dependent assemblies</param> /// <param name="parameterValidation">Workflow parameters</param> /// <param name="modulePath">Module path</param> /// <param name="scriptWorkflow">True if this is script workflow</param> /// <param name="workflowAttributes">the attribute string to use for the workflow, should be '[CmdletBinding()]'</param> /// <param name="scriptContent">File path containing script content.</param> /// <param name="fullScript">Full source script.</param> /// <param name="rootWorkflowName">Only root Workflow will be compiled</param> /// <param name="sourceLanguageMode">Language mode of source that is creating the workflow</param> /// <param name="attributeAstCollection">Optional collection of parameter attribute Asts</param> /// <returns></returns> public static string CreateFunctionFromXaml( string name, string xaml, Dictionary<string, string> requiredAssemblies, string[] dependentWorkflows, string dependentAssemblyPath, Dictionary<string, ParameterAst> parameterValidation, string modulePath, bool scriptWorkflow, string workflowAttributes, string scriptContent, string fullScript, string rootWorkflowName, PSLanguageMode? sourceLanguageMode, ReadOnlyCollection<AttributeAst> attributeAstCollection ) { // check to see if the specified name is allowed if (!Regex.IsMatch(name, functionNamePattern)) { throw new PSArgumentException(string.Format(CultureInfo.CurrentCulture, Resources.WorkflowNameInvalid, name)); } WorkflowJobDefinition definition = null; Activity workflow = null; if (scriptWorkflow) { workflow = DefinitionCache.Instance.GetActivityFromCache(xaml, out definition); } if (workflow == null) { definition = new WorkflowJobDefinition(typeof(WorkflowJobSourceAdapter), name, null, modulePath, dependentWorkflows, dependentAssemblyPath, requiredAssemblies, xaml); definition.IsScriptWorkflow = scriptWorkflow; bool windowsWorkflow; workflow = DefinitionCache.Instance.CompileActivityAndSaveInCache(definition, null, requiredAssemblies, out windowsWorkflow, rootWorkflowName); } definition.WorkflowScriptFile = scriptContent; definition.WorkflowFullScript = fullScript; // this can throw exceptions if the xaml is malformed. DynamicActivity daBody = workflow as DynamicActivity; StringBuilder innerParamDefinitions = new StringBuilder(); StringBuilder outerParamDefinitions = new StringBuilder(); string workflowGuid = definition.InstanceId.ToString(); Tracer.WriteMessage(String.Format(CultureInfo.InvariantCulture, "Generating function for name: {0}, WFGuid: {1}", name, workflowGuid)); // String to hold any updates we do for parameter defaults List<string> parametersWithDefaults = new List<string>(); string defaultUpdates = ""; // If the workflow is a DynamicActivity, we can use the Properties // property to retrieve parameters to the workflow and synthesize // PowerShell parameter declarations. if (daBody != null) { foreach (var p in daBody.Properties) { // Skip out arguments if (typeof(System.Activities.OutArgument).IsAssignableFrom(p.Type)) { continue; } // If the parameter name is one of the expected collisions, don't add it to the list. if (p.Name.Equals(Constants.ComputerName, StringComparison.OrdinalIgnoreCase) || p.Name.Equals(Constants.PrivateMetadata, StringComparison.OrdinalIgnoreCase)) { continue; } if (p.Name.Equals("InputObject", StringComparison.OrdinalIgnoreCase) || p.Name.Equals("AsJob", StringComparison.OrdinalIgnoreCase)) { continue; } string paramTypeName = (string)LanguagePrimitives.ConvertTo(p.Type.GetGenericArguments()[0], typeof(string), CultureInfo.InvariantCulture); string mandatory = ""; string parameterDefault = ""; // If we got specific validations to add, add those // We only get these in script-based workflow case, but not in XAML case. if ((parameterValidation != null) && parameterValidation.ContainsKey(p.Name)) { ParameterAst parameter = parameterValidation[p.Name]; foreach (AttributeBaseAst attribute in parameter.Attributes) { innerParamDefinitions.Append(attribute.ToString()); innerParamDefinitions.Append("\n "); var attributeAst = attribute as AttributeAst; if (attributeAst == null || !string.Equals(attribute.TypeName.Name, "Parameter", StringComparison.OrdinalIgnoreCase)) { // If we have a Credential Attribute, it has been added to the inner function, it does not need to be added to the outer definition. // This will prevent prompting for the cred twice. if (!string.Equals(attribute.TypeName.FullName, "System.Management.Automation.CredentialAttribute", StringComparison.OrdinalIgnoreCase)) { outerParamDefinitions.Append(attribute.ToString()); outerParamDefinitions.Append("\n "); } continue; } string updatedAttribute = "[Parameter("; bool first = true; foreach (var namedAttribute in attributeAst.NamedArguments) { if (string.Equals(namedAttribute.ArgumentName, "Mandatory", StringComparison.OrdinalIgnoreCase)) continue; if (string.Equals(namedAttribute.ArgumentName, "ValueFromPipeline", StringComparison.OrdinalIgnoreCase) && string.Equals(namedAttribute.Argument.Extent.Text, "$true", StringComparison.OrdinalIgnoreCase)) { throw new PSInvalidOperationException(Resources.ValueFromPipelineNotSupported); } if (!first) updatedAttribute += ","; first = false; updatedAttribute += namedAttribute.ToString(); } updatedAttribute += ")]"; outerParamDefinitions.Append(updatedAttribute); outerParamDefinitions.Append("\n "); } if (parameter.DefaultValue != null) { parameterDefault = " = " + parameter.DefaultValue.ToString(); parametersWithDefaults.Add("'" + p.Name + "'"); } } // Otherwise, add our default treatment // XAML workflows only go through this code path. // Scriptworkflow ALSO comes through this path. else { // If the parameter is an In parameter with the RequiredArgument attribute then make it mandatory if (typeof(System.Activities.InArgument).IsAssignableFrom(p.Type)) { if (p.Attributes != null) { foreach (var attribute in p.Attributes) { // Check the type of the attribute if (attribute.TypeId.GetType() == typeof(RequiredArgumentAttribute)) { mandatory = "[Parameter(Mandatory=$true)] "; } } } } } innerParamDefinitions.Append(String.Format(CultureInfo.InvariantCulture, "{0}[{1}] ${2}{3},\n ", mandatory, paramTypeName, p.Name, parameterDefault)); outerParamDefinitions.Append(String.Format(CultureInfo.InvariantCulture, "[{0}] ${1}{2},\n ", paramTypeName, p.Name, parameterDefault)); } if (parametersWithDefaults.Count > 0) { defaultUpdates = @" # Update any parameters that had default values in the workflow $parametersWithDefaults = @(" + String.Join(", ", parametersWithDefaults.ToArray()) + ")\n"; } else { defaultUpdates = @" # None of the workflow parameters had default values $parametersWithDefaults = @()"; } // Add code into the function to handle PSParameterCollection parameter if present. defaultUpdates += @" trap { break } $parameterCollectionProcessed = $false $PSParameterCollectionDefaultsMember = $null $suspendOnError = $false if ($PSBoundParameters.ContainsKey('PSParameterCollection')) { # validate parameters used with PSParameterCollection foreach ($pa in $PSBoundParameters.Keys) { if ($pa -eq 'JobName' -or $pa -eq 'AsJob' -or $pa -eq 'InputObject' -or $pa -eq 'PSParameterCollection') { continue } $msg = [Microsoft.PowerShell.Commands.ImportWorkflowCommand]::InvalidPSParameterCollectionAdditionalErrorMessage; throw (New-Object System.Management.Automation.ErrorRecord $msg, StartWorkflow.InvalidArgument, InvalidArgument, $PSParameterCollection) } $parameterCollectionProcessed = $true # See if there is a defaults collection, indicated by '*' foreach ($collection in $PSParameterCollection) { if ($collection['" + Constants.ComputerName + @"'] -eq '*' ) { if ($PSParameterCollectionDefaultsMember -ne $null) { $msg = [Microsoft.PowerShell.Commands.ImportWorkflowCommand]::ParameterErrorMessage; throw ( New-Object System.Management.Automation.ErrorRecord $msg, StartWorkflow.InvalidArgument, InvalidArgument, $PSParameterCollection) } $PSParameterCollectionDefaultsMember = $collection; foreach($parameter in $parametersWithDefaults) { if(! $collection.ContainsKey($parameter)) { $collection[$parameter] = (Get-Variable $parameter).Value } } } } $PSParameterCollection = [Microsoft.PowerShell.Commands.ImportWorkflowCommand]::MergeParameterCollection( $PSParameterCollection, $PSParameterCollectionDefaultsMember) # canonicalize each collection... $PSParameterCollection = foreach ( $c in $PSParameterCollection) { if($c.containskey('AsJob') -or $c.containsKey('JobName') -or $c.containsKey('PSParameterCollection') -or $c.containsKey('InputObject')) { $msg = [Microsoft.PowerShell.Commands.ImportWorkflowCommand]::InvalidPSParameterCollectionEntryErrorMessage; throw ( New-Object System.Management.Automation.ErrorRecord $msg, StartWorkflow.InvalidArgument, InvalidArgument, $PSParameterCollection) } if ($c['" + Constants.ErrorAction + @"'] -eq ""Suspend"") { $suspendOnError = $true $c['" + Constants.ErrorAction + @"'] = ""Continue"" } $validated = & """ + name + @""" @c $validated['" + Constants.PSSuspendOnError + @"'] = $suspendOnError $validated } # If there was no '*' collection, added the parameter defaults # to each individual collection if the parameter isn't already there... if (-not $PSParameterCollectionDefaultsMember) { foreach ($collection in $PSParameterCollection) { foreach($parameter in $parametersWithDefaults) { if(! $collection.ContainsKey($parameter)) { $collection[$parameter] = (Get-Variable $parameter).Value } } } } } else { if ($PSBoundParameters['" + Constants.ErrorAction + @"'] -eq ""Suspend"") { $errorActionPreference = ""Continue"" $suspendOnError = $true $PSBoundParameters['" + Constants.ErrorAction + @"'] = ""Continue"" } $PSBoundParameters = & """ + name + @""" @PSBoundParameters # no PSParameterCollection so add the default values to PSBoundParameters foreach($parameter in $parametersWithDefaults) { if(! $PSBoundParameters.ContainsKey($parameter)) { $PSBoundParameters[$parameter] = (Get-Variable $parameter).Value } } } "; } // Escaping the single quotes from the module path modulePath = CodeGeneration.EscapeSingleQuotedStringContent(modulePath); //Generate the PowerShell function template string functionPrefixTemplate = AddCommonWfParameters(false, workflowAttributes); string validationFunctionPrefixTemplate = AddCommonWfParameters(true, workflowAttributes); string outerParamDefinitionsString = outerParamDefinitions.ToString(); outerParamDefinitionsString = CodeGeneration.EscapeFormatStringContent(outerParamDefinitionsString); string functionPrefix = String.Format(CultureInfo.InvariantCulture, functionPrefixTemplate, outerParamDefinitionsString); // Generate the param block for the synthesized function string innerParamDefinitionsString = innerParamDefinitions.ToString(); innerParamDefinitionsString = CodeGeneration.EscapeFormatStringContent(innerParamDefinitionsString); // For the parameter validation function, add an extra param definition for $PSInputCollection string validationFunctionPrefix = String.Format(CultureInfo.InvariantCulture, validationFunctionPrefixTemplate, innerParamDefinitionsString + "$PSInputCollection"); StringBuilder completeFunctionDefinitionTemplate = new StringBuilder(); completeFunctionDefinitionTemplate.AppendLine(functionPrefix); completeFunctionDefinitionTemplate.AppendLine(" begin {{"); completeFunctionDefinitionTemplate.AppendLine(" function " + name + " {{"); completeFunctionDefinitionTemplate.AppendLine(validationFunctionPrefix); completeFunctionDefinitionTemplate.AppendLine(" $PSBoundParameters"); completeFunctionDefinitionTemplate.AppendLine(" }}"); completeFunctionDefinitionTemplate.AppendLine(FunctionBodyTemplate); // Mark the function definition with sourceLanguageMode (language mode that function can run under, i.e., // as trusted or not trusted), unless the workflow script is marked with the "SecurityCritical" attribute in // which case the function will always be run under the current system lock down setting. bool isSecurityCritical = ContainsSecurityCriticalAttribute(attributeAstCollection); string sourceLanguageModeStr = (!isSecurityCritical && (sourceLanguageMode != null)) ? sourceLanguageMode.ToString() : string.Empty; // Combine the pieces to create the complete function string functionDefinition = String.Format(CultureInfo.InvariantCulture, completeFunctionDefinitionTemplate.ToString(), defaultUpdates, workflowGuid, modulePath, sourceLanguageModeStr); #if DEBUG // Verify that the generated function is valid powershell. This is only an issue when changing the // generation code so it's debug only... Collection<PSParseError> templateErrors = null; System.Management.Automation.PSParser.Tokenize(functionDefinition, out templateErrors); if (templateErrors != null && templateErrors.Count > 0) { StringBuilder message = new StringBuilder(); foreach (PSParseError parseErr in templateErrors) { message.Append(parseErr.Token.Content).Append(':').Append(parseErr.Message).Append("\n"); } message.Append("`nFunction code:`n").Append(functionDefinition); throw new InvalidOperationException(message.ToString()); } #endif workflow = null; daBody = null; // strip the comments in fre build #if !DEBUG functionDefinition = System.Text.RegularExpressions.Regex.Replace(functionDefinition, "^ *\\#.*$", "", RegexOptions.Multiline); #endif return functionDefinition; }
internal PSWorkflowJob(PSWorkflowRuntime runtime, JobInvocationInfo specification, Guid JobInstanceId) : base(PSWorkflowJob.Validate(specification).Command, specification.Definition.Name, JobInstanceId) { this._tracer = PowerShellTraceSourceFactory.GetTraceSource(); this._syncObject = new object(); this._resumeErrorSyncObject = new object(); this._statusMessage = string.Empty; this._location = string.Empty; this._resumeErrors = new Dictionary<Guid, Exception>(); this._workflowParameters = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase); this._psWorkflowCommonParameters = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase); this._jobMetadata = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase); this._privateMetadata = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase); this.IsSuspendable = null; this.listOfLabels = new List<string>(); base.StartParameters = specification.Parameters; this._definition = WorkflowJobDefinition.AsWorkflowJobDefinition(specification.Definition); this._runtime = runtime; this.CommonInit(); }