Пример #1
0
        private void ProcessRemovedId(string id)
        {
            AttributeBinding[] bindings;

            if (idTracker.IdCount(id) == 1)
            {
                // remove any errors from existing nodes
                bindings = idTracker.GetIdBindings(id);
                foreach (AttributeBinding ab in bindings)
                {
                    XmlAttribute         a   = ab.Element.GetAttributeNode(ab.Name);
                    AttributeErrorFilter aef = new AttributeErrorFilter(ab.Element, a, ValidationErrorType.IdAttributeInUse);
                    RemoveValidationErrors(aef);
                }
                // nothing to do for idrefs, id node exists
                return;
            }

            bindings = idTracker.GetIdRefBindings(id);
            foreach (AttributeBinding ab in bindings)
            {
                ValidationErrorAttribute vea = new ValidationErrorAttribute(ab.Element, ab.Name, ValidationErrorType.IdAttributeNotDefined);
                AddValidationError(ab.Element, vea);
            }
        }
Пример #2
0
        public QuickFix[] GetFixes(ValidationError ve)
        {
            XmlNode   n     = ve.Node;
            ArrayList fixes = new ArrayList();

            // just in case we need it
            ValidationErrorAttribute vea = ve as ValidationErrorAttribute;

            switch (ve.Type)
            {
            case ValidationErrorType.ElementNotDefined:
                fixes.Add(new QuickFixDelete(n));
                fixes.AddRange(GetStripFixes(n));
                break;

            case ValidationErrorType.NodeNotAllowed:
                fixes.Add(new QuickFixDelete(n));
                fixes.AddRange(GetChangeFixes(n as XmlElement));
                fixes.AddRange(GetStripFixes(n));
                break;

            case ValidationErrorType.ElementNotAllowedHere:
                fixes.Add(new QuickFixDelete(n));
                fixes.AddRange(GetStripFixes(n));
                fixes.AddRange(GetChangeFixes(n as XmlElement));
                fixes.AddRange(GetInsertFixes(n as XmlElement));
                break;

            case ValidationErrorType.ElementNotInContentModel:
                fixes.Add(new QuickFixDelete(n));
                fixes.AddRange(GetStripFixes(n));
                fixes.AddRange(GetChangeFixes(n as XmlElement));
                break;

            case ValidationErrorType.RequiredElementMissing:
                fixes.AddRange(GetAppendFixes(n as XmlElement));
                break;

            case ValidationErrorType.IdAttributeInUse:
                fixes.AddRange(GetDuplicateIdFixes((XmlElement)vea.Node, vea.QualifiedName));
                break;

            case ValidationErrorType.IdAttributeNotDefined:
                break;

            case ValidationErrorType.InvalidAttributeValue:
                fixes.AddRange(GetAttributeValueFixes((XmlElement)vea.Node, vea.QualifiedName));
                break;

            case ValidationErrorType.RequiredAttributeMissing:
                fixes.AddRange(GetGenerateIdFixes((XmlElement)vea.Node, vea.QualifiedName));
                break;
            }
            return(fixes.ToArray(typeof(QuickFix)) as QuickFix[]);
        }
Пример #3
0
        private void ValidateAllIdAndIdRefs()
        {
            foreach (AttributeBinding ab in idTracker.GetDuplicateIds())
            {
                ValidationErrorAttribute vea = new ValidationErrorAttribute(ab.Element, ab.Name, ValidationErrorType.IdAttributeInUse);
                AddValidationError(ab.Element, vea);
            }

            foreach (AttributeBinding ab in idTracker.GetUndefinedIdRefs())
            {
                ValidationErrorAttribute vea = new ValidationErrorAttribute(ab.Element, ab.Name, ValidationErrorType.IdAttributeNotDefined);
                AddValidationError(ab.Element, vea);
            }
        }
Пример #4
0
        private void AddIdOrIdRef(XmlElement e, XmlAttribute a, Attribute attr)
        {
            // any previous value will have been removed in NodeChanging event

            AttributeBinding ab;
            string           val = a.Value;

            switch (attr.Type)
            {
            case AttributeType.ID:
                ab = new AttributeBinding(e, attr.Name, val, a.Specified);
                idTracker.AddId(ab);
                if (idTracker.IdCount(val) > 1)
                {
                    foreach (AttributeBinding ab2 in idTracker.GetIdBindings(val))
                    {
                        // TODO: L: inefficient, lots of removing then adding
                        XmlAttribute         a2  = ab2.Element.GetAttributeNode(ab2.Name);
                        AttributeErrorFilter aef = new AttributeErrorFilter(ab2.Element, a2, ValidationErrorType.IdAttributeInUse);
                        RemoveValidationErrors(aef);
                        ValidationErrorAttribute vea = new ValidationErrorAttribute(ab2.Element, a2.Name, ValidationErrorType.IdAttributeInUse);
                        AddValidationError(ab2.Element, vea);
                    }
                }

                foreach (AttributeBinding ab2 in idTracker.GetIdRefBindings(val))
                {
                    XmlAttribute         ar  = ab.Element.GetAttributeNode(ab2.Name);
                    AttributeErrorFilter aef = new AttributeErrorFilter(ab2.Element, ar, ValidationErrorType.IdAttributeNotDefined);
                    RemoveValidationErrors(aef);
                }

                break;

            case AttributeType.IDREF:
            case AttributeType.IDREFS:
                ab = new AttributeBinding(e, attr.Name, val, a.Specified);
                idTracker.AddIdRefs(ab);
                // TODO: L: inefficient - we split twice, here and in AddIdRefs
                foreach (string id in ab.Value.Split(' '))
                {
                    if (idTracker.IdCount(id) == 0)
                    {
                        ValidationErrorAttribute vea = new ValidationErrorAttribute(e, a.Name, ValidationErrorType.IdAttributeNotDefined);
                        AddValidationError(e, vea);
                    }
                }
                break;
            }
        }
Пример #5
0
//		private IList FilterValidNext(IList col, XmlElement n)
//		{
//			ArrayList ret=new ArrayList();
//			foreach ( SimpleReference sr in col )
//			{
//				if ( ret.Contains(sr) )
//					continue;
//
//				if ( n != null &&
//						FindInCollection(sr.OriginalReference.GetValidNextElements(), n) != null )
//					ret.Add(sr);
//			}
//			return ret;
//		}

//		private IList GetValidFirstCaseElements(ElementType et, XmlElement e)
//		{
//			ArrayList ret=new ArrayList();
//			IList col=et.ContentModel.GetValidFirstElements();
//			foreach ( SimpleReference sr in col )
//			{
//				if ( ret.Contains(sr) )
//					continue;
//
//				if ( FindInCollection(sr.OriginalReference.GetValidNextElements(), e) != null )
//					ret.Add(sr);
//			}
//			return ret;
//		}

//		private SimpleReference FindReference(ElementType et, XmlElement parent, XmlElement n)
//		{
//			IList col=et.ContentModel.GetValidFirstElements();
//			SimpleReference r=null;
//			foreach ( XmlNode c in parent.ChildNodes )
//			{
//				if ( c.NodeType != XmlNodeType.Element )
//					continue;
//
//				XmlElement child=(XmlElement) c;
//
//				if ( child.Equals(n) )
//					break;
//
//				r=FindInCollection(col, child);
//				if ( r == null )
//					return null;
//
//				col=r.OriginalReference.GetValidNextElements();
//				if ( col.Count == 0 )
//					return null;
//
//				r=(SimpleReference) col[0];
//			}
//			return r;
//		}

        private void ValidateAttributeAddOrChange(XmlAttribute a)
        {
            XmlElement e = a.OwnerElement;

            if (documentType == null || e == null)
            {
                return;
            }

            if (e.ParentNode == null)
            {
                // node is not in document yet
                return;
            }

            ElementType et = documentType.GetElementType(e);

            if (et == null)
            {
                return;
            }

            AttributeErrorFilter aef = new AttributeErrorFilter(e, a);

            RemoveValidationErrors(aef);

            Attribute attr = et.GetAttribute(a);

            if (attr == null)
            {
                ValidationError ve = new ValidationErrorAttribute(e, a.Name, ValidationErrorType.AttributeNotDefined);
                AddValidationError(e, ve);
                return;
            }

            // it's only at this point we can even tell if it's ID/IDREF
            AddIdOrIdRef(e, a, attr);

            if (!validationEngine.ValidateAttribute(attr, e, a))
            {
                ValidationError ve = new ValidationErrorAttribute(e, a.Name, ValidationErrorType.InvalidAttributeValue);
                AddValidationError(e, ve);
            }
        }
Пример #6
0
        public bool IsMatch(ValidationError ve)
        {
            ValidationErrorAttribute vea = ve as ValidationErrorAttribute;

            if (vea == null)
            {
                return(false);
            }

            if (attr != null && !vea.QualifiedName.Equals(attr.Name))
            {
                return(false);
            }

            if (errorSpecific)
            {
                return(vea.Type == errorType);
            }

            return(true);
        }