Classes Java

N'importe quelle classe Java sur le chemin d'accès aux classes de votre application peut être utilisée comme type de données dans votre jeu de règles CER.

ATTENTION :
Lorsque vous stockez des objets de règle dans la base de données, vous pouvez uniquement utiliser des types de données pour lesquels il existe un gestionnaire de type enregistré avec CER.

CER comprend les gestionnaires de type de la plupart des types de données utilisés couramment.

Noms de module

Le nom d'une classe Java doit être entièrement qualifié avec son nom de module, sauf pour les classes des modules suivants :

<?xml version="1.0" encoding="UTF-8"?>
<RuleSet name="Example_javaclassDataType"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation=
"http://www.curamsoftware.com/CreoleRulesSchema.xsd">
  <Class name="Person">
    <Attribute name="isMarried">
      <type>
        <!-- Il n'est pas nécessaire de spécifier le module
             de java.lang.Boolean -->
        <javaclass name="Boolean"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <Attribute name="dateOfBirth">
      <type>
        <!-- Nom qualifié complet d'une classe Cúram -->
        <javaclass name="curam.util.type.Date"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>


  </Class>

</RuleSet>
Conseil : Vous ne pouvez pas utiliser les types Java primitifs tels que boolean dans CER, mais plutôt leurs équivalents de classe (par exemple, Boolean).

Objets non modifiables

Un principe fondamental de CER est que chaque valeur, une fois calculée, ne peut pas être changée.

Pour se conformer à ce principe, les classes Java que vous utilisez doivent être non modifiables.

avertissement : Si vous utilisez une classe Java modifiable en tant que type de données dans votre jeu de règles CER, vous devez vous assurer qu'aucun code Java ne tente de modifier la valeur d'un objet de cette classe Java. CER ne peut pas garantir la fiabilité des calculs si des valeurs sont modifiées en parallèle !

Heureusement, il existe un grand nombre de classes non modifiables qui répondent généralement à la plupart de vos exigences en matière de type de données. En règle générale, il vous suffit de consulter le JavaDoc d'une classe Java pour déterminer si celle-ci est non modifiable.

Voici une liste utile de classes non modifiables qui suffira probablement à répondre à vos besoins :

Héritage

CER reconnaît la hiérarchie d'héritage des classes et des interfaces Java.

CER autorise le renvoi d'une valeur de classe Java à chaque fois que l'un de ses ancêtres de classe ou d'interface Java est attendu :

<?xml version="1.0" encoding="UTF-8"?>
<RuleSet name="Example_javaclassInheritance"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation=
"http://www.curamsoftware.com/CreoleRulesSchema.xsd">
  <Class name="Person">
    <Attribute name="isMarried">
      <type>
        <javaclass name="Boolean"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <Attribute name="isMarriedAsObject">
      <type>
        <!-- A titre d'exemple, le renvoi de cette
             valeur en tant que java.lang.Object (peu susceptible
             d'être utile dans un jeu de règles
             réel). -->
        <javaclass name="Object"/>
      </type>
      <derivation>
        <!-- OK, car un booléen *IS* un objet. -->
        <reference attribute="isMarried"/>
      </derivation>
    </Attribute>

    <Attribute name="isMarriedAsString">
      <type>
        <javaclass name="String"/>
      </type>
      <derivation>
        <!-- Le valideur de jeu de règles CER signale l'erreur
             ci-dessous (car un booléen *IS NOT* une chaîne) :

             ERROR    Person.isMarriedAsString
             Example_javaclassInheritance.xml(28, 41)
             Child 'reference' returns 'java.lang.Boolean',
             but this item requires a 'java.lang.String'. -->
        <!-- <reference attribute="isMarried"/> -->

        <!-- (Déclaration comme indiqué afin que cet exemple
              soit généré correctement) -->
        <specified/>

      </derivation>
    </Attribute>

  </Class>

</RuleSet>

Classes paramétrées

Java 5 introduit la prise en charge des classes paramétrées, et CER vous permet d'utiliser des classes Java paramétrées dans votre jeu de règles.

Les paramètres d'une classe paramétrée ne sont répertoriés que dans la déclaration <javaclass> :

<?xml version="1.0" encoding="UTF-8"?>
<RuleSet name="Example_javaclassParameterized"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation=
"http://www.curamsoftware.com/CreoleRulesSchema.xsd">
  <Class name="Person">
    <Attribute name="favoriteWords">
      <type>
        <!-- Une liste de chaînes -->
        <javaclass name="List">
          <javaclass name="String"/>
        </javaclass>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <Attribute name="luckyNumbers">
      <type>
        <!-- Une liste de nombres -->
        <javaclass name="List">
          <javaclass name="Number"/>
        </javaclass>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <Attribute name="children">
      <!-- Une liste d'objets de règle Personne.

           Etant donné que java.util.List peut être paramétré avec
           n'importe quel objet, il est possible d'utiliser une classe de règles en tant que paramètre.       -->
      <type>
        <javaclass name="List">
          <ruleclass name="Person"/>
        </javaclass>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>


    <!-- Les chiens appartenant à cette personne. -->
    <Attribute name="dogs">
      <type>
        <javaclass name="List">
          <ruleclass name="Dog"/>
        </javaclass>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <!-- Les chats appartenant à cette personne. -->
    <Attribute name="cats">
      <type>
        <javaclass name="List">
          <ruleclass name="Cat"/>
        </javaclass>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>


    <!-- Tous les animaux appartenant à cette personne. -->
    <Attribute name="pets">
      <type>
        <javaclass name="List">
          <ruleclass name="Pet"/>
        </javaclass>
      </type>
      <derivation>
        <joinlists>
          <fixedlist>
            <listof>
              <javaclass name="List">
                <ruleclass name="Pet"/>
              </javaclass>
            </listof>
            <members>
              <!-- tous les chiens - les chiens sont un type d'animal -->
              <reference attribute="dogs"/>
              <!-- tous les chats - les chats sont un type d'animal -->
              <reference attribute="cats"/>

              <!-- CER n'autorise pas le terme Enfants dans cette
                   expression ; un enfant n'est pas un animal, même
                   s'il est adorable ou abîme les
                   meubles.  -->
              <!-- A NE PAS UTILISER -->
              <!-- <reference attribute="children"/> -->
              <!-- A NE PAS UTILISER -->

            </members>
          </fixedlist>

        </joinlists>
      </derivation>
    </Attribute>


  </Class>

  <Class abstract="true" name="Pet">

    <Attribute name="name">
      <type>
        <javaclass name="String"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

  </Class>

  <Class name="Dog" extends="Pet">

    <Attribute name="favoriteTrick">
      <type>
        <javaclass name="String"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

  </Class>

  <Class name="Cat" extends="Pet">

    <Attribute name="numberOfLives">
      <type>
        <javaclass name="Number"/>
      </type>
      <derivation>
        <!-- Il est bien connu qu'un chat
             a 9 vies. -->
        <Number value="9"/>
      </derivation>
    </Attribute>

  </Class>

</RuleSet>

CER vous permet d'utiliser n'importe quel type (y compris les objets de règle) de paramètre qui autorisentjava.lang.Object. CER impose le typage fort même si le paramètre (par exemple, une classe de règles) est défini de manière dynamique. CER reconnaît également la hiérarchie d'héritage des classes de règles lorsque vous décidez si une classe paramétrée peut être attribuée à un autre.