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

@@ -6,6 +6,8 @@ package asys.singleserver;
import asys.api.ASysUtils;
import asys.api.BankObject;
import asys.api.MinecraftServerFactory;
import asys.api.ServerManager;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;
@@ -17,21 +19,28 @@ import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Properties;
import static asys.api.ASysUtils.GetProperty;
public class Activator implements BundleActivator {
private ServiceRegistration<?> serviceCmd;
private ServiceRegistration<?> serviceServerManager;
private ServiceRegistration<?> serviceCmd, serviceServerManager;
private ServiceTracker<?, BankObject> bankObjectTracker;
private ServiceTracker<?, MinecraftServerFactory> mcServerFactoryTracker;
private SingleServer singleServer;
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.open();
BankObject bankObject = bankObjectTracker.getService();
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");
}
@@ -43,6 +52,7 @@ public class Activator implements BundleActivator {
if (bankObject != null) singleServer.saveState(bankObject);
bankObjectTracker.close();
mcServerFactoryTracker.close();
}
@SuppressWarnings("ResultOfMethodCallIgnored")

View File

@@ -26,30 +26,30 @@ public class Commands {
@Command
@Descriptor("Server start")
public void start() {
serverManager.getServer().start();
serverManager.getServer(null).start();
log("Server start");
}
@Command
@Descriptor("Server stop")
public void stop() {
serverManager.getServer().stop();
serverManager.removeServer();
serverManager.getServer(null).stop();
serverManager.removeServer(null);
log("Server stop");
}
@Command
@Descriptor("Server force stop")
public void kill() {
serverManager.getServer().forceStop();
serverManager.removeServer();
serverManager.getServer(null).forceStop();
serverManager.removeServer(null);
log("Server kill");
}
@Command
@Descriptor("Server restart")
public void restart() {
MinecraftServer server = serverManager.getServer();
MinecraftServer server = serverManager.getServer(null);
server.stop();
server.start();
log("Server restart");
@@ -60,7 +60,7 @@ public class Commands {
public void alive() {
boolean alive = false;
MinecraftServer server = serverManager.getServer();
MinecraftServer server = serverManager.getServer(null);
if (server != null) alive = server.isAlive();
log("Server alive: %s", alive);
@@ -71,7 +71,7 @@ public class Commands {
public void cmd(String... command) {
StringJoiner sj = new StringJoiner(" ");
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.MinecraftServer;
import asys.api.MinecraftServerFactory;
import asys.api.ServerManager;
import asys.singleserver.mcserver.MinecraftProcessServer;
import asys.singleserver.mcserver.MinecraftScreenServer;
import org.osgi.util.tracker.ServiceTracker;
import java.nio.file.Files;
import java.nio.file.Path;
@@ -17,11 +17,12 @@ import java.util.Properties;
public class SingleServer implements ServerManager {
private MinecraftServer mcServer;
private ServiceTracker<?, MinecraftServerFactory> mcsFactoryTrcker;
private Properties configuration;
public SingleServer(Properties configuration)
{
public SingleServer(Properties configuration, ServiceTracker<?, MinecraftServerFactory> mcsFactoryTrcker) {
this.configuration = configuration;
this.mcsFactoryTrcker = mcsFactoryTrcker;
}
private void prepareMcServer() {
@@ -35,26 +36,20 @@ public class SingleServer implements ServerManager {
throw new RuntimeException(String.format("Main jar \"%s\" not found", mainJar.toString()));
}
if (configuration.getProperty("server.implement", "process").equalsIgnoreCase("screen")) {
System.out.println("McServer implements: screen");
mcServer = new MinecraftScreenServer("mcserver", serverPath.toFile(), mainJar.toString(),
configuration.getProperty("server.jvm.args", null),
configuration.getProperty("server.params", null));
} 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));
MinecraftServerFactory mcFactory;
try {
mcFactory = mcsFactoryTrcker.waitForService(5000);
} catch (InterruptedException ignored) {
return;
}
}
public MinecraftServer getServer() {
if (mcServer == null) prepareMcServer();
return mcServer;
}
if (mcFactory == null) {
throw new RuntimeException(String.format("Service \"%s\" not found", MinecraftServerFactory.class.getName()));
}
public void removeServer() {
mcServer = null;
mcServer = mcFactory.createServer("mcserver", serverPath.toFile(), mainJar.toString(),
configuration.getProperty("server.jvm.args", null),
configuration.getProperty("server.params", null));
}
public void saveState(BankObject bankObject) {
@@ -64,5 +59,16 @@ public class SingleServer implements ServerManager {
public void loadState(BankObject bankObject) {
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

@@ -1,6 +1,4 @@
server.path=server
server.mainjar=spigot.jar
server.params=
server.jvm.args=
# process, screen
server.implement=process
server.jvm.args=