Code:
/ DotNET / DotNET / 8.0 / untmp / whidbey / REDBITS / ndp / fx / src / xsp / System / Web / StaticSiteMapProvider.cs / 1 / StaticSiteMapProvider.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------------------
/*
* SimpleSiteMapProvider class definition
*
* Copyright (c) 2002 Microsoft Corporation
*/
namespace System.Web {
using System;
using System.Collections;
using System.Collections.Specialized;
using System.Globalization;
using System.Security.Permissions;
using System.Web.UI;
using System.Web.Util;
[AspNetHostingPermission(SecurityAction.LinkDemand, Level=AspNetHostingPermissionLevel.Minimal)]
[AspNetHostingPermission(SecurityAction.InheritanceDemand, Level=AspNetHostingPermissionLevel.Minimal)]
public abstract class StaticSiteMapProvider : SiteMapProvider {
// Table maps nodes to their child node collections
private Hashtable _childNodeCollectionTable;
internal IDictionary ChildNodeCollectionTable {
get {
if (_childNodeCollectionTable == null) {
lock (_lock) {
if (_childNodeCollectionTable == null) {
_childNodeCollectionTable = new Hashtable();
}
}
}
return _childNodeCollectionTable;
}
}
// Case sensitive table that maps key to sitemap node.
private Hashtable _keyTable;
internal IDictionary KeyTable {
get {
if (_keyTable == null) {
lock (_lock) {
if (_keyTable == null) {
_keyTable = new Hashtable();
}
}
}
return _keyTable;
}
}
// Table maps nodes to their parent nodes
private Hashtable _parentNodeTable;
internal IDictionary ParentNodeTable {
get {
if (_parentNodeTable == null) {
lock (_lock) {
if (_parentNodeTable == null) {
_parentNodeTable = new Hashtable();
}
}
}
return _parentNodeTable;
}
}
// Case insensitive table that maps url to sitemap node.
private Hashtable _urlTable;
internal IDictionary UrlTable {
get {
if (_urlTable == null) {
lock (_lock) {
if (_urlTable == null) {
_urlTable = new Hashtable(StringComparer.OrdinalIgnoreCase);
}
}
}
return _urlTable;
}
}
///
/// Add single node to provider tree and sets the parent-child relation.
///
protected internal override void AddNode(SiteMapNode node, SiteMapNode parentNode) {
if (node == null) {
throw new ArgumentNullException("node");
}
lock (_lock) {
bool validUrl = false;
string url = node.Url;
if (!String.IsNullOrEmpty(url)) {
if (HttpRuntime.AppDomainAppVirtualPath != null) {
if (!UrlPath.IsAbsolutePhysicalPath(url)) {
url = UrlPath.Combine(HttpRuntime.AppDomainAppVirtualPathString, url);
// Normalize url
url = UrlPath.MakeVirtualPathAppAbsolute(url);
}
if (UrlTable[url] != null)
throw new InvalidOperationException(
SR.GetString(SR.XmlSiteMapProvider_Multiple_Nodes_With_Identical_Url, url));
}
validUrl = true;
}
String key = node.Key;
Debug.Assert(key != null);
if (KeyTable.Contains(key)) {
throw new InvalidOperationException(
SR.GetString(SR.XmlSiteMapProvider_Multiple_Nodes_With_Identical_Key, key));
}
KeyTable[key] = node;
if (validUrl) {
UrlTable[url] = node;
}
if (parentNode != null) {
ParentNodeTable[node] = parentNode;
if (ChildNodeCollectionTable[parentNode] == null)
ChildNodeCollectionTable[parentNode] = new SiteMapNodeCollection();
((SiteMapNodeCollection)ChildNodeCollectionTable[parentNode]).Add(node);
}
}
}
public abstract SiteMapNode BuildSiteMap();
// Clear tables
protected virtual void Clear() {
lock (_lock) {
if (_childNodeCollectionTable != null)
_childNodeCollectionTable.Clear();
if (_urlTable != null)
_urlTable.Clear();
if (_parentNodeTable != null)
_parentNodeTable.Clear();
if (_keyTable != null)
_keyTable.Clear();
}
}
// Find sitemapnode in current provider
public override SiteMapNode FindSiteMapNodeFromKey(string key) {
SiteMapNode result = base.FindSiteMapNodeFromKey(key);
if (result == null) {
result = (SiteMapNode)KeyTable[key];
}
return ReturnNodeIfAccessible(result);
}
// Find sitemapnode in current provider
public override SiteMapNode FindSiteMapNode(string rawUrl) {
if (rawUrl == null)
throw new ArgumentNullException("rawUrl");
// VSWhidbey 411041. URL needs to be trimmed.
rawUrl = rawUrl.Trim();
if (rawUrl.Length == 0) {
return null;
}
// Make sure it is an app absolute url
if (UrlPath.IsAppRelativePath(rawUrl)) {
rawUrl = UrlPath.MakeVirtualPathAppAbsolute(rawUrl);
}
BuildSiteMap();
return ReturnNodeIfAccessible((SiteMapNode)UrlTable[rawUrl]);
}
// Return readonly child node collection
public override SiteMapNodeCollection GetChildNodes(SiteMapNode node) {
if (node == null)
throw new ArgumentNullException("node");
BuildSiteMap();
SiteMapNodeCollection collection = (SiteMapNodeCollection)ChildNodeCollectionTable[node];
if (collection == null) {
SiteMapNode childNodeFromKey = (SiteMapNode)KeyTable[node.Key];
if (childNodeFromKey != null) {
collection = (SiteMapNodeCollection)ChildNodeCollectionTable[childNodeFromKey];
}
}
if (collection != null) {
if (!SecurityTrimmingEnabled) {
return SiteMapNodeCollection.ReadOnly(collection);
}
HttpContext context = HttpContext.Current;
SiteMapNodeCollection trimmedCollection = new SiteMapNodeCollection(collection.Count);
foreach (SiteMapNode subNode in collection) {
if (subNode.IsAccessibleToUser(context)) {
trimmedCollection.Add(subNode);
}
}
return SiteMapNodeCollection.ReadOnly(trimmedCollection);
}
return SiteMapNodeCollection.Empty;
}
public override SiteMapNode GetParentNode(SiteMapNode node) {
if (node == null)
throw new ArgumentNullException("node");
BuildSiteMap();
SiteMapNode parent = (SiteMapNode)ParentNodeTable[node];
if (parent == null) {
// Try to find the original node in the table using the key
SiteMapNode fallbackNode = (SiteMapNode)KeyTable[node.Key];
if (fallbackNode != null) {
parent = (SiteMapNode)ParentNodeTable[fallbackNode];
}
}
// Try the parent providers.
if (parent == null && ParentProvider != null) {
parent = ParentProvider.GetParentNode(node);
}
return ReturnNodeIfAccessible(parent);
}
protected internal override void RemoveNode(SiteMapNode node) {
if (node == null)
throw new ArgumentNullException("node");
lock (_lock) {
SiteMapNode oldParent = (SiteMapNode)ParentNodeTable[node];
if (ParentNodeTable.Contains(node))
ParentNodeTable.Remove(node);
if (oldParent != null) {
SiteMapNodeCollection collection = (SiteMapNodeCollection)ChildNodeCollectionTable[oldParent];
if (collection != null && collection.Contains(node))
collection.Remove(node);
}
string url = node.Url;
if (url != null && url.Length > 0 && UrlTable.Contains(url)) {
UrlTable.Remove(url);
}
string key = node.Key;
if (KeyTable.Contains(key)) {
KeyTable.Remove(key);
}
}
}
}
}
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- Hashtable.cs
- CodeAttributeArgumentCollection.cs
- Privilege.cs
- CodeStatementCollection.cs
- CharacterString.cs
- GeneralTransform3DTo2D.cs
- SerializationSectionGroup.cs
- RequestResizeEvent.cs
- MasterPageBuildProvider.cs
- KeyTime.cs
- MimeBasePart.cs
- SQLDateTimeStorage.cs
- ArgumentOutOfRangeException.cs
- PropertyFilterAttribute.cs
- SqlTypesSchemaImporter.cs
- EnumerableRowCollection.cs
- NullRuntimeConfig.cs
- SplashScreenNativeMethods.cs
- PassportIdentity.cs
- ButtonFieldBase.cs
- LockCookie.cs
- DocumentPageHost.cs
- AsyncCompletedEventArgs.cs
- ConfigurationFileMap.cs
- ReadOnlyAttribute.cs
- ListenerConstants.cs
- UIElementParaClient.cs
- ComponentSerializationService.cs
- XmlSchemaSimpleTypeUnion.cs
- XmlWriter.cs
- login.cs
- SqlBuffer.cs
- ScrollData.cs
- ClrProviderManifest.cs
- ManagedWndProcTracker.cs
- SqlDataSource.cs
- BindingSource.cs
- DesignerActionGlyph.cs
- EntityDataSourceSelectedEventArgs.cs
- ImageMetadata.cs
- CompressionTracing.cs
- MessageEventSubscriptionService.cs
- AppDomainProtocolHandler.cs
- ColorKeyFrameCollection.cs
- Range.cs
- XPathScanner.cs
- DynamicField.cs
- SizeValueSerializer.cs
- WinCategoryAttribute.cs
- SkinBuilder.cs
- DataRelationCollection.cs
- PromptEventArgs.cs
- StringFreezingAttribute.cs
- TypeExtension.cs
- GenericUriParser.cs
- DiscoveryMessageSequence11.cs
- FieldTemplateFactory.cs
- CachedCompositeFamily.cs
- BasicExpandProvider.cs
- dataobject.cs
- XmlCharType.cs
- AudioBase.cs
- DbConvert.cs
- GregorianCalendarHelper.cs
- RadioButtonPopupAdapter.cs
- SqlNodeTypeOperators.cs
- Rotation3DAnimationUsingKeyFrames.cs
- RuntimeTransactionHandle.cs
- CancellationState.cs
- WebEventCodes.cs
- HttpListenerResponse.cs
- SimpleFieldTemplateFactory.cs
- XmlSchemaCollection.cs
- SizeConverter.cs
- SemanticKeyElement.cs
- DefaultTextStore.cs
- XamlSerializerUtil.cs
- Pair.cs
- DynamicPropertyHolder.cs
- PackageRelationship.cs
- DecoratedNameAttribute.cs
- DataSysAttribute.cs
- CqlParser.cs
- Thickness.cs
- CodeTypeDeclarationCollection.cs
- BinaryMessageFormatter.cs
- StyleBamlRecordReader.cs
- WindowInteractionStateTracker.cs
- PopupRoot.cs
- LexicalChunk.cs
- StreamDocument.cs
- DurationConverter.cs
- RepeatBehavior.cs
- EllipticalNodeOperations.cs
- ScrollEvent.cs
- basecomparevalidator.cs
- RuntimeArgumentHandle.cs
- MobileCapabilities.cs
- DataGridItemEventArgs.cs
- WpfKnownMemberInvoker.cs