Llama a un método Java estático para realizar un cálculo complejo.
La expresión call declara:
El tipo de datos del valor devuelto (consulte Tipos de datos soportados) y
Una lista de valores para pasar como argumentos.
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.
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>
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.