La expresión property (consulte Propiedad y property) permite la invocación de los métodos "safe" de Java.
Los conjuntos de reglas contienen normalmente muchas instancias de java.util.List.
La lista segura de métodos para java.util.List se incluye con CER:
# Lista segura para 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 # no expuesto hashCode.safe=false listIterator.safe=false iterator.safe=false toArray.safe=false # mutadores - no seguro add.safe=false addAll.safe=false clear.safe=false remove.safe=false removeAll.safe=false retainAll.safe=false
Mientras que la descripción de estos métodos está disponible a través del JavaDoc para java.util.List, aquí se incluyen las propiedades más útiles habitualmente para referencia del usuario:
Devuelve true si esta lista no contiene elementos.
Devuelve el número de elementos en esta lista.
Devuelve el elemento en la posición especificada de esta lista. Tenga en cuenta que debido a que CER pasa valores numéricos redondeados como instancias de Número, deberá utilizar intValue para convertir un Número en un entero.
Devuelve true si esta lista contiene el elemento especificado.
<?xml version="1.0" encoding="UTF-8"?> <RuleSet name="Example_UsefulListOperations" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation= "http://www.curamsoftware.com/CreoleRulesSchema.xsd"> <Class name="Person"> <!-- Se designará exactamente a una persona (en cada unidad familiar) como cabeza de familia --> <Attribute name="isHeadOfHousehold"> <type> <javaclass name="Boolean"/> </type> <derivation> <specified/> </derivation> </Attribute> <!-- Los hijos de esta persona. --> <Attribute name="children"> <type> <javaclass name="List"> <ruleclass name="Person"/> </javaclass> </type> <derivation> <specified/> </derivation> </Attribute> <!-- Indica si esta persona tiene hijos. Prueba la propiedad isEmpty de lista. --> <Attribute name="hasChildren"> <type> <javaclass name="Boolean"/> </type> <derivation> <not> <property name="isEmpty"> <object> <reference attribute="children"/> </object> </property> </not> </derivation> </Attribute> <Attribute name="numberOfChildren"> <type> <javaclass name="Number"/> </type> <derivation> <property name="size"> <object> <reference attribute="children"/> </object> </property> </derivation> </Attribute> <!-- El segundo hijo de esta persona, si hay alguno, de lo contrario, nulo --> <Attribute name="secondChild"> <type> <ruleclass name="Person"/> </type> <derivation> <!-- Tenemos que comprobar si la persona tiene dos o más hijos --> <choose> <type> <ruleclass name="Person"/> </type> <when> <condition> <compare comparison=">="> <reference attribute="numberOfChildren"/> <Number value="2"/> </compare> </condition> <value> <!-- Utilice la propiedad "get" para obtener el segundo elemento de la lista - indicado por el índice 1 (las listas en Java se basan en cero) --> <property name="get"> <object> <reference attribute="children"/> </object> <arguments> <!-- El número se debe convertir a un entero (como lo requiere List.subList). --> <property name="intValue"> <object> <Number value="1"/> </object> </property> </arguments> </property> </value> </when> <otherwise> <!-- Esta persona no tiene un segundo hijo --> <value> <null/> </value> </otherwise> </choose> </derivation> </Attribute> <Attribute name="isChildOfHeadOfHousehold"> <type> <javaclass name="Boolean"/> </type> <derivation> <property name="contains"> <object> <!-- Los hijos del cabeza de familia --> <reference attribute="children"> <!-- recupera el único objeto de regla de persona que tiene isHeadOfHousehold igual a true--> <singleitem onEmpty="error" onMultiple="error"> <readall ruleclass="Person"> <match retrievedattribute="isHeadOfHousehold"> <true/> </match> </readall> </singleitem> </reference> </object> <!-- comprobar si la lista de hijos del cabeza de familia contiene ESTA (THIS) persona --> <arguments> <this/> </arguments> </property> </derivation> </Attribute> </Class> </RuleSet>