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.
CER comprend les gestionnaires de type de la plupart des types de données utilisés couramment.
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>
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.
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 :
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>
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.