From 8348edeab822f664ae07fb58fb4930533295c910 Mon Sep 17 00:00:00 2001 From: Ravi Nayak Date: Thu, 7 Feb 2019 16:29:27 -0500 Subject: [PATCH 1/2] fix implcit conversion of Resolver Previous implementation was not working because the implicit type conversion method was not defined in the same object as the class being implicitly converted. Therefore, scala could not find the implicit method when the forBucket method was called In addition, refactor code and clean up warnings --- build.sbt | 4 +- patch | 218 ++++++++++++++++++ project/build.properties | 2 +- .../com/lightbend/gcsplugin/GCSPlugin.scala | 14 +- .../lightbend/gcsplugin/GCSRepository.scala | 14 +- .../com/lightbend/gcsplugin/GCSResolver.scala | 21 +- .../com/lightbend/gcsplugin/GCSResource.scala | 35 ++- 7 files changed, 268 insertions(+), 40 deletions(-) create mode 100644 patch diff --git a/build.sbt b/build.sbt index c575de9..2907460 100644 --- a/build.sbt +++ b/build.sbt @@ -12,7 +12,7 @@ lazy val commonSettings = Seq( lazy val sbtGCSResolver = Project("sbt-google-cloud-storage", file(".")) .settings( - version := "0.0.10", + version := "0.0.11", organization := "com.lightbend", scalaVersion := "2.12.6", @@ -22,7 +22,7 @@ lazy val sbtGCSResolver = ), sbtPlugin := true, - crossSbtVersions := Vector("1.0.2"), + crossSbtVersions := Vector("1.2.8"), name := "sbt-google-cloud-storage", description := "A SBT resolver and publisher for Google Cloud Storage", diff --git a/patch b/patch new file mode 100644 index 0000000..54d5993 --- /dev/null +++ b/patch @@ -0,0 +1,218 @@ +diff --git a/build.sbt b/build.sbt +index c575de9..2907460 100644 +--- a/build.sbt ++++ b/build.sbt +@@ -12,7 +12,7 @@ lazy val commonSettings = Seq( + lazy val sbtGCSResolver = + Project("sbt-google-cloud-storage", file(".")) + .settings( +- version := "0.0.10", ++ version := "0.0.11", + organization := "com.lightbend", + scalaVersion := "2.12.6", + +@@ -22,7 +22,7 @@ lazy val sbtGCSResolver = + ), + + sbtPlugin := true, +- crossSbtVersions := Vector("1.0.2"), ++ crossSbtVersions := Vector("1.2.8"), + + name := "sbt-google-cloud-storage", + description := "A SBT resolver and publisher for Google Cloud Storage", +diff --git a/project/build.properties b/project/build.properties +index 017bb86..dca663d 100644 +--- a/project/build.properties ++++ b/project/build.properties +@@ -1 +1 @@ +-sbt.version = 1.0.2 ++sbt.version = 1.2.8 +diff --git a/src/main/scala/com/lightbend/gcsplugin/GCSPlugin.scala b/src/main/scala/com/lightbend/gcsplugin/GCSPlugin.scala +index ffd1b43..09c7160 100644 +--- a/src/main/scala/com/lightbend/gcsplugin/GCSPlugin.scala ++++ b/src/main/scala/com/lightbend/gcsplugin/GCSPlugin.scala +@@ -1,18 +1,10 @@ + package com.lightbend.gcsplugin + +-import sbt.PluginTrigger +-import sbt.AutoPlugin ++import sbt.{ AutoPlugin, Def, PluginTrigger } + + object GCSPlugin extends AutoPlugin { + +- trait Keys { +- implicit def toSbtResolver(resolver: GCSResolver): sbt.Resolver = { +- new sbt.RawRepository(resolver, resolver.getName) +- } +- } +- +- object Keys extends Keys +- object autoImport extends Keys { ++ object autoImport { + val GCSResolver = com.lightbend.gcsplugin.GCSResolver + val GCSPublisher = com.lightbend.gcsplugin.GCSPublisher + val AccessRights = com.lightbend.gcsplugin.AccessRights +@@ -20,7 +12,7 @@ object GCSPlugin extends AutoPlugin { + + import sbt.Keys._ + +- override def projectSettings = Seq( ++ override def projectSettings: Seq[Def.Setting[Boolean]] = Seq( + publishMavenStyle := false + ) + +diff --git a/src/main/scala/com/lightbend/gcsplugin/GCSRepository.scala b/src/main/scala/com/lightbend/gcsplugin/GCSRepository.scala +index d5cff2f..c35fb4e 100644 +--- a/src/main/scala/com/lightbend/gcsplugin/GCSRepository.scala ++++ b/src/main/scala/com/lightbend/gcsplugin/GCSRepository.scala +@@ -1,19 +1,17 @@ + package com.lightbend.gcsplugin + ++import java.io.{ FileInputStream, _ } + import java.util +-import java.io._ +-import java.io.FileInputStream + +-import scala.collection.JavaConverters._ +- +-import com.google.cloud.storage._ +-import com.google.cloud.storage.Storage + import com.google.cloud.storage.Bucket._ ++import com.google.cloud.storage.{ Storage, _ } + import com.lightbend.gcsplugin.AccessRights._ + import org.apache.ivy.core.module.descriptor._ + import org.apache.ivy.plugins.repository._ + +-case class GCSRepository(bucketName: String, publishPolicy: AccessRigths) extends AbstractRepository { ++import scala.collection.JavaConverters._ ++ ++case class GCSRepository(bucketName: String, publishPolicy: AccessRights) extends AbstractRepository { + private val storage: Storage = StorageOptions.getDefaultInstance.getService + private val bucket = storage.get(bucketName) + +@@ -30,7 +28,7 @@ case class GCSRepository(bucketName: String, publishPolicy: AccessRigths) extend + else + source + +- GCSResource.toFile(storage, GCSResource.create(storage, bucketName, extSource), destination) ++ GCSResource.download(storage, GCSResource.create(storage, bucketName, extSource), destination) + } + + override def list(parent: String): util.List[String] = { +diff --git a/src/main/scala/com/lightbend/gcsplugin/GCSResolver.scala b/src/main/scala/com/lightbend/gcsplugin/GCSResolver.scala +index f74f694..4923173 100644 +--- a/src/main/scala/com/lightbend/gcsplugin/GCSResolver.scala ++++ b/src/main/scala/com/lightbend/gcsplugin/GCSResolver.scala +@@ -3,25 +3,34 @@ package com.lightbend.gcsplugin + import org.apache.ivy.plugins.resolver._ + import sbt.librarymanagement._ + ++import scala.language.implicitConversions ++ + object AccessRights extends Enumeration { +- type AccessRigths = Value ++ type AccessRights = Value + val PublicRead, InheritBucket = Value + } ++ + import com.lightbend.gcsplugin.AccessRights._ + +-object GCSResolver { +- def forBucket(bucketName: String) = { ++object GCSResolver extends Implicits { ++ def forBucket(bucketName: String): GCSResolver = { + new GCSResolver("Google Cloud Storage Resolver", bucketName, publishPolicy = AccessRights.InheritBucket) + } + } + +-object GCSPublisher { +- def forBucket(bucketName: String, publishPolicy: AccessRigths) = { ++object GCSPublisher extends Implicits { ++ def forBucket(bucketName: String, publishPolicy: AccessRights): GCSResolver = { + new GCSResolver("Google Cloud Storage Publisher", bucketName, publishPolicy) + } + } + +-class GCSResolver(name: String, bucketName: String, publishPolicy: AccessRigths) extends RepositoryResolver { ++trait Implicits { ++ implicit def toSbtResolver(resolver: GCSResolver): sbt.Resolver = { ++ new sbt.RawRepository(resolver, resolver.getName) ++ } ++} ++ ++class GCSResolver(name: String, bucketName: String, publishPolicy: AccessRights) extends RepositoryResolver { + setName(name) + setRepository(GCSRepository(bucketName, publishPolicy)) + setM2compatible(false) +diff --git a/src/main/scala/com/lightbend/gcsplugin/GCSResource.scala b/src/main/scala/com/lightbend/gcsplugin/GCSResource.scala +index 04f3992..cfa9500 100644 +--- a/src/main/scala/com/lightbend/gcsplugin/GCSResource.scala ++++ b/src/main/scala/com/lightbend/gcsplugin/GCSResource.scala +@@ -1,44 +1,55 @@ + package com.lightbend.gcsplugin + +-import java.io._ +-import java.io.File ++import java.io.{ File, _ } + import java.nio.channels._ + +-import com.google.cloud.storage._ +-import com.google.cloud.storage.BlobId ++import com.google.cloud.storage.{ BlobId, _ } + import org.apache.ivy.plugins.repository._ + + object GCSResource { + def create(storage: Storage, bucketName: String, blobName: String): GCSResource = { +- val blobId = BlobId.of(bucketName, blobName.replace("//", "/")) +- val blob = storage.get(blobId) ++ val blob = storage.get(blobIdFromName(bucketName, blobName)) + if (blob == null) + GCSResource(storage, bucketName, blobName, 0, 0, exists = false) + else + GCSResource(storage, bucketName, blobName, blob.getUpdateTime(), blob.getSize, exists = true) + } ++ + def openStream(storage: Storage, resource: GCSResource): InputStream = { +- val blobId = BlobId.of(resource.bucketName, resource.blobName.replace("//", "/")) +- val blob = storage.get(blobId) ++ val blob = storage.get(blobIdFromName(resource.bucketName, resource.blobName)) + Channels.newInputStream(blob.reader()) + } +- def toFile(storage: Storage, resource: GCSResource, file: File): Unit = { +- val blobId = BlobId.of(resource.bucketName, resource.blobName.replace("//", "/")) +- val blob = storage.get(blobId) ++ ++ def download(storage: Storage, resource: GCSResource, file: File): Unit = { ++ val blob = storage.get(blobIdFromName(resource.bucketName, resource.blobName)) + blob.downloadTo(file.toPath) + } ++ ++ def blobIdFromName(bucketName: String, name: String): BlobId = { ++ BlobId.of(bucketName, name.replace("//", "/")) ++ } + } + +-case class GCSResource(storage: Storage, bucketName: String, blobName: String, lastModified: Long, contentLength: Long, exists: Boolean) extends Resource { ++case class GCSResource( ++ storage: Storage, ++ bucketName: String, ++ blobName: String, ++ lastModified: Long, ++ contentLength: Long, ++ exists: Boolean) extends Resource { + + override def getName: String = blobName ++ + override def getLastModified: Long = lastModified ++ + override def getContentLength: Long = contentLength + + override def openStream(): InputStream = { + GCSResource.openStream(storage, this) + } ++ + override def isLocal = false ++ + override def clone(cloneName: String): Resource = copy() + + } diff --git a/project/build.properties b/project/build.properties index 017bb86..dca663d 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version = 1.0.2 +sbt.version = 1.2.8 diff --git a/src/main/scala/com/lightbend/gcsplugin/GCSPlugin.scala b/src/main/scala/com/lightbend/gcsplugin/GCSPlugin.scala index ffd1b43..766805c 100644 --- a/src/main/scala/com/lightbend/gcsplugin/GCSPlugin.scala +++ b/src/main/scala/com/lightbend/gcsplugin/GCSPlugin.scala @@ -1,18 +1,10 @@ package com.lightbend.gcsplugin -import sbt.PluginTrigger -import sbt.AutoPlugin +import sbt.{AutoPlugin, PluginTrigger, Setting} object GCSPlugin extends AutoPlugin { - trait Keys { - implicit def toSbtResolver(resolver: GCSResolver): sbt.Resolver = { - new sbt.RawRepository(resolver, resolver.getName) - } - } - - object Keys extends Keys - object autoImport extends Keys { + object autoImport { val GCSResolver = com.lightbend.gcsplugin.GCSResolver val GCSPublisher = com.lightbend.gcsplugin.GCSPublisher val AccessRights = com.lightbend.gcsplugin.AccessRights @@ -20,7 +12,7 @@ object GCSPlugin extends AutoPlugin { import sbt.Keys._ - override def projectSettings = Seq( + override def projectSettings: Seq[Setting[_]] = Seq( publishMavenStyle := false ) diff --git a/src/main/scala/com/lightbend/gcsplugin/GCSRepository.scala b/src/main/scala/com/lightbend/gcsplugin/GCSRepository.scala index d5cff2f..c35fb4e 100644 --- a/src/main/scala/com/lightbend/gcsplugin/GCSRepository.scala +++ b/src/main/scala/com/lightbend/gcsplugin/GCSRepository.scala @@ -1,19 +1,17 @@ package com.lightbend.gcsplugin +import java.io.{ FileInputStream, _ } import java.util -import java.io._ -import java.io.FileInputStream -import scala.collection.JavaConverters._ - -import com.google.cloud.storage._ -import com.google.cloud.storage.Storage import com.google.cloud.storage.Bucket._ +import com.google.cloud.storage.{ Storage, _ } import com.lightbend.gcsplugin.AccessRights._ import org.apache.ivy.core.module.descriptor._ import org.apache.ivy.plugins.repository._ -case class GCSRepository(bucketName: String, publishPolicy: AccessRigths) extends AbstractRepository { +import scala.collection.JavaConverters._ + +case class GCSRepository(bucketName: String, publishPolicy: AccessRights) extends AbstractRepository { private val storage: Storage = StorageOptions.getDefaultInstance.getService private val bucket = storage.get(bucketName) @@ -30,7 +28,7 @@ case class GCSRepository(bucketName: String, publishPolicy: AccessRigths) extend else source - GCSResource.toFile(storage, GCSResource.create(storage, bucketName, extSource), destination) + GCSResource.download(storage, GCSResource.create(storage, bucketName, extSource), destination) } override def list(parent: String): util.List[String] = { diff --git a/src/main/scala/com/lightbend/gcsplugin/GCSResolver.scala b/src/main/scala/com/lightbend/gcsplugin/GCSResolver.scala index f74f694..4923173 100644 --- a/src/main/scala/com/lightbend/gcsplugin/GCSResolver.scala +++ b/src/main/scala/com/lightbend/gcsplugin/GCSResolver.scala @@ -3,25 +3,34 @@ package com.lightbend.gcsplugin import org.apache.ivy.plugins.resolver._ import sbt.librarymanagement._ +import scala.language.implicitConversions + object AccessRights extends Enumeration { - type AccessRigths = Value + type AccessRights = Value val PublicRead, InheritBucket = Value } + import com.lightbend.gcsplugin.AccessRights._ -object GCSResolver { - def forBucket(bucketName: String) = { +object GCSResolver extends Implicits { + def forBucket(bucketName: String): GCSResolver = { new GCSResolver("Google Cloud Storage Resolver", bucketName, publishPolicy = AccessRights.InheritBucket) } } -object GCSPublisher { - def forBucket(bucketName: String, publishPolicy: AccessRigths) = { +object GCSPublisher extends Implicits { + def forBucket(bucketName: String, publishPolicy: AccessRights): GCSResolver = { new GCSResolver("Google Cloud Storage Publisher", bucketName, publishPolicy) } } -class GCSResolver(name: String, bucketName: String, publishPolicy: AccessRigths) extends RepositoryResolver { +trait Implicits { + implicit def toSbtResolver(resolver: GCSResolver): sbt.Resolver = { + new sbt.RawRepository(resolver, resolver.getName) + } +} + +class GCSResolver(name: String, bucketName: String, publishPolicy: AccessRights) extends RepositoryResolver { setName(name) setRepository(GCSRepository(bucketName, publishPolicy)) setM2compatible(false) diff --git a/src/main/scala/com/lightbend/gcsplugin/GCSResource.scala b/src/main/scala/com/lightbend/gcsplugin/GCSResource.scala index 04f3992..cfa9500 100644 --- a/src/main/scala/com/lightbend/gcsplugin/GCSResource.scala +++ b/src/main/scala/com/lightbend/gcsplugin/GCSResource.scala @@ -1,44 +1,55 @@ package com.lightbend.gcsplugin -import java.io._ -import java.io.File +import java.io.{ File, _ } import java.nio.channels._ -import com.google.cloud.storage._ -import com.google.cloud.storage.BlobId +import com.google.cloud.storage.{ BlobId, _ } import org.apache.ivy.plugins.repository._ object GCSResource { def create(storage: Storage, bucketName: String, blobName: String): GCSResource = { - val blobId = BlobId.of(bucketName, blobName.replace("//", "/")) - val blob = storage.get(blobId) + val blob = storage.get(blobIdFromName(bucketName, blobName)) if (blob == null) GCSResource(storage, bucketName, blobName, 0, 0, exists = false) else GCSResource(storage, bucketName, blobName, blob.getUpdateTime(), blob.getSize, exists = true) } + def openStream(storage: Storage, resource: GCSResource): InputStream = { - val blobId = BlobId.of(resource.bucketName, resource.blobName.replace("//", "/")) - val blob = storage.get(blobId) + val blob = storage.get(blobIdFromName(resource.bucketName, resource.blobName)) Channels.newInputStream(blob.reader()) } - def toFile(storage: Storage, resource: GCSResource, file: File): Unit = { - val blobId = BlobId.of(resource.bucketName, resource.blobName.replace("//", "/")) - val blob = storage.get(blobId) + + def download(storage: Storage, resource: GCSResource, file: File): Unit = { + val blob = storage.get(blobIdFromName(resource.bucketName, resource.blobName)) blob.downloadTo(file.toPath) } + + def blobIdFromName(bucketName: String, name: String): BlobId = { + BlobId.of(bucketName, name.replace("//", "/")) + } } -case class GCSResource(storage: Storage, bucketName: String, blobName: String, lastModified: Long, contentLength: Long, exists: Boolean) extends Resource { +case class GCSResource( + storage: Storage, + bucketName: String, + blobName: String, + lastModified: Long, + contentLength: Long, + exists: Boolean) extends Resource { override def getName: String = blobName + override def getLastModified: Long = lastModified + override def getContentLength: Long = contentLength override def openStream(): InputStream = { GCSResource.openStream(storage, this) } + override def isLocal = false + override def clone(cloneName: String): Resource = copy() } From f4b780120fb9cb39c127b938022cefb4d88c7728 Mon Sep 17 00:00:00 2001 From: Ravi Nayak Date: Thu, 7 Feb 2019 16:39:59 -0500 Subject: [PATCH 2/2] remove patch file --- patch | 218 ---------------------------------------------------------- 1 file changed, 218 deletions(-) delete mode 100644 patch diff --git a/patch b/patch deleted file mode 100644 index 54d5993..0000000 --- a/patch +++ /dev/null @@ -1,218 +0,0 @@ -diff --git a/build.sbt b/build.sbt -index c575de9..2907460 100644 ---- a/build.sbt -+++ b/build.sbt -@@ -12,7 +12,7 @@ lazy val commonSettings = Seq( - lazy val sbtGCSResolver = - Project("sbt-google-cloud-storage", file(".")) - .settings( -- version := "0.0.10", -+ version := "0.0.11", - organization := "com.lightbend", - scalaVersion := "2.12.6", - -@@ -22,7 +22,7 @@ lazy val sbtGCSResolver = - ), - - sbtPlugin := true, -- crossSbtVersions := Vector("1.0.2"), -+ crossSbtVersions := Vector("1.2.8"), - - name := "sbt-google-cloud-storage", - description := "A SBT resolver and publisher for Google Cloud Storage", -diff --git a/project/build.properties b/project/build.properties -index 017bb86..dca663d 100644 ---- a/project/build.properties -+++ b/project/build.properties -@@ -1 +1 @@ --sbt.version = 1.0.2 -+sbt.version = 1.2.8 -diff --git a/src/main/scala/com/lightbend/gcsplugin/GCSPlugin.scala b/src/main/scala/com/lightbend/gcsplugin/GCSPlugin.scala -index ffd1b43..09c7160 100644 ---- a/src/main/scala/com/lightbend/gcsplugin/GCSPlugin.scala -+++ b/src/main/scala/com/lightbend/gcsplugin/GCSPlugin.scala -@@ -1,18 +1,10 @@ - package com.lightbend.gcsplugin - --import sbt.PluginTrigger --import sbt.AutoPlugin -+import sbt.{ AutoPlugin, Def, PluginTrigger } - - object GCSPlugin extends AutoPlugin { - -- trait Keys { -- implicit def toSbtResolver(resolver: GCSResolver): sbt.Resolver = { -- new sbt.RawRepository(resolver, resolver.getName) -- } -- } -- -- object Keys extends Keys -- object autoImport extends Keys { -+ object autoImport { - val GCSResolver = com.lightbend.gcsplugin.GCSResolver - val GCSPublisher = com.lightbend.gcsplugin.GCSPublisher - val AccessRights = com.lightbend.gcsplugin.AccessRights -@@ -20,7 +12,7 @@ object GCSPlugin extends AutoPlugin { - - import sbt.Keys._ - -- override def projectSettings = Seq( -+ override def projectSettings: Seq[Def.Setting[Boolean]] = Seq( - publishMavenStyle := false - ) - -diff --git a/src/main/scala/com/lightbend/gcsplugin/GCSRepository.scala b/src/main/scala/com/lightbend/gcsplugin/GCSRepository.scala -index d5cff2f..c35fb4e 100644 ---- a/src/main/scala/com/lightbend/gcsplugin/GCSRepository.scala -+++ b/src/main/scala/com/lightbend/gcsplugin/GCSRepository.scala -@@ -1,19 +1,17 @@ - package com.lightbend.gcsplugin - -+import java.io.{ FileInputStream, _ } - import java.util --import java.io._ --import java.io.FileInputStream - --import scala.collection.JavaConverters._ -- --import com.google.cloud.storage._ --import com.google.cloud.storage.Storage - import com.google.cloud.storage.Bucket._ -+import com.google.cloud.storage.{ Storage, _ } - import com.lightbend.gcsplugin.AccessRights._ - import org.apache.ivy.core.module.descriptor._ - import org.apache.ivy.plugins.repository._ - --case class GCSRepository(bucketName: String, publishPolicy: AccessRigths) extends AbstractRepository { -+import scala.collection.JavaConverters._ -+ -+case class GCSRepository(bucketName: String, publishPolicy: AccessRights) extends AbstractRepository { - private val storage: Storage = StorageOptions.getDefaultInstance.getService - private val bucket = storage.get(bucketName) - -@@ -30,7 +28,7 @@ case class GCSRepository(bucketName: String, publishPolicy: AccessRigths) extend - else - source - -- GCSResource.toFile(storage, GCSResource.create(storage, bucketName, extSource), destination) -+ GCSResource.download(storage, GCSResource.create(storage, bucketName, extSource), destination) - } - - override def list(parent: String): util.List[String] = { -diff --git a/src/main/scala/com/lightbend/gcsplugin/GCSResolver.scala b/src/main/scala/com/lightbend/gcsplugin/GCSResolver.scala -index f74f694..4923173 100644 ---- a/src/main/scala/com/lightbend/gcsplugin/GCSResolver.scala -+++ b/src/main/scala/com/lightbend/gcsplugin/GCSResolver.scala -@@ -3,25 +3,34 @@ package com.lightbend.gcsplugin - import org.apache.ivy.plugins.resolver._ - import sbt.librarymanagement._ - -+import scala.language.implicitConversions -+ - object AccessRights extends Enumeration { -- type AccessRigths = Value -+ type AccessRights = Value - val PublicRead, InheritBucket = Value - } -+ - import com.lightbend.gcsplugin.AccessRights._ - --object GCSResolver { -- def forBucket(bucketName: String) = { -+object GCSResolver extends Implicits { -+ def forBucket(bucketName: String): GCSResolver = { - new GCSResolver("Google Cloud Storage Resolver", bucketName, publishPolicy = AccessRights.InheritBucket) - } - } - --object GCSPublisher { -- def forBucket(bucketName: String, publishPolicy: AccessRigths) = { -+object GCSPublisher extends Implicits { -+ def forBucket(bucketName: String, publishPolicy: AccessRights): GCSResolver = { - new GCSResolver("Google Cloud Storage Publisher", bucketName, publishPolicy) - } - } - --class GCSResolver(name: String, bucketName: String, publishPolicy: AccessRigths) extends RepositoryResolver { -+trait Implicits { -+ implicit def toSbtResolver(resolver: GCSResolver): sbt.Resolver = { -+ new sbt.RawRepository(resolver, resolver.getName) -+ } -+} -+ -+class GCSResolver(name: String, bucketName: String, publishPolicy: AccessRights) extends RepositoryResolver { - setName(name) - setRepository(GCSRepository(bucketName, publishPolicy)) - setM2compatible(false) -diff --git a/src/main/scala/com/lightbend/gcsplugin/GCSResource.scala b/src/main/scala/com/lightbend/gcsplugin/GCSResource.scala -index 04f3992..cfa9500 100644 ---- a/src/main/scala/com/lightbend/gcsplugin/GCSResource.scala -+++ b/src/main/scala/com/lightbend/gcsplugin/GCSResource.scala -@@ -1,44 +1,55 @@ - package com.lightbend.gcsplugin - --import java.io._ --import java.io.File -+import java.io.{ File, _ } - import java.nio.channels._ - --import com.google.cloud.storage._ --import com.google.cloud.storage.BlobId -+import com.google.cloud.storage.{ BlobId, _ } - import org.apache.ivy.plugins.repository._ - - object GCSResource { - def create(storage: Storage, bucketName: String, blobName: String): GCSResource = { -- val blobId = BlobId.of(bucketName, blobName.replace("//", "/")) -- val blob = storage.get(blobId) -+ val blob = storage.get(blobIdFromName(bucketName, blobName)) - if (blob == null) - GCSResource(storage, bucketName, blobName, 0, 0, exists = false) - else - GCSResource(storage, bucketName, blobName, blob.getUpdateTime(), blob.getSize, exists = true) - } -+ - def openStream(storage: Storage, resource: GCSResource): InputStream = { -- val blobId = BlobId.of(resource.bucketName, resource.blobName.replace("//", "/")) -- val blob = storage.get(blobId) -+ val blob = storage.get(blobIdFromName(resource.bucketName, resource.blobName)) - Channels.newInputStream(blob.reader()) - } -- def toFile(storage: Storage, resource: GCSResource, file: File): Unit = { -- val blobId = BlobId.of(resource.bucketName, resource.blobName.replace("//", "/")) -- val blob = storage.get(blobId) -+ -+ def download(storage: Storage, resource: GCSResource, file: File): Unit = { -+ val blob = storage.get(blobIdFromName(resource.bucketName, resource.blobName)) - blob.downloadTo(file.toPath) - } -+ -+ def blobIdFromName(bucketName: String, name: String): BlobId = { -+ BlobId.of(bucketName, name.replace("//", "/")) -+ } - } - --case class GCSResource(storage: Storage, bucketName: String, blobName: String, lastModified: Long, contentLength: Long, exists: Boolean) extends Resource { -+case class GCSResource( -+ storage: Storage, -+ bucketName: String, -+ blobName: String, -+ lastModified: Long, -+ contentLength: Long, -+ exists: Boolean) extends Resource { - - override def getName: String = blobName -+ - override def getLastModified: Long = lastModified -+ - override def getContentLength: Long = contentLength - - override def openStream(): InputStream = { - GCSResource.openStream(storage, this) - } -+ - override def isLocal = false -+ - override def clone(cloneName: String): Resource = copy() - - }