Jede Java-Klasse im Klassenpfad Ihrer Anwendung kann als Datentyp in einem CER-Regelwerk verwendet werden.
CER enthält Typhandler für die am häufigsten verwendeten Datentypen.
Der Name einer Java-Klasse muss mit ihrem Paketnamen vollständig qualifiziert sein. Dies gilt jedoch nicht für Klassen in den folgenden Paketen:
<?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 does not need its package specified --> <javaclass name="Boolean"/> </type> <derivation> <specified/> </derivation> </Attribute> <Attribute name="dateOfBirth"> <type> <!-- Fully qualified name to a Cúram class --> <javaclass name="curam.util.type.Date"/> </type> <derivation> <specified/> </derivation> </Attribute> </Class> </RuleSet>
Eines der Hauptprinzipien von CER besteht darin, dass ein einmal berechneter Wert nicht geändert werden kann.
Zur Einhaltung dieses Prinzips müssen alle von Ihnen verwendeten Java-Klassen unveränderlich sein.
Glücklicherweise gibt es eine breite Palette von unveränderlichen Klassen, die normalerweise die meisten Anforderungen an Datentypen erfüllen können. Im Allgemeinen lässt sich anhand des Javadoc einer Java-Klasse feststellen, ob diese Klasse unveränderlich ist.
Die folgenden aufgelisteten unveränderlichen Klassen werden aller Wahrscheinlichkeit nach Ihre Anforderungen erfüllen:
CER erkennt die Übernahmehierarchie von Java-Klassen und -Schnittstellen.
CER lässt zu, dass immer dort der Wert einer Java-Klasse zurückgegeben wird, wo eine der übergeordneten Java-Klassen oder -Schnittstellen erwartet wird:
<?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> <!-- For the sake of example, returning this value as an java.lang.Object (which is unlikely to be useful in a "real" rule set. --> <javaclass name="Object"/> </type> <derivation> <!-- This is ok, as a Boolean *IS* an Object. --> <reference attribute="isMarried"/> </derivation> </Attribute> <Attribute name="isMarriedAsString"> <type> <javaclass name="String"/> </type> <derivation> <!-- The CER rule set validator would report the error below (as a Boolean *IS NOT* an String): 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"/> --> <!-- (Declaring as specified so that this example builds cleanly) --> <specified/> </derivation> </Attribute> </Class> </RuleSet>
In Java 5 wurde die Unterstützung von parametrisierten Klassen eingeführt. CER ermöglicht die Verwendung von parametrisierten Java-Klassen in Ihrem Regelwerk.
Die Parameter für eine parametrisierte Klasse werden einfach innerhalb der Deklaration von <javaclass> aufgelistet:
<?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> <!-- A list of Strings --> <javaclass name="List"> <javaclass name="String"/> </javaclass> </type> <derivation> <specified/> </derivation> </Attribute> <Attribute name="luckyNumbers"> <type> <!-- A list of Numbers --> <javaclass name="List"> <javaclass name="Number"/> </javaclass> </type> <derivation> <specified/> </derivation> </Attribute> <Attribute name="children"> <!-- A list of Person rule objects. Because java.util.List can be parameterized with any Object, we can use a rule class as a parameter. --> <type> <javaclass name="List"> <ruleclass name="Person"/> </javaclass> </type> <derivation> <specified/> </derivation> </Attribute> <!-- The dogs owned by this person. --> <Attribute name="dogs"> <type> <javaclass name="List"> <ruleclass name="Dog"/> </javaclass> </type> <derivation> <specified/> </derivation> </Attribute> <!-- The cats owned by this person. --> <Attribute name="cats"> <type> <javaclass name="List"> <ruleclass name="Cat"/> </javaclass> </type> <derivation> <specified/> </derivation> </Attribute> <!-- All the pets owned by this person. --> <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> <!-- all the dogs - dogs are a type of pet --> <reference attribute="dogs"/> <!-- all the cats - cats are a type of pet --> <reference attribute="cats"/> <!-- CER will not allow "children" in this expression; a child is not a pet regardless of whether he or she is adorable or claws the furniture. --> <!-- CANNOT BE USED --> <!-- <reference attribute="children"/> --> <!-- CANNOT BE USED --> </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> <!-- It's well known that every cat has 9 lives. --> <Number value="9"/> </derivation> </Attribute> </Class> </RuleSet>
CER ermöglicht die Verwendung jedes beliebigen Typs (inklusive Regelobjekte) für Parameter, die java.lang.Object zulassen. CER setzt die starke Typisierung selbst dann durch, wenn der Parameter (z. B. eine Regelklasse) dynamisch definiert ist. CER erkennt außerdem die Übernahmehierarchie von Regelklassen, wenn ermittelt wird, ob eine parametrisierte Klasse einer anderen Klasse zugeordnet werden kann.