private static bool NodeContainsErrors(ISchemaEditorNode node, SchemaErrorCollection errors)
        {
            bool errorFound = false;
            foreach (IFieldReference attribute in node.Attributes)
            {
                if(attribute.IsRequired && attribute.HasValue==false)
                {
                    node.HasSchemaError = true;
                    errorFound = true;
                    errors.Add(new AttributeSchemaError(attribute, node));
                }
            }

            foreach (NodeFieldReference fieldReference in node.NodeFields)
            {
                if(fieldReference.AmountRequired>fieldReference.AmountExisting)
                {
                    node.HasSchemaError = true;
                    errorFound =true;
                    errors.Add(new ElementSchemaError(fieldReference, node));
                }
            }

            node.HasSchemaError = errorFound;
            errorFound = false;

            foreach (ISchemaEditorNode activeNode in node.ActiveNodes)
            {
                if(NodeContainsErrors(activeNode,errors))
                {
                    errorFound = true;
                }
            }

            node.ChildHasSchemaError = errorFound;
            return node.ChildHasSchemaError || node.HasSchemaError;
        }
 public static SchemaErrorCollection CheckSchemaCompliance(ISchemaEditorNode node)
 {
     SchemaErrorCollection errors = new SchemaErrorCollection();
     NodeContainsErrors(node, errors);
     return errors;
 }
        /// <summary>
        /// Creates a shallow copy of the <see cref="SchemaErrorCollection"/>.
        /// </summary>
        /// <returns>
        /// A shallow copy of the <see cref="SchemaErrorCollection"/>.
        /// </returns>
        /// <remarks>
        /// Please refer to <see cref="ArrayList.Clone"/> for details.
        /// </remarks>
        public virtual object Clone()
        {
            SchemaErrorCollection clone =
                new SchemaErrorCollection(_data.Count);

            Array.Copy(_data.Items, 0, clone._data.Items, 0, _data.Count);
            clone._data.Count = _data.Count;
            clone._data.IsUnique = _data.IsUnique;

            return clone;
        }
        /// <overloads>
        /// Adds a range of elements to the end of the
        /// <see cref="SchemaErrorCollection"/>.
        /// </overloads>
        /// <summary>
        /// Adds the elements of another collection to the end of the
        /// <see cref="SchemaErrorCollection"/>.
        /// </summary>
        /// <param name="collection">
        /// The <see cref="SchemaErrorCollection"/> whose elements
        /// should be added to the end of the current collection.</param>
        /// <exception cref="ArgumentNullException">
        /// <paramref name="collection"/> is a null reference.</exception>
        /// <exception cref="NotSupportedException"><para>
        /// The <see cref="SchemaErrorCollection"/> 
        /// is read-only or has a fixed size.
        /// </para><para>-or-</para><para>
        /// The <b>SchemaErrorCollection</b> already contains one
        /// or more elements in <paramref name="collection"/>,
        /// and the <b>SchemaErrorCollection</b>
        /// ensures that all elements are unique.
        /// </para></exception>
        /// <remarks>
        /// Please refer to <see cref="ArrayList.AddRange"/> for details.
        /// </remarks>
        public virtual void AddRange(SchemaErrorCollection collection)
        {
            if (collection == null)
                throw new ArgumentNullException("collection");

            AddRange(collection._data.Items, collection.Count);
        }
        /// <summary>
        /// Returns a read-only wrapper for the specified
        /// <see cref="SchemaErrorCollection"/>.
        /// </summary>
        /// <param name="collection">
        /// The <see cref="SchemaErrorCollection"/> to wrap.</param>
        /// <returns>
        /// A read-only wrapper around <paramref name="collection"/>.
        /// </returns>
        /// <exception cref="ArgumentNullException">
        /// <paramref name="collection"/> is a null reference.</exception>
        /// <remarks>
        /// Please refer to <see cref="ArrayList.ReadOnly"/> for details.
        /// </remarks>
        public static SchemaErrorCollection ReadOnly(
			SchemaErrorCollection collection)
        {
            if (collection == null)
                throw new ArgumentNullException("collection");

            return new ReadOnlyWrapper(collection._data);
        }
        /// <summary>
        /// Initializes a new instance of the
        /// <see cref="SchemaErrorCollection"/> class that
        /// contains elements copied from the specified collection and that
        /// has the same initial capacity as the number of elements copied.
        /// </summary>
        /// <param name="collection">
        /// The <see cref="SchemaErrorCollection"/>
        /// whose elements are copied to the new collection.</param>
        /// <exception cref="ArgumentNullException">
        /// <paramref name="collection"/> is a null reference.</exception>
        /// <remarks>
        /// Please refer to <see cref="ArrayList(ICollection)"/> for details.
        /// </remarks>
        public SchemaErrorCollection(SchemaErrorCollection collection)
        {
            if (collection == null)
                throw new ArgumentNullException("collection");

            _data = new Data();
            _data.Items = new ISchemaError[collection.Count];
            AddRange(collection._data.Items, collection.Count);
        }
 public override void AddRange(SchemaErrorCollection collection)
 {
     throw new NotSupportedException(
         "Read-only collections cannot be modified.");
 }