From fb2a8b7bbc6fc4ef94f7523ef9bb17f837f84d7c Mon Sep 17 00:00:00 2001 From: derNiklaas Date: Wed, 22 May 2019 20:35:53 +0200 Subject: [PATCH 1/6] First Version of File Connectors --- .../connector/actor/FileSystemActor.scala | 12 ++++-- .../service/file/FileConnector.scala | 32 ++++++++++++++++ .../service/file/impl/FileInputImpl.scala | 32 ++++++++++++++++ .../service/file/impl/FileOutputImpl.scala | 37 +++++++++++++++++++ 4 files changed, 109 insertions(+), 4 deletions(-) create mode 100644 src/main/scala/org/codeoverflow/chatoverflow/requirement/service/file/FileConnector.scala create mode 100644 src/main/scala/org/codeoverflow/chatoverflow/requirement/service/file/impl/FileInputImpl.scala create mode 100644 src/main/scala/org/codeoverflow/chatoverflow/requirement/service/file/impl/FileOutputImpl.scala diff --git a/src/main/scala/org/codeoverflow/chatoverflow/connector/actor/FileSystemActor.scala b/src/main/scala/org/codeoverflow/chatoverflow/connector/actor/FileSystemActor.scala index 2779086a..b8e77909 100644 --- a/src/main/scala/org/codeoverflow/chatoverflow/connector/actor/FileSystemActor.scala +++ b/src/main/scala/org/codeoverflow/chatoverflow/connector/actor/FileSystemActor.scala @@ -36,9 +36,9 @@ class FileSystemActor extends Actor { } case LoadBinaryFile(pathInResources) => try { - sender ! Files.readAllBytes(new File(s"$dataFilePath${fixPath(pathInResources)}").toPath) + sender ! Some(Files.readAllBytes(new File(s"$dataFilePath${fixPath(pathInResources)}").toPath)) } catch { - case _: Exception => Array[Byte]() + case _: Exception => None } case SaveFile(pathInResources, content) => try { @@ -65,8 +65,12 @@ class FileSystemActor extends Actor { } private def fixPath(path: String): String = { - val fixedPath = Paths.get(File.separator, path).normalize() - fixedPath.toString + var fixedPath = Paths.get(File.pathSeparator, path).normalize().toString + if(fixedPath.startsWith(";")){ + fixedPath = fixedPath.replaceFirst(";", "") + } + //System.out.println(fixedPath) + fixedPath } } diff --git a/src/main/scala/org/codeoverflow/chatoverflow/requirement/service/file/FileConnector.scala b/src/main/scala/org/codeoverflow/chatoverflow/requirement/service/file/FileConnector.scala new file mode 100644 index 00000000..88a20773 --- /dev/null +++ b/src/main/scala/org/codeoverflow/chatoverflow/requirement/service/file/FileConnector.scala @@ -0,0 +1,32 @@ +package org.codeoverflow.chatoverflow.requirement.service.file + +import org.codeoverflow.chatoverflow.WithLogger +import org.codeoverflow.chatoverflow.connector.Connector +import org.codeoverflow.chatoverflow.connector.actor.FileSystemActor +import org.codeoverflow.chatoverflow.connector.actor.FileSystemActor.{CreateDirectory, LoadBinaryFile, LoadFile, SaveBinaryFile, SaveFile} + +class FileConnector(override val sourceIdentifier: String) extends Connector(sourceIdentifier) with WithLogger { + override protected var requiredCredentialKeys: List[String] = List() + override protected var optionalCredentialKeys: List[String] = List() + private val fileActor = createActor[FileSystemActor]() + def getFile(pathInResources: String) = fileActor.??[Some[String]](5){LoadFile(pathInResources)}.get + + def getBinaryFile(pathInResources: String)= fileActor.??[Some[Array[Byte]]](5){LoadBinaryFile(pathInResources)}.get + + def saveFile(pathInResources: String, content: String) = fileActor.??[Boolean](5){SaveFile(pathInResources, content)}.get + + def saveBinaryFile(pathInResources: String, content: Array[Byte]) = fileActor.??[Boolean](5){SaveBinaryFile(pathInResources, content)}.get + + def createDirectory(folderName: String) = fileActor.??[Boolean](5){CreateDirectory(folderName)}.get + + override def start(): Boolean = { + logger info s"Started file connector! Source identifier is: '$sourceIdentifier'." + true + } + + override def stop(): Boolean = { + logger info "Stopped file connector!" + true + } + +} diff --git a/src/main/scala/org/codeoverflow/chatoverflow/requirement/service/file/impl/FileInputImpl.scala b/src/main/scala/org/codeoverflow/chatoverflow/requirement/service/file/impl/FileInputImpl.scala new file mode 100644 index 00000000..f1de5f2c --- /dev/null +++ b/src/main/scala/org/codeoverflow/chatoverflow/requirement/service/file/impl/FileInputImpl.scala @@ -0,0 +1,32 @@ +package org.codeoverflow.chatoverflow.requirement.service.file.impl + +import java.awt.image.BufferedImage +import java.io.ByteArrayInputStream + +import javax.imageio.ImageIO +import org.codeoverflow.chatoverflow.WithLogger +import org.codeoverflow.chatoverflow.api.io.dto.ImageFormat +import org.codeoverflow.chatoverflow.api.io.input.FileInput +import org.codeoverflow.chatoverflow.registry.Impl +import org.codeoverflow.chatoverflow.requirement.InputImpl +import org.codeoverflow.chatoverflow.requirement.service.file.FileConnector + +@Impl(impl = classOf[FileInput], connector = classOf[FileConnector]) +class FileInputImpl extends InputImpl[FileConnector] with FileInput with WithLogger { + + override def init(): Boolean = { + sourceConnector.get.init() + } + + override def getFile(pathInResources: String): String = sourceConnector.get.getFile(pathInResources).get + + override def getBinaryFile(pathInResources: String): Array[Byte] = sourceConnector.get.getBinaryFile(pathInResources).get + + override def getImage(pathInResources: String, format: ImageFormat): BufferedImage = { + val data = sourceConnector.get.getBinaryFile(s"$pathInResources.${format.toString.toLowerCase}").get + val bis = new ByteArrayInputStream(data) + ImageIO.read(bis) + } + + override def start(): Boolean = true +} diff --git a/src/main/scala/org/codeoverflow/chatoverflow/requirement/service/file/impl/FileOutputImpl.scala b/src/main/scala/org/codeoverflow/chatoverflow/requirement/service/file/impl/FileOutputImpl.scala new file mode 100644 index 00000000..f73a8d84 --- /dev/null +++ b/src/main/scala/org/codeoverflow/chatoverflow/requirement/service/file/impl/FileOutputImpl.scala @@ -0,0 +1,37 @@ +package org.codeoverflow.chatoverflow.requirement.service.file.impl + +import java.awt.image.BufferedImage +import java.io.ByteArrayOutputStream + +import javax.imageio.ImageIO +import org.codeoverflow.chatoverflow.WithLogger +import org.codeoverflow.chatoverflow.api.io.dto.ImageFormat +import org.codeoverflow.chatoverflow.api.io.output.FileOutput +import org.codeoverflow.chatoverflow.registry.Impl +import org.codeoverflow.chatoverflow.requirement.OutputImpl +import org.codeoverflow.chatoverflow.requirement.service.file.FileConnector + +@Impl(impl = classOf[FileOutput], connector = classOf[FileConnector]) +class FileOutputImpl extends OutputImpl[FileConnector] with FileOutput with WithLogger { + + override def init() = { + sourceConnector.get.init() + } + + override def saveFile(content: String, pathInResources: String): Boolean = { + sourceConnector.get.saveFile(pathInResources, content) + } + + override def saveBinaryFile(bytes: Array[Byte], pathInResources: String): Boolean = { + sourceConnector.get.saveBinaryFile(pathInResources, bytes) + } + + override def saveImage(image: BufferedImage, format: ImageFormat, pathInResources: String): Boolean = { + val bao = new ByteArrayOutputStream() + ImageIO.write(image, format.toString.toLowerCase, bao) + sourceConnector.get.saveBinaryFile(s"$pathInResources.${format.toString.toLowerCase}", bao.toByteArray) + } + + override def start() = true + +} From 90a0a40346ca0abdbfed090155e2a923a04dc8e1 Mon Sep 17 00:00:00 2001 From: derNiklaas Date: Wed, 22 May 2019 20:50:40 +0200 Subject: [PATCH 2/6] Removed console log --- .../chatoverflow/connector/actor/FileSystemActor.scala | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/scala/org/codeoverflow/chatoverflow/connector/actor/FileSystemActor.scala b/src/main/scala/org/codeoverflow/chatoverflow/connector/actor/FileSystemActor.scala index b8e77909..ccf6fcca 100644 --- a/src/main/scala/org/codeoverflow/chatoverflow/connector/actor/FileSystemActor.scala +++ b/src/main/scala/org/codeoverflow/chatoverflow/connector/actor/FileSystemActor.scala @@ -69,7 +69,6 @@ class FileSystemActor extends Actor { if(fixedPath.startsWith(";")){ fixedPath = fixedPath.replaceFirst(";", "") } - //System.out.println(fixedPath) fixedPath } } From 1dacc407a197f3c86225984f125a6cb5ecac74d9 Mon Sep 17 00:00:00 2001 From: derNiklaas Date: Wed, 22 May 2019 21:10:47 +0200 Subject: [PATCH 3/6] Fixed crash if file does not exists --- .../service/file/impl/FileInputImpl.scala | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/main/scala/org/codeoverflow/chatoverflow/requirement/service/file/impl/FileInputImpl.scala b/src/main/scala/org/codeoverflow/chatoverflow/requirement/service/file/impl/FileInputImpl.scala index f1de5f2c..35c0cec3 100644 --- a/src/main/scala/org/codeoverflow/chatoverflow/requirement/service/file/impl/FileInputImpl.scala +++ b/src/main/scala/org/codeoverflow/chatoverflow/requirement/service/file/impl/FileInputImpl.scala @@ -18,9 +18,27 @@ class FileInputImpl extends InputImpl[FileConnector] with FileInput with WithLog sourceConnector.get.init() } - override def getFile(pathInResources: String): String = sourceConnector.get.getFile(pathInResources).get + override def getFile(pathInResources: String): String = { + try { + sourceConnector.get.getFile(pathInResources).get + }catch{ + case _: Exception => { + logger.error(s"Error. File $pathInResources does not exist.") + "ERROR" + } + } + } - override def getBinaryFile(pathInResources: String): Array[Byte] = sourceConnector.get.getBinaryFile(pathInResources).get + override def getBinaryFile(pathInResources: String): Array[Byte] = { + try { + sourceConnector.get.getBinaryFile(pathInResources).get + }catch{ + case _: Exception => { + logger.error(s"Error. File $pathInResources does not exist.") + Array[Byte]() + } + } + } override def getImage(pathInResources: String, format: ImageFormat): BufferedImage = { val data = sourceConnector.get.getBinaryFile(s"$pathInResources.${format.toString.toLowerCase}").get From 3fb608a29e6b6961416d185dbe5ba56c77928f09 Mon Sep 17 00:00:00 2001 From: derNiklaas Date: Thu, 23 May 2019 22:54:34 +0200 Subject: [PATCH 4/6] Changed return values to optionals --- .../service/file/FileConnector.scala | 23 ++++++++++--- .../service/file/impl/FileInputImpl.scala | 34 ++++++------------- 2 files changed, 28 insertions(+), 29 deletions(-) diff --git a/src/main/scala/org/codeoverflow/chatoverflow/requirement/service/file/FileConnector.scala b/src/main/scala/org/codeoverflow/chatoverflow/requirement/service/file/FileConnector.scala index 88a20773..c1e5106f 100644 --- a/src/main/scala/org/codeoverflow/chatoverflow/requirement/service/file/FileConnector.scala +++ b/src/main/scala/org/codeoverflow/chatoverflow/requirement/service/file/FileConnector.scala @@ -9,15 +9,28 @@ class FileConnector(override val sourceIdentifier: String) extends Connector(sou override protected var requiredCredentialKeys: List[String] = List() override protected var optionalCredentialKeys: List[String] = List() private val fileActor = createActor[FileSystemActor]() - def getFile(pathInResources: String) = fileActor.??[Some[String]](5){LoadFile(pathInResources)}.get - def getBinaryFile(pathInResources: String)= fileActor.??[Some[Array[Byte]]](5){LoadBinaryFile(pathInResources)}.get + def getFile(pathInResources: String): Option[String] = { + if (fileActor.??[Some[String]](5) {LoadFile(pathInResources)}.isDefined) { + fileActor.??[Some[String]](5) {LoadFile(pathInResources)}.get + }else{ + None + } + } + + def getBinaryFile(pathInResources: String): Option[Array[Byte]] = { + if(fileActor.??[Some[Array[Byte]]](5){LoadBinaryFile(pathInResources)}.isDefined){ + fileActor.??[Some[Array[Byte]]](5){LoadBinaryFile(pathInResources)}.get + }else{ + None + } + } - def saveFile(pathInResources: String, content: String) = fileActor.??[Boolean](5){SaveFile(pathInResources, content)}.get + def saveFile(pathInResources: String, content: String): Boolean = fileActor.??[Boolean](5){SaveFile(pathInResources, content)}.get - def saveBinaryFile(pathInResources: String, content: Array[Byte]) = fileActor.??[Boolean](5){SaveBinaryFile(pathInResources, content)}.get + def saveBinaryFile(pathInResources: String, content: Array[Byte]): Boolean = fileActor.??[Boolean](5){SaveBinaryFile(pathInResources, content)}.get - def createDirectory(folderName: String) = fileActor.??[Boolean](5){CreateDirectory(folderName)}.get + def createDirectory(folderName: String): Boolean = fileActor.??[Boolean](5){CreateDirectory(folderName)}.get override def start(): Boolean = { logger info s"Started file connector! Source identifier is: '$sourceIdentifier'." diff --git a/src/main/scala/org/codeoverflow/chatoverflow/requirement/service/file/impl/FileInputImpl.scala b/src/main/scala/org/codeoverflow/chatoverflow/requirement/service/file/impl/FileInputImpl.scala index 35c0cec3..e8621927 100644 --- a/src/main/scala/org/codeoverflow/chatoverflow/requirement/service/file/impl/FileInputImpl.scala +++ b/src/main/scala/org/codeoverflow/chatoverflow/requirement/service/file/impl/FileInputImpl.scala @@ -2,6 +2,7 @@ package org.codeoverflow.chatoverflow.requirement.service.file.impl import java.awt.image.BufferedImage import java.io.ByteArrayInputStream +import java.util.Optional import javax.imageio.ImageIO import org.codeoverflow.chatoverflow.WithLogger @@ -18,32 +19,17 @@ class FileInputImpl extends InputImpl[FileConnector] with FileInput with WithLog sourceConnector.get.init() } - override def getFile(pathInResources: String): String = { - try { - sourceConnector.get.getFile(pathInResources).get - }catch{ - case _: Exception => { - logger.error(s"Error. File $pathInResources does not exist.") - "ERROR" - } - } - } + override def getFile(pathInResources: String): Optional[String] = Optional.ofNullable(sourceConnector.get.getFile(pathInResources).orNull) - override def getBinaryFile(pathInResources: String): Array[Byte] = { - try { - sourceConnector.get.getBinaryFile(pathInResources).get - }catch{ - case _: Exception => { - logger.error(s"Error. File $pathInResources does not exist.") - Array[Byte]() - } - } - } + override def getBinaryFile(pathInResources: String): Optional[Array[Byte]] = Optional.ofNullable(sourceConnector.get.getBinaryFile(pathInResources).orNull) - override def getImage(pathInResources: String, format: ImageFormat): BufferedImage = { - val data = sourceConnector.get.getBinaryFile(s"$pathInResources.${format.toString.toLowerCase}").get - val bis = new ByteArrayInputStream(data) - ImageIO.read(bis) + override def getImage(pathInResources: String, format: ImageFormat): Optional[BufferedImage] = { + val data = sourceConnector.get.getBinaryFile(s"$pathInResources.${format.toString.toLowerCase}") + if(!data.isDefined){ + None + } + val bis = new ByteArrayInputStream(data.get) + Optional.of(ImageIO.read(bis)) } override def start(): Boolean = true From 98feebdba3c6ea3f6257bbb8c0ce83b62212ade4 Mon Sep 17 00:00:00 2001 From: derNiklaas Date: Fri, 31 May 2019 16:10:50 +0200 Subject: [PATCH 5/6] Added createDirectory and changed Image methods --- .../requirement/service/file/FileConnector.scala | 2 +- .../requirement/service/file/impl/FileInputImpl.scala | 7 +++---- .../service/file/impl/FileOutputImpl.scala | 11 +++++++---- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/main/scala/org/codeoverflow/chatoverflow/requirement/service/file/FileConnector.scala b/src/main/scala/org/codeoverflow/chatoverflow/requirement/service/file/FileConnector.scala index c1e5106f..1ccb6db7 100644 --- a/src/main/scala/org/codeoverflow/chatoverflow/requirement/service/file/FileConnector.scala +++ b/src/main/scala/org/codeoverflow/chatoverflow/requirement/service/file/FileConnector.scala @@ -3,7 +3,7 @@ package org.codeoverflow.chatoverflow.requirement.service.file import org.codeoverflow.chatoverflow.WithLogger import org.codeoverflow.chatoverflow.connector.Connector import org.codeoverflow.chatoverflow.connector.actor.FileSystemActor -import org.codeoverflow.chatoverflow.connector.actor.FileSystemActor.{CreateDirectory, LoadBinaryFile, LoadFile, SaveBinaryFile, SaveFile} +import org.codeoverflow.chatoverflow.connector.actor.FileSystemActor._ class FileConnector(override val sourceIdentifier: String) extends Connector(sourceIdentifier) with WithLogger { override protected var requiredCredentialKeys: List[String] = List() diff --git a/src/main/scala/org/codeoverflow/chatoverflow/requirement/service/file/impl/FileInputImpl.scala b/src/main/scala/org/codeoverflow/chatoverflow/requirement/service/file/impl/FileInputImpl.scala index e8621927..d8c74f3d 100644 --- a/src/main/scala/org/codeoverflow/chatoverflow/requirement/service/file/impl/FileInputImpl.scala +++ b/src/main/scala/org/codeoverflow/chatoverflow/requirement/service/file/impl/FileInputImpl.scala @@ -6,7 +6,6 @@ import java.util.Optional import javax.imageio.ImageIO import org.codeoverflow.chatoverflow.WithLogger -import org.codeoverflow.chatoverflow.api.io.dto.ImageFormat import org.codeoverflow.chatoverflow.api.io.input.FileInput import org.codeoverflow.chatoverflow.registry.Impl import org.codeoverflow.chatoverflow.requirement.InputImpl @@ -23,9 +22,9 @@ class FileInputImpl extends InputImpl[FileConnector] with FileInput with WithLog override def getBinaryFile(pathInResources: String): Optional[Array[Byte]] = Optional.ofNullable(sourceConnector.get.getBinaryFile(pathInResources).orNull) - override def getImage(pathInResources: String, format: ImageFormat): Optional[BufferedImage] = { - val data = sourceConnector.get.getBinaryFile(s"$pathInResources.${format.toString.toLowerCase}") - if(!data.isDefined){ + override def getImage(pathInResources: String): Optional[BufferedImage] = { + val data = sourceConnector.get.getBinaryFile(pathInResources) + if (!data.isDefined) { None } val bis = new ByteArrayInputStream(data.get) diff --git a/src/main/scala/org/codeoverflow/chatoverflow/requirement/service/file/impl/FileOutputImpl.scala b/src/main/scala/org/codeoverflow/chatoverflow/requirement/service/file/impl/FileOutputImpl.scala index f73a8d84..7ff78099 100644 --- a/src/main/scala/org/codeoverflow/chatoverflow/requirement/service/file/impl/FileOutputImpl.scala +++ b/src/main/scala/org/codeoverflow/chatoverflow/requirement/service/file/impl/FileOutputImpl.scala @@ -5,7 +5,6 @@ import java.io.ByteArrayOutputStream import javax.imageio.ImageIO import org.codeoverflow.chatoverflow.WithLogger -import org.codeoverflow.chatoverflow.api.io.dto.ImageFormat import org.codeoverflow.chatoverflow.api.io.output.FileOutput import org.codeoverflow.chatoverflow.registry.Impl import org.codeoverflow.chatoverflow.requirement.OutputImpl @@ -26,10 +25,14 @@ class FileOutputImpl extends OutputImpl[FileConnector] with FileOutput with With sourceConnector.get.saveBinaryFile(pathInResources, bytes) } - override def saveImage(image: BufferedImage, format: ImageFormat, pathInResources: String): Boolean = { + override def saveImage(image: BufferedImage, format: String, pathInResources: String): Boolean = { val bao = new ByteArrayOutputStream() - ImageIO.write(image, format.toString.toLowerCase, bao) - sourceConnector.get.saveBinaryFile(s"$pathInResources.${format.toString.toLowerCase}", bao.toByteArray) + ImageIO.write(image, format.toLowerCase, bao) + sourceConnector.get.saveBinaryFile(s"$pathInResources.${format.toLowerCase}", bao.toByteArray) + } + + override def createDirectory(folderName: String): Boolean = { + sourceConnector.get.createDirectory(folderName) } override def start() = true From ca02c89520b46d161c0c3c5e0975cf5bc2a47b4c Mon Sep 17 00:00:00 2001 From: derNiklaas Date: Tue, 11 Jun 2019 15:03:23 +0200 Subject: [PATCH 6/6] Improved performance when loading files --- .../requirement/service/file/FileConnector.scala | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/scala/org/codeoverflow/chatoverflow/requirement/service/file/FileConnector.scala b/src/main/scala/org/codeoverflow/chatoverflow/requirement/service/file/FileConnector.scala index 1ccb6db7..0158ecdb 100644 --- a/src/main/scala/org/codeoverflow/chatoverflow/requirement/service/file/FileConnector.scala +++ b/src/main/scala/org/codeoverflow/chatoverflow/requirement/service/file/FileConnector.scala @@ -11,16 +11,18 @@ class FileConnector(override val sourceIdentifier: String) extends Connector(sou private val fileActor = createActor[FileSystemActor]() def getFile(pathInResources: String): Option[String] = { - if (fileActor.??[Some[String]](5) {LoadFile(pathInResources)}.isDefined) { - fileActor.??[Some[String]](5) {LoadFile(pathInResources)}.get + val file: Option[Option[String]] = fileActor.??[Some[String]](5) {LoadFile(pathInResources)} + if (file.isDefined) { + file.get }else{ None } } def getBinaryFile(pathInResources: String): Option[Array[Byte]] = { - if(fileActor.??[Some[Array[Byte]]](5){LoadBinaryFile(pathInResources)}.isDefined){ - fileActor.??[Some[Array[Byte]]](5){LoadBinaryFile(pathInResources)}.get + val binaryFile: Option[Option[Array[Byte]]] = fileActor.??[Some[Array[Byte]]](5){LoadBinaryFile(pathInResources)} + if(binaryFile.isDefined){ + binaryFile.get }else{ None }