<!--
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>
  <id>executable-plugin</id>
  <name>ExecutablePlugin</name>
  <description>A configuration file for compilers.</description>
  <defaults>
    <default>
      <key>package</key>
      <value>npanday.model.compiler.plugins</value>
    </default>
  </defaults>
  <classes>
    <class rootElement="true">
      <name>ExecutablePluginsModel</name>
      <fields>
        <field>
          <name>executablePlugins</name>
          <description>Plugin configurations.</description>
          <association>
            <type>ExecutablePlugin</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
      </fields>
    </class>

    <class xml.tagName="executablePlugin">
      <name>ExecutablePlugin</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>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>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>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 (Currently
            unused).</description>
        </field>
      </fields>
    </class>
  </classes>
</model>
