<!--
  ~ 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.
  -->
<model xmlns="http://modello.codehaus.org/MODELLO/1.4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://modello.codehaus.org/MODELLO/1.4.0 http://modello.codehaus.org/xsd/modello-1.4.0.xsd"
       xml.namespace="http://npanday.apache.org/executables/1.5.0">
  <id>executable-plugin</id>
  <name>ExecutablePlugin</name>
  <description>
    A configuration file for defining how npanday should locate exectuables
    to be run in the context of a plugin.
  </description>
  <defaults>
    <default>
      <key>package</key>
      <value>npanday.model.executable.plugins</value>
    </default>
  </defaults>
  <versionDefinition>
    <type>namespace</type>
  </versionDefinition>
  <classes>
    <class rootElement="true" xml.tagName="executablePlugins" xsd.compositor="sequence">
      <name>ExecutablePluginsModel</name>
      <fields>
        <field>
          <name>executablePlugins</name>
          <description>Plugin configurations.</description>
          <association xml.itemsStyle="flat">
            <type>ExecutablePlugin</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
      </fields>
    </class>
    <class>
      <name>ExecutablePlugin</name>
      <fields>
        <field>
          <name>identifier</name>
          <version>1.0.0+</version>
          <type>String</type>
          <description>
            The platform-independent identifier for the executable as it will be
            requested through the npanday.executable.ExecutableRequirement.
          </description>
        </field>
        <field>
          <name>pluginClass</name>
          <version>1.0.0+</version>
          <type>String</type>
          <description>
            Class name of the executable implementation. Must implement npanday.executable.NetExecutable.
          </description>
        </field>
        <field>
          <name>pluginConfiguration</name>
          <description>
            Configuration properties, that will be passed along to npanday.executable.NetExecutable#init()
          </description>
          <version>1.5.0+</version>
          <type>Properties</type>
          <association xml.mapStyle="inline">
            <type>String</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <field>
          <name>vendor</name>
          <version>1.0.0+</version>
          <type>String</type>
          <description>Vendor this executable is provided by or compatible with. For example MICROSOFT, MONO, DotGNU</description>
        </field>
        <field>
          <name>vendorVersion</name>
          <!-- since NPanday 1.5.0 -->
          <version>1.5.0+</version>
          <type>String</type>
          <description>The vendor version the executable is provided by or compatible with.</description>
        </field>
        <field>
          <name>profile</name>
          <version>1.0.0+</version>
          <type>String</type>
          <required>true</required>
          <description>Profile for the plugin.</description>
        </field>
        <field>
          <name>executable</name>
          <version>1.0.0+</version>
          <type>String</type>
          <required>true</required>
          <description>Executable name without extension, as run from the command line.</description>
        </field>
        <field>
          <name>executableVersion</name>
          <version>1.5.0+</version>
          <type>String</type>
          <description>
            The version of the executable, since multiple could be found on different paths (specified in 'probingPaths').
            Applicable, if executable is NOT provided by the .NET vendor (as specified in 'vendor').
          </description>
          <required>false</required>
        </field>
        <field>
          <name>probingPaths</name>
          <version>1.5.0+</version>
          <description>
            The paths this executable is likely to be found on. You can use expressions
            referring to the pom or registry here. $(project.build.directory) would expect the executable
            in the target directory, and $(HKLM/Software/MyComp/MySoftware@InstallDir) would look up a path in the
            windows registry.
          </description>
          <association>
            <type>String</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <field>
          <name>frameworkVersions</name>
          <description>Supported framework version(s): 1.1.4322, 2.0.50727, 3.0, ..</description>
          <version>1.0.0+</version>
          <association>
            <type>String</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <field>
          <name>platforms</name>
          <version>1.0.0+</version>
          <description>The platform this executable is compatible with.</description>
          <association>
            <type>Platform</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <field>
          <name>commandFilter</name>
          <version>1.0.0+</version>
          <description>A filter for including/excluding user-passed commands options.</description>
          <association>
            <type>CommandFilter</type>
          </association>
        </field>
      </fields>
    </class>

    <class>
      <name>CommandFilter</name>
      <fields>
        <field>
          <name>excludes</name>
          <version>1.0.0+</version>
          <description>
            The command options to exclude from the user specified pass-through parameters.
          </description>
          <association>
            <type>String</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <field>
          <name>includes</name>
          <version>1.0.0+</version>
          <description>
            The command options to allow from the user specified pass-through parameters.
          </description>
          <association>
            <type>String</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
      </fields>
    </class>

    <class>
      <name>Platform</name>
      <fields>
        <field>
          <name>operatingSystem</name>
          <version>1.0.0+</version>
          <type>String</type>
          <description>The operating system that the executable is compatible with.</description>
        </field>
        <field>
          <name>architecture</name>
          <version>1.0.0+</version>
          <type>String</type>
          <description>The architecture that the executable is compatible with.</description>
        </field>
      </fields>
    </class>
  </classes>
</model>
