Permet d'obtenir la propriété d'un objet Java.
L'expression property indique le nom de la méthode Java à appeler, et :
Objet Java sur lequel intervenir ; et
Le cas échéant, une liste d'arguments à transmettre à la méthode Java.
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.
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 :
# 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
# Safe list for java.lang.Number byteValue.safe=true doubleValue.safe=true floatValue.safe=true intValue.safe=true longValue.safe=true shortValue.safe=true
# 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>
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.