<!--
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">
  <id>compiler-plugin</id>
  <name>CompilerPlugin</name>
  <description>A configuration file for compilers.</description>
  <defaults>
    <default>
      <key>package</key>
      <value>npanday.model.executable.plugins</value>
    </default>
  </defaults>
  <classes>
    <class rootElement="true" xml.tagName="compilerPlugins">
      <name>CompilerPluginsModel</name>
      <fields>
        <field>
          <name>compilerPlugins</name>
          <description>Plugin configurations.</description>
          <association xml.itemsStyle="flat">
            <type>CompilerPlugin</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
      </fields>
    </class>
    <class>
      <name>CompilerPlugin</name>
      <fields>
        <field>
          <name>identifier</name>
          <version>1.0.0+</version>
          <type>String</type>
          <description>An id for the compiler. It should be (but is not required to be) unique.</description>
        </field>
        <field>
          <name>pluginClass</name>
          <version>1.0.0+</version>
          <type>String</type>
          <description>
            Class name of the compiler. NPanday will pass an instance of this class to the
            requesting plugin.
          </description>
        </field>
        <field>
          <name>vendor</name>
          <version>1.0.0+</version>
          <type>String</type>
          <description>Vendor of the compiler: 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>language</name>
          <version>1.0.0+</version>
          <type>String</type>
          <description>The .NET language to use for compilation.</description>
        </field>
        <field>
          <name>profile</name>
          <version>1.0.0+</version>
          <type>String</type>
          <description>Profile for the plugin.</description>
        </field>
        <field>
          <name>executable</name>
          <version>1.0.0+</version>
          <type>String</type>
          <description>Executable, as run from the command line.</description>
        </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/MyComp/MySoftware@InstallDir) would look up a path in the
            windows registry.
          </description>
          <association>
            <type>String</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <field>
          <name>netDependencyId</name>
          <version>1.0.0+</version>
          <type>String</type>
        </field>
        <field>
          <name>frameworkVersions</name>
          <description>Supported framework version(s) of the compiler: 1.1.4322, 2.0.50727, 3.0</description>
          <association>
            <type>String</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <field>
          <name>defaultAssemblyPath</name>
          <description>
            Path (absolute or relative) of the assemblies given in the assembly fields. This field
            is used in conjunction with the profile and the assemblies fields.
          </description>
          <type>String</type>
        </field>
        <field>
          <name>targetFramework</name>
          <description>
            Target framework for the compiled artifact.
          </description>
          <type>String</type>
        </field>
        <field>
          <name>assemblies</name>
          <description>
            Assemblies to reference from the command line. This is used to create custom profiles (such as
            .NET Compact) that use a different set of system assemblies. Only include the name of the
            assembly, not the .dll extension.
          </description>
          <association>
            <type>String</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <field>
          <name>platforms</name>
          <version>1.0.0+</version>
          <description>Platform configuration capabilities.</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 (Currently unused)
          </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 compiler is capable of running on.</description>
        </field>
        <field>
          <name>architecture</name>
          <version>1.0.0+</version>
          <type>String</type>
          <description>The architecture that the compiler is capable of running on.</description>
        </field>
      </fields>
    </class>
  </classes>
</model>
