public AddinConfiguration(IMessageDialog dialog, INameConvention nameConvention)
     : this(dialog,
            new FileConfiguration(),
            nameConvention,
            new ReflectionExtensionBuilderFactory(), new ReflectionExtensionPointFactory())
 {
 }
        internal override bool Introspect(INameConvention nameConvention, ResolutionResult resolutionResult)
        {
            var result = true;

            if (ExtensionPointName == null)
            {
                resolutionResult.AddError("An id of extension point must have an parent!");
                result = false;
            }
            if (ParentPath == null)
            {
                resolutionResult.AddError("An extension builder must have an parent!");
                result = false;
            }
            if (TypeName.IsNullOrWhiteSpace())
            {
                resolutionResult.AddError("An extension builder must at least provide a type name!");
                result = false;
            }
            if (Name != nameConvention.GetExtensionBuilderName(TypeName))
            {
                resolutionResult.AddError("The extension builder name and its type name does not comply with the name convention!");
                result = false;
            }
            return(result | DoIntrospect(nameConvention, resolutionResult, "extension builder"));
        }
 public AddinConfiguration(IMessageDialog dialog, FileConfiguration fileConfig, INameConvention nameConvention,
                           IExtensionBuilderFactory extensionBuilderFactory, IExtensionPointFactory extensionPointFactory)
 {
     _messageDialog  = dialog;
     _fileConfig     = fileConfig;
     _nameConvention = nameConvention;
     _ebFactory      = extensionBuilderFactory;
     _epFactory      = extensionPointFactory;
 }
        internal bool Introspect(INameConvention nameConvention, ResolutionResult resolutionResult)
        {
            var result = true;

            if (TypeName.IsNullOrWhiteSpace())
            {
                resolutionResult.AddError("An extension point must at least provide a type name!");
                result = false;
            }
            return(result | DoIntrospect(nameConvention, resolutionResult, "extension point"));
        }
        internal override bool Introspect(INameConvention nameConvention, ResolutionResult resolutionResult)
        {
            var result = true;

            if (ExtensionPointName == null)
            {
                resolutionResult.AddError("An id of extension point must have an parent!");
                result = false;
            }
            if (ParentPath == null)
            {
                resolutionResult.AddError("An extension builder must have an parent!");
                result = false;
            }
            return(result | DoIntrospect(nameConvention, resolutionResult, "extension builder"));
        }
示例#6
0
        internal AddinFramework(AddinOptions options)
        {
            _repository = new AddinRepository();

            _messageDialog      = options.MessageDialog ?? new DefaultMessageDialog();
            _nameConvention     = options.NameConvention ?? new DefaultNameConvention();
            _fileSettings       = options.FileSettings ?? new AddinFileSettings();
            _assemblyLoadPolicy = options.AssemblyLoadPolicy ?? new DefaultAssemblyLoadPolicy();
            _ebFactory          = options.ExtensionBuilderFactory ?? new ReflectionExtensionBuilderFactory();
            _epFactory          = options.ExtensionPointFactory ?? new ReflectionExtensionPointFactory();
            _eventBroker        = options.EventBroker ?? new EventBroker(new EventBrokerOption());
            _serviceProvider    = options.ServiceProvider ?? new DefaultServiceProvider();
            _stringLocalizer    = options.StringLocalizer ?? new DefaultStringLocalizer();

            LogManager.Initialize(new FileLogSetting(_fileSettings.DataDirectory, AddinFileSettings.LogFileName));
            _logger = LogManager.GetDefaultLogger();

            _properties = new Dictionary <HashKey, object>();
        }
        internal override bool Introspect(INameConvention nameConvention, ResolutionResult resolutionResult)
        {
            var result = true;

            if (AddinHeader == null)
            {
                resolutionResult.AddError(
                    string.Format("The addin located at [{0}] does not define any addin properties (name, guid, etc) in the Addin node of manifest file, which is required!", ManifestFile.Directory));
                result = false;
            }
            else
            {
                result &= AddinHeader.Introspect(ManifestFile.Directory, resolutionResult);
            }
            if (!result)
            {
                return(false);
            }

            if (AddinActivator != null)
            {
                result &= AddinActivator.Introspect(resolutionResult);
            }

            if (ExtensionSchema == null && Extensions == null)
            {
                resolutionResult.AddError(string.Format(
                                              "A valid addin manifest file must contain either an extension schema node, or an extension node, or both, while the addin [{0}] located at [{1}] does not provide any of them!", AddinHeader.Name, ManifestFile.Directory));
                result = false;
            }

            if (ExtensionSchema != null)
            {
                result &= ExtensionSchema.Introspect(nameConvention, resolutionResult);
            }

            if (Extensions != null)
            {
                result &= Extensions.Introspect(resolutionResult);
            }

            return(result);
        }
        internal bool Introspect(INameConvention nameConvention, ResolutionResult resolutionResult)
        {
            var result = true;

            if (_eps != null)
            {
                foreach (var ep in _eps)
                {
                    result &= ep.Introspect(nameConvention, resolutionResult);
                }
            }
            if (_ebGroups != null)
            {
                foreach (var ebGroup in _ebGroups)
                {
                    result &= ebGroup.Introspect(nameConvention, resolutionResult);
                }
            }
            return(result);
        }
 internal bool Introspect(INameConvention nameConvention, ResolutionResult resolutionResult)
 {
     if (ParentPath == null)
     {
         resolutionResult.AddError("");
         return(false);
     }
     if (_children == null)
     {
         resolutionResult.AddError("");
         return(false);
     }
     foreach (var child in _children)
     {
         if (!child.Introspect(nameConvention, resolutionResult))
         {
             return(false);
         }
     }
     return(true);
 }
        // @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));
        }
        protected bool DoIntrospect(INameConvention nameConvention, ResolutionResult resolutionResult, string name)
        {
            var result = true;

            if (Name.IsNullOrWhiteSpace())
            {
                resolutionResult.AddError("An " + name + " must at least have an name to be identified!");
                result = false;
            }
            if (Name.Contains(SysConstants.PathSeparatorString))
            {
                resolutionResult.AddError("An " + name + " name can not contain [/]!");
                result = false;
            }

            if (_children != null)
            {
                foreach (var child in _children)
                {
                    result &= child.Introspect(nameConvention, resolutionResult);
                }
            }
            return(result);
        }
示例#12
0
 internal abstract bool Introspect(INameConvention nameConvention, ResolutionResult resolutionResult);
示例#13
0
 internal abstract ResolutionResult Resolve(INameConvention nameConvention, ResolutionContext ctx, ScanFilePackResult scanFilePackResult);
 public AddinConfiguration(FileConfiguration fileConfig, INameConvention nameConvention)
     : this(new ConsoleMessageDialog(), fileConfig, nameConvention,
            new ReflectionExtensionBuilderFactory(), new ReflectionExtensionPointFactory())
 {
 }
        internal override ResolutionResult Resolve(INameConvention nameConvention, ResolutionContext ctx, ScanFilePackResult scanFilePackResult)
        {
            var resolutionResult = new ResolutionResult();
            // try parsing the new (or updated) addin manifests (configuration)
            var adnResolutions = TryParseAddins(nameConvention, resolutionResult, scanFilePackResult.ScanFilePacks);

            if (adnResolutions == null)
            {
                resolutionResult.NewAddinsFound = false;
                return(resolutionResult);
            }

            var addinCollision = new AddinCollision();

            // try to register id of new addins at first, so that we can tell whether there are
            // any updated addins when registering that of the existing addins.
            foreach (var adnResolution in adnResolutions)
            {
                TryRegisterAddin(resolutionResult, ctx, adnResolution, addinCollision);
            }

            // register all assets of existing addins to the context (skipping updated addins)
            List <AddinResolution> resolableAddins = null;

            if (AddinStorage.AddinRecordCount > 0)
            {
                resolableAddins = RegisterExistingAssets(resolutionResult, ctx, addinCollision);
            }

            // try to register assets of new and updated addins to the context
            foreach (var adnResolution in adnResolutions)
            {
                TryRegisterAssets(resolutionResult, ctx, adnResolution, addinCollision);
            }

            if (resolableAddins != null)
            {
                adnResolutions.AddRange(resolableAddins);
            }

            // tries to resolve all addin, and make sure:
            // 1. there is no cirular dependencies between the resolved addins.
            // 2. the resolved addin list is sorted by the dependency.
            var resolvedAddins = TryResolveAddins(resolutionResult, ConvertionManager, ctx, adnResolutions);

            if (adnResolutions.Count > 0)
            {
                StoreUnresolvableAddins(adnResolutions); // 剩余的 adnResolutions 即为未成功解析的插件,此处也要将它们持久化
            }
            if (ResolutionFailed(resolutionResult, ctx, resolvedAddins))
            {
                resolutionResult.NewAddinsFound = false;
                return(resolutionResult);
            }

            // if there is any conflicting addins, trim them and all addins that depends on them.
            if (addinCollision.Count > 0)
            {
                TrimConflictingAddins(addinCollision, resolvedAddins); // recursively
                if (ResolutionFailed(resolutionResult, ctx, resolvedAddins))
                {
                    resolutionResult.NewAddinsFound = false;
                    return(resolutionResult);
                }
            }

            // save all resolvable addin records to persistent file.
            StoreResolvedAddins(resolutionResult, ctx, resolvedAddins);

            PersistAddinStorage(resolutionResult);

            ctx.Dispose();

            resolutionResult.NewAddinsFound = true;
            return(resolutionResult);
        }
示例#16
0
 public AddinOptions WithNameConvention(INameConvention nameConvention)
 {
     _nameConvention = nameConvention;
     return(this);
 }