diff --git a/ContentServer b/ContentServer index 1da1cb9..70eb9ca 100755 Binary files a/ContentServer and b/ContentServer differ diff --git a/server/repo/repo.go b/server/repo/repo.go index 5f83010..a2bc7a0 100644 --- a/server/repo/repo.go +++ b/server/repo/repo.go @@ -5,8 +5,10 @@ import ( "github.com/foomo/ContentServer/server/log" "github.com/foomo/ContentServer/server/repo/content" "github.com/foomo/ContentServer/server/requests" + "github.com/foomo/ContentServer/server/responses" "github.com/foomo/ContentServer/server/utils" "strings" + "time" ) type Repo struct { @@ -103,7 +105,6 @@ func (repo *Repo) GetNode(repoNode *content.RepoNode, expanded bool, mimeTypes [ } else { fmt.Println("no see for", childNode.GetName(language), childNode.Hidden) } - } return node } @@ -154,26 +155,46 @@ func (repo *Repo) GetContent(r *requests.Content) *content.SiteContent { return c } -func (repo *Repo) builDirectory(dirNode *content.RepoNode) { +func builDirectory(dirNode *content.RepoNode, directory map[string]*content.RepoNode, uRIDirectory map[string]*content.RepoNode) { log.Debug("repo.buildDirectory: " + dirNode.Id) - repo.Directory[dirNode.Id] = dirNode + directory[dirNode.Id] = dirNode //todo handle duplicate uris for _, languageURIs := range dirNode.URIs { for _, URI := range languageURIs { log.Debug(" URI: " + URI + " => Id: " + dirNode.Id) - repo.URIDirectory[URI] = dirNode + uRIDirectory[URI] = dirNode } } for _, childNode := range dirNode.Nodes { - repo.builDirectory(childNode) + builDirectory(childNode, directory, uRIDirectory) } } -func (repo *Repo) Update() { - repo.Node = content.NewRepoNode() - utils.Get(repo.server, repo.Node) - repo.Node.WireParents() - repo.Directory = make(map[string]*content.RepoNode) - repo.URIDirectory = make(map[string]*content.RepoNode) - repo.builDirectory(repo.Node) +func (repo *Repo) Update() *responses.Update { + updateResponse := responses.NewUpdate() + + newNode := content.NewRepoNode() + + startTimeRepo := time.Now() + utils.Get(repo.server, newNode) + updateResponse.Stats.RepoRuntime = time.Now().Sub(startTimeRepo).Seconds() + + startTimeOwn := time.Now() + newNode.WireParents() + + newDirectory := make(map[string]*content.RepoNode) + newURIDirectory := make(map[string]*content.RepoNode) + + builDirectory(newNode, newDirectory, newURIDirectory) + + repo.Node = newNode + repo.Directory = newDirectory + repo.URIDirectory = newURIDirectory + + updateResponse.Stats.OwnRuntime = time.Now().Sub(startTimeOwn).Seconds() + + updateResponse.Stats.NumberOfNodes = len(repo.Directory) + updateResponse.Stats.NumberOfURIs = len(repo.URIDirectory) + + return updateResponse } diff --git a/server/requests/update.go b/server/requests/update.go new file mode 100644 index 0000000..8b0be03 --- /dev/null +++ b/server/requests/update.go @@ -0,0 +1,8 @@ +package requests + +type Update struct { +} + +func NewUpdate() *Update { + return new(Update) +} diff --git a/server/responses/error.go b/server/responses/error.go new file mode 100644 index 0000000..0437a79 --- /dev/null +++ b/server/responses/error.go @@ -0,0 +1,13 @@ +package responses + +type Error struct { + Code int `json:"code"` + Message string `json:"message"` +} + +func NewError(code int, message string) *Error { + error := new(Error) + error.Code = code + error.Message = message + return error +} diff --git a/server/responses/responses.go b/server/responses/responses.go new file mode 100644 index 0000000..6652278 --- /dev/null +++ b/server/responses/responses.go @@ -0,0 +1 @@ +package responses diff --git a/server/responses/update.go b/server/responses/update.go new file mode 100644 index 0000000..17e4be1 --- /dev/null +++ b/server/responses/update.go @@ -0,0 +1,14 @@ +package responses + +type Update struct { + Stats struct { + NumberOfNodes int `json:"numberOfNodes"` + NumberOfURIs int `json:"numberOfURIs"` + RepoRuntime float64 `json:"repoRuntime"` + OwnRuntime float64 `json:"ownRuntime"` + } `json:"stats"` +} + +func NewUpdate() *Update { + return new(Update) +} diff --git a/server/socket.go b/server/socket.go index 8cdb530..8adba12 100644 --- a/server/socket.go +++ b/server/socket.go @@ -7,6 +7,7 @@ import ( "github.com/foomo/ContentServer/server/log" "github.com/foomo/ContentServer/server/repo" "github.com/foomo/ContentServer/server/requests" + "github.com/foomo/ContentServer/server/responses" "net" "strconv" "strings" @@ -56,22 +57,28 @@ func handleSocketRequest(handler string, jsonBuffer []byte) (replyBytes []byte, nodesMap := contentRepo.GetNodes(nodesRequest) reply = nodesMap break - + case "update": + updateRequest := requests.NewUpdate() + jsonErr = json.Unmarshal(jsonBuffer, &updateRequest) + log.Debug(" updateRequest: " + fmt.Sprint(updateRequest)) + updateResponse := contentRepo.Update() + reply = updateResponse + break default: err = errors.New(log.Error(" can not handle this one " + handler)) + errorResponse := responses.NewError(1, "unkown handler") + reply = errorResponse } - if err == nil { + if jsonErr != nil { + log.Error(" could not read incoming json: " + fmt.Sprint(jsonErr)) + err = jsonErr + } else { + encodedBytes, jsonErr := json.MarshalIndent(map[string]interface{}{"reply": reply}, "", " ") if jsonErr != nil { - log.Error(" could not read incoming json: " + fmt.Sprint(jsonErr)) err = jsonErr + log.Error(" could not encode reply " + fmt.Sprint(jsonErr)) } else { - encodedBytes, jsonErr := json.MarshalIndent(map[string]interface{}{"reply": reply}, "", " ") - if jsonErr != nil { - err = jsonErr - log.Error(" could not encode reply " + fmt.Sprint(jsonErr)) - } else { - replyBytes = encodedBytes - } + replyBytes = encodedBytes } } return replyBytes, err @@ -109,22 +116,26 @@ func handleConnection(conn net.Conn) { reply, handlingError := handleSocketRequest(requestHandler, jsonBuffer) if handlingError != nil { log.Error("socket.handleConnection: handlingError " + fmt.Sprint(handlingError)) + if reply == nil { + log.Error("giving up with nil reply") + conn.Close() + return + } + } + headerBytes := []byte(strconv.Itoa(len(reply))) + reply = concat(headerBytes, reply) + log.Debug(" replying: " + string(reply)) + _, writeError := conn.Write(reply) + if writeError != nil { + log.Error("socket.handleConnection: could not write my reply: " + fmt.Sprint(writeError)) return } else { - headerBytes := []byte(strconv.Itoa(len(reply))) - reply = concat(headerBytes, reply) - log.Debug(" replying: " + string(reply)) - _, writeError := conn.Write(reply) - if writeError != nil { - log.Error("socket.handleConnection: could not write my reply: " + fmt.Sprint(writeError)) - return - } else { - log.Debug(" replied. waiting for next request on open connection") - //return - } + log.Debug(" replied. waiting for next request on open connection") + //return } } else { log.Error("can not read empty json") + conn.Close() return } } else {