From 502cbca03b08e5264bd95f64e010f1c6d701ef5d Mon Sep 17 00:00:00 2001 From: fawdlstty Date: Fri, 2 Apr 2021 18:50:15 +0800 Subject: [PATCH] add java multi state supports --- README.md | 2 +- README.zh.md | 2 +- .../JSMLite/src/cn/fawdlstty/smlite/Main.java | 94 +++++++++++++++++++ .../src/cn/fawdlstty/smlite/SMLite.java | 2 +- .../cn/fawdlstty/smlite/SMLiteBuilder.java | 2 +- .../src/cn/fawdlstty/smlite/Tuple2.java | 19 ++++ .../fawdlstty/smlite/_SMLite_ConfigItem.java | 2 +- .../fawdlstty/smlite/_SMLite_ConfigState.java | 2 +- .../smlite/internface/IAction_s.java | 2 +- .../smlite/internface/IAction_sa.java | 2 +- .../smlite/internface/IAction_st.java | 2 +- .../smlite/internface/IAction_sta.java | 2 +- .../smlite/internface/IAction_t.java | 2 +- .../smlite/internface/IAction_ta.java | 2 +- .../fawdlstty/smlite/internface/IFunc_.java | 2 +- .../fawdlstty/smlite/internface/IFunc_a.java | 2 +- .../fawdlstty/smlite/internface/IFunc_s.java | 2 +- .../fawdlstty/smlite/internface/IFunc_sa.java | 2 +- .../fawdlstty/smlite/internface/IFunc_st.java | 2 +- .../smlite/internface/IFunc_sta.java | 2 +- .../fawdlstty/smlite/internface/IFunc_t.java | 2 +- .../fawdlstty/smlite/internface/IFunc_ta.java | 2 +- 22 files changed, 133 insertions(+), 20 deletions(-) create mode 100644 src_java/JSMLite/src/cn/fawdlstty/smlite/Tuple2.java diff --git a/README.md b/README.md index 3a101f8..0eaaaf1 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ State machine library for C, C++, C#, Java, JavaScript, Python, VB.Net | Document | √ | √ | √ | | | √ | | Sync State Machine | √ | √ | √ | √ | √ | √ | | Async State Machine | | | √ | | | √ | -| Multi State | | √ | √ | | | | +| Multi State | | √ | √ | √ | | | | Thread Safe | | √ | √ | | | | | Cancel Trigger | | | √ | | | | | Serilize | | √ | √ | | | | diff --git a/README.zh.md b/README.zh.md index abcf0a1..18824a1 100644 --- a/README.zh.md +++ b/README.zh.md @@ -40,7 +40,7 @@ C、C++、C#、Java、JavaScript、Python、VB.Net 的状态机库 | 文档 | √ | √ | √ | | | √ | | 同步状态机 | √ | √ | √ | √ | √ | √ | | 异步状态机 | | | √ | | | √ | -| 多状态支持 | | √ | √ | | | | +| 多状态支持 | | √ | √ | √ | | | | 线程安全 | | √ | √ | | | | | 撤销触发 | | | √ | | | | | 序列化 | | √ | √ | | | | diff --git a/src_java/JSMLite/src/cn/fawdlstty/smlite/Main.java b/src_java/JSMLite/src/cn/fawdlstty/smlite/Main.java index 9aadc12..954d102 100644 --- a/src_java/JSMLite/src/cn/fawdlstty/smlite/Main.java +++ b/src_java/JSMLite/src/cn/fawdlstty/smlite/Main.java @@ -288,6 +288,100 @@ static void TestMethod9 () throws Exception { Assert.AreEqual (_sm.GetState(), MyState.Rest); } + static void TestMethod11 () throws Exception { + AtomicInteger n = new AtomicInteger(0); + AtomicBoolean entry_one = new AtomicBoolean(true); + SMLiteBuilder, MyTrigger> _smb = new SMLiteBuilder (); + _smb.Configure (new Tuple2 (MyState.Rest, MyState.Rest)) + .OnEntry (() -> { Assert.IsFalse (entry_one.get()); entry_one.set(true); n.addAndGet(1); }) + .OnLeave (() -> { Assert.IsTrue (entry_one.get()); entry_one.set(false); n.addAndGet(10); }) + .WhenChangeTo (MyTrigger.Run, new Tuple2 (MyState.Ready, MyState.Ready)) + .WhenIgnore (MyTrigger.Close); + _smb.Configure (new Tuple2 (MyState.Ready, MyState.Ready)) + .OnEntry (() -> { Assert.IsFalse (entry_one.get()); entry_one.set(true); n.addAndGet(100); }) + .OnLeave (() -> { Assert.IsTrue (entry_one.get()); entry_one.set(false); n.addAndGet(1000); }) + .WhenChangeTo (MyTrigger.Read, new Tuple2 (MyState.Reading, MyState.Reading)) + .WhenChangeTo (MyTrigger.Write, new Tuple2 (MyState.Writing, MyState.Writing)) + .WhenChangeTo (MyTrigger.Close, new Tuple2 (MyState.Rest, MyState.Rest)); + _smb.Configure (new Tuple2 (MyState.Reading, MyState.Reading)) + .OnEntry (() -> { Assert.IsFalse (entry_one.get()); entry_one.set(true); n.addAndGet(10000); }) + .OnLeave (() -> { Assert.IsTrue (entry_one.get()); entry_one.set(false); n.addAndGet(100000); }) + .WhenChangeTo (MyTrigger.FinishRead, new Tuple2 (MyState.Ready, MyState.Ready)) + .WhenChangeTo (MyTrigger.Close, new Tuple2 (MyState.Rest, MyState.Rest)); + _smb.Configure (new Tuple2 (MyState.Writing, MyState.Writing)) + .OnEntry (() -> { Assert.IsFalse (entry_one.get()); entry_one.set(true); n.addAndGet(1000000); }) + .OnLeave (() -> { Assert.IsTrue (entry_one.get()); entry_one.set(false); n.addAndGet(10000000); }) + .WhenChangeTo (MyTrigger.FinishWrite, new Tuple2 (MyState.Ready, MyState.Ready)) + .WhenChangeTo (MyTrigger.Close, new Tuple2 (MyState.Rest, MyState.Rest)); + + SMLite, MyTrigger> _sm = _smb.Build (new Tuple2 (MyState.Rest, MyState.Rest)); + Assert.AreEqual (_sm.GetState (), new Tuple2 (MyState.Rest, MyState.Rest)); + Assert.AreEqual (n.get(), 0); + Assert.IsTrue (_sm.AllowTriggering (MyTrigger.Run)); + Assert.IsTrue (_sm.AllowTriggering (MyTrigger.Close)); + Assert.IsFalse (_sm.AllowTriggering (MyTrigger.Read)); + Assert.IsFalse (_sm.AllowTriggering (MyTrigger.FinishRead)); + Assert.IsFalse (_sm.AllowTriggering (MyTrigger.Write)); + Assert.IsFalse (_sm.AllowTriggering (MyTrigger.FinishWrite)); + + _sm.Triggering (MyTrigger.Close); + Assert.AreEqual (_sm.GetState(), new Tuple2 (MyState.Rest, MyState.Rest)); + Assert.AreEqual (n.get(), 0); + + _sm.Triggering (MyTrigger.Close); + Assert.AreEqual (_sm.GetState(), new Tuple2 (MyState.Rest, MyState.Rest)); + Assert.AreEqual (n.get(), 0); + + _sm.Triggering (MyTrigger.Close); + Assert.AreEqual (_sm.GetState(), new Tuple2 (MyState.Rest, MyState.Rest)); + Assert.AreEqual (n.get(), 0); + + _sm.Triggering (MyTrigger.Run); + Assert.AreEqual (_sm.GetState(), new Tuple2 (MyState.Ready, MyState.Ready)); + Assert.AreEqual (n.get(), 110); + Assert.IsFalse (_sm.AllowTriggering (MyTrigger.Run)); + Assert.IsTrue (_sm.AllowTriggering (MyTrigger.Close)); + Assert.IsTrue (_sm.AllowTriggering (MyTrigger.Read)); + Assert.IsFalse (_sm.AllowTriggering (MyTrigger.FinishRead)); + Assert.IsTrue (_sm.AllowTriggering (MyTrigger.Write)); + Assert.IsFalse (_sm.AllowTriggering (MyTrigger.FinishWrite)); + + _sm.Triggering (MyTrigger.Close); + Assert.AreEqual (_sm.GetState(), new Tuple2 (MyState.Rest, MyState.Rest)); + Assert.AreEqual (n.get(), 1111); + Assert.IsTrue (_sm.AllowTriggering (MyTrigger.Run)); + Assert.IsTrue (_sm.AllowTriggering (MyTrigger.Close)); + Assert.IsFalse (_sm.AllowTriggering (MyTrigger.Read)); + Assert.IsFalse (_sm.AllowTriggering (MyTrigger.FinishRead)); + Assert.IsFalse (_sm.AllowTriggering (MyTrigger.Write)); + Assert.IsFalse (_sm.AllowTriggering (MyTrigger.FinishWrite)); + + _sm.Triggering (MyTrigger.Run); + Assert.AreEqual (_sm.GetState(), new Tuple2 (MyState.Ready, MyState.Ready)); + Assert.AreEqual (n.get(), 1221); + + _sm.Triggering (MyTrigger.Read); + Assert.AreEqual (_sm.GetState(), new Tuple2 (MyState.Reading, MyState.Reading)); + Assert.AreEqual (n.get(), 12221); + + _sm.Triggering (MyTrigger.FinishRead); + Assert.AreEqual (_sm.GetState(), new Tuple2 (MyState.Ready, MyState.Ready)); + Assert.AreEqual (n.get(), 112321); + + _sm.Triggering (MyTrigger.Write); + Assert.AreEqual (_sm.GetState(), new Tuple2 (MyState.Writing, MyState.Writing)); + Assert.AreEqual (n.get(), 1113321); + + _sm.Triggering (MyTrigger.FinishWrite); + Assert.AreEqual (_sm.GetState(), new Tuple2 (MyState.Ready, MyState.Ready)); + Assert.AreEqual (n.get(), 11113421); + + _sm.SetState(new Tuple2 (MyState.Reading, MyState.Reading)); + _sm.SetState(new Tuple2 (MyState.Writing, MyState.Writing)); + _sm.SetState(new Tuple2 (MyState.Rest, MyState.Rest)); + Assert.AreEqual (n.get(), 11113421); + } + public static void main(String[] args) throws Exception { TestMethod1 (); TestMethod3 (); diff --git a/src_java/JSMLite/src/cn/fawdlstty/smlite/SMLite.java b/src_java/JSMLite/src/cn/fawdlstty/smlite/SMLite.java index b125e74..d6e4f1c 100644 --- a/src_java/JSMLite/src/cn/fawdlstty/smlite/SMLite.java +++ b/src_java/JSMLite/src/cn/fawdlstty/smlite/SMLite.java @@ -2,7 +2,7 @@ import java.util.HashMap; -public class SMLite { +public class SMLite { public SMLite (TState init_state, HashMap> _states) { m_state = init_state; m_cfg_states = _states; diff --git a/src_java/JSMLite/src/cn/fawdlstty/smlite/SMLiteBuilder.java b/src_java/JSMLite/src/cn/fawdlstty/smlite/SMLiteBuilder.java index bf56ceb..bf68d8e 100644 --- a/src_java/JSMLite/src/cn/fawdlstty/smlite/SMLiteBuilder.java +++ b/src_java/JSMLite/src/cn/fawdlstty/smlite/SMLiteBuilder.java @@ -3,7 +3,7 @@ import java.util.Dictionary; import java.util.HashMap; -public class SMLiteBuilder { +public class SMLiteBuilder { public _SMLite_ConfigState Configure (TState state) throws Exception { if (m_builded) throw new Exception ("shouldn't configure builder after builded."); diff --git a/src_java/JSMLite/src/cn/fawdlstty/smlite/Tuple2.java b/src_java/JSMLite/src/cn/fawdlstty/smlite/Tuple2.java new file mode 100644 index 0000000..83f9b79 --- /dev/null +++ b/src_java/JSMLite/src/cn/fawdlstty/smlite/Tuple2.java @@ -0,0 +1,19 @@ +package cn.fawdlstty.smlite; + +public class Tuple2 implements Comparable { + public final A first; + public final B second; + + public Tuple2(A a, B b) { + this.first = a; + this.second = b; + } + + @Override + public int compareTo(Object o) { + Tuple2 _o = (Tuple2) o; + if (this.first == _o.first && this.second == _o.second) + return 0; + return -1; + } +} diff --git a/src_java/JSMLite/src/cn/fawdlstty/smlite/_SMLite_ConfigItem.java b/src_java/JSMLite/src/cn/fawdlstty/smlite/_SMLite_ConfigItem.java index 1916008..d179c5e 100644 --- a/src_java/JSMLite/src/cn/fawdlstty/smlite/_SMLite_ConfigItem.java +++ b/src_java/JSMLite/src/cn/fawdlstty/smlite/_SMLite_ConfigItem.java @@ -4,7 +4,7 @@ import java.util.EnumSet; -public class _SMLite_ConfigItem { +public class _SMLite_ConfigItem { public _SMLite_ConfigItem (EnumSet<_SMLite_BuildItem> build_item, TState state, TTrigger trigger, Object callback) { m_build_item = build_item; m_state = state; diff --git a/src_java/JSMLite/src/cn/fawdlstty/smlite/_SMLite_ConfigState.java b/src_java/JSMLite/src/cn/fawdlstty/smlite/_SMLite_ConfigState.java index 8b0a272..8b93798 100644 --- a/src_java/JSMLite/src/cn/fawdlstty/smlite/_SMLite_ConfigState.java +++ b/src_java/JSMLite/src/cn/fawdlstty/smlite/_SMLite_ConfigState.java @@ -5,7 +5,7 @@ import java.util.EnumSet; import java.util.HashMap; -public class _SMLite_ConfigState { +public class _SMLite_ConfigState { private _SMLite_ConfigState _try_add_trigger (TTrigger _trigger, _SMLite_ConfigItem _item) throws Exception { if (m_items.containsKey (_trigger)) throw new Exception ("state is already has this trigger methods."); diff --git a/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IAction_s.java b/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IAction_s.java index d319737..a72317e 100644 --- a/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IAction_s.java +++ b/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IAction_s.java @@ -1,5 +1,5 @@ package cn.fawdlstty.smlite.internface; -public interface IAction_s { +public interface IAction_s { public void call (TState state) throws Exception; } diff --git a/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IAction_sa.java b/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IAction_sa.java index 51c37ec..1cdd3a3 100644 --- a/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IAction_sa.java +++ b/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IAction_sa.java @@ -1,5 +1,5 @@ package cn.fawdlstty.smlite.internface; -public interface IAction_sa { +public interface IAction_sa { public void call (TState state, Object[] args) throws Exception; } diff --git a/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IAction_st.java b/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IAction_st.java index 197697b..cd8b104 100644 --- a/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IAction_st.java +++ b/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IAction_st.java @@ -1,5 +1,5 @@ package cn.fawdlstty.smlite.internface; -public interface IAction_st { +public interface IAction_st { public void call (TState state, TTrigger trigger) throws Exception; } diff --git a/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IAction_sta.java b/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IAction_sta.java index 5d14c53..c68f0ef 100644 --- a/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IAction_sta.java +++ b/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IAction_sta.java @@ -1,5 +1,5 @@ package cn.fawdlstty.smlite.internface; -public interface IAction_sta { +public interface IAction_sta { public void call (TState state, TTrigger trigger, Object[] args) throws Exception; } diff --git a/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IAction_t.java b/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IAction_t.java index 9ef0382..b3fe04b 100644 --- a/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IAction_t.java +++ b/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IAction_t.java @@ -1,5 +1,5 @@ package cn.fawdlstty.smlite.internface; -public interface IAction_t { +public interface IAction_t { public void call (TTrigger trigger) throws Exception; } diff --git a/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IAction_ta.java b/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IAction_ta.java index 6d0a0b3..9e04b7e 100644 --- a/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IAction_ta.java +++ b/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IAction_ta.java @@ -1,5 +1,5 @@ package cn.fawdlstty.smlite.internface; -public interface IAction_ta { +public interface IAction_ta { public void call (TTrigger trigger, Object[] args) throws Exception; } diff --git a/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IFunc_.java b/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IFunc_.java index 679d476..7cc0ef0 100644 --- a/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IFunc_.java +++ b/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IFunc_.java @@ -1,5 +1,5 @@ package cn.fawdlstty.smlite.internface; -public interface IFunc_ { +public interface IFunc_ { public TState call () throws Exception; } diff --git a/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IFunc_a.java b/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IFunc_a.java index ff45d5d..01b8369 100644 --- a/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IFunc_a.java +++ b/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IFunc_a.java @@ -1,5 +1,5 @@ package cn.fawdlstty.smlite.internface; -public interface IFunc_a { +public interface IFunc_a { public TState call (Object[] args) throws Exception; } diff --git a/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IFunc_s.java b/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IFunc_s.java index 8b8bd19..e395017 100644 --- a/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IFunc_s.java +++ b/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IFunc_s.java @@ -1,5 +1,5 @@ package cn.fawdlstty.smlite.internface; -public interface IFunc_s { +public interface IFunc_s { public TState call (TState state) throws Exception; } diff --git a/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IFunc_sa.java b/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IFunc_sa.java index 3c18569..df0d529 100644 --- a/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IFunc_sa.java +++ b/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IFunc_sa.java @@ -1,5 +1,5 @@ package cn.fawdlstty.smlite.internface; -public interface IFunc_sa { +public interface IFunc_sa { public TState call (TState state, Object[] args) throws Exception; } diff --git a/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IFunc_st.java b/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IFunc_st.java index 10a6134..e042d57 100644 --- a/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IFunc_st.java +++ b/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IFunc_st.java @@ -1,5 +1,5 @@ package cn.fawdlstty.smlite.internface; -public interface IFunc_st { +public interface IFunc_st { public TState call (TState state, TTrigger trigger) throws Exception; } diff --git a/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IFunc_sta.java b/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IFunc_sta.java index 79306e7..6f49b1c 100644 --- a/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IFunc_sta.java +++ b/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IFunc_sta.java @@ -1,5 +1,5 @@ package cn.fawdlstty.smlite.internface; -public interface IFunc_sta { +public interface IFunc_sta { public TState call (TState state, TTrigger trigger, Object[] args) throws Exception; } diff --git a/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IFunc_t.java b/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IFunc_t.java index 9a9fbb1..54a0848 100644 --- a/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IFunc_t.java +++ b/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IFunc_t.java @@ -1,5 +1,5 @@ package cn.fawdlstty.smlite.internface; -public interface IFunc_t { +public interface IFunc_t { public TState call (TTrigger trigger) throws Exception; } diff --git a/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IFunc_ta.java b/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IFunc_ta.java index ba0f38d..34bd65a 100644 --- a/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IFunc_ta.java +++ b/src_java/JSMLite/src/cn/fawdlstty/smlite/internface/IFunc_ta.java @@ -1,5 +1,5 @@ package cn.fawdlstty.smlite.internface; -public interface IFunc_ta { +public interface IFunc_ta { public TState call (TTrigger trigger, Object[] args) throws Exception; }