e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
162 lines
6.0 KiB
C#
162 lines
6.0 KiB
C#
//------------------------------------------------------------
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//------------------------------------------------------------
|
|
namespace System.ServiceModel.Configuration
|
|
{
|
|
using System;
|
|
using System.Collections.Specialized;
|
|
using System.ComponentModel;
|
|
using System.Configuration;
|
|
using System.Diagnostics.CodeAnalysis;
|
|
using System.Reflection;
|
|
using System.Runtime;
|
|
using System.ServiceModel.Description;
|
|
using System.ServiceModel.Persistence;
|
|
using System.Workflow.Runtime;
|
|
using System.Xml;
|
|
|
|
[Obsolete("The WF3 types are deprecated. Instead, please use the new WF4 types from System.Activities.*")]
|
|
public class PersistenceProviderElement : BehaviorExtensionElement
|
|
{
|
|
const string persistenceOperationTimeoutParameter = "persistenceOperationTimeout";
|
|
const string typeParameter = "type";
|
|
int argumentsHash;
|
|
|
|
NameValueCollection persistenceProviderArguments;
|
|
|
|
public PersistenceProviderElement()
|
|
{
|
|
this.persistenceProviderArguments = new NameValueCollection();
|
|
this.argumentsHash = this.ComputeArgumentsHash();
|
|
}
|
|
|
|
// This property is not supposed to be exposed in config.
|
|
[SuppressMessage("Configuration", "Configuration102:ConfigurationPropertyAttributeRule")]
|
|
public override Type BehaviorType
|
|
{
|
|
get { return typeof(PersistenceProviderBehavior); }
|
|
}
|
|
|
|
[ConfigurationProperty(
|
|
persistenceOperationTimeoutParameter,
|
|
IsRequired = false,
|
|
DefaultValue = PersistenceProviderBehavior.DefaultPersistenceOperationTimeoutString)]
|
|
[TypeConverter(typeof(TimeSpanOrInfiniteConverter))]
|
|
[PositiveTimeSpanValidator]
|
|
public TimeSpan PersistenceOperationTimeout
|
|
{
|
|
get { return (TimeSpan) base[persistenceOperationTimeoutParameter]; }
|
|
set { base[persistenceOperationTimeoutParameter] = value; }
|
|
}
|
|
|
|
[SuppressMessage("Configuration", "Configuration102:ConfigurationPropertyAttributeRule")]
|
|
public NameValueCollection PersistenceProviderArguments
|
|
{
|
|
get { return this.persistenceProviderArguments; }
|
|
}
|
|
|
|
[ConfigurationProperty(typeParameter, IsRequired = true)]
|
|
[StringValidator(MinLength = 0)]
|
|
public string Type
|
|
{
|
|
get { return (string) base[typeParameter]; }
|
|
set { base[typeParameter] = value; }
|
|
}
|
|
|
|
protected internal override object CreateBehavior()
|
|
{
|
|
Fx.Assert(this.PersistenceOperationTimeout > TimeSpan.Zero,
|
|
"This should have been guaranteed by the validator on the setter.");
|
|
|
|
PersistenceProviderFactory providerFactory;
|
|
|
|
Type providerType = System.Type.GetType((string) base[typeParameter]);
|
|
|
|
if (providerType == null)
|
|
{
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
|
|
new InvalidOperationException(SR2.GetString(SR2.PersistenceProviderTypeNotFound)));
|
|
}
|
|
|
|
ConstructorInfo cInfo = providerType.GetConstructor(new Type[] { typeof(NameValueCollection) });
|
|
|
|
if (cInfo != null)
|
|
{
|
|
providerFactory = (PersistenceProviderFactory) cInfo.Invoke(new object[] { this.persistenceProviderArguments });
|
|
}
|
|
else
|
|
{
|
|
cInfo = providerType.GetConstructor(new Type[] { });
|
|
|
|
Fx.Assert(cInfo != null,
|
|
"The constructor should have been found - this should have been validated elsewhere.");
|
|
|
|
providerFactory = (PersistenceProviderFactory) cInfo.Invoke(null);
|
|
}
|
|
|
|
return new PersistenceProviderBehavior(providerFactory, this.PersistenceOperationTimeout);
|
|
}
|
|
|
|
protected override bool IsModified()
|
|
{
|
|
return base.IsModified() || this.argumentsHash != this.ComputeArgumentsHash();
|
|
}
|
|
|
|
protected override bool OnDeserializeUnrecognizedAttribute(string name, string value)
|
|
{
|
|
persistenceProviderArguments.Add(name, value);
|
|
|
|
return true;
|
|
}
|
|
|
|
protected override void PostDeserialize()
|
|
{
|
|
this.argumentsHash = this.ComputeArgumentsHash();
|
|
base.PostDeserialize();
|
|
}
|
|
|
|
protected override bool SerializeElement(XmlWriter writer, bool serializeCollectionKey)
|
|
{
|
|
bool result;
|
|
|
|
if (writer != null)
|
|
{
|
|
foreach (string key in this.persistenceProviderArguments.AllKeys)
|
|
{
|
|
writer.WriteAttributeString(key, this.persistenceProviderArguments[key]);
|
|
}
|
|
|
|
result = base.SerializeElement(writer, serializeCollectionKey);
|
|
result |= this.persistenceProviderArguments.Count > 0;
|
|
this.argumentsHash = this.ComputeArgumentsHash();
|
|
}
|
|
else
|
|
{
|
|
result = base.SerializeElement(writer, serializeCollectionKey);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
protected override void Unmerge(ConfigurationElement sourceElement, ConfigurationElement parentElement, ConfigurationSaveMode saveMode)
|
|
{
|
|
PersistenceProviderElement persistenceProviderElement = (PersistenceProviderElement) sourceElement;
|
|
this.persistenceProviderArguments = new NameValueCollection(persistenceProviderElement.persistenceProviderArguments);
|
|
this.argumentsHash = persistenceProviderElement.argumentsHash;
|
|
base.Unmerge(sourceElement, parentElement, saveMode);
|
|
}
|
|
|
|
int ComputeArgumentsHash()
|
|
{
|
|
int result = 0;
|
|
|
|
foreach (string key in this.persistenceProviderArguments.AllKeys)
|
|
{
|
|
result ^= key.GetHashCode() ^ this.persistenceProviderArguments[key].GetHashCode();
|
|
}
|
|
|
|
return result;
|
|
}
|
|
}
|
|
}
|