Add Easy Rules tutorial using Groovy beans with a Gradle build

pull/76/head
Will Gilbert 8 years ago
parent e0868d6757
commit 1853c10e0f

@ -0,0 +1,41 @@
# EasyRules-Gradle
## [Easy Rules](http://www.easyrules.org) and [Java/Maven Tutorials](https://github.com/EasyRules/easyrules-tutorials)
### Usage:
NB: Use '--quiet' or '-q' to supress Gradle build output lines
./gradlew usage
Prints following usage to the console
./gradlew FizzBuzz
Baseline FizzBuzz using code.
Prints the numbers from 1 to 100. But for multiples of 3 print 'Fizz' instead
of the number and for the multiples of 5 print 'Buzz'. For numbers which are
multiples of both three and five print 'FizzBuzz'.
./gradlew FizzBuzzER
FizzBuzz implementation using EasyRules.
./gradlew Simple
Very simple EasyRules examples with one, always true, rule.
./gradlew HelloWorld -q
Obligatory 'Hello, world' example where the input is evaluated by a rule.
./gradlew Shop -P person=Tommy -P age=15
Rule to evaluate drinking age (US 21); Nmae and age can be passed in via the command line
or system properties; Default is 'Tom' at age '17'.
./gradlew Scheduling -q
A rule which implements scheduling; Reports when the time seconds count is even
./gradlew Spring
Similiar to 'Simple' but the rule is injected by Spring
./gradlew clean
Remove all reports and artifacts from './build'

@ -0,0 +1,137 @@
//=============================================================================================
// U S A G E ================================================================================
//=============================================================================================
task usage doLast { print """${'='*90}
Easy Rules Tutorials (http://www.easyrules.org)
NB: Use '--quiet' or '-q' to supress Gradle build output lines
./gradlew FizzBuzz
Baseline FizzBuzz using code.
Prints the numbers from 1 to 100. But for multiples of 3 print 'Fizz' instead
of the number and for the multiples of 5 print 'Buzz'. For numbers which are
multiples of both three and five print 'FizzBuzz'.
./gradlew FizzBuzzER
FizzBuzz implementation using EasyRules.
./gradlew Simple
Very simple EasyRules examples with one, always true, rule.
./gradlew HelloWorld -q
Obligatory 'Hello, world' example where the input is evaluated by a rule.
./gradlew Shop -P person=Tommy -P age=15
Rule to evaluate drinking age (US 21); Nmae and age can be passed in via the command line
or system properties; Default is 'Tom' at age '17'.
./gradlew Scheduling -q
A rule which implements scheduling; Reports when the time seconds count is even
./gradlew Spring
Similiar to 'Simple' but the rule is injected by Spring
./gradlew clean
Remove all reports and artifacts from './$project.buildDir.name'
${'='*90}
"""}
//============================================================================================
// P L U G I N S ===========================================================================
//============================================================================================
apply plugin: 'groovy'
//=============================================================================================
// C O N F I G U R A T I O N =================================================================
//=============================================================================================
sourceCompatibility = 1.8
targetCompatibility = sourceCompatibility
//=============================================================================================
// R e p o s i t o r i e s & D e p e n d e n c i e s ====================================
//=============================================================================================
repositories {
mavenLocal()
mavenCentral()
}
dependencies {
def easyRules = '2.4.0' // Apr 2017
def spring = '4.3.6.RELEASE' // Apr 2017
def groovy = '2.4.10' // Apr 2017
compile ([
"org.easyrules:easyrules-core:$easyRules",
"org.easyrules:easyrules-quartz:$easyRules",
"org.easyrules:easyrules-spring:$easyRules",
"org.springframework:spring-context-support:$spring",
"org.codehaus.groovy:groovy-all:$groovy"
])
}
sourceSets {
compile {
groovy {
srcDirs = ['src/main/groovy']
}
}
}
//============================================================================================
// R U N T U T O R I A L S ===============================================================
//============================================================================================
tasks.withType(JavaExec) {
standardInput = System.in
}
task FizzBuzz (dependsOn: 'classes', type: JavaExec) {
main = 'org.easyrules.samples.fizzbuzz.FizzBuzz'
classpath = sourceSets.main.runtimeClasspath
}
task FizzBuzzER (dependsOn: 'classes', type: JavaExec) {
main = 'org.easyrules.samples.fizzbuzz.FizzBuzzWithEasyRules'
classpath = sourceSets.main.runtimeClasspath
}
task Simple (dependsOn: 'classes', type: JavaExec) {
main = 'org.easyrules.samples.simple.Launcher'
classpath = sourceSets.main.runtimeClasspath
}
task HelloWorld (dependsOn: 'classes', type: JavaExec) {
main = 'org.easyrules.samples.helloworld.Launcher'
classpath = sourceSets.main.runtimeClasspath
}
task Scheduling (dependsOn: 'classes', type: JavaExec) {
main = 'org.easyrules.samples.scheduling.Launcher'
classpath = sourceSets.main.runtimeClasspath
}
task Shop (dependsOn: 'classes', type: JavaExec) {
main = 'org.easyrules.samples.shop.Launcher'
classpath = sourceSets.main.runtimeClasspath
args = [
findProperty('person') ?: 'Tom',
findProperty('age') ?: '14'
]
}
task Spring (dependsOn: 'classes', type: JavaExec) {
main = 'org.easyrules.samples.spring.Launcher'
classpath = sourceSets.main.runtimeClasspath
}

@ -0,0 +1,6 @@
#Mon May 15 07:42:47 EDT 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.5-bin.zip

@ -0,0 +1,172 @@
#!/usr/bin/env sh
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn ( ) {
echo "$*"
}
die ( ) {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Escape application args
save ( ) {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=$(save "$@")
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
cd "$(dirname "$0")"
fi
exec "$JAVACMD" "$@"

@ -0,0 +1,84 @@
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

@ -0,0 +1,21 @@
package org.easyrules.samples.fizzbuzz
import org.easyrules.annotation.Action
import org.easyrules.annotation.Condition
import org.easyrules.annotation.Priority
import org.easyrules.annotation.Rule
@Rule
class BuzzRule {
def input
@Condition
boolean when() { input % 5 == 0 }
@Action
def then() { print 'buzz' }
@Priority
int getPriority() { 2 }
}

@ -0,0 +1,28 @@
package org.easyrules.samples.fizzbuzz
class FizzBuzz {
static void main(String... args) {
def label = 'FIZZBUZZ WITH CODE'.replaceAll(/./){it+' '}
def width = 80
println """${'='*width}
|${label.center width }
|${'='*width}""".stripMargin()
// Ultra compact, show-off, version in 59 characters
// 1.upto(100){println((it%3?'':'Fizz')+(it%5?'':'Buzz')?:it)}
// Easier to follow
(1..100).each {
def string = ''
if (it%3 == 0) {string = 'Fizz'}
if (it%5 == 0) {string += 'Buzz'}
println string ? string : it
}
}
}

@ -0,0 +1,13 @@
package org.easyrules.samples.fizzbuzz
import org.easyrules.core.CompositeRule
class FizzBuzzRule extends CompositeRule {
FizzBuzzRule(Object... rules) {
rules.each { addRule it }
}
@Override
int getPriority() { 0 }
}

@ -0,0 +1,43 @@
package org.easyrules.samples.fizzbuzz
import org.easyrules.core.RulesEngineBuilder
class FizzBuzzWithEasyRules {
static void main(String... args) {
def label = 'FIZZBUZZ WITH EASYRULES'.replaceAll(/./){it+' '}
def width = 80
println """${'='*width}
|${label.center width }
|${'='*width}""".stripMargin()
// Create rules engine
def fizzBuzzEngine = RulesEngineBuilder.aNewRulesEngine()
.withSkipOnFirstAppliedRule(true)
.withSilentMode(true)
.build()
// Create rules
def fizzRule = new FizzRule()
def buzzRule = new BuzzRule()
def nonFizzBuzzRule = new NonFizzBuzzRule()
def fizzBuzzRule = new FizzBuzzRule(fizzRule, buzzRule)
// Register all rules
fizzBuzzEngine.registerRule(fizzRule)
fizzBuzzEngine.registerRule(buzzRule)
fizzBuzzEngine.registerRule(fizzBuzzRule)
fizzBuzzEngine.registerRule(nonFizzBuzzRule)
// Fire rules
(1..100).each { input ->
fizzRule.input = input
buzzRule.input = input
nonFizzBuzzRule.input = input
fizzBuzzEngine.fireRules()
println()
}
}
}

@ -0,0 +1,21 @@
package org.easyrules.samples.fizzbuzz
import org.easyrules.annotation.Action
import org.easyrules.annotation.Condition
import org.easyrules.annotation.Priority
import org.easyrules.annotation.Rule
@Rule
class FizzRule {
def input
@Condition
boolean when() { input % 3 == 0 }
@Action
def then() { print 'fizz' }
@Priority
int getPriority() { 1 }
}

@ -0,0 +1,21 @@
package org.easyrules.samples.fizzbuzz
import org.easyrules.annotation.Action
import org.easyrules.annotation.Condition
import org.easyrules.annotation.Priority
import org.easyrules.annotation.Rule
@Rule
class NonFizzBuzzRule {
def input
@Condition
boolean when() { input % 5 != 0 || input % 7 != 0 }
@Action
def then() { print input }
@Priority
int getPriority() { 3 }
}

@ -0,0 +1,20 @@
package org.easyrules.samples.helloworld
import org.easyrules.annotation.Action
import org.easyrules.annotation.Condition
import org.easyrules.annotation.Rule
@Rule(name = "Hello World rule", description = "Say Hello to duke's friends only")
class HelloWorldRule {
def input
// The rule should be applied only if the user's response is yes (Duke's friend)
@Condition
boolean when() { input.equalsIgnoreCase 'yes' }
// When rule conditions are satisfied, print 'Hello duke's friend!' to the console
@Action
def then() throws Exception { println 'Hello Duke\'s friend!' }
}

@ -0,0 +1,29 @@
package org.easyrules.samples.helloworld
import static org.easyrules.core.RulesEngineBuilder.aNewRulesEngine
import java.util.Scanner
class Launcher {
static void main(String... args) {
def label = 'HELLO WORLD EXAMPLE'.replaceAll(/./){it+' '}
def width = 80
println """${'='*width}
|${label.center width }
|${'='*width}""".stripMargin()
def scanner = new Scanner(System.in)
print("Are you a friend of Duke? [yes/no]: ")
def input = scanner.nextLine()
def rule = new HelloWorldRule()
rule.input = input.trim()
def rulesEngine = aNewRulesEngine().build()
rulesEngine.registerRule(rule)
rulesEngine.fireRules()
}
}

@ -0,0 +1,39 @@
package org.easyrules.samples.scheduling
import org.easyrules.core.RulesEngineBuilder
import org.easyrules.quartz.RulesEngineScheduler
import java.util.Date
class Launcher {
static final Date NOW = new Date()
static final int EVERY_SECOND = 1
static void main(String... args) throws Exception {
def label = 'SCHEDULING WITH EASY RULES'.replaceAll(/./){it+' '}
def width = 80
println """${'='*width}
|${label.center width }
|${'='*width}""".stripMargin()
def rulesEngine = RulesEngineBuilder.aNewRulesEngine()
.named("time rules engine")
.withSilentMode(true)
.build()
def timeRule = new TimeRule()
rulesEngine.registerRule(timeRule)
def scheduler = RulesEngineScheduler.getInstance()
scheduler.scheduleAtWithInterval(rulesEngine, NOW, EVERY_SECOND)
scheduler.start()
println '\nPress "Return" to stop the application\n'
System.in.read()
scheduler.stop()
}
}

@ -0,0 +1,23 @@
package org.easyrules.samples.scheduling
import org.easyrules.annotation.Action
import org.easyrules.annotation.Condition
import org.easyrules.annotation.Rule
import java.util.Date
@Rule(name = "time rule", description = "Print the current time only if seconds are even")
class TimeRule {
def now
@Condition
boolean when() {
now = new Date()
now.getSeconds() % 2 == 0
}
@Action
void then() { println "Seconds in ${now.getSeconds()} are even" }
}

@ -0,0 +1,27 @@
package org.easyrules.samples.shop
import org.easyrules.core.BasicRule
public class AgeRule extends BasicRule {
private static final int ADULT_AGE = 21
def person
public AgeRule(person) {
super('AgeRule', "Check if person's age is $ADULT_AGE or over and marks the person as adult", 1)
this.person = person
}
@Override
public boolean evaluate() {
return person.age >= ADULT_AGE
}
@Override
public void execute() {
person.adult = true
println "Person $person.name has been marked as adult"
}
}

@ -0,0 +1,34 @@
package org.easyrules.samples.shop
import static org.easyrules.core.RulesEngineBuilder.aNewRulesEngine
import org.easyrules.api.RulesEngine
class Launcher {
static void main(String... args) {
println "${'='*90}"
println ' S H O P W I T H E A S Y R U L E S '
println "${'='*90}"
// Create a person instance
Person person = new Person(name:args[0], age: args[1] as int)
println "$person.name: Hi! can I have some Vodka please?"
// Create a rules engine
RulesEngine rulesEngine = aNewRulesEngine()
.named("shop rules engine")
.build()
// Register rules
rulesEngine.registerRule(new AgeRule(person))
rulesEngine.registerRule(new OkToSellRule(person))
rulesEngine.registerRule(new UnderAgeRule(person))
// Fire rules
rulesEngine.fireRules()
}
}

@ -0,0 +1,26 @@
package org.easyrules.samples.shop
import org.easyrules.annotation.Action
import org.easyrules.annotation.Condition
import org.easyrules.core.BasicRule
class OkToSellRule extends BasicRule {
def person
OkToSellRule(person) {
super('OkToSellRule', 'Adults are allowed to buy alcohol', 2)
this.person = person
}
@Condition
boolean evaluate() {
person.adult == true
}
@Action
void execute(){
println "Shop Owner: Ok, $person.name, here you go."
}
}

@ -0,0 +1,13 @@
package org.easyrules.samples.shop
import groovy.transform.TupleConstructor
import groovy.transform.EqualsAndHashCode
@TupleConstructor
@EqualsAndHashCode(includes='name,age')
class Person {
def name
def age
boolean adult
}

@ -0,0 +1,26 @@
package org.easyrules.samples.shop
import org.easyrules.annotation.Action
import org.easyrules.annotation.Condition
import org.easyrules.core.BasicRule
class UnderAgeRule extends BasicRule {
def person
UnderAgeRule(person) {
super('UnderAgeRule', 'Children are not allowed to buy alcohol', 2)
this.person = person
}
@Condition
boolean evaluate() {
person.adult == false
}
@Action
void execute(){
println "Shop Owner: Sorry $person.name, you are not allowed to buy alcohol."
}
}

@ -0,0 +1,26 @@
package org.easyrules.samples.simple
import static org.easyrules.core.RulesEngineBuilder.aNewRulesEngine
class Launcher {
static void main(String... args) {
def label = 'FIRE A BASIC RULE'.replaceAll(/./){it+' '}
def width = 80
println """${'='*width}
|${label.center width }
|${'='*width}""".stripMargin()
// Create a rules engine
def rulesEngine = aNewRulesEngine().build()
// Register rules
rulesEngine.registerRule(new SimpleRule())
// Fire rules
rulesEngine.fireRules()
}
}

@ -0,0 +1,17 @@
package org.easyrules.samples.simple
import org.easyrules.annotation.Action
import org.easyrules.annotation.Condition
import org.easyrules.annotation.Priority
import org.easyrules.annotation.Rule
@Rule
public class SimpleRule {
@Condition
public boolean when() { true }
@Action
public void then() { println "Easy Rules rocks!" }
}

@ -0,0 +1,16 @@
package org.easyrules.samples.spring
import org.easyrules.annotation.Action
import org.easyrules.annotation.Condition
import org.easyrules.annotation.Rule
@Rule(name = "dummy rule")
class DummyRule {
@Condition
boolean when() { true }
@Action
def then() { println 'Hey, I\'m managed by Spring'}
}

@ -0,0 +1,24 @@
package org.easyrules.samples.spring
import org.easyrules.api.RulesEngine
import org.springframework.context.support.ClassPathXmlApplicationContext
class Launcher {
static void main(String... args) throws Exception {
def label = 'SPRING INJECTING EASY RULES'.replaceAll(/./){it+' '}
def width = 80
println """${'='*width}
|${label.center width }
|${'='*width}""".stripMargin()
def context = new ClassPathXmlApplicationContext("org/easyrules/samples/spring/application-context.xml")
def rulesEngine = (RulesEngine) context.getBean("rulesEngine")
rulesEngine.fireRules()
}
}

@ -0,0 +1,16 @@
# "handlers" specifies a comma separated list of log Handler classes.
#handlers=java.util.logging.ConsoleHandler
# Default global logging level
.level=ALL
# Console logging
java.util.logging.ConsoleHandler.level = ALL
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.SimpleFormatter.format=%4$s: %5$s%n
# package specific logging
org.easyrules.core.level = ALL

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- configure rule -->
<bean id="rule" class="org.easyrules.samples.spring.DummyRule" scope="prototype"/>
<!-- configure rules engine -->
<bean id="rulesEngine" class="org.easyrules.spring.RulesEngineFactoryBean">
<property name="rules">
<list>
<ref bean="rule"/>
</list>
</property>
</bean>
</beans>
Loading…
Cancel
Save