MongoDB.scala 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. package controllers
  2. import org.mongodb.scala.{MongoClient,MongoDatabase};
  3. import org.mongodb.scala.bson.codecs.Macros._
  4. import org.mongodb.scala.bson.codecs.DEFAULT_CODEC_REGISTRY;
  5. import org.bson.codecs.configuration.CodecRegistries.{fromRegistries, fromProviders, fromCodecs}
  6. import org.bson.codecs.{Codec,DecoderContext,EncoderContext}
  7. import org.bson.types.ObjectId
  8. import org.bson.{BsonWriter,BsonReader}
  9. import models._
  10. object MongoDB {
  11. private def encoderCodec[T](cls: Class[T]): Codec[T] = new Codec[T] {
  12. def decode(reader: BsonReader, decoderContext: DecoderContext): T = throw new UnsupportedOperationException()
  13. def encode(writer: BsonWriter, value: T, encoderContext: EncoderContext) = writer.writeString(cls.getSimpleName)
  14. def getEncoderClass(): Class[T] = cls
  15. }
  16. val codecRegistry = fromRegistries(
  17. fromProviders(classOf[Food]),
  18. fromCodecs(encoderCodec[Mass](classOf[Mass]),
  19. encoderCodec[Volume](classOf[Volume]),
  20. encoderCodec[Number](classOf[Number]),
  21. new Codec[Measure] {
  22. def decode(reader: BsonReader, decoderContext: DecoderContext): Measure =
  23. reader.readString() match {
  24. case "Mass" => Mass()
  25. case "Volume" => Volume()
  26. case "Number" => Number()
  27. case other: String => throw new RuntimeException(s"Did not recognize measure string: $other")
  28. }
  29. def encode(writer: BsonWriter, value: Measure, encoderContext: EncoderContext) = throw new UnsupportedOperationException()
  30. def getEncoderClass(): Class[Measure] = classOf[Measure]
  31. }),
  32. DEFAULT_CODEC_REGISTRY
  33. )
  34. val con: MongoDatabase = MongoClient.apply()
  35. .getDatabase("recipes")
  36. .withCodecRegistry(MongoDB.codecRegistry)
  37. }