Java-Klassen

Jede Java-Klasse im Klassenpfad Ihrer Anwendung kann als Datentyp in einem CER-Regelwerk verwendet werden.

Vorsicht:
Beim Speichern von Regelobjekten in der Datenbank können Sie nur Datentypen verwenden, für die bei CER ein Typhandler registriert ist.

CER enthält Typhandler für die am häufigsten verwendeten Datentypen.

Paketnamen

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>
Tipp: Primitive Java-Typen wie beispielsweise boolean können in CER nicht verwendet werden. Verwenden Sie stattdessen die entsprechenden Klassenäquivalente (z. B. Boolean).

Unveränderliche Objekte

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.

Achtung: Falls Sie eine veränderliche Java-Klasse in Ihrem CER-Regelwerk als Datentyp verwenden, müssen Sie sicherstellen, dass kein Java-Code versucht, den Wert eines Objekts dieser Java-Klasse zu ändern. CER kann die Zuverlässigkeit von Berechnungen nicht gewährleisten, wenn zugrunde liegende Werte geändert werden.

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:

Übernahme

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>

Parametrisierte Klassen

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.