Skip to content

Commit

Permalink
Pre-Scala 2.13: Fix JavaConversions warnings with `scala-collection-c…
Browse files Browse the repository at this point in the history
…ompat`

This codebase was using `scala.collection.JavaConversions._`, which has been deprecated
since Scala 2.12. Rather than update to Scala 2.12 syntax, and then later to Scala 2.13
syntax, here we use the https://github.com/scala/scala-collection-compat library to
allow us to use Scala 2.13 syntax immediately.

The scala-collection-compat library comes with a choice of ScalaFix migrations to automate
this update:

https://github.com/scala/scala-collection-compat?tab=readme-ov-file#migration-rules

...but they didn't work well for us (introduced a lot of `.iterator` calls on
`Iterable`s, for some reason) so we made these changes manually.
  • Loading branch information
JamieB-gu authored and rtyley committed Aug 7, 2024
1 parent e2462c4 commit d8978bc
Show file tree
Hide file tree
Showing 17 changed files with 50 additions and 41 deletions.
3 changes: 2 additions & 1 deletion app/model/jobs/JobRunner.scala
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,12 @@ import scala.util.control.NonFatal
import java.net.InetAddress
import java.util.concurrent.TimeUnit
import scala.util.Random
import scala.jdk.CollectionConverters._

@Singleton
class JobRunner @Inject() (lifecycle: ApplicationLifecycle)(implicit ec: ExecutionContext) extends Logging {
// Scheduler boiler plate
val serviceManager = new ServiceManager(List(new JobRunnerScheduler(this)))
val serviceManager = new ServiceManager(List(new JobRunnerScheduler(this)).asJava)
lifecycle.addStopHook{ () => Future.successful(stop) }
serviceManager.startAsync()

Expand Down
3 changes: 2 additions & 1 deletion app/modules/clustersync/ClusterSynchronisation.scala
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,12 @@ import play.api.inject.ApplicationLifecycle

import scala.concurrent.Future
import scala.util.control.NonFatal
import scala.jdk.CollectionConverters._

@Singleton
class ClusterSynchronisation @Inject() (lifecycle: ApplicationLifecycle) extends Logging {

val serviceManager = new ServiceManager(List(new NodeStatusHeartbeater(this)))
val serviceManager = new ServiceManager(List(new NodeStatusHeartbeater(this)).asJava)

val reservation: AtomicReference[Option[NodeStatus]] = new AtomicReference[Option[NodeStatus]](None)
val tagCacheSynchroniser: AtomicReference[Option[KinesisConsumer]] = new AtomicReference[Option[KinesisConsumer]](None)
Expand Down
4 changes: 2 additions & 2 deletions app/modules/clustersync/NodeStatusRepository.scala
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import helpers.JodaDateTimeFormat._
import play.api.Logging
import services.Dynamo

import scala.collection.JavaConversions._
import scala.jdk.CollectionConverters._


case class HeartbeatException(message: String) extends RuntimeException(message)
Expand Down Expand Up @@ -114,7 +114,7 @@ object NodeStatusRepository extends Logging {
}
}

def getCurrentState = Dynamo.clusterStatusTable.scan().map(NodeStatus.fromItem).toList
def getCurrentState = Dynamo.clusterStatusTable.scan().asScala.map(NodeStatus.fromItem).toList

}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import repositories.SponsorshipRepository

import scala.concurrent.{ExecutionContext, Future}
import scala.util.control.NonFatal
import scala.jdk.CollectionConverters._

@Singleton
class SponsorshipLifecycleJobs @Inject() (
Expand All @@ -25,7 +26,7 @@ class SponsorshipLifecycleJobs @Inject() (
logger.info("Starting sponsorship lifecycle jobs")
lazy val scheduledJobs = List(new SponsorshipLauncher, new SponsorshipExpirer)

lazy val serviceManager = new ServiceManager(scheduledJobs)
lazy val serviceManager = new ServiceManager(scheduledJobs.asJava)

serviceManager.startAsync()

Expand Down
3 changes: 2 additions & 1 deletion app/repositories/AppAuditRepository.scala
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import model.AppAudit
import org.joda.time.{Duration, ReadableDuration, DateTime}
import services.Dynamo

import scala.collection.JavaConversions._
import scala.jdk.CollectionConverters._

object AppAuditRepository {
def upsertAppAudit(appAudit: AppAudit): Unit = {
Expand All @@ -17,6 +17,7 @@ object AppAuditRepository {
val from = new DateTime().minus(timePeriod).getMillis
Dynamo.appAuditTable.getIndex("operation-date-index")
.query("operation", operation, new RangeKeyCondition("date").ge(from))
.asScala
.map(AppAudit.fromItem).toList
}
}
4 changes: 2 additions & 2 deletions app/repositories/ExternalReferencesTypeRepository.scala
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import model.ExternalReferenceType
import play.api.libs.json.JsValue
import services.Dynamo

import scala.collection.JavaConversions._
import scala.jdk.CollectionConverters._


object ExternalReferencesTypeRepository {
Expand All @@ -23,6 +23,6 @@ object ExternalReferencesTypeRepository {
}
}

def loadAllReferenceTypes = Dynamo.referencesTypeTable.scan().map(ExternalReferenceType.fromItem)
def loadAllReferenceTypes = Dynamo.referencesTypeTable.scan().asScala.map(ExternalReferenceType.fromItem)

}
6 changes: 3 additions & 3 deletions app/repositories/JobRepository.scala
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import play.api.libs.json.JsValue
import scala.util.control.NonFatal
import services.Dynamo

import scala.collection.JavaConversions._
import scala.jdk.CollectionConverters._


object JobRepository {
Expand Down Expand Up @@ -99,10 +99,10 @@ object JobRepository {
}

def loadAllJobs = {
Dynamo.jobTable.scan().map(Job.fromItem(_)).toList
Dynamo.jobTable.scan().asScala.map(Job.fromItem(_)).toList
}

def findJobsForTag(tagId: Long): List[Job] = {
Dynamo.jobTable.scan(new ScanFilter("tagIds").contains(tagId)).map(Job.fromItem).toList
Dynamo.jobTable.scan(new ScanFilter("tagIds").contains(tagId)).asScala.map(Job.fromItem).toList
}
}
5 changes: 3 additions & 2 deletions app/repositories/PillarAuditRepository.scala
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import helpers.JodaDateTimeFormat._
import org.joda.time.{DateTime, Duration, ReadableDuration}
import services.Dynamo

import scala.collection.JavaConversions._
import scala.jdk.CollectionConverters._


object PillarAuditRepository {
Expand All @@ -17,13 +17,14 @@ object PillarAuditRepository {
}

def getAuditTrailForPillar(pillarId: Long): List[PillarAudit] = {
Dynamo.pillarAuditTable.query("pillarId", pillarId).map(PillarAudit.fromItem).toList
Dynamo.pillarAuditTable.query("pillarId", pillarId).asScala.map(PillarAudit.fromItem).toList
}

def getRecentAuditOfPillarOperation(operation: String, timePeriod: ReadableDuration = Duration.standardDays(7)): List[PillarAudit] = {
val from = new DateTime().minus(timePeriod).getMillis
Dynamo.pillarAuditTable.getIndex("operation-date-index")
.query("operation", operation, new RangeKeyCondition("date").ge(from))
.asScala
.map(PillarAudit.fromItem).toList
}
}
6 changes: 3 additions & 3 deletions app/repositories/PillarRepository.scala
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import model.Pillar
import play.api.Logging
import services.Dynamo

import scala.collection.JavaConversions._
import scala.jdk.CollectionConverters._
import scala.util.{Failure, Success, Try}


Expand Down Expand Up @@ -33,7 +33,7 @@ object PillarRepository extends Logging {
}
}

def loadAllPillars: Iterable[Pillar] = Dynamo.pillarTable.scan().map(Pillar.fromItem)
def loadAllPillars: Iterable[Pillar] = Dynamo.pillarTable.scan().asScala.map(Pillar.fromItem)

def count = Dynamo.pillarTable.scan().count(_ => true)
def count = Dynamo.pillarTable.scan().asScala.count(_ => true)
}
5 changes: 3 additions & 2 deletions app/repositories/SectionAuditRepository.scala
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import org.joda.time.{DateTime, Duration, ReadableDuration}
import play.api.Logging
import services.Dynamo

import scala.collection.JavaConversions._
import scala.jdk.CollectionConverters._


object SectionAuditRepository {
Expand All @@ -18,13 +18,14 @@ object SectionAuditRepository {
}

def getAuditTrailForSection(sectionId: Long): List[SectionAudit] = {
Dynamo.sectionAuditTable.query("sectionId", sectionId).map(SectionAudit.fromItem).toList
Dynamo.sectionAuditTable.query("sectionId", sectionId).asScala.map(SectionAudit.fromItem).toList
}

def getRecentAuditOfSectionOperation(operation: String, timePeriod: ReadableDuration = Duration.standardDays(7)): List[SectionAudit] = {
val from = new DateTime().minus(timePeriod).getMillis
Dynamo.sectionAuditTable.getIndex("operation-date-index")
.query("operation", operation, new RangeKeyCondition("date").ge(from))
.asScala
.map(SectionAudit.fromItem).toList
}
}
6 changes: 3 additions & 3 deletions app/repositories/SectionRepository.scala
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import com.amazonaws.services.dynamodbv2.document.Item
import model.Section
import play.api.libs.json.JsValue
import services.Dynamo
import scala.collection.JavaConversions._
import scala.jdk.CollectionConverters._
import java.util.concurrent.atomic.AtomicReference


Expand All @@ -22,9 +22,9 @@ object SectionRepository {
}
}

def loadAllSections = Dynamo.sectionTable.scan().map(Section.fromItem)
def loadAllSections = Dynamo.sectionTable.scan().asScala.map(Section.fromItem)

def count = Dynamo.sectionTable.scan().count(_ => true)
def count = Dynamo.sectionTable.scan().asScala.count(_ => true)

}

Expand Down
18 changes: 9 additions & 9 deletions app/repositories/SponsorshipRepository.scala
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import model.Sponsorship
import org.joda.time.DateTime
import services.Dynamo

import scala.collection.JavaConversions._
import scala.jdk.CollectionConverters._


object SponsorshipRepository {
Expand All @@ -26,14 +26,14 @@ object SponsorshipRepository {
}
}

def loadAllSponsorships = Dynamo.sponsorshipTable.scan().map(Sponsorship.fromItem)
def loadAllSponsorships = Dynamo.sponsorshipTable.scan().asScala.map(Sponsorship.fromItem)

def searchSponsorships(criteria: SponsorshipSearchCriteria) = {
val filters = criteria.asFilters
if (filters.isEmpty) {
Dynamo.sponsorshipTable.scan().map(Sponsorship.fromItem).toList
Dynamo.sponsorshipTable.scan().asScala.map(Sponsorship.fromItem).toList
} else {
Dynamo.sponsorshipTable.scan(filters: _*).map(Sponsorship.fromItem).toList
Dynamo.sponsorshipTable.scan(filters: _*).asScala.map(Sponsorship.fromItem).toList
}
}

Expand All @@ -43,25 +43,25 @@ object SponsorshipRepository {
new ScanFilter("validFrom").lt(now),
new ScanFilter("validTo").gt(now),
new ScanFilter("status").ne("active")
).map(Sponsorship.fromItem).toList
).asScala.map(Sponsorship.fromItem).toList

val withoutEnd = Dynamo.sponsorshipTable.scan(
new ScanFilter("validFrom").lt(now),
new ScanFilter("validTo").notExist(),
new ScanFilter("status").ne("active")
).map(Sponsorship.fromItem).toList
).asScala.map(Sponsorship.fromItem).toList

val withoutStartAndNotEnded = Dynamo.sponsorshipTable.scan(
new ScanFilter("validFrom").notExist(),
new ScanFilter("validTo").gt(now),
new ScanFilter("status").ne("active")
).map(Sponsorship.fromItem).toList
).asScala.map(Sponsorship.fromItem).toList

val alwaysActive = Dynamo.sponsorshipTable.scan(
new ScanFilter("validFrom").notExist(),
new ScanFilter("validTo").notExist(),
new ScanFilter("status").ne("active")
).map(Sponsorship.fromItem).toList
).asScala.map(Sponsorship.fromItem).toList

withEnd ::: withoutEnd ::: withoutStartAndNotEnded ::: alwaysActive
}
Expand All @@ -72,7 +72,7 @@ object SponsorshipRepository {
Dynamo.sponsorshipTable.scan(
new ScanFilter("validTo").lt(now),
new ScanFilter("status").eq("active")
).map(Sponsorship.fromItem).toList
).asScala.map(Sponsorship.fromItem).toList
}

}
Expand Down
8 changes: 5 additions & 3 deletions app/repositories/TagAuditRepository.scala
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import org.joda.time.{DateTime, Duration, ReadableDuration}
import play.api.Logging
import services.Dynamo

import scala.collection.JavaConversions._
import scala.jdk.CollectionConverters._

object TagAuditRepository {
def upsertTagAudit(tagAudit: TagAudit): Unit = {
Expand All @@ -16,23 +16,25 @@ object TagAuditRepository {
}

def getAuditTrailForTag(tagId: Long): List[TagAudit] = {
Dynamo.tagAuditTable.query("tagId", tagId).map(TagAudit.fromItem).toList
Dynamo.tagAuditTable.query("tagId", tagId).asScala.map(TagAudit.fromItem).toList
}

def getRecentAuditOfTagOperation(operation: String, timePeriod: ReadableDuration = Duration.standardDays(31)): List[TagAudit] = {
val from = new DateTime().minus(timePeriod).getMillis
Dynamo.tagAuditTable.getIndex("operation-date-index")
.query("operation", operation, new RangeKeyCondition("date").ge(from))
.asScala
.map(TagAudit.fromItem).toList
}

def getAuditsOfTagOperationsSince(operation: String, since: Long): List[TagAudit] = {
Dynamo.tagAuditTable.getIndex("operation-date-index")
.query("operation", operation, new RangeKeyCondition("date").ge(since))
.asScala
.map(TagAudit.fromItem).toList
}

def loadAllAudits: List[TagAudit] = Dynamo.tagAuditTable.scan().map(TagAudit.fromItem).toList
def loadAllAudits: List[TagAudit] = Dynamo.tagAuditTable.scan().asScala.map(TagAudit.fromItem).toList

val lastModifiedTags: Long => List[TagAudit] = since => loadAllAudits
.filter(x => x.operation == "updated" && x.date.getMillis > since)
Expand Down
6 changes: 3 additions & 3 deletions app/repositories/TagRepository.scala
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import play.api.Logging
import play.api.libs.json.JsValue
import services.Dynamo

import scala.collection.JavaConversions._
import scala.jdk.CollectionConverters._


object TagRepository extends Logging {
Expand All @@ -31,12 +31,12 @@ object TagRepository extends Logging {
}

def scanSearch(criteria: TagSearchCriteria) = {
Dynamo.tagTable.scan(criteria.asFilters: _*).map { item =>
Dynamo.tagTable.scan(criteria.asFilters: _*).asScala.map { item =>
item.getString("internalName")
}
}

def loadAllTags = Dynamo.tagTable.scan().map(Tag.fromItem)
def loadAllTags = Dynamo.tagTable.scan().asScala.map(Tag.fromItem)

def allTagIter = Dynamo.tagTable.scan()
}
Expand Down
6 changes: 3 additions & 3 deletions app/services/Config.scala
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import java.util.Properties
import com.amazonaws.services.s3.model.GetObjectRequest
import services.Config._

import scala.collection.JavaConversions._
import scala.jdk.CollectionConverters._


object Config extends AwsInstanceTags {
Expand Down Expand Up @@ -46,7 +46,7 @@ sealed trait Config {
lazy val stack = readTag("Stack") getOrElse "flexible"
lazy val stage = readTag("Stage") getOrElse "DEV"
lazy val app = readTag("App") getOrElse "tag-manager"
lazy val region = remoteConfiguration.getOrDefault("aws.region", "eu-west-1")
lazy val region = remoteConfiguration.getOrElse("aws.region", "eu-west-1")
}

private def loadConfiguration = {
Expand All @@ -68,7 +68,7 @@ sealed trait Config {
loadPropertiesFromS3(s"${aws.app}/global.properties", props)
loadPropertiesFromS3(s"${aws.app}/${aws.stage}.properties", props)

props.toMap
props.asScala.toMap
}

lazy val permissionsStage: String = readTag("Stage") match {
Expand Down
4 changes: 2 additions & 2 deletions app/services/KinesisConsumer.scala
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import org.apache.thrift.protocol.{TCompactProtocol, TProtocol}
import org.apache.thrift.transport.TIOStreamTransport
import play.api.Logging

import scala.collection.JavaConversions._
import scala.jdk.CollectionConverters._
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future
import scala.language.implicitConversions
Expand Down Expand Up @@ -64,7 +64,7 @@ class KinesisProcessorConsumer(appName: String, processor: KinesisStreamRecordPr

override def processRecords(processRecordsInput: ProcessRecordsInput): Unit = {

processRecordsInput.getRecords foreach { record =>
processRecordsInput.getRecords.asScala foreach { record =>
processor.process(record)
}

Expand Down
1 change: 1 addition & 0 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ lazy val dependencies = Seq(
"com.typesafe.play" %% "play-json-joda" % "2.8.1",
"org.apache.commons" % "commons-lang3" % "3.11",
"com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.13.2",
"org.scala-lang.modules" %% "scala-collection-compat" % "2.12.0"
)

dependencyOverrides += "org.bouncycastle" % "bcprov-jdk15on" % "1.67"
Expand Down

0 comments on commit d8978bc

Please sign in to comment.