<?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
    
        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 targetNamespace="http://geronimo.apache.org/xml/ns/plugins-1.3"  
           xmlns:list="http://geronimo.apache.org/xml/ns/plugins-1.3"
           xmlns:atts="http://geronimo.apache.org/xml/ns/attributes-1.2"
           xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
           xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified"
           attributeFormDefault="unqualified"
           jaxb:extensionBindingPrefixes="xjc"
           jaxb:version="2.0">

    <xs:import namespace="http://geronimo.apache.org/xml/ns/attributes-1.2"
               schemaLocation="attributes-1.2.xsd"/>

    <xs:annotation>
        <xs:appinfo>
            <jaxb:globalBindings>
                <xjc:serializable uid="12343"/>
            </jaxb:globalBindings>
        </xs:appinfo>
    </xs:annotation>
    <xs:annotation>
        <xs:documentation>
            Schema for a list of Geronimo plugins available at some external site
            (namely, a Maven 2 repository).
        </xs:documentation>
    </xs:annotation>

    <!--   Top-level elements   -->

    <xs:element name="geronimo-plugin-list" type="list:plugin-listType">
        <xs:annotation>
            <xs:documentation>
                The geronimo-plugin-list root element is used for the config file present
                in the root directory of a Maven repository supporting Geronimo plugin
                downloads. This will be scanned by Geronimo clients to determine what
                plugins are available on that server.
            </xs:documentation>
        </xs:annotation>
    </xs:element>
    <xs:element name="geronimo-plugin" type="list:pluginType">
        <xs:annotation>
            <xs:documentation>
                The geronimo-plugin root element is used as the config file submitted
                with an individual Geronimo plugin to the plugin repository. It will be
                merged into the plugin list for the repository when the submitted plugin
                is accepted.

                It is also used for the metadata packed into a plugin when a plugin archive
                is downloaded from an online repository for local installation, in which
                case it should be packed into the archive at META-INF/geronimo-plugin.xml
            </xs:documentation>
        </xs:annotation>
    </xs:element>

    <!--   Data types used in this schema   -->

    <!-- Format for a list of available plugins provided by a remote repository -->
    <xs:complexType name="plugin-listType">
        <xs:sequence>
            <xs:element name="plugin" type="list:pluginType" minOccurs="0" maxOccurs="unbounded">
                <xs:annotation>
                    <xs:documentation>
                        The list of plugins available in the current plugin repository.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="default-repository" type="xs:string" minOccurs="0" maxOccurs="unbounded">
                <xs:annotation>
                    <xs:documentation>
                        Each default-repository is a URL to check for any dependencies that
                        need to be downloaded. Different values can be used, for example, to
                        host Geronimo plugins at one site and common third-party JARs at
                        another site, or to maintain a plugin list at a site that is not
                        actually a repository.

                        The URL where this fill is downloaded from must list itself as the
                        first default-repository if it wants to be checked for file
                        downloads in addition to hosting the plugin list. For every
                        dnwload, each of the repositories listed here will be checked in
                        the order listed until the artifact is found. However, if a
                        plugin in the list includes its own source-repository list, those
                        repositories will be used instead of these list-level repositories
                        when downloading that plugin or its dependencies.

                        Note that while the primary repository may be protected by HTTP
                        Basic authentication, the backup repositories must either use the
                        same username and password as the primary or use no authentication.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="pluginType">
        <xs:sequence>
            <xs:element name="name" type="xs:string">
                <xs:annotation>
                    <xs:documentation>
                        A human-readable name for this plugin. This will be used to identify
                        the plugin to a user when giving them a list of plugins to select from.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="category" type="xs:string">
                <xs:annotation>
                    <xs:documentation>
                        A category name for this plugin. The user interface typically groups
                        plugins by their category name, so this should match the value for other
                        plugins in the same category.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="pluginGroup" type="xs:boolean" default="false" minOccurs="0">
                <xs:annotation>
                    <xs:documentation>
                        Influences whether a geronimo plugin is a geronimo plugin group, which is
                        just a list of other plugins to install. The dependencies listed for this 
                        plugin will be treated as the list of actual plugins to install.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>             
            <xs:element name="description" type="xs:string">
                <xs:annotation>
                    <xs:documentation>
                        A description of this plugin. This will be displayed when the user
                        looks for more information about this plugin. It typically includes
                        a description of what it does, what if any third-party software it's
                        based on, why it would be interesting to use it, etc.

                        Currently this should be plain text, where whitespace is not significant
                        except an entirely blank line indicates a paragraph break (like this
                        documentation, for example). This may change to a more structured format
                        in the future, if we can agree on what that ought to be.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="url" type="xs:string" minOccurs="0">
                <xs:annotation>
                    <xs:documentation>
                        The URL for a site that contains more detailed information about this
                        plugin. The plugin repository has access to the basic information
                        provided in this file, but a plugin may have a home page with more
                        detailed information, documentation, source code, etc.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="author" type="xs:string" minOccurs="0">
                <xs:annotation>
                    <xs:documentation>
                        Names the author of the plugin. This may be a person, a company, an
                        open source project, or whatever. Basically, this gives some idea who
                        submitted the plugin, perhaps where to go for support, etc.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="license" type="list:licenseType" minOccurs="0" maxOccurs="unbounded">
                <xs:annotation>
                    <xs:documentation>
                        The name of the license that applies to this plugin, usually composed of a
                        license class (if any) followed by the name and version of a license:
                        BSD -- Apache Software License (ASL) 2.0
                        GPL -- Lesser General Public License (LGPL) 2

                        If there is more than one license listed then that means the user may choose
                        among any of the available licenses.

                        Contains a mandatory true/false attribute indicating whether this license
                        is OSI-approved (e.g. whether the plugin is open source).

                        Note that the license declared here applies only to the current component.
                        Any dependencies may be licensed separately.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="plugin-artifact" type="list:pluginArtifactType" minOccurs="1" maxOccurs="unbounded">
                <xs:annotation>
                    <xs:documentation>
                        A version and container senstive instance of this plugin.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="pluginArtifactType">
        <xs:sequence>
            <xs:element name="module-id" type="list:artifactType">
                <xs:annotation>
                    <xs:documentation>
                        The Geronimo moduleId for this plugins, which uniquely identifies
                        it, and also is used to construct a path to download it if necessary.
                        If no module-id is provided, that means this is a plugin group, which is
                        just a list of other plugins to install. The prerequisites must still be
                        met, but then the dependencies listed for this plugin will be treated as
                        the list of actual plugins to install.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="hash" type="list:hashType" minOccurs="0">
                <xs:annotation>
                    <xs:documentation>
                        A hash value (typically MD5 or SHA-1) that applies to the plugin download
                        file. This can be used to confirm that a plugin download was complete, and
                        to ensure that the file downloaded is the same as the file originally
                        posted to the repository.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="geronimo-version" type="xs:string" minOccurs="0" maxOccurs="unbounded">
                <xs:annotation>
                    <xs:documentation>
                        Indicates a version of the Geronimo base server that this plugin can run in.
                        If no geronimo-version is listed, that means the plugin can run in any version
                        of Geronimo so long as the prerequisites, parents, and dependencies are present.
                        If one or more geronimo-version elements are listed, then the current version of
                        Geronimo must match one of them in order for this plugin to be installable.

                        This is applied as an exact match: 1.2 does not match 1.2.1 or 1.2-SNAPSHOT
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="jvm-version" type="xs:string" minOccurs="0" maxOccurs="unbounded">
                <xs:annotation>
                    <xs:documentation>
                        Indicates a version of the JVM that this plugin can run in. If no jvm-version
                        is listed, that means the plugin can run in any version of the JVM supported
                        by Geronimo so long as the prerequisites, parents, and dependencies are present.
                        If one or more jvm-version elements are listed, then the JVM that Geronimo is
                        currently running on must match one of them in order for this plugin to be
                        installable. (It does not stop you from restarting Geronimo on a different JVM
                        version once the components is already installed.)

                        This is not normally used, but must be for plugins that use CORBA or
                        serialized QNames, etc.

                        This is applied as a prefix match: 1.4 matches 1.4.2 or 1.4.2_10
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="prerequisite" type="list:prerequisiteType" minOccurs="0" maxOccurs="unbounded">
                <xs:annotation>
                    <xs:documentation>
                        A dependency of this plugin that must be previously installed if this
                        plugin is to be considered to be installable. This is generally the
                        same as the dependency element (for example, it may refer to a plugin
                        by moduleId or a JAR by repository ID) except that the dependency will not
                        be downloaded on demand and must have been previously installed.

                        This is currently used for a web application to specify the web container it
                        runs in (so we don't show Tomcat downloads for a Jetty installation, etc.). It
                        may be used for similar things in the future if more distribution choices are
                        added to Geronimo.

                        It is also used by the public Geronimo plugin repository in cases where the
                        dependencies cannot be redistributed (e.g. a dependency on a commercial JDBC
                        driver JAR which must be manually acquired and installed).

                        It is also used when a user must set something up (like a database pool or
                        security realm) to point to a custom resource in their environment before the
                        plugin can be installed.

                        This is applied as an exact match, except that the version number may be
                        omitted, in which case any matching version of the dependency will work.

                        It has an optional resource-type attribute indicating to the user what type
                        of prerequisite this is (for cases where they're expected to set something up
                        as opposed to just downloading a JAR). e.g. it could be set to "JDBC Pool".
                        Likewise there is an option description to provide more detailed guidance for
                        how to resolve the prerequisite.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="dependency" type="list:dependencyType" minOccurs="0" maxOccurs="unbounded">
                <xs:annotation>
                    <xs:documentation>
                        The moduleId of another plugin or Geronimo module, or the repository ID of
                        a 3rd party JAR that this plugin depends on. That means that the dependency
                        must be downloaded and installed if this plugin is selected.

                        This is applied as an exact match, except that the version number may be
                        omitted, in which case any matching version of the dependency will work.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="obsoletes" type="list:artifactType" minOccurs="0" maxOccurs="unbounded">
                <xs:annotation>
                    <xs:documentation>
                        The moduleId of another plugin or Geronimo module that this plugin replaces.
                        That can be used, for example, to replace a less functional module
                        with a more functional one, or to upgrade a component to a newer version.

                        This is applied as an exact match, except that the version number may be
                        omitted, in which case any matching version of the module or plugin will be
                        replaced. Be aware that omitting the version number may cause a
                        plugin to be downgraded, so you may choose to explicitly list all
                        lesser versions. That may not be desirable either, though. If the
                        server has foo-1.0.2 installed and you install foo-1.0.1, would you
                        rather have it downgrade or end up with both installed?

                        NOTE: currently the "obsoletes" entries are only processed on the
                        plugin(s) passed directly to the PluginInstaller (not on dependencies that
                        are brought down as a result). That means that a plugin group must list
                        obsoletes for all its components, etc.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="source-repository" type="xs:string" minOccurs="0" maxOccurs="unbounded">
                <xs:annotation>
                    <xs:documentation>
                        The base URL for the repository that this plugin should be downloaded from.
                        The repositories listed here will be consulted in the order listed every
                        time something needs to be downloaded, and the search will stop at the
                        first repository that holds any matching plugin or JAR.

                        In a normal plugin list, the repositories are specified at the list level,
                        and do not need to be repeated at the plugin level. However, any values
                        specified at the plugin level replace the values specified at the list
                        level. This can be used to maintain a single list of plugins from multiple
                        sources.

                        This value is required if this is not a plugin list but metadata for a
                        single plugin included in a plugin file downloaded from a repository.
                        Otherwise, the installer would not know where to download any dependencies
                        from.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="copy-file" type="list:copy-fileType" minOccurs="0" maxOccurs="unbounded">
                <xs:annotation>
                    <xs:documentation>
                        Lets a plugin include files that should be copied into the Geronimo
                        installation tree, beyond copying the plugin into the repository. For
                        example, this could be used to copy files into geronimo/bin, geronimo/lib,
                        geronimo/var/security/keystores, or other Geronimo dirs.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="config-xml-content" type="list:config-xml-contentType" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element name="artifact-alias" type="list:propertyType" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element name="config-substitution" type="list:propertyType" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="config-xml-contentType">
        <xs:annotation>
            <xs:documentation>
                Lets a plugin declare data that should be inserted into config.xml
                when the plugin is installed. This is normally used to add ports
                and other settings that the user is likely to want to change. The
                gbean entries declared here will be written into config.xml for the
                new module when the plugin is installed.
            </xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <xs:element ref="atts:comment" minOccurs="0"
                maxOccurs="1" />
            <xs:element ref="atts:gbean" maxOccurs="unbounded"/>
        </xs:sequence>
        <xs:attribute name="load" type="xs:boolean" default="true">
            <xs:annotation>
                <xs:documentation>
                    Whether the module should be marked load true or false. If marked false it can still
                    be started if other started modules depend on it.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
        <xs:attribute name="condition" type="xs:string">
            <xs:annotation>
                <xs:documentation>
                    Optional condition that if present is evaluated to determine whether to load the module.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
        <xs:attribute name="server" type="xs:string" default="default">
            <xs:annotation>
                <xs:documentation>
                    The "server", i.e. the named set of configuration files, this should be added to.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>

    <xs:complexType name="propertyType">
        <xs:annotation>
            <xs:documentation>
                holds key-value pair. key is in 'key' attribute, value is in content
            </xs:documentation>
        </xs:annotation>

        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="key" use="required" type="xs:string">
                    <xs:annotation>
                        <xs:documentation>
                            key for key-value pair.
                        </xs:documentation>
                    </xs:annotation>
                </xs:attribute>
                <xs:attribute name="server" type="xs:string" default="default">
                    <xs:annotation>
                        <xs:documentation>
                            The "server", i.e. the named set of configuration files, this should be added to.
                        </xs:documentation>
                    </xs:annotation>
                </xs:attribute>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <xs:complexType name="licenseType">
        <xs:annotation>
            <xs:documentation>
                See pluginType/license above
            </xs:documentation>
        </xs:annotation>

        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="osi-approved" use="required" type="xs:boolean">
                    <xs:annotation>
                        <xs:documentation>
                            Indicates whether this license is OSI-approved, which is to say, whether
                            the plugin is open source. Typically this is true for all licenses
                            you'd expect to be open source, and false for proprietary plugins.

                            If there's some doubt, visit http://www.opensource.org/licenses/index.php
                        </xs:documentation>
                    </xs:annotation>
                </xs:attribute>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <xs:complexType name="dependencyType">
        <xs:annotation>
            <xs:documentation>
                See pluginType/dependency above
            </xs:documentation>
        </xs:annotation>

        <xs:complexContent>
            <xs:extension base="list:artifactType">
                <xs:sequence>
                    <xs:element name="import" type="list:importType"
                        minOccurs="0">
                        <xs:annotation>
                            <xs:documentation>
                                The import element is restrictive element to
                                defined type of dependency. The default (when
                                omitted) is to include the specified dependency
                                in the classloader (as a parent or URL). If
                                defined as "classes" means that the classes must
                                be included in the current module's classloader
                                but the dependency does not need to be started.
                                Specifying "services" means that the dependency
                                (a module) must be started before the current
                                module, but it is not included as a parent
                                classloader.
                            </xs:documentation>
                        </xs:annotation>
                    </xs:element>
                </xs:sequence>
                <xs:attribute name="start" use="optional" type="xs:boolean" default="true">
                    <xs:annotation>
                        <xs:documentation>
                            Influences whether a dependency is marked to start.  A plugin is marked to start
                            in a particular server "instance" primarily based on the load and condition settings in
                            the config-xml sections.  However the start attribute overrides this for plugins installed
                            as dependencies.
                        </xs:documentation>
                    </xs:annotation>
                </xs:attribute>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:simpleType name="importType">
        <xs:annotation>
            <xs:documentation>
                <![CDATA[
            The import element is restrictive.  The default (when omitted) is to include the specified dependency in
            the classloader (as a parent or URL) and (if the dependency is a module) make sure it is started
            before starting the current module.  Specifying "classes" means that the classes must be included
            in the current module's classloader but the dependency does not need to be started. (I'm not sure this
            is actually possible, but it is what is meant).  Specifying "services" means that the dependency (a module)
            must be started before the current module, but it is not included as a parent classloader.

            You probably never need to use the import element.
                ]]>
            </xs:documentation>
        </xs:annotation>
        <xs:restriction base="xs:string">
            <xs:enumeration value="classes">
                <xs:annotation>
                    <xs:documentation>
                        The value "classes" means that the classes must be
                        included in the current module's classloader but the
                        dependency does not need to be started.
                    </xs:documentation>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="services">
                <xs:annotation>
                    <xs:documentation>
                        The value "services" means that the dependency (a
                        module) must be started before the current module, but
                        it is not included as a parent classloader.
                    </xs:documentation>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="all">
                <xs:annotation>
                    <xs:documentation>
                        The value "all" means that the dependency (a
                        module) must be started before the current module, and
                        it is also included as a parent classloader.
                    </xs:documentation>
                </xs:annotation>
            </xs:enumeration>
        </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="hashType">
        <xs:annotation>
            <xs:documentation>
                See pluginType/hash above
            </xs:documentation>
        </xs:annotation>

        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="type" use="required">
                    <xs:annotation>
                        <xs:documentation>
                            Indicates the type of hash. The values presently supported are:

                            MD5
                            SHA-1

                        </xs:documentation>
                    </xs:annotation>
                    <xs:simpleType>
                        <xs:restriction base="xs:NMTOKEN">
                            <xs:enumeration value="MD5"/>
                            <xs:enumeration value="SHA-1"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:attribute>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <xs:complexType name="copy-fileType">
        <xs:annotation>
            <xs:documentation>
                The name of a file in the plugin archive that should be copied into
                the server installation tree somewhere when the plugin is installed.
                There may be a path component (relative to the root of the plugin
                archive), though that will not be used to construct the destination
                location. For example:

                <copy-file relative-to="server" dest-dir="var/security/keystores">
                    resources/keystores/my-keystore
                </copy-file>

                This will copy the file resources/keystores/my-keystore to e.g.
                var/security/keystores/my-keystore
            </xs:documentation>
        </xs:annotation>

        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="relative-to" use="required">
                    <xs:annotation>
                        <xs:documentation>
                            Indicates whether the destination is relative to the Geronimo install
                            directory or the server instance directory (which are the same unless
                            the server instance is configured).  The values presently supported are:

                            geronimo
                            server

                        </xs:documentation>
                    </xs:annotation>
                    <xs:simpleType>
                        <xs:restriction base="xs:NMTOKEN">
                            <xs:enumeration value="geronimo"/>
                            <xs:enumeration value="server"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:attribute>
                <xs:attribute name="dest-dir" use="required" type="xs:string">
                    <xs:annotation>
                        <xs:documentation>
                            The directory to copy the file to, relative to either the Geronimo
                            install dir or the server's home directory (normally the same as the
                            Geronimo install dir but may be configured to be elsewhere).
                        </xs:documentation>
                    </xs:annotation>
                </xs:attribute>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <xs:complexType name="prerequisiteType">
        <xs:sequence>
            <xs:element name="id" type="list:artifactType">
                <xs:annotation>
                    <xs:documentation>
                        The Module ID of the prerequisite. This is used to check whether
                        it's available on the server that you're downloading the plugin
                        into. It may omit some portions of the Module ID to be more
                        accomodating (e.g. "*/MyDBPool/*/*" to identify a database pool
                        instead of "console/MyDBPool/1.0/car").

                        Note that the values here may take the non-standard syntax of
                        * instead of the empty string for a missing value, which will
                        hopefully make the wildcard format more user-friendly.
                        (On the theory that "Please install */MyDBPool/*/*" should make
                        more sense than "Please install /MyDBPool//" for an average user)
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="resource-type" type="xs:string" minOccurs="0">
                <xs:annotation>
                    <xs:documentation>
                        Describes the type of resource that the prerequisite is. Examples
                        include:

                        JDBC Driver
                        JDBC Pool
                        JMS Resource Group
                        JavaMail

                        This is mainly used for prerequisites where the user needs to set
                        something up and you want to indicate what. So for example, you
                        could say "console/myapp-pool/*/jar" is a prerequisite with resource
                        type "JDBC Pool" and then the user should understand that they can
                        install your plugin if they create a JDBC pool called "myapp-pool"
                        in the console, or manually deploy a pool with moduleId
                        "console/myapp-pool/(something)/jar"

                        Another option in that case would be to use a dependency on a JDBC
                        pool plugins you provide, but then it would have to use the
                        system database (and run a DDL script on the first connect) in order
                        to be installable in an arbitrary Geronimo server. That would be a
                        better approach for demonstration applications, whereas the
                        prerequisite on a user-installed pool would be a better approach for
                        production applications.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="description" type="xs:string" minOccurs="0">
                <xs:annotation>
                    <xs:documentation>
                        A description for the user about why this is a prerequisite and what
                        they should do to set it up. Here are a couple examples:

                        This plugin of SomeApp is configured for the Jetty version of
                        Geronimo. It cannot be installed on the Tomcat version of Geronimo.
                        There's a separate plugin for the Tomcat version of Geronimo.

                        SomeApp requires a database connection pool. Supported databases
                        are PostgreSQL and MySQL. Please configure a database connection
                        pool with the name "SomeAppPool" and then run the associated create
                        script from http://someapp.com/db-scripts/ before installing this
                        plugin.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="artifactType">
        <xs:annotation>
            <xs:documentation>
                <![CDATA[
                Refers to either another module running in the server, or
                an entry in the server's Repository.  In either case this effectively uses a
                URI.

                When this is pointing to a repository entry, the URI must have a form
                acceptable to the repository, which is currently a URI consisting of
                Maven-style identifiers separated by slashes (groupId/artifactId/version/type,
                for example, the URI "postgresql/postgresql-8.0-jdbc/313/jar" for a file like
                "repository/postgresql/postgresql-8.0-jdbc-313.jar").

                When this is pointing to a module, the URI should match the
                module's moduleId.  This also looks
                like a Maven-style URI discussed above.

                The artifactType element can take either a straight URI (as in the examples
                above), or maven-style identifier fragments (groupId, type, artifactId, and
                version), which it will compose into a URI by adding up the fragments with
                slashes in between.

                There is a correspondence between the xml format and a URI.  For example, the URI

                postgresql/postgresql-8.0-jdbc/313/jar

                corresponds to the xml:

                <groupId>postgresql</groupId>
                <artifactId>postgresql-8.0-jdbc</artifactId>
                <version>313</version>
                <type>jar</type>
	            ]]>
            </xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <!-- TODO not sure if groupId can in fact be optional -->
            <xs:element name="groupId" type="xs:string" minOccurs="0">
                <xs:annotation>
                    <xs:documentation>
                        The name for group containing this module. By default,
                        it is considered 'default' for declaration and wild card
                        '*' for dependencies.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="artifactId" type="xs:string">
                <xs:annotation>
                    <xs:documentation>
                        The name for module in a specified group. All the
                        artifactId's should be unique within a group. If no
                        articfactId is provided it will be defaulted to file
                        name of the module file.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="version" type="xs:string" minOccurs="0">
                <xs:annotation>
                    <xs:documentation>
                        The version number for the module formatted by dot
                        separated numbers. If no version is provided it will be
                        defaulted to numeric timestamp generated by
                        System.currentTimeMillis() at deploy time. In case of
                        dependencies latest available version will be used.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="type" type="xs:string" minOccurs="0">
                <xs:annotation>
                    <xs:documentation>
                        This element defines the type of the module. The type
                        could be 'CAR', 'JAR', EAR', 'WAR', etc. If no type is
                        provided it will be defaulted appropriately by the
                        deployer depending upon type of deployed module.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
        </xs:sequence>
    </xs:complexType>

</xs:schema>
