## Copyright 2002-2004 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.
##
## Property template used by the sample XmlBeans Velocity integration.
## This template expoits the SchemaProperty XmlBeans object to determine
## if the column is a data type or foreign key
#if($property.type.simpleType)

        <!-- $property.type -->
        <column name="$property.name.localPart.toUpperCase()" type='#parse("type.vm")' />
#elseif( $property.maxOccurs.intValue() == 1 && $property.minOccurs.intValue() == 0 )

        <!-- $property.type -->
        <column name="FK_$property.name.localPart.toUpperCase()" type="INTEGER" />
        <foreign-key foreignTable='$property.name.localPart.toUpperCase()'>
            <reference local='FK_$property.name.localPart.toUpperCase()' foreign="PK"/>
        </foreign-key>
#elseif( $property.maxOccurs.intValue() == 1 )

        <!-- $property.type -->
        <column name='FK_$property.name.localPart.toUpperCase()' required="true" type="INTEGER" />
        <foreign-key foreignTable='$property.name.localPart.toUpperCase()'>
            <reference local='FK_$property.name.localPart.toUpperCase()' foreign="PK"/>
        </foreign-key>
#elseif( $property.maxOccurs.intValue() > 1 || "$!property.maxOccurs" == "")## Greater than one or unbounded

        <!-- Foreign key imported from table named $property.name.localPart.toUpperCase() -->
#else

        <!-- This is a debug line that provides information for properties -->
        <!-- that are not handled in the property.vm template logic. -->
        <!-- SimpleType:$property.type.simpleType -->
        <!-- maxOccurs:"$property.maxOccurs" -->
        <!-- column name='$property.name.localPart.toUpperCase()' type=""/ -->
#end
