Wywoływanie reguł w jPALIO

Integracja JRules po stronie jPALIO wygląda następująco:

@WebServiceClient(name = "SncmWSRunnerImplService", targetNamespace = "http://SncmRuleApp/", 
wsdlLocation = "http://192.168.1.210:8080/jaxws-SncmRuleApp/SncmWS?wsdl") public class SncmWSRunnerImplService {....}
    static {
        URL url = null;
        try {
            url = new URL("http://192.168.1.210:8080/jaxws-SncmRuleApp/SncmWS?wsdl");
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        SNCMWSRUNNERIMPLSERVICE_WSDL_LOCATION = url;
    }

Wywołanie JRules w jDesignerze odbywa się przez wywołanie obiektu groovy. Przykładem takiego obiektu może być:

package application.jrules;

import java.util.LinkedList;
import java.util.List;

public class SncmWSRunnerClient {

    public static Double getProvisionFromJRules(final String flow, final Event event) {
        SncmWSRunner port = new SncmWSRunnerImplService().getSncmWSRunnerImplPort();
        return port.sncmRules(event, flow);
    }

    public static Event createEvent(
            final String entityCode, final double amount, final String eventDate,
            final String eventTypeCode, final String organizationCode, final String productCode,
            final List<String> parameterCodes, final List<String> parameterFieldType, final List<Object> parameterFieldValue) {
        Event eventItem = new Event();
        eventItem.setAmount(amount);
        eventItem.setEntityCode(entityCode);
        eventItem.setEventDate(eventDate);
        eventItem.setEventTypeCode(eventTypeCode);
        eventItem.setOrganizationCode(organizationCode);
        eventItem.setProductCode(productCode);
        List<Parameter> parameters = new LinkedList<Parameter>();
        if ((parameterCodes.size() == parameterFieldType.size()) &&
                (parameterCodes.size() == parameterFieldValue.size())) {
            for (int i = 0; i < parameterCodes.size(); ++i) {
                parameters.add(createParameter(parameterCodes.get(i), parameterFieldType.get(i), parameterFieldValue.get(i)));
            }
        } else {
            System.out.println("\nWrong parameter initialization");
            System.out.println("\n parameterCodessize= " + parameterCodes.size());
            System.out.println("\n parameterFieldType size= " + parameterFieldType.size());
            System.out.println("\n parameterFieldValue size= " + parameterFieldValue.size());
        }
        eventItem.setParameters(parameters);
        return eventItem;
    }

    private static Parameter createParameter(final String codeValue, final String field, Object value) {
        Parameter parameter = new Parameter();
        parameter.setCode(codeValue);
        if (field.equals("dateValue")) {
            parameter.setDateValue((String) value);
        } else if (field.equals("fractionalValue")) {
            parameter.setFractionalValue((Double) value);
        } else if (field.equals("numericValue")) {
            parameter.setNumericValue((Double) value);
        } else if (field.equals("textValue")) {
            parameter.setTextValue((String) value);
        } else {
            return null;
        }
        return parameter;
    }

    public Object run(String methodName, Object... methodArguments) {
        return this."$methodName"(*methodArguments)
    }

    public void run() {
    }
}

 

W tym groovy obiekcie metoda "getProvisionFromJRules" wywołuje reguły w przepływie o nazwie zdefiniowanej w atrybucie flow z parametrami zdefiniowanymi w parametrze event. Natomiast metody "run" pozwalają z poziomu jPALIO wywoływać groovy metodę "getProvisionFromJRules". Przykładem takiego wywołania z inicjacją parametrów może być:

 

$=(@parameterCodes, $util.emptyList())
$=(@parameterFieldType, $util.emptyList())
$=(@parameterFieldValue, $util.emptyList())

$util.add($@parameterCodes, "code1")
$util.add($@parameterFieldType, "dateValue")
$util.add($@parameterFieldValue, "2010-01-01 00:00:00")

$util.add($@parameterCodes, "code2")
$util.add($@parameterFieldType, "fractionalValue")
$util.add($@parameterFieldValue, 2.2)

$util.add($@parameterCodes, "code3")
$util.add($@parameterFieldType, "numericValue")
$util.add($@parameterFieldValue, 2)

$util.add($@parameterCodes, "code4")
$util.add($@parameterFieldType, "textValue")
$util.add($@parameterFieldValue, "Parameter->text value")

$try({
  $=(@commission, $toBigDecimal(
  	$toString($*application.jrules.SncmWSRunnerClient("getProvisionFromJRules", "multipliedFlow",
	  $*application.jrules.SncmWSRunnerClient("createEvent", "EntityCode", 100.0, 
	  "2010-01-01", "EventTypeCode", "OrganizationCode", "ProductCode", 
	  $@parameterCodes, $@parameterFieldType, $@parameterFieldValue)
	))
  ))	
  $@commission
}, {
	$error.stackTrace()
})