PlayerMap
This commit is contained in:
parent
09fe7b736a
commit
d2c0b34459
@ -0,0 +1,233 @@
|
|||||||
|
package mineplex.core.common.util;
|
||||||
|
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
|
import org.apache.commons.lang3.Validate;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.player.PlayerQuitEvent;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.UUID;
|
||||||
|
import java.util.WeakHashMap;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
|
public class PlayerMap<V> implements Map<UUID, V>
|
||||||
|
{
|
||||||
|
private static final Object LOCK = new Object();
|
||||||
|
|
||||||
|
private static final RemovalListener REMOVAL_LISTENER = new RemovalListener();
|
||||||
|
private static final Set<PlayerMap<?>> ALL_PLAYER_MAPS = Sets.newSetFromMap(new WeakHashMap<>());
|
||||||
|
|
||||||
|
static
|
||||||
|
{
|
||||||
|
UtilServer.RegisterEvents(REMOVAL_LISTENER);
|
||||||
|
}
|
||||||
|
|
||||||
|
private final Map<UUID, V> _backingMap;
|
||||||
|
|
||||||
|
private PlayerMap(Map<UUID, V> backingMap)
|
||||||
|
{
|
||||||
|
this._backingMap = backingMap;
|
||||||
|
|
||||||
|
synchronized (LOCK)
|
||||||
|
{
|
||||||
|
ALL_PLAYER_MAPS.add(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <V> PlayerMap<V> newMap()
|
||||||
|
{
|
||||||
|
return new PlayerMap<>(new HashMap<>());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <V> PlayerMap<V> newConcurrentMap()
|
||||||
|
{
|
||||||
|
return new PlayerMap<>(new ConcurrentHashMap<>());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int size()
|
||||||
|
{
|
||||||
|
return _backingMap.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEmpty()
|
||||||
|
{
|
||||||
|
return _backingMap.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Deprecated
|
||||||
|
public boolean containsKey(Object key)
|
||||||
|
{
|
||||||
|
Validate.notNull(key, "Key cannot be null");
|
||||||
|
if (key instanceof Player)
|
||||||
|
{
|
||||||
|
return containsKey((Player) key);
|
||||||
|
}
|
||||||
|
else if (key instanceof UUID)
|
||||||
|
{
|
||||||
|
return containsKey((UUID) key);
|
||||||
|
}
|
||||||
|
throw new UnsupportedOperationException("Unknown key type: " + key.getClass().getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean containsKey(Player key)
|
||||||
|
{
|
||||||
|
Validate.notNull(key, "Player cannot be null");
|
||||||
|
return _backingMap.containsKey(key.getUniqueId());
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean containsKey(UUID key)
|
||||||
|
{
|
||||||
|
return _backingMap.containsKey(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean containsValue(Object value)
|
||||||
|
{
|
||||||
|
return _backingMap.containsValue(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Deprecated
|
||||||
|
public V get(Object key)
|
||||||
|
{
|
||||||
|
Validate.notNull(key, "Key cannot be null");
|
||||||
|
if (key instanceof Player)
|
||||||
|
{
|
||||||
|
return get((Player) key);
|
||||||
|
}
|
||||||
|
else if (key instanceof UUID)
|
||||||
|
{
|
||||||
|
return get((UUID) key);
|
||||||
|
}
|
||||||
|
throw new UnsupportedOperationException("Unknown key type: " + key.getClass().getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
public V get(Player key)
|
||||||
|
{
|
||||||
|
return _backingMap.get(key.getUniqueId());
|
||||||
|
}
|
||||||
|
|
||||||
|
public V get(UUID key)
|
||||||
|
{
|
||||||
|
return _backingMap.get(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public V put(UUID key, V value)
|
||||||
|
{
|
||||||
|
return _backingMap.put(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public V put(Player key, V value)
|
||||||
|
{
|
||||||
|
Validate.notNull(key, "Player cannot be null");
|
||||||
|
return put(key.getUniqueId(), value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Deprecated
|
||||||
|
public V remove(Object key)
|
||||||
|
{
|
||||||
|
Validate.notNull(key, "Key cannot be null");
|
||||||
|
if (key instanceof Player)
|
||||||
|
{
|
||||||
|
return remove((Player) key);
|
||||||
|
}
|
||||||
|
else if (key instanceof UUID)
|
||||||
|
{
|
||||||
|
return remove((UUID) key);
|
||||||
|
}
|
||||||
|
throw new UnsupportedOperationException("Unknown key type: " + key.getClass().getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
public V remove(Player key)
|
||||||
|
{
|
||||||
|
return _backingMap.remove(key.getUniqueId());
|
||||||
|
}
|
||||||
|
|
||||||
|
public V remove(UUID key)
|
||||||
|
{
|
||||||
|
return _backingMap.remove(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void putAll(@Nonnull Map<? extends UUID, ? extends V> m)
|
||||||
|
{
|
||||||
|
_backingMap.putAll(m);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void clear()
|
||||||
|
{
|
||||||
|
_backingMap.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Nonnull
|
||||||
|
public Set<UUID> keySet()
|
||||||
|
{
|
||||||
|
return _backingMap.keySet();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Nonnull
|
||||||
|
public Collection<V> values()
|
||||||
|
{
|
||||||
|
return _backingMap.values();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Nonnull
|
||||||
|
public Set<Entry<UUID, V>> entrySet()
|
||||||
|
{
|
||||||
|
return _backingMap.entrySet();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
return _backingMap.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o)
|
||||||
|
{
|
||||||
|
if (this == o) return true;
|
||||||
|
if (o == null || getClass() != o.getClass()) return false;
|
||||||
|
|
||||||
|
PlayerMap<?> playerMap = (PlayerMap<?>) o;
|
||||||
|
|
||||||
|
return _backingMap.equals(playerMap._backingMap);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode()
|
||||||
|
{
|
||||||
|
return _backingMap.hashCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class RemovalListener implements Listener
|
||||||
|
{
|
||||||
|
@EventHandler
|
||||||
|
public void onQuit(PlayerQuitEvent event)
|
||||||
|
{
|
||||||
|
synchronized (LOCK)
|
||||||
|
{
|
||||||
|
for (PlayerMap<?> map : ALL_PLAYER_MAPS)
|
||||||
|
{
|
||||||
|
map.remove(event.getPlayer());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user