Desarrollo de métodos estáticos

CER tiene soporte para muchas expresiones que probablemente proporcionan los cálculos que necesita.

Si tiene un cálculo de negocio que no se puede implementar utilizando expresiones de CER, CER soporta la expresión call para permitirle llamar desde el conjunto de reglas a un método estático en una clase Java personalizada. El Editor CER proporciona pocos elementos de regla, por ejemplo "call" para permitir a los usuarios definir un método estático en una clase Java personalizada. Consulte el elemento de regla "call" en Llamar.

A continuación se muestra un conjunto de reglas de ejemplo que llama a un método Java:

<?xml version="1.0" encoding="UTF-8"?>
<RuleSet name="Example_StaticMethodDevelopment"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation=
"http://www.curamsoftware.com/CreoleRulesSchema.xsd">
  <Class name="Income">

    <Attribute name="paymentReceivedDate">
      <type>
        <javaclass name="curam.util.type.Date"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <Attribute name="amount">
      <type>
        <javaclass name="Number"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

  </Class>

  <Class name="Person">

    <Attribute name="incomes">
      <type>
        <javaclass name="List">
          <ruleclass name="Income"/>
        </javaclass>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <Attribute name="mostRecentIncome">
      <type>
        <ruleclass name="Income"/>
      </type>
      <derivation>
        <!-- En el primer desarrollo, se utilizaría el método
             identifyMostRecentIncome_StronglyTyped.

             En la práctica, no mantendrá dos versiones de
             cada método; simplemente debilitará los tipos de
             argumento y retorno y conservará un solo método.
          -->

        <call class="curam.creole.example.BestPracticeDevelopment"
          method="identifyMostRecentIncome_WeaklyTyped">
          <type>
            <ruleclass name="Income"/>
          </type>
          <arguments>
            <this/>
          </arguments>
        </call>
      </derivation>
    </Attribute>
  </Class>

</RuleSet>

Cuando desarrolle el método estático, puede empezar utilizando clases Java generadas de CER como tipos de argumento y/o tipo de retorno para el método:

package curam.creole.example;

import java.util.List;

import curam.creole.execution.session.Session;
import
 curam.creole.ruleclass.Example_StaticMethodDevelopment.impl.Income;
import
 curam.creole.ruleclass.Example_StaticMethodDevelopment.impl.Person;

public class BestPracticeDevelopment {

  /**
   * Identifica los ingresos más recientes de una persona.
   *
   * Tenga en cuenta que este cálculo puede realizarse utilizando
   * expresiones CER, pero se muestra aquí en Java sólo para ilustrar el
   * uso de tipos generados al desarrollar de métodos Java estáticos para
   * el uso con CER.
   *
   * Este método es adecuado sólo para su uso en el desarrollo; para
   * producción, consulte
   * {@linkplain #identifyMostRecentIncome_WeaklyTyped} más abajo.
   *
   * En la práctica, no mantendrá dos versiones de cada
   * método; simplemente debilitará los tipos de argumento y retorno
   * y mantendrá un solo método.
   */
  public static Income identifyMostRecentIncome_StronglyTyped(
      final Session session, final Person person) {

    Income mostRecentIncome = null;
    final List<? extends Income> incomes =
        person.incomes().getValue();
    for (final Income current : incomes) {
      if (mostRecentIncome == null
          || mostRecentIncome.paymentReceivedDate().getValue()
              .before(current.paymentReceivedDate().getValue())) {
        mostRecentIncome = current;
      }
    }

    return mostRecentIncome;
  }
}

Una vez que el método Java funciona de forma satisfactoria, debe debilitar los tipos para utilizar objetos de regla dinámicos en lugar de las clases Java generadas (que no deben utilizarse en un entorno de producción):

/**
   * Identifica los ingresos más recientes de una persona.
   *
   * Tenga en cuenta que este cálculo puede realizarse utilizando
   * expresiones CER, pero se muestra aquí en Java sólo para ilustrar el
   * uso de tipos generados al desarrollar de métodos Java estáticos para
   * el uso con CER.
   *
   * Este método es adecuado sólo para utilizarse en producción; para el
   * desarrollo inicial, consulte
   * {@linkplain #identifyMostRecentIncome_StronglyTyped} más arriba.
   *
   * En la práctica, no mantendrá dos versiones de cada
   * método; simplemente debilitará los tipos de argumento y retorno
   * y mantendrá un solo método.
   */
  public static RuleObject identifyMostRecentIncome_WeaklyTyped(
      final Session session, final RuleObject person) {

    RuleObject mostRecentIncome = null;
    final List<? extends RuleObject> incomes =
        (List<? extends RuleObject>) person.getAttributeValue(
            "incomes").getValue();
    for (final RuleObject current : incomes) {
      if (mostRecentIncome == null
          || ((Date) mostRecentIncome.getAttributeValue(
              "paymentReceivedDate").getValue())
              .before((Date) current.getAttributeValue(
                  "paymentReceivedDate").getValue())) {
        mostRecentIncome = current;
      }
    }

    return mostRecentIncome;

  }
PRECAUCIÓN:
Si cambia la implementación de un método estático, CER no sabrá automáticamente volver a calcular los valores de atributo que se han calculado utilizando la versión antigua del método estático.

Una vez que se ha utilizado un método estático en un entorno de producción para los valores de atributo almacenados, en lugar de cambiar la implementación deberá crear un método estático nuevo (con la nueva implementación necesaria) y cambiar los conjuntos de reglas para utilizar el método estático nuevo. Al publicar los cambios de conjunto de reglas para apuntar al nuevo método estático, CER volverá a calcular automáticamente todas las instancias de los valores de atributo afectados.

Cualquier método estático (o método de propiedad) invocado desde CER: