diff --git a/src/main/scala/de/tobias/playpad/server/PlayPadServer.scala b/src/main/scala/de/tobias/playpad/server/PlayPadServer.scala index d7a1a4e0a7c89455993e1c0f0f36703cd2f89a8e..64bb096b83695fc3cd83d4f6fb5784416fd54c56 100644 --- a/src/main/scala/de/tobias/playpad/server/PlayPadServer.scala +++ b/src/main/scala/de/tobias/playpad/server/PlayPadServer.scala @@ -11,6 +11,7 @@ import de.tobias.playpad.server.plugin.Plugin import de.tobias.playpad.server.server.account._ import de.tobias.playpad.server.server.plugin.{PluginGet, PluginList} import de.tobias.playpad.server.server.project._ +import de.tobias.playpad.server.server.project.sync.ProjectSyncHandler import de.tobias.playpad.server.settings.SettingsHandler import de.tobias.playpad.server.transformer.JsonTransformer import spark.Spark._ @@ -56,7 +57,7 @@ object PlayPadServer extends App { secure("deploy/keystore.jks", settings.keystorePassword, null, null) // PlayWall Cloud - webSocket("/project", new ProjectHandler(sessionDao, databaseConnection)) + webSocket("/project", new ProjectSyncHandler(sessionDao, databaseConnection)) // Project get("/projects", new ProjectGet(databaseConnection, sessionDao), new JsonTransformer) diff --git a/src/main/scala/de/tobias/playpad/server/account/Account.scala b/src/main/scala/de/tobias/playpad/server/account/Account.scala index 0172127788aa331366b0e52f3bbdd35e6fcbb134..f1cca086229c93c5aa80f51b8615a7dabd695917 100644 --- a/src/main/scala/de/tobias/playpad/server/account/Account.scala +++ b/src/main/scala/de/tobias/playpad/server/account/Account.scala @@ -22,7 +22,6 @@ import com.j256.ormlite.table.DatabaseTable def getId: Int = id - def canEqual(other: Any): Boolean = other.isInstanceOf[Account] override def equals(other: Any): Boolean = other match { diff --git a/src/main/scala/de/tobias/playpad/server/server/project/sync/ProjectSyncHandler.scala b/src/main/scala/de/tobias/playpad/server/server/project/sync/ProjectSyncHandler.scala new file mode 100644 index 0000000000000000000000000000000000000000..2bb19596377fbbe721801212ea3c9e171c313e78 --- /dev/null +++ b/src/main/scala/de/tobias/playpad/server/server/project/sync/ProjectSyncHandler.scala @@ -0,0 +1,92 @@ +package de.tobias.playpad.server.server.project.sync + +import java.sql.Connection + +import com.google.gson.{JsonObject, JsonParser} +import com.j256.ormlite.dao.Dao +import de.tobias.playpad.server.account +import de.tobias.playpad.server.account.Account +import de.tobias.playpad.server.server.project.sync.listener.project.ProjectAddListener +import org.eclipse.jetty.websocket.api.Session +import org.eclipse.jetty.websocket.api.annotations.{OnWebSocketClose, OnWebSocketConnect, OnWebSocketMessage, WebSocket} + +import scala.collection.{Map, mutable} + +/** + * Created by tobias on 19.02.17. + */ +@WebSocket class ProjectSyncHandler(sessionDao: Dao[account.Session, Int], connection: Connection) { + + // TODO mutable.HashSet --> Set + private var sessions: Map[Account, mutable.HashSet[Session]] = new mutable.HashMap[Account, mutable.HashSet[Session]]() + + private val listeners = Map( + "pro-add" -> new ProjectAddListener() + ) + + @OnWebSocketConnect def onConnect(serverSession: Session): Unit = { + val key = serverSession.getUpgradeRequest.getHeader("key") + if (key == null) { + serverSession.close(500, "Invalid Key") + } + + val sessions = sessionDao.queryForEq("key", key) + if (sessions.size() == 1) { + val session = sessions.get(0) + if (!this.sessions.contains(session.getAccount)) { + this.sessions += (session.getAccount -> new mutable.HashSet[Session]()) + } + this.sessions(session.getAccount) += serverSession + } else { + serverSession.close(500, "Invalid Key") + } + } + + @OnWebSocketClose def onClose(serverSession: Session, status: Int, reason: String): Unit = { + val key = serverSession.getUpgradeRequest.getHeader("key") + if (key == null) { + serverSession.close(500, "Invalid Key") + } + + val sessions = sessionDao.queryForEq("key", key) + if (sessions.size() == 1) { + val session = sessions.get(0) + this.sessions(session.getAccount) -= serverSession + } + } + + @OnWebSocketMessage def onMessage(serverSession: Session, text: String): Unit = { + println(text) + // Store in Database + try { + // Push to clients + val key = serverSession.getUpgradeRequest.getHeader("key") + if (key != null) { + + val parser = new JsonParser() + val json = parser.parse(text) + json match { + case json: JsonObject => + val session = account.Session.getSession(key, sessionDao) + session match { + case Some(s) => listeners(json.get("cmd").getAsString).onChange(json, connection, s) + case None => serverSession.close(500, "Invalid Session") + } + case _ => serverSession.close(500, "Invalid Data") + } + } else { + serverSession.close(500, "Invalid Key") + } + + val sessions = sessionDao.queryForEq("key", key) + if (sessions.size() == 1) { + val session = sessions.get(0) + this.sessions(session.getAccount) + .filter(s => s != serverSession) + .foreach(s => s.getRemote.sendStringByFuture(text)) + } + } catch { + case e: Exception => e.printStackTrace() + } + } +} diff --git a/src/main/scala/de/tobias/playpad/server/server/project/sync/listener/Listener.scala b/src/main/scala/de/tobias/playpad/server/server/project/sync/listener/Listener.scala new file mode 100644 index 0000000000000000000000000000000000000000..217ddf9c57140bc603432a4f400d10b04d64721f --- /dev/null +++ b/src/main/scala/de/tobias/playpad/server/server/project/sync/listener/Listener.scala @@ -0,0 +1,14 @@ +package de.tobias.playpad.server.server.project.sync.listener + +import java.sql.Connection + +import com.google.gson.JsonObject +import de.tobias.playpad.server.account.Session + +/** + * Created by tobias on 18.02.17. + */ +trait Listener { + + def onChange(json: JsonObject, connection: Connection, session: Session): Unit +} diff --git a/src/main/scala/de/tobias/playpad/server/server/project/sync/listener/project/ProjectAddListener.scala b/src/main/scala/de/tobias/playpad/server/server/project/sync/listener/project/ProjectAddListener.scala new file mode 100644 index 0000000000000000000000000000000000000000..c83326d61b9b56368fcef9e67247c42b85408f3b --- /dev/null +++ b/src/main/scala/de/tobias/playpad/server/server/project/sync/listener/project/ProjectAddListener.scala @@ -0,0 +1,23 @@ +package de.tobias.playpad.server.server.project.sync.listener.project + +import java.sql.Connection +import java.util.UUID + +import com.google.gson.JsonObject +import de.tobias.playpad.server.account.Session +import de.tobias.playpad.server.project.utils.SqlDef +import de.tobias.playpad.server.server.SqlHelper +import de.tobias.playpad.server.server.project.sync.listener.Listener + +/** + * Created by tobias on 19.02.17. + */ +class ProjectAddListener extends Listener { + override def onChange(json: JsonObject, connection: Connection, session: Session): Unit = { + val projectId = UUID.fromString(json.get("id").getAsString) + val projectName = json.get("name").getAsString + + SqlHelper.insertOrUpdate(connection, SqlDef.PROJECT, projectId, SqlDef.PROJECT_NAME, projectName) + SqlHelper.insertOrUpdate(connection, SqlDef.PROJECT, projectId, SqlDef.PROJECT_ACCOUNT_ID, session.getAccount.id) + } +}