<?xml version="1.0" encoding="UTF-8"?>
<!--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ~   Licensed to the Apache Software Foundation (ASF) under one
  ~  or more contributor license agreements.  See the NOTICE file
  ~  distributed with this work for additional information
  ~  regarding copyright ownership.  The ASF licenses this file
  ~  to you 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
  ~
  ~    https://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 targetNamespace="http://cayenne.apache.org/schema/12/dbimport"
           xmlns:dbi="http://cayenne.apache.org/schema/12/dbimport"
           xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="12">

    <xs:element name="dbImport" substitutionGroup="dbi:config"/>
    <xs:element name="config">
        <xs:complexType>
            <xs:complexContent>
                <xs:extension base="dbi:container">
                    <xs:sequence>
                        <xs:element name="catalog" minOccurs="0" maxOccurs="unbounded" type="dbi:catalog"/>
                        <xs:element name="schema" minOccurs="0" maxOccurs="unbounded" type="dbi:schema"/>
                        <xs:element name="tableTypes" minOccurs="0" type="dbi:tableTypes"/>

                        <xs:element name="defaultPackage" minOccurs="0" type="xs:string"/>
                        <xs:element name="forceDataMapCatalog" minOccurs="0" type="xs:boolean"/>
                        <xs:element name="forceDataMapSchema" minOccurs="0" type="xs:boolean"/>
                        <xs:element name="meaningfulPkTables" minOccurs="0" type="xs:string"/>
                        <xs:element name="namingStrategy" minOccurs="0" type="xs:string"/>
                        <xs:element name="skipPrimaryKeyLoading" minOccurs="0" type="xs:boolean"/>
                        <xs:element name="skipRelationshipsLoading" minOccurs="0" type="xs:boolean"/>
                        <xs:element name="stripFromTableNames" minOccurs="0" type="xs:string"/>
                        <xs:element name="useJava7Types" minOccurs="0" type="xs:boolean"/>

                        <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="lax"/>
                    </xs:sequence>
                </xs:extension>
            </xs:complexContent>
        </xs:complexType>
    </xs:element>

    <xs:simpleType name="db-type">
        <xs:restriction base="xs:string">
            <xs:pattern value="[0-9a-zA-Z$_.]+"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="tableTypes">
        <xs:sequence>
            <xs:element name="tableType" type="dbi:db-type" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="includeTable" mixed="true">
        <xs:sequence>
            <xs:element name="name" minOccurs="0" type="xs:string"/>
            <xs:element name="includeColumn" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element name="excludeColumn" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>

            <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="lax"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="container" abstract="true">
        <xs:sequence>
            <xs:element name="includeTable" type="dbi:includeTable" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element name="excludeTable" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element name="includeColumn" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element name="excludeColumn" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element name="includeProcedure" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element name="excludeProcedure" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="schema">
        <xs:complexContent>
            <xs:extension base="dbi:container">
                <xs:sequence>
                    <xs:element name="name" type="dbi:db-type"/>

                    <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="lax"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="catalog">
        <xs:complexContent>
            <xs:extension base="dbi:container">
                <xs:sequence>
                    <xs:element name="name" type="dbi:db-type"/>
                    <xs:element name="schema" type="dbi:schema" minOccurs="0" maxOccurs="unbounded"/>

                    <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="lax"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

</xs:schema>
