From 78884719823fb73d268bf9767189e85e7f916e41 Mon Sep 17 00:00:00 2001 From: snowleo Date: Sun, 23 Oct 2011 21:45:01 +0200 Subject: Statemachine for installation wizard (WIP) --- .../essentials/update/states/StateMachine.java | 118 +++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 EssentialsUpdate/src/com/earth2me/essentials/update/states/StateMachine.java (limited to 'EssentialsUpdate/src/com/earth2me/essentials/update/states/StateMachine.java') diff --git a/EssentialsUpdate/src/com/earth2me/essentials/update/states/StateMachine.java b/EssentialsUpdate/src/com/earth2me/essentials/update/states/StateMachine.java new file mode 100644 index 000000000..b69ee14a9 --- /dev/null +++ b/EssentialsUpdate/src/com/earth2me/essentials/update/states/StateMachine.java @@ -0,0 +1,118 @@ +package com.earth2me.essentials.update.states; + +import com.earth2me.essentials.update.WorkListener; +import com.earth2me.essentials.update.VersionInfo; +import java.util.ArrayList; +import java.util.List; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + + +public class StateMachine extends WorkListener +{ + public enum MachineResult + { + ABORT, WAIT, DONE + } + private final transient List states = new ArrayList(); + private transient AbstractState current; + private final transient Player player; + + public StateMachine(final Plugin plugin, final Player player, final VersionInfo newVersionInfo) + { + super(plugin, newVersionInfo); + this.player = player; + states.clear(); + final AbstractState state = new EssentialsChat(null); + states.add(state); + current = state; + } + + public MachineResult askQuestion() + { + while (current.guessAnswer()) + { + current = current.getNextState(); + if (current == null) + { + return MachineResult.DONE; + } + } + current.askQuestion(player); + return MachineResult.WAIT; + } + + public MachineResult reactOnMessage(final String message) + { + final AbstractState next = current.reactOnAnswer(player, message); + if (next == null) + { + if (current.isAbortion()) + { + return MachineResult.ABORT; + } + else + { + return MachineResult.DONE; + } + } + current = next; + return askQuestion(); + } + private int position = 0; + + public void startWork() + { + callStateWork(); + } + + private void callStateWork() + { + if (position > states.size()) + { + if (player.isOnline()) + { + player.sendMessage("Installation done."); + } + return; + } + final AbstractState state = states.get(position); + state.doWork(this); + } + + @Override + public void onWorkAbort(final String message) + { + position = 0; + Bukkit.getScheduler().scheduleSyncDelayedTask(getPlugin(), new Runnable() + { + @Override + public void run() + { + if (message != null && !message.isEmpty() && StateMachine.this.player.isOnline()) + { + StateMachine.this.player.sendMessage(message); + } + } + }); + } + + @Override + public void onWorkDone(final String message) + { + position++; + Bukkit.getScheduler().scheduleSyncDelayedTask(getPlugin(), new Runnable() + { + @Override + public void run() + { + if (message != null && !message.isEmpty() && StateMachine.this.player.isOnline()) + { + StateMachine.this.player.sendMessage(message); + } + StateMachine.this.callStateWork(); + } + }); + } +} -- cgit v1.2.3