package com.example;
import com.example.model.Charge;
import com.example.model.Order;
import org.kie.api.KieServices;
import org.kie.api.builder.KieBuilder;
import org.kie.api.builder.KieFileSystem;
import org.kie.api.builder.KieRepository;
import org.kie.api.builder.Message.Level;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.kie.internal.io.ResourceFactory;
import java.util.ArrayList;
import java.util.List;
public class DecisionTableExample {
public static void main(String[] args) {
try {
// Setup KIE resources
KieServices kieServices = KieServices.Factory.get();
KieFileSystem kfs = kieServices.newKieFileSystem();
kfs.write(ResourceFactory.newClassPathResource("rules/ShippingCharges.drl.xlsx"));
KieBuilder kieBuilder = kieServices.newKieBuilder(kfs);
kieBuilder.buildAll();
if (kieBuilder.getResults().hasMessages(Level.ERROR)) {
throw new RuntimeException("Build Errors:\n" + kieBuilder.getResults().toString());
}
KieRepository kieRepository = kieServices.getRepository();
KieContainer kieContainer = kieServices.newKieContainer(kieRepository.getDefaultReleaseId());
// Create a new session and run test scenarios
testShippingCharge(kieContainer, 2, 150.0, 1, "Next-day shipping, under $300, 2 items");
testShippingCharge(kieContainer, 5, 150.0, 2, "2-day shipping, under $300, 5 items");
testShippingCharge(kieContainer, 3, 350.0, 3, "Standard shipping, over $300, 3 items");
testShippingCharge(kieContainer, 5, 400.0, 5, "Standard shipping, over $300, 5 items (free)");
} catch (Exception e) {
e.printStackTrace();
}
}
private static void testShippingCharge(KieContainer kieContainer, int items, double total, int days, String description) {
System.out.println("\nTesting: " + description);
// Create a new session for each test to avoid rule interference
KieSession kieSession = kieContainer.newKieSession();
// Create a new order with the test parameters
Order order = new Order(items, total, days);
System.out.printf("Order: %d items, $%.2f total, %d delivery days\n",
order.getItemsCount(), order.getTotal(), order.getDeliverInDays());
// Insert the facts and fire the rules
kieSession.insert(order);
kieSession.fireAllRules();
// Collect and display results
List<Charge> charges = new ArrayList<>();
kieSession.getObjects(obj -> obj instanceof Charge)
.forEach(obj -> charges.add((Charge) obj));
if (charges.isEmpty()) {
System.out.println("No shipping charge calculated!");
} else {
System.out.printf("Shipping Charge: $%.2f\n", charges.get(0).getAmount());
}
// Clean up
kieSession.dispose();
}
}