Add callback feature set for cross-server command system to reduce dependencies, clean up old constant references and add in ability to initialize server name on ServerData. Clean up old 'this' references to '_' prefixed variables and standardize field naming.

This commit is contained in:
MrTwiggy 2014-09-25 17:17:38 -04:00
parent 5c9ee3e79e
commit fc98cf4f6c
12 changed files with 139 additions and 51 deletions

View File

@ -27,6 +27,8 @@ import mineplex.core.updater.event.UpdateEvent;
import mineplex.serverdata.Region;
import mineplex.serverdata.ServerCommandManager;
import mineplex.serverdata.ServerManager;
import mineplex.serverdata.transfers.ServerTransfer;
import mineplex.serverdata.transfers.TransferCommand;
public class Portal extends MiniPlugin
{
@ -53,7 +55,7 @@ public class Portal extends MiniPlugin
Bukkit.getMessenger().registerOutgoingPluginChannel(GetPlugin(), "BungeeCord");
// Register the server command type for future use
ServerCommandManager.getInstance().registerCommandType(TransferCommand.class);
ServerCommandManager.getInstance().registerCommandType(TransferCommand.class, new TransferHandler());
}
public void SendAllPlayers(String serverName)

View File

@ -0,0 +1,29 @@
package mineplex.core.portal;
import mineplex.serverdata.CommandCallback;
import mineplex.serverdata.ServerCommand;
import mineplex.serverdata.transfers.ServerTransfer;
import mineplex.serverdata.transfers.TransferCommand;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
public class TransferHandler implements CommandCallback
{
public void run(ServerCommand command)
{
if (command instanceof TransferCommand)
{
TransferCommand transferCommand = (TransferCommand) command;
ServerTransfer transfer = transferCommand.getTransfer();
Player player = Bukkit.getPlayer(transfer.getPlayerName());
if (player != null && player.isOnline())
{
Portal.getInstance().SendPlayerToServer(player, transfer.getServerName());
}
}
}
}

View File

@ -15,6 +15,7 @@ import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent;
import mineplex.serverdata.MinecraftServer;
import mineplex.serverdata.Region;
import mineplex.serverdata.ServerCommandManager;
import mineplex.serverdata.ServerManager;
import mineplex.serverdata.ServerRepository;
import mineplex.serverdata.Utility;
@ -47,6 +48,9 @@ public class ServerStatusManager extends MiniPlugin
setupConfigValues();
_name = plugin.getConfig().getString("serverstatus.name");
ServerCommandManager.getInstance().initializeServer(_name);
_us = plugin.getConfig().getBoolean("serverstatus.us");
Region region = _us ? Region.US : Region.EU;

View File

@ -8,6 +8,5 @@
<classpathentry kind="var" path="REPO_DIR/Plugins/Libraries/httpcore-4.2.jar"/>
<classpathentry combineaccessrules="false" kind="src" path="/Mineplex.ServerData"/>
<classpathentry kind="var" path="REPO_DIR/Plugins/Libraries/jedis-2.4.2.jar"/>
<classpathentry combineaccessrules="false" kind="src" path="/Mineplex.Core"/>
<classpathentry kind="output" path="bin"/>
</classpath>

View File

@ -9,14 +9,14 @@ import java.util.Set;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import mineplex.core.portal.Portal;
import mineplex.core.portal.ServerTransfer;
import mineplex.serverdata.DataRepository;
import mineplex.serverdata.MinecraftServer;
import mineplex.serverdata.RedisDataRepository;
import mineplex.serverdata.Region;
import mineplex.serverdata.ServerManager;
import mineplex.serverdata.ServerRepository;
import mineplex.serverdata.transfers.ServerTransfer;
import mineplex.serverdata.transfers.TransferCommand;
public class QueueRepository
{
@ -130,7 +130,10 @@ public class QueueRepository
{
for (String playerName : queueParty.getPlayers())
{
Portal.transferPlayer(playerName, emptyServer.getName());
// Execute a transfer command
ServerTransfer serverTransfer = new ServerTransfer(playerName, emptyServer.getName());
TransferCommand transferCommand = new TransferCommand(serverTransfer);
transferCommand.publish();
}
}
}

View File

@ -0,0 +1,7 @@
package mineplex.serverdata;
public interface CommandCallback
{
public void run(ServerCommand command);
}

View File

@ -0,0 +1,17 @@
package mineplex.serverdata;
public class CommandType
{
private Class<? extends ServerCommand> _commandClazz;
public Class<? extends ServerCommand> getCommandType() { return _commandClazz; }
private CommandCallback _commandCallback;
public CommandCallback getCallback() { return _commandCallback; }
public CommandType(Class<? extends ServerCommand> commandClazz, CommandCallback commandCallback)
{
_commandClazz = commandClazz;
_commandCallback = commandCallback;
}
}

View File

@ -29,9 +29,9 @@ public class RedisDataRepository<T extends Data> implements DataRepository<T>
// The geographical region of the servers stored by this ServerRepository
private Region _region;
private Class<T> elementType;
private Class<T> _elementType;
private String elementLabel;
private String _elementLabel;
/**
* Class constructor
@ -42,10 +42,10 @@ public class RedisDataRepository<T extends Data> implements DataRepository<T>
public RedisDataRepository(String host, int port, Region region,
Class<T> elementType, String elementLabel)
{
this._jedisPool = new JedisPool(new JedisPoolConfig(), host, port);
this._region = region;
this.elementType = elementType;
this.elementLabel = elementLabel;
_jedisPool = new JedisPool(new JedisPoolConfig(), host, port);
_region = region;
_elementType = elementType;
_elementLabel = elementLabel;
}
public RedisDataRepository(Region region, Class<T> elementType, String elementLabel)
@ -56,7 +56,7 @@ public class RedisDataRepository<T extends Data> implements DataRepository<T>
public String getElementSetKey()
{
return concatenate("data", elementLabel, _region.toString());
return concatenate("data", _elementLabel, _region.toString());
}
public String generateKey(T element)
@ -317,7 +317,7 @@ public class RedisDataRepository<T extends Data> implements DataRepository<T>
protected T deserialize(String serializedData)
{
return Utility.deserialize(serializedData, elementType);
return Utility.deserialize(serializedData, _elementType);
}
protected String serialize(T element)

View File

@ -1,10 +1,12 @@
package mineplex.serverdata;
import sun.reflect.generics.reflectiveObjects.NotImplementedException;
public abstract class ServerCommand
{
// The names of servers targetted to receive this ServerCommand.
private String[] targetServers;
private String[] _targetServers;
/**
* Class constructor
@ -12,13 +14,16 @@ public abstract class ServerCommand
*/
public ServerCommand(String... targetServers)
{
this.targetServers = targetServers;
_targetServers = targetServers;
}
/**
* Run the command on it's destination target server.
*/
public abstract void run();
public void run()
{
// Not yet implemented in base
}
/**
* @param serverName - the name of the server to be checked for whether they are a target
@ -27,10 +32,10 @@ public abstract class ServerCommand
*/
public boolean isTargetServer(String serverName)
{
if (targetServers == null || targetServers.length == 0) // Targets all online servers
if (_targetServers == null || _targetServers.length == 0) // Targets all online servers
return true;
for (String targetServer : targetServers)
for (String targetServer : _targetServers)
{
if (targetServer.equalsIgnoreCase(serverName))
{

View File

@ -3,6 +3,7 @@ package mineplex.serverdata;
import java.util.HashMap;
import java.util.Map;
import mineplex.serverdata.transfers.TransferCommand;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
@ -11,23 +12,30 @@ public class ServerCommandManager
{
// The singleton instance of ServerCommandManager
private static ServerCommandManager instance;
private static ServerCommandManager _instance;
public final String SERVER_COMMANDS_CHANNEL = "commands.server";
private JedisPool _jedisPool;
private Map<String, Class<? extends ServerCommand>> commandTypes;
private Map<String, CommandType> _commandTypes;
private String _localServerName;
public void initializeServer(String serverName) { _localServerName = serverName; }
public boolean isServerInitialized() { return _localServerName != null; }
/**
* Private class constructor to prevent non-singleton instances.
*/
private ServerCommandManager()
{
this._jedisPool = new JedisPool(new JedisPoolConfig(), ServerManager.DEFAULT_REDIS_HOST,
_jedisPool = new JedisPool(new JedisPoolConfig(), ServerManager.DEFAULT_REDIS_HOST,
ServerManager.DEFAULT_REDIS_PORT);
this.commandTypes = new HashMap<String, Class<? extends ServerCommand>>();
_commandTypes = new HashMap<String, CommandType>();
initialize();
// Register default command types
registerCommandType(TransferCommand.class);
}
/**
@ -92,14 +100,27 @@ public class ServerCommandManager
*/
public void handleCommand(String commandType, String serializedCommand)
{
if (commandTypes.containsKey(commandType))
if (!isServerInitialized())
{
ServerCommand serverCommand = Utility.deserialize(serializedCommand, commandTypes.get(commandType));
// TODO: Log un-initialized server receiving command?
return;
}
if (_commandTypes.containsKey(commandType))
{
Class<? extends ServerCommand> commandClazz = _commandTypes.get(commandType).getCommandType();
ServerCommand serverCommand = Utility.deserialize(serializedCommand, commandClazz);
if (serverCommand.isTargetServer("THIS SERVER NAME HERE")) // TODO: Find server name ref
if (serverCommand.isTargetServer(_localServerName))
{
// TODO: Run synchronously?
serverCommand.run(); // Run the server command
CommandCallback callback = _commandTypes.get(commandType).getCallback();
serverCommand.run(); // Run server command without callback
if (callback != null)
{
callback.run(serverCommand); // Run callback
}
}
}
}
@ -108,14 +129,22 @@ public class ServerCommandManager
* Register a new type of {@link ServerCommand}.
* @param commandType - the {@link ServerCommand} type to register.
*/
public void registerCommandType(Class<? extends ServerCommand> commandType)
public void registerCommandType(Class<? extends ServerCommand> commandType, CommandCallback callback)
{
String commandName = commandType.toString();
if (!commandTypes.containsKey(commandName))
if (_commandTypes.containsKey(commandName))
{
commandTypes.put(commandName, commandType);
// Log overwriting of command type?
}
CommandType cmdType = new CommandType(commandType, callback);
_commandTypes.put(commandName, cmdType);
}
public void registerCommandType(Class<? extends ServerCommand> commandType)
{
registerCommandType(commandType, null);
}
/**
@ -123,11 +152,11 @@ public class ServerCommandManager
*/
public static ServerCommandManager getInstance()
{
if (instance == null)
if (_instance == null)
{
instance = new ServerCommandManager();
_instance = new ServerCommandManager();
}
return instance;
return _instance;
}
}

View File

@ -1,15 +1,15 @@
package mineplex.core.portal;
package mineplex.serverdata.transfers;
public class ServerTransfer
{
// The name of the player who is being transferred.
private String playerName;
public String getPlayerName() { return playerName; }
private String _playerName;
public String getPlayerName() { return _playerName; }
// The name of the destination server in this ServerTransfer.
private String serverName;
public String getServerName() { return serverName; }
private String _serverName;
public String getServerName() { return _serverName; }
/**
* Class constructor
@ -18,7 +18,7 @@ public class ServerTransfer
*/
public ServerTransfer(String playerName, String serverName)
{
this.playerName = playerName;
this.serverName = serverName;
_playerName = playerName;
_serverName = serverName;
}
}

View File

@ -1,7 +1,4 @@
package mineplex.core.portal;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
package mineplex.serverdata.transfers;
import mineplex.serverdata.ServerCommand;
@ -15,7 +12,8 @@ public class TransferCommand extends ServerCommand
{
// The ServerTransfer to be sent to another server for enactment
private ServerTransfer transfer;
private ServerTransfer _transfer;
public ServerTransfer getTransfer() { return _transfer; }
/**
* Class constructor
@ -23,18 +21,13 @@ public class TransferCommand extends ServerCommand
*/
public TransferCommand(ServerTransfer transfer)
{
this.transfer = transfer;
_transfer = transfer;
}
@Override
public void run()
{
Player player = Bukkit.getPlayer(transfer.getPlayerName());
if (player != null && player.isOnline())
{
Portal.getInstance().SendPlayerToServer(player, transfer.getServerName());
}
// Utilitizes a callback functionality to seperate dependencies
}
}