From 41c2e4933db04680ae530bb4f71295b79a773e8d Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 16 Sep 2018 00:26:13 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20H2PlayerManager?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/mc/core/h2db/H2PlayerManager.java | 135 +++++++++++++ .../test/java/mc/core/h2db/SpringConfig.java | 9 + .../mc/core/h2db/TestH2PlayerManager.java | 181 ++++++++++++++++++ 3 files changed, 325 insertions(+) create mode 100644 h2_playermanager/src/main/java/mc/core/h2db/H2PlayerManager.java create mode 100644 h2_playermanager/src/test/java/mc/core/h2db/TestH2PlayerManager.java diff --git a/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerManager.java b/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerManager.java new file mode 100644 index 0000000..fdd4b11 --- /dev/null +++ b/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerManager.java @@ -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 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 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; + } + } +} diff --git a/h2_playermanager/src/test/java/mc/core/h2db/SpringConfig.java b/h2_playermanager/src/test/java/mc/core/h2db/SpringConfig.java index e4417e3..58eb283 100644 --- a/h2_playermanager/src/test/java/mc/core/h2db/SpringConfig.java +++ b/h2_playermanager/src/test/java/mc/core/h2db/SpringConfig.java @@ -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; + } } diff --git a/h2_playermanager/src/test/java/mc/core/h2db/TestH2PlayerManager.java b/h2_playermanager/src/test/java/mc/core/h2db/TestH2PlayerManager.java new file mode 100644 index 0000000..163f72c --- /dev/null +++ b/h2_playermanager/src/test/java/mc/core/h2db/TestH2PlayerManager.java @@ -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 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); + } +}