abstract

Expression de marqueur pour indiquer que la dérivation de l'attribut doit être spécifiée sur des sous-classes concrètes (ou l'une de ses superclasses).

Si des attributs d'une classe de règles sont marqués abstract, le valideur du jeu de règles CER insiste sur le fait que la classe proprement dite est marquée abstract="true" et empêche l'utilisation de la classe de règles dans les expressions create.

<?xml version="1.0" encoding="UTF-8"?>
<RuleSet name="Example_abstract"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation=
"http://www.curamsoftware.com/CreoleRulesSchema.xsd">

  <!-- Classe de base pour tous les types de prestation.
       Chaque sous-classe concrète possède son propre
       calcul "name" et "isEligible". -->
  <Class name="Benefit" abstract="true">
    <Initialization>
      <!-- Personne pour laquelle l'éligibilité des prestations
        est déterminée. -->
      <Attribute name="person">
        <type>
          <ruleclass name="Person"/>
        </type>
      </Attribute>
    </Initialization>


    <!-- Nom de ce type de prestation -->
    <Attribute name="name">
      <type>
        <javaclass name="String"/>
      </type>
      <derivation>
        <abstract/>
      </derivation>
    </Attribute>

    <!-- Eligibilité ou non de la personne à cette prestation. -->
    <Attribute name="isEligible">
      <type>
        <javaclass name="Boolean"/>
      </type>
      <derivation>
        <abstract/>
      </derivation>
    </Attribute>

  </Class>

  <!-- Sous-classe concrète de la prestation.
       Contient les dérivations concrètes des attributs abstraits
       hérités. -->
  <Class name="MedicalBenefit" extends="Benefit">
    <Attribute name="name">
      <type>
        <javaclass name="String"/>
      </type>
      <derivation>
        <String value="Medical Benefit"/>
      </derivation>
    </Attribute>
    <Attribute name="isEligible">
      <type>
        <javaclass name="Boolean"/>
      </type>
      <derivation>
        <all>
          <fixedlist>
            <listof>
              <javaclass name="Boolean"/>
            </listof>
            <members>
              <!-- NB/// Attribut de personne hérité de la prestation
 -->
              <reference attribute="isPoor">
                <reference attribute="person"/>
              </reference>
              <reference attribute="isSick">
                <reference attribute="person"/>
              </reference>
            </members>
          </fixedlist>

        </all>

      </derivation>
    </Attribute>
  </Class>


  <!-- Autre sous-classe concrète de la prestation,
    avec différentes dérivations concrètes des attributs abstraits
    hérités. -->
  <Class name="NeedyBenefit" extends="Benefit">
    <Attribute name="name">
      <type>
        <javaclass name="String"/>
      </type>
      <derivation>
        <String value="Medical Benefit"/>
      </derivation>
    </Attribute>
    <Attribute name="isEligible">
      <type>
        <javaclass name="Boolean"/>
      </type>
      <derivation>
        <all>
          <fixedlist>
            <listof>
              <javaclass name="Boolean"/>
            </listof>
            <members>
              <reference attribute="isPoor">
                <reference attribute="person"/>
              </reference>
              <any>
                <fixedlist>
                  <listof>
                    <javaclass name="Boolean"/>
                  </listof>
                  <members>
                    <reference attribute="isHungry">
                      <reference attribute="person"/>
                    </reference>
                    <reference attribute="isDeprived">
                      <reference attribute="person"/>
                    </reference>
                  </members>
                </fixedlist>
              </any>
            </members>
          </fixedlist>

        </all>

      </derivation>
    </Attribute>
  </Class>

  <Class name="Person">

    <Attribute name="isPoor">
      <type>
        <javaclass name="Boolean"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <Attribute name="isSick">
      <type>
        <javaclass name="Boolean"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <Attribute name="isHungry">
      <type>
        <javaclass name="Boolean"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <Attribute name="isDeprived">
      <type>
        <javaclass name="Boolean"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>


    <!-- Liste de toutes les prestations pour
         lesquelles la personne est en cours d'évaluation.  -->
    <Attribute name="allBenefits">
      <type>
        <javaclass name="List">
          <ruleclass name="Benefit"/>
        </javaclass>
      </type>
      <derivation>
        <fixedlist>
          <listof>
            <ruleclass name="Benefit"/>
          </listof>
          <members>
            <!-- Création d'instances des classes de règles concrètes -->
            <create ruleclass="MedicalBenefit">
              <this/>
            </create>
            <create ruleclass="NeedyBenefit">
              <this/>
            </create>
          </members>
        </fixedlist>

      </derivation>
    </Attribute>

    <!-- Prestations pour lesquelles cette personne
         est éligible.

         Notez que la liste est de la classe de règles
         abstraite "Benefit", mais que chaque
         instance concrète détermine
         son éligibilité de sa propre manière.    -->
    <Attribute name="eligibleBenefits">
      <type>
        <javaclass name="List">
          <ruleclass name="Benefit"/>
        </javaclass>
      </type>
      <derivation>
        <filter>
          <list>
            <reference attribute="allBenefits"/>
          </list>
          <listitemexpression>
            <reference attribute="isEligible">
              <current/>
            </reference>
          </listitemexpression>
        </filter>
      </derivation>
    </Attribute>

  </Class>

</RuleSet>