app/drivers/PathStorage.scala (74 lines of code) (raw):

package drivers import helpers.StorageHelper import java.io._ import java.nio.file.{Files, Paths} import models.StorageEntry import play.api.Logger import scala.util.{Failure, Success, Try} /** * Implements a storage driver for regular file paths */ class PathStorage(override val storageRef:StorageEntry) extends StorageDriver{ val logger: Logger = Logger(this.getClass) /** * return a [[java.io.File]] instance for the given path * @param path absolute path on the storage * @return [[java.io.File]] representing the given path */ def fileForPath(path: String) = { new File(path) } def getAbsolutePath(path:String) = { storageRef.rootpath match { case Some(rootpath)=> if(path.startsWith(rootpath)) { Paths.get(path) } else { Paths.get(rootpath,path) } case None=>Paths.get(path) } } override def pathExists(path: String, version:Int): Boolean = Files.exists(getAbsolutePath(path)) override def writeDataToPath(path: String, version:Int, dataStream: InputStream): Try[Unit] = { val finalPath = getAbsolutePath(path) Try { this.fileForPath(finalPath.toString) }.flatMap(f=> { logger.info(s"Writing data to ${f.getAbsolutePath}") val st = new FileOutputStream(f) val bytesCopied = Try { StorageHelper.copyStream(dataStream, st) } st.close() bytesCopied }).map(bytesCopied=>{ logger.info(s"Finished writing $bytesCopied to ${finalPath.toString}") }) } def writeDataToPath(path:String, version:Int, data:Array[Byte]):Try[Unit] = Try { val finalPath = storageRef.rootpath match { case Some(rootpath)=>Paths.get(rootpath,path) case None=>Paths.get(path) } val f = this.fileForPath(finalPath.toString) logger.info(s"Writing data to ${f.getAbsolutePath}") val st = new FileOutputStream(f) st.write(data) st.close() logger.info(s"Finished writing to ${f.getAbsolutePath}") } override def deleteFileAtPath(path: String, version:Int): Boolean = { val f = this.fileForPath(path) logger.info(s"Deleting file at ${f.getAbsolutePath}") f.delete() } override def getWriteStream(path: String, version:Int): Try[OutputStream] = Try { val f = getAbsolutePath(path).toFile new BufferedOutputStream(new FileOutputStream(f)) } override def getReadStream(path: String, version:Int): Try[InputStream] = { val f = getAbsolutePath(path).toFile if(f.exists()) Success(new BufferedInputStream(new FileInputStream(f))) else Failure(new RuntimeException(s"Path $path does not exist")) } override def getMetadata(path: String, version:Int): Option[PathMetadata] = { val f = getAbsolutePath(path).toFile if(f.exists()) { Some(PathMetadata(f.length(), f.lastModified())) } else { None } } override def supportsVersions: Boolean = false }