コード例 #1
0
ファイル: DefinitionCache.cs プロジェクト: modulexcite/pash-1
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
ファイル: DefinitionCache.cs プロジェクト: modulexcite/pash-1
 internal string GetRuntimeAssemblyPath(WorkflowJobDefinition definition)
 {
     DefinitionCache.WorkflowDetails workflowDetail;
     if (this._workflowDetailsCache.TryGetValue(definition, out workflowDetail))
     {
         return(workflowDetail.CompiledAssemblyPath);
     }
     else
     {
         return(null);
     }
 }
コード例 #4
0
        //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);
        }
コード例 #5
0
        /// <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);
        }
コード例 #6
0
ファイル: DefinitionCache.cs プロジェクト: modulexcite/pash-1
        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);
        }
コード例 #7
0
ファイル: DefinitionCache.cs プロジェクト: modulexcite/pash-1
        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);
        }
コード例 #8
0
        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);
        }
コード例 #9
0
        /// <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);
        }
コード例 #10
0
        // 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);
        }
コード例 #11
0
ファイル: DefinitionCache.cs プロジェクト: modulexcite/pash-1
        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);
        }
コード例 #12
0
ファイル: DefinitionCache.cs プロジェクト: modulexcite/pash-1
        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);
        }
コード例 #13
0
ファイル: DefinitionCache.cs プロジェクト: modulexcite/pash-1
        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);
        }
コード例 #14
0
ファイル: DefinitionCache.cs プロジェクト: modulexcite/pash-1
        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);
        }
コード例 #15
0
        /// <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);
        }
コード例 #16
0
ファイル: DefinitionCache.cs プロジェクト: nickchal/pash
		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;
		}
コード例 #17
0
        internal string GetRuntimeAssemblyName(WorkflowJobDefinition definition)
        {
            WorkflowDetails workflowDetail;

            return(_workflowDetailsCache.TryGetValue(definition, out workflowDetail) ? workflowDetail.CompiledAssemblyName : null);
        }
コード例 #18
0
        /// <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);
        }
コード例 #19
0
		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;
		}
コード例 #20
0
        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);
        }
コード例 #21
0
ファイル: WorkflowJob2.cs プロジェクト: 40a/PowerShell
        /// <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();
        }
コード例 #22
0
ファイル: WorkflowJob2.cs プロジェクト: 40a/PowerShell
        /// <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();
        }
コード例 #23
0
ファイル: DefinitionCache.cs プロジェクト: nickchal/pash
		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;
		}
コード例 #24
0
ファイル: DefinitionCache.cs プロジェクト: nickchal/pash
		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;
			}
		}
コード例 #25
0
		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));
			}
		}
コード例 #26
0
        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);
            }
        }
コード例 #27
0
ファイル: DefinitionCache.cs プロジェクト: nickchal/pash
		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;
		}
コード例 #28
0
ファイル: DefinitionCache.cs プロジェクト: nickchal/pash
		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;
		}
コード例 #29
0
ファイル: DefinitionCache.cs プロジェクト: nickchal/pash
		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;
		}
コード例 #30
0
ファイル: DefinitionCache.cs プロジェクト: nickchal/pash
		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;
		}
コード例 #31
0
ファイル: DefinitionCache.cs プロジェクト: nickchal/pash
		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;
		}
コード例 #32
0
ファイル: DefinitionCache.cs プロジェクト: modulexcite/pash-1
 internal string GetWorkflowXaml(WorkflowJobDefinition definition)
 {
     return(definition.Xaml);
 }
コード例 #33
0
ファイル: DefinitionCache.cs プロジェクト: nickchal/pash
		internal string GetRuntimeAssemblyPath(WorkflowJobDefinition definition)
		{
			DefinitionCache.WorkflowDetails workflowDetail;
			if (this._workflowDetailsCache.TryGetValue(definition, out workflowDetail))
			{
				return workflowDetail.CompiledAssemblyPath;
			}
			else
			{
				return null;
			}
		}
コード例 #34
0
ファイル: DefinitionCache.cs プロジェクト: modulexcite/pash-1
        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);
            }
        }
コード例 #35
0
ファイル: DefinitionCache.cs プロジェクト: nickchal/pash
		internal string GetWorkflowXaml(WorkflowJobDefinition definition)
		{
			return definition.Xaml;
		}
コード例 #36
0
        /// <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;
        }
コード例 #37
0
ファイル: PSWorkflowJob.cs プロジェクト: nickchal/pash
		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();
		}