<!--
Copyright 2004 The Apache Software Foundation

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
 -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="Figures" xmlns:a="AbstractFigures" xmlns:f="Figures">

    <xs:import namespace="AbstractFigures"/>
    <xs:complexType name="circle">
        <xs:complexContent>
            <xs:extension base="a:shape">
                <xs:sequence>
                    <xs:element name="radius" type="xs:double"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="square">
        <xs:complexContent>
            <xs:extension base="a:shape">
                <xs:sequence>
                    <xs:element name="side" type="xs:double"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

</xs:schema>
