diff --git a/SingleServer/pom.xml b/SingleServer/pom.xml new file mode 100644 index 0000000..382be24 --- /dev/null +++ b/SingleServer/pom.xml @@ -0,0 +1,58 @@ + + + 4.0.0 + Single Server + + singleserver + 0.16 + bundle + + + asys + asys + 0.5 + + + + + asys + core + 0.18 + + + + + ${project.groupId}.${project.artifactId}-${project.version} + + + org.apache.felix + maven-bundle-plugin + 3.0.1 + true + + + ASys: ${project.name} + ${project.groupId}.${project.artifactId} + asys.singleserver.SingleServerActivator + asys.core.api, * + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.0.2 + + + + asys.core.api.IServerManager + + + + + + + \ No newline at end of file diff --git a/SingleServer/src/main/java/asys/singleserver/Commands.java b/SingleServer/src/main/java/asys/singleserver/Commands.java new file mode 100644 index 0000000..1c3535b --- /dev/null +++ b/SingleServer/src/main/java/asys/singleserver/Commands.java @@ -0,0 +1,32 @@ +/* + * DmitriyMX + * 2016-08-07 + */ +package asys.singleserver; + +import asys.core.api.IServerManager; +import org.apache.felix.service.command.Descriptor; + +import java.util.Dictionary; +import java.util.Hashtable; + +public class Commands { + private IServerManager serverManager; + + public static Dictionary getDictionary() { + Hashtable dictionary = new Hashtable<>(); + dictionary.put("osgi.command.scope", "asys.singleserver"); + dictionary.put("osgi.command.function", new String[] { "startserver" }); + return dictionary; + } + + public Commands(IServerManager serverManager) { + this.serverManager = serverManager; + } + + @Descriptor("Server start") + public void startserver() { + serverManager.getServer(null).start(); + } + +} diff --git a/SingleServer/src/main/java/asys/singleserver/MinecraftWinServer.java b/SingleServer/src/main/java/asys/singleserver/MinecraftWinServer.java new file mode 100644 index 0000000..998f755 --- /dev/null +++ b/SingleServer/src/main/java/asys/singleserver/MinecraftWinServer.java @@ -0,0 +1,72 @@ +/* + * DmitriyMX + * 2016-07-30 + */ +package asys.singleserver; + +import asys.core.api.IMinecraftServer; + +import java.io.*; +import java.nio.file.Path; +import java.util.List; +import java.util.Vector; + +public class MinecraftWinServer implements IMinecraftServer { + private ProcessBuilder processBuilder; + + /** запуск через скрипт */ + public MinecraftWinServer(Path directory, Path script) { + processBuilder = new ProcessBuilder(); + processBuilder.directory(directory.toFile()); + processBuilder.command("cmd.exe", "/C", "start", script.toString()); + } + + /** запуск через asys */ + public MinecraftWinServer(Path directory, Path mainJar, String jvmArgs, String params) { + processBuilder = new ProcessBuilder(); + processBuilder.directory(directory.toFile()); + List commandLine = new Vector<>(); + commandLine.add("cmd.exe"); + commandLine.add("/C"); + commandLine.add("start"); + commandLine.add("java"); + if (jvmArgs != null && !jvmArgs.trim().isEmpty()) { + commandLine.add(jvmArgs); + } + commandLine.add("-jar"); + commandLine.add(mainJar.toString()); + if (params != null && !params.trim().isEmpty()) { + commandLine.add(params); + } + processBuilder.command(commandLine); + } + + @Override + public void start() { + try { + processBuilder.start(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public void stop() { + sendCommand("stop"); + } + + @Override + public void forceStop() { + //TODO need code + } + + @Override + public boolean isAlive() { + return false; //TODO need code + } + + @Override + public void sendCommand(String command) { + //TODO need code + } +} diff --git a/SingleServer/src/main/java/asys/singleserver/SingleServer.java b/SingleServer/src/main/java/asys/singleserver/SingleServer.java new file mode 100644 index 0000000..ff517bd --- /dev/null +++ b/SingleServer/src/main/java/asys/singleserver/SingleServer.java @@ -0,0 +1,86 @@ +/* + * DmitriyMX + * 2016-07-30 + */ +package asys.singleserver; + +import asys.core.api.ICore; +import asys.core.api.IMinecraftServer; +import asys.core.api.IServerManager; +import org.osgi.framework.BundleContext; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Properties; + +public class SingleServer implements IServerManager { + private IMinecraftServer mcServer; + private BundleContext bundleContext; + + public SingleServer(BundleContext bundleContext) { + this.bundleContext = bundleContext; + + Path serverPath = Paths.get(getProperty("asys.singleserver.server.path")); + if (Files.notExists(serverPath)) { + throw new RuntimeException(String.format("Server path \"%s\" not found", serverPath.toString())); + } + + if (getProperty("asys.singleserver.runscript.use", "false").equalsIgnoreCase("true")) { + Path scriptFile = Paths.get(getProperty("asys.singleserver.runscript.file")); + if (Files.notExists(scriptFile)) { + throw new RuntimeException(String.format("Runscript \"%s\" not found", scriptFile.toString())); + } + + if (!Files.isExecutable(scriptFile)) { + throw new RuntimeException(String.format("Runscript \"%s\" is not executable", scriptFile.toString())); + } + + mcServer = new MinecraftWinServer(serverPath, scriptFile); + } else { + Path mainJar = serverPath.resolve(getProperty("asys.singleserver.server.mainjar")); + if (Files.notExists(mainJar)) { + throw new RuntimeException(String.format("Main jar \"%s\" not found", mainJar.toString())); + } + + mcServer = new MinecraftWinServer(serverPath, mainJar, + getProperty("asys.singleserver.server.jvm.args", null), + getProperty("asys.singleserver.server.params", null)); + } + } + + @Override + public IMinecraftServer developServer(String serverName) { + return mcServer; + } + + @Override + public IMinecraftServer getServer(String serverName) { + return mcServer; + } + + void loadState() { + ICore core = SingleServerActivator.instance.getCore(); + IMinecraftServer testMcServer = (IMinecraftServer) core.loadObject(SingleServer.class.getName() + "#mcServer"); + if (testMcServer != null) { + mcServer = testMcServer; + } + } + + void saveState() { + ICore core = SingleServerActivator.instance.getCore(); + core.saveObject(SingleServer.class.getName() + "#mcServer", mcServer); + } + + private String getProperty(String name) { + return getProperty(name, null); + } + + private String getProperty(String name, String defValue) { + try { + return bundleContext.getProperty(name); + } catch (NullPointerException e) { + return defValue; + } + } +} diff --git a/SingleServer/src/main/java/asys/singleserver/SingleServerActivator.java b/SingleServer/src/main/java/asys/singleserver/SingleServerActivator.java new file mode 100644 index 0000000..db64f6b --- /dev/null +++ b/SingleServer/src/main/java/asys/singleserver/SingleServerActivator.java @@ -0,0 +1,48 @@ +/* + * DmitriyMX + * 2016-07-30 + */ +package asys.singleserver; + +import asys.core.api.ICore; +import asys.core.api.IServerManager; +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceRegistration; +import org.osgi.util.tracker.ServiceTracker; + +public class SingleServerActivator implements BundleActivator { + static SingleServerActivator instance; + private ServiceRegistration service, cmdService; + private ServiceTracker tracker; + private SingleServer singleServer; + + @Override + public void start(BundleContext bundleContext) throws Exception { + instance = this; + + tracker = new ServiceTracker<>(bundleContext, ICore.class.getName(), null); + tracker.open(); + + singleServer = new SingleServer(bundleContext); + singleServer.loadState(); + service = bundleContext.registerService(IServerManager.class.getName(), singleServer, null); + + // Регистрация комманд для Gogo Shell + cmdService = bundleContext.registerService( + Commands.class.getName(), new Commands(singleServer), Commands.getDictionary()); + } + + @Override + public void stop(BundleContext bundleContext) throws Exception { + cmdService.unregister(); + singleServer.saveState(); + tracker.close(); + service.unregister(); + instance = null; + } + + ICore getCore() { + return tracker.getService(); + } +} diff --git a/pom.xml b/pom.xml index cdb78a5..dd25c88 100644 --- a/pom.xml +++ b/pom.xml @@ -14,7 +14,6 @@ - 0.2 UTF-8 1.8 1.7.20 @@ -23,10 +22,11 @@ asys asys pom - ${asys.version} + 0.5 core + singleserver