Advertisement
Guest User

Untitled

a guest
Jul 4th, 2015
198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.85 KB | None | 0 0
  1. package com.example.core.application
  2.  
  3. import com.mongodb.casbah.Imports._
  4. import java.util.UUID
  5. import com.example.domain.{User, Address, Customer}
  6.  
  7. /**
  8. * Contains type classes that deserialize records from Casbah into "our" types.
  9. */
  10. trait CasbahDeserializers {
  11. type CasbahDeserializer[A] = DBObject => A
  12.  
  13. /**
  14. * Convenience method that picks the ``CasbahDeserializer`` for the type ``A``
  15. * @param deserializer implicitly given deserializer
  16. * @tparam A the type A
  17. * @return the deserializer for ``A``
  18. */
  19. def casbahDeserializer[A](implicit deserializer: CasbahDeserializer[A]) = deserializer
  20.  
  21. private def inner[A: CasbahDeserializer](o: DBObject, field: String): A = casbahDeserializer[A].apply(o.as[DBObject](field))
  22.  
  23. private def innerList[A: CasbahDeserializer](o: DBObject, field: String): Seq[A] = {
  24. val deserializer = casbahDeserializer[A]
  25. o.as[MongoDBList](field).map {
  26. inner => deserializer(inner.asInstanceOf[DBObject])
  27. }
  28. }
  29.  
  30. implicit object AddressDeserializer extends CasbahDeserializer[Address] {
  31. def apply(o: DBObject) =
  32. Address(o.as[String]("line1"), o.as[String]("line2"), o.as[String]("line3"))
  33. }
  34.  
  35. implicit object CustomerDeserializer extends CasbahDeserializer[Customer] {
  36. def apply(o: DBObject) =
  37. Customer(o.as[String]("firstName"), o.as[String]("lastName"), o.as[String]("email"),
  38. innerList[Address](o, "addresses"), o.as[UUID]("id"))
  39. }
  40.  
  41. implicit object UserDeserializer extends CasbahDeserializer[User] {
  42. def apply(o: DBObject) = User(o.as[UUID]("id"), o.as[String]("username"), o.as[String]("password"))
  43. }
  44.  
  45. }
  46.  
  47. /**
  48. * Contains type classes that serialize "our" types into Casbah records.
  49. */
  50. trait CasbahSerializers {
  51. type CasbahSerializer[A] = A => DBObject
  52.  
  53. /**
  54. * Convenience method that picks the ``CasbahSerializer`` for the type ``A``
  55. * @param serializer implicitly given serializer
  56. * @tparam A the type A
  57. * @return the serializer for ``A``
  58. */
  59. def casbahSerializer[A](implicit serializer: CasbahSerializer[A]) = serializer
  60.  
  61. implicit object AddressSerializer extends CasbahSerializer[Address] {
  62. def apply(address: Address) = {
  63. val builder = MongoDBObject.newBuilder
  64. System.out.println("AddressSerializer:::" + address)
  65.  
  66. builder += "line1" -> address.line1
  67. builder += "line2" -> address.line2
  68. builder += "line3" -> address.line3
  69.  
  70. builder.result()
  71. }
  72. }
  73.  
  74. implicit object UserSerializer extends CasbahSerializer[User] {
  75. def apply(user: User) = {
  76. val builder = MongoDBObject.newBuilder
  77.  
  78. builder += "username" -> user.username
  79. builder += "password" -> user.password
  80. builder += "id" -> user.id
  81.  
  82. builder.result()
  83. }
  84. }
  85.  
  86. implicit object CustomerSerializer extends CasbahSerializer[Customer] {
  87. def apply(customer: Customer) = {
  88. val builder = MongoDBObject.newBuilder
  89. System.out.println("CustomerSerializer:::" + customer)
  90.  
  91. builder += "firstName" -> customer.firstName
  92. builder += "lastName" -> customer.lastName
  93. builder += "email" -> customer.email
  94. builder += "addresses" -> customer.addresses.map(AddressSerializer(_))
  95. builder += "id" -> customer.id
  96.  
  97. builder.result()
  98. }
  99. }
  100.  
  101. }
  102.  
  103. /**
  104. * Contains convenience functions that can be used to find "entities-by-id"
  105. */
  106. trait SearchExpressions {
  107.  
  108. def entityId(id: UUID) = MongoDBObject("id" -> id)
  109.  
  110. // def entityId(id: UUID) = MongoDBObject("id" -> id, "active" -> true)
  111.  
  112. }
  113.  
  114. /**
  115. * Mix this trait into your classes to gain the functionality of the serializers, deserializers and mappers.
  116. */
  117. trait TypedCasbah extends CasbahDeserializers with CasbahSerializers {
  118.  
  119. final def serialize[A: CasbahSerializer](a: A) = casbahSerializer[A].apply(a)
  120.  
  121. final def deserialize[A: CasbahDeserializer](o: DBObject) = casbahDeserializer[A].apply(o)
  122.  
  123. final def mapper[A: CasbahDeserializer] = {
  124. (o: DBObject) => deserialize[A](o)
  125. }
  126.  
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement