EasyFlow 1.3 is out (12 Dec 2013)
- refactored to use Java enums for states and events
- added new example
EasyFlow is a simple and lightweight Finite State Machine for Java
With EasyFlow you can:
- implement complex logic but keep your code simple and clean
- handle asynchronous calls with ease and elegance
- avoid concurrency by using event-driven programming approach
- avoid StackOverflow error by avoiding recursion
- simplify design, programming and testing of complex java applications
All this in less then 30kB and no run-time overhead!
Here is a simple example illustrating how a state machine can be definded and implemented with EasyFlow
This is a State diargam fragment describing a simple ATM workflow
With EasyFlow we can define the above state machine like this
enum States implements StateEnum {
SHOWING_WELCOME, WAITING_FOR_PIN, RETURNING_CARD, SHOWING_WELCOME, ...
}
enum Events implements EventEnum {
cardPresent, pinProvided, cardExtracted, cancel, ...
}
...
EasyFlow<FlowContext> flow =
from(SHOWING_WELCOME).transit(
on(cardPresent).to(WAITING_FOR_PIN).transit(
on(pinProvided).to(...).transit(
...
),
on(cancel).to(RETURNING_CARD).transit(
on(cardExtracted).to(SHOWING_WELCOME)
)
)
);
then all what's left to do is to implement our state handlers like so
whenEnter(SHOWING_WELCOME, new ContextHandler<FlowContext>() {
@Override
public void call(final FlowContext context) throws Exception {
...
btnOption1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
context.trigger(cardPresent);
}
});
...
}
});
...
and start the flow
flow.start(new FlowContext());
See complete example ATM emulator - Android application
To start using EasyFlow on your project, define Maven dependency like so
<dependency>
<groupId>au.com.datasymphony</groupId>
<artifactId>EasyFlow</artifactId>
<version>1.3.1</version>
</dependency>
License Apache 2.0