Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / Orcas / NetFXw7 / ndp / fx / src / DataEntity / System / Data / Metadata / Edm / FacetDescription.cs / 1 / FacetDescription.cs
//----------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// @owner [....], [....]
//---------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Text;
using System.Diagnostics;
using System.Threading;
namespace System.Data.Metadata.Edm
{
///
/// Class for representing a FacetDescription object
///
public sealed class FacetDescription
{
#region Constructors
internal FacetDescription(string facetName,
EdmType facetType,
int? minValue,
int? maxValue,
object defaultValue,
bool isConstant,
string declaringTypeName)
{
_facetName = facetName;
_facetType = facetType;
_minValue = minValue;
_maxValue = maxValue;
// this ctor doesn't allow you to set the defaultValue to null
if (defaultValue != null)
{
_defaultValue = defaultValue;
}
else
{
_defaultValue = _notInitializedSentinel;
}
_isConstant = isConstant;
Validate(declaringTypeName);
if (_isConstant)
{
UpdateMinMaxValueForConstant(_facetName, _facetType, ref _minValue, ref _maxValue, _defaultValue);
}
}
///
/// The constructor for constructing a facet description object
///
/// The name of this facet
/// The type of this facet
/// The min value for this facet
/// The max value for this facet
/// The default value for this facet
/// Thrown if either facetName, facetType or applicableType arguments are null
internal FacetDescription(string facetName,
EdmType facetType,
int? minValue,
int? maxValue,
object defaultValue)
{
EntityUtil.CheckStringArgument(facetName, "facetName");
EntityUtil.GenericCheckArgumentNull(facetType, "facetType");
if (minValue.HasValue || maxValue.HasValue)
{
Debug.Assert(FacetDescription.IsNumericType(facetType), "Min and Max Values can only be specified for numeric facets");
if (minValue.HasValue && maxValue.HasValue)
{
Debug.Assert(minValue != maxValue, "minValue should not be equal to maxValue");
}
}
_facetName = facetName;
_facetType = facetType;
_minValue = minValue;
_maxValue = maxValue;
_defaultValue = defaultValue;
}
#endregion
#region Fields
private readonly string _facetName;
private readonly EdmType _facetType;
private readonly int? _minValue;
private readonly int? _maxValue;
private readonly object _defaultValue;
private readonly bool _isConstant;
/// A facet with the default value for this description.
private Facet _defaultValueFacet;
/// A facet with a null value for this description.
private Facet _nullValueFacet;
/// Type-dependant cache for additional values (possibly null).
private Facet[] _valueCache;
// we need to differentiate when the default value is null vs when the default value is not initialized
private static object _notInitializedSentinel = new object();
#endregion
#region Properties
///
/// Gets the name of this facet
///
public string FacetName
{
get
{
return _facetName;
}
}
///
/// Gets the type of this facet
///
public EdmType FacetType
{
get
{
return _facetType;
}
}
///
/// Gets the lower bound a facet with this facet description can take
///
public int? MinValue
{
get
{
return _minValue;
}
}
///
/// Gets the upper bound a facet with this facet description can take
///
public int? MaxValue
{
get
{
return _maxValue;
}
}
///
/// Gets the default value of a facet with this facet description
///
public object DefaultValue
{
get
{
if (_defaultValue == _notInitializedSentinel)
{
return null;
}
return _defaultValue;
}
}
///
/// Gets whether the value of this facet must be constant
///
public bool IsConstant
{
get
{
return _isConstant;
}
}
///
/// Gets whether this facet is a required facet or not
///
public bool IsRequired
{
get
{
return _defaultValue == _notInitializedSentinel;
}
}
#region Internal properties.
///
/// Gets a facet with the default value for this description.
///
internal Facet DefaultValueFacet
{
get
{
if (_defaultValueFacet == null)
{
Facet defaultValueFacet = Facet.Create(this, this.DefaultValue, true);
Interlocked.CompareExchange(ref _defaultValueFacet, defaultValueFacet, null);
}
return _defaultValueFacet;
}
}
///
/// Gets a facet with a null value for this description.
///
internal Facet NullValueFacet
{
get
{
if (_nullValueFacet == null)
{
Facet nullValueFacet = Facet.Create(this, null, true);
Interlocked.CompareExchange(ref _nullValueFacet, nullValueFacet, null);
}
return _nullValueFacet;
}
}
#endregion Internal properties.
#endregion
#region Methods
///
/// Overriding System.Object.ToString to provide better String representation
/// for this type.
///
public override string ToString()
{
return this.FacetName;
}
///
/// Gets a cached facet instance with the specified boolean value.
///
/// Value for the Facet result.
/// A cached facet instance with the specified boolean value.
internal Facet GetBooleanFacet(bool value)
{
System.Diagnostics.Debug.Assert(this.FacetType.Identity == "Edm.Boolean");
if (_valueCache == null)
{
Facet[] valueCache = new Facet[2];
valueCache[0] = Facet.Create(this, true, true);
valueCache[1] = Facet.Create(this, false, true);
System.Threading.Interlocked.CompareExchange(
ref _valueCache,
valueCache,
null
);
}
return (value) ? _valueCache[0] : _valueCache[1];
}
///
/// Returns true if the facet type is of numeric type
///
/// Type of the facet
///
internal static bool IsNumericType(EdmType facetType)
{
if (Helper.IsPrimitiveType(facetType))
{
PrimitiveType primitiveType = (PrimitiveType)facetType;
return primitiveType.PrimitiveTypeKind == PrimitiveTypeKind.Byte ||
primitiveType.PrimitiveTypeKind == PrimitiveTypeKind.SByte ||
primitiveType.PrimitiveTypeKind == PrimitiveTypeKind.Int16 ||
primitiveType.PrimitiveTypeKind == PrimitiveTypeKind.Int32;
}
return false;
}
private static void UpdateMinMaxValueForConstant(string facetName, EdmType facetType, ref int? minValue, ref int? maxValue, object defaultValue)
{
if (FacetDescription.IsNumericType(facetType))
{
if (facetName == EdmProviderManifest.PrecisionFacetName ||
facetName == EdmProviderManifest.ScaleFacetName)
{
minValue = (int?)((byte?)defaultValue);
maxValue = (int?)((byte?)defaultValue);
}
else
{
minValue = (int?)defaultValue;
maxValue = (int?)defaultValue;
}
}
}
private void Validate(string declaringTypeName)
{
if (_defaultValue == _notInitializedSentinel)
{
if (_isConstant)
{
throw EntityUtil.MissingDefaultValueForConstantFacet(_facetName, declaringTypeName);
}
}
else if (FacetDescription.IsNumericType(_facetType))
{
if (_isConstant)
{
// Either both of them are not specified or both of them have the same value
if ((_minValue.HasValue != _maxValue.HasValue) ||
(_minValue.HasValue && _minValue.Value != _maxValue.Value))
{
throw EntityUtil.MinAndMaxValueMustBeSameForConstantFacet(_facetName, declaringTypeName);
}
}
// If its not constant, then both of the minValue and maxValue must be specified
else if (!_minValue.HasValue || !_maxValue.HasValue)
{
throw EntityUtil.BothMinAndMaxValueMustBeSpecifiedForNonConstantFacet(_facetName, declaringTypeName);
}
else if (_minValue.Value == _maxValue)
{
throw EntityUtil.MinAndMaxValueMustBeDifferentForNonConstantFacet(_facetName, declaringTypeName);
}
else if (_minValue < 0 || _maxValue < 0)
{
throw EntityUtil.MinAndMaxMustBePositive(_facetName, declaringTypeName);
}
else if (_minValue > _maxValue)
{
throw EntityUtil.MinMustBeLessThanMax(_minValue.ToString(), _facetName, declaringTypeName);
}
}
}
#endregion
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//----------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// @owner [....], [....]
//---------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Text;
using System.Diagnostics;
using System.Threading;
namespace System.Data.Metadata.Edm
{
///
/// Class for representing a FacetDescription object
///
public sealed class FacetDescription
{
#region Constructors
internal FacetDescription(string facetName,
EdmType facetType,
int? minValue,
int? maxValue,
object defaultValue,
bool isConstant,
string declaringTypeName)
{
_facetName = facetName;
_facetType = facetType;
_minValue = minValue;
_maxValue = maxValue;
// this ctor doesn't allow you to set the defaultValue to null
if (defaultValue != null)
{
_defaultValue = defaultValue;
}
else
{
_defaultValue = _notInitializedSentinel;
}
_isConstant = isConstant;
Validate(declaringTypeName);
if (_isConstant)
{
UpdateMinMaxValueForConstant(_facetName, _facetType, ref _minValue, ref _maxValue, _defaultValue);
}
}
///
/// The constructor for constructing a facet description object
///
/// The name of this facet
/// The type of this facet
/// The min value for this facet
/// The max value for this facet
/// The default value for this facet
/// Thrown if either facetName, facetType or applicableType arguments are null
internal FacetDescription(string facetName,
EdmType facetType,
int? minValue,
int? maxValue,
object defaultValue)
{
EntityUtil.CheckStringArgument(facetName, "facetName");
EntityUtil.GenericCheckArgumentNull(facetType, "facetType");
if (minValue.HasValue || maxValue.HasValue)
{
Debug.Assert(FacetDescription.IsNumericType(facetType), "Min and Max Values can only be specified for numeric facets");
if (minValue.HasValue && maxValue.HasValue)
{
Debug.Assert(minValue != maxValue, "minValue should not be equal to maxValue");
}
}
_facetName = facetName;
_facetType = facetType;
_minValue = minValue;
_maxValue = maxValue;
_defaultValue = defaultValue;
}
#endregion
#region Fields
private readonly string _facetName;
private readonly EdmType _facetType;
private readonly int? _minValue;
private readonly int? _maxValue;
private readonly object _defaultValue;
private readonly bool _isConstant;
/// A facet with the default value for this description.
private Facet _defaultValueFacet;
/// A facet with a null value for this description.
private Facet _nullValueFacet;
/// Type-dependant cache for additional values (possibly null).
private Facet[] _valueCache;
// we need to differentiate when the default value is null vs when the default value is not initialized
private static object _notInitializedSentinel = new object();
#endregion
#region Properties
///
/// Gets the name of this facet
///
public string FacetName
{
get
{
return _facetName;
}
}
///
/// Gets the type of this facet
///
public EdmType FacetType
{
get
{
return _facetType;
}
}
///
/// Gets the lower bound a facet with this facet description can take
///
public int? MinValue
{
get
{
return _minValue;
}
}
///
/// Gets the upper bound a facet with this facet description can take
///
public int? MaxValue
{
get
{
return _maxValue;
}
}
///
/// Gets the default value of a facet with this facet description
///
public object DefaultValue
{
get
{
if (_defaultValue == _notInitializedSentinel)
{
return null;
}
return _defaultValue;
}
}
///
/// Gets whether the value of this facet must be constant
///
public bool IsConstant
{
get
{
return _isConstant;
}
}
///
/// Gets whether this facet is a required facet or not
///
public bool IsRequired
{
get
{
return _defaultValue == _notInitializedSentinel;
}
}
#region Internal properties.
///
/// Gets a facet with the default value for this description.
///
internal Facet DefaultValueFacet
{
get
{
if (_defaultValueFacet == null)
{
Facet defaultValueFacet = Facet.Create(this, this.DefaultValue, true);
Interlocked.CompareExchange(ref _defaultValueFacet, defaultValueFacet, null);
}
return _defaultValueFacet;
}
}
///
/// Gets a facet with a null value for this description.
///
internal Facet NullValueFacet
{
get
{
if (_nullValueFacet == null)
{
Facet nullValueFacet = Facet.Create(this, null, true);
Interlocked.CompareExchange(ref _nullValueFacet, nullValueFacet, null);
}
return _nullValueFacet;
}
}
#endregion Internal properties.
#endregion
#region Methods
///
/// Overriding System.Object.ToString to provide better String representation
/// for this type.
///
public override string ToString()
{
return this.FacetName;
}
///
/// Gets a cached facet instance with the specified boolean value.
///
/// Value for the Facet result.
/// A cached facet instance with the specified boolean value.
internal Facet GetBooleanFacet(bool value)
{
System.Diagnostics.Debug.Assert(this.FacetType.Identity == "Edm.Boolean");
if (_valueCache == null)
{
Facet[] valueCache = new Facet[2];
valueCache[0] = Facet.Create(this, true, true);
valueCache[1] = Facet.Create(this, false, true);
System.Threading.Interlocked.CompareExchange(
ref _valueCache,
valueCache,
null
);
}
return (value) ? _valueCache[0] : _valueCache[1];
}
///
/// Returns true if the facet type is of numeric type
///
/// Type of the facet
///
internal static bool IsNumericType(EdmType facetType)
{
if (Helper.IsPrimitiveType(facetType))
{
PrimitiveType primitiveType = (PrimitiveType)facetType;
return primitiveType.PrimitiveTypeKind == PrimitiveTypeKind.Byte ||
primitiveType.PrimitiveTypeKind == PrimitiveTypeKind.SByte ||
primitiveType.PrimitiveTypeKind == PrimitiveTypeKind.Int16 ||
primitiveType.PrimitiveTypeKind == PrimitiveTypeKind.Int32;
}
return false;
}
private static void UpdateMinMaxValueForConstant(string facetName, EdmType facetType, ref int? minValue, ref int? maxValue, object defaultValue)
{
if (FacetDescription.IsNumericType(facetType))
{
if (facetName == EdmProviderManifest.PrecisionFacetName ||
facetName == EdmProviderManifest.ScaleFacetName)
{
minValue = (int?)((byte?)defaultValue);
maxValue = (int?)((byte?)defaultValue);
}
else
{
minValue = (int?)defaultValue;
maxValue = (int?)defaultValue;
}
}
}
private void Validate(string declaringTypeName)
{
if (_defaultValue == _notInitializedSentinel)
{
if (_isConstant)
{
throw EntityUtil.MissingDefaultValueForConstantFacet(_facetName, declaringTypeName);
}
}
else if (FacetDescription.IsNumericType(_facetType))
{
if (_isConstant)
{
// Either both of them are not specified or both of them have the same value
if ((_minValue.HasValue != _maxValue.HasValue) ||
(_minValue.HasValue && _minValue.Value != _maxValue.Value))
{
throw EntityUtil.MinAndMaxValueMustBeSameForConstantFacet(_facetName, declaringTypeName);
}
}
// If its not constant, then both of the minValue and maxValue must be specified
else if (!_minValue.HasValue || !_maxValue.HasValue)
{
throw EntityUtil.BothMinAndMaxValueMustBeSpecifiedForNonConstantFacet(_facetName, declaringTypeName);
}
else if (_minValue.Value == _maxValue)
{
throw EntityUtil.MinAndMaxValueMustBeDifferentForNonConstantFacet(_facetName, declaringTypeName);
}
else if (_minValue < 0 || _maxValue < 0)
{
throw EntityUtil.MinAndMaxMustBePositive(_facetName, declaringTypeName);
}
else if (_minValue > _maxValue)
{
throw EntityUtil.MinMustBeLessThanMax(_minValue.ToString(), _facetName, declaringTypeName);
}
}
}
#endregion
}
}
// 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
- TransformPattern.cs
- PublisherIdentityPermission.cs
- Recipient.cs
- XamlReaderHelper.cs
- SortDescriptionCollection.cs
- Span.cs
- SQLMembershipProvider.cs
- PropertyChangingEventArgs.cs
- NumberFormatter.cs
- DocumentsTrace.cs
- RemoteWebConfigurationHost.cs
- TagNameToTypeMapper.cs
- ResumeStoryboard.cs
- IconBitmapDecoder.cs
- ContextMenu.cs
- DocumentGrid.cs
- PostBackOptions.cs
- SocketPermission.cs
- DataGridHeaderBorder.cs
- HttpCachePolicy.cs
- ChannelManager.cs
- SmtpReplyReader.cs
- EntityConnection.cs
- DCSafeHandle.cs
- HyperlinkAutomationPeer.cs
- AccessDataSourceView.cs
- VisualBasic.cs
- BuildProvider.cs
- path.cs
- Set.cs
- SelectingProviderEventArgs.cs
- SpellerStatusTable.cs
- SoapMessage.cs
- WebCategoryAttribute.cs
- RelatedView.cs
- FlowLayoutPanel.cs
- Asn1IntegerConverter.cs
- FocusManager.cs
- ListMarkerSourceInfo.cs
- DataGridSortCommandEventArgs.cs
- _BaseOverlappedAsyncResult.cs
- GenericTypeParameterBuilder.cs
- FileRecordSequence.cs
- SizeIndependentAnimationStorage.cs
- CustomExpression.cs
- URI.cs
- EditorPart.cs
- NetSectionGroup.cs
- XpsFilter.cs
- ServiceSettingsResponseInfo.cs
- BitHelper.cs
- DecimalAnimationBase.cs
- GZipDecoder.cs
- DataTableCollection.cs
- PackageRelationship.cs
- SafeFindHandle.cs
- XmlNode.cs
- AppSettingsReader.cs
- XmlArrayAttribute.cs
- xamlnodes.cs
- SafeCryptoHandles.cs
- SaveFileDialog.cs
- ProcessModelSection.cs
- HtmlImageAdapter.cs
- BatchParser.cs
- RelationshipWrapper.cs
- Graph.cs
- FragmentNavigationEventArgs.cs
- DataSourceControlBuilder.cs
- DataReceivedEventArgs.cs
- CommandTreeTypeHelper.cs
- GradientSpreadMethodValidation.cs
- KeySplineConverter.cs
- IndexedEnumerable.cs
- SynchronousReceiveBehavior.cs
- IPGlobalProperties.cs
- ValidationError.cs
- CodeDOMUtility.cs
- CompatibleIComparer.cs
- ZipPackagePart.cs
- ObjectCacheHost.cs
- PermissionListSet.cs
- GPPOINT.cs
- Keyboard.cs
- CatalogZone.cs
- Point.cs
- COM2PictureConverter.cs
- RegexInterpreter.cs
- MultitargetUtil.cs
- SecurityContext.cs
- PageFunction.cs
- _NegotiateClient.cs
- ProbeMatchesApril2005.cs
- ActivityPreviewDesigner.cs
- DataPagerFieldCommandEventArgs.cs
- AssemblyAssociatedContentFileAttribute.cs
- ChangeNode.cs
- mda.cs
- SingleBodyParameterMessageFormatter.cs
- ProcessModelInfo.cs