Clases Java

Cualquier clase Java en la vía de acceso de clases de la aplicación puede utilizarse como un tipo de datos en el conjunto de reglas CER.

PRECAUCIÓN:
Al almacenar objetos de regla en la base de datos, sólo se pueden utilizar los tipos de datos para los que existe un manejador de tipos registrado en CER.

CER incluye manejadores de tipo para la mayoría de los tipos de datos utilizados comúnmente.

Nombres de paquete

El nombre de una clase Java debe estar completo con el nombre de paquete, excepto para las clases de los paquetes siguientes:

<?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>
        <!-- java.lang.Boolean no necesita que se
             especifique el paquete -->
        <javaclass name="Boolean"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <Attribute name="dateOfBirth">
      <type>
        <!-- Nombre completo para una clase de Cúram -->
        <javaclass name="curam.util.type.Date"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>


  </Class>

</RuleSet>
Consejo: Los tipos Java primitivos como boolean no se pueden utilizar en CER; en su lugar, utilice los equivalentes de clase (por ejemplo Boolean).

Objetos inmutables

Un principio básico de CER es que cada valor, una vez calculado, no se puede cambiar.

Para cumplir con este principio, las clases Java que utilice deben ser inmutables.

aviso: Si utiliza una clase Java mutable como tipo de datos en el conjunto de reglas CER, debe asegurarse de que ningún código Java intenta modificar el valor de los objetos de esa clase Java. CER no puede garantizar la fiabilidad de los cálculos si los valores se están cambiando "por debajo".

Afortunadamente, hay una amplia gama de clases inmutables que se proporciona normalmente para la mayoría de los requisitos de tipo de datos. En general es posible que necesite examinar el JavaDoc de una clase Java para determinar si es inmutable.

A continuación se listan algunas clases inmutables útiles que probablemente serán suficientes para sus necesidades:

Herencia

CER reconoce la jerarquía de herencia de clases e interfaces Java.

CER permitirá que un valor de una clase Java se devuelva en cualquier lugar en el que se espere una de las clases o interfaces Java de ancestro:

<?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>
        <!-- Para simplificar el ejemplo, devolviendo este
             valor como un java.lang.Object (lo que no es
             probable que sea útil en un conjunto de
             reglas "real". -->
        <javaclass name="Object"/>
      </type>
      <derivation>
        <!-- Esto es correcto, porque un Booleano es (*IS*) un objeto.-->
        <reference attribute="isMarried"/>
      </derivation>
    </Attribute>

    <Attribute name="isMarriedAsString">
      <type>
        <javaclass name="String"/>
      </type>
      <derivation>
        <!-- El validador de conjunto de reglas CER, informará del error
             siguiente (porque un Boolean no es (*IS NOT*) una serie):

             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"/> -->

        <!-- (Declarar como especificado de forma que este ejemplo
              se cree de manera limpia) -->
        <specified/>

      </derivation>
    </Attribute>

  </Class>

</RuleSet>

Clases parametrizadas

Java 5 presentaba el soporte para clases parametrizadas y CER le permite utilizar clases Java parametrizadas en el conjunto de reglas.

Los parámetros para una clase parametrizada se listan simplemente en la declaración <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>
        <!-- Una lista de series -->
        <javaclass name="List">
          <javaclass name="String"/>
        </javaclass>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <Attribute name="luckyNumbers">
      <type>
        <!-- Una lista de números -->
        <javaclass name="List">
          <javaclass name="Number"/>
        </javaclass>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <Attribute name="children">
      <!-- Una lista de objetos de regla de persona.

           Dado que java.util.List se puede parametrizar con
           cualquier objeto, podemos utilizar una clase de regla como parámetro.
      -->
      <type>
        <javaclass name="List">
          <ruleclass name="Person"/>
        </javaclass>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>


    <!-- Los perros que son propiedad de esta persona. -->
    <Attribute name="dogs">
      <type>
        <javaclass name="List">
          <ruleclass name="Dog"/>
        </javaclass>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <!-- Los gatos que son propiedad de esta persona.-->
    <Attribute name="cats">
      <type>
        <javaclass name="List">
          <ruleclass name="Cat"/>
        </javaclass>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>


    <!-- Todas las mascotas que son propiedad de esta persona.-->
    <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>
              <!-- todos los perros - los perros son un tipo de mascota -->
              <reference attribute="dogs"/>
              <!-- todos los gatos - los gatos son un tipo de mascota -->
              <reference attribute="cats"/>

              <!-- CER no permitirá "children" en esta
                   expresión; un niño no es una mascota independientemente
                   de que sea adorable o arañe
                   los muebles. -->
              <!-- NO SE PUEDE UTILIZAR -->
              <!-- <reference attribute="children"/> -->
              <!-- NO SE PUEDE UTILIZAR -->

            </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>
        <!-- Todo el mundo sabe que los gatos
             tienen 9 vidas.-->
        <Number value="9"/>
      </derivation>
    </Attribute>

  </Class>

</RuleSet>

CER le permite utilizar cualquier tipo (incluidos los objetos de regla) para los parámetros que permiten java.lang.Object. CER aplicará "tipificación firme" aunque el parámetro (por ejemplo, una clase de regla) se define dinámicamente. CER también reconocerá la jerarquía de herencia de las clases de reglas al decidir si una clase parametrizada es asignable a otra.