protected abstract string ReceivedStatus(Status status);
 public void SerializeStatus()
 {
     Status d = new Status();
     string xml = d.SerializeToXML();
     Assert.IsNotNull(xml);
 }
 public void DeserializeStatus()
 {
     Status d = new Status();
     string xml = d.SerializeToXML();
     d = (Status)xml.DeserializeXML();
     Assert.IsNotNull(d);
 }
 protected override Status CurrentStatus()
 {
     Status status = new Status();
     status.Id = this.ID;
     return status;
 }
 protected override string ReceivedStatus(Status status)
 {
     Debug.Assert(false, "Should not be here");
     return null;
 }
        protected override string ReceivedStatus(Status status)
        {
            Debug.Assert(this.serverQueues != null, "null server queue");
            Node node = this.RegisteredComponents.NodeWithID(status.Id);

            NoOperation noOperationResponse = this.GenerateNoOperation();
            if (!this.ensureNode(node)) {
                return noOperationResponse.SerializeToXML();
            }

            switch (node.NodeType) {
                case NodeType.TaskManager:
                    if (this.serverQueues.SolveRequests.Count > 0) {
                        SolveRequest solveRequest = this.serverQueues.SolveRequests.Dequeue();
                        DivideProblem divideProblem = new DivideProblem();
                        divideProblem.Data = solveRequest.Data;
                        divideProblem.Id = solveRequest.Id;
                        Console.WriteLine("Sending DivideProblem to TM");
                        return divideProblem.SerializeToXML();
                    }
                    //TM is not going to join the solutions
                    //if (this.serverQueues.Solutions.Count > 0) {
                    //    Solutions solutions = this.serverQueues.Solutions.Dequeue();
                    //    return solutions.SerializeToXML();
                    //}
                    break;
                case NodeType.ComputationalNode: //TODO: check!!
                    bool busy = false;
                    if (status.Threads != null) {
                        Console.WriteLine("Threads field not null");
                        foreach (StatusThreadsThread stt in status.Threads) {
                            if (stt.ProblemInstanceIdSpecified || stt.TaskIdSpecified) {
                                busy = true;
                                Console.WriteLine("Busy = true");
                            }
                        }
                    }
                    if (this.serverQueues.ProblemsToSolve.Count > 0 && !busy) {
                        Console.WriteLine("Busy = true");
                        SolvePartialProblems partialProblems = this.serverQueues.ProblemsToSolve.Dequeue();
                        Console.WriteLine("Sending PartialProblems to CN");
                        return partialProblems.SerializeToXML();
                    }
                    break;
                case NodeType.Server: {
                        foreach (BackupServerQueue bsq in this.backupServerQueues) {
                            if (bsq.backupServerId == status.Id) {
                                Console.WriteLine("Sending queued message to BackupCS");
                                if(bsq.messages.Count > 0)
                                    return bsq.messages.Dequeue();
                            }
                        }
                    }
                    break;
                default:
                    break;
            }

            Debug.Assert(node != null, "Received unregistered node status");
            if (node == null) {
                Console.WriteLine("Received unregistered node status");
                return noOperationResponse.SerializeToXML();
            }

            if (!this.BackupMode)
            Console.WriteLine("Sending NoOp");
            return noOperationResponse.SerializeToXML();
        }