public UriPrefixTable(bool includePortInComparison, bool useWeakReferences)
 {
     this.includePortInComparison = includePortInComparison;
     this.useWeakReferences       = useWeakReferences;
     this.root        = new SegmentHierarchyNode <TItem>(null, useWeakReferences);
     this.lookupCache = new HopperCache(128, useWeakReferences);
 }
        private SegmentHierarchyNode <TItem> FindDataNode(string[] path, out bool exactMatch)
        {
            SegmentHierarchyNode <TItem> segmentHierarchyNode;

            exactMatch = false;
            SegmentHierarchyNode <TItem> segmentHierarchyNode1 = this.root;
            SegmentHierarchyNode <TItem> segmentHierarchyNode2 = null;

            for (int i = 0; i < (int)path.Length && segmentHierarchyNode1.TryGetChild(path[i], out segmentHierarchyNode); i++)
            {
                if (segmentHierarchyNode.Data != null)
                {
                    segmentHierarchyNode2 = segmentHierarchyNode;
                    exactMatch            = i == (int)path.Length - 1;
                }
                segmentHierarchyNode1 = segmentHierarchyNode;
            }
            return(segmentHierarchyNode2);
        }
 public void RegisterUri(Uri uri, HostNameComparisonMode hostNameComparisonMode, TItem item)
 {
     lock (this.ThisLock)
     {
         this.ClearCache();
         BaseUriWithWildcard          baseUriWithWildcard  = new BaseUriWithWildcard(uri, hostNameComparisonMode);
         SegmentHierarchyNode <TItem> segmentHierarchyNode = this.FindOrCreateNode(baseUriWithWildcard);
         if (segmentHierarchyNode.Data != null)
         {
             ExceptionUtility exceptionUtility      = Microsoft.ServiceBus.Diagnostics.DiagnosticUtility.ExceptionUtility;
             string           duplicateRegistration = Resources.DuplicateRegistration;
             object[]         objArray = new object[] { uri };
             throw exceptionUtility.ThrowHelperError(new InvalidOperationException(Microsoft.ServiceBus.SR.GetString(duplicateRegistration, objArray)));
         }
         segmentHierarchyNode.SetData(item, baseUriWithWildcard);
         UriPrefixTable <TItem> uriPrefixTable = this;
         uriPrefixTable.count = uriPrefixTable.count + 1;
     }
 }
        private SegmentHierarchyNode <TItem> FindOrCreateNode(BaseUriWithWildcard baseUri)
        {
            SegmentHierarchyNode <TItem> segmentHierarchyNode;

            string[] path = UriPrefixTable <TItem> .UriSegmenter.ToPath(baseUri.BaseAddress, baseUri.HostNameComparisonMode, this.includePortInComparison);

            SegmentHierarchyNode <TItem> segmentHierarchyNode1 = this.root;

            for (int i = 0; i < (int)path.Length; i++)
            {
                if (!segmentHierarchyNode1.TryGetChild(path[i], out segmentHierarchyNode))
                {
                    segmentHierarchyNode = new SegmentHierarchyNode <TItem>(path[i], this.useWeakReferences);
                    segmentHierarchyNode1.SetChildNode(path[i], segmentHierarchyNode);
                }
                segmentHierarchyNode1 = segmentHierarchyNode;
            }
            return(segmentHierarchyNode1);
        }
        public bool TryLookupUri(Uri uri, HostNameComparisonMode hostNameComparisonMode, out TItem item)
        {
            bool flag;
            bool flag1;
            BaseUriWithWildcard baseUriWithWildcard = new BaseUriWithWildcard(uri, hostNameComparisonMode);

            if (this.TryCacheLookup(baseUriWithWildcard, out item))
            {
                return(item != null);
            }
            lock (this.ThisLock)
            {
                SegmentHierarchyNode <TItem> segmentHierarchyNode = this.FindDataNode(UriPrefixTable <TItem> .UriSegmenter.ToPath(baseUriWithWildcard.BaseAddress, hostNameComparisonMode, this.includePortInComparison), out flag);
                if (segmentHierarchyNode != null)
                {
                    item = segmentHierarchyNode.Data;
                }
                this.AddToCache(baseUriWithWildcard, item);
                flag1 = item != null;
            }
            return(flag1);
        }
Ejemplo n.º 6
0
 public void SetChildNode(string name, SegmentHierarchyNode <TData> node)
 {
     this.children[name] = node;
 }
Ejemplo n.º 7
0
 public bool TryGetChild(string segment, out SegmentHierarchyNode <TData> value)
 {
     return(this.children.TryGetValue(segment, out value));
 }