Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Xml / System / Xml / schema / NamespaceList.cs / 1305376 / NamespaceList.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //[....] //----------------------------------------------------------------------------- namespace System.Xml.Schema { using System.Collections; using System.Text; using System.Diagnostics; internal class NamespaceList { public enum ListType { Any, Other, Set }; private ListType type = ListType.Any; private Hashtable set = null; private string targetNamespace; public NamespaceList() { } public NamespaceList(string namespaces, string targetNamespace) { Debug.Assert(targetNamespace != null); this.targetNamespace = targetNamespace; namespaces = namespaces.Trim(); if (namespaces == "##any" || namespaces.Length == 0) { type = ListType.Any; } else if (namespaces == "##other") { type = ListType.Other; } else { type = ListType.Set; set = new Hashtable(); string[] splitString = XmlConvert.SplitString(namespaces); for (int i = 0; i < splitString.Length; ++i) { if (splitString[i] == "##local") { set[string.Empty] = string.Empty; } else if (splitString[i] == "##targetNamespace") { set[targetNamespace] = targetNamespace; } else { XmlConvert.ToUri (splitString[i]); // can throw set[splitString[i]] = splitString[i]; } } } } public NamespaceList Clone() { NamespaceList nsl = (NamespaceList)MemberwiseClone(); if (type == ListType.Set) { Debug.Assert(set != null); nsl.set = (Hashtable)(set.Clone()); } return nsl; } public ListType Type { get { return type; } } public string Excluded { get { return targetNamespace; } } public ICollection Enumerate { get { switch (type) { case ListType.Set: return set.Keys; case ListType.Other: case ListType.Any: default: throw new InvalidOperationException(); } } } public virtual bool Allows(string ns) { switch (type) { case ListType.Any: return true; case ListType.Other: return ns != targetNamespace && ns.Length != 0; case ListType.Set: return set[ns] != null; } Debug.Assert(false); return false; } public bool Allows(XmlQualifiedName qname) { return Allows(qname.Namespace); } public override string ToString() { switch (type) { case ListType.Any: return "##any"; case ListType.Other: return "##other"; case ListType.Set: StringBuilder sb = new StringBuilder(); bool first = true; foreach(string s in set.Keys) { if (first) { first = false; } else { sb.Append(" "); } if (s == targetNamespace) { sb.Append("##targetNamespace"); } else if (s.Length == 0) { sb.Append("##local"); } else { sb.Append(s); } } return sb.ToString(); } Debug.Assert(false); return string.Empty; } public static bool IsSubset(NamespaceList sub, NamespaceList super) { if (super.type == ListType.Any) { return true; } else if (sub.type == ListType.Other && super.type == ListType.Other) { return super.targetNamespace == sub.targetNamespace; } else if (sub.type == ListType.Set) { if (super.type == ListType.Other) { return !sub.set.Contains(super.targetNamespace); } else { Debug.Assert(super.type == ListType.Set); foreach (string ns in sub.set.Keys) { if (!super.set.Contains(ns)) { return false; } } return true; } } return false; } public static NamespaceList Union(NamespaceList o1, NamespaceList o2, bool v1Compat) { NamespaceList nslist = null; Debug.Assert(o1 != o2); if (o1.type == ListType.Any) { //clause 2 - o1 is Any nslist = new NamespaceList(); } else if (o2.type == ListType.Any) { //clause 2 - o2 is Any nslist = new NamespaceList(); } else if (o1.type == ListType.Set && o2.type == ListType.Set) { //clause 3 , both are sets nslist = o1.Clone(); foreach (string ns in o2.set.Keys) { nslist.set[ns] = ns; } } else if (o1.type == ListType.Other && o2.type == ListType.Other) { //clause 4, both are negations if (o1.targetNamespace == o2.targetNamespace) { //negation of same value nslist = o1.Clone(); } else { //Not a breaking change, going from not expressible to not(absent) nslist = new NamespaceList("##other", string.Empty); //clause 4, negations of different values, result is not(absent) } } else if (o1.type == ListType.Set && o2.type == ListType.Other) { if (v1Compat) { if (o1.set.Contains(o2.targetNamespace)) { nslist = new NamespaceList(); } else { //This was not there originally in V1, added for consistency since its not breaking nslist = o2.Clone(); } } else { if (o2.targetNamespace != string.Empty) { //clause 5, o1 is set S, o2 is not(tns) nslist = o1.CompareSetToOther(o2); } else if (o1.set.Contains(string.Empty)) { //clause 6.1 - set S includes absent, o2 is not(absent) nslist = new NamespaceList(); } else { //clause 6.2 - set S does not include absent, result is not(absent) nslist = new NamespaceList("##other", string.Empty); } } } else if (o2.type == ListType.Set && o1.type == ListType.Other) { if (v1Compat) { if (o2.set.Contains(o2.targetNamespace)) { nslist = new NamespaceList(); } else { nslist = o1.Clone(); } } else { //New rules if (o1.targetNamespace != string.Empty) { //clause 5, o1 is set S, o2 is not(tns) nslist = o2.CompareSetToOther(o1); } else if (o2.set.Contains(string.Empty)) { //clause 6.1 - set S includes absent, o2 is not(absent) nslist = new NamespaceList(); } else { //clause 6.2 - set S does not include absent, result is not(absent) nslist = new NamespaceList("##other", string.Empty); } } } return nslist; } private NamespaceList CompareSetToOther(NamespaceList other) { //clause 5.1 NamespaceList nslist = null; if (this.set.Contains(other.targetNamespace)) { //S contains negated ns if (this.set.Contains(string.Empty)) { // AND S contains absent nslist = new NamespaceList(); //any is the result } else { //clause 5.2 nslist = new NamespaceList("##other", string.Empty); } } else if (this.set.Contains(string.Empty)) { //clause 5.3 - Not expressible nslist = null; } else { //clause 5.4 - Set S does not contain negated ns or absent nslist = other.Clone(); } return nslist; } public static NamespaceList Intersection(NamespaceList o1, NamespaceList o2, bool v1Compat) { NamespaceList nslist = null; Debug.Assert(o1 != o2); //clause 1 if (o1.type == ListType.Any) { //clause 2 - o1 is any nslist = o2.Clone(); } else if (o2.type == ListType.Any) { //clause 2 - o2 is any nslist = o1.Clone(); } else if (o1.type == ListType.Set && o2.type == ListType.Other) { //Clause 3 o2 is other nslist = o1.Clone(); nslist.RemoveNamespace(o2.targetNamespace); if (!v1Compat) { nslist.RemoveNamespace(string.Empty); //remove ##local } } else if (o1.type == ListType.Other && o2.type == ListType.Set) { //Clause 3 o1 is other nslist = o2.Clone(); nslist.RemoveNamespace(o1.targetNamespace); if (!v1Compat) { nslist.RemoveNamespace(string.Empty); //remove ##local } } else if (o1.type == ListType.Set && o2.type == ListType.Set) { //clause 4 nslist = o1.Clone(); nslist = new NamespaceList(); nslist.type = ListType.Set; nslist.set = new Hashtable(); foreach(string ns in o1.set.Keys) { if (o2.set.Contains(ns)) { nslist.set.Add(ns, ns); } } } else if (o1.type == ListType.Other && o2.type == ListType.Other) { if (o1.targetNamespace == o2.targetNamespace) { //negation of same namespace name nslist = o1.Clone(); return nslist; } if (!v1Compat) { if (o1.targetNamespace == string.Empty) { // clause 6 - o1 is negation of absent nslist = o2.Clone(); } else if (o2.targetNamespace == string.Empty) { //clause 6 - o1 is negation of absent nslist = o1.Clone(); } } //if it comes here, its not expressible //clause 5 } return nslist; } private void RemoveNamespace(string tns) { if (this.set[tns] != null) { this.set.Remove(tns); } } public bool IsEmpty() { return ((type == ListType.Set) && ((set == null) || set.Count == 0)); } }; internal class NamespaceListV1Compat : NamespaceList { public NamespaceListV1Compat(string namespaces, string targetNamespace) : base(namespaces, targetNamespace) {} public override bool Allows(string ns) { if (this.Type == ListType.Other) { return ns != Excluded; } else { return base.Allows(ns); } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //[....] //----------------------------------------------------------------------------- namespace System.Xml.Schema { using System.Collections; using System.Text; using System.Diagnostics; internal class NamespaceList { public enum ListType { Any, Other, Set }; private ListType type = ListType.Any; private Hashtable set = null; private string targetNamespace; public NamespaceList() { } public NamespaceList(string namespaces, string targetNamespace) { Debug.Assert(targetNamespace != null); this.targetNamespace = targetNamespace; namespaces = namespaces.Trim(); if (namespaces == "##any" || namespaces.Length == 0) { type = ListType.Any; } else if (namespaces == "##other") { type = ListType.Other; } else { type = ListType.Set; set = new Hashtable(); string[] splitString = XmlConvert.SplitString(namespaces); for (int i = 0; i < splitString.Length; ++i) { if (splitString[i] == "##local") { set[string.Empty] = string.Empty; } else if (splitString[i] == "##targetNamespace") { set[targetNamespace] = targetNamespace; } else { XmlConvert.ToUri (splitString[i]); // can throw set[splitString[i]] = splitString[i]; } } } } public NamespaceList Clone() { NamespaceList nsl = (NamespaceList)MemberwiseClone(); if (type == ListType.Set) { Debug.Assert(set != null); nsl.set = (Hashtable)(set.Clone()); } return nsl; } public ListType Type { get { return type; } } public string Excluded { get { return targetNamespace; } } public ICollection Enumerate { get { switch (type) { case ListType.Set: return set.Keys; case ListType.Other: case ListType.Any: default: throw new InvalidOperationException(); } } } public virtual bool Allows(string ns) { switch (type) { case ListType.Any: return true; case ListType.Other: return ns != targetNamespace && ns.Length != 0; case ListType.Set: return set[ns] != null; } Debug.Assert(false); return false; } public bool Allows(XmlQualifiedName qname) { return Allows(qname.Namespace); } public override string ToString() { switch (type) { case ListType.Any: return "##any"; case ListType.Other: return "##other"; case ListType.Set: StringBuilder sb = new StringBuilder(); bool first = true; foreach(string s in set.Keys) { if (first) { first = false; } else { sb.Append(" "); } if (s == targetNamespace) { sb.Append("##targetNamespace"); } else if (s.Length == 0) { sb.Append("##local"); } else { sb.Append(s); } } return sb.ToString(); } Debug.Assert(false); return string.Empty; } public static bool IsSubset(NamespaceList sub, NamespaceList super) { if (super.type == ListType.Any) { return true; } else if (sub.type == ListType.Other && super.type == ListType.Other) { return super.targetNamespace == sub.targetNamespace; } else if (sub.type == ListType.Set) { if (super.type == ListType.Other) { return !sub.set.Contains(super.targetNamespace); } else { Debug.Assert(super.type == ListType.Set); foreach (string ns in sub.set.Keys) { if (!super.set.Contains(ns)) { return false; } } return true; } } return false; } public static NamespaceList Union(NamespaceList o1, NamespaceList o2, bool v1Compat) { NamespaceList nslist = null; Debug.Assert(o1 != o2); if (o1.type == ListType.Any) { //clause 2 - o1 is Any nslist = new NamespaceList(); } else if (o2.type == ListType.Any) { //clause 2 - o2 is Any nslist = new NamespaceList(); } else if (o1.type == ListType.Set && o2.type == ListType.Set) { //clause 3 , both are sets nslist = o1.Clone(); foreach (string ns in o2.set.Keys) { nslist.set[ns] = ns; } } else if (o1.type == ListType.Other && o2.type == ListType.Other) { //clause 4, both are negations if (o1.targetNamespace == o2.targetNamespace) { //negation of same value nslist = o1.Clone(); } else { //Not a breaking change, going from not expressible to not(absent) nslist = new NamespaceList("##other", string.Empty); //clause 4, negations of different values, result is not(absent) } } else if (o1.type == ListType.Set && o2.type == ListType.Other) { if (v1Compat) { if (o1.set.Contains(o2.targetNamespace)) { nslist = new NamespaceList(); } else { //This was not there originally in V1, added for consistency since its not breaking nslist = o2.Clone(); } } else { if (o2.targetNamespace != string.Empty) { //clause 5, o1 is set S, o2 is not(tns) nslist = o1.CompareSetToOther(o2); } else if (o1.set.Contains(string.Empty)) { //clause 6.1 - set S includes absent, o2 is not(absent) nslist = new NamespaceList(); } else { //clause 6.2 - set S does not include absent, result is not(absent) nslist = new NamespaceList("##other", string.Empty); } } } else if (o2.type == ListType.Set && o1.type == ListType.Other) { if (v1Compat) { if (o2.set.Contains(o2.targetNamespace)) { nslist = new NamespaceList(); } else { nslist = o1.Clone(); } } else { //New rules if (o1.targetNamespace != string.Empty) { //clause 5, o1 is set S, o2 is not(tns) nslist = o2.CompareSetToOther(o1); } else if (o2.set.Contains(string.Empty)) { //clause 6.1 - set S includes absent, o2 is not(absent) nslist = new NamespaceList(); } else { //clause 6.2 - set S does not include absent, result is not(absent) nslist = new NamespaceList("##other", string.Empty); } } } return nslist; } private NamespaceList CompareSetToOther(NamespaceList other) { //clause 5.1 NamespaceList nslist = null; if (this.set.Contains(other.targetNamespace)) { //S contains negated ns if (this.set.Contains(string.Empty)) { // AND S contains absent nslist = new NamespaceList(); //any is the result } else { //clause 5.2 nslist = new NamespaceList("##other", string.Empty); } } else if (this.set.Contains(string.Empty)) { //clause 5.3 - Not expressible nslist = null; } else { //clause 5.4 - Set S does not contain negated ns or absent nslist = other.Clone(); } return nslist; } public static NamespaceList Intersection(NamespaceList o1, NamespaceList o2, bool v1Compat) { NamespaceList nslist = null; Debug.Assert(o1 != o2); //clause 1 if (o1.type == ListType.Any) { //clause 2 - o1 is any nslist = o2.Clone(); } else if (o2.type == ListType.Any) { //clause 2 - o2 is any nslist = o1.Clone(); } else if (o1.type == ListType.Set && o2.type == ListType.Other) { //Clause 3 o2 is other nslist = o1.Clone(); nslist.RemoveNamespace(o2.targetNamespace); if (!v1Compat) { nslist.RemoveNamespace(string.Empty); //remove ##local } } else if (o1.type == ListType.Other && o2.type == ListType.Set) { //Clause 3 o1 is other nslist = o2.Clone(); nslist.RemoveNamespace(o1.targetNamespace); if (!v1Compat) { nslist.RemoveNamespace(string.Empty); //remove ##local } } else if (o1.type == ListType.Set && o2.type == ListType.Set) { //clause 4 nslist = o1.Clone(); nslist = new NamespaceList(); nslist.type = ListType.Set; nslist.set = new Hashtable(); foreach(string ns in o1.set.Keys) { if (o2.set.Contains(ns)) { nslist.set.Add(ns, ns); } } } else if (o1.type == ListType.Other && o2.type == ListType.Other) { if (o1.targetNamespace == o2.targetNamespace) { //negation of same namespace name nslist = o1.Clone(); return nslist; } if (!v1Compat) { if (o1.targetNamespace == string.Empty) { // clause 6 - o1 is negation of absent nslist = o2.Clone(); } else if (o2.targetNamespace == string.Empty) { //clause 6 - o1 is negation of absent nslist = o1.Clone(); } } //if it comes here, its not expressible //clause 5 } return nslist; } private void RemoveNamespace(string tns) { if (this.set[tns] != null) { this.set.Remove(tns); } } public bool IsEmpty() { return ((type == ListType.Set) && ((set == null) || set.Count == 0)); } }; internal class NamespaceListV1Compat : NamespaceList { public NamespaceListV1Compat(string namespaces, string targetNamespace) : base(namespaces, targetNamespace) {} public override bool Allows(string ns) { if (this.Type == ListType.Other) { return ns != Excluded; } else { return base.Allows(ns); } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- EnlistmentTraceIdentifier.cs
- GPRECT.cs
- SharingService.cs
- NameValueFileSectionHandler.cs
- OledbConnectionStringbuilder.cs
- SatelliteContractVersionAttribute.cs
- RuntimeCompatibilityAttribute.cs
- Matrix.cs
- Exceptions.cs
- LightweightEntityWrapper.cs
- Win32PrintDialog.cs
- TableCell.cs
- DBCommand.cs
- PersonalizationState.cs
- RawTextInputReport.cs
- HwndSourceParameters.cs
- WebColorConverter.cs
- CodeCompiler.cs
- EllipseGeometry.cs
- WebBrowserDesigner.cs
- WindowsFormsSectionHandler.cs
- TrackingProfileDeserializationException.cs
- CachedBitmap.cs
- XmlEnumAttribute.cs
- TextUtf8RawTextWriter.cs
- Utils.cs
- ModelVisual3D.cs
- ExpressionBindingCollection.cs
- SoapServerMethod.cs
- CustomAssemblyResolver.cs
- DetailsViewDeletedEventArgs.cs
- BitmapEncoder.cs
- DataListDesigner.cs
- Win32Native.cs
- CodePageEncoding.cs
- TextReader.cs
- X509CertificateCollection.cs
- TiffBitmapEncoder.cs
- SafeReversePInvokeHandle.cs
- ItemCheckedEvent.cs
- TypedOperationInfo.cs
- UndoUnit.cs
- DataGridViewCheckBoxCell.cs
- ArcSegment.cs
- DSASignatureDeformatter.cs
- Attachment.cs
- ChildrenQuery.cs
- SecondaryIndexList.cs
- ActivityPreviewDesigner.cs
- TemplateBuilder.cs
- SwitchLevelAttribute.cs
- UIElement3DAutomationPeer.cs
- SafeEventLogWriteHandle.cs
- SerialErrors.cs
- InputReferenceExpression.cs
- Blend.cs
- SafeHandles.cs
- PolicyValidationException.cs
- SQLMoneyStorage.cs
- DbDataRecord.cs
- EntityTransaction.cs
- ComIntegrationManifestGenerator.cs
- StandardOleMarshalObject.cs
- ActivationArguments.cs
- EventSinkActivity.cs
- UIEndRequest.cs
- EventKeyword.cs
- BounceEase.cs
- TemplateControlBuildProvider.cs
- DefaultProxySection.cs
- remotingproxy.cs
- SqlCacheDependencyDatabase.cs
- Latin1Encoding.cs
- SafeReadContext.cs
- ModelEditingScope.cs
- CodeExpressionStatement.cs
- SocketElement.cs
- ParagraphResult.cs
- FormViewDeleteEventArgs.cs
- Environment.cs
- PropertyMappingExceptionEventArgs.cs
- PointAnimationUsingPath.cs
- RegistryPermission.cs
- SoapMessage.cs
- EntityDataSourceViewSchema.cs
- NameValueCollection.cs
- Enumerable.cs
- EncoderBestFitFallback.cs
- InputManager.cs
- serverconfig.cs
- XamlWriter.cs
- XamlPointCollectionSerializer.cs
- CorrelationKeyCalculator.cs
- CommandDevice.cs
- SymbolEqualComparer.cs
- Expander.cs
- UpdateCommand.cs
- AssemblyBuilder.cs
- TimerElapsedEvenArgs.cs
- CDSCollectionETWBCLProvider.cs