// The resolution of an extension point depends on the existence of its implementation type (IExtensionPoint<TExtension, TRoot>),
        // extension type (TExtension) and root type (TRoot), and it needs to obey some rules.
        protected override ResolutionStatus DoResolve(ResolutionResult resolutionResult, ConvertionManager convertionManager, ResolutionContext ctx)
        {
            if (Type == null)
            {
                Type = ctx.GetUniqueAddinType(DeclaringAddin, TypeName);
                if (Type == null)
                {
                    resolutionResult.AddError(string.Format("Can not find the specified extension point type [{0}]!", TypeName));
                    return(ResolutionStatus.Failed);
                }

                TypeResolution extensionType, extensionRootType;
                if (!ApplyRules(resolutionResult, ctx, out extensionType, out extensionRootType))
                {
                    return(ResolutionStatus.Failed);
                }
                ExtensionType     = extensionType;
                ExtensionRootType = extensionRootType;

                if (Type.Assembly.DeclaringAddin != null &&
                    !ReferenceEquals(Type.Assembly.DeclaringAddin, DeclaringAddin))
                {
                    AssemblyResolutionSet assemblySet;
                    if (!ctx.TryGetAssemblySet(Type.Assembly.AssemblyKey, out assemblySet))
                    {
                        throw new Exception();
                    }
                    DeclaringAddin.AddReferencedAssemblySet(assemblySet);
                }
            }

            return(ResolveType(Type));
        }
Example #2
0
        protected override ResolutionStatus DoResolve(ResolutionResult resolutionResult, ConvertionManager convertionManager, ResolutionContext ctx)
        {
            if (Parent != null && ExtensionBuilder != null)
            {
                // all dependencies that might be declared in other addins has been retrieved.
                if (Head.SiblingId != null && Sibling != null)
                {
                    return(ResolveAddin(ExtensionBuilder) | ResolveAddin(Parent) | ResolveAddin(Sibling));
                }
                if (Head.SiblingId == null)
                {
                    return(ResolveAddin(ExtensionBuilder) | ResolveAddin(Parent));
                }
            }

            if (Parent == null)
            {
                ExtensionPointResolution epResolution;
                if (!ctx.TryGetExtensionPoint(resolutionResult, Head.ParentPath, out epResolution))
                {
                    ExtensionResolution exResolution;
                    if (!ctx.TryGetExtension(resolutionResult, Head.ParentPath, out exResolution))
                    {
                        resolutionResult.AddError(string.Format("Can not find the parent of the specified extension [{0}] with path [{1}]!", Head.Path, Head.ParentPath));
                        return(ResolutionStatus.Failed);
                    }
                    if (!ReferenceEquals(exResolution.DeclaringAddin, DeclaringAddin))
                    {
                        if (exResolution.DeclaringAddin.ResolutionStatus != ResolutionStatus.Success)
                        {
                            return(exResolution.DeclaringAddin.ResolutionStatus); // 上级对象解析 failed,子对象解析就 failed。上级 pending,此处也是 pending。
                        }
                        DeclaringAddin.AddExtendedAddin(exResolution.DeclaringAddin);
                    }
                    //if (!ReferenceEquals(exResolution.DeclaringAddin, DeclaringAddin))
                    //{
                    var ep = GetExtensionPointFor(exResolution);
                    if (ep == null)
                    {
                        return(ResolutionStatus.Pending); // the extension point is probably not available right now.
                    }
                    DeclaringAddin.AddExtendedExtensionPoint(ep);
                    //}
                    Parent = exResolution;
                }
                else
                {
                    if (!ReferenceEquals(epResolution.DeclaringAddin, DeclaringAddin))
                    {
                        if (epResolution.DeclaringAddin.ResolutionStatus != ResolutionStatus.Success)
                        {
                            return(epResolution.DeclaringAddin.ResolutionStatus); // 上级对象解析 failed,子对象解析就 failed。上级 pending,此处也是 pending。
                        }
                        DeclaringAddin.AddExtendedAddin(epResolution.DeclaringAddin);
                    }
                    //if (!ReferenceEquals(epResolution.DeclaringAddin, DeclaringAddin))
                    DeclaringAddin.AddExtendedExtensionPoint(epResolution);
                    Parent = epResolution;
                }
            }

            if (ExtensionBuilder == null)
            {
                ExtensionBuilderResolution eb;
                // the extension builder might be declared in:
                // 1. the same addin where this extension is declared or other affected addins (use the uid to get the extension builder directly)
                // 2. an updated addin (use the uid to get the extension builder path, and then use that path to get the extension builder)
                if (!ctx.TryGetExtensionBuilder(resolutionResult, Head.ExtensionBuilderUid, out eb))
                {
                    string extensionBuilderPath;
                    if (!ctx.TryGetExtensionBuilderPath(resolutionResult, Head.ExtensionBuilderUid, out extensionBuilderPath))
                    {
                        return(ResolutionStatus.Failed);
                    }
                    if (!ctx.TryGetExtensionBuilder(resolutionResult, extensionBuilderPath, out eb))
                    {
                        return(ResolutionStatus.Failed);
                    }
                }
                // The type of extension builder must be loaded before this extension, and it might not defined in the same
                // addin as current extension (ex), so we needs to add its declaring addin as a reference.
                // !!!Note that the extension point type, as well as extension type (T of IExtensionBuilder<T> implmentation)
                // must be loaded before this extension too, but we'll let the extension builder to reference them.
                if (!ReferenceEquals(eb.DeclaringAddin, DeclaringAddin))
                {
                    if (eb.Type == null)
                    {
                        return(ResolutionStatus.Pending);
                    }
                    if (!ReferenceEquals(eb.Type.Assembly.DeclaringAddin, DeclaringAddin))
                    {
                        AssemblyResolutionSet assemblySet;
                        if (!ctx.TryGetAssemblySet(eb.Type.Assembly.AssemblyKey, out assemblySet))
                        {
                            throw new Exception();
                        }
                        DeclaringAddin.AddReferencedAssemblySet(assemblySet);
                    }
                }
                ExtensionBuilder = eb;
            }

            if (Head.SiblingId != null && Sibling == null)
            {
                ExtensionResolution sibling;
                if (!ctx.TryGetExtension(resolutionResult, Head.SiblingPath, out sibling))
                {
                    resolutionResult.AddError(string.Format("Can not find the sibling extension of the specified extension [{0}] with path [{1}]!", Head.Path, Head.SiblingPath));
                    return(ResolutionStatus.Failed);
                }
                // The metadata of the sibling extension must be loaded before this extension, so we needs to add its declaring
                // addin as a dependency.
                if (!ReferenceEquals(sibling.DeclaringAddin, DeclaringAddin))
                {
                    if (sibling.DeclaringAddin.ResolutionStatus != ResolutionStatus.Success)
                    {
                        return(sibling.DeclaringAddin.ResolutionStatus); // 上级对象解析 failed,子对象解析就 failed。上级 pending,此处也是 pending。
                    }
                    DeclaringAddin.AddExtendedAddin(sibling.DeclaringAddin);
                }
                Sibling = sibling;
            }

            if (!ApplyRules(resolutionResult, ctx, convertionManager))
            {
                return(ResolutionStatus.Failed);
            }

            return(Sibling != null
                ? ResolveAddin(ExtensionBuilder) | ResolveAddin(Parent) | ResolveAddin(Sibling)
                : ResolveAddin(ExtensionBuilder) | ResolveAddin(Parent));
        }
Example #3
0
        // if we can find the referenced extension builder, the resolution is done.
        protected override ResolutionStatus DoResolve(ResolutionResult resolutionResult, ConvertionManager convertionManager, ResolutionContext ctx)
        {
            // Tries to get the parent
            if (Parent == null)
            {
                BaseExtensionPointResolution objParent;
                if (ParentIsExtensionPoint)
                {
                    ExtensionPointResolution parent;
                    if (!ctx.TryGetExtensionPoint(resolutionResult, ParentPath, out parent))
                    {
                        resolutionResult.AddError(string.Format("Can not find the parent of the specified extension builder [{0}] with path [{1}]!", TypeName, ParentPath));
                        return(ResolutionStatus.Failed);
                    }

                    Parent = parent;
                    DeclaringAddin.AddExtendedExtensionPoint(parent);
                    objParent = parent;
                }
                else
                {
                    ExtensionBuilderResolution parent;
                    if (!ctx.TryGetExtensionBuilder(resolutionResult, ParentPath, out parent))
                    {
                        resolutionResult.AddError(string.Format("Can not find the parent of the specified extension builder [{0}] with path [{1}]!", TypeName, ParentPath));
                        return(ResolutionStatus.Failed);
                    }

                    Parent = parent;
                    var ep = GetExtensionPointFor(parent);
                    if (ep == null)
                    {
                        return(ResolutionStatus.Pending); // the extension point is probably not available right now.
                    }
                    DeclaringAddin.AddExtendedExtensionPoint(ep);
                    objParent = parent;
                }

                if (objParent.DeclaringAddin != null && !ReferenceEquals(objParent.DeclaringAddin, DeclaringAddin))
                {
                    if (objParent.Type == null)
                    {
                        return(ResolutionStatus.Pending);
                    }
                    // The parent of current extension builder is not defined in the same addin as it is,
                    // so we needs to add its declaring addin as a reference (the type of the parent must
                    // be loaded before this extension builder at start up).
                    AssemblyResolutionSet assemblySet;
                    if (!ctx.TryGetAssemblySet(objParent.Type.Assembly.AssemblyKey, out assemblySet))
                    {
                        throw new Exception();
                    }
                    DeclaringAddin.AddReferencedAssemblySet(assemblySet);
                }
            }

            if (_referenced == null)
            {
                var referenced = TryFindReferencedExtensionBuilder(Parent, Name);
                if (referenced == null)
                {
                    if (!ctx.TryGetExtensionBuilder(resolutionResult, Path, out referenced))
                    {
                        return(ResolutionStatus.Failed);
                    }
                }

                if (referenced.DeclaringAddin != null && !ReferenceEquals(referenced.DeclaringAddin, DeclaringAddin))
                {
                    if (referenced.Type == null)
                    {
                        return(ResolutionStatus.Pending);
                    }
                    // The parent of current extension builder is not defined in the same addin as it is,
                    // so we needs to add its declaring addin as a reference (the type of the parent must
                    // be loaded before this extension builder at start up).
                    AssemblyResolutionSet assemblySet;
                    if (!ctx.TryGetAssemblySet(referenced.Type.Assembly.AssemblyKey, out assemblySet))
                    {
                        throw new Exception();
                    }
                    DeclaringAddin.AddReferencedAssemblySet(assemblySet);
                }

                _referenced = referenced;
            }

            return(ResolveAddin(Parent) | _referenced.Resolve(resolutionResult, convertionManager, ctx));
        }
Example #4
0
        // The resolution of an extension builder depends on the existence of its implementation type
        // (IExtensionBuilder<TExtension> / ICompositeExtensionBuilder<TExtension>) and extension type (TExtension),
        // and it obey some rules.
        protected override ResolutionStatus DoResolve(ResolutionResult resolutionResult, ConvertionManager convertionManager, ResolutionContext ctx)
        {
            // Tries to get the parent
            if (Parent == null)
            {
                //BaseExtensionPointResolution objParent;
                if (ParentIsExtensionPoint)
                {
                    ExtensionPointResolution parent;
                    if (!ctx.TryGetExtensionPoint(resolutionResult, ParentPath, out parent))
                    {
                        resolutionResult.AddError(string.Format("Can not find the parent of the specified extension builder [{0}] with path [{1}]!", TypeName, ParentPath));
                        return(ResolutionStatus.Failed);
                    }
                    if (!ReferenceEquals(parent.DeclaringAddin, DeclaringAddin))
                    {
                        if (parent.DeclaringAddin.ResolutionStatus != ResolutionStatus.Success)
                        {
                            return(parent.DeclaringAddin.ResolutionStatus); // 上级对象解析 failed,子对象解析就 failed。上级 pending,此处也是 pending。
                        }
                        if (parent.Type == null)
                        {
                            return(ResolutionStatus.Pending);
                        }
                        // The parent of current extension builder is not defined in the same addin as it is,
                        // so we needs to add its declaring addin as a reference (the type of the parent must
                        // be loaded before this extension builder at start up).
                        AssemblyResolutionSet assemblySet;
                        if (!ctx.TryGetAssemblySet(parent.Type.Assembly.AssemblyKey, out assemblySet))
                        {
                            throw new Exception();
                        }
                        DeclaringAddin.AddReferencedAssemblySet(assemblySet);
                    }
                    Parent = parent;
                    DeclaringAddin.AddExtendedExtensionPoint(parent);
                    //objParent = parent;
                }
                else
                {
                    ExtensionBuilderResolution parent;
                    if (!ctx.TryGetExtensionBuilder(resolutionResult, ParentPath, out parent))
                    {
                        resolutionResult.AddError(string.Format("Can not find the parent of the specified extension builder [{0}] with path [{1}]!", TypeName, ParentPath));
                        return(ResolutionStatus.Failed);
                    }
                    if (!ReferenceEquals(parent.DeclaringAddin, DeclaringAddin))
                    {
                        if (parent.DeclaringAddin.ResolutionStatus != ResolutionStatus.Success)
                        {
                            return(parent.DeclaringAddin.ResolutionStatus); // 上级对象解析 failed,子对象解析就 failed。上级 pending,此处也是 pending。
                        }
                        if (parent.Type == null)
                        {
                            return(ResolutionStatus.Pending);
                        }
                        // The parent of current extension builder is not defined in the same addin as it is,
                        // so we needs to add its declaring addin as a reference (the type of the parent must
                        // be loaded before this extension builder at start up).
                        AssemblyResolutionSet assemblySet;
                        if (!ctx.TryGetAssemblySet(parent.Type.Assembly.AssemblyKey, out assemblySet))
                        {
                            throw new Exception();
                        }
                        DeclaringAddin.AddReferencedAssemblySet(assemblySet);
                    }
                    Parent = parent;
                    var ep = GetExtensionPointFor(parent);
                    if (ep == null)
                    {
                        return(ResolutionStatus.Pending); // the extension point is probably not available right now.
                    }
                    DeclaringAddin.AddExtendedExtensionPoint(ep);
                    //objParent = parent;
                }
            }

            if (Type == null)
            {
                Type = ctx.GetUniqueAddinType(DeclaringAddin, TypeName);
                if (Type == null)
                {
                    resolutionResult.AddError(string.Format("Can not find the specified extension builder type [{0}]!", TypeName));
                    return(ResolutionStatus.Failed);
                }

                TypeResolution extensionType;
                if (!ApplyRules(resolutionResult, ctx, out extensionType))
                {
                    return(ResolutionStatus.Failed);
                }
                ExtensionType = extensionType;

                if (Type.Assembly.DeclaringAddin != null &&
                    !ReferenceEquals(Type.Assembly.DeclaringAddin, DeclaringAddin))
                {
                    AssemblyResolutionSet assemblySet;
                    if (!ctx.TryGetAssemblySet(Type.Assembly.AssemblyKey, out assemblySet))
                    {
                        throw new Exception();
                    }
                    DeclaringAddin.AddReferencedAssemblySet(assemblySet);
                }
            }

            return(ResolveAddin(Parent) | ResolveType(Type));
        }
Example #5
0
        // The resolution of an extension builder depends on the existence of its implementation type
        // (IExtensionBuilder<TExtension> / ICompositeExtensionBuilder<TExtension>) and extension type (TExtension),
        // and it obey some rules.
        internal override ResolutionStatus Resolve(IMessageDialog dialog, ConvertionManager convertionManager, ResolutionContext ctx)
        {
            // Tries to get the parent
            if (Parent == null)
            {
                BaseExtensionPointResolution objParent;
                if (ParentIsExtensionPoint)
                {
                    ExtensionPointResolution parent;
                    if (!ctx.TryGetExtensionPoint(dialog, ParentPath, out parent))
                    {
                        dialog.AddError(string.Format("Can not find the parent of the specified extension builder [{0}] with path [{1}]!", TypeName, ParentPath));
                        return(ResolutionStatus.Failed);
                    }
                    objParent = parent;
                }
                else
                {
                    ExtensionBuilderResolution parent;
                    if (!ctx.TryGetExtensionBuilder(dialog, ParentPath, out parent))
                    {
                        dialog.AddError(string.Format("Can not find the parent of the specified extension builder [{0}] with path [{1}]!", TypeName, ParentPath));
                        return(ResolutionStatus.Failed);
                    }
                    objParent = parent;
                }

                if (objParent.DeclaringAddin != null && !ReferenceEquals(objParent.DeclaringAddin, DeclaringAddin))
                {
                    if (objParent.Type == null)
                    {
                        return(ResolutionStatus.Pending);
                    }
                    // The parent of current extension builder is not defined in the same addin as it is,
                    // so we needs to add its declaring addin as a reference (the type of the parent must
                    // be loaded before this extension builder at start up).
                    AssemblyResolutionSet assemblySet;
                    if (!ctx.TryGetAssemblySet(objParent.Type.Assembly.AssemblyKey, out assemblySet))
                    {
                        throw new Exception();
                    }
                    DeclaringAddin.AddReferencedAssemblySet(assemblySet);
                }

                Parent = objParent;
            }

            if (Type == null)
            {
                Type = ctx.GetUniqueAddinType(DeclaringAddin, TypeName);
                if (Type == null)
                {
                    dialog.AddError(string.Format("Can not find the specified extension builder type [{0}]!", TypeName));
                    return(ResolutionStatus.Failed);
                }

                TypeResolution extensionType;
                if (!ApplyRules(dialog, ctx, out extensionType))
                {
                    return(ResolutionStatus.Failed);
                }
                ExtensionType = extensionType;

                if (Type.Assembly.DeclaringAddin != null &&
                    !ReferenceEquals(Type.Assembly.DeclaringAddin, DeclaringAddin))
                {
                    AssemblyResolutionSet assemblySet;
                    if (!ctx.TryGetAssemblySet(Type.Assembly.AssemblyKey, out assemblySet))
                    {
                        throw new Exception();
                    }
                    DeclaringAddin.AddReferencedAssemblySet(assemblySet);
                }
            }

            return(ResolveAddin(Parent) | ResolveType(Type));
        }
        internal override ResolutionStatus Resolve(IMessageDialog dialog, ConvertionManager convertionManager, ResolutionContext ctx)
        {
            if (Parent != null && ExtensionBuilder != null)
            {
                // all dependencies that might be declared in other addins has been retrieved.
                if (Head.SiblingId != null && Sibling != null)
                {
                    return(ResolveAddin(ExtensionBuilder) | ResolveAddin(Parent) | ResolveAddin(Sibling));
                }
                if (Head.SiblingId == null)
                {
                    return(ResolveAddin(ExtensionBuilder) | ResolveAddin(Parent));
                }
            }

            if (Parent == null)
            {
                ExtensionPointResolution epResolution;
                if (!ctx.TryGetExtensionPoint(dialog, Head.ParentPath, out epResolution))
                {
                    ExtensionResolution exResolution;
                    if (!ctx.TryGetExtension(dialog, Head.ParentPath, out exResolution))
                    {
                        return(ResolutionStatus.Failed);
                    }
                    if (!ReferenceEquals(exResolution.DeclaringAddin, DeclaringAddin))
                    {
                        var ep = GetExtensionPointFor(exResolution);
                        if (ep == null)
                        {
                            return(ResolutionStatus.Pending); // the extension point is probably not available right now.
                        }
                        DeclaringAddin.AddExtendedExtensionPoint(ep);
                    }
                    Parent = exResolution;
                }
                else
                {
                    if (!ReferenceEquals(epResolution.DeclaringAddin, DeclaringAddin))
                    {
                        DeclaringAddin.AddExtendedExtensionPoint(epResolution);
                    }
                    Parent = epResolution;
                }
                // The metadata of the parent (extension point or another extension) must be loaded before this extension,
                // so we needs to add its declaring addin as a dependency.
                if (!ReferenceEquals(Parent.DeclaringAddin, DeclaringAddin))
                {
                    DeclaringAddin.AddExtendedAddin(Parent.DeclaringAddin);
                }
            }

            if (ExtensionBuilder == null)
            {
                ExtensionBuilderResolution eb;
                // the extension builder might be declared in:
                // 1. the same addin where this extension is declared or other affected addins (use the uid to get the extension builder directly)
                // 2. an updated addin (use the uid to get the extension builder path, and then use that path to get the extension builder)
                if (!ctx.TryGetExtensionBuilder(dialog, Head.ExtensionBuilderUid, out eb))
                {
                    string extensionBuilderPath;
                    if (!ctx.TryGetExtensionBuilderPath(dialog, Head.ExtensionBuilderUid, out extensionBuilderPath))
                    {
                        return(ResolutionStatus.Failed);
                    }
                    if (!ctx.TryGetExtensionBuilder(dialog, extensionBuilderPath, out eb))
                    {
                        return(ResolutionStatus.Failed);
                    }
                }
                // The type of extension builder must be loaded before this extension, and it might not defined in the same
                // addin as current extension (ex), so we needs to add its declaring addin as a reference.
                // !!!Note that the extension point type must loaded before this extension too, but we'll let the extension
                // builder to refer to it.
                if (!ReferenceEquals(eb.DeclaringAddin, DeclaringAddin))
                {
                    if (eb.Type == null)
                    {
                        return(ResolutionStatus.Pending);
                    }
                    if (!ReferenceEquals(eb.Type.Assembly.DeclaringAddin, DeclaringAddin))
                    {
                        AssemblyResolutionSet assemblySet;
                        if (!ctx.TryGetAssemblySet(eb.Type.Assembly.AssemblyKey, out assemblySet))
                        {
                            throw new Exception();
                        }
                        DeclaringAddin.AddReferencedAssemblySet(assemblySet);
                    }
                }
                ExtensionBuilder = eb;
            }

            if (Head.SiblingId != null && Sibling == null)
            {
                ExtensionResolution sibling;
                if (!ctx.TryGetExtension(dialog, Head.SiblingPath, out sibling))
                {
                    return(ResolutionStatus.Failed);
                }
                Sibling = sibling;
                // The metadata of the sibling extension must be loaded before this extension, so we needs to add its declaring
                // addin as a dependency.
                if (!ReferenceEquals(sibling.DeclaringAddin, DeclaringAddin))
                {
                    DeclaringAddin.AddExtendedAddin(sibling.DeclaringAddin);
                }
            }

            if (!ApplyRules(dialog, ctx, convertionManager))
            {
                return(ResolutionStatus.Failed);
            }

            return(Sibling != null
                ? ResolveAddin(ExtensionBuilder) | ResolveAddin(Parent) | ResolveAddin(Sibling)
                : ResolveAddin(ExtensionBuilder) | ResolveAddin(Parent));
        }