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.
CER incluye manejadores de tipo para la mayoría de los tipos de datos utilizados comúnmente.
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>
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.
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:
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>
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.