/// <summary>
        /// Sets up the query object and validates the passed in parameters to ensure they are compatible with each other
        /// </summary>
        /// <param name="attributeName">The name of the attribute being queried</param>
        /// <param name="comparisonOperator">THe value comparison operator to use</param>
        /// <param name="value">The value to use in the query</param>
        /// <param name="negate">Indicates if the query should be negated with the not() operator</param>
        /// <param name="attributeType">The type of the target attribute</param>
        /// <param name="isMultivalued">The multivalued status of the attribute being queried</param>
        private void SetupBuilder(string attributeName, ComparisonOperator comparisonOperator, object value, bool negate, AttributeType attributeType, bool isMultivalued)
        {
            if (string.IsNullOrWhiteSpace(attributeName))
            {
                throw new ArgumentNullException(attributeName);
            }

            ResourceManagementSchema.ValidateAttributeName(attributeName);

            if (value == null)
            {
                if (comparisonOperator != ComparisonOperator.IsNotPresent && comparisonOperator != ComparisonOperator.IsPresent)
                {
                    throw new InvalidOperationException("An object value is required unless the operator is IsPresent or IsNotPresent");
                }
            }

            this.AttributeName = attributeName;
            this.Operator      = comparisonOperator;
            this.Value         = value;
            this.Negate        = negate;

            this.attributeType = attributeType;
            this.isMultivalued = isMultivalued;

            this.ThrowOnInvalidTypeOperatorCombination();
            this.ThrowOnInvalidNegateCombination();
        }
        /// <summary>
        /// Populates the ResourceObject from a collection of fragments received from an enumeration response
        /// </summary>
        /// <param name="element">The parent XmlElement containing the object definition</param>
        private void PopulateResourceFromFragment(XmlElement element)
        {
            Dictionary <string, List <string> > values = new Dictionary <string, List <string> >();

            string objectTypeName = element.LocalName;

            this.ObjectType = ResourceManagementSchema.GetObjectType(objectTypeName);


            foreach (XmlElement child in element.ChildNodes.OfType <XmlElement>())
            {
                if (!values.ContainsKey(child.LocalName))
                {
                    values.Add(child.LocalName, new List <string>());
                }

                string value = child.InnerText;

                if (!string.IsNullOrEmpty(value))
                {
                    values[child.LocalName].Add(value);
                }
            }

            this.SetInitialAttributeValues(values, null);
        }
        /// <summary>
        /// Initializes a new instance of the XPathQuery class
        /// </summary>
        /// <param name="attributeName">The name of the attribute to compare against</param>
        /// <param name="comparisonOperator">The value comparison operator to use</param>
        /// <param name="value">The value to compare against</param>
        /// <param name="negate">Indicates if this query should be negated with the not() operator</param>
        public XPathQuery(string attributeName, ComparisonOperator comparisonOperator, object value, bool negate)
        {
            AttributeType attributeType = ResourceManagementSchema.GetAttributeType(attributeName);
            bool          isMultivalued = ResourceManagementSchema.IsAttributeMultivalued(attributeName);

            this.SetupBuilder(attributeName, comparisonOperator, value, negate, attributeType, isMultivalued);
        }
 internal static void LoadSchema(EndpointManager e)
 {
     if (!isLoaded)
     {
         ResourceManagementSchema.RefreshSchema(e);
     }
 }
        /// <summary>
        /// Gets a value indicating if the object type exists in the schema
        /// </summary>
        /// <param name="name">The system name of the object type</param>
        /// <returns>True if the object type exists in the schema, false if it does not</returns>
        public static bool ContainsObjectType(string name)
        {
            ResourceManagementSchema.schemaLock.WaitOne();

            ResourceManagementSchema.LoadSchema(ResourceManagementClient.EndpointManager);

            return(ResourceManagementSchema.ObjectTypes.ContainsKey(name));
        }
 /// <summary>
 /// Initializes a new instance of the ResourceObject class
 /// </summary>
 /// <param name="type">The object type that this object will represent</param>
 /// <param name="client">The client used for further operations on this object</param>
 internal ResourceObject(string type, ResourceManagementClient client)
     : this(OperationType.Create, client, null)
 {
     this.IsPlaceHolder = true;
     this.ObjectType    = ResourceManagementSchema.GetObjectType(type);
     this.AddRemainingAttributesFromSchema();
     this.attributes[AttributeNames.ObjectType].SetValue(type);
 }
        /// <summary>
        /// Gets each object type definition from the schema
        /// </summary>
        /// <returns>An enumeration of ObjectTypeDefinitions</returns>
        public static IEnumerable <ObjectTypeDefinition> GetObjectTypes()
        {
            ResourceManagementSchema.schemaLock.WaitOne();

            ResourceManagementSchema.LoadSchema(ResourceManagementClient.EndpointManager);

            return(ResourceManagementSchema.ObjectTypes.Values);
        }
        /// <summary>
        /// Forces a download of the schema from the ResourceManagementService
        /// </summary>
        /// <remarks>
        /// This method should be called after making changes to ResourceObjects that form the schema
        /// </remarks>
        internal static void RefreshSchema(EndpointManager e)
        {
            lock (lockObject)
            {
                ResourceManagementSchema.ObjectTypes = new Dictionary <string, ObjectTypeDefinition>();

                MetadataSet set = ResourceManagementSchema.GetMetadataSet(e);
                ResourceManagementSchema.PopulateSchemaFromMetadata(set);
                isLoaded = true;
            }
        }
 internal static void LoadSchema(EndpointManager e)
 {
     lock (lockObject)
     {
         if (!isLoaded)
         {
             ResourceManagementSchema.RefreshSchema(e);
             ResourceManagementSchema.LoadNameValidationRegularExpressions();
         }
     }
 }
        /// <summary>
        /// Gets an object type definition from the schema by name
        /// </summary>
        /// <param name="name">The system name of the object type</param>
        /// <returns>A ObjectTypeDefinition with a system name that matches the 'name' parameter</returns>
        /// <exception cref="NoSuchObjectTypeException">Throw when an object type could not be found in the schema with a matching name</exception>
        public static ObjectTypeDefinition GetObjectType(string name)
        {
            ResourceManagementSchema.LoadSchema(ResourceManagementClient.EndpointManager);

            if (ResourceManagementSchema.ObjectTypes.ContainsKey(name))
            {
                return(ResourceManagementSchema.ObjectTypes[name]);
            }
            else
            {
                throw new NoSuchObjectTypeException(name);
            }
        }
        /// <summary>
        /// Populates the ResourceObject from a partial response to a Get request
        /// </summary>
        /// <param name="objectElements">A collection of XmlElements defining the object</param>
        private void PopulateResourceFromPartialResponse(IEnumerable <XmlElement> objectElements)
        {
            Dictionary <string, List <string> >      values      = new Dictionary <string, List <string> >();
            Dictionary <string, AttributePermission> permissions = new Dictionary <string, AttributePermission>();

            foreach (XmlElement partialAttributeElement in objectElements.Where(t => t.LocalName == "PartialAttribute"))
            {
                foreach (XmlElement attributeElement in partialAttributeElement.ChildNodes.OfType <XmlElement>())
                {
                    if (!values.ContainsKey(attributeElement.LocalName))
                    {
                        values.Add(attributeElement.LocalName, new List <string>());
                    }

                    AttributePermission p;
                    if (Enum.TryParse(attributeElement.GetAttribute("permissions", Namespaces.ResourceManagement), out p))
                    {
                        if (!permissions.ContainsKey(attributeElement.LocalName))
                        {
                            permissions.Add(attributeElement.LocalName, p);
                        }
                        else
                        {
                            permissions[attributeElement.LocalName] = p;
                        }
                    }

                    string value = attributeElement.InnerText;

                    if (!string.IsNullOrEmpty(value))
                    {
                        values[attributeElement.LocalName].Add(value);
                    }
                }
            }

            if (values.ContainsKey(AttributeNames.ObjectType))
            {
                string objectTypeName           = values[AttributeNames.ObjectType].First();
                ObjectTypeDefinition objectType = ResourceManagementSchema.GetObjectType(objectTypeName);
                this.ObjectType = objectType;
            }
            else
            {
                throw new ArgumentException("No object type was specified in the response");
            }

            this.SetInitialAttributeValues(values, permissions);
        }
        /// <summary>
        /// Gets a value indicating whether the specific attribute is multivalued
        /// </summary>
        /// <param name="attributeName">The attribute name</param>
        /// <returns>A value indicating whether the specific attribute is multivalued</returns>
        public static bool IsAttributeMultivalued(string attributeName)
        {
            ResourceManagementSchema.LoadSchema(ResourceManagementClient.EndpointManager);

            foreach (ObjectTypeDefinition objectType in ResourceManagementSchema.ObjectTypes.Values)
            {
                AttributeTypeDefinition attributeType = objectType.Attributes.FirstOrDefault(t => t.SystemName == attributeName);

                if (attributeType != null)
                {
                    return(attributeType.IsMultivalued);
                }
            }

            throw new NoSuchAttributeException(attributeName);
        }
 /// <summary>
 /// Forces a download of the schema from the ResourceManagementService
 /// </summary>
 /// <remarks>
 /// This method should be called after making changes to ResourceObjects that form the schema
 /// </remarks>
 internal static void RefreshSchema(EndpointManager e)
 {
     try
     {
         ResourceManagementSchema.schemaLock.WaitOne();
         ResourceManagementSchema.schemaLock.Reset();
         MetadataSet set = ResourceManagementSchema.GetMetadataSet(e);
         ResourceManagementSchema.PopulateSchemaFromMetadata(set);
         ResourceManagementSchema.LoadNameValidationRegularExpressions();
         ResourceManagementSchema.SchemaEndpoint = e.MetadataEndpoint.Uri;
         isLoaded = true;
     }
     finally
     {
         ResourceManagementSchema.schemaLock.Set();
     }
 }
        /// <summary>
        /// Populates the ResourceObject from its full object definition received from a Get request
        /// </summary>
        /// <param name="reader">The XmlDictionaryReader containing the full object definition</param>
        private void PopulateResourceFromFullObject(XmlDictionaryReader reader)
        {
            Dictionary <string, List <string> >      values      = new Dictionary <string, List <string> >();
            Dictionary <string, AttributePermission> permissions = new Dictionary <string, AttributePermission>();

            reader.MoveToStartElement();

            string objectTypeName = reader.LocalName;

            this.ObjectType = ResourceManagementSchema.GetObjectType(objectTypeName);

            while (reader.Read())
            {
                if (reader.NodeType != XmlNodeType.Element)
                {
                    continue;
                }

                if (!values.ContainsKey(reader.LocalName))
                {
                    values.Add(reader.LocalName, new List <string>());
                }

                AttributePermission p;
                if (Enum.TryParse(reader.GetAttribute("permissions", Namespaces.ResourceManagement), out p))
                {
                    if (!permissions.ContainsKey(reader.LocalName))
                    {
                        permissions.Add(reader.LocalName, p);
                    }
                    else
                    {
                        permissions[reader.LocalName] = p;
                    }
                }

                string value = reader.ReadString();
                if (!string.IsNullOrEmpty(value))
                {
                    values[reader.LocalName].Add(value);
                }
            }

            this.SetInitialAttributeValues(values, permissions);
        }
Пример #15
0
        /// <summary>
        /// Builds the XPath expression
        /// </summary>
        /// <returns>The string representation of the expression</returns>
        protected virtual string BuildExpression()
        {
            StringBuilder sb = new StringBuilder();

            if (this.ObjectType != "*")
            {
                ResourceManagementSchema.ValidateObjectTypeName(this.ObjectType);
            }

            sb.AppendFormat("/{0}", this.ObjectType);

            if (this.Query != null)
            {
                sb.AppendFormat("[{0}]", this.Query.BuildQueryString());
            }

            return(sb.ToString());
        }
        /// <summary>
        /// Gets the data type of the specific attribute
        /// </summary>
        /// <param name="attributeName">The attribute name</param>
        /// <returns>An <c>AttributeType</c> value</returns>
        public static AttributeType GetAttributeType(string attributeName)
        {
            ResourceManagementSchema.schemaLock.WaitOne();

            ResourceManagementSchema.LoadSchema(ResourceManagementClient.EndpointManager);

            foreach (ObjectTypeDefinition objectType in ResourceManagementSchema.ObjectTypes.Values)
            {
                AttributeTypeDefinition attributeType = objectType.Attributes.FirstOrDefault(t => t.SystemName == attributeName);

                if (attributeType != null)
                {
                    return(attributeType.Type);
                }
            }

            throw new NoSuchAttributeException(attributeName);
        }
        /// <summary>
        /// Deserializes an object from a serialization data set
        /// </summary>
        /// <param name="info">The serialization data</param>
        private void DeserializeObject(SerializationInfo info)
        {
            Dictionary <string, List <string> > values = new Dictionary <string, List <string> >();

            foreach (SerializationEntry entry in info)
            {
                IEnumerable <string> entryValues = entry.Value as IEnumerable <string>;

                if (entryValues != null)
                {
                    values.Add(entry.Name, entryValues.ToList());
                }
                else
                {
                    values.Add(entry.Name, new List <string>()
                    {
                        TypeConverter.ToString(entry.Value)
                    });
                }
            }

            if (!values.ContainsKey(AttributeNames.ObjectType))
            {
                throw new InvalidOperationException("The object type of the attribute was not present in the serialization data");
            }

            if (this.ModificationType == OperationType.None)
            {
                this.ModificationType = OperationType.Update;
            }

            string objectTypeName = values[AttributeNames.ObjectType].First();

            this.ObjectType = ResourceManagementSchema.GetObjectType(objectTypeName);
            this.SetInitialAttributeValues(values, null);
            this.AddRemainingAttributesFromSchema();
        }
 /// <summary>
 /// Initializes a new instance of the XPathDereferencedExpression class
 /// </summary>
 /// <param name="objectType">The object type used in the expression</param>
 /// <param name="dereferenceAttribute">The name of the attribute to dereference</param>
 /// <param name="query">The query used to build the expression</param>
 /// <param name="wrapFilterXml">Indicates if the resulting expression should be wrapped in an XML filter element</param>
 public XPathDereferencedExpression(string objectType, string dereferenceAttribute, IXPathQueryObject query, bool wrapFilterXml)
     : base(objectType, query, wrapFilterXml)
 {
     this.DereferenceAttribute = dereferenceAttribute;
     ResourceManagementSchema.ValidateObjectTypeName(this.DereferenceAttribute);
 }