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>