
controllers.io.CSVCtrl.scala Maven / Gradle / Ivy
The newest version!
package controllers.io
import java.io.IOException
import javax.inject.Inject
import com.mohiva.play.silhouette.api.Environment
import com.mohiva.play.silhouette.impl.authenticators.CookieAuthenticator
import controllers.{ResultFormat, ViewContext}
import models.{PCMAPIUtils, User}
import org.opencompare.api.java.PCMFactory
import org.opencompare.api.java.extractor.CellContentInterpreter
import org.opencompare.api.java.impl.PCMFactoryImpl
import org.opencompare.api.java.io.{PCMDirection, CSVExporter, CSVLoader}
import play.api.data.Forms._
import play.api.data._
import play.api.i18n.MessagesApi
import play.api.libs.json.Json
import play.api.mvc._
import scala.collection.JavaConversions._
import scala.io.Source
/**
* Created by gbecan on 8/18/15.
*/
class CSVCtrl @Inject() (
val messagesApi: MessagesApi,
val env: Environment[User, CookieAuthenticator],
val pcmAPIUtils : PCMAPIUtils) extends IOCtrl("csv") {
private val pcmFactory : PCMFactory = new PCMFactoryImpl()
private val csvExporter : CSVExporter= new CSVExporter()
val inputParametersForm = Form(
mapping(
"productAsLines" -> boolean,
"title" -> nonEmptyText,
"separator" -> nonEmptyText(1, 1),
"quote" -> nonEmptyText(1, 1)
)(CSVImportParameters.apply)(CSVImportParameters.unapply)
)
val outputParametersForm = Form(
mapping(
"productAsLines" -> boolean,
"file" -> text,
"separator" -> nonEmptyText(1, 1),
"quote" -> nonEmptyText(1, 1)
)(CSVExportParameters.apply)(CSVExportParameters.unapply)
)
override def importPCMs(format : ResultFormat)(implicit request: Request[AnyContent], viewContext: ViewContext) : Result = {
// Parse parametersOC
val parameters = inputParametersForm.bindFromRequest.get
val separator = parameters.separator.head
val quote = parameters.quote.head
// Read input file
val file = request.body.asMultipartFormData.get.file("file").get.ref.file
try {
val pcmDirection = if (parameters.productAsLines) {
PCMDirection.PRODUCTS_AS_LINES
} else {
PCMDirection.PRODUCTS_AS_COLUMNS
}
val loader: CSVLoader = new CSVLoader(pcmFactory, new CellContentInterpreter(pcmFactory), separator, quote, pcmDirection)
val pcmContainers = loader.load(file).toList
val pcmContainer = pcmContainers.head
pcmContainer.getPcm.setName(parameters.title)
// Serialize result
val jsonResult = postprocessContainers(pcmContainers)
Ok(jsonResult)
} catch {
case e : Exception => BadRequest("This file is invalid")
}
}
override def exportPCM(implicit request : Request[AnyContent]) : Result = {
val parameters = outputParametersForm.bindFromRequest().get
val separator = parameters.separator.head
val quote = parameters.quote.head
val jsonPCM = Json.parse(parameters.pcm)
val container = pcmAPIUtils.parsePCMContainers(jsonPCM).head
container.getMetadata.setProductAsLines(parameters.productAsLines)
val csvCode = csvExporter.export(container, separator, quote)
Ok(csvCode)
}
}
case class CSVImportParameters(
productAsLines : Boolean,
title : String,
separator : String,
quote : String
)
case class CSVExportParameters(
productAsLines : Boolean,
pcm : String,
separator : String,
quote : String
)
© 2015 - 2025 Weber Informatics LLC | Privacy Policy