From 4077a8faa9c68304ea65efd6739261c9ff1727cc Mon Sep 17 00:00:00 2001 From: tobias <thinkdifferent055@gmail.com> Date: Sun, 5 Feb 2017 22:48:54 +0100 Subject: [PATCH] Add new settings handling; add new plugin routes; update client --- .../resources/settings/settings.properties | 6 --- .../tobias/playpad/server/PlayPadServer.scala | 51 +++++++++---------- .../tobias/playpad/server/plugin/Plugin.scala | 10 ++-- .../server/server/plugin/PluginGet.scala | 22 ++++++++ .../server/server/plugin/PluginList.scala | 19 +++++++ .../settings/PropertiesSettingsHandler.scala | 46 +++++++++++++++++ .../playpad/server/settings/Settings.scala | 17 +++++++ .../server/settings/SettingsHandler.scala | 12 +++++ .../server/settings/SettingsLoader.scala | 13 +++++ .../server/settings/SettingsSaver.scala | 15 ++++++ .../server/transformer/JsonTransformer.scala | 16 ++++++ src/test/java/ClientTest.java | 2 +- 12 files changed, 190 insertions(+), 39 deletions(-) delete mode 100644 src/main/resources/settings/settings.properties create mode 100644 src/main/scala/de/tobias/playpad/server/server/plugin/PluginGet.scala create mode 100644 src/main/scala/de/tobias/playpad/server/server/plugin/PluginList.scala create mode 100644 src/main/scala/de/tobias/playpad/server/settings/PropertiesSettingsHandler.scala create mode 100644 src/main/scala/de/tobias/playpad/server/settings/Settings.scala create mode 100644 src/main/scala/de/tobias/playpad/server/settings/SettingsHandler.scala create mode 100644 src/main/scala/de/tobias/playpad/server/settings/SettingsLoader.scala create mode 100644 src/main/scala/de/tobias/playpad/server/settings/SettingsSaver.scala create mode 100644 src/main/scala/de/tobias/playpad/server/transformer/JsonTransformer.scala diff --git a/src/main/resources/settings/settings.properties b/src/main/resources/settings/settings.properties deleted file mode 100644 index b0278a5..0000000 --- a/src/main/resources/settings/settings.properties +++ /dev/null @@ -1,6 +0,0 @@ -# Database -host=localhost -port=3306 -username=root -password=password -database=PlayWall \ No newline at end of file diff --git a/src/main/scala/de/tobias/playpad/server/PlayPadServer.scala b/src/main/scala/de/tobias/playpad/server/PlayPadServer.scala index c750eb7..ff74eb3 100644 --- a/src/main/scala/de/tobias/playpad/server/PlayPadServer.scala +++ b/src/main/scala/de/tobias/playpad/server/PlayPadServer.scala @@ -1,14 +1,14 @@ package de.tobias.playpad.server import java.nio.file.{Files, Paths} -import java.util.Properties -import com.google.gson.Gson import com.j256.ormlite.dao.{Dao, DaoManager} import com.j256.ormlite.jdbc.JdbcConnectionSource import com.j256.ormlite.table.TableUtils import de.tobias.playpad.server.plugin.Plugin -import spark.Spark +import de.tobias.playpad.server.server.plugin.{PluginGet, PluginList} +import de.tobias.playpad.server.settings.SettingsHandler +import de.tobias.playpad.server.transformer.JsonTransformer import spark.Spark._ import spark.route.RouteOverview @@ -18,40 +18,35 @@ import spark.route.RouteOverview object PlayPadServer extends App { // Load Config - val properties = new Properties() - private val path = Paths.get("settings.properties") - if (Files.notExists(path)) { - val loader = Thread.currentThread.getContextClassLoader - val input = loader.getResourceAsStream("settings/settings.properties") - Files.copy(input, path) + private val settingsLoader = SettingsHandler.loader + private val settingsPath = Paths.get("settings.properties") + + if (Files.notExists(settingsPath)) { + SettingsHandler.saver.default(settingsPath) } - properties.load(Files.newBufferedReader(path)) - // Setup Database - private val host = properties.getProperty("host") - private val port = properties.getProperty("port") - private val username = properties.getProperty("username") - private val password = properties.getProperty("password") - private val database = properties.getProperty("database") + private val settings = settingsLoader.load(settingsPath) - private val databaseUrl = "jdbc:mysql://" + host + ":" + port + "/" + database + private val databaseUrl = "jdbc:mysql://" + settings.db_host + ":" + settings.db_port + "/" + settings.db_database var connectionSource = new JdbcConnectionSource(databaseUrl) - connectionSource.setUsername(username) - connectionSource.setPassword(password) + connectionSource.setUsername(settings.db_username) + connectionSource.setPassword(settings.db_password) - val dao: Dao[Plugin, String] = DaoManager.createDao(connectionSource, classOf[Plugin]) + val dao: Dao[Plugin, Int] = DaoManager.createDao(connectionSource, classOf[Plugin]) TableUtils.createTableIfNotExists(connectionSource, classOf[Plugin]) // Setup Http Server - Spark.port(8090) - secure("deploy/keystore.jks", "password", null, null); - get("/", (req, res) => "Hallo World") + port(8090) + + private val externalPath = Paths.get(settings.download_folder).toAbsolutePath.toString + externalStaticFileLocation(externalPath) - get("/plugin/list", (req, res) => { - val plugins = dao.queryForAll() - val gson = new Gson() - gson.toJson(plugins) - }) + secure("deploy/keystore.jks", settings.keystorePassword, null, null) + + get("/plugins/:id", new PluginGet(dao), new JsonTransformer) + get("/plugins", new PluginList(dao), new JsonTransformer) RouteOverview.enableRouteOverview() + + SettingsHandler.saver.save(settings, settingsPath) } diff --git a/src/main/scala/de/tobias/playpad/server/plugin/Plugin.scala b/src/main/scala/de/tobias/playpad/server/plugin/Plugin.scala index 893de90..e8c32eb 100644 --- a/src/main/scala/de/tobias/playpad/server/plugin/Plugin.scala +++ b/src/main/scala/de/tobias/playpad/server/plugin/Plugin.scala @@ -1,9 +1,7 @@ package de.tobias.playpad.server.plugin -import com.j256.ormlite.dao.ForeignCollection -import com.j256.ormlite.field.{DatabaseField, ForeignCollectionField} +import com.j256.ormlite.field.DatabaseField import com.j256.ormlite.table.DatabaseTable -import com.sun.xml.internal.xsom.impl.ForeignAttributesImpl /** * Created by tobias on 31.01.17. @@ -11,13 +9,17 @@ import com.sun.xml.internal.xsom.impl.ForeignAttributesImpl @DatabaseTable(tableName = "Plugin") class Plugin() { @DatabaseField(generatedId = true) private val id: Int = 0 @DatabaseField var name: String = _ + @DatabaseField var displayName: String = _ @DatabaseField var description: String = _ + @DatabaseField var path: String = _ @DatabaseField var version: String = _ @DatabaseField var build: Int = _ - def this(name: String, description: String, version: String, build: Int) { + def this(name: String, displayName: String, path: String, description: String, version: String, build: Int) { this() this.name = name + this.displayName = displayName + this.path = path this.description = description this.version = version this.build = build diff --git a/src/main/scala/de/tobias/playpad/server/server/plugin/PluginGet.scala b/src/main/scala/de/tobias/playpad/server/server/plugin/PluginGet.scala new file mode 100644 index 0000000..075adc7 --- /dev/null +++ b/src/main/scala/de/tobias/playpad/server/server/plugin/PluginGet.scala @@ -0,0 +1,22 @@ +package de.tobias.playpad.server.server.plugin + +import com.google.gson.Gson +import com.j256.ormlite.dao.Dao +import de.tobias.playpad.server.plugin.Plugin +import spark.{Request, Response, Route, Spark} + +/** + * Created by tobias on 05.02.17. + */ +class PluginGet(dao: Dao[Plugin, Int]) extends Route { + + val gson = new Gson() + + override def handle(request: Request, response: Response): AnyRef = { + val plugin = dao.queryForId(request.params(":id").toInt) + if (plugin == null) { + Spark.halt(400, "Bad request") + } + plugin + } +} diff --git a/src/main/scala/de/tobias/playpad/server/server/plugin/PluginList.scala b/src/main/scala/de/tobias/playpad/server/server/plugin/PluginList.scala new file mode 100644 index 0000000..50c91a8 --- /dev/null +++ b/src/main/scala/de/tobias/playpad/server/server/plugin/PluginList.scala @@ -0,0 +1,19 @@ +package de.tobias.playpad.server.server.plugin + +import com.google.gson.Gson +import com.j256.ormlite.dao.Dao +import de.tobias.playpad.server.plugin.Plugin +import spark.{Request, Response, Route} + +/** + * Created by tobias on 05.02.17. + */ +class PluginList(val dao: Dao[Plugin, Int]) extends Route { + + val gson = new Gson() + + override def handle(request: Request, response: Response): AnyRef = { + val plugins = dao.queryForAll() + plugins + } +} diff --git a/src/main/scala/de/tobias/playpad/server/settings/PropertiesSettingsHandler.scala b/src/main/scala/de/tobias/playpad/server/settings/PropertiesSettingsHandler.scala new file mode 100644 index 0000000..9ef9403 --- /dev/null +++ b/src/main/scala/de/tobias/playpad/server/settings/PropertiesSettingsHandler.scala @@ -0,0 +1,46 @@ +package de.tobias.playpad.server.settings + +import java.io.IOException +import java.lang.reflect.Modifier +import java.nio.file.{Files, Path} +import java.util.Properties + +/** + * Created by tobias on 05.02.17. + */ +class PropertiesSettingsHandler extends SettingsLoader with SettingsSaver { + + @throws[IOException] + override def load(path: Path): Settings = { + val properties = new Properties() + properties.load(Files.newBufferedReader(path)) + + val settings = new Settings() + classOf[Settings].getDeclaredFields.filter(f => !Modifier.isTransient(f.getModifiers)) + .filter(f => properties.containsKey(f.getName)) + .foreach(f => { + f.setAccessible(true) + if (f.getType == Integer.TYPE) { + f.setInt(settings, properties.getProperty(f.getName).toInt) + } else { + f.set(settings, properties.getProperty(f.getName)) + } + }) + settings + } + + @throws[IOException] + override def save(settings: Settings, path: Path): Unit = { + val properties = new Properties() + + println("Save") + + classOf[Settings].getDeclaredFields.filter(f => !Modifier.isTransient(f.getModifiers)) + .foreach(f => { + f.setAccessible(true) + properties.setProperty(f.getName, f.get(settings).toString) + }) + + properties.store(Files.newOutputStream(path), "Settings") + } +} diff --git a/src/main/scala/de/tobias/playpad/server/settings/Settings.scala b/src/main/scala/de/tobias/playpad/server/settings/Settings.scala new file mode 100644 index 0000000..5deafab --- /dev/null +++ b/src/main/scala/de/tobias/playpad/server/settings/Settings.scala @@ -0,0 +1,17 @@ +package de.tobias.playpad.server.settings + +/** + * Created by tobias on 05.02.17. + */ +class Settings { + + var db_host: String = "localhost" + var db_port: Int = 3306 + var db_username: String = "root" + var db_password: String = "password" + var db_database: String = "PlayWall" + + var download_folder: String = "./" + + var keystorePassword = "password" +} diff --git a/src/main/scala/de/tobias/playpad/server/settings/SettingsHandler.scala b/src/main/scala/de/tobias/playpad/server/settings/SettingsHandler.scala new file mode 100644 index 0000000..eb0ad12 --- /dev/null +++ b/src/main/scala/de/tobias/playpad/server/settings/SettingsHandler.scala @@ -0,0 +1,12 @@ +package de.tobias.playpad.server.settings + +/** + * Created by tobias on 05.02.17. + */ +object SettingsHandler { + + def loader = new PropertiesSettingsHandler() + + def saver = new PropertiesSettingsHandler() + +} diff --git a/src/main/scala/de/tobias/playpad/server/settings/SettingsLoader.scala b/src/main/scala/de/tobias/playpad/server/settings/SettingsLoader.scala new file mode 100644 index 0000000..fbf8ee7 --- /dev/null +++ b/src/main/scala/de/tobias/playpad/server/settings/SettingsLoader.scala @@ -0,0 +1,13 @@ +package de.tobias.playpad.server.settings + +import java.io.IOException +import java.nio.file.Path + +/** + * Created by tobias on 05.02.17. + */ +trait SettingsLoader { + + @throws[IOException] + def load(path: Path): Settings +} diff --git a/src/main/scala/de/tobias/playpad/server/settings/SettingsSaver.scala b/src/main/scala/de/tobias/playpad/server/settings/SettingsSaver.scala new file mode 100644 index 0000000..0d2d072 --- /dev/null +++ b/src/main/scala/de/tobias/playpad/server/settings/SettingsSaver.scala @@ -0,0 +1,15 @@ +package de.tobias.playpad.server.settings + +import java.io.IOException +import java.nio.file.Path + +/** + * Created by tobias on 05.02.17. + */ +trait SettingsSaver { + + @throws[IOException] + def save(settings: Settings, path: Path) + + def default(path: Path) = save(new Settings(), path) +} diff --git a/src/main/scala/de/tobias/playpad/server/transformer/JsonTransformer.scala b/src/main/scala/de/tobias/playpad/server/transformer/JsonTransformer.scala new file mode 100644 index 0000000..d482bf5 --- /dev/null +++ b/src/main/scala/de/tobias/playpad/server/transformer/JsonTransformer.scala @@ -0,0 +1,16 @@ +package de.tobias.playpad.server.transformer + +import com.google.gson.Gson +import spark.ResponseTransformer + +/** + * Created by tobias on 05.02.17. + */ +class JsonTransformer extends ResponseTransformer { + + val gson = new Gson() + + override def render(o: scala.Any): String = { + gson.toJson(o) + } +} diff --git a/src/test/java/ClientTest.java b/src/test/java/ClientTest.java index 77e384e..92f77bd 100644 --- a/src/test/java/ClientTest.java +++ b/src/test/java/ClientTest.java @@ -33,7 +33,7 @@ public class ClientTest { HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); HttpsURLConnection.setDefaultHostnameVerifier((hostname, sslSession) -> true); - URL url = new URL("https://localhost:6789"); + URL url = new URL("https://localhost:8090/plugins"); URLConnection conn = url.openConnection(); InputStream stream = conn.getInputStream(); -- GitLab