call

Llama a un método Java estático para realizar un cálculo complejo.

La expresión call declara:

El método Java debe estar en una clase que esté en la vía de acceso de clases en el momento de la validación del conjunto de reglas. El primer argumento en el método debe ser un objeto Session y los argumentos restantes deben coincidir con los especificados en el conjunto de reglas.

aviso: Debe asegurarse de que cualquier código Java invocado por una expresión call no intenta modificar ningún valor en los atributos de objeto de regla.

En general, los conjuntos de reglas de CER utilizan tipos de datos inmutables, pero es posible utilizar sus propias clases Java mutables como tipos de datos; si es así, es su responsabilidad asegurarse de que ningún código invocado hace que se modifique el valor de un tipo de datos Java personalizado, porque si esto sucediera podría significar que los cálculos previamente realizados serían ahora "incorrectos".

package curam.creole.example;

import curam.creole.execution.RuleObject;
import curam.creole.execution.session.Session;

public class Statics {

  /**
   * Calcula el color favorito de una persona.
   *
   * Este cálculo es demasiado complejo para las reglas y por lo tanto se ha
   * codificado en java.
   *
   * @param session
   *          La sesión de regla
   * @param person
   *          la persona
   * @return el color favorito calculado de la persona especificada
   */
  public static String calculateFavoriteColor(
      final Session session, final RuleObject person) {

    // Tenga en cuenta que la recuperación del valor de atributo debe
    // convertirse al tipo correcto
    final String name =
        (String) person.getAttributeValue("name").getValue();
    final Number age =
        (Number) person.getAttributeValue("age").getValue();

    final String ageString = age.toString();
    // Calcular el color favorito del persona de acuerdo
    // con los dígitos en la edad y el nombre
    if (ageString.contains("5") || ageString.contains("7")) {
      return "Blue";
    } else if (name.contains("z")) {
      return "Purple";
    } else {
      return "Green";
    }

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

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

    <Attribute name="name">
      <type>
        <javaclass name="String"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <Attribute name="favoriteColor">
      <type>
        <javaclass name="String"/>
      </type>
      <derivation>
        <!-- Llamar a un método Java estático
             para efectuar el cálculo -->
        <call class="curam.creole.example.Statics"
          method="calculateFavoriteColor">
          <type>
            <javaclass name="String"/>
          </type>
          <arguments>
            <!-- Pasar esta persona
                 como argumento del
                 método estático -->
            <this/>
          </arguments>
        </call>
      </derivation>
    </Attribute>

  </Class>

</RuleSet>
PRECAUCIÓN:
Desde Cúram V6, CER y el Gestor de dependencias soportan el recálculo automático de valores calculados por CER si cambian sus dependencias.

Si cambia la implementación de un método estático, CER y el Gestor de dependencias no sabrán recalcular automáticamente los valores de atributo que se han calculado utilizando la versión anterior 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. Cuando publique los cambios de conjunto de reglas para que apunten al nuevo método estático, CER y el Gestor de dependencias recalcularán automáticamente todas las instancias de los valores de atributo afectados.