Skip to content

Commit

Permalink
Merge pull request #120 from lucidsoftware/scala-3
Browse files Browse the repository at this point in the history
Scala 3
  • Loading branch information
tmccombs authored Feb 20, 2025
2 parents 53a2db2 + 836a9b4 commit 73bbab1
Show file tree
Hide file tree
Showing 35 changed files with 261 additions and 234 deletions.
18 changes: 9 additions & 9 deletions admin/app/Application.scala
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
package com.lucidchart.piezo.admin

import com.lucidchart.piezo.util.DummyClassGenerator
import com.softwaremill.macwire._
import com.softwaremill.macwire.*
import play.api.ApplicationLoader.Context
import play.api._
import play.api.i18n._
import play.api.http._
import play.api.mvc._
import play.api.mvc.Results._
import play.api.*
import play.api.i18n.*
import play.api.http.*
import play.api.mvc.*
import play.api.mvc.Results.*
import play.api.Mode
import play.api.routing.Router
import router.Routes
import scala.concurrent.Future
import com.lucidchart.piezo.admin.models._
import com.lucidchart.piezo.admin.controllers._
import com.lucidchart.piezo.admin.models.*
import com.lucidchart.piezo.admin.controllers.*
import com.lucidchart.piezo.WorkerSchedulerFactory
import _root_.controllers.AssetsComponents
/**
Expand Down Expand Up @@ -42,7 +42,7 @@ class PiezoAdminComponents(context: Context) extends BuiltInComponentsFromContex
wire[RequestStatCollector]
)
}
val logger = Logger("com.lucidchart.piezo.Global")
val logger: Logger = Logger("com.lucidchart.piezo.Global")


override lazy val httpErrorHandler: HttpErrorHandler = new DefaultHttpErrorHandler(environment, configuration, devContext.map(_.sourceMapper), Some(router)) {
Expand Down
24 changes: 19 additions & 5 deletions admin/app/com/lucidchart/piezo/GeneratorClassLoader.scala
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import org.objectweb.asm.{ClassWriter, Opcodes, Type}
import org.quartz.{Job, JobExecutionContext}
import org.quartz.spi.ClassLoadHelper
import org.slf4j.LoggerFactory
import org.slf4j.Logger

class DummyJob extends Job {
def execute(context: JobExecutionContext): Unit = {
Expand All @@ -12,16 +13,29 @@ class DummyJob extends Job {
}

class GeneratorClassLoader extends ClassLoader(classOf[GeneratorClassLoader].getClassLoader) with ClassLoadHelper {
val logger = LoggerFactory.getLogger(this.getClass)
val logger: Logger = LoggerFactory.getLogger(this.getClass)

private[this] def generate(name: String) = {
val classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS)
classWriter.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, name.replace('.', '/'), null, Type.getInternalName(classOf[DummyJob]), null)
classWriter.visit(
Opcodes.V1_8,
Opcodes.ACC_PUBLIC,
name.replace('.', '/'),
null,
Type.getInternalName(classOf[DummyJob]),
null,
)

// Minimal constructor that just calls the super constructor and returns.
val constructorWriter = classWriter.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null)
constructorWriter.visitVarInsn(Opcodes.ALOAD, 0)
constructorWriter.visitMethodInsn(Opcodes.INVOKESPECIAL, Type.getInternalName(classOf[Object]), "<init>", "()V", false)
constructorWriter.visitMethodInsn(
Opcodes.INVOKESPECIAL,
Type.getInternalName(classOf[Object]),
"<init>",
"()V",
false,
)
constructorWriter.visitInsn(Opcodes.RETURN)
constructorWriter.visitMaxs(0, 0)
constructorWriter.visitEnd()
Expand All @@ -31,9 +45,9 @@ class GeneratorClassLoader extends ClassLoader(classOf[GeneratorClassLoader].get
classWriter.toByteArray
}

def getClassLoader = this
def getClassLoader: GeneratorClassLoader = this

def loadClass[T](name: String, clazz: Class[T]) = loadClass(name).asInstanceOf[Class[_ <: T]]
def loadClass[T](name: String, clazz: Class[T]): Class[? <: T] = loadClass(name).asInstanceOf[Class[? <: T]]

def initialize() = ()

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.lucidchart.piezo.admin

import play.api.mvc._
import play.api.mvc.*
import play.api.Logging
import scala.concurrent.ExecutionContext

Expand All @@ -12,7 +12,7 @@ class RequestStatCollector(ec: ExecutionContext) extends EssentialFilter with Lo
result
}

def apply(next: EssentialAction) = EssentialAction { request: RequestHeader =>
def apply(next: EssentialAction): EssentialAction = EssentialAction { (request: RequestHeader) =>
val start = System.currentTimeMillis
next(request).map { value =>
recordStats(request, start)(value)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package com.lucidchart.piezo.admin.controllers

import play.api._
import play.api.mvc._
import play.api.*
import play.api.mvc.*

class ApplicationController(cc: ControllerComponents) extends AbstractController(cc) {

def index = Action { implicit request =>
def index: Action[AnyContent] = Action { implicit request =>
Ok(com.lucidchart.piezo.admin.views.html.index()(request))
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,24 @@ package com.lucidchart.piezo.admin.controllers

import org.joda.time.{DateTime,Minutes}
import org.joda.time.format.ISODateTimeFormat
import play.api._
import play.api.libs.json._
import play.api.*
import play.api.libs.json.*
import play.api.Logging
import play.api.mvc._
import play.api.mvc.*
import scala.io.Source

class HealthCheck(configuration: Configuration, cc: ControllerComponents) extends AbstractController(cc) with Logging {

val heartbeatFilename = configuration.getOptional[String]("com.lucidchart.piezo.heartbeatFile").getOrElse {
val heartbeatFilename: String = configuration.getOptional[String]("com.lucidchart.piezo.heartbeatFile").getOrElse {
logger.warn("heartbeat file not specified")
""
}
val minutesBetweenBeats = configuration.getOptional[Int]("healthCheck.worker.minutesBetween").getOrElse{
val minutesBetweenBeats: Int = configuration.getOptional[Int]("healthCheck.worker.minutesBetween").getOrElse{
logger.warn("minutes between heartbeats not specified. Defaulting to 5")
5
}

def main = cc.actionBuilder { implicit requests=>
def main: Action[AnyContent] = cc.actionBuilder { implicit requests=>
val workerHealth = areWorkersHealthy()
val responseBody = Json.toJson(Map("HeartbeatTime" -> Json.toJson(workerHealth._2)))
if(workerHealth._1) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.lucidchart.piezo.admin.controllers

import org.quartz.JobDataMap
import play.api.libs.json._
import play.api.libs.json.*
import play.api.data.Form
import play.api.data.Forms._
import play.api.data.Forms.*
import play.api.data.Mapping

case class DataMap(key: String, value: String)
Expand Down Expand Up @@ -34,7 +34,7 @@ trait JobDataHelper {

implicit def jobDataMap: Mapping[Option[JobDataMap]] =
optional(
list(mapping("key" -> text, "value" -> text)(DataMap.apply)(DataMap.unapply))
list(mapping("key" -> text, "value" -> text)(DataMap.apply)(data => Some((data.key, data.value))))
.transform(mapToJobData, jobDataToMap),
)

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.lucidchart.piezo.admin.controllers

import org.quartz._
import org.quartz.*
import play.api.Logger
import play.api.data.Form
import play.api.data.Forms._
import play.api.data.Forms.*
import com.lucidchart.piezo.GeneratorClassLoader

class JobFormHelper extends JobDataHelper {
Expand All @@ -29,7 +29,7 @@ class JobFormHelper extends JobDataHelper {
Some((job.getKey.getName(), job.getKey.getGroup(), job.getJobClass.toString.replace("class ", ""), description, job.isDurable(), job.requestsRecovery(), Some(job.getJobDataMap)))
}

def buildJobForm = Form[JobDetail](
def buildJobForm: Form[JobDetail] = Form[JobDetail](
mapping(
"name" -> nonEmptyText(),
"group" -> nonEmptyText(),
Expand Down
50 changes: 25 additions & 25 deletions admin/app/com/lucidchart/piezo/admin/controllers/Jobs.scala
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
package com.lucidchart.piezo.admin.controllers

import com.lucidchart.piezo.admin.utils.JobUtils
import com.lucidchart.piezo.admin.utils.JobDetailHelper._
import com.lucidchart.piezo.admin.views._
import com.lucidchart.piezo.admin.utils.JobDetailHelper.*
import com.lucidchart.piezo.admin.views.*
import com.lucidchart.piezo.{JobHistoryModel, TriggerHistoryModel, TriggerMonitoringModel, WorkerSchedulerFactory}
import org.quartz._
import org.quartz.*
import org.quartz.impl.matchers.GroupMatcher
import play.api._
import play.api.libs.functional.syntax._
import play.api.libs.json._
import play.api.mvc._
import scala.jdk.CollectionConverters._
import play.api.*
import play.api.libs.functional.syntax.*
import play.api.libs.json.*
import play.api.mvc.*
import scala.jdk.CollectionConverters.*
import scala.collection.mutable
import scala.Some
import scala.io.Source
Expand All @@ -20,7 +20,7 @@ trait ImportResult {
val jobKey: Option[JobKey]
val errorMessage: String
val success: Boolean
def toJson = {
def toJson: JsObject = {
Json.obj(
"success" -> success,
"errorMessage" -> errorMessage
Expand All @@ -37,10 +37,10 @@ case class ImportSuccess(val jobKey: Option[JobKey], val errorMessage: String =
case class ImportFailure(val jobKey: Option[JobKey], val errorMessage: String, val success: Boolean=false) extends ImportResult

class Jobs(schedulerFactory: WorkerSchedulerFactory, jobView: html.job, cc: ControllerComponents, monitoringTeams: MonitoringTeams) extends AbstractController(cc) with Logging with ErrorLogging with play.api.i18n.I18nSupport {
val scheduler = logExceptions(schedulerFactory.getScheduler())
val scheduler: Scheduler = logExceptions(schedulerFactory.getScheduler())
val properties = schedulerFactory.props
val jobHistoryModel = logExceptions(new JobHistoryModel(properties))
val triggerMonitoringPriorityModel = logExceptions(new TriggerMonitoringModel(properties))
val jobHistoryModel: JobHistoryModel = logExceptions(new JobHistoryModel(properties))
val triggerMonitoringPriorityModel: TriggerMonitoringModel = logExceptions(new TriggerMonitoringModel(properties))

val jobFormHelper = new JobFormHelper()
val triggerFormHelper = new TriggerFormHelper(scheduler, monitoringTeams)
Expand All @@ -58,7 +58,7 @@ class Jobs(schedulerFactory: WorkerSchedulerFactory, jobView: html.job, cc: Cont
jobsByGroup.sortBy(groupList => groupList._1)
}

def getIndex = Action { implicit request =>
def getIndex: Action[AnyContent] = Action { implicit request =>
val allJobs: List[JobKey] = getJobsByGroup().flatMap(_._2).toList
val jobHistories = allJobs.flatMap({ job =>
jobHistoryModel.getJob(job).headOption
Expand All @@ -70,7 +70,7 @@ class Jobs(schedulerFactory: WorkerSchedulerFactory, jobView: html.job, cc: Cont
Ok(com.lucidchart.piezo.admin.views.html.jobs(getJobsByGroup(), None, Some(jobHistories), untriggeredJobs, scheduler.getMetaData)(request))
}

def getJob(group: String, name: String) = Action { implicit request =>
def getJob(group: String, name: String): Action[AnyContent] = Action { implicit request =>
val jobKey = new JobKey(name, group)
val jobExists = scheduler.checkExists(jobKey)
if (!jobExists) {
Expand Down Expand Up @@ -109,7 +109,7 @@ class Jobs(schedulerFactory: WorkerSchedulerFactory, jobView: html.job, cc: Cont
}
}

def deleteJob(group: String, name: String) = Action { implicit request =>
def deleteJob(group: String, name: String): Action[AnyContent] = Action { implicit request =>
val jobKey = new JobKey(name, group)
if (!scheduler.checkExists(jobKey)) {
val errorMsg = Some("Job %s $s not found".format(group, name))
Expand All @@ -128,7 +128,7 @@ class Jobs(schedulerFactory: WorkerSchedulerFactory, jobView: html.job, cc: Cont
}
}

def getJobDetail(group: String, name: String) = Action { implicit request =>
def getJobDetail(group: String, name: String): Action[AnyContent] = Action { implicit request =>
if(request.accepts(JSON)) {
val jobKey = new JobKey(name, group)
if (scheduler.checkExists(jobKey)) {
Expand All @@ -143,7 +143,7 @@ class Jobs(schedulerFactory: WorkerSchedulerFactory, jobView: html.job, cc: Cont
}
}

def getJobsDetail = Action { implicit request =>
def getJobsDetail: Action[AnyContent] = Action { implicit request =>
if (request.accepts(JSON)) {
Ok(
Json.toJson(
Expand All @@ -166,7 +166,7 @@ class Jobs(schedulerFactory: WorkerSchedulerFactory, jobView: html.job, cc: Cont
val submitEditMessage = "Save"
def formEditAction(group: String, name: String): Call = routes.Jobs.putJob(group, name)

def getNewJobForm(templateGroup: Option[String] = None, templateName: Option[String] = None) = Action { implicit request =>
def getNewJobForm(templateGroup: Option[String] = None, templateName: Option[String] = None): Action[AnyContent] = Action { implicit request =>
//if (request.queryString.contains())
templateGroup match {
case Some(group) => getEditJob(group, templateName.get, true)
Expand All @@ -177,7 +177,7 @@ class Jobs(schedulerFactory: WorkerSchedulerFactory, jobView: html.job, cc: Cont

}

def getEditJob(group: String, name: String, isTemplate: Boolean)(implicit request: Request[AnyContent]) = {
def getEditJob(group: String, name: String, isTemplate: Boolean)(implicit request: Request[AnyContent]): Result = {
val jobKey = new JobKey(name, group)

if (scheduler.checkExists(jobKey)) {
Expand All @@ -191,9 +191,9 @@ class Jobs(schedulerFactory: WorkerSchedulerFactory, jobView: html.job, cc: Cont
}
}

def getEditJobAction(group: String, name: String) = Action { implicit request => getEditJob(group, name, false) }
def getEditJobAction(group: String, name: String): Action[AnyContent] = Action { implicit request => getEditJob(group, name, false) }

def putJob(group: String, name: String) = Action { implicit request =>
def putJob(group: String, name: String): Action[AnyContent] = Action { implicit request =>
jobFormHelper.buildJobForm.bindFromRequest().fold(
formWithErrors =>
BadRequest(html.editJob(getJobsByGroup(), formWithErrors, submitNewMessage, formNewAction, false)),
Expand Down Expand Up @@ -256,7 +256,7 @@ class Jobs(schedulerFactory: WorkerSchedulerFactory, jobView: html.job, cc: Cont
}
}

def postJobs = Action { implicit request: Request[AnyContent] =>
def postJobs: Action[AnyContent] = Action { implicit request: Request[AnyContent] =>
val jsonOpt = request.body.asJson.orElse {
request.body.asMultipartFormData.flatMap { d =>
d.file("file").map { f =>
Expand All @@ -282,7 +282,7 @@ class Jobs(schedulerFactory: WorkerSchedulerFactory, jobView: html.job, cc: Cont
}
}

def postJob = Action { implicit request =>
def postJob: Action[AnyContent] = Action { implicit request =>
jobFormHelper.buildJobForm.bindFromRequest().fold(
formWithErrors =>
BadRequest(com.lucidchart.piezo.admin.views.html.editJob(getJobsByGroup(), formWithErrors, submitNewMessage, formNewAction, false)),
Expand All @@ -307,15 +307,15 @@ class Jobs(schedulerFactory: WorkerSchedulerFactory, jobView: html.job, cc: Cont
)
}

def jobGroupTypeAhead(sofar: String) = Action { implicit request =>
def jobGroupTypeAhead(sofar: String): Action[AnyContent] = Action { implicit request =>
val groups = scheduler.getJobGroupNames().asScala.toList

Ok(Json.obj("groups" -> groups.filter{ group =>
group.toLowerCase.contains(sofar.toLowerCase)
}))
}

def jobNameTypeAhead(group: String, sofar: String) = Action { implicit request =>
def jobNameTypeAhead(group: String, sofar: String): Action[AnyContent] = Action { implicit request =>
val jobs = scheduler.getJobKeys(GroupMatcher.jobGroupEquals(group)).asScala.toSet

Ok(Json.obj("jobs" -> jobs.filter(_.getName.toLowerCase.contains(sofar.toLowerCase)).map(_.getName)))
Expand Down
Loading

0 comments on commit 73bbab1

Please sign in to comment.