Code:
/ 4.0 / 4.0 / untmp / 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.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- SqlRetyper.cs
- BaseInfoTable.cs
- PickBranch.cs
- BamlCollectionHolder.cs
- CustomErrorCollection.cs
- SecurityKeyEntropyMode.cs
- ItemsPanelTemplate.cs
- KeyEvent.cs
- SafeRegistryHandle.cs
- DateRangeEvent.cs
- InputLangChangeEvent.cs
- StylusShape.cs
- ExceptionRoutedEventArgs.cs
- EventLogWatcher.cs
- LambdaCompiler.Binary.cs
- FormViewUpdatedEventArgs.cs
- HwndTarget.cs
- ObjectDisposedException.cs
- CodeCatchClauseCollection.cs
- TailPinnedEventArgs.cs
- StatusCommandUI.cs
- RequestCachePolicy.cs
- DesignerSerializationOptionsAttribute.cs
- RectConverter.cs
- XmlSignificantWhitespace.cs
- X509Chain.cs
- ListItemCollection.cs
- BlurEffect.cs
- DataGridViewCellStyleBuilderDialog.cs
- BitmapPalette.cs
- NodeFunctions.cs
- MergeLocalizationDirectives.cs
- ObjectStateManager.cs
- AttributeSetAction.cs
- XmlSchemaIdentityConstraint.cs
- FileCodeGroup.cs
- JsonServiceDocumentSerializer.cs
- SplineQuaternionKeyFrame.cs
- ExtendedPropertyDescriptor.cs
- IntAverageAggregationOperator.cs
- BCryptSafeHandles.cs
- ChtmlFormAdapter.cs
- WindowsAuthenticationModule.cs
- WebPartsPersonalizationAuthorization.cs
- TypeReference.cs
- TearOffProxy.cs
- PageParserFilter.cs
- AdRotator.cs
- PrintController.cs
- EntityParameterCollection.cs
- WindowsPen.cs
- ProxyRpc.cs
- ClientSideQueueItem.cs
- PageRequestManager.cs
- ZoneButton.cs
- CacheMemory.cs
- SqlResolver.cs
- CommandLineParser.cs
- NativeRecognizer.cs
- ZipIOCentralDirectoryBlock.cs
- TabletCollection.cs
- DataTableMappingCollection.cs
- DataGridViewImageColumn.cs
- ExpandableObjectConverter.cs
- Transform3D.cs
- PropVariant.cs
- CodeTypeReferenceExpression.cs
- FunctionGenerator.cs
- CodeAttachEventStatement.cs
- XmlQueryCardinality.cs
- WmlPanelAdapter.cs
- NonParentingControl.cs
- MergePropertyDescriptor.cs
- XmlLanguageConverter.cs
- SafeNativeMethods.cs
- SoapAttributeAttribute.cs
- recordstatefactory.cs
- ImageDrawing.cs
- CanonicalFontFamilyReference.cs
- NativeBuffer.cs
- CustomUserNameSecurityTokenAuthenticator.cs
- Schema.cs
- StructuredTypeEmitter.cs
- XmlDataCollection.cs
- DataMisalignedException.cs
- QEncodedStream.cs
- FastEncoder.cs
- FileDataSourceCache.cs
- MessageQueueAccessControlEntry.cs
- HttpWriter.cs
- StylusPointProperty.cs
- ApplicationCommands.cs
- MyContact.cs
- XmlILStorageConverter.cs
- XmlAttributeCollection.cs
- EnumValAlphaComparer.cs
- QilStrConcat.cs
- SafeWaitHandle.cs
- ConfigXmlComment.cs
- SchemaSetCompiler.cs