Skip to content

Instantly share code, notes, and snippets.

@danveloper
danveloper / Student.groovy
Created December 23, 2012 04:43
Example student entity for rules engine post
class Student {
enum DormHall {
Honors, Preferred, Normal
}
def firstName
def lastName
def gpa
// We only want dormHall to be assigned when it is deliberate, so throw an exception when
// it is accidentally assigned outside of our rules engine
@danveloper
danveloper / RulesEngineSupport.groovy
Created December 23, 2012 04:52
Rules engine support class for rules engine post
class RulesEngineSupport<E> {
RulesEngine engine
E obj
// Deduce the rule list for a given RulesEngine instance
def getRules() {
def rules = []
engine.class.declaredFields.each {
def field = engine."${it.name}"
if (!it.isSynthetic() && field instanceof Closure && it.name.endsWith("Rule")) {
@danveloper
danveloper / RulesEngineFactory.groovy
Created December 23, 2012 05:04
Rules engine factory example for rules engine post
class RulesEngineFactory<E extends RulesEngine> {
private final E engine
public RulesEngineFactory(final Class<E> c) {
this.engine = (E)c.newInstance()
this.engine.engine = this.engine
}
def getObject(final def obj) {
this.engine.obj = obj
this.engine
@danveloper
danveloper / RulesEngine.groovy
Created December 23, 2012 05:07
Rules engine interface for rules engine post
public interface RulesEngine {}
@danveloper
danveloper / EnrollmentProcessor.groovy
Created December 23, 2012 05:42
Enrollment processor for rules engine post
class EnrollmentProcessor {
static def enrollmentRulesFactory = new RulesEngineFactory<EnrollmentRulesEngine>(EnrollmentRulesEngine)
def studentService
def annualDormHallAssignment() {
def students = Student.list(/* do some filtering maybe to make sure they are enrolling for this year,etc. */)
def errors = []
students.each { student ->
try {
def studentEnrollmentRulesEngine = enrollmentRulesFactory.getObject(student)
@danveloper
danveloper / FullExample.groovy
Last active December 10, 2015 01:48
Full example for rules engine post
/**
*
* Structure:
* + module: model
* - class: com.danveloper.model.Student
*
**/
class Student {
enum DormHall {
Honors, Preferred, Normal
public enum PaymentVendor {
INTERNAL, STRIPE;
}
public class ProductOrder {
Account account;
Address shippingAddress;
PaymentMethod paymentMethod;
double taxRate = 0.0;
PaymentVendor paymentVendor = PaymentVendor.STRIPE;
public class Account {
String email;
int orderCount;
}
public class Address {
Object street, unit, city, state, zip;
}
public interface PaymentMethod {
enum PaymentMethodType {
GIFT_CARD, CREDIT_CARD
}
PaymentMethodType getType();
}
public class GiftCard implements PaymentMethod {
String number;