From 1be3fb3d8691f15362e2f5bea0241c1c0a2871b1 Mon Sep 17 00:00:00 2001
From: tobias <tobias.ullerich@icloud.com>
Date: Sat, 9 Jul 2016 18:39:04 +0200
Subject: [PATCH] Add different plugin channels depending on update channel

---
 .../tobias/playpad/assets/lang/_de.properties |  1 +
 PlayWall/src/application.yml                  |  4 +-
 .../de/tobias/playpad/AppUserInfoStrings.java |  3 +-
 PlayWall/src/de/tobias/playpad/Strings.java   |  5 +-
 .../viewcontroller/PluginViewController.java  | 33 +++++++++--
 .../viewcontroller/cell/PluginCell.java       | 41 ++++++++++----
 .../src/de/tobias/playpad/plugin/Plugin.java  | 56 ++++---------------
 .../src/de/tobias/playpad/plugin/Plugins.java | 56 +++++++++++++++++++
 8 files changed, 133 insertions(+), 66 deletions(-)
 create mode 100644 PlayWallCore/src/de/tobias/playpad/plugin/Plugins.java

diff --git a/PlayWall/assets/de/tobias/playpad/assets/lang/_de.properties b/PlayWall/assets/de/tobias/playpad/assets/lang/_de.properties
index 9eb27f1e..6e553fe7 100644
--- a/PlayWall/assets/de/tobias/playpad/assets/lang/_de.properties
+++ b/PlayWall/assets/de/tobias/playpad/assets/lang/_de.properties
@@ -163,6 +163,7 @@ Error.Midi.Send=Der Midi Befehl konnte nicht gesendet werden. ({})
 
 # Error - Plugins
 Error.Plugins.Download=Das Plugin {} konnte nicht geladen werden.
+Error.Plugins.Avaiable=Es sind keine Plugins f�r dieses Update Kanal verf�gbar.
 
 #Mapper
 Mapper.Keyboard.Name=Tastatur
diff --git a/PlayWall/src/application.yml b/PlayWall/src/application.yml
index d2917e24..cb691eaa 100644
--- a/PlayWall/src/application.yml
+++ b/PlayWall/src/application.yml
@@ -10,6 +10,8 @@ updateURL: http://tobisan.no-ip.org/files/PlayWall
 userInfo:
   Website: http://tobisan.no-ip.org/
   ErrorURL: http://tobisan.no-ip.org/upload.php
-  PluginsURL: http://tobisan.no-ip.org/files/PlayWall/plugins.yml
+  PluginsURL: 
+     Stable: http://tobisan.no-ip.org/files/PlayWall/stable/plugins.yml
+     Beta: http://tobisan.no-ip.org/files/PlayWall/beta/plugins.yml
   ChangelogURL: http://tobisan.no-ip.org/whatsnew-2.php?id=1
   UpdaterProgram: http://tobisan.no-ip.org/files/Updater/
diff --git a/PlayWall/src/de/tobias/playpad/AppUserInfoStrings.java b/PlayWall/src/de/tobias/playpad/AppUserInfoStrings.java
index df966939..892cf276 100644
--- a/PlayWall/src/de/tobias/playpad/AppUserInfoStrings.java
+++ b/PlayWall/src/de/tobias/playpad/AppUserInfoStrings.java
@@ -3,7 +3,8 @@ package de.tobias.playpad;
 public class AppUserInfoStrings {
 
 	public static final String WEBSITE = "Website";
-	public static final String PLUGINS_URL = "PluginsURL";
+	public static final String PLUGINS_URL_STABLE = "PluginsURL.Stable";
+	public static final String PLUGINS_URL_BETA = "PluginsURL.Beta";
 	public static final String ERROR_URL = "ErrorURL";
 	public static final String CHANGELOG_URL = "ChangelogURL";
 	public static final String UPDATER_PROGRAM = "UpdaterProgram";
diff --git a/PlayWall/src/de/tobias/playpad/Strings.java b/PlayWall/src/de/tobias/playpad/Strings.java
index 04c0cc3b..6a84f43d 100644
--- a/PlayWall/src/de/tobias/playpad/Strings.java
+++ b/PlayWall/src/de/tobias/playpad/Strings.java
@@ -156,10 +156,7 @@ public class Strings {
 
 	// Error - Plugins
 	@Deprecated public static final String Error_Plugins_Download = "Error.Plugins.Download";
-
-	/*
-	 * NEU
-	 */
+	public static final String Error_Plugins_Available = "Error.Plugins.Available";
 
 	// Mapper
 	public static final String Mapper_Keyboard_Name = "Mapper.Keyboard.Name";
diff --git a/PlayWall/src/de/tobias/playpad/viewcontroller/PluginViewController.java b/PlayWall/src/de/tobias/playpad/viewcontroller/PluginViewController.java
index d519188a..7b016bad 100644
--- a/PlayWall/src/de/tobias/playpad/viewcontroller/PluginViewController.java
+++ b/PlayWall/src/de/tobias/playpad/viewcontroller/PluginViewController.java
@@ -2,17 +2,23 @@ package de.tobias.playpad.viewcontroller;
 
 import java.io.IOException;
 import java.util.Collections;
+import java.util.List;
+
+import org.bukkit.configuration.MemorySection;
 
 import de.tobias.playpad.AppUserInfoStrings;
 import de.tobias.playpad.PlayPadMain;
 import de.tobias.playpad.Strings;
 import de.tobias.playpad.plugin.Plugin;
+import de.tobias.playpad.plugin.Plugins;
 import de.tobias.playpad.settings.Profile;
+import de.tobias.playpad.update.UpdateChannel;
 import de.tobias.playpad.viewcontroller.cell.PluginCell;
 import de.tobias.utils.application.ApplicationUtils;
 import de.tobias.utils.ui.ViewController;
 import de.tobias.utils.util.Localization;
 import de.tobias.utils.util.Worker;
+import javafx.application.Platform;
 import javafx.event.ActionEvent;
 import javafx.fxml.FXML;
 import javafx.scene.control.Button;
@@ -40,11 +46,28 @@ public class PluginViewController extends ViewController {
 		Worker.runLater(() ->
 		{
 			try {
-				String pluginInfoURL = ApplicationUtils.getApplication().getInfo().getUserInfo().getString(AppUserInfoStrings.PLUGINS_URL);
-				Plugin.load(pluginInfoURL);
-
-				Collections.sort(Plugin.getPlugins());
-				pluginListView.getItems().addAll(Plugin.getPlugins());
+				String pluginInfoURL = null;
+
+				MemorySection userInfo = ApplicationUtils.getApplication().getInfo().getUserInfo();
+				UpdateChannel updateChannel = Profile.currentProfile().getProfileSettings().getUpdateChannel();
+
+				if (updateChannel == UpdateChannel.STABLE) {
+					pluginInfoURL = userInfo.getString(AppUserInfoStrings.PLUGINS_URL_STABLE);
+				} else if (updateChannel == UpdateChannel.BETA) {
+					pluginInfoURL = userInfo.getString(AppUserInfoStrings.PLUGINS_URL_BETA);
+				} else {
+					// No Plugins for this UpdateChannel Available --> Return
+					showInfoMessage(Localization.getString(Strings.Error_Plugins_Available));
+					return;
+				}
+
+				List<Plugin> plugins = Plugins.load(pluginInfoURL, true);
+
+				Collections.sort(plugins);
+				Platform.runLater(() ->
+				{
+					pluginListView.getItems().setAll(plugins);
+				});
 			} catch (IOException e) {
 				e.printStackTrace();
 				showErrorMessage(Localization.getString(Strings.Error_Standard_Gen), PlayPadMain.stageIcon);
diff --git a/PlayWall/src/de/tobias/playpad/viewcontroller/cell/PluginCell.java b/PlayWall/src/de/tobias/playpad/viewcontroller/cell/PluginCell.java
index 8406d562..fda52d6d 100644
--- a/PlayWall/src/de/tobias/playpad/viewcontroller/cell/PluginCell.java
+++ b/PlayWall/src/de/tobias/playpad/viewcontroller/cell/PluginCell.java
@@ -4,9 +4,13 @@ import java.io.IOException;
 import java.net.URL;
 import java.nio.file.Files;
 import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
 
 import de.tobias.playpad.PlayPadMain;
 import de.tobias.playpad.plugin.Plugin;
+import de.tobias.playpad.plugin.Plugins;
+import de.tobias.utils.application.App;
 import de.tobias.utils.application.ApplicationUtils;
 import de.tobias.utils.application.container.PathType;
 import javafx.beans.value.ChangeListener;
@@ -47,7 +51,7 @@ public class PluginCell extends ListCell<Plugin> implements ChangeListener<Boole
 				checkBox.setSelected(false);
 			}
 			setGraphic(buttons);
-			checkBox.setText(item.getName());
+			checkBox.setText(item.toString());
 		} else {
 			setGraphic(null);
 		}
@@ -55,26 +59,43 @@ public class PluginCell extends ListCell<Plugin> implements ChangeListener<Boole
 
 	@Override
 	public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
-		Path path = ApplicationUtils.getApplication().getPath(PathType.LIBRARY, plugin.getFileName());
+		App app = ApplicationUtils.getApplication();
+
+		Path path = app.getPath(PathType.LIBRARY, plugin.getFileName());
 		if (newValue) { // Wurde Aktiviert
 			downloadPlugin(plugin, path);
 
 			// Dependencies
-			for (String dependencyName : plugin.getDependencies()) {
-				for (Plugin plugin : Plugin.getPlugins()) {
-					if (plugin.getName().equals(dependencyName)) {
-						Path decPath = ApplicationUtils.getApplication().getPath(PathType.LIBRARY, plugin.getFileName());
-						downloadPlugin(plugin, decPath);
-					}
-				}
-			}
+			List<Plugin> dependencies = findDependencies();
+			dependencies.forEach(p ->
+			{
+				Path decPath = app.getPath(PathType.LIBRARY, p.getFileName());
+				downloadPlugin(p, decPath);
 
+				// Add Plugin to classpath
+				manager.addPluginsFrom(decPath.toUri());
+			});
+
+			// Add Plugin to classpath
 			manager.addPluginsFrom(path.toUri());
 		} else {
+			// Deaktivieren
 			PlayPadMain.addDeletedPlugin(path);
 		}
 	}
 
+	private List<Plugin> findDependencies() {
+		List<Plugin> plugins = new ArrayList<>();
+		for (String dependencyName : plugin.getDependencies()) {
+			for (Plugin plugin : Plugins.getPlugins()) {
+				if (plugin.getName().equals(dependencyName)) {
+					plugins.add(plugin);
+				}
+			}
+		}
+		return plugins;
+	}
+
 	private void downloadPlugin(Plugin plugin, Path path) {
 		if (Files.notExists(path)) {
 			try {
diff --git a/PlayWallCore/src/de/tobias/playpad/plugin/Plugin.java b/PlayWallCore/src/de/tobias/playpad/plugin/Plugin.java
index 4d7684d0..fcbe98ab 100644
--- a/PlayWallCore/src/de/tobias/playpad/plugin/Plugin.java
+++ b/PlayWallCore/src/de/tobias/playpad/plugin/Plugin.java
@@ -1,36 +1,26 @@
 package de.tobias.playpad.plugin;
 
-import java.io.IOException;
-import java.net.URL;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.ArrayList;
 import java.util.List;
 
-import org.bukkit.configuration.file.FileConfiguration;
-import org.bukkit.configuration.file.YamlConfiguration;
-
-import de.tobias.utils.application.ApplicationUtils;
-import de.tobias.utils.application.container.PathType;
-
 public class Plugin implements Comparable<Plugin> {
 
 	private String name;
 	private String fileName;
 	private String url;
-	private boolean active;
-	private List<String> dependencies;
 
-	private static List<Plugin> plugins;
+	private String version;
+	private long build;
 
-	static {
-		plugins = new ArrayList<>();
-	}
+	private boolean active;
+	private List<String> dependencies;
 
-	public Plugin(String name, String fileName, String url, boolean active, List<String> dependencies) {
+	public Plugin(String name, String fileName, String url, String version, long build, boolean active,
+			List<String> dependencies) {
 		this.name = name;
 		this.fileName = fileName;
 		this.url = url;
+		this.version = version;
+		this.build = build;
 		this.active = active;
 		this.dependencies = dependencies;
 	}
@@ -78,32 +68,8 @@ public class Plugin implements Comparable<Plugin> {
 		return getName().compareTo(o.getName());
 	}
 
-	public static void load(String pluginInfoURL) throws IOException {
-		plugins.clear();
-		URL url = new URL(pluginInfoURL);
-
-		FileConfiguration cfg = YamlConfiguration.loadConfiguration(url.openStream());
-
-		// Iterate over all plugins that are online avialable
-		for (String key : cfg.getConfigurationSection("plugins").getKeys(false)) {
-			String name = new String(cfg.getString("plugins." + key + ".name").getBytes(), "UTF-8");
-			String pluginUrl = cfg.getString("plugins." + key + ".url");
-			String fileName = cfg.getString("plugins." + key + ".filename");
-
-			List<String> dependencies = cfg.getStringList("plugins." + key + ".dependencies");
-
-			boolean active = false;
-
-			Path path = ApplicationUtils.getApplication().getPath(PathType.LIBRARY, fileName);
-			if (Files.exists(path))
-				active = true;
-
-			Plugin plugin = new Plugin(name, fileName, pluginUrl, active, dependencies);
-			plugins.add(plugin);
-		}
-	}
-
-	public static List<Plugin> getPlugins() {
-		return plugins;
+	@Override
+	public String toString() {
+		return name + " " + version + " (" + build + ")";
 	}
 }
diff --git a/PlayWallCore/src/de/tobias/playpad/plugin/Plugins.java b/PlayWallCore/src/de/tobias/playpad/plugin/Plugins.java
new file mode 100644
index 00000000..7ee734fa
--- /dev/null
+++ b/PlayWallCore/src/de/tobias/playpad/plugin/Plugins.java
@@ -0,0 +1,56 @@
+package de.tobias.playpad.plugin;
+
+import java.io.IOException;
+import java.net.URL;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.bukkit.configuration.file.FileConfiguration;
+import org.bukkit.configuration.file.YamlConfiguration;
+
+import de.tobias.utils.application.ApplicationUtils;
+import de.tobias.utils.application.container.PathType;
+
+public class Plugins {
+
+	private static List<Plugin> plugins;
+
+	static {
+		plugins = new ArrayList<>();
+	}
+
+	public static List<Plugin> load(String pluginInfoURL, boolean fetch) throws IOException {
+		if (plugins.isEmpty() || fetch) {
+			URL url = new URL(pluginInfoURL);
+
+			FileConfiguration cfg = YamlConfiguration.loadConfiguration(url.openStream());
+
+			// Iterate over all plugins that are online avialable
+			for (String key : cfg.getConfigurationSection("plugins").getKeys(false)) {
+				String name = new String(cfg.getString("plugins." + key + ".name").getBytes(), "UTF-8");
+				String pluginUrl = cfg.getString("plugins." + key + ".url");
+				String fileName = cfg.getString("plugins." + key + ".filename");
+				String version = cfg.getString("plugins." + key + ".version");
+				long build = cfg.getLong("plugins." + key + ".build");
+
+				List<String> dependencies = cfg.getStringList("plugins." + key + ".dependencies");
+
+				boolean active = false;
+
+				Path path = ApplicationUtils.getApplication().getPath(PathType.LIBRARY, fileName);
+				if (Files.exists(path))
+					active = true;
+
+				Plugin plugin = new Plugin(name, fileName, pluginUrl, version, build, active, dependencies);
+				plugins.add(plugin);
+			}
+		}
+		return plugins;
+	}
+
+	public static List<Plugin> getPlugins() {
+		return plugins;
+	}
+}
-- 
GitLab