This documentation is for WSO2 Business Rules Server 2.0.0.View documentation for the latest release.
Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 2 Next »

This section explains numerous methods of exposing a rule set as a Web service through a simple, example usecase: "Order Approval" sample, which is shown below. It is only a part of a large rule set of an order processing application.

Rules

Rule 1 : An order for stocks of Company A is accepted only if the number of stocks is higher than 10.
Rule 2 : An order for stocks of Company B is accepted only if the stock prize is higher than 100 $.
Rule 3 : An order for stocks of Company C is accepted only if the stock prize is higher than 50 $ and the number of stocks is lower than 200.           

Facts

The three rules above use validating orders. All three rules are based on a customer placing an order, and can be captured using a Java bean as follows.

 

package samples.userguide;
/**
* Represents the fact of a customer places an order 
*/
public class PlaceOrder {

       String symbol;
       int quantity;
       double price;

       public String getSymbol() {
           return symbol;
       }

       public void setSymbol(String symbol) {
           this.symbol = symbol;
       }

       public int getQuantity() {
           return quantity;
       }

       public void setQuantity(int quantity) {
           this.quantity = quantity;
       }

       public double getPrice() {
           return price;
       }

       public void setPrice(double price) {
           this.price = price;
       }
}

 

The result of the execution of the three rules above is either an OrderAccept or OrderReject, which can be captured using Java beans as follows.

package samples.userguide;
/**
* Order accept notification
*/
public class OrderAccept {

       private String message;

       public String getMessage() {
           return message;
       }

       public void setMessage(String message) {
           this.message = message;
       }
}            

package samples.userguide;
/**
* Order Reject Notification
*/
       public class OrderReject {

       private String reason;

       public String getReason() {
            return reason;
       }

       public void setReason(String reason) {
            this.reason = reason;
       }
}

 

Using above three rules, fact and result definitions, we can now define our rules using a rule language of a rule engine. WSO2 BRS is based on the JSR 94 Java Rule Specification and uses the open source Drools rule engine as the default JSR 94 provider. Let us write the rules of our example using Drools rule language.

Drools Rule File

package OrderApproval;

import samples.userguide.OrderAccept;
import samples.userguide.OrderReject;
import samples.userguide.PlaceOrder;

rule "Order Approval Rule" dialect "mvel" no-loop true salience 4

when
$placeOrder : PlaceOrder( ( symbol == "IBM" && quantity > 10 ) || ( symbol == "SUN" && price > 100 ) || ( symbol == "MSFT" && price > 50 && quantity < 200 ) )
then

OrderAccept orderAccept = new OrderAccept();
orderAccept.setMessage("Accepted order for: "+ $placeOrder.quantity + " stocks of "+
$placeOrder.symbol +" at$ " + $placeOrder.price);
insertLogical(orderAccept);

end

rule "IBM Order Deny Rule" dialect "mvel" no-loop true salience 3

when
not ( OrderAccept())
$placeOrder : PlaceOrder( symbol == "IBM" )
then
retract($placeOrder);
OrderReject orderReject = new OrderReject();
orderReject.setReason("An Order for stocks of IBM is accepted only if the number of stocks is higher than 10.");
insertLogical(orderReject);
end

rule "SUN Order Deny Rule" dialect "mvel" no-loop true salience 2
when
not ( OrderAccept())
$placeOrder : PlaceOrder( symbol == "SUN" )
then
retract($placeOrder);
OrderReject orderReject = new OrderReject();
orderReject.setReason("An Order for stocks of SUN is accepted only if the stock price is higher than 100 $.");
insertLogical(orderReject);
end

rule "MSFT Order Deny Rule" dialect "mvel" no-loop true salience 1
when
not ( OrderAccept())
$placeOrder : PlaceOrder( symbol == "MSFT" )
then
retract($placeOrder);
OrderReject orderReject = new OrderReject();
orderReject.setReason("An Order for stocks of MSFT is accepted only if the stock price is higher than 50 $ and the number of stocks is lower than 200.");
insertLogical(orderReject);
end

            

Creating and Deploying the Rule Service

There are two ways for creating a rule service using Admin Console : Rule Service Upload and Rule Service Wizard.

Rule Service Upload

This demonstrates how to use the rule service upload UI for deploying a rule service.

Step 1 : Create a valid jar containing the java classes of facts and results defined in the Order Approval Sample presented above.

Step 2 : Creating a rule service configuration. Please refer the Configuration Guide for writing a rule service configuration. The configuration required for the sample is shown bellow. It should name as service.rsl (Rule Service Language).

<ruleService
        name="OrderApprovalService"
        xmlns="http://wso2.org/carbon/rules"
        targetNamespace="http://com.test/orderApproval">
  <ruleSet>
        <rule resourceType="regular" sourceType="file">orderApprovalRules.drl</rule>
    </ruleSet>
    <operation name="placeOrder">
        <input wrapperElementName="placeOrder" namespace="http://com.test/placeorder">
            <fact elementName="order" namespace="http://com.test/placeorder" type="samples.userguide.PlaceOrder"></fact>
        </input>
        <output wrapperElementName="placeOrderRespone" namespace="http://com.test/placeorder">
            <fact elementName="orderAccept" namespace="http://com.test/placeorder" type="samples.userguide.OrderAccept"></fact>
            <fact elementName="orderReject" namespace="http://com.test/placeorder" type="samples.userguide.OrderReject"></fact>
        </output>
    </operation>
</ruleService>

ample.

  • No labels