Skip to content
Snippets Groups Projects
Select Git revision
  • 0a3f4c7af4513198ec2fb02fbe6f8fc0890a76c3
  • master default
  • rewrite
3 results

PlayPadServer.scala

Blame
  • PlayPadServer.scala 4.67 KiB
    package de.tobias.playpad.server
    
    import java.nio.file.{Files, Path, Paths}
    import java.sql.{Connection, DriverManager}
    
    import com.j256.ormlite.dao.{Dao, DaoManager}
    import com.j256.ormlite.jdbc.JdbcConnectionSource
    import com.j256.ormlite.table.TableUtils
    import de.thecodelabs.logger.{FileOutputOption, LogLevelFilter, Logger, Slf4JLoggerAdapter}
    import de.thecodelabs.utils.application.ApplicationUtils
    import de.thecodelabs.utils.application.container.PathType
    import de.tobias.playpad.server.account.{Account, Session}
    import de.tobias.playpad.server.plugin.Plugin
    import de.tobias.playpad.server.server.SqlHelper
    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.{Settings, SettingsHandler, SettingsLoader}
    import de.tobias.playpad.server.sql.SqlBackgroundRunner
    import de.tobias.playpad.server.transformer.JsonTransformer
    import spark.Spark._
    
    /**
     * Created by tobias on 29.01.17.
     */
    object PlayPadServer extends App {
    
    	private var settingsLoader: SettingsLoader = _
    	private var settingsPath: Path = _
    	private var settings: Settings = _
    
    	private var databaseUrl: String = _
    	private var connectionSource: JdbcConnectionSource = _
    	private var databaseConnection: Connection = _
    	private var databaseBackgroundThread: Thread = _
    
    	try {
    		val app = ApplicationUtils.registerMainApplication(getClass)
    		ApplicationUtils.addAppListener(_ => {
    			Logger.init(app.getPath(PathType.LOG))
    			Slf4JLoggerAdapter.disableSlf4jDebugPrints()
    			Logger.setLevelFilter(LogLevelFilter.DEBUG)
    			Logger.setFileOutput(FileOutputOption.COMBINED)
    		})
    		app.start(args)
    
    		// Load Config
    		settingsLoader = SettingsHandler.loader
    		settingsPath = Paths.get("deploy/settings.properties")
    
    		if (Files.notExists(settingsPath)) {
    			SettingsHandler.saver.default(settingsPath)
    		}
    
    		settings = settingsLoader.load(settingsPath)
    
    		databaseUrl = s"jdbc:mysql://${settings.db_host}:${settings.db_port}/${settings.db_database}?" +
    			s"autoReconnect=true&wait_timeout=86400&serverTimezone=Europe/Berlin"
    		connectionSource = new JdbcConnectionSource(databaseUrl)
    		connectionSource.setUsername(settings.db_username)
    		connectionSource.setPassword(settings.db_password)
    
    		databaseConnection = DriverManager.getConnection(databaseUrl, settings.db_username, settings.db_password)
    
    		val pluginDao: Dao[Plugin, Int] = DaoManager.createDao(connectionSource, classOf[Plugin])
    		val accountDao: Dao[Account, Int] = DaoManager.createDao(connectionSource, classOf[Account])
    		val sessionDao: Dao[Session, Int] = DaoManager.createDao(connectionSource, classOf[Session])
    
    		// Management Tables
    		TableUtils.createTableIfNotExists(connectionSource, classOf[Plugin])
    		TableUtils.createTableIfNotExists(connectionSource, classOf[Account])
    		TableUtils.createTableIfNotExists(connectionSource, classOf[Session])
    		SqlHelper.createTables(databaseConnection)
    
    		val runner = new SqlBackgroundRunner(databaseConnection)
    		databaseBackgroundThread = new Thread(runner)
    		databaseBackgroundThread.start()
    
    
    		// Setup Http Server
    		port(settings.server_port)
    		threadPool(8, 2, 60 * 60 * 1000)
    
    		val externalPath = Paths.get(settings.download_folder).toAbsolutePath.toString
    		externalStaticFileLocation(externalPath)
    
    		if (settings.server_secure) {
    			secure(settings.server_keystore_path, settings.server_keystore_password, null, null)
    		}
    
    		// PlayWall Cloud
    		webSocket("/project", new ProjectSyncHandler(sessionDao, databaseConnection))
    
    		// Project
    		val transformer = new JsonTransformer
    
    		get("/projects/:id", new ProjectGet(databaseConnection, sessionDao), transformer)
    		get("/projects", new ProjectList(databaseConnection, sessionDao), transformer)
    		post("/projects", new ProjectPost(databaseConnection, sessionDao), transformer)
    		delete("/projects", new ProjectDelete(databaseConnection, sessionDao), transformer)
    
    		// Plugins
    		get("/plugins/:id", new PluginGet(pluginDao), transformer)
    		get("/plugins", new PluginList(pluginDao), transformer)
    
    		// Account
    		post("/accounts", new AccountPost(accountDao), transformer)
    		put("/accounts", new AccountPut(accountDao), transformer)
    
    		post("/sessions", new SessionPost(accountDao), transformer)
    		delete("/sessions", new SessionDelete(accountDao), transformer)
    		get("/sessions", new SessionGet(accountDao), transformer)
    
    		SettingsHandler.saver.save(settings, settingsPath)
    
    		Runtime.getRuntime.addShutdownHook(new Thread(() => {
    			databaseBackgroundThread.interrupt()
    
    			databaseConnection.close()
    			connectionSource.close()
    
    			stop()
    		}))
    	} catch {
    		case e: Exception => e.printStackTrace()
    	}
    }