All Downloads are FREE. Search and download functionalities are using the official Maven repository.

models.daos.PCMContainerDAOImpl.scala Maven / Gradle / Ivy

package models.daos

import java.util.Base64

import com.mongodb.casbah.Imports._
import com.mongodb.util.JSON
import models.{Database, DatabasePCM}
import org.bson.types.ObjectId
import org.opencompare.api.java.PCMContainer
import org.opencompare.api.java.impl.io.{KMFJSONExporter, KMFJSONLoader}
import models.daos.PCMContainerDAOImpl._
import scala.concurrent.Future
import scala.collection.JavaConversions._
import play.api.libs.concurrent.Execution.Implicits.defaultContext

/**
 * Created by gbecan on 10/12/15.
 */
class PCMContainerDAOImpl extends PCMContainerDAO {


  override def get(id: String): Future[Option[DatabasePCM]] = {
    if (ObjectId.isValid(id)) {
      Future {
        val searchById = MongoDBObject("_id" -> new ObjectId(id))
        val result = pcms.findOne(searchById)

        if (result.isDefined) {
          val databasePCM = convertToPCMContainers(result.get)
          Some(databasePCM)
        } else {
          None
        }
      }
    } else {
      Future.successful(None)
    }
  }



  private def convertToPCMContainers(dbObject : DBObject) : DatabasePCM = {
    val id = dbObject("_id").toString
    val json = JSON.serialize(dbObject("pcm"))

    val pcmContainers = kmfLoader.load(json)

    if (pcmContainers.size == 1) {
      val pcmContainer = pcmContainers.head
      val metadata = pcmContainer.getMetadata

      // Load metadata
      val dbMetadata = dbObject("metadata").asInstanceOf[DBObject]
      metadata.setSource(dbMetadata.getOrElse("source", "").toString)
      metadata.setLicense(dbMetadata.getOrElse("license", "").toString)
      metadata.setCreator(dbMetadata.getOrElse("creator", "").toString)

      // Load product positions
      val dbProductPositions = dbMetadata("productPositions").asInstanceOf[BasicDBList]
      for (dbProductPosition <- dbProductPositions) {
        val dbProductPositionCast = dbProductPosition.asInstanceOf[DBObject]
        val productName = dbProductPositionCast("product").toString
        val product = pcmContainer.getPcm.getProducts.find(_.getName == productName).get
        val position = dbProductPositionCast("position").toString.toInt
        metadata.setProductPosition(product, position)
      }

      // Load feature positions
      val dbFeaturePositions = dbMetadata("featurePositions").asInstanceOf[BasicDBList]
      for (dbFeaturePosition <- dbFeaturePositions) {
        val dbFeaturePositionCast = dbFeaturePosition.asInstanceOf[DBObject]
        val featureName = dbFeaturePositionCast("feature").toString
        val feature = pcmContainer.getPcm.getConcreteFeatures.find(_.getName == featureName).get
        val position = dbFeaturePositionCast("position").toString.toInt
        metadata.setFeaturePosition(feature, position)
      }

      new DatabasePCM(Some(id), Some(pcmContainer))

    } else {
      new DatabasePCM(None, None)
    }
  }

}

object PCMContainerDAOImpl {
  val kmfLoader: KMFJSONLoader = new KMFJSONLoader
  val kmfSerializer: KMFJSONExporter = new KMFJSONExporter

  val base64Decoder = Base64.getDecoder

  val pcms = Database.db("pcms")

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy