/*
* tasklist-cmd
* 2008-01-29 (mca)
* 2008-02-01 (mca) : cleaned up UI, added arg display
*
* sample command-line app that uses HTTPClient to execute against server
* uses the http://exyus.com/xcs/tasklist endpoint as a target.
* list, add, update, delete tasks via commandline
*
* usage:
* tasklist-cmd cmd [arg1] [arg2]
* -list : returns list of tasks at the public site
* -add "my task" : creates new task in pending state
* -add "my task" 1 : creates new task in completed state
* -toggle x1234abcd : toggles the state of the task (using id)
* -delete x1234abcd : deletes existing task (using id)
* -clear : removes all tasks from the list
*/
using System;
using System.Collections.Generic;
using System.Text;
using Exyus.Web;
using System.Xml;
namespace tasklist_cmd
{
class Program
{
static void Main(string[] args)
{
TaskList tl = new TaskList("http://exyus.com/xcs/tasklist/");
Console.WriteLine("\nTaskList Utility\n2008-02-02 (mca)\n" + tl.Uri + "\n");
if (args.Length == 0)
{
ShowHelp();
return;
}
Console.WriteLine("Request:");
ShowCommand(args);
Console.WriteLine("Response:");
try
{
switch (args[0].ToLower())
{
case "-list":
break;
case "-add":
if (args.Length > 2)
tl.AddItem(args[1], args[2]);
else
tl.AddItem(args[1]);
break;
case "-toggle":
tl.ToggleItem(args[1]);
break;
case "-delete":
tl.DeleteItem(args[1]);
break;
case "-clear":
tl.DeleteAll();
break;
default:
throw new IndexOutOfRangeException("Unknown command [" + args[0] + "]");
}
// show current list
Console.WriteLine(tl.ShowList());
}
catch (Exception ex)
{
Console.WriteLine("ERROR: "+ex.Message);
ShowHelp();
}
return;
}
static void ShowCommand(string[] args)
{
for (int i = 0; i < args.Length; i++)
{
Console.Write(args[i] + " ");
}
Console.WriteLine("\n");
}
static void ShowHelp()
{
Console.WriteLine("\nvalid commands:\n-list\n-add [name]\n-toggle [id]\n-delete [id]\n-clear");
}
}
public class TaskList
{
string p_etag = string.Empty;
string p_ua = "tasklist-cmd/1.0";
string p_done = "1";
string p_pending = "0";
string p_new_task = "{0}{1}";
HTTPClient client = new HTTPClient();
public string Uri = "http://exyus.com/xcs/tasklist/";
public TaskList() { }
public TaskList(string uri)
{
this.Uri = uri;
client.UserAgent = p_ua;
}
public XmlDocument GetList()
{
client.RequestHeaders.Set("cache-control", "no-cache");
string results = client.Execute(Uri, "get", "text/xml");
XmlDocument doc = new XmlDocument();
doc.LoadXml(results);
return doc;
}
public XmlDocument GetItem(string id)
{
string results = client.Execute(Uri + id, "get", "text/xml");
p_etag = client.ResponseHeaders["etag"];
XmlDocument doc = new XmlDocument();
doc.LoadXml(results);
return doc;
}
public void AddItem(string name)
{
AddItem(name, "0");
}
public void AddItem(string name, string completed)
{
client.Execute(Uri, "post", "text/xml", string.Format(p_new_task, name, completed));
}
public void ToggleItem(string id)
{
XmlDocument doc = GetItem(id);
string results = doc.OuterXml;
XmlNode completed = doc.SelectSingleNode("//is-completed");
if (completed.InnerText == "0")
results = results.Replace(p_pending, p_done);
else
results = results.Replace(p_done, p_pending);
client.RequestHeaders.Set("if-match", p_etag);
client.Execute(Uri + id, "put", "text/xml", results);
}
public void DeleteItem(string id)
{
client.Execute(Uri + id, "delete", "text/xml");
}
public void DeleteAll()
{
XmlDocument doc = GetList();
XmlNodeList tasks = doc.SelectNodes("//task");
for (int i = 0; i < tasks.Count; i++)
{
try
{
DeleteItem(tasks[i].Attributes["href"].Value);
}
catch (Exception ex)
{
Console.WriteLine("ERROR: "+ex.Message);
}
}
}
public string ShowList()
{
XmlDocument doc = GetList();
XmlNodeList tasks = doc.SelectNodes("//task");
StringBuilder sb = new StringBuilder();
if (tasks.Count == 0)
return "list is empty.";
for (int i = 0; i < tasks.Count; i++)
{
sb.AppendFormat(
"{0} {1}({2})\n",
tasks[i].Attributes["href"].Value,
tasks[i].SelectSingleNode("name").InnerText,
tasks[i].SelectSingleNode("is-completed").InnerText
);
}
return sb.ToString();
}
}
}