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
 }