/// <summary>
        /// 获取节点的子插件实例。
        /// </summary>
        /// <param name="node">节点。</param>
        /// <returns>子节点列表。</returns>
        private IAddin[] GetChildsImpl(AddinTreeNode node)
        {
            ReadOnlyCollection <AddinTreeNode> items = null;

            if (node.IsVirtual || node.Exposes == null)
            {
                return(new IAddin[0]);
            }
            IList <IAddin>         addins = new List <IAddin>();
            Lazy <AddinDescriptor> temp   = null;

            foreach (String expose in node.Exposes)
            {
                items = node.GetChilds(expose);
                if (items == null)
                {
                    continue;
                }
                foreach (AddinTreeNode item in items)
                {
                    if (item.IsVirtual)
                    {
                        continue;
                    }
                    temp = ((AddinNode)item).Descriptor;
                    if (temp.IsValueCreated && temp.Value.BuildState == AddinBuildState.Build)
                    {
                        addins.Add(temp.Value.Addin);
                    }
                }
            }
            return(addins.ToArray());
        }
        /// <summary>
        /// 构建节点的插件实例。
        /// </summary>
        /// <param name="node">节点。</param>
        /// <param name="addins">构建完成的插件。</param>
        private void BuildImpl(AddinTreeNode node, ref IList <IAddin> addins)
        {
            ReadOnlyCollection <AddinTreeNode> items = null;

            if (node.Exposes == null)
            {
                return;
            }
            foreach (String expose in node.Exposes)
            {
                items = node.GetChilds(expose);
                if (items == null)
                {
                    continue;
                }
                foreach (AddinTreeNode item in items)
                {
                    if (item.IsVirtual)
                    {
                        BuildImpl(item, ref addins);
                    }
                    else
                    {
                        try
                        {
                            addins.Add(((AddinNode)item).Buid());
                        }
                        catch (Exception ex)
                        {
                        }
                    }
                }
            }
        }
Beispiel #3
0
        /// <summary>
        /// 将子节点添加到指定的挂载点下。
        /// </summary>
        /// <param name="expose">挂载点。</param>
        /// <param name="child">子节点。</param>
        internal void SetChild(AddinTreeNode child, String expose = null)
        {
            String mount;

            if (TryGetMount(out mount, expose))
            {
                Collection <AddinTreeNode> c = GetOrAddCollection(mount);
                c.Add(child);
            }
        }
Beispiel #4
0
 /// <summary>
 /// 初始化类型 Tumbler.Addin.Core.AddinDescriptor 实例。
 /// </summary>
 /// <param name="type">实现了IAddin接口的类型名称。</param>
 /// <param name="owner">拥有此描述符的插件节点。</param>
 /// <param name="references"></param>
 /// <param name="depedencies"></param>
 private AddinDescriptor(String type, AddinNode owner, String[] references, String[] depedencies)
 {
     if (String.IsNullOrWhiteSpace(type))
     {
         throw new ArgumentNullException("type");
     }
     if (owner == null)
     {
         throw new ArgumentNullException("owner");
     }
     Owner      = owner;
     Type       = type;
     References = references;
     if (depedencies != null)
     {
         Dependencies = depedencies.Select(x => AddinTreeNode.CompletePath(x)).ToArray();
     }
 }
        /// <summary>
        /// 创建插件树节点列表。
        /// </summary>
        /// <param name="initExposes">初始化挂载点。</param>
        private void CreateAddinTreeNodes(Tuple <String, String, String[]>[] initExposes)
        {
            XElement xml = XElement.Load(ConfigFile);

            if (xml == null)
            {
                throw new FileLoadException("Invalid addin manager config file");
            }
            AddinTreeNode node = null;

            if (initExposes != null && initExposes.Length != 0)
            {
                foreach (Tuple <String, String, String[]> point in initExposes)
                {
                    node = new VirtualNode(point.Item1, AddinTreeNode.DefaultExposePoint, point.Item2, point.Item3);
                    _nodes.Add(node.FullPath, node);
                }
            }
            Func <XElement, Boolean> filter   = Filter;
            IEnumerable <XElement>   loadList = null;

            if (filter != null)
            {
                loadList = xml.Elements("Addin").Where(filter);
            }
            else
            {
                loadList = xml.Elements("Addin");
            }
            foreach (XElement element in loadList)
            {
                node = GetAddinTreeNode(element);
                if (node != null && !_nodes.ContainsKey(node.FullPath))
                {
                    _nodes.Add(node.FullPath, node);
                }
            }
        }
 /// <summary>
 /// 初始化插件管理器。
 /// </summary>
 /// <param name="configFile">配置文件。</param>
 /// <param name="initExposes">初始化挂载点。</param>
 public void Initialize(String configFile, Tuple <String, String, String[]>[] initExposes = null)
 {
     if (_isInit)
     {
         return;
     }
     if (String.IsNullOrWhiteSpace(configFile))
     {
         throw new ArgumentNullException("configFile");
     }
     configFile = AddinManager.GetFileFullPath(configFile);
     if (!File.Exists(configFile))
     {
         throw new FileNotFoundException(configFile);
     }
     ConfigFile = configFile;
     _root      = new RootNode();
     _nodes.Add(_root.FullPath, _root);
     _nodes.Add(_root.GetChilds()[0].FullPath, _root.GetChilds()[0]);
     _nodes.Add(_root.GetChilds()[1].FullPath, _root.GetChilds()[1]);
     CreateAddinTreeNodes(initExposes);
     GenerateAddinTree();
     _isInit = true;
 }
 /// <summary>
 /// 获取指定路径的插件树节点。
 /// </summary>
 /// <param name="fullPath">路径。如果为“*”表示所有插件。</param>
 /// <returns>插件树节点。</returns>
 public IEnumerable <AddinTreeNode> GetNode(String fullPath)
 {
     if (!_isInit)
     {
         throw new InvalidOperationException("Need initialize");
     }
     if (String.IsNullOrWhiteSpace(fullPath))
     {
         return(null);
     }
     if (fullPath == "*")
     {
         return(_nodes.Values);
     }
     else
     {
         fullPath = AddinTreeNode.CompletePath(fullPath);
         if (_nodes.ContainsKey(fullPath))
         {
             return(new AddinTreeNode[] { _nodes[fullPath] });
         }
     }
     return(null);
 }