VOL-1175: Added proxy CRUD for new data model
Change-Id: Ie218a2567746d87a951f23aa6b774b2f01541cf9
diff --git a/db/model/revision.go b/db/model/revision.go
index 07c3388..44f97b2 100644
--- a/db/model/revision.go
+++ b/db/model/revision.go
@@ -15,144 +15,21 @@
*/
package model
-import (
- "bytes"
- "crypto/md5"
- "fmt"
- "reflect"
- "sort"
-)
-
-var (
- RevisionCache = make(map[string]interface{})
-)
-
-type Revision struct {
- Config *DataRevision
- Children map[string][]*Revision
- Hash string
- branch *Branch
- WeakRef string
-}
-
-func NewRevision(branch *Branch, data interface{}, children map[string][]*Revision) *Revision {
- cr := &Revision{}
- cr.branch = branch
- cr.Config = NewDataRevision(data)
- cr.Children = children
- cr.finalize()
-
- return cr
-}
-
-func (cr *Revision) finalize() {
- cr.Hash = cr.hashContent()
-
- if _, exists := RevisionCache[cr.Hash]; !exists {
- RevisionCache[cr.Hash] = cr
- }
- if _, exists := RevisionCache[cr.Config.Hash]; !exists {
- RevisionCache[cr.Config.Hash] = cr.Config
- } else {
- cr.Config = RevisionCache[cr.Config.Hash].(*DataRevision)
- }
-}
-
-func (cr *Revision) hashContent() string {
- var buffer bytes.Buffer
- var childrenKeys []string
-
- if cr.Config != nil {
- buffer.WriteString(cr.Config.Hash)
- }
-
- for key, _ := range cr.Children {
- childrenKeys = append(childrenKeys, key)
- }
- sort.Strings(childrenKeys)
-
- if cr.Children != nil && len(cr.Children) > 0 {
- // Loop through sorted Children keys
- for _, key := range childrenKeys {
- for _, child := range cr.Children[key] {
- buffer.WriteString(child.Hash)
- }
- }
- }
-
- return fmt.Sprintf("%x", md5.Sum(buffer.Bytes()))[:12]
-}
-
-func (cr *Revision) getData() interface{} {
- if cr.Config == nil {
- return nil
- }
- return cr.Config.Data
-}
-
-func (cr *Revision) getNode() *Node {
- return cr.branch.node
-}
-
-func (cr *Revision) getType() reflect.Type {
- // TODO: what is this returning really?
- return reflect.TypeOf(cr.getData())
-}
-
-func (cr *Revision) clearHash() {
- cr.Hash = ""
-}
-
-func (cr *Revision) Get(depth int) interface{} {
- originalData := cr.getData()
- data := Clone(originalData)
-
- if depth > 0 {
- for fieldName, field := range ChildrenFields(cr.getType()) {
- if field.IsContainer {
- for _, rev := range cr.Children[fieldName] {
- childData := rev.Get(depth - 1)
- childDataHolder := GetAttributeValue(data, fieldName, 0)
- // TODO: merge with childData
- fmt.Printf("data:%+v, dataHolder:%+v", childData, childDataHolder)
- }
- } else {
- rev := cr.Children[fieldName][0]
- childData := rev.Get(depth - 1)
- childDataHolder := GetAttributeValue(data, fieldName, 0)
- // TODO: merge with childData
- fmt.Printf("data:%+v, dataHolder:%+v", childData, childDataHolder)
- }
- }
- }
- return data
-}
-
-func (cr *Revision) UpdateData(data interface{}, branch *Branch) *Revision {
- newRev := Clone(cr).(*Revision)
- newRev.branch = branch
- newRev.Config = data.(*DataRevision)
- newRev.finalize()
-
- return newRev
-}
-
-func (cr *Revision) UpdateChildren(name string, children []*Revision, branch *Branch) *Revision {
- newChildren := Clone(cr.Children).(map[string][]*Revision)
- newChildren[name] = children
- newRev := Clone(cr).(*Revision)
- newRev.branch = branch
- newRev.Children = newChildren
- newRev.finalize()
-
- return newRev
-}
-
-func (cr *Revision) UpdateAllChildren(children map[string][]*Revision, branch *Branch) *Revision {
- newRev := Clone(cr).(*Revision)
- newRev.branch = branch
- newRev.Children = children
- newRev.finalize()
-
- return newRev
+type Revision interface {
+ Finalize()
+ SetConfig(revision *DataRevision)
+ GetConfig() *DataRevision
+ SetChildren(children map[string][]Revision)
+ GetChildren() map[string][]Revision
+ SetHash(hash string)
+ GetHash() string
+ ClearHash()
+ SetBranch(branch *Branch)
+ GetBranch() *Branch
+ Get(int) interface{}
+ GetData() interface{}
+ GetNode() *Node
+ UpdateData(data interface{}, branch *Branch) Revision
+ UpdateChildren(name string, children []Revision, branch *Branch) Revision
+ UpdateAllChildren(children map[string][]Revision, branch *Branch) Revision
}