private ConfigurationLockCollection ParseLockedAttributes(ConfigurationValue value, ConfigurationLockCollectionType lockType) {
// check that only actual properties are in the lock attribute
ConfigurationLockCollection localLockedAttributesList = new ConfigurationLockCollection(this, lockType);
string attributeList = (string)(value.Value);
if (string.IsNullOrEmpty(attributeList)) {
if (lockType == ConfigurationLockCollectionType.LockedAttributes)
throw new ConfigurationErrorsException(SR.GetString(SR.Empty_attribute, LockAttributesKey), value.SourceInfo.FileName, value.SourceInfo.LineNumber);
if (lockType == ConfigurationLockCollectionType.LockedElements)
throw new ConfigurationErrorsException(SR.GetString(SR.Empty_attribute, LockElementsKey), value.SourceInfo.FileName, value.SourceInfo.LineNumber);
if (lockType == ConfigurationLockCollectionType.LockedExceptionList)
throw new ConfigurationErrorsException(SR.GetString(SR.Config_empty_lock_attributes_except, LockAllAttributesExceptKey, LockAttributesKey), value.SourceInfo.FileName, value.SourceInfo.LineNumber);
if (lockType == ConfigurationLockCollectionType.LockedElementsExceptionList)
throw new ConfigurationErrorsException(SR.GetString(SR.Config_empty_lock_element_except, LockAllElementsExceptKey, LockElementsKey), value.SourceInfo.FileName, value.SourceInfo.LineNumber);
}
string[] attribsToLock = attributeList.Split(new char[] { ',', ':', ';' });
foreach (string attribToLock in attribsToLock) {
string attribToLockTrim = attribToLock.Trim();
if (!String.IsNullOrEmpty(attribToLockTrim)) {
// validate that the locks are good
if (!((lockType == ConfigurationLockCollectionType.LockedElements ||
lockType == ConfigurationLockCollectionType.LockedAttributes) &&
attribToLockTrim == LockAll)) {
ConfigurationProperty propToLock = Properties[attribToLockTrim];
if (propToLock == null || // if the prop does not exist
attribToLockTrim == LockAttributesKey || // or it is the lockattributes keyword
attribToLockTrim == LockAllAttributesExceptKey || // or it is the lockattributes keyword
attribToLockTrim == LockElementsKey || // or it is the lockelements keyword
(lockType != ConfigurationLockCollectionType.LockedElements && lockType != ConfigurationLockCollectionType.LockedElementsExceptionList &&
typeof(ConfigurationElement).IsAssignableFrom(propToLock.Type)) || // or if not locking elements but the property is a element
((lockType == ConfigurationLockCollectionType.LockedElements || lockType == ConfigurationLockCollectionType.LockedElementsExceptionList) &&
!typeof(ConfigurationElement).IsAssignableFrom(propToLock.Type)) // or if locking elements but the property is not an element
) {
// check to see if this is a collection and we are locking a collection element
ConfigurationElementCollection collection = this as ConfigurationElementCollection;
if (collection == null && Properties.DefaultCollectionProperty != null) // this is not a collection but it may contain a default collection
{
collection = this[Properties.DefaultCollectionProperty] as ConfigurationElementCollection;
}
if (collection == null ||
lockType == ConfigurationLockCollectionType.LockedAttributes || // If the collection type is not element then the lock is bogus
lockType == ConfigurationLockCollectionType.LockedExceptionList) {
ReportInvalidLock(attribToLockTrim, lockType, value, null);
}
else if (!collection.IsLockableElement(attribToLockTrim)) {
ReportInvalidLock(attribToLockTrim, lockType, value, collection.LockableElements);
}
}
if (propToLock != null && propToLock.IsRequired == true)
throw new ConfigurationErrorsException(SR.GetString(SR.Config_base_required_attribute_lock_attempt, propToLock.Name));
}
// concatenate the new attribute.
localLockedAttributesList.Add(attribToLockTrim, ConfigurationValueFlags.Default); // Mark as local
}
}
return localLockedAttributesList;
}