static void InitializeDataTransformers(ResolutionContext ctx, ConvertionManager cm)
        {
            var transformers = new DataTransformer[]
            {
                new StringDataTransformer(),
                new TypeHandleDataTransformer(),
                new VersionDataTransformer(),
                new GuidDataTransformer(),
                new DateTimeDataTransformer(),
                new TimeSpanDataTransformer(),

                new BooleanDataTransformer(),
                new CharDataTransformer(),
                new SByteDataTransformer(),
                new ByteDataTransformer(),
                new Int16DataTransformer(),
                new UInt16DataTransformer(),
                new Int32DataTransformer(),
                new UInt32DataTransformer(),
                new Int64DataTransformer(),
                new UInt64DataTransformer(),
                new SingleDataTransformer(),
                new DoubleDataTransformer(),
                new DecimalDataTransformer(),
            };

            foreach (var transformer in transformers)
            {
                transformer.Intialize(ctx, cm);
            }
        }
        // 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.
        internal override ResolutionStatus Resolve(IMessageDialog dialog, ConvertionManager convertionManager, ResolutionContext ctx)
        {
            if (Type == null)
            {
                Type = ctx.GetUniqueAddinType(DeclaringAddin, TypeName);
                if (Type == null)
                {
                    dialog.AddError(string.Format("Can not find the specified extension point 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(ResolveType(Type));
        }
Пример #3
0
 protected AddinResolver(AddinStorage addinStorage, AddinRelationManager addinRelationManager, ConvertionManager convertionManager)
 {
     AddinStorage         = addinStorage;
     AddinRelationManager = addinRelationManager;
     ConvertionManager    = convertionManager;
     _addinParsers        = new List <AddinParser> {
         new XmlAddinParser()
     };
 }
Пример #4
0
 protected AddinResolver(IndexManager indexManager, BodyRepository bodyRepo, ConvertionManager convertionManager)
 {
     _indexManager      = indexManager;
     _bodyRepo          = bodyRepo;
     _convertionManager = convertionManager;
     _addinParsers      = new List <AddinParser> {
         new XmlAddinParser()
     };
 }
        // apply some rules.
        protected bool ApplyRules(IMessageDialog dialog, ResolutionContext ctx, ConvertionManager convertionManager)
        {
            var result = this.ExtensionBuildersMatchParent(dialog);

            if (!this.ExtensionDataMatchesExtensionBuilder(dialog, ctx, convertionManager))
            {
                result = false;
            }
            return(result);
        }
Пример #6
0
 internal ResolutionStatus Resolve(ResolutionResult resolutionResult, ConvertionManager convertionManager, ResolutionContext ctx)
 {
     if (_resolutionStatus.IsFailed())
     {
         return(ResolutionStatus.Failed);
     }
     if (_resolutionStatus.IsSuccess())
     {
         return(ResolutionStatus.Success);
     }
     _resolutionStatus = DoResolve(resolutionResult, convertionManager, ctx);
     return(_resolutionStatus);
 }
        internal ResolutionStatus Resolve(IMessageDialog dialog, ConvertionManager convertionManager, ResolutionContext ctx)
        {
            var result = ResolutionStatus.Success;

            for (int i = 0; i < Count; i++)
            {
                var status = this[i].Resolve(dialog, convertionManager, ctx);
                if (status == ResolutionStatus.Success)
                {
                    return(ResolutionStatus.Success);
                }
                result |= status;
            }
            return(result);
        }
        internal override ResolutionStatus Resolve(IMessageDialog dialog, ConvertionManager convertionManager,
                                                   ResolutionContext ctx)
        {
            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);
                    }
                    Parent = exResolution;
                }
                else
                {
                    Parent = epResolution;
                }
            }

            if (Head.SiblingId != null && Sibling == null)
            {
                ExtensionResolution sibling;
                if (!ctx.TryGetExtension(dialog, Head.SiblingPath, out sibling))
                {
                    return(ResolutionStatus.Failed);
                }
                Sibling = sibling;
            }

            if (ExtensionBuilder == null)
            {
                // the extension builder can only be declared in:
                // the same addin where this extension is declared or other affected addins (use the uid to get the extension builder directly)
                // otherwise, it would not be an indirectly affected addin.
                ExtensionBuilderResolution eb;
                if (!ctx.TryGetExtensionBuilder(dialog, Head.ExtensionBuilderUid, out eb))
                {
                    return(ResolutionStatus.Failed);
                }
                ExtensionBuilder = eb;
            }

            return(Sibling != null
                ? ResolveAddin(ExtensionBuilder) | ResolveAddin(Parent) | ResolveAddin(Sibling)
                : ResolveAddin(ExtensionBuilder) | ResolveAddin(Parent));
        }
Пример #9
0
        // just make sure all dependencies exists
        internal override ResolutionStatus Resolve(IMessageDialog dialog, ConvertionManager convertionManager, ResolutionContext ctx)
        {
            // Tries to get the parent
            if (Parent == null)
            {
                if (ParentIsExtensionPoint)
                {
                    ExtensionPointResolution parent;
                    if (!ctx.TryGetExtensionPoint(dialog, ParentPath, out parent))
                    {
                        return(ResolutionStatus.Failed);
                    }
                    if (parent.Type == null)
                    {
                        return(ResolutionStatus.Pending);
                    }
                    Parent = parent;
                }
                else
                {
                    ExtensionBuilderResolution parent;
                    if (!ctx.TryGetExtensionBuilder(dialog, ParentPath, out parent))
                    {
                        return(ResolutionStatus.Failed);
                    }
                    if (parent.Type == null)
                    {
                        return(ResolutionStatus.Pending);
                    }
                    Parent = parent;
                }
            }

            if (Type == null)
            {
                Type = ctx.GetUniqueAddinType(DeclaringAddin, TypeName);
                if (Type == null)
                {
                    return(ResolutionStatus.Failed);
                }
            }

            return(ResolveAddin(Parent));
        }
        public void Initialize()
        {
            _imagesPathList = new List <string>()
            {
                "path1",
                "path2",
                "path3"
            };

            _autoMock = new AutoMocker();

            _autoMock
            .Setup <ImagesReader, List <string> >(x => x.GetListOfImages(ImagesFolderPath))
            .Returns(_imagesPathList);

            _autoMock.Setup <PdfGenerator>(x => x.GenerateForImages(_imagesPathList));

            _convertionManager = _autoMock.CreateInstance <ConvertionManager>();
        }
Пример #11
0
 static void InitializeConvertion(ConvertionManager convertionManager)
 {
     convertionManager.Register(new StringToVersionConverter());
     convertionManager.Register(new StringToGuidConverter());
     convertionManager.Register(new StringToDateTimeConverter());
     convertionManager.Register(new StringToTimeSpanConverter());
     convertionManager.Register(new StringToDecimalConverter());
     convertionManager.Register(new StringToBooleanConverter());
     convertionManager.Register(new StringToCharConverter());
     convertionManager.Register(new StringToSByteConverter());
     convertionManager.Register(new StringToByteConverter());
     convertionManager.Register(new StringToInt16Converter());
     convertionManager.Register(new StringToUInt16Converter());
     convertionManager.Register(new StringToInt32Converter());
     convertionManager.Register(new StringToUInt32Converter());
     convertionManager.Register(new StringToInt64Converter());
     convertionManager.Register(new StringToUInt64Converter());
     convertionManager.Register(new StringToSingleConverter());
     convertionManager.Register(new StringToDoubleConverter());
 }
        internal override ResolutionStatus Resolve(IMessageDialog dialog, ConvertionManager convertionManager, ResolutionContext ctx)
        {
            if (Type == null)
            {
                Type = ctx.GetUniqueAddinType(DeclaringAddin, TypeName);
                if (Type == null)
                {
                    return(ResolutionStatus.Failed);
                }

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

            return(ResolveType(Type));
        }
Пример #13
0
        internal override ResolutionStatus Resolve(IMessageDialog dialog, ConvertionManager convertionManager, ResolutionContext ctx)
        {
            // Tries to get the parent
            if (Parent == null)
            {
                if (ParentIsExtensionPoint)
                {
                    ExtensionPointResolution parent;
                    if (!ctx.TryGetExtensionPoint(dialog, ParentPath, out parent))
                    {
                        return(ResolutionStatus.Failed);
                    }
                    Parent = parent;
                }
                else
                {
                    ExtensionBuilderResolution parent;
                    if (!ctx.TryGetExtensionBuilder(dialog, ParentPath, out parent))
                    {
                        return(ResolutionStatus.Failed);
                    }
                    Parent = parent;
                }
            }

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

            return(ResolveAddin(Parent) | _referenced.Resolve(dialog, convertionManager, ctx));
        }
        // @return value: whether the persistence file has been updated.
        public ResolutionResult Resolve(INameConvention nameConvention, AddinFileSettings fileSettings, AssemblyLoadPolicy assemblyLoadPolicy,
                                        AddinStorage addinStorage, AddinRelationManager relationManager,
                                        ScanFilePackResult scanFilePackResult)
        {
            var ctx = new ResolutionContext();
            var cm  = new ConvertionManager();

            InitializeDataTransformers(ctx, cm);

            if (assemblyLoadPolicy.PrivateAssemblyProbingDirectories != null)
            {
                foreach (var privateAssemblyProbingDirectory in assemblyLoadPolicy.PrivateAssemblyProbingDirectories)
                {
                    AssemblyResolution.AddSearchDirectory(privateAssemblyProbingDirectory);
                }
            }

            var resolver = new DefaultAddinResolver(addinStorage, relationManager, cm);

            // 强制 ExtensionBuilder 节点应用 NameConvention
            return(resolver.Resolve(nameConvention, ctx, scanFilePackResult));
        }
Пример #15
0
        // @return value: whether the persistence file (AddinIndexManager/AddinBodyRepository) has been updated.
        public bool Resolve(IMessageDialog dialog, FilePackResult filePackResult, string persistentFile, string transactionFile)
        {
            var storage      = StorageHelper.CreateStorage(persistentFile, transactionFile);
            var indexManager = new IndexManager {
                Storage = storage
            };

            if (indexManager.Read())
            {
                indexManager.Build();
            }
            var bodyRepo = new BodyRepository {
                Storage = storage
            };
            var convertionManager = new ConvertionManager();

            InitializeConvertion(convertionManager);

            var resolver    = new DefaultAddinResolver(indexManager, bodyRepo, convertionManager);
            var hasNewAddin = resolver.Resolve(dialog, filePackResult);

            //storage.Close();
            return(hasNewAddin);
        }
Пример #16
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));
        }
Пример #17
0
 protected abstract ResolutionStatus DoResolve(ResolutionResult resolutionResult, ConvertionManager convertionManager, ResolutionContext ctx);
Пример #18
0
        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 addin activator type [{0}]!", TypeName));
                    return(ResolutionStatus.Failed);
                }

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

                //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));
        }
Пример #19
0
        internal override bool Transform(string propName, string propData, ResolutionContext ctx, ConvertionManager cm, ExtensionResolution ex)
        {
            // convert to custom type (with an ObjectConverter registered in ConvertionManager).
            var objectConverter = cm.TryGet(typeof(string), ExtensionDataType);

            if (objectConverter == null)
            {
                return(false);
            }

            // if an property value is provided for the property name, try to convert it.
            object propValue;

            if (!objectConverter.TryConvert(propData, out propValue))
            {
                return(false);
            }

            var holder = new Int32Holder(propValue);

            ex.Data.AddDataHolder(propName, holder);

            return(true);
        }
        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));
        }
Пример #21
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));
        }
        protected override ResolutionStatus DoResolve(ResolutionResult resolutionResult, ConvertionManager convertionManager, ResolutionContext ctx)
        {
            if (Type == null)
            {
                Type = ctx.GetUniqueAddinType(DeclaringAddin, TypeName);
                if (Type == null)
                {
                    return(ResolutionStatus.Failed);
                }

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

            return(ResolveType(Type));
        }
Пример #23
0
 // apply some rules.
 protected bool ApplyRules(ResolutionResult resolutionResult, ResolutionContext ctx, ConvertionManager convertionManager)
 {
     return(this.ExtensionBuildersMatchParent(resolutionResult) &&
            this.ExtensionDataMatchesExtensionBuilder(resolutionResult, ctx, convertionManager));
 }
Пример #24
0
        internal ResolutionStatus Resolve(ResolutionResult resolutionResult, ConvertionManager convertionManager, ResolutionContext ctx)
        {
            if (_resolutionStatus != ResolutionStatus.Pending)
            {
                return(_resolutionStatus);
            }

            if (AddinActivator != null)
            {
                var resolutionStatus = AddinActivator.Resolve(resolutionResult, convertionManager, ctx);
                if (resolutionStatus == ResolutionStatus.Failed)
                {
                    _resolutionStatus = ResolutionStatus.Failed;
                    return(_resolutionStatus);
                }
            }

            if (ExtensionPoints != null)
            {
                foreach (var extensionPoint in ExtensionPoints)
                {
                    var resolutionStatus = extensionPoint.Resolve(resolutionResult, convertionManager, ctx);
                    if (resolutionStatus == ResolutionStatus.Success)
                    {
                        continue;
                    }
                    else if (resolutionStatus == ResolutionStatus.Failed)
                    {
                        _resolutionStatus = ResolutionStatus.Failed;
                        return(_resolutionStatus);
                    }
                    else
                    {
                        return(ResolutionStatus.Pending);
                    }
                }
            }

            var extensionBuilders = GetAllExtensionBuilders();

            if (extensionBuilders != null)
            {
                foreach (var extensionBuilder in extensionBuilders)
                {
                    var resolutionStatus = extensionBuilder.Resolve(resolutionResult, convertionManager, ctx);
                    if (resolutionStatus == ResolutionStatus.Success)
                    {
                        continue;
                    }
                    else if (resolutionStatus == ResolutionStatus.Failed)
                    {
                        _resolutionStatus = ResolutionStatus.Failed;
                        return(_resolutionStatus);
                    }
                    else
                    {
                        return(ResolutionStatus.Pending);
                    }
                }
            }

            var extensions = GetAllExtensions();

            if (extensions != null)
            {
                foreach (var extension in extensions)
                {
                    var resolutionStatus = extension.Resolve(resolutionResult, convertionManager, ctx);
                    if (resolutionStatus == ResolutionStatus.Success)
                    {
                        continue;
                    }
                    else if (resolutionStatus == ResolutionStatus.Failed)
                    {
                        _resolutionStatus = ResolutionStatus.Failed;
                        return(_resolutionStatus);
                    }
                    else
                    {
                        return(ResolutionStatus.Pending);
                    }
                }
            }

            if (_referencedAssemblySets != null)
            {
                foreach (var referencedAssemblySet in _referencedAssemblySets)
                {
                    var resolutionStatus = referencedAssemblySet.Resolve(resolutionResult, convertionManager, ctx);
                    if (resolutionStatus == ResolutionStatus.Success)
                    {
                        continue;
                    }
                    else if (resolutionStatus == ResolutionStatus.Failed)
                    {
                        _resolutionStatus = ResolutionStatus.Failed;
                        return(_resolutionStatus);
                    }
                    else
                    {
                        return(ResolutionStatus.Pending);
                    }
                }
            }

            _resolutionStatus = ResolutionStatus.Success;
            return(_resolutionStatus);
        }
Пример #25
0
        //internal override bool Equals(ExtensionBuilderResolution other) { throw new NotImplementedException(); }

        protected override ResolutionStatus DoResolve(ResolutionResult resolutionResult, ConvertionManager convertionManager, ResolutionContext ctx)
        {
            // Tries to get the parent
            if (Parent == null)
            {
                if (ParentIsExtensionPoint)
                {
                    ExtensionPointResolution parent;
                    if (!ctx.TryGetExtensionPoint(resolutionResult, ParentPath, out parent))
                    {
                        return(ResolutionStatus.Failed);
                    }
                    Parent = parent;
                }
                else
                {
                    ExtensionBuilderResolution parent;
                    if (!ctx.TryGetExtensionBuilder(resolutionResult, ParentPath, out parent))
                    {
                        return(ResolutionStatus.Failed);
                    }
                    Parent = parent;
                }
            }

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

            return(ResolveAddin(Parent) | _referenced.Resolve(resolutionResult, convertionManager, ctx));
        }
Пример #26
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));
        }
Пример #27
0
 internal override ResolutionStatus Resolve(IMessageDialog dialog, ConvertionManager convertionManager, ResolutionContext ctx)
 {
     throw new NotImplementedException();
 }
Пример #28
0
 internal DefaultAddinResolver(IndexManager indexManager, BodyRepository bodyRepo, ConvertionManager convertionManager)
     : base(indexManager, bodyRepo, convertionManager)
 {
 }
 internal DefaultAddinResolver(AddinStorage addinStorage, AddinRelationManager addinRelationManager, ConvertionManager convertionManager)
     : base(addinStorage, addinRelationManager, convertionManager)
 {
 }
Пример #30
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));
        }