summaryrefslogtreecommitdiffstats
path: root/EssentialsUpdate/src/com/earth2me/essentials/update/states/StateMachine.java
diff options
context:
space:
mode:
authorsnowleo <schneeleo@gmail.com>2011-10-26 19:39:01 +0200
committersnowleo <schneeleo@gmail.com>2011-10-26 19:39:01 +0200
commit48f8eb9788dd1c49f563d7b5f2d06c27b7ab3201 (patch)
treee26fdb901b68ecc4f473c1151d1678de3f89e723 /EssentialsUpdate/src/com/earth2me/essentials/update/states/StateMachine.java
parent7f825750f076e570ffaeecc7de6cb26f202e84ca (diff)
downloadEssentials-48f8eb9788dd1c49f563d7b5f2d06c27b7ab3201.tar
Essentials-48f8eb9788dd1c49f563d7b5f2d06c27b7ab3201.tar.gz
Essentials-48f8eb9788dd1c49f563d7b5f2d06c27b7ab3201.tar.lz
Essentials-48f8eb9788dd1c49f563d7b5f2d06c27b7ab3201.tar.xz
Essentials-48f8eb9788dd1c49f563d7b5f2d06c27b7ab3201.zip
Cleanly resume the installation, if the player quits the game and reconnects
If the installation is already running in background after the wizard, it will not stop, if the player quits the game.
Diffstat (limited to 'EssentialsUpdate/src/com/earth2me/essentials/update/states/StateMachine.java')
-rw-r--r--EssentialsUpdate/src/com/earth2me/essentials/update/states/StateMachine.java70
1 files changed, 61 insertions, 9 deletions
diff --git a/EssentialsUpdate/src/com/earth2me/essentials/update/states/StateMachine.java b/EssentialsUpdate/src/com/earth2me/essentials/update/states/StateMachine.java
index 77fb9ce20..9a9c64134 100644
--- a/EssentialsUpdate/src/com/earth2me/essentials/update/states/StateMachine.java
+++ b/EssentialsUpdate/src/com/earth2me/essentials/update/states/StateMachine.java
@@ -12,11 +12,12 @@ public class StateMachine extends WorkListener
{
public enum MachineResult
{
- ABORT, WAIT, DONE
+ ABORT, WAIT, DONE, NONE
}
private final transient StateMap states = new StateMap();
private transient AbstractState current;
- private final transient Player player;
+ private transient Player player;
+ private transient MachineResult result = MachineResult.NONE;
public StateMachine(final Plugin plugin, final Player player, final VersionInfo newVersionInfo)
{
@@ -37,29 +38,43 @@ public class StateMachine extends WorkListener
current = current.getNextState();
if (current == null)
{
- return MachineResult.DONE;
+ result = MachineResult.DONE;
+ break;
}
}
- current.askQuestion(player);
- return MachineResult.WAIT;
+ if (current != null)
+ {
+ if (player.isOnline())
+ {
+ current.askQuestion(player);
+ }
+ result = MachineResult.WAIT;
+ }
+ return result;
}
public MachineResult reactOnMessage(final String message)
{
+ result = MachineResult.NONE;
final AbstractState next = current.reactOnAnswer(player, message);
if (next == null)
{
if (current.isAbortion())
{
- return MachineResult.ABORT;
+ finish();
+ result = MachineResult.ABORT;
}
else
{
- return MachineResult.DONE;
+ result = MachineResult.DONE;
}
}
- current = next;
- return askQuestion();
+ else
+ {
+ current = next;
+ askQuestion();
+ }
+ return result;
}
private transient Iterator<AbstractState> iterator;
@@ -77,6 +92,7 @@ public class StateMachine extends WorkListener
{
player.sendMessage("Installation done.");
}
+ finish();
return;
}
final AbstractState state = iterator.next();
@@ -86,6 +102,7 @@ public class StateMachine extends WorkListener
@Override
public void onWorkAbort(final String message)
{
+ finish();
Bukkit.getScheduler().scheduleSyncDelayedTask(getPlugin(), new Runnable()
{
@Override
@@ -115,4 +132,39 @@ public class StateMachine extends WorkListener
}
});
}
+
+ private void finish()
+ {
+ iterator = null;
+ states.clear();
+ getPlugin().getServer().getPluginManager().callEvent(new InstallationFinishedEvent());
+ }
+
+ public void resumeInstallation(Player player)
+ {
+ this.player = player;
+ if (result == MachineResult.WAIT)
+ {
+ if (current != null)
+ {
+ current.askQuestion(player);
+ }
+ else
+ {
+ throw new RuntimeException("State is WAIT, but current state is null!");
+ }
+ }
+ if (result == MachineResult.DONE && iterator != null)
+ {
+ player.sendMessage("Installation is still running.");
+ }
+ if (result == MachineResult.ABORT)
+ {
+ throw new RuntimeException("Player should not be able to resume a aborted installation.");
+ }
+ if (result == MachineResult.NONE)
+ {
+ throw new RuntimeException("State machine in an undefined state.");
+ }
+ }
}