<?xml version='1.0'?>
<!--
   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

       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.
-->

<!DOCTYPE rdf:RDF [
    <!ENTITY jena    'http://jena.hpl.hp.com/'>

    <!ENTITY rdf     'http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
    <!ENTITY rdfs    'http://www.w3.org/2000/01/rdf-schema#'>
    <!ENTITY owl     'http://www.w3.org/2002/07/owl#'>
    <!ENTITY xsd     'http://www.w3.org/2001/XMLSchema#'>
    <!ENTITY base    '&jena;2003/04/schemagen'>
    <!ENTITY sgen    '&base;#'>
]>

<rdf:RDF
  xmlns:rdf   ="&rdf;"
  xmlns:rdfs  ="&rdfs;"
  xmlns:owl   ="&owl;"
  xmlns:sgen  ="&sgen;"
  xmlns       ="&sgen;"
  xml:base    ="&base;"
>

<!--
  Example schemagen configuration for use with jena.schemagen
    Not all possible options are used in this example, see Javadoc and Howto for full details.
    Need to be named 'schemagen.rdf' in practice.

  Author: Ian Dickinson, mailto:ian_dickinson@users.sourceforge.net
  CVS:    $Id: schemagen.rdf,v 1.3 2009-10-06 13:04:42 ian_dickinson Exp $
-->

<sgen:Config>
    <!-- specifies that the  source document uses OWL -->
    <sgen:owl rdf:datatype="&xsd;boolean">true</sgen:owl>

    <!-- specifies that we want the generated vocab to use OntClass, OntProperty, etc, not Resource and Property -->
    <sgen:ontology rdf:datatype="&xsd;boolean">true</sgen:ontology>

    <!-- specifies that we want names mapped to uppercase (as standard Java constants) -->
    <sgen:uppercase rdf:datatype="&xsd;boolean">true</sgen:uppercase>

    <!-- append Vocab to class name, so input beer.owl becomes BeerVocab.java -->
    <sgen:classnamesuffix rdf:datatype="&xsd;string">Vocab</sgen:classnamesuffix>

    <!-- the java package that the vocabulary is in -->
    <sgen:package rdf:datatype="&xsd;string">com.example.vocabulary</sgen:package>

    <!-- the directory or file to write the results out to -->
    <sgen:output rdf:datatype="&xsd;string">src/com/example/vocabulary</sgen:output>

    <!-- the template for the file header -->
<sgen:header rdf:datatype="&xsd;string">/*****************************************************************************
 * Source code information
 * -----------------------
 * Original author    Jane Smart, example.com
 * Author email       jane.smart@example.com
 * Package            @package@
 * Web site           @website@
 * Created            %date%
 * Filename           $RCSfile: schemagen.rdf,v $
 * Revision           $Revision: 1.3 $
 * Release status     @releaseStatus@ $State: Exp $
 *
 * @copyright@
 *****************************************************************************/


// Package
///////////////////////////////////////
%package%


// Imports
///////////////////////////////////////
%imports%



/**
 * Vocabulary definitions from %sourceURI%
 * @author Auto-generated by schemagen on %date%
 */</sgen:header>

<!-- the template for the file footer (note @footer@ is an ant-ism, will not be processed by VocabGen) -->
<sgen:footer rdf:datatype="&xsd;string">
/*
@footer@
*/
</sgen:footer>

<!-- template for introducing the properties in the vocabulary -->
<sgen:propSection rdf:datatype="&xsd;string">
    // Vocabulary properties
    ///////////////////////////
</sgen:propSection>

<!-- template for introducing the classes in the vocabulary -->
<sgen:classSection rdf:datatype="&xsd;string">
    // Vocabulary classes
    ///////////////////////////
</sgen:classSection>

<!-- template for introducing the individuals in the vocabulary -->
<sgen:individualsSection rdf:datatype="&xsd;string">
    // Vocabulary individuals
    ///////////////////////////
</sgen:individualsSection>

<!-- template for doing fancy declarations of individuals -->
<sgen:individualTemplate rdf:datatype="&xsd;string">public static final KsSymbol %valname% = s_vf.newSymbol( "%valuri%" );

    /** Ontology individual corresponding to {@link #%valname%} */
    public static final %valclass% _%valname% = m_model.%valcreator%( "%valuri%", %valtype% );
</sgen:individualTemplate>

</sgen:Config>

</rdf:RDF>
