Archived
0

добавлен H2PlayerManager

This commit is contained in:
2018-09-16 00:26:13 +03:00
parent 6316e14544
commit 41c2e4933d
3 changed files with 325 additions and 0 deletions

View 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;
}
}
}

View File

@@ -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;
}
}

View File

@@ -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);
}
}