import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.minecraft.server.MinecraftServer;
/**
* DataSource.java - Abstract class for implementing new data sources.
*
* @author James
*/
public abstract class DataSource {
protected static final Logger log = Logger.getLogger("Minecraft");
protected List<Group> groups = new ArrayList<Group>();
protected List<Kit> kits = new ArrayList<Kit>();
protected List<Warp> homes = new ArrayList<Warp>();
protected List<Warp> warps = new ArrayList<Warp>();
protected List<Ban> bans = new ArrayList<Ban>();
protected Map<String, Integer> items = new HashMap<String, Integer>();
protected MinecraftServer server;
protected final Object groupLock = new Object(), kitLock = new Object(), banLock = new Object();
protected final Object homeLock = new Object(), warpLock = new Object(), itemLock = new Object();
/**
* Initializes the data source
*/
abstract public void initialize();
/**
* Loads all groups
*/
abstract public void loadGroups();
/**
* Loads all kits
*/
abstract public void loadKits();
/**
* Loads all homes
*/
abstract public void loadHomes();
/**
* Loads all warps
*/
abstract public void loadWarps();
/**
* Loads all items
*/
abstract public void loadItems();
/**
* Loads the ban list
*/
abstract public void loadBanList();
/**
* Adds user to the list
*
* @param player
*/
abstract public void addPlayer(Player player);
/**
* Modifies the provided user
*
* @param player
*/
abstract public void modifyPlayer(Player player);
/**
* Checks to see if the specified player exists
*
* @param player
* @return true if player exists
*/
abstract public boolean doesPlayerExist(String player);
/**
* Returns specified user
*
* @param name
* @return user
*/
abstract public Player getPlayer(String name);
/**
* Adds specified group to the list of groups
*
* @param group
*/
abstract public void addGroup(Group group);
/**
* Modifies group
*
* @param group
*/
abstract public void modifyGroup(Group group);
/**
* Returns specified group
*
* @param name
* @return group
*/
public Group getGroup(String name) {
synchronized (groupLock) {
for (Group group : groups)
if (group.Name.equalsIgnoreCase(name))
return group;
}
if (!name.equals(""))
log.log(Level.INFO, "Unable to find group '" + name + "'. Are you sure you have that group?");
return null;
}
/**
* Returns the default group
*
* @return default group
*/
public Group getDefaultGroup() {
synchronized (groupLock) {
for (Group group : groups)
if (group.DefaultGroup)
return group;
}
return null;
}
/**
* Adds kit to list of kits
*
* @param kit
*/
abstract public void addKit(Kit kit);
/**
* Modifies kit
*
* @param kit
*/
abstract public void modifyKit(Kit kit);
/**
* Returns specified kit
*
* @param name
* @return kit
*/
public Kit getKit(String name) {
synchronized (kitLock) {
for (Kit kit : kits)
if (kit.Name.equalsIgnoreCase(name))
return kit;
}
return null;
}
/**
* Returns true if there are any kits
*
* @return true if there are kits
*/
public boolean hasKits() {
synchronized (kitLock) {
return kits.size() > 0;
}
}
/**
* Returns a list of all kits names separated by commas
*
* @param player
* @return string list of kits
*/
public String getKitNames(Player player) {
StringBuilder builder = new StringBuilder();
builder.append(""); // incaseofnull
synchronized (kitLock) {
for (Kit kit : kits)
if (player.isInGroup(kit.Group) || kit.Group.equals(""))
builder.append(kit.Name).append(" ");
}
return builder.toString();
}
/**
* Adds home to list of homes
*
* @param home
*/
abstract public void addHome(Warp home);
/**
* Modifies home
*
* @param home
*/
abstract public void changeHome(Warp home);
/**
* Returns specified home
*
* @param name
* @return home
*/
public Warp getHome(String name) {
synchronized (homeLock) {
for (Warp home : homes)
if (home.Name.equalsIgnoreCase(name))
return home;
}
return null;
}
/**
* Adds warp to list of warps
*
* @param warp
*/
abstract public void addWarp(Warp warp);
/**
* Modifies warp
*
* @param warp
*/
abstract public void changeWarp(Warp warp);
/**
* Removes warp from list of warps
*
* @param warp
*/
abstract public void removeWarp(Warp warp);
/**
* Returns specified warp
*
* @param name
* @return warp
*/
public Warp getWarp(String name) {
synchronized (warpLock) {
for (Warp warp : warps)
if (warp.Name.equalsIgnoreCase(name))
return warp;
}
return null;
}
/**
* Returns true if there are any warps
*
* @return true if there are warps
*/
public boolean hasWarps() {
synchronized (warpLock) {
return warps.size() > 0;
}
}
/**
* Returns a string containing all warp names the player has access to
*
* @param player
* @return string list of warps
*/
public String getWarpNames(Player player) {
StringBuilder builder = new StringBuilder();
builder.append(""); // incaseofnull
synchronized (warpLock) {
for (Warp warp : warps)
if (player.isInGroup(warp.Group) || warp.Group.equals(""))
builder.append(warp.Name).append(" ");
}
return builder.toString();
}
/**
* Returns item id corresponding to item name
*
* @param name
* @return item id
*/
public int getItem(String name) {
synchronized (itemLock) {
if (items.containsKey(name))
return items.get(name);
}
return 0;
}
/**
* Returns the name of the item corresponding to the ID
*
* @param id
* id of item
* @return name of item
*/
public String getItem(int id) {
synchronized (itemLock) {
for (String name : items.keySet())
if (items.get(name) == id)
return name;
}
return String.valueOf(id);
}
/**
* Returns an unmodifiable map of items
*
* @return unmodifiable map of items
*/
public Map<String, Integer> getItems() {
return Collections.unmodifiableMap(items);
}
/**
* Adds player to whitelist
*
* @param name
*/
abstract public void addToWhitelist(String name);
/**
* Removes player from whitelist
*
* @param name
*/
abstract public void removeFromWhitelist(String name);
/**
* Returns true if whitelist is enabled
*
* @return true if whitelist is enabled
* @deprecated use etc.getInstance().isWhitelistEnabled() instead
*/
@Deprecated
public boolean hasWhitelist() {
return etc.getInstance().isWhitelistEnabled();
}
/**
* Returns true if the player is on the whitelist
*
* @param user
* @return true if player is on whitelist
*/
abstract public boolean isUserOnWhitelist(String user);
/**
* Adds or modifies specified ban
*
* @param ban
* Ban to add or modify
*/
abstract public void modifyBan(Ban ban);
/**
* Checks to see if this player or IP is on the ban list
*
* @param player
* Player name
* @param ip
* IP Address
* @return true if either name or IP is on the ban list
*/
public boolean isOnBanList(String player, String ip) {
synchronized (banLock) {
for (Ban ban : bans)
if (ban.getName().equalsIgnoreCase(player) || ban.getIp().equalsIgnoreCase(ip))
return true;
}
return false;
}
/**
* Retrieves the ban details
*
* @param player
* Player name
* @param ip
* IP Address
* @return the ban
*/
public Ban getBan(String player, String ip) {
synchronized (banLock) {
for (Ban ban : bans)
if (ban.getName().equalsIgnoreCase(player) || ban.getIp().equalsIgnoreCase(ip))
return ban;
}
return null;
}
/**
* Adds player to reservelist
*
* @param name
*/
abstract public void addToReserveList(String name);
/**
* Removes player from reservelist
*
* @param name
*/
abstract public void removeFromReserveList(String name);
/**
* Returns true if player is on reservelist
*
* @param user
* @return true if player is on reserve list
*/
abstract public boolean isUserOnReserveList(String user);
}