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, ICore> 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