-
Notifications
You must be signed in to change notification settings - Fork 275
/
BsonRecordField.scala
104 lines (88 loc) · 3.4 KB
/
BsonRecordField.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/*
* Copyright 2011 WorldWide Conferencing, LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.liftweb
package mongodb
package record
package field
import common._
import http.js.JsExp
import http.js.JE.JsNull
import json.JsonAST._
import json.Printer
import net.liftweb.record._
import com.mongodb._
import scala.xml._
/** Field that contains an entire record represented as an inline object value. Inspired by JSONSubRecordField */
class BsonRecordField[OwnerType <: BsonRecord[OwnerType], SubRecordType <: BsonRecord[SubRecordType]]
(rec: OwnerType, valueMeta: BsonMetaRecord[SubRecordType])(implicit subRecordType: Manifest[SubRecordType])
extends Field[SubRecordType, OwnerType]
with MandatoryTypedField[SubRecordType]
{
def this(rec: OwnerType, valueMeta: BsonMetaRecord[SubRecordType], value: SubRecordType)
(implicit subRecordType: Manifest[SubRecordType]) = {
this(rec, value.meta)
set(value)
}
def this(rec: OwnerType, valueMeta: BsonMetaRecord[SubRecordType], value: Box[SubRecordType])
(implicit subRecordType: Manifest[SubRecordType]) = {
this(rec, valueMeta)
setBox(value)
}
def owner = rec
def asJs = asJValue match {
case JNothing => JsNull
case jv => new JsExp {
lazy val toJsCmd = Printer.compact(render(jv))
}
}
def toForm: Box[NodeSeq] = Empty
def defaultValue = valueMeta.createRecord
def setFromString(s: String): Box[SubRecordType] = valueMeta.fromJsonString(s)
def setFromAny(in: Any): Box[SubRecordType] = in match {
case dbo: DBObject => setBox(Full(valueMeta.fromDBObject(dbo)))
case _ => genericSetFromAny(in)
}
def asJValue: JValue = valueBox.map(_.asJValue) openOr (JNothing: JValue)
def setFromJValue(jvalue: JValue): Box[SubRecordType] = jvalue match {
case JNothing|JNull if optional_? => setBox(Empty)
case _ => setBox(valueMeta.fromJValue(jvalue))
}
}
/*
* List of BsonRecords
*/
class BsonRecordListField[OwnerType <: BsonRecord[OwnerType], SubRecordType <: BsonRecord[SubRecordType]]
(rec: OwnerType, valueMeta: BsonMetaRecord[SubRecordType])
extends MongoListField[OwnerType, SubRecordType](rec: OwnerType) {
import scala.collection.JavaConversions._
override def asDBObject: DBObject = {
val dbl = new BasicDBList
value.foreach { v => dbl.add(v.asDBObject) }
dbl
}
override def setFromDBObject(dbo: DBObject): Box[List[SubRecordType]] =
setBox(Full(dbo.keySet.toList.map(k => {
valueMeta.fromDBObject(dbo.get(k.toString).asInstanceOf[DBObject])
})))
override def asJValue = JArray(value.map(_.asJValue))
override def setFromJValue(jvalue: JValue) = jvalue match {
case JNothing|JNull if optional_? => setBox(Empty)
case JArray(arr) => setBox(Full(arr.map( jv => {
valueMeta.fromJValue(jv) openOr valueMeta.createRecord
})))
case other => setBox(FieldHelpers.expectedA("JArray", other))
}
}