// Copyright (c) Microsoft Corporation. All rights reserved. // using System; using System.Collections.Generic; using System.Xml; using System.Xml.XPath; using System.Compiler; namespace Microsoft.Ddue.Tools.Reflection { public class RootFilter { #region Member Variables private bool exposed; private List < NamespaceFilter > namespaceFilters = new List < NamespaceFilter >(); #endregion #region Constructors public RootFilter(bool exposed) { this.exposed = exposed; } public RootFilter(XmlReader configuration) { exposed = Convert.ToBoolean(configuration.GetAttribute("expose")); XmlReader subtree = configuration.ReadSubtree(); while (subtree.Read()) { if ((subtree.NodeType == XmlNodeType.Element) && (subtree.Name == "namespace")) { NamespaceFilter namespaceFilter = new NamespaceFilter(subtree); namespaceFilters.Add(namespaceFilter); } } subtree.Close(); } #endregion #region Public API /// /// Gets the exposed value from the config /// public bool ExposedFilterSetting { get { return exposed; } } /// /// Gets the number of namespace filters /// public int NamespaceFilterCount { get { return namespaceFilters.Count; } } public List < NamespaceFilter > NamespaceFilters { get { return (namespaceFilters); } } //Find out if any are exposed incase this class is not exposed public bool HasExposedMembers(TypeNode type) { foreach (NamespaceFilter namespaceFilter in namespaceFilters) { bool? result = namespaceFilter.IsExposedType(type); if (result != null) { return namespaceFilter.HasExposedMembers(type); } } return false; } public bool IsExposedApi(Member api) { Namespace space = api as Namespace; if (space != null) return (IsExposedNamespace(space)); TypeNode type = api as TypeNode; if (type != null) return (IsExposedType(type)); return (IsExposedMember(api)); } public bool IsExposedMember(Member member) { //Console.WriteLine("DEBUG: root.IsExposedMember"); foreach (NamespaceFilter namespaceFilter in namespaceFilters) { bool? result = namespaceFilter.IsExposedMember(member); if (result != null) return ((bool)result); } return (exposed); } public bool IsExposedNamespace(Namespace space) { foreach (NamespaceFilter namespaceFilter in namespaceFilters) { bool? result = namespaceFilter.IsExposedNamespace(space); if (result != null) return ((bool)result); } return (exposed); } public bool IsExposedType(TypeNode type) { foreach (NamespaceFilter namespaceFilter in namespaceFilters) { bool? result = namespaceFilter.IsExposedType(type); if (result != null) return ((bool)result); } return (exposed); } #endregion } }