private void CheckDependency(CompositionDependency dependency, HashSet<ExportDescriptorPromise> @checked, Stack<CompositionDependency> checking)
        {
            if (@checked.Contains(dependency.Target))
            {
                var sharedSeen = false;
                var nonPrereqSeen = !dependency.IsPrerequisite;

                foreach (var step in checking)
                {
                    if (step.Target.IsShared)
                        sharedSeen = true;

                    if (sharedSeen && nonPrereqSeen)
                        break;

                    if (step.Target.Equals(dependency.Target))
                    {
                        var message = new StringBuilder();
                        message.AppendFormat(Properties.Resources.ExportDescriptor_UnsupportedCycle, dependency.Target.Origin);
                        message.AppendLine();
                        message.Append(DescribeCompositionStack(dependency, checking));
                        throw ThrowHelper.CompositionException(message.ToString());
                    }

                    if (!step.IsPrerequisite)
                        nonPrereqSeen = true;
                }
            }

            CheckTarget(dependency, @checked, checking);
        }
        private void CheckTarget(CompositionDependency dependency, HashSet <ExportDescriptorPromise> @checked, Stack <CompositionDependency> checking)
        {
            if (dependency.IsError)
            {
                var message = new StringBuilder();
                dependency.DescribeError(message);
                message.AppendLine();
                message.Append(DescribeCompositionStack(dependency, checking));

                throw ThrowHelper.CompositionException(message.ToString());
            }

            if (@checked.Contains(dependency.Target))
            {
                return;
            }

            @checked.Add(dependency.Target);

            checking.Push(dependency);
            foreach (var dep in dependency.Target.Dependencies)
            {
                CheckDependency(dep, @checked, checking);
            }
            checking.Pop();
        }
Exemplo n.º 3
0
 /// <summary>
 /// Resolve dependencies on all implementations of a contract.
 /// </summary>
 /// <param name="site">A tag describing the dependency site.</param>
 /// <param name="contract">The contract required by the site.</param>
 /// <param name="isPrerequisite">True if the dependency must be satisifed before corresponding exports can be retrieved; otherwise, false.</param>
 /// <returns>Dependencies for all implementations of the contact.</returns>
 public IEnumerable<CompositionDependency> ResolveDependencies(object site, CompositionContract contract, bool isPrerequisite)
 {
     var all = GetPromises(contract).ToArray();
     var result = new CompositionDependency[all.Length];
     for (var i = 0; i < all.Length; ++i)
         result[i] = CompositionDependency.Satisfied(contract, all[i], isPrerequisite, site);
     return result;
 }
Exemplo n.º 4
0
        /// <summary>
        /// Resolve a required dependency on exactly one implemenation of a contract.
        /// </summary>
        /// <param name="site">A tag describing the dependency site.</param>
        /// <param name="contract">The contract required by the site.</param>
        /// <param name="isPrerequisite">True if the dependency must be satisifed before corresponding exports can be retrieved; otherwise, false.</param>
        /// <returns>The dependency.</returns>
        public CompositionDependency ResolveRequiredDependency(object site, CompositionContract contract, bool isPrerequisite)
        {
            CompositionDependency result;

            if (!TryResolveOptionalDependency(site, contract, isPrerequisite, out result))
            {
                return(CompositionDependency.Missing(contract, site));
            }

            return(result);
        }
Exemplo n.º 5
0
        /// <summary>
        /// Resolve dependencies on all implementations of a contract.
        /// </summary>
        /// <param name="site">A tag describing the dependency site.</param>
        /// <param name="contract">The contract required by the site.</param>
        /// <param name="isPrerequisite">True if the dependency must be satisifed before corresponding exports can be retrieved; otherwise, false.</param>
        /// <returns>Dependencies for all implementations of the contact.</returns>
        public IEnumerable <CompositionDependency> ResolveDependencies(object site, CompositionContract contract, bool isPrerequisite)
        {
            var all    = GetPromises(contract).ToArray();
            var result = new CompositionDependency[all.Length];

            for (var i = 0; i < all.Length; ++i)
            {
                result[i] = CompositionDependency.Satisfied(contract, all[i], isPrerequisite, site);
            }
            return(result);
        }
Exemplo n.º 6
0
        /// <summary>
        /// Resolve an optional dependency on exactly one implemenation of a contract.
        /// </summary>
        /// <param name="site">A tag describing the dependency site.</param>
        /// <param name="contract">The contract required by the site.</param>
        /// <param name="isPrerequisite">True if the dependency must be satisifed before corresponding exports can be retrieved; otherwise, false.</param>
        /// <param name="dependency">The dependency, or null.</param>
        /// <returns>True if the dependency could be resolved; otherwise, false.</returns>
        public bool TryResolveOptionalDependency(object site, CompositionContract contract, bool isPrerequisite, out CompositionDependency dependency)
        {
            var all = GetPromises(contract).ToArray();
            if (all.Length == 0)
            {
                dependency = null;
                return false;
            }

            if (all.Length != 1)
            {
                dependency = CompositionDependency.Oversupplied(contract, all, site);
                return true;
            }

            dependency = CompositionDependency.Satisfied(contract, all[0], isPrerequisite, site);
            return true;
        }
        private StringBuilder DescribeCompositionStack(CompositionDependency import, IEnumerable <CompositionDependency> dependencies)
        {
            var result = new StringBuilder();

            if (dependencies.FirstOrDefault() == null)
            {
                return(result);
            }

            foreach (var step in dependencies)
            {
                result.AppendFormat(Properties.Resources.ExportDescriptor_DependencyErrorLine, import.Site, step.Target.Origin);
                result.AppendLine();
                import = step;
            }

            result.AppendFormat(Properties.Resources.ExportDescriptor_DependencyErrorContract, import.Contract);
            return(result);
        }
Exemplo n.º 8
0
        /// <summary>
        /// Resolve an optional dependency on exactly one implemenation of a contract.
        /// </summary>
        /// <param name="site">A tag describing the dependency site.</param>
        /// <param name="contract">The contract required by the site.</param>
        /// <param name="isPrerequisite">True if the dependency must be satisifed before corresponding exports can be retrieved; otherwise, false.</param>
        /// <param name="dependency">The dependency, or null.</param>
        /// <returns>True if the dependency could be resolved; otherwise, false.</returns>
        public bool TryResolveOptionalDependency(object site, CompositionContract contract, bool isPrerequisite, out CompositionDependency dependency)
        {
            var all = GetPromises(contract).ToArray();

            if (all.Length == 0)
            {
                dependency = null;
                return(false);
            }

            if (all.Length != 1)
            {
                dependency = CompositionDependency.Oversupplied(contract, all, site);
                return(true);
            }

            dependency = CompositionDependency.Satisfied(contract, all[0], isPrerequisite, site);
            return(true);
        }
        private static StringBuilder DescribeCompositionStack(CompositionDependency import, Stack <CompositionDependency> dependencies)
        {
            var result = new StringBuilder();

            if (dependencies.Count == 0 || dependencies.Peek() == null)
            {
                return(result);
            }

            foreach (CompositionDependency step in dependencies)
            {
                result.AppendFormat(SR.ExportDescriptor_DependencyErrorLine, import.Site, step.Target.Origin);
                result.AppendLine();
                import = step;
            }

            result.AppendFormat(SR.ExportDescriptor_DependencyErrorContract, import.Contract);
            return(result);
        }
        private void CheckDependency(CompositionDependency dependency, HashSet <ExportDescriptorPromise> @checked, Stack <CompositionDependency> checking)
        {
            if (@checked.Contains(dependency.Target))
            {
                var sharedSeen    = false;
                var nonPrereqSeen = !dependency.IsPrerequisite;

                foreach (var step in checking)
                {
                    if (step.Target.IsShared)
                    {
                        sharedSeen = true;
                    }

                    if (sharedSeen && nonPrereqSeen)
                    {
                        break;
                    }

                    if (step.Target.Equals(dependency.Target))
                    {
                        var message = new StringBuilder();
                        message.AppendFormat(SR.ExportDescriptor_UnsupportedCycle, dependency.Target.Origin);
                        message.AppendLine();
                        message.Append(DescribeCompositionStack(dependency, checking));

                        var ex = new CompositionFailedException(message.ToString());
                        Debug.WriteLine(SR.Diagnostic_ThrowingException, ex.ToString());
                        throw ex;
                    }

                    if (!step.IsPrerequisite)
                    {
                        nonPrereqSeen = true;
                    }
                }
            }

            CheckTarget(dependency, @checked, checking);
        }
        private void CheckTarget(CompositionDependency dependency, HashSet<ExportDescriptorPromise> @checked, Stack<CompositionDependency> checking)
        {
            if (dependency.IsError)
            {
                var message = new StringBuilder();
                dependency.DescribeError(message);
                message.AppendLine();
                message.Append(DescribeCompositionStack(dependency, checking));

                throw ThrowHelper.CompositionException(message.ToString());
            }

            if (@checked.Contains(dependency.Target))
                return;

            @checked.Add(dependency.Target);

            checking.Push(dependency);
            foreach (var dep in dependency.Target.Dependencies)
                CheckDependency(dep, @checked, checking);
            checking.Pop();
        }
        void CheckDependency(CompositionDependency dependency, HashSet <ExportDescriptorPromise> @checked, Stack <CompositionDependency> checking)
        {
            if (@checked.Contains(dependency.Target))
            {
                var sharedSeen    = false;
                var nonPrereqSeen = !dependency.IsPrerequisite;

                foreach (var step in checking)
                {
                    if (step.Target.IsShared)
                    {
                        sharedSeen = true;
                    }

                    if (sharedSeen && nonPrereqSeen)
                    {
                        break;
                    }

                    if (step.Target.Equals(dependency.Target))
                    {
                        var message = new StringBuilder();
                        message.AppendFormat(System.Composition.Properties.Resources.ExportDescriptor_UnsupportedCycle, dependency.Target.Origin);
                        message.AppendLine();
                        message.Append(DescribeCompositionStack(dependency, checking));
                        throw ThrowHelper.CompositionException(message.ToString());
                    }

                    if (!step.IsPrerequisite)
                    {
                        nonPrereqSeen = true;
                    }
                }
            }

            CheckTarget(dependency, @checked, checking);
        }
        private StringBuilder DescribeCompositionStack(CompositionDependency import, IEnumerable<CompositionDependency> dependencies)
        {
            var result = new StringBuilder();
            if (dependencies.FirstOrDefault() == null)
            {
                return result;
            }

            foreach (var step in dependencies)
            {
                result.AppendFormat(Properties.Resources.ExportDescriptor_DependencyErrorLine, import.Site, step.Target.Origin);
                result.AppendLine();
                import = step;
            }

            result.AppendFormat(Properties.Resources.ExportDescriptor_DependencyErrorContract, import.Contract);
            return result;
        }