Skip to content
Snippets Groups Projects
Commit b2eb0508 authored by Tobias Ullerich's avatar Tobias Ullerich
Browse files

Add new Websocket Handler, add Project Add Listener

parent f2fc50ca
No related branches found
No related tags found
No related merge requests found
......@@ -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)
......
......@@ -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 {
......
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()
}
}
}
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
}
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)
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment