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
Kaskade
Ken-Ken-Pa
HAL
TinyMachine
Engine

Additional

Language
Java
Version
v1.1-R2 (Apr 14, 2013)
Created
Apr 12, 2013
Updated
Feb 17, 2023
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

Advertisement

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