/// <summary>
 /// Build command in xml presentation.
 /// </summary>
 /// <param name="command">Command.</param>
 /// <param name="guid">Guid.</param>
 /// <param name="result">Result.</param>
 /// <returns>XML message.</returns>
 protected string BuildXmlCommand(string command, string guid, string result)
 {
     ControlMessage cm = new ControlMessage(command, guid, result);
     return cm.ToXml(SelfInfo);
 }
        /// <summary>
        /// Unblock node.
        /// </summary>
        /// <param name="id">Node id.</param>
        public void UnblockNode(string id)
        {
            lock (_blockNodes)
            {
                if (!_blockNodes.ContainsKey(id))
                {
                    return;
                }

                ControlMessage cm = new ControlMessage(CommandType.Unblock.ToString(), "null", string.Empty);
                string message = cm.ToXml(_blockNodes[id]);
                SendToAll(message);
            }
        }
        /// <summary>
        /// Set working status.
        /// </summary>
        /// <param name="id">Node id.</param>
        /// <param name="status">Busy status.</param>
        public void SetWorkingStatus(string id, bool status)
        {
            lock (_correspondingNodes)
            {
                CommandType command = status ? CommandType.StartWork : CommandType.StopWork;
                if (_correspondingNodes.ContainsKey(id))
                {
                    NodeInfo ni = _correspondingNodes[id];

                    ControlMessage cm = new ControlMessage(command.ToString(), "null", string.Empty);
                    string message = cm.ToXml(ni);
                    SendUdpMessage(message, ni.IP, ni.Port);
                }
            }
        }
        /// <summary>
        /// Block node.
        /// </summary>
        /// <param name="id">Node id.</param>
        public void BlockNode(string id)
        {
            lock (_correspondingNodes)
            {
                if (!_correspondingNodes.ContainsKey(id))
                {
                    return;
                }

                ControlMessage cm = new ControlMessage(CommandType.Block.ToString(), "null", string.Empty);
                string message = cm.ToXml(_correspondingNodes[id]);
                SendToAll(message);
            }

            lock (_schedulingJobs)
            {
                foreach (Job job in _schedulingJobs.Values)
                {
                    if (job.RunningNode != null && job.RunningNode.Id == id)
                    {
                        // reschedule this job
                        job.Status = JobStatus.Nonscheduled;
                        Console.WriteLine("{0} Job {1}, which runs on removed node {2}, is recheduled.",
                            DateTime.Now.ToShortTimeString(), job.Name, id);
                    }
                }
            }
        }