Exemplo n.º 1
0
        private XTypedElement GetContentType(XTypedElement clrRootObject)
        {
            IXMetaData childMetaData = clrRootObject;

            Debug.Assert(childMetaData.TypeOrigin == SchemaOrigin.Element);
            return(childMetaData.Content);
        }
Exemplo n.º 2
0
        internal void SetElement(XName name, object value, bool addToExisting, XmlSchemaDatatype datatype, Type elementBaseType)
        {
            XElement parentElement = this.GetUntyped();

            CheckXsiNil(parentElement);
            if (value == null)
            {
                //Delete existing node
                Debug.Assert(addToExisting == false);
                DeleteChild(name);
            }
            else
            {
                IXMetaData schemaMetaData = this as IXMetaData; //Get parent's content model
                Debug.Assert(schemaMetaData != null);
                ContentModelEntity cm = schemaMetaData.GetContentModel();

                if (elementBaseType == null)
                {
                    if (!schemaMetaData.LocalElementsDictionary.TryGetValue(name, out elementBaseType))
                    {
                        elementBaseType = value?.GetType();
                    }
                }


                cm.AddElementToParent(name, value, parentElement, addToExisting, datatype, elementBaseType);
            }
        }
Exemplo n.º 3
0
        private static bool TypeValid(XTypedElement typedElement, XName instanceName)
        {
            bool       flag;
            IXMetaData metaData = typedElement;

            Debug.Assert(metaData.TypeOrigin == SchemaOrigin.Element);
            flag = (!metaData.SchemaName.Equals(instanceName) ? false : true);
            return(flag);
        }
Exemplo n.º 4
0
        private void FSMSetElement(XName name, object value, bool addToExisting, XmlSchemaDatatype datatype)
        {
            XElement parentElement = this.GetUntyped();

            CheckXsiNil(parentElement);
            if (value == null)
            {
                //Delete existing node
                DeleteChild(name);
            }
            else if (datatype != null)
            {
                //Simple typed element
                XElement pos = this.GetElement(name); //Find out the matching element
                if (pos == null)
                {
                    //happens for incomplete content, or choice
                    parentElement.Add(new XElement(name, XTypedServices.GetXmlString(value, datatype, parentElement)));
                }
                else if (addToExisting)
                {
                    pos.AddAfterSelf(new XElement(name, XTypedServices.GetXmlString(value, datatype, pos)));
                }
                else
                {
                    //Update value in place
                    pos.Value = XTypedServices.GetXmlString(value, datatype, pos);
                }
            }
            else
            {
                Type       elementBaseType = null;
                IXMetaData schemaMetaData  = this as IXMetaData;
                if (!schemaMetaData.LocalElementsDictionary.TryGetValue(name, out elementBaseType))
                {
                    elementBaseType = value.GetType();
                }

                //Setting XTypedElement
                XTypedElement xObj       = value as XTypedElement;
                XElement      newElement = XTypedServices.GetXElement(xObj, name, elementBaseType);
                XElement      pos        = this.GetElement(name); //Find the matching element
                if (pos == null)
                {
                    //happens for incomplete content, or choice
                    parentElement.Add(newElement);
                }
                else
                {
                    pos.AddAfterSelf(newElement);
                    if (!addToExisting)
                    {
                        pos.Remove();
                    }
                }
            }
        }
Exemplo n.º 5
0
        internal static XElement GetXElement(XTypedElement xObj, XName name, Type elementBaseType)
        {
            XElement newElement = xObj.Untyped;

            if (newElement.Parent != null)
            {
                //Element/XTypedElement already added to the tree, need to clone XTypedElement
                newElement = xObj.Clone().Untyped;
            }

            IXMetaData metaData = xObj as IXMetaData;

            Debug.Assert(metaData != null);
            if (metaData.TypeOrigin == SchemaOrigin.Fragment)
            {
                //Set correct element name as the name of the property/element
                newElement.Name = name;
            }

            //Does this need a type qualifier?
            if (xObj.GetType() != elementBaseType)
            {
                //Don't overwrite anything explicitly added
                var xsiType = (string)newElement.Attribute(XName.Get("type", XmlSchema.InstanceNamespace));
                if (xsiType == null)
                {
                    var    defNs    = xObj.Untyped.GetDefaultNamespace();
                    string typeName = null;
                    if (metaData.SchemaName.Namespace == defNs ||
                        (defNs == XNamespace.None && metaData.SchemaName.Namespace == name.Namespace))
                    {
                        typeName = metaData.SchemaName.LocalName;
                    }
                    else
                    {
                        var prefix = xObj.Untyped.GetPrefixOfNamespace(metaData.SchemaName.Namespace);
                        if (prefix == null)
                        {
                            typeName = metaData.SchemaName.LocalName;
                        }
                        else
                        {
                            typeName = prefix + ":" + metaData.SchemaName.LocalName;
                        }
                    }

                    newElement.Add(new XAttribute(XName.Get("type", XmlSchema.InstanceNamespace), typeName));
                }
            }

            return(newElement);
        }
Exemplo n.º 6
0
        private XElement CreateXElement()
        {
            IXMetaData schemaMetaData = this;

            Debug.Assert(schemaMetaData != null);
            XName elementName = schemaMetaData.SchemaName;

            Debug.Assert(elementName != null);
            XElement element = new XElement(elementName);

            element.AddAnnotation(new XTypedElementAnnotation(this));
            return(element);
        }
Exemplo n.º 7
0
        private static bool TypeValid(XTypedElement typedElement, XName instanceName)
        {
            IXMetaData metaData = typedElement as IXMetaData;

            Debug.Assert(metaData.TypeOrigin == SchemaOrigin.Element);
            if (metaData.SchemaName.Equals(instanceName))
            {
                //Element names match
                return(true);
            }

            return(false);
        }
Exemplo n.º 8
0
        public static void SetName(XTypedElement root, XTypedElement type)
        {
            IXMetaData schemaMetaData = root;

            Debug.Assert(schemaMetaData != null);
            XName elementName = schemaMetaData.SchemaName;

            Debug.Assert(elementName != null);
            XElement currentElement = type.Untyped;

            currentElement.Name = elementName;
            currentElement.AddAnnotation(new XTypedElementWrapperAnnotation(root));
            root.Untyped = currentElement;
        }
Exemplo n.º 9
0
        internal void SetElement(XName name, object value, bool addToExisting, XmlSchemaDatatype datatype)
        {
            XElement parentElement = this.GetUntyped();

            this.CheckXsiNil(parentElement);
            if (value != null)
            {
                IXMetaData schemaMetaData = this;
                Debug.Assert(schemaMetaData != null);
                schemaMetaData.GetContentModel().AddElementToParent(name, value, parentElement, addToExisting, datatype);
            }
            else
            {
                Debug.Assert(!addToExisting);
                this.DeleteChild(name);
            }
        }
Exemplo n.º 10
0
        internal static XElement GetXElement(XTypedElement xObj, XName name)
        {
            XElement newElement = xObj.Untyped;

            if (newElement.Parent != null)
            {
                newElement = xObj.Clone().Untyped;
            }
            IXMetaData metaData = xObj;

            Debug.Assert(metaData != null);
            if (metaData.TypeOrigin == SchemaOrigin.Fragment)
            {
                newElement.Name = name;
            }
            return(newElement);
        }
Exemplo n.º 11
0
        internal void SetElement(XName name, object value, bool addToExisting, XmlSchemaDatatype datatype, Type elementBaseType)
        {
            XElement parentElement = this.GetUntyped();

            CheckXsiNil(parentElement);
            if (value == null)
            {
                //Delete existing node
                Debug.Assert(addToExisting == false);
                DeleteChild(name);
            }
            else
            {
                IXMetaData schemaMetaData = this as IXMetaData; //Get parent's content model
                Debug.Assert(schemaMetaData != null);
                ContentModelEntity cm = GetParentContentModel(this as IXMetaData, name);

                if (elementBaseType == null)
                {
                    if (!schemaMetaData.LocalElementsDictionary.TryGetValue(name, out elementBaseType))
                    {
                        elementBaseType = value?.GetType();
                    }
                }


                cm.AddElementToParent(name, value, parentElement, addToExisting, datatype, elementBaseType);
            }

            ContentModelEntity GetParentContentModel(IXMetaData schemaMetaData, XName xname)
            {
                Debug.Assert(schemaMetaData != null);
                ContentModelEntity cmRoot = schemaMetaData.GetContentModel();

                if (cmRoot is SchemaAwareContentModelEntity cmGroup)
                {
                    var cmNamed  = cmGroup.GetNamedEntity(xname);
                    var cmParent = cmNamed.ParentContentModel;
                    return(cmParent);
                }
                else
                {
                    return(cmRoot);
                }
            }
        }
Exemplo n.º 12
0
        internal void SetElement(XName name, object value, bool addToExisting, XmlSchemaDatatype datatype)
        {
            XElement parentElement = this.GetUntyped();

            CheckXsiNil(parentElement);
            if (value == null)
            {
                //Delete existing node
                Debug.Assert(addToExisting == false);
                DeleteChild(name);
            }
            else
            {
                IXMetaData schemaMetaData = this as IXMetaData; //Get parent's content model
                Debug.Assert(schemaMetaData != null);
                ContentModelEntity cm = schemaMetaData.GetContentModel();
                cm.AddElementToParent(name, value, parentElement, addToExisting, datatype);
            }
        }
Exemplo n.º 13
0
        public static void SetName(XTypedElement root, XTypedElement type)
        {
            //Root with correct element name
            IXMetaData schemaMetaData = root as IXMetaData;

            Debug.Assert(schemaMetaData != null);
            XName elementName = schemaMetaData.SchemaName;

            Debug.Assert(elementName != null);

            //Set the wrapper object's XElement pointer and vice versa
            XElement currentElement = type.Untyped;

            currentElement.Name = elementName;
            currentElement.AddAnnotation(
                new XTypedElementWrapperAnnotation(
                    root)); //The XElement tree is hooked up to both root type as well as content type?
            root.Untyped = currentElement;
        }
Exemplo n.º 14
0
        internal static XElement GetXElement(XTypedElement xObj, XName name)
        {
            XElement newElement = xObj.Untyped;

            if (newElement.Parent != null)
            {
                //Element/XTypedElement already added to the tree, need to clone XTypedElement
                newElement = xObj.Clone().Untyped;
            }

            IXMetaData metaData = xObj as IXMetaData;

            Debug.Assert(metaData != null);
            if (metaData.TypeOrigin == SchemaOrigin.Fragment)
            {
                //Set correct element name as the name of the property/element
                newElement.Name = name;
            }

            return(newElement);
        }
Exemplo n.º 15
0
        IEnumerable <T> Xml.Schema.Linq.IXTyped.Descendants <T>()
        {
            bool                     flag;
            bool                     flag1;
            bool                     flag2;
            XTypedElement            xTypedElement           = this;
            Type                     type                    = typeof(T);
            IXMetaData               xMetaDatum              = xTypedElement;
            Dictionary <XName, Type> localElementsDictionary = null;
            ILinqToXsdTypeManager    linqToXsdTypeManager    = xMetaDatum.TypeManager;
            Dictionary <XName, Type> globalTypeDictionary    = linqToXsdTypeManager.GlobalTypeDictionary;
            XName                    xName                   = null;
            WildCard                 wildCard                = null;
            int      invalidState = FSM.InvalidState;
            XElement untyped      = null;
            Stack <XTypedElement> xTypedElements = new Stack <XTypedElement>();

            while (true)
            {
                xMetaDatum = xTypedElement;
                FSM validationStates = xTypedElement.ValidationStates;
                if (validationStates != null)
                {
                    this.StartFsm();
                    invalidState = validationStates.Start;
                }
                Debug.Assert(xMetaDatum != null);
                localElementsDictionary = xMetaDatum.LocalElementsDictionary;
                untyped  = xTypedElement.Untyped;
                xName    = null;
                wildCard = null;
                XTypedElement          xTypedElement1 = null;
                bool                   flag3          = true;
                IEnumerator <XElement> enumerator     = untyped.Elements().GetEnumerator();
                try
                {
                    while (enumerator.MoveNext())
                    {
                        XElement current = enumerator.Current;
                        bool     flag4   = this.IsAnnoatedElemTypeOf <T>(current, out xTypedElement1);
                        if (validationStates != null)
                        {
                            invalidState = this.FsmMakeTransition(invalidState, current.Name, out xName, out wildCard);
                            if (invalidState == FSM.InvalidState)
                            {
                                goto Label0;
                            }
                        }
                        if (!flag4)
                        {
                            flag           = (validationStates == null ? true : wildCard == null);
                            xTypedElement1 = (flag ? this.TypeChildElement(current, localElementsDictionary, linqToXsdTypeManager) : XTypedServices.ToXTypedElement(current, linqToXsdTypeManager));
                            if (xTypedElement1 != null)
                            {
                                Type type1 = xTypedElement1.GetType();
                                if (!type.IsAssignableFrom(type1))
                                {
                                    Type type2 = null;
                                    flag1 = (!linqToXsdTypeManager.RootContentTypeMapping.TryGetValue(type1, out type2) ? true : !type.IsAssignableFrom(type2));
                                    if (!flag1)
                                    {
                                        xTypedElement1 = this.GetContentType(xTypedElement1);
                                        flag4          = true;
                                    }
                                }
                                else
                                {
                                    flag4 = true;
                                }
                            }
                        }
                        if (flag4)
                        {
                            yield return((T)xTypedElement1);
                        }
                        if (xTypedElement1 != null)
                        {
                            xTypedElements.Push(xTypedElement1);
                        }
                    }
                    goto Label1;
Label0:
                    flag3 = false;
                }
                finally
                {
                    if (enumerator != null)
                    {
                        enumerator.Dispose();
                    }
                }
Label1:
                flag2 = (!flag3 ? true : xTypedElements.Count <= 0);
                if (flag2)
                {
                    break;
                }
                xTypedElement = xTypedElements.Pop();
            }
        }
Exemplo n.º 16
0
        //XML Query axes
        IEnumerable <T> IXTyped.Descendants <T>()
        {
            XTypedElement currentObject = this as XTypedElement;
            Type          lookupType    = typeof(T);

            //Metadata
            IXMetaData schemaMetaData = currentObject as IXMetaData;
            Dictionary <XName, System.Type> localElementsDict = null;
            ILinqToXsdTypeManager           typeManager       = schemaMetaData.TypeManager;
            Dictionary <XName, Type>        typeDictionary    = typeManager.GlobalTypeDictionary;

            //FSM
            XName    matchingName     = null;
            WildCard matchingWildCard = null;
            int      currentState     = FSM.InvalidState;

            XElement parentElement             = null;
            Stack <XTypedElement> elementStack = new Stack <XTypedElement>();

            while (true)
            {
                schemaMetaData = currentObject as IXMetaData;
                FSM fsm = currentObject.ValidationStates;
                if (fsm != null)
                {
                    StartFsm();
                    currentState = fsm.Start;
                }

                Debug.Assert(schemaMetaData != null);
                localElementsDict = schemaMetaData.LocalElementsDictionary;
                parentElement     = currentObject.Untyped;

                matchingName     = null;
                matchingWildCard = null;

                XTypedElement childObject  = null;
                bool          validContent = true;

                foreach (XElement childElement in parentElement.Elements())
                {
                    bool isTypeT = IsAnnoatedElemTypeOf <T>(childElement, out childObject);

                    if (fsm != null)
                    {
                        //Always execute FSM no matter whether we find an element of type T
                        currentState = FsmMakeTransition(currentState, childElement.Name, out matchingName,
                                                         out matchingWildCard);
                        if (currentState == FSM.InvalidState)
                        {
                            validContent = false;
                            break;
                        }
                    }

                    if (!isTypeT)
                    {
                        //check dictionary
                        if (fsm != null && matchingWildCard != null)
                        {
                            childObject = XTypedServices.ToXTypedElement(childElement, typeManager); //Auto-typing
                        }
                        else
                        {
                            childObject = TypeChildElement(childElement, localElementsDict, typeManager);
                        }

                        if (childObject != null)
                        {
                            Type runtimeType = childObject.GetType();
                            if (lookupType.IsAssignableFrom(runtimeType))
                            {
                                isTypeT = true;
                            }
                            else
                            {
                                //Check content type
                                Type contentType = null;
                                if (typeManager.RootContentTypeMapping.TryGetValue(runtimeType, out contentType) &&
                                    lookupType.IsAssignableFrom(contentType))
                                {
                                    childObject = GetContentType(childObject);
                                    isTypeT     = true;
                                }
                            }
                        }
                    }

                    if (isTypeT)
                    {
                        yield return((T)childObject);
                    }

                    if (childObject != null)
                    {
                        elementStack.Push(childObject);
                    }
                }

                if (validContent && elementStack.Count > 0)
                {
                    currentObject = elementStack.Pop();
                }
                else
                {
                    break;
                }
            }
        }