Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DataWeb / Client / System / Data / Services / Client / ALinq / PathBox.cs / 1305376 / PathBox.cs
//----------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// @owner [....]
//---------------------------------------------------------------------
namespace System.Data.Services.Client
{
#region Namespaces.
using System;
using System.Text;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Linq;
using System.Linq.Expressions;
#endregion Namespaces.
///
/// Holds state (Path, lambda parameter stack, etc) for projection analysis.
///
internal class PathBox
{
#region Private fields.
/// This class is used as a marker for an entity projected in its entirety.
private const char EntireEntityMarker = UriHelper.ASTERISK;
private readonly List projectionPaths = new List();
private readonly List expandPaths = new List();
private readonly Stack parameterExpressions = new Stack();
private readonly Dictionary basePaths = new Dictionary(ReferenceEqualityComparer.Instance);
#endregion Private fields.
/// Initializes a new instance.
internal PathBox()
{
// add a default empty path.
projectionPaths.Add(new StringBuilder());
}
internal IEnumerable ProjectionPaths
{
get
{
return projectionPaths.Where(s => s.Length > 0).Select(s => s.ToString()).Distinct();
}
}
internal IEnumerable ExpandPaths
{
get
{
return expandPaths.Where(s => s.Length > 0).Select(s => s.ToString()).Distinct();
}
}
internal void PushParamExpression(ParameterExpression pe)
{
StringBuilder basePath = projectionPaths.Last();
basePaths.Add(pe, basePath.ToString());
projectionPaths.Remove(basePath);
parameterExpressions.Push(pe);
}
internal void PopParamExpression()
{
parameterExpressions.Pop();
}
internal ParameterExpression ParamExpressionInScope
{
get
{
Debug.Assert(parameterExpressions.Count > 0);
return parameterExpressions.Peek();
}
}
/// Starts a new path.
internal void StartNewPath()
{
Debug.Assert(this.ParamExpressionInScope != null, "this.ParamExpressionInScope != null -- should not be starting new path with no lambda parameter in scope.");
StringBuilder sb = new StringBuilder(basePaths[this.ParamExpressionInScope]);
RemoveEntireEntityMarkerIfPresent(sb);
expandPaths.Add(new StringBuilder(sb.ToString()));
AddEntireEntityMarker(sb);
projectionPaths.Add(sb);
}
internal void AppendToPath(PropertyInfo pi)
{
Debug.Assert(pi != null, "pi != null");
StringBuilder sb;
Type t = TypeSystem.GetElementType(pi.PropertyType);
if (ClientType.CheckElementTypeIsEntity(t))
{
// an entity, so need to append to expand path also
sb = expandPaths.Last();
Debug.Assert(sb != null); // there should always be an expand path because must call StartNewPath first.
if (sb.Length > 0)
{
sb.Append(UriHelper.FORWARDSLASH);
}
sb.Append(pi.Name);
}
sb = projectionPaths.Last();
Debug.Assert(sb != null, "sb != null -- we are always building paths in the context of a parameter");
RemoveEntireEntityMarkerIfPresent(sb);
if (sb.Length > 0)
{
sb.Append(UriHelper.FORWARDSLASH);
}
sb.Append(pi.Name);
if (ClientType.CheckElementTypeIsEntity(t))
{
AddEntireEntityMarker(sb);
}
}
private static void RemoveEntireEntityMarkerIfPresent(StringBuilder sb)
{
if (sb.Length > 0 && sb[sb.Length - 1] == EntireEntityMarker)
{
sb.Remove(sb.Length - 1, 1);
}
if (sb.Length > 0 && sb[sb.Length - 1] == UriHelper.FORWARDSLASH)
{
sb.Remove(sb.Length - 1, 1);
}
}
private static void AddEntireEntityMarker(StringBuilder sb)
{
if (sb.Length > 0)
{
sb.Append(UriHelper.FORWARDSLASH);
}
sb.Append(EntireEntityMarker);
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//----------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// @owner [....]
//---------------------------------------------------------------------
namespace System.Data.Services.Client
{
#region Namespaces.
using System;
using System.Text;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Linq;
using System.Linq.Expressions;
#endregion Namespaces.
///
/// Holds state (Path, lambda parameter stack, etc) for projection analysis.
///
internal class PathBox
{
#region Private fields.
/// This class is used as a marker for an entity projected in its entirety.
private const char EntireEntityMarker = UriHelper.ASTERISK;
private readonly List projectionPaths = new List();
private readonly List expandPaths = new List();
private readonly Stack parameterExpressions = new Stack();
private readonly Dictionary basePaths = new Dictionary(ReferenceEqualityComparer.Instance);
#endregion Private fields.
/// Initializes a new instance.
internal PathBox()
{
// add a default empty path.
projectionPaths.Add(new StringBuilder());
}
internal IEnumerable ProjectionPaths
{
get
{
return projectionPaths.Where(s => s.Length > 0).Select(s => s.ToString()).Distinct();
}
}
internal IEnumerable ExpandPaths
{
get
{
return expandPaths.Where(s => s.Length > 0).Select(s => s.ToString()).Distinct();
}
}
internal void PushParamExpression(ParameterExpression pe)
{
StringBuilder basePath = projectionPaths.Last();
basePaths.Add(pe, basePath.ToString());
projectionPaths.Remove(basePath);
parameterExpressions.Push(pe);
}
internal void PopParamExpression()
{
parameterExpressions.Pop();
}
internal ParameterExpression ParamExpressionInScope
{
get
{
Debug.Assert(parameterExpressions.Count > 0);
return parameterExpressions.Peek();
}
}
/// Starts a new path.
internal void StartNewPath()
{
Debug.Assert(this.ParamExpressionInScope != null, "this.ParamExpressionInScope != null -- should not be starting new path with no lambda parameter in scope.");
StringBuilder sb = new StringBuilder(basePaths[this.ParamExpressionInScope]);
RemoveEntireEntityMarkerIfPresent(sb);
expandPaths.Add(new StringBuilder(sb.ToString()));
AddEntireEntityMarker(sb);
projectionPaths.Add(sb);
}
internal void AppendToPath(PropertyInfo pi)
{
Debug.Assert(pi != null, "pi != null");
StringBuilder sb;
Type t = TypeSystem.GetElementType(pi.PropertyType);
if (ClientType.CheckElementTypeIsEntity(t))
{
// an entity, so need to append to expand path also
sb = expandPaths.Last();
Debug.Assert(sb != null); // there should always be an expand path because must call StartNewPath first.
if (sb.Length > 0)
{
sb.Append(UriHelper.FORWARDSLASH);
}
sb.Append(pi.Name);
}
sb = projectionPaths.Last();
Debug.Assert(sb != null, "sb != null -- we are always building paths in the context of a parameter");
RemoveEntireEntityMarkerIfPresent(sb);
if (sb.Length > 0)
{
sb.Append(UriHelper.FORWARDSLASH);
}
sb.Append(pi.Name);
if (ClientType.CheckElementTypeIsEntity(t))
{
AddEntireEntityMarker(sb);
}
}
private static void RemoveEntireEntityMarkerIfPresent(StringBuilder sb)
{
if (sb.Length > 0 && sb[sb.Length - 1] == EntireEntityMarker)
{
sb.Remove(sb.Length - 1, 1);
}
if (sb.Length > 0 && sb[sb.Length - 1] == UriHelper.FORWARDSLASH)
{
sb.Remove(sb.Length - 1, 1);
}
}
private static void AddEntireEntityMarker(StringBuilder sb)
{
if (sb.Length > 0)
{
sb.Append(UriHelper.FORWARDSLASH);
}
sb.Append(EntireEntityMarker);
}
}
}
// 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
- FixedPageAutomationPeer.cs
- CLSCompliantAttribute.cs
- DataGridViewCellConverter.cs
- PersonalizationDictionary.cs
- X509RecipientCertificateServiceElement.cs
- UTF8Encoding.cs
- XmlReader.cs
- EventTask.cs
- KeyedCollection.cs
- ColorMap.cs
- StringFreezingAttribute.cs
- ScriptManagerProxy.cs
- SweepDirectionValidation.cs
- DataGridViewAccessibleObject.cs
- UriTemplateQueryValue.cs
- TextLineResult.cs
- DataGridViewTopRowAccessibleObject.cs
- XpsLiterals.cs
- MenuAutomationPeer.cs
- SourceElementsCollection.cs
- MatrixAnimationUsingKeyFrames.cs
- TransportElement.cs
- PagerSettings.cs
- DateTimeOffsetAdapter.cs
- newinstructionaction.cs
- SafeNativeMethodsCLR.cs
- TypeConverterValueSerializer.cs
- CacheChildrenQuery.cs
- XmlSchemaProviderAttribute.cs
- RawStylusActions.cs
- AsyncPostBackTrigger.cs
- ProtocolsConfiguration.cs
- ArraySortHelper.cs
- StringCollection.cs
- NavigationExpr.cs
- ResourceReferenceKeyNotFoundException.cs
- DataGridBeginningEditEventArgs.cs
- Keywords.cs
- CopyCodeAction.cs
- DashStyle.cs
- _NegoStream.cs
- IntSecurity.cs
- Int64Animation.cs
- BaseCodeDomTreeGenerator.cs
- FormsIdentity.cs
- IntSecurity.cs
- ModulesEntry.cs
- odbcmetadatacolumnnames.cs
- Path.cs
- Stroke2.cs
- ProcessMonitor.cs
- ToolStripItemTextRenderEventArgs.cs
- indexingfiltermarshaler.cs
- XpsFilter.cs
- EntitySqlQueryCacheKey.cs
- Span.cs
- SatelliteContractVersionAttribute.cs
- Journal.cs
- BitmapEffectGroup.cs
- Rect.cs
- Tracking.cs
- EntitySqlException.cs
- NativeMethods.cs
- DataServiceQuery.cs
- GeneralTransform3DCollection.cs
- UpdateTranslator.cs
- SqlDependencyUtils.cs
- x509store.cs
- Run.cs
- ScriptingRoleServiceSection.cs
- ValidationUtility.cs
- _AutoWebProxyScriptEngine.cs
- CloudCollection.cs
- TimeSpanMinutesConverter.cs
- HttpCachePolicy.cs
- StorageSetMapping.cs
- ViewBase.cs
- ButtonAutomationPeer.cs
- PrivateUnsafeNativeCompoundFileMethods.cs
- ByteStreamBufferedMessageData.cs
- DiagnosticTraceSource.cs
- RelationshipEnd.cs
- _NtlmClient.cs
- NullReferenceException.cs
- DependencyProperty.cs
- Rfc4050KeyFormatter.cs
- ThicknessAnimation.cs
- SignatureDescription.cs
- QilDataSource.cs
- SqlConnectionPoolGroupProviderInfo.cs
- MessagingDescriptionAttribute.cs
- BuildProvider.cs
- ToolStripDropDownButton.cs
- BrowserCapabilitiesFactory35.cs
- _NTAuthentication.cs
- __FastResourceComparer.cs
- ControllableStoryboardAction.cs
- ZipIOCentralDirectoryFileHeader.cs
- FullTrustAssemblyCollection.cs
- ScriptControl.cs