コード例 #1
0
ファイル: Validation.cs プロジェクト: jugglingcats/XEditNet
        private void ValidateRemovedAttribute(XmlElement e, XmlAttribute a)
        {
            ElementType et=documentType.GetElementType(e);
            if ( et == null )
                return;

            Attribute attr=et.GetAttribute(a);
            if ( attr == null )
            {
                // attribute was invalid, so remove that error
                AttributeErrorFilter aef=new AttributeErrorFilter(e, a, ValidationErrorType.AttributeNotDefined);
                RemoveValidationErrors(aef);
                return;
            }
            else
            {
                // remove any validation errors for this attribute
                AttributeErrorFilter aef=new AttributeErrorFilter(e, a);
                RemoveValidationErrors(aef);
            }

            if ( attr.State == AttributeState.Required )
                // removing a required attribute
                AddValidationError(e, new ValidationErrorAttribute(e, a.Name, ValidationErrorType.RequiredAttributeMissing));
        }
コード例 #2
0
ファイル: Validation.cs プロジェクト: jugglingcats/XEditNet
        private void ValidateAttributes(XmlElement e)
        {
            AttributeErrorFilter aef=new AttributeErrorFilter(e);
            RemoveValidationErrors(aef);

            if ( documentType == null )
                return;

            ElementType et=documentType.GetElementType(e);
            if ( et == null )
                return;

            ArrayList defined=new ArrayList(et.Attributes);
            ArrayList foundList=new ArrayList();

            foreach ( Attribute attr in defined )
            {
                bool found=false;
                foreach ( XmlAttribute a in e.Attributes )
                {
                    if ( attr.Name.QualifiedName.Equals(a.Name) )
                    {
                        found=true;
                        if ( !validationEngine.ValidateAttribute(attr, e, a) )
                            AddValidationError(e, new ValidationErrorAttribute(e, a.Name, ValidationErrorType.InvalidAttributeValue));

                        AddIdOrIdRef(e, a, attr);
                        break;
                    }
                }
                if ( !found && attr.State == AttributeState.Required )
                    AddValidationError(e, new ValidationErrorAttribute(e, attr.Name.QualifiedName, ValidationErrorType.RequiredAttributeMissing));
                else
                    foundList.Add(attr.Name.QualifiedName);
            }

            foreach ( XmlAttribute a in e.Attributes )
            {
                if ( !foundList.Contains(a.Name) )
                    AddValidationError(e, new ValidationErrorAttribute(e, a.Name, ValidationErrorType.AttributeNotDefined));
            }
        }
コード例 #3
0
ファイル: Validation.cs プロジェクト: jugglingcats/XEditNet
        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);
            }
        }
コード例 #4
0
ファイル: Validation.cs プロジェクト: jugglingcats/XEditNet
        //        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);
            }
        }
コード例 #5
0
ファイル: Validation.cs プロジェクト: jugglingcats/XEditNet
        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;
            }
        }