From 39636cca1c0857ef6b759ea0fbb0f2801b8e67e4 Mon Sep 17 00:00:00 2001 From: Rayron Victor Date: Fri, 14 Jul 2017 14:20:07 -0300 Subject: [PATCH] Add support to play 2.6.1 Work with scala 2.12.2 --- README.md | 2 +- RELEASE.md | 3 +++ app/se/digiplant/res/ResAssets.scala | 12 ++++++++---- app/se/digiplant/res/api/Res.scala | 18 ++++++++++-------- build.sbt | 6 +++--- project/Plugins.sbt | 2 +- project/build.properties | 2 +- test/se/digiplant/res/ResAssetsSpec.scala | 4 ++-- test/se/digiplant/res/Spec.scala | 14 ++++++++++---- test/se/digiplant/res/api/ResSpec.scala | 9 +++++---- 10 files changed, 44 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index 1ddf513..517299b 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ It will only store one version of a file since it computes the sha1 hash of the // in you're build.sbt file val appDependencies = Seq( - "se.digiplant" %% "play-res" % "1.2.0" + "se.digiplant" %% "play-res" % "1.3.0" ) // To simplify the reverse routing we can import the digiPlant namespace diff --git a/RELEASE.md b/RELEASE.md index 88d87f8..d7004ce 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,3 +1,6 @@ +# 1.3.0 + * Play 2.6 support + # 1.2.0 * Play 2.5 support diff --git a/app/se/digiplant/res/ResAssets.scala b/app/se/digiplant/res/ResAssets.scala index cee04a4..f1710e3 100644 --- a/app/se/digiplant/res/ResAssets.scala +++ b/app/se/digiplant/res/ResAssets.scala @@ -1,17 +1,21 @@ package se.digiplant.res -import javax.inject.{Singleton, Inject} +import javax.inject.{Inject, Singleton} import play.api._ import play.api.mvc._ import play.api.libs._ -import org.joda.time.format.{DateTimeFormatter, DateTimeFormat} +import org.joda.time.format.{DateTimeFormat, DateTimeFormatter} import org.joda.time.DateTimeZone + import collection.JavaConverters._ import java.io.File +import scala.concurrent.ExecutionContext + @Singleton -class ResAssets @Inject()(environment: Environment, res: api.Res) extends Controller { +class ResAssets @Inject()(components: ControllerComponents, environment: Environment, res: api.Res) + (implicit ec: ExecutionContext) extends AbstractController(components) { private val timeZoneCode = "GMT" @@ -29,7 +33,7 @@ class ResAssets @Inject()(environment: Environment, res: api.Res) extends Contro private val parsableTimezoneCode = " " + timeZoneCode - def at(file: String, source: String = "default"): Action[AnyContent] = Action { request => + def at(file: String, source: String = "default"): Action[AnyContent] = Action { request: RequestHeader => def parseDate(date: String): Option[java.util.Date] = { try { diff --git a/app/se/digiplant/res/api/Res.scala b/app/se/digiplant/res/api/Res.scala index c39f840..e574cf4 100644 --- a/app/se/digiplant/res/api/Res.scala +++ b/app/se/digiplant/res/api/Res.scala @@ -3,10 +3,12 @@ package se.digiplant.res.api import javax.inject.{Singleton, Inject} import play.api._ -import libs.{Files, MimeTypes} +import libs.Files import java.io.{FileInputStream, File} -import org.apache.commons.io.{FilenameUtils, FileUtils} + +import org.apache.commons.io.{FileUtils, FilenameUtils} import org.apache.commons.codec.digest.DigestUtils +import play.api.http.FileMimeTypes trait Res { @@ -82,13 +84,13 @@ trait Res { } @Singleton -class ResImpl @Inject()(environment: Environment, configuration: Configuration) extends Res { +class ResImpl @Inject()(environment: Environment, configuration: Configuration, mimeTypes: FileMimeTypes) extends Res { - lazy val config = configuration.getConfig("res").getOrElse(Configuration.empty) + lazy val config: Configuration = configuration.getOptional[Configuration]("res").getOrElse(Configuration.empty) lazy val sources: Map[String, File] = config.subKeys.map { sourceKey => - val path = config.getString(sourceKey).getOrElse(throw config.reportError("res." + sourceKey, "Missing res path[" + sourceKey + "]")) + val path = config.getOptional[String](sourceKey).getOrElse(throw config.reportError("res." + sourceKey, "Missing res path[" + sourceKey + "]")) val file = new File(FilenameUtils.concat(environment.rootPath.getAbsolutePath, path)) if (file.isDirectory && !file.exists()) { FileUtils.forceMkdir(file) @@ -143,7 +145,7 @@ class ResImpl @Inject()(environment: Environment, configuration: Configuration) require(name.length > 12, "name must contain atleast 12 chars to be able to be stored properly.") - val dir = sources.get(source).get + val dir = sources(source) val base = new File(dir, hashAsDirectories(name)) if (!base.exists()) { @@ -190,7 +192,7 @@ class ResImpl @Inject()(environment: Environment, configuration: Configuration) getExtensionFromMimeType(filePart.contentType) ) val ext = extensionOptions.collectFirst { case Some(x) => x } - put(filePart.ref.file, source, None, ext, meta) + put(filePart.ref, source, None, ext, meta) } /** @@ -257,6 +259,6 @@ class ResImpl @Inject()(environment: Environment, configuration: Configuration) case Some("image/jpeg") => Some("jpg") case Some("image/png") => Some("png") case Some("image/gif") => Some("gif") - case Some(m) => MimeTypes.types.map(_.swap).get(m) + case Some(m) => mimeTypes.forFileName(m) } } diff --git a/build.sbt b/build.sbt index 3fea6dc..4692ef0 100644 --- a/build.sbt +++ b/build.sbt @@ -2,7 +2,7 @@ name := "play-res" version := "1.2.0" -scalaVersion := "2.11.7" +scalaVersion := "2.12.2" organization := "se.digiplant" @@ -11,8 +11,8 @@ scalacOptions ++= Seq("-unchecked", "-deprecation", "-feature") resolvers += Resolver.sonatypeRepo("releases") libraryDependencies ++= Seq( - "commons-io" % "commons-io" % "2.4", - "commons-codec" % "commons-codec" % "1.6", + "commons-io" % "commons-io" % "2.5", + "commons-codec" % "commons-codec" % "1.10", specs2 % Test, "com.typesafe.play" %% "play" % play.core.PlayVersion.current % "provided", "com.typesafe.play" %% "play-test" % play.core.PlayVersion.current % "test" diff --git a/project/Plugins.sbt b/project/Plugins.sbt index 6a9acdf1..f7288c5 100644 --- a/project/Plugins.sbt +++ b/project/Plugins.sbt @@ -3,7 +3,7 @@ resolvers ++= Seq( Resolver.sonatypeRepo("releases") ) -addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.5.1") +addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.6.1") addSbtPlugin("com.jsuereth" % "sbt-pgp" % "1.0.0") diff --git a/project/build.properties b/project/build.properties index 43b8278..64317fd 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=0.13.11 +sbt.version=0.13.15 diff --git a/test/se/digiplant/res/ResAssetsSpec.scala b/test/se/digiplant/res/ResAssetsSpec.scala index a84671c..c20cf6c 100644 --- a/test/se/digiplant/res/ResAssetsSpec.scala +++ b/test/se/digiplant/res/ResAssetsSpec.scala @@ -14,7 +14,7 @@ object ResAssetsSpec extends Specification { val result = resAssets.at("5564ac5e3968e77b4022f55a23d36630bdeb0274.jpg")(FakeRequest()) status(result) must equalTo(OK) - contentType(result) must beSome("image/jpeg") + contentType(result) must beSome("application/octet-stream") } "return resource in supplied source" in new ResContext { @@ -23,7 +23,7 @@ object ResAssetsSpec extends Specification { val result = resAssets.at("5564ac5e3968e77b4022f55a23d36630bdeb0274.jpg", "images")(FakeRequest()) status(result) must equalTo(OK) - contentType(result) must beSome("image/jpeg") + contentType(result) must beSome("application/octet-stream") } } } diff --git a/test/se/digiplant/res/Spec.scala b/test/se/digiplant/res/Spec.scala index 1f7edf3..d2742bc 100644 --- a/test/se/digiplant/res/Spec.scala +++ b/test/se/digiplant/res/Spec.scala @@ -5,14 +5,18 @@ import org.specs2.mock.Mockito import org.specs2.specification._ import org.specs2.mutable.Around import org.specs2.execute.AsResult -import play.api.{Environment, Application, Configuration} +import play.api.{Application, Configuration, Environment} import play.api.inject.guice.GuiceApplicationBuilder import play.api.test._ import java.io.File + import org.apache.commons.io.FileUtils +import play.api.http.FileMimeTypes + +import scala.concurrent.ExecutionContext import util.Random -trait ResContext extends Around with TempFile with Mockito with MustThrownExpectations { +trait ResContext extends Around with TempFile with Mockito with MustThrownExpectations with Injecting { val environment = Environment.simple() val configuration = Configuration("res.default" -> "tmp/default", "res.images" -> "tmp/images") @@ -22,8 +26,10 @@ trait ResContext extends Around with TempFile with Mockito with MustThrownExpect .in(environment) .build - val res = new api.ResImpl(environment, configuration) - val resAssets = new ResAssets(mock[Environment], res) + implicit val executionContext = inject[ExecutionContext] + + val res = new api.ResImpl(environment, configuration, mock[FileMimeTypes]) + val resAssets = new ResAssets(Helpers.stubControllerComponents(), mock[Environment], res) def around[T : AsResult](t: =>T) = Helpers.running(app) { val result = AsResult.effectively(t) diff --git a/test/se/digiplant/res/api/ResSpec.scala b/test/se/digiplant/res/api/ResSpec.scala index 7f4368f..df70ee6 100644 --- a/test/se/digiplant/res/api/ResSpec.scala +++ b/test/se/digiplant/res/api/ResSpec.scala @@ -2,10 +2,11 @@ package se.digiplant.res.api import se.digiplant.res.ResContext import org.specs2.mutable.Specification -import java.io.{FileInputStream, File} +import java.io.{File, FileInputStream} + import org.apache.commons.io.IOUtils import play.api._ -import libs.Files.TemporaryFile +import libs.Files.SingletonTemporaryFileCreator import play.api.mvc.MultipartFormData.FilePart object ResSpec extends Specification { @@ -33,13 +34,13 @@ object ResSpec extends Specification { } "put a scala filepart" in new ResContext { - val f = FilePart("testPart", "filename", Some("image/jpeg"), TemporaryFile(testFile)) + val f = FilePart("testPart", "filename", Some("image/jpeg"), SingletonTemporaryFileCreator.create(testFile.toPath)) val fileuid = res.put(f, "default", Seq.empty) fileuid must not beEmpty } "put a scala filepart with no extension" in new ResContext { - val f = FilePart("testPart", "filename", Some("image/jpeg"), TemporaryFile(anonymousTestFile)) + val f = FilePart("testPart", "filename", Some("image/jpeg"), SingletonTemporaryFileCreator.create(anonymousTestFile.toPath)) val fileuid = res.put(f, "default", Seq.empty) fileuid must not beEmpty }