добавлен H2PlayerManager
This commit is contained in:
135
h2_playermanager/src/main/java/mc/core/h2db/H2PlayerManager.java
Normal file
135
h2_playermanager/src/main/java/mc/core/h2db/H2PlayerManager.java
Normal file
@@ -0,0 +1,135 @@
|
||||
package mc.core.h2db;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import lombok.Setter;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import mc.core.EntityLocation;
|
||||
import mc.core.network.BroadcastNetChannel;
|
||||
import mc.core.network.NetChannel;
|
||||
import mc.core.player.Player;
|
||||
import mc.core.player.PlayerManager;
|
||||
import mc.core.world.World;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
import static org.slf4j.helpers.MessageFormatter.format;
|
||||
|
||||
@Slf4j
|
||||
@Component
|
||||
public class H2PlayerManager implements PlayerManager {
|
||||
@Setter
|
||||
@Autowired
|
||||
private H2PlayerDAO h2playerDao;
|
||||
private List<H2Player> playerList = new ArrayList<>();
|
||||
|
||||
@Override
|
||||
public Player createPlayer(String name, EntityLocation location, World world) {
|
||||
//TODO в дальнейшем следует в этом методе только имплементацию Player
|
||||
H2Player h2Player = new H2Player();
|
||||
h2Player.setName(name);
|
||||
h2Player.setUuid(UUID.randomUUID());
|
||||
h2Player.setLocation(location.clone());
|
||||
h2Player.setLoadedChunks(new ArrayList<>());
|
||||
h2Player.setWorld(world);
|
||||
|
||||
try {
|
||||
h2playerDao.insert(h2Player);
|
||||
} catch (SQLException e) {
|
||||
log.error(format("Insert player '{}'", h2Player.getName()).getMessage(), e);
|
||||
return null;
|
||||
}
|
||||
|
||||
return h2Player;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void joinServer(Player player) {
|
||||
//TODO в дальнейшем следует именно этому методу передать функции инсерта в БД
|
||||
H2Player h2Player = (H2Player) player;
|
||||
playerList.add(h2Player);
|
||||
h2Player.setOnline(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void leftServer(Player player) {
|
||||
H2Player h2Player = (H2Player) player;
|
||||
try {
|
||||
h2playerDao.update(h2Player);
|
||||
} catch (SQLException e) {
|
||||
log.error(format("Update player '{}'", h2Player.getName()).getMessage(), e);
|
||||
playerList.remove(h2Player);
|
||||
} finally {
|
||||
h2Player.setId(0);
|
||||
h2Player.setOnline(false);
|
||||
h2Player.setWorld(null);
|
||||
h2Player.getLoadedChunks().clear();
|
||||
h2Player.setSettings(null);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Player getPlayer(String name) {
|
||||
return playerList.stream()
|
||||
.filter(player -> player.getName().equals(name))
|
||||
.filter(H2Player::isOnline)
|
||||
.findFirst().orElse(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Player> getPlayers() {
|
||||
return playerList.stream()
|
||||
.filter(H2Player::isOnline)
|
||||
.collect(ImmutableList.toImmutableList());
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCountPlayers() {
|
||||
return (int) playerList.stream()
|
||||
.filter(H2Player::isOnline)
|
||||
.count();
|
||||
}
|
||||
|
||||
@Override
|
||||
public NetChannel getBroadcastChannel() {
|
||||
return new BroadcastNetChannel(
|
||||
playerList.stream()
|
||||
.filter(H2Player::isOnline)
|
||||
.map(player -> (Player)player)
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Player getOfflinePlayer(String name) {
|
||||
H2Player h2Player = playerList.stream()
|
||||
.filter(player -> player.getName().equals(name))
|
||||
.filter(player -> !player.isOnline())
|
||||
.findFirst().orElse(null);
|
||||
|
||||
if (h2Player == null) {
|
||||
h2Player = playerList.stream()
|
||||
.filter(player -> !player.isOnline())
|
||||
.findAny().orElse(new H2Player());
|
||||
h2Player.setName(name);
|
||||
|
||||
try {
|
||||
h2playerDao.getByName(h2Player);
|
||||
} catch (SQLException e) {
|
||||
log.error(format("getByName player '{}'", h2Player.getName()).getMessage(), e);
|
||||
return null;
|
||||
}
|
||||
|
||||
if (h2Player.getId() == 0) {
|
||||
return null;
|
||||
} else {
|
||||
return h2Player;
|
||||
}
|
||||
} else {
|
||||
return h2Player;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4,6 +4,7 @@ import mc.core.world.World;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.ComponentScan;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.Scope;
|
||||
import org.springframework.jdbc.core.JdbcTemplate;
|
||||
import org.springframework.jdbc.datasource.DriverManagerDataSource;
|
||||
|
||||
@@ -37,4 +38,12 @@ public class SpringConfig {
|
||||
jdbcTemplate.setDataSource(dataSource);
|
||||
return jdbcTemplate;
|
||||
}
|
||||
|
||||
@Bean
|
||||
@Scope(value = "prototype")
|
||||
public H2PlayerManager h2PlayerManager(H2PlayerDAO h2PlayerDAO) {
|
||||
H2PlayerManager playerManager = new H2PlayerManager();
|
||||
playerManager.setH2playerDao(h2PlayerDAO);
|
||||
return playerManager;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,181 @@
|
||||
package mc.core.h2db;
|
||||
|
||||
import mc.core.EntityLocation;
|
||||
import mc.core.player.Player;
|
||||
import mc.core.world.World;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.jdbc.core.JdbcTemplate;
|
||||
import org.springframework.test.context.ContextConfiguration;
|
||||
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.sql.SQLException;
|
||||
import java.util.List;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
@RunWith(SpringJUnit4ClassRunner.class)
|
||||
@ContextConfiguration(classes = {SpringConfig.class})
|
||||
public class TestH2PlayerManager {
|
||||
@Autowired
|
||||
private ApplicationContext context;
|
||||
@Autowired
|
||||
private JdbcTemplate jdbcTemplate;
|
||||
@Autowired
|
||||
private H2PlayerDAO h2PlayerDAO;
|
||||
@Autowired
|
||||
private World mockWorld;
|
||||
private H2PlayerManager playerManager;
|
||||
|
||||
@Before
|
||||
public void before() throws IOException {
|
||||
playerManager = context.getBean(H2PlayerManager.class);
|
||||
|
||||
jdbcTemplate.execute(IOUtils.resourceToString("/sqls/drop_table_players.sql", StandardCharsets.UTF_8));
|
||||
jdbcTemplate.execute(IOUtils.resourceToString("/sqls/create_tables.sql", StandardCharsets.UTF_8));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCreatePlayer() throws SQLException {
|
||||
final String playerName = "NEW_PLAYER";
|
||||
final Player newPlayer = playerManager.createPlayer(playerName, EntityLocation.ZERO(), mockWorld);
|
||||
|
||||
assertNotNull(newPlayer);
|
||||
assertEquals(H2Player.class, newPlayer.getClass());
|
||||
assertTrue(newPlayer.getId() > 0);
|
||||
|
||||
final H2Player queryPlayer = new H2Player();
|
||||
queryPlayer.setName(playerName);
|
||||
h2PlayerDAO.getByName(queryPlayer);
|
||||
assertTrue(queryPlayer.getId() > 0);
|
||||
|
||||
assertEquals(newPlayer, queryPlayer);
|
||||
assertEquals(newPlayer.getName(), queryPlayer.getName());
|
||||
assertEquals(newPlayer.getLocation(), queryPlayer.getLocation());
|
||||
assertEquals(newPlayer.getWorld(), queryPlayer.getWorld());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testJoinServer() {
|
||||
assertEquals(0, playerManager.getCountPlayers());
|
||||
|
||||
final String playerName = "NEW_PLAYER";
|
||||
final Player player = playerManager.createPlayer(playerName, EntityLocation.ZERO(), mockWorld);
|
||||
playerManager.joinServer(player);
|
||||
|
||||
assertEquals(1, playerManager.getCountPlayers());
|
||||
assertTrue(player.isOnline());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLeftServer() throws SQLException {
|
||||
assertEquals(0, playerManager.getCountPlayers());
|
||||
|
||||
final String playerName = "NEW_PLAYER";
|
||||
final Player player = playerManager.createPlayer(playerName, EntityLocation.ZERO(), mockWorld);
|
||||
playerManager.joinServer(player);
|
||||
|
||||
assertEquals(1, playerManager.getCountPlayers());
|
||||
assertTrue(player.isOnline());
|
||||
|
||||
final int playerId = player.getId();
|
||||
|
||||
final String anotherName = "ANOTHER_NAME";
|
||||
((H2Player)player).setName(anotherName);
|
||||
|
||||
playerManager.leftServer(player);
|
||||
|
||||
assertEquals(0, playerManager.getCountPlayers());
|
||||
|
||||
assertFalse(player.isOnline());
|
||||
assertEquals(0, player.getId());
|
||||
assertNull(player.getWorld());
|
||||
assertTrue(player.getLoadedChunks().isEmpty());
|
||||
assertNull(player.getSettings());
|
||||
|
||||
H2Player queryPlayer = new H2Player();
|
||||
queryPlayer.setId(playerId);
|
||||
boolean result = h2PlayerDAO.getById(queryPlayer);
|
||||
|
||||
assertTrue(result);
|
||||
((H2Player)player).setId(playerId);
|
||||
assertEquals(player, queryPlayer);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetPlayer() {
|
||||
assertEquals(0, playerManager.getCountPlayers());
|
||||
|
||||
final String playerName = "NEW_PLAYER";
|
||||
final Player player = playerManager.createPlayer(playerName, EntityLocation.ZERO(), mockWorld);
|
||||
assertNotNull(player);
|
||||
|
||||
playerManager.joinServer(player);
|
||||
|
||||
assertEquals(1, playerManager.getCountPlayers());
|
||||
|
||||
Player queryPlayer = playerManager.getPlayer(playerName);
|
||||
|
||||
assertEquals(player, queryPlayer);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetPlayers() {
|
||||
assertEquals(0, playerManager.getCountPlayers());
|
||||
|
||||
final String playerName = "NEW_PLAYER";
|
||||
final Player player = playerManager.createPlayer(playerName, EntityLocation.ZERO(), mockWorld);
|
||||
assertNotNull(player);
|
||||
|
||||
playerManager.joinServer(player);
|
||||
|
||||
assertEquals(1, playerManager.getCountPlayers());
|
||||
|
||||
List<Player> players = playerManager.getPlayers();
|
||||
assertEquals(1, players.size());
|
||||
try {
|
||||
players.add(new H2Player());
|
||||
fail();
|
||||
} catch (Exception e) {
|
||||
assertTrue(true);
|
||||
}
|
||||
|
||||
assertEquals(player, players.get(0));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetCountPlayers() {
|
||||
assertEquals(0, playerManager.getCountPlayers());
|
||||
|
||||
final String playerName = "NEW_PLAYER";
|
||||
final Player player = playerManager.createPlayer(playerName, EntityLocation.ZERO(), mockWorld);
|
||||
assertNotNull(player);
|
||||
|
||||
playerManager.joinServer(player);
|
||||
|
||||
assertEquals(1, playerManager.getCountPlayers());
|
||||
|
||||
playerManager.leftServer(player);
|
||||
|
||||
assertEquals(0, playerManager.getCountPlayers());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetOfflinePlayer() {
|
||||
final String playerName = "NEW_PLAYER";
|
||||
final Player player = playerManager.createPlayer(playerName, EntityLocation.ZERO(), mockWorld);
|
||||
playerManager.joinServer(player);
|
||||
playerManager.leftServer(player);
|
||||
|
||||
assertEquals(0, playerManager.getCountPlayers());
|
||||
|
||||
Player offlinePlayer = playerManager.getOfflinePlayer(playerName);
|
||||
assertEquals(player, offlinePlayer);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user