Add Easy Rules tutorial using Groovy beans with a Gradle build
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
|
||||
}
|
||||
|
||||
|
Binary file not shown.
@ -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…
Reference in New Issue