EasyFlow

General

Category
Free
Tag
FSM
License
Apache License, Version 2.0
Registered
Nov 25, 2016
Favorites
3
Link
https://github.com/Beh01der/EasyFlow
See also
Engine
HAL
Kaskade
Dalek
KStateMachine

Additional

Language
Java
Version
v1.1-R2 (Apr 14, 2013)
Created
Apr 12, 2013
Updated
Feb 17, 2023 (Retired)
Owner
Andrey Chausenko (Beh01der)
Contributors
Sergey Zenchenko (sergeyzenchenko)
John Lombardo (johnnylambada)
Andrey Chausenko (Beh01der)
Dmitri Maximovich (maximdim)
Hank (hank-cp)
Bachi (bachi76)
Miguel Pontes (mpontes)
7
Activity
Badge
Generate
Download
Source code

EasyFlow

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>

See also

EasyFlow for Node.js

License Apache 2.0