property

Permet d'obtenir la propriété d'un objet Java.

L'expression property indique le nom de la méthode Java à appeler, et :

L'expression property permet à CER de tirer parti de la puissance des classes Java sans avoir à répliquer un sous-ensemble arbitraire de méthodes en tant qu'expressions CER. Par exemple, java.util.List contient une méthode size et donc CER ne contient aucune expression explicite pour calculer le nombre d'éléments dans une liste.

Toutefois, pour respecter le principe de l'immuabilité de CER, seules les méthodes Java qui ne modifient pas la "valeur" d'un objet peuvent être appelées. CER permet uniquement d'appeler une méthode "property" si la méthode est incluse dans la "liste sécurisée" des méthodes pour la classe de l'objet (ou l'une de ses classes ou interface ancêtre).

Une méthode est jugée sûre si elle est explicitement indiquée comme telle dans la liste sécurisée. Si elle n'est pas présente dans la liste de sécurité, la règle CER émet une erreur.

Conseil : Le paramètre explicite de la sécurité défini sur false n'est pas nécessaire mais peut être inclus pour l'exhaustivité de la documentation, comme c'est le cas avec les listes sécurisées incluses à CER.

La liste sécurisée d'une classe est un fichier de propriétés dans le même package que la classe, nommé <classname>_CREOLE.properties.

CER inclut des listes sécurisées pour les classes et les interfaces Java suivantes :

Figure 1. Liste sécurisée pour méthodes java.lang.Object
# Safe list for java.lang.Object

# safe
toString.safe=true

# force equality to be evaluated using <equals>
equals.safe=false

# not exposed, even though they're "safe"
hashCode.safe=false
getClass.safe=false
Figure 2. Safe list for java.lang.Number methods
# Safe list for java.lang.Number

byteValue.safe=true
doubleValue.safe=true
floatValue.safe=true
intValue.safe=true
longValue.safe=true
shortValue.safe=true
Figure 3. Safe list for java.util.List methods
# Safe list for java.util.List

contains.safe=true
containsAll.safe=true


get.safe=true

indexOf.safe=true
isEmpty.safe=true
lastIndexOf.safe=true
size.safe=true
subList.safe=true


# not exposed
hashCode.safe=false
listIterator.safe=false
iterator.safe=false
toArray.safe=false

# mutators - unsafe
add.safe=false
addAll.safe=false
clear.safe=false
remove.safe=false
removeAll.safe=false
retainAll.safe=false

Pour obtenir une description des propriétés utiles sur l'interface List Java, voir Opérations de liste utiles.

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

  <Class name="Person">
    <Attribute name="children">
      <type>
        <javaclass name="List">
          <ruleclass name="Person"/>
        </javaclass>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <!-- Indique si cette personne a des enfants.

         Teste la propriété isEmpty de la liste. -->
    <Attribute name="hasChildren">
      <type>
        <javaclass name="Boolean"/>
      </type>
      <derivation>
        <not>
          <property name="isEmpty">
            <object>
              <reference attribute="children"/>
            </object>
          </property>
        </not>

      </derivation>
    </Attribute>

    <!-- Tous les enfants de cette personne, à l'exception du premier.

         Utilise la propriété subList de la liste, en transmettant :
         - (inclusif) de l'élément en position "1" (indiquant le
 deuxième
           membre de la liste ; les listes Java sont à base zéro)
         - (exclusif) à l'élément en position "taille de liste" (indiquant
           la position après le dernier élément de la liste)
    -->
    <Attribute name="secondAndSubsequentChildren">
      <type>
        <javaclass name="List">
          <ruleclass name="Person"/>
        </javaclass>
      </type>
      <derivation>
        <property name="subList">
          <object>
            <reference attribute="children"/>
          </object>
          <arguments>
            <!-- Le nombre doit être converti en entier
                 (comme requis par List.subList). -->
            <property name="intValue">
              <object>
                <Number value="1"/>
              </object>
            </property>
            <property name="size">
              <object>
                <reference attribute="children"/>
              </object>
            </property>

          </arguments>
        </property>

      </derivation>
    </Attribute>

  </Class>

</RuleSet>
ATTENTION :
Depuis Cúram V6, CER et le gestionnaire de dépendance prend en charge le stockage des valeurs d'attribut calculées sur la base de données, ainsi que le recalcul automatique des valeurs d'attribut si leurs dépendances changent.

Si vous changez l'implémentation d'une méthode de propriété, CER et le gestionnaire de dépendance ne sauront pas automatiquement comment recalculer les valeurs d'attribut calculées à l'aide de l'ancienne version de votre méthode property.

Une fois qu'une méthode property a été utilisée dans un environnement de production pour les valeurs d'attribut enregistrées, plutôt que de changer l'implémentation, pensez à créer une nouvelle méthode property (avec la nouvelle implémentation requise) et changez vos jeux de règles pour utiliser la nouvelle méthode property. Lorsque vous publiez vos changements de jeux de règles afin qu'ils désignent la nouvelle méthode property, CER recalcule automatiquement toutes les instances des valeurs d'attribut affectées.