<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright P&P Software GmbH (Zurich, Switzerland) -->
<xs:schema targetNamespace="http://www.pnp-software.com/XFeature/fmm"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:dm="http://www.pnp-software.com/XFeature/displayModel"
  xmlns:fmm="http://www.pnp-software.com/XFeature/fmm" 
  elementFormDefault="qualified"
  attributeFormDefault="qualified" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://www.w3.org/2001/XMLSchema ../general_files/MetaMetaModel.xfmmm">
  <xs:annotation>
    <xs:appinfo>
      <dm:test/>
      <!-- This is here because of a bug XPath evaluation in oXygen v4.2. It is only useful for debugging and can be removed without any influence on the rest of the code. -->
    </xs:appinfo>
  </xs:annotation>
  <!--
  <xs:simpleType name="zero2inf">
    <xs:restriction base="xs:token">
      <xs:pattern value="([0-9][0-9]*|0|\+|\*)"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="one2inf">
    <xs:restriction base="xs:token">
      <xs:pattern value="([1-9][0-9]*|\+|\*)"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="greaterThanZero">
    <xs:restriction base="xs:token">
      <xs:pattern value="([1-9][0-9]*)"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="greaterThanOrEqualToZero">
    <xs:restriction base="xs:token">
      <xs:pattern value="([0-9][0-9]*)"/>
    </xs:restriction>
  </xs:simpleType>
  -->

  <xs:simpleType name="zeroOrMore">
    <xs:restriction base="xs:token">
      <xs:pattern value="([0-9]+)"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="oneOrMore">
    <xs:restriction base="xs:token">
      <xs:pattern value="([1-9][0-9]*)"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="oneToInf">
    <xs:restriction base="xs:token">
      <xs:pattern value="([1-9][0-9]*|\+|\*)"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="noSpacesString">
    <xs:restriction base="xs:token">
      <xs:pattern value="([A-Za-z][0-9A-Za-z_]*)"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="datatypes">
    <xs:restriction base="xs:string">
      <xs:enumeration value="xs:string"/>
      <xs:enumeration value="xs:integer"/>
      <xs:enumeration value="xs:float"/>
      <xs:enumeration value="xs:boolean"/>
    </xs:restriction>
  </xs:simpleType> 



  
  <!--
  <xs:simpleType name="featureCardMin" type="fmm:greaterThanZero"/>
  <xs:simpleType name="featureCardMax" type="fmm:one2inf"/>
  <xs:simpleType name="groupCardMin" type="fmm:zero2inf"/>
  <xs:simpleType name="groupCardMax" type="fmm:greaterThanZero"/>
  -->
  <!-- Definition of simple elements -->
  <xs:attribute name="name" type="xs:string"/>
  <xs:attribute name="type" type="xs:string"/>
  <xs:attribute name="value" type="fmm:noSpacesString"/>
  <xs:attribute name="text" type="xs:string"/>
  <!-- Definition of complex elements -->
  <xs:element name="FeatureModel">
    <xs:complexType dm:displayType="root">
      <xs:sequence>
        <xs:element ref="fmm:SolitaryFeatureNode" minOccurs="1" maxOccurs="1"/>
        <xs:element ref="fmm:MacroFeatureNode" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
      <xs:attribute ref="fmm:value" use="required"/>
      <xs:anyAttribute namespace="##any" processContents="skip"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="SolitaryFeatureNode">
    <xs:complexType dm:displayType="node">
      <xs:sequence>
        <xs:element ref="fmm:Annotation" minOccurs="0"/>
        <xs:element ref="fmm:SolitaryFeatureCardinality" minOccurs="0"/>
        <xs:element ref="fmm:DesignMapping" minOccurs="0"/>
        <xs:element ref="fmm:Attribute" minOccurs="0" maxOccurs="unbounded"/>
        <xs:element ref="fmm:SolitaryFeatureNode" minOccurs="0" maxOccurs="unbounded"/>
        <xs:element ref="fmm:GroupNode" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
      <xs:attribute ref="fmm:value" use="required"/>
      <xs:anyAttribute namespace="##any" processContents="skip"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="GroupedFeatureNode">
    <xs:complexType dm:displayType="node">
      <xs:sequence>
        <xs:element ref="fmm:Annotation" minOccurs="0"/>
        <xs:element ref="fmm:FeatureCardinality"/>
        <xs:element ref="fmm:DesignMapping" minOccurs="0"/>
        <xs:element ref="fmm:Attribute" minOccurs="0" maxOccurs="unbounded"/>
        <xs:element ref="fmm:SolitaryFeatureNode" minOccurs="0" maxOccurs="unbounded"/>
        <xs:element ref="fmm:GroupNode" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
      <xs:attribute ref="fmm:value" use="required"/>
      <xs:anyAttribute namespace="##any" processContents="skip"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="MacroFeatureNode">
    <xs:complexType dm:displayType="node">
      <xs:sequence>
        <xs:element ref="fmm:Annotation" minOccurs="0"/>
        <xs:element ref="fmm:SingletonCardinality"/>
        <xs:element ref="fmm:DesignMapping" minOccurs="0"/>
        <xs:element ref="fmm:Attribute" minOccurs="0"/>
        <xs:choice>
          <xs:element ref="fmm:GroupNode" minOccurs="0" maxOccurs="unbounded"/>
          <!--<xs:element ref="fmm:SolitaryFeatureNode" minOccurs="0" maxOccurs="unbounded"/>-->
          <!--<xs:element ref="fmm:GroupedFeatureNode" minOccurs="0" maxOccurs="unbounded"/>-->
        </xs:choice>          
      </xs:sequence>
      <xs:attribute ref="fmm:value" use="required"/>
      <xs:anyAttribute namespace="##any" processContents="skip"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="GroupNode">
    <xs:complexType dm:displayType="node">
      <xs:sequence>
        <xs:element ref="fmm:Annotation" minOccurs="0"/>
        <xs:element ref="fmm:GroupCardinality"/>
        <xs:choice maxOccurs="unbounded">
          <xs:element ref="fmm:GroupedFeatureNode"/>
          <xs:element ref="fmm:CallMacroNode"/>
        </xs:choice>
      </xs:sequence>
      <xs:attribute ref="fmm:value" use="required"/>
      <xs:anyAttribute namespace="##any" processContents="skip"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="CallMacroNode">
    <xs:complexType dm:displayType="node">
      <xs:sequence>
        <xs:element ref="fmm:Annotation" minOccurs="0"/>
        <xs:element ref="fmm:FeatureCardinality"/>
        <!-- <xs:element ref="fmm:MacroNameProperty"/> ==> this info is on the value atribute (nameOfCalledMacro) -->
      </xs:sequence>
      <xs:attribute ref="fmm:value" use="required"/>
      <!-- SOLVED -> it is "2)" O.R.: There are two possible semantics of this attribute: 1) it is the name of target macro - but this is inconsistent with other nodes OR 2) it is the name of this call macro and the name of target macro has to be added as a property (under some PropertySet) -->
      <xs:anyAttribute namespace="##any" processContents="skip"/>
    </xs:complexType>
  </xs:element>
  
  
  
  <!-- Property set elements -->
  <!--
  <xs:element name="AppendFeaturePropertySet">
    <xs:complexType dm:displayType="propertySet">
      <xs:sequence>
        <!- <xs:element ref="fmm:MacroNameProperty"/> ==> this info is on the value atribute ->
        <xs:element ref="fmm:ExtendedMacroName"/>
        <xs:element ref="fmm:TargetGroupName"/><!- the group to which the features are being added ->
        <xs:element ref="fmm:NewMinCardinality"/>
        <xs:element ref="fmm:NewMaxCardinality"/>
      </xs:sequence>
      <xs:attribute ref="fmm:value" use="required"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="AppendGroupPropertySet">
    <xs:complexType dm:displayType="propertySet">
      <xs:sequence>
        <!- <xs:element ref="fmm:MacroNameProperty"/> ==> this info is on the value atribute ->
        <xs:element ref="fmm:ExtendedMacroName"/>
        <xs:element ref="fmm:TargetFeatureName"/><!- the feature to which the groups are being added ->
        <!- There is no NewMin(Max)Cardinality here (as opposite to AppendFeaturePropertySet). It is correct. O.R. ->
      </xs:sequence>
      <xs:attribute ref="fmm:value" use="required"/>
    </xs:complexType>
  </xs:element>
  -->

  <xs:element name="DesignMapping">
    <xs:complexType dm:displayType="propertySet">
      <xs:sequence>
        <xs:choice>
          <xs:element ref="fmm:InterfaceName"/>
          <xs:element ref="fmm:ClassName"/>
        </xs:choice>
        <xs:choice minOccurs="0">
          <xs:element ref="fmm:PropertyName"/>
          <xs:sequence>
            <xs:element ref="fmm:OperationName"/>
            <xs:element ref="fmm:OperationType"/>
            <!--
            <xs:choice>
              <xs:element ref="fmm:Final"/>
              <xs:element ref="fmm:Virtual"/>
              <xs:element ref="fmm:Abstract"/>
            </xs:choice>
            -->
          </xs:sequence>
        </xs:choice>
      </xs:sequence>
      <xs:attribute ref="fmm:value" use="required"/>
      <xs:anyAttribute namespace="##any" processContents="skip"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="Attribute">
    <xs:complexType dm:displayType="propertySet">
      <xs:sequence>
        <xs:element ref="fmm:AttributeName" minOccurs="1" maxOccurs="1"/>
        <xs:element ref="fmm:AttributeType" minOccurs="1" maxOccurs="1"/>
        <xs:element ref="fmm:AttributeRequired" minOccurs="1" maxOccurs="1"/>
        <xs:element ref="fmm:AttributeDefaultValue" minOccurs="0" maxOccurs="1"/>
        <xs:element ref="fmm:AttributeDescription" minOccurs="0" maxOccurs="1"/>
      </xs:sequence>
      <xs:attribute ref="fmm:value" use="required"/>
      <xs:anyAttribute namespace="##any" processContents="skip"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="Annotation">
    <xs:complexType dm:displayType="propertySet">
      <xs:sequence>
        <xs:element ref="fmm:ShortDescription" minOccurs="0"/>
        <xs:element ref="fmm:LongDescription" minOccurs="0"/>
        <xs:element ref="fmm:Comment" minOccurs="0"/>
        <xs:element ref="fmm:Hyperlink" minOccurs="0"/>
      </xs:sequence>
      <xs:attribute ref="fmm:value" use="required"/>
      <xs:anyAttribute namespace="##any" processContents="skip"/>
    </xs:complexType>
  </xs:element>
  
  
  
  <!-- Property Elements -->
  <xs:element name="ShortDescription">
    <xs:complexType dm:displayType="property">
      <xs:attribute name="value" type="xs:string" use="optional"/>
      <xs:anyAttribute namespace="##any" processContents="skip"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="LongDescription">
    <xs:complexType dm:displayType="property">
      <xs:attribute name="value" type="xs:string" use="optional"/>
      <xs:anyAttribute namespace="##any" processContents="skip"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="Comment">
    <xs:complexType dm:displayType="property">
      <xs:attribute name="value" type="xs:string" use="optional"/>
      <xs:anyAttribute namespace="##any" processContents="skip"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="Hyperlink">
    <xs:complexType dm:displayType="property">
      <xs:attribute name="value" type="xs:string" use="optional"/><!-- this can probably be made more precise to enforce the structure of a URL ... with pattern -->
      <xs:anyAttribute namespace="##any" processContents="skip"/>
    </xs:complexType>
  </xs:element>
  <!--
  <xs:element name="Name"> attribute, operation, aspect 
    <xs:complexType dm:displayType="property">
    <xs:attribute ref="fmm:value" use="required"/>
    </xs:complexType>
  </xs:element>
  -->
  <xs:element name="MacroName">
    <xs:complexType dm:displayType="property">
      <xs:attribute ref="fmm:value" use="required"/>
      <xs:anyAttribute namespace="##any" processContents="skip"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="TargetFeatureName">
    <xs:complexType dm:displayType="property">
      <xs:attribute ref="fmm:value" use="required"/>
      <xs:anyAttribute namespace="##any" processContents="skip"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="TargetGroupName">
    <xs:complexType dm:displayType="property">
      <xs:attribute ref="fmm:value" use="required"/>
      <xs:anyAttribute namespace="##any" processContents="skip"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="ExtendedMacroName">
    <xs:complexType dm:displayType="property">
      <xs:attribute ref="fmm:value" use="required"/>
      <xs:anyAttribute namespace="##any" processContents="skip"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="NewMinCardinality">
    <!-- Used only in <xs:element name="AppendFeaturePropertySet"> -->
    <xs:complexType dm:displayType="property">
      <xs:attribute name="value" type="fmm:zeroOrMore" use="required"/>
      <xs:anyAttribute namespace="##any" processContents="skip"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="NewMaxCardinality">
    <xs:complexType dm:displayType="property">
      <xs:attribute name="value" type="fmm:oneToInf" use="required"/>
      <xs:anyAttribute namespace="##any" processContents="skip"/>
    </xs:complexType>
  </xs:element>
  
  <!-- new properties for FD -->
    <xs:element name="AttributeName">
    <xs:complexType dm:displayType="property">
      <xs:attribute ref="fmm:value" use="required"/>
      <xs:anyAttribute namespace="##any" processContents="skip"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="AttributeType">
    <xs:complexType dm:displayType="property">
      <xs:attribute name="value" type="fmm:datatypes" use="required"/>
      <xs:anyAttribute namespace="##any" processContents="skip"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="AttributeRequired">
    <xs:complexType dm:displayType="property">
      <xs:attribute name="value" type="xs:boolean" use="required"/>
      <xs:anyAttribute namespace="##any" processContents="skip"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="AttributeDefaultValue">
    <xs:complexType dm:displayType="property">
      <xs:attribute name="value" type="xs:string" use="optional"/>
      <xs:anyAttribute namespace="##any" processContents="skip"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="AttributeDescription">
    <xs:complexType dm:displayType="property">
      <xs:attribute name="value" type="xs:string" use="optional"/>
      <xs:anyAttribute namespace="##any" processContents="skip"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="InterfaceName">
    <xs:complexType dm:displayType="property">
      <xs:attribute ref="fmm:value" use="required"/>
      <xs:anyAttribute namespace="##any" processContents="skip"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="ClassName">
    <xs:complexType dm:displayType="property">
      <xs:attribute ref="fmm:value" use="required"/>
      <xs:anyAttribute namespace="##any" processContents="skip"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="PropertyName">
    <xs:complexType dm:displayType="property">
      <xs:attribute ref="fmm:value" use="required"/>
      <xs:anyAttribute namespace="##any" processContents="skip"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="OperationName">
    <xs:complexType dm:displayType="property">
      <xs:attribute ref="fmm:value" use="required"/>
      <xs:anyAttribute namespace="##any" processContents="skip"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="OperationType">
    <xs:complexType dm:displayType="property">
      <xs:attribute ref="fmm:value" use="required"/>
      <xs:anyAttribute namespace="##any" processContents="skip"/>
    </xs:complexType>
  </xs:element>
  <xs:simpleType name="operationType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="final"/>
      <xs:enumeration value="abstract"/>
      <xs:enumeration value="virtual"/>
    </xs:restriction>
  </xs:simpleType>
  
  
  <!-- Cardinality Elements -->
  <!-- O.R. This is not displayed at all -->
  <xs:element name="FeatureCardinality">
    <xs:complexType dm:displayType="cardinality">
      <xs:attribute name="cardMin" type="fmm:oneOrMore" use="required"/>
      <xs:attribute name="cardMax" type="fmm:oneToInf" use="required"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="GroupCardinality">
    <xs:complexType dm:displayType="cardinality">
      <xs:attribute name="cardMin" type="fmm:zeroOrMore" use="required"/>
      <xs:attribute name="cardMax" type="fmm:oneToInf" use="required"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="SolitaryFeatureCardinality">
    <xs:complexType dm:displayType="cardinality">
      <xs:attribute name="cardMin" type="fmm:zeroOrMore" use="required"/>
      <xs:attribute name="cardMax" type="fmm:oneToInf" use="required"/>
    </xs:complexType>
  </xs:element>
  <!-- OLD COMMENT: This should not be used and should be replaced by a cardinality element with fixed cardMax -->
  <!-- O.R. Now it is only used for elements *Macro* -->
  <xs:element name="SingletonCardinality"><!-- was SingletonCardinality -->
    <xs:complexType dm:displayType="cardinality">
      <xs:attribute name="cardMin" type="fmm:oneToInf" fixed="1"/>
      <xs:attribute name="cardMax" type="fmm:oneToInf" fixed="1"/>
    </xs:complexType>
  </xs:element>
</xs:schema>
