Esempio n. 1
0
 public static bool HasFacetRestrictions(this XmlSchemaComplexType ct)
 {
     if (ct.GetContentType() == XmlSchemaContentType.TextOnly)
     {
         XmlSchemaSimpleType baseType = ct.BaseXmlSchemaType as XmlSchemaSimpleType;
         if (baseType != null)   //Derived from Simple type, first step simpleContent extension
         {
             return(baseType.HasFacetRestrictions());
         }
         else if (ct.IsDerivedByRestriction()) //derived from another complex type, simple content restriction
         {
             return(true);
         }
     }
     return(false);
 }
        public static bool HasFacetRestrictions(this XmlSchemaComplexType ct)
        {
            bool flag;

            if (ct.GetContentType() == XmlSchemaContentType.TextOnly)
            {
                XmlSchemaSimpleType baseType = ct.BaseXmlSchemaType as XmlSchemaSimpleType;
                if (baseType != null)
                {
                    flag = baseType.HasFacetRestrictions();
                    return(flag);
                }
                else if (ct.IsDerivedByRestriction())
                {
                    flag = true;
                    return(flag);
                }
            }
            flag = false;
            return(flag);
        }
        private ClrPropertyInfo BuildComplexTypeTextProperty(XmlSchemaElement parentElement,
                                                             XmlSchemaComplexType schemaType)
        {
            Debug.Assert(schemaType != null);
            Debug.Assert(schemaType.GetContentType() == XmlSchemaContentType.TextOnly);

            ClrPropertyInfo textProperty = new ClrPropertyInfo(Constants.SInnerTypePropertyName, string.Empty,
                                                               Constants.SInnerTypePropertyName, Occurs.One);

            textProperty.Origin = SchemaOrigin.Text;
            ClrTypeReference typeRef   = null;
            bool             anonymous = false;

            //Could be derived by restriction or extension
            //If first time extension, make the base simple type as the type reference
            XmlSchemaType baseType = schemaType.BaseXmlSchemaType;

            if (baseType is XmlSchemaSimpleType)
            {
                typeRef   = BuildTypeReference(baseType, baseType.QualifiedName, false, true);
                anonymous = false;
                if (!textPropInheritanceTracker.ContainsKey(schemaType))
                {
                    textPropInheritanceTracker.Add(schemaType, textProperty);
                }
            }
            else if (schemaType.HasFacetRestrictions())
            {
                //Derived by restriction, represents the content type with restrictions as a local type
                //Make the base simple type as the type reference so that we know if it is a list, union or atomic
                XmlSchemaSimpleType st = schemaType.GetBaseSimpleType();
                Debug.Assert(st != null);
                typeRef          = BuildTypeReference(st, st.QualifiedName, true, true);
                typeRef.Validate = true;
                anonymous        = true;

                //Also get its base complex type and see if we need to override the content property
                ClrPropertyInfo baseProp = null;
                if (textPropInheritanceTracker.TryGetValue(baseType, out baseProp))
                {
                    textProperty.IsOverride = true;
                    if (!baseProp.IsOverride)
                    {
                        baseProp.IsVirtual = true;
                    }
                }
            }
            else
            {
                return(null);
            }

            if (anonymous)
            {
                //anonymous type, fixed up the name later, treat complex type with restrictions as an anonymous type
                //because we need to generate a type to encapsualte these restrictions
                if (parentElement != null)
                {
                    string identifier = localSymbolTable.AddLocalElement(parentElement);
                    localSymbolTable.AddAnonymousType(identifier, parentElement, typeRef);
                }
                else
                {
                    localSymbolTable.AddComplexRestrictedContentType(schemaType, typeRef);
                }
            }

            textProperty.TypeReference = typeRef;

            return(textProperty);
        }
        private void BuildNestedTypes(ClrContentTypeInfo typeInfo)
        {
            List <AnonymousType> anonymousTypes = localSymbolTable.GetAnonymousTypes();

            foreach (AnonymousType at in anonymousTypes)
            {
                XmlQualifiedName     qname       = null;
                XmlSchemaComplexType complexType = null;

                XmlSchemaElement elem = at.parentElement;
                if (elem == null)
                {
                    //case 1: "dummy" type for text content in a complex type, with restrictions
                    complexType = at.wrappingType;
                    qname       = complexType.QualifiedName;
                }
                else
                {
                    //case 2: anonymous type can also be nested under an element
                    qname       = elem.QualifiedName;
                    complexType = elem.ElementSchemaType as XmlSchemaComplexType;
                }

                if (complexType != null)
                {
                    if (complexType.GetContentType() == XmlSchemaContentType.TextOnly &&
                        complexType.IsDerivedByRestriction())
                    {
                        //In this case, we take care of the content/text part only. No nesting types exist.
                        ClrSimpleTypeInfo
                            nestedTypeInfo =
                            ClrSimpleTypeInfo
                            .CreateSimpleTypeInfo(
                                complexType);         //Generate its "simple type" version to save restrictions
                        nestedTypeInfo.clrtypeName = at.identifier;
                        nestedTypeInfo.clrtypeNs   = configSettings.GetClrNamespace(qname.Namespace);
                        nestedTypeInfo.schemaName  = qname.Name;
                        nestedTypeInfo.schemaNs    = qname.Namespace;
                        nestedTypeInfo.typeOrigin  = SchemaOrigin.Fragment;
                        nestedTypeInfo.IsNested    = true;
                        BuildAnnotationInformation(nestedTypeInfo, complexType);
                        typeInfo.NestedTypes.Add(nestedTypeInfo);
                    }
                    else
                    {
                        ClrContentTypeInfo nestedTypeInfo = new ClrContentTypeInfo()
                        {
                            Parent = typeInfo
                        };
                        localSymbolTable.Init(at.identifier);
                        nestedTypeInfo.clrtypeName = at.identifier;
                        nestedTypeInfo.clrtypeNs   = configSettings.GetClrNamespace(qname.Namespace);
                        nestedTypeInfo.schemaName  = qname.Name;
                        nestedTypeInfo.schemaNs    = qname.Namespace;
                        nestedTypeInfo.typeOrigin  = SchemaOrigin.Fragment;
                        nestedTypeInfo.IsNested    = true;
                        nestedTypeInfo.baseType    = BaseType(complexType);
                        BuildProperties(elem, complexType, nestedTypeInfo);
                        BuildNestedTypes(nestedTypeInfo);
                        BuildAnnotationInformation(nestedTypeInfo, complexType);
                        typeInfo.NestedTypes.Add(nestedTypeInfo);
                    }
                }

                //Also handle simple types
                XmlSchemaSimpleType simpleType = null;
                if (elem != null)
                {
                    simpleType = elem.ElementSchemaType as XmlSchemaSimpleType;
                }

                if (simpleType != null)
                {
                    ClrSimpleTypeInfo nestedTypeInfo = ClrSimpleTypeInfo.CreateSimpleTypeInfo(simpleType);
                    nestedTypeInfo.clrtypeName = at.identifier;
                    nestedTypeInfo.clrtypeNs   = configSettings.GetClrNamespace(qname.Namespace);
                    nestedTypeInfo.schemaName  = qname.Name;
                    nestedTypeInfo.schemaNs    = qname.Namespace;
                    nestedTypeInfo.typeOrigin  = SchemaOrigin.Fragment;
                    nestedTypeInfo.IsNested    = true;
                    BuildAnnotationInformation(nestedTypeInfo, simpleType);
                    typeInfo.NestedTypes.Add(nestedTypeInfo);
                }
            }
        }
        private void BuildNestedTypes(ClrContentTypeInfo typeInfo)
        {
            ClrSimpleTypeInfo clrSimpleTypeInfo;

            foreach (AnonymousType at in this.localSymbolTable.GetAnonymousTypes())
            {
                XmlQualifiedName     qname       = null;
                XmlSchemaComplexType complexType = null;
                XmlSchemaElement     elem        = at.parentElement;
                if (elem != null)
                {
                    qname       = elem.QualifiedName;
                    complexType = elem.ElementSchemaType as XmlSchemaComplexType;
                }
                else
                {
                    complexType = at.wrappingType;
                    qname       = complexType.QualifiedName;
                }
                if (complexType != null)
                {
                    if ((complexType.GetContentType() != XmlSchemaContentType.TextOnly ? true : !complexType.IsDerivedByRestriction()))
                    {
                        ClrContentTypeInfo clrContentTypeInfo = new ClrContentTypeInfo();
                        this.localSymbolTable.Init(at.identifier);
                        clrContentTypeInfo.clrtypeName = at.identifier;
                        clrContentTypeInfo.clrtypeNs   = this.configSettings.GetClrNamespace(qname.Namespace);
                        clrContentTypeInfo.schemaName  = qname.Name;
                        clrContentTypeInfo.schemaNs    = qname.Namespace;
                        clrContentTypeInfo.typeOrigin  = SchemaOrigin.Fragment;
                        clrContentTypeInfo.IsNested    = true;
                        clrContentTypeInfo.baseType    = this.BaseType(complexType);
                        this.BuildProperties(elem, complexType, clrContentTypeInfo);
                        this.BuildNestedTypes(clrContentTypeInfo);
                        this.BuildAnnotationInformation(clrContentTypeInfo, complexType);
                        typeInfo.NestedTypes.Add(clrContentTypeInfo);
                    }
                    else
                    {
                        clrSimpleTypeInfo             = ClrSimpleTypeInfo.CreateSimpleTypeInfo(complexType);
                        clrSimpleTypeInfo.clrtypeName = at.identifier;
                        clrSimpleTypeInfo.clrtypeNs   = this.configSettings.GetClrNamespace(qname.Namespace);
                        clrSimpleTypeInfo.schemaName  = qname.Name;
                        clrSimpleTypeInfo.schemaNs    = qname.Namespace;
                        clrSimpleTypeInfo.typeOrigin  = SchemaOrigin.Fragment;
                        clrSimpleTypeInfo.IsNested    = true;
                        this.BuildAnnotationInformation(clrSimpleTypeInfo, complexType);
                        typeInfo.NestedTypes.Add(clrSimpleTypeInfo);
                    }
                }
                XmlSchemaSimpleType simpleType = null;
                if (elem != null)
                {
                    simpleType = elem.ElementSchemaType as XmlSchemaSimpleType;
                }
                if (simpleType != null)
                {
                    clrSimpleTypeInfo             = ClrSimpleTypeInfo.CreateSimpleTypeInfo(simpleType);
                    clrSimpleTypeInfo.clrtypeName = at.identifier;
                    clrSimpleTypeInfo.clrtypeNs   = this.configSettings.GetClrNamespace(qname.Namespace);
                    clrSimpleTypeInfo.schemaName  = qname.Name;
                    clrSimpleTypeInfo.schemaNs    = qname.Namespace;
                    clrSimpleTypeInfo.typeOrigin  = SchemaOrigin.Fragment;
                    clrSimpleTypeInfo.IsNested    = true;
                    this.BuildAnnotationInformation(clrSimpleTypeInfo, simpleType);
                    typeInfo.NestedTypes.Add(clrSimpleTypeInfo);
                }
            }
        }
        private ClrPropertyInfo BuildComplexTypeTextProperty(XmlSchemaElement parentElement, XmlSchemaComplexType schemaType)
        {
            string          identifier;
            ClrPropertyInfo clrPropertyInfo;

            Debug.Assert(schemaType != null);
            Debug.Assert(schemaType.GetContentType() == XmlSchemaContentType.TextOnly);
            ClrPropertyInfo textProperty = new ClrPropertyInfo("TypedValue", string.Empty, "TypedValue", Occurs.One)
            {
                Origin = SchemaOrigin.Text
            };
            ClrTypeReference typeRef   = null;
            bool             anonymous = false;
            XmlSchemaType    baseType  = schemaType.BaseXmlSchemaType;

            if (!(baseType is XmlSchemaSimpleType))
            {
                if (schemaType.HasFacetRestrictions())
                {
                    goto Label1;
                }
                clrPropertyInfo = null;
                return(clrPropertyInfo);
            }
            else
            {
                typeRef   = this.BuildTypeReference(baseType, baseType.QualifiedName, false, true);
                anonymous = false;
                if (!this.textPropInheritanceTracker.ContainsKey(schemaType))
                {
                    this.textPropInheritanceTracker.Add(schemaType, textProperty);
                }
            }
            if (anonymous)
            {
                if (parentElement == null)
                {
                    this.localSymbolTable.AddComplexRestrictedContentType(schemaType, typeRef);
                }
                else
                {
                    identifier = this.localSymbolTable.AddLocalElement(parentElement);
                    this.localSymbolTable.AddAnonymousType(identifier, parentElement, typeRef);
                }
            }
            textProperty.TypeReference = typeRef;
            clrPropertyInfo            = textProperty;
            return(clrPropertyInfo);

Label1:
            XmlSchemaSimpleType st = schemaType.GetBaseSimpleType();

            Debug.Assert(st != null);
            typeRef          = this.BuildTypeReference(st, st.QualifiedName, true, true);
            typeRef.Validate = true;
            anonymous        = true;
            ClrPropertyInfo baseProp = null;

            if (this.textPropInheritanceTracker.TryGetValue(baseType, out baseProp))
            {
                textProperty.IsOverride = true;
                if (!baseProp.IsOverride)
                {
                    baseProp.IsVirtual = true;
                }
            }
            if (anonymous)
            {
                if (parentElement == null)
                {
                    this.localSymbolTable.AddComplexRestrictedContentType(schemaType, typeRef);
                }
                else
                {
                    identifier = this.localSymbolTable.AddLocalElement(parentElement);
                    this.localSymbolTable.AddAnonymousType(identifier, parentElement, typeRef);
                }
            }
            textProperty.TypeReference = typeRef;
            clrPropertyInfo            = textProperty;
            return(clrPropertyInfo);
        }