property

Obtiene una propiedad de un objeto Java.

La expresión property especifica el nombre del método Java a llamar y:

La expresión property permite a CER aprovechar la potencia de las clases Java sin tener que replicar un subconjunto arbitrario de métodos como expresiones CER. Por ejemplo, java.util.List contiene un método size y por lo tanto CER no contiene ninguna expresión explícita para calcular el número de elementos de una lista.

Sin embargo, para satisfacer el principio de inmutabilidad de CER, sólo se puede llamar a los métodos Java que no modifican el "valor" de ningún objeto. CER sólo permite llamar a un método "property" si el método se incluye en la "lista segura" de métodos para la clase del objeto (o uno de las clases o interfaces ancestro).

Se considera que un método es seguro si se ha marcado explícitamente como tal en la lista segura. Si no está presente en la lista seguridad, el validador de conjunto de reglas CER emitirá un error.

Consejo: El establecimiento explícito de seguridad como false no es necesario, pero puede incluirse para completar la documentación, como sucede con las listas seguras que se incluyen con CER.

La lista segura para una clase es un archivo de propiedades en el mismo paquete que la clase, denominado <nombre_clase>_CREOLE.properties.

CER incluye listas seguras para las siguientes clases e interfaces Java:

Figura 1. Lista segura para métodos java.lang.Object
# Lista segura para java.lang.Object

# seguro
toString.safe=true

# forzar que se evalúe la igualdad utilizando <equals>
equals.safe=false

# no se exponen, aunque son "seguros"
hashCode.safe=false
getClass.safe=false
Figura 2. Lista segura para métodos java.lang.Number
# Lista segura para java.lang.Number

byteValue.safe=true
doubleValue.safe=true
floatValue.safe=true
intValue.safe=true
longValue.safe=true
shortValue.safe=true
Figura 3. Lista segura para métodos java.util.List
# 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

Para obtener una descripción de algunas de las propiedades útiles en la interfaz Java List, consulte Operaciones de lista útiles.

<?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>

    <!-- 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>

    <!-- Todos los hijos de esta persona, excluyendo el primer hijo.

         Utiliza la propiedad subList de lista, pasando:
         - (inclusive) del elemento en la posición "1" (que indica el segundo
           miembro de la lista; las listas en Java están basadas en cero)
         - (exclusive) al elemento en la posición "tamaño de la lista" (que indica
           la posición posterior al último elemento de la lista)
    -->
    <Attribute name="secondAndSubsequentChildren">
      <type>
        <javaclass name="List">
          <ruleclass name="Person"/>
        </javaclass>
      </type>
      <derivation>
        <property name="subList">
          <object>
            <reference attribute="children"/>
          </object>
          <arguments>
            <!-- El número se debe convertir en un entero
                 (como lo requiere 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>
PRECAUCIÓN:
Desde Cúram V6, CER y el Gestor de dependencias soportan el almacenamiento de los valores de atributo calculados en la base de datos, junto con el recálculo automático de valores de atributo si las dependencias cambian.

Si cambia la implementación de un método de propiedad, CER y el Gestor de dependencias no sabrán recalcular automáticamente los valores de atributo que se han calculado utilizando la versión antigua del método de propiedad.

Una vez que se ha utilizado un método de propiedad en un entorno de producción para valores de atributo almacenados, en lugar de cambiar la implementación deberá crear un nuevo método de propiedad (con la nueva implementación necesaria) y cambiar los conjuntos de reglas para utilizar el nuevo método de propiedad. Cuando publique los cambios de conjunto de regla para que apunten al nuevo método de propiedad, CER recalculará automáticamente todas las instancias de los valores de atributo afectados.