Archived
0

Обновление модуля: SingleServer

Переход на использование внешних модулей, реализующих интерфейс MinecraftServer и предоставляющих сервис MinecraftServerFactory.
This commit is contained in:
2016-08-15 16:09:39 +03:00
parent 00bfd67e2a
commit edae199b00
5 changed files with 52 additions and 38 deletions

View File

@@ -20,14 +20,14 @@
<groupId>asys</groupId> <groupId>asys</groupId>
<artifactId>singleserver</artifactId> <artifactId>singleserver</artifactId>
<version>0.2</version> <version>0.3</version>
<packaging>bundle</packaging> <packaging>bundle</packaging>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>asys</groupId> <groupId>asys</groupId>
<artifactId>api</artifactId> <artifactId>api</artifactId>
<version>0.5</version> <version>0.6</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.osgi</groupId> <groupId>org.osgi</groupId>

View File

@@ -6,6 +6,8 @@ package asys.singleserver;
import asys.api.ASysUtils; import asys.api.ASysUtils;
import asys.api.BankObject; import asys.api.BankObject;
import asys.api.MinecraftServerFactory;
import asys.api.ServerManager;
import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext; import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration; import org.osgi.framework.ServiceRegistration;
@@ -17,21 +19,28 @@ import java.nio.file.Path;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.util.Properties; import java.util.Properties;
import static asys.api.ASysUtils.GetProperty;
public class Activator implements BundleActivator { public class Activator implements BundleActivator {
private ServiceRegistration<?> serviceCmd; private ServiceRegistration<?> serviceCmd, serviceServerManager;
private ServiceRegistration<?> serviceServerManager;
private ServiceTracker<?, BankObject> bankObjectTracker; private ServiceTracker<?, BankObject> bankObjectTracker;
private ServiceTracker<?, MinecraftServerFactory> mcServerFactoryTracker;
private SingleServer singleServer; private SingleServer singleServer;
public void start(BundleContext bundleContext) throws Exception { public void start(BundleContext bundleContext) throws Exception {
singleServer = new SingleServer(loadProperties(ASysUtils.GetProperty(bundleContext, "asys.config.dir", "conf"))); mcServerFactoryTracker = new ServiceTracker<>(bundleContext, MinecraftServerFactory.class.getName(), null);
mcServerFactoryTracker.open();
singleServer = new SingleServer(
loadProperties(GetProperty(bundleContext, "asys.config.dir", "conf")),
mcServerFactoryTracker);
bankObjectTracker = new ServiceTracker<>(bundleContext, BankObject.class.getName(), null); bankObjectTracker = new ServiceTracker<>(bundleContext, BankObject.class.getName(), null);
bankObjectTracker.open(); bankObjectTracker.open();
BankObject bankObject = bankObjectTracker.getService(); BankObject bankObject = bankObjectTracker.getService();
if (bankObject != null) singleServer.loadState(bankObject); if (bankObject != null) singleServer.loadState(bankObject);
serviceServerManager = bundleContext.registerService(asys.api.ServerManager.class.getName(), singleServer, null); serviceServerManager = bundleContext.registerService(ServerManager.class.getName(), singleServer, null);
serviceCmd = ASysUtils.RegisterCommands(bundleContext, new Commands(singleServer), "asys.server"); serviceCmd = ASysUtils.RegisterCommands(bundleContext, new Commands(singleServer), "asys.server");
} }
@@ -43,6 +52,7 @@ public class Activator implements BundleActivator {
if (bankObject != null) singleServer.saveState(bankObject); if (bankObject != null) singleServer.saveState(bankObject);
bankObjectTracker.close(); bankObjectTracker.close();
mcServerFactoryTracker.close();
} }
@SuppressWarnings("ResultOfMethodCallIgnored") @SuppressWarnings("ResultOfMethodCallIgnored")

View File

@@ -26,30 +26,30 @@ public class Commands {
@Command @Command
@Descriptor("Server start") @Descriptor("Server start")
public void start() { public void start() {
serverManager.getServer().start(); serverManager.getServer(null).start();
log("Server start"); log("Server start");
} }
@Command @Command
@Descriptor("Server stop") @Descriptor("Server stop")
public void stop() { public void stop() {
serverManager.getServer().stop(); serverManager.getServer(null).stop();
serverManager.removeServer(); serverManager.removeServer(null);
log("Server stop"); log("Server stop");
} }
@Command @Command
@Descriptor("Server force stop") @Descriptor("Server force stop")
public void kill() { public void kill() {
serverManager.getServer().forceStop(); serverManager.getServer(null).forceStop();
serverManager.removeServer(); serverManager.removeServer(null);
log("Server kill"); log("Server kill");
} }
@Command @Command
@Descriptor("Server restart") @Descriptor("Server restart")
public void restart() { public void restart() {
MinecraftServer server = serverManager.getServer(); MinecraftServer server = serverManager.getServer(null);
server.stop(); server.stop();
server.start(); server.start();
log("Server restart"); log("Server restart");
@@ -60,7 +60,7 @@ public class Commands {
public void alive() { public void alive() {
boolean alive = false; boolean alive = false;
MinecraftServer server = serverManager.getServer(); MinecraftServer server = serverManager.getServer(null);
if (server != null) alive = server.isAlive(); if (server != null) alive = server.isAlive();
log("Server alive: %s", alive); log("Server alive: %s", alive);
@@ -71,7 +71,7 @@ public class Commands {
public void cmd(String... command) { public void cmd(String... command) {
StringJoiner sj = new StringJoiner(" "); StringJoiner sj = new StringJoiner(" ");
Arrays.asList(command).forEach(sj::add); Arrays.asList(command).forEach(sj::add);
serverManager.getServer().sendCommand(sj.toString()); serverManager.getServer(null).sendCommand(sj.toString());
} }
} }

View File

@@ -6,9 +6,9 @@ package asys.singleserver;
import asys.api.BankObject; import asys.api.BankObject;
import asys.api.MinecraftServer; import asys.api.MinecraftServer;
import asys.api.MinecraftServerFactory;
import asys.api.ServerManager; import asys.api.ServerManager;
import asys.singleserver.mcserver.MinecraftProcessServer; import org.osgi.util.tracker.ServiceTracker;
import asys.singleserver.mcserver.MinecraftScreenServer;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
@@ -17,11 +17,12 @@ import java.util.Properties;
public class SingleServer implements ServerManager { public class SingleServer implements ServerManager {
private MinecraftServer mcServer; private MinecraftServer mcServer;
private ServiceTracker<?, MinecraftServerFactory> mcsFactoryTrcker;
private Properties configuration; private Properties configuration;
public SingleServer(Properties configuration) public SingleServer(Properties configuration, ServiceTracker<?, MinecraftServerFactory> mcsFactoryTrcker) {
{
this.configuration = configuration; this.configuration = configuration;
this.mcsFactoryTrcker = mcsFactoryTrcker;
} }
private void prepareMcServer() { private void prepareMcServer() {
@@ -35,26 +36,20 @@ public class SingleServer implements ServerManager {
throw new RuntimeException(String.format("Main jar \"%s\" not found", mainJar.toString())); throw new RuntimeException(String.format("Main jar \"%s\" not found", mainJar.toString()));
} }
if (configuration.getProperty("server.implement", "process").equalsIgnoreCase("screen")) { MinecraftServerFactory mcFactory;
System.out.println("McServer implements: screen"); try {
mcServer = new MinecraftScreenServer("mcserver", serverPath.toFile(), mainJar.toString(), mcFactory = mcsFactoryTrcker.waitForService(5000);
configuration.getProperty("server.jvm.args", null), } catch (InterruptedException ignored) {
configuration.getProperty("server.params", null)); return;
} else {
System.out.println("McServer implements: process");
mcServer = new MinecraftProcessServer("mcserver", serverPath.toFile(), mainJar.toString(),
configuration.getProperty("server.jvm.args", null),
configuration.getProperty("server.params", null));
} }
}
public MinecraftServer getServer() { if (mcFactory == null) {
if (mcServer == null) prepareMcServer(); throw new RuntimeException(String.format("Service \"%s\" not found", MinecraftServerFactory.class.getName()));
return mcServer; }
}
public void removeServer() { mcServer = mcFactory.createServer("mcserver", serverPath.toFile(), mainJar.toString(),
mcServer = null; configuration.getProperty("server.jvm.args", null),
configuration.getProperty("server.params", null));
} }
public void saveState(BankObject bankObject) { public void saveState(BankObject bankObject) {
@@ -64,5 +59,16 @@ public class SingleServer implements ServerManager {
public void loadState(BankObject bankObject) { public void loadState(BankObject bankObject) {
mcServer = (MinecraftServer) bankObject.get(SingleServer.class.getName() + "#mcServer"); mcServer = (MinecraftServer) bankObject.get(SingleServer.class.getName() + "#mcServer");
} }
@Override
public MinecraftServer getServer(String name) {
if (mcServer == null) prepareMcServer();
return mcServer;
}
@Override
public void removeServer(String name) {
mcServer = null;
}
} }

View File

@@ -2,5 +2,3 @@ server.path=server
server.mainjar=spigot.jar server.mainjar=spigot.jar
server.params= server.params=
server.jvm.args= server.jvm.args=
# process, screen
server.implement=process