This is a service which manipulates genealogical data.
It exposes a RESTful JSON interface which is designed to be used as a service upon which different experimental clients can be evaluated.
Some sample apps can be viewed here.
I'm going to concentrate on Javascript, HTML5 and CSS3 clients; my friend Ovi is building an Android front-end.
->curl -i -X POST -H "Content-Type: application/json" -H "Accept: application/json"
-d '{
"name":"Daniel Roy Wallace",
"sex":"MALE",
"dob":"06/27/1957",
"placeOfBirth":"Te Awamutu, New Zealand"
}'
http://family.danwallacenz.cloudfoundry.me/people
HTTP/1.1 201 Created
Server: nginx
Date: Sat, 03 Mar 2012 22:56:03 GMT
Content-Type: application/json;charset=UTF-8
Connection: keep-alive
Keep-Alive: timeout=20
Location: http://family.danwallacenz.cloudfoundry.me/people/146
Content-Length: 640
{
"id":146,
"name":"Daniel Roy Wallace",
"version":0,
"sex":"MALE",
"dob":"27/06/1957",
"dod":"unknown",
"placeOfBirth":"Te Awamutu, New Zealand",
"placeOfDeath":null,
"father":"null",
"mother":"null",
"children":[
],
"links":[
{
"rel":"self",
"href":"http://family.danwallacenz.cloudfoundry.me/people/146",
"title":"Daniel Roy Wallace"
},
{
"rel":"father",
"href":"http://family.danwallacenz.cloudfoundry.me/people/146/father",
"title":"Father"
},
{
"rel":"mother",
"href":"http://family.danwallacenz.cloudfoundry.me/people/146/mother",
"title":"Mother"
},
{
"rel":"children",
"href":"http://family.danwallacenz.cloudfoundry.me/people/146/children",
"title":"Children"
}
]
}
"id":146,
"name":"Daniel Roy Wallace",
"version":0,
"sex":"MALE",
id is assigned by JPA, version is for optimistic locking.
Keep-Alive: timeout=20 Location: http://family.danwallacenz.cloudfoundry.me/people/146 Content-Length: 640
HTTP Header Location contains the URL of the newly created Person.
"links":[ { "rel":"self", "href":"http://family.danwallacenz.cloudfoundry.me/people/146", "title":"Daniel Roy Wallace" }, { "rel":"father", "href":"http://family.danwallacenz.cloudfoundry.me/people/146/father", "title":"Father" }, { "rel":"mother", "href":"http://family.danwallacenz.cloudfoundry.me/people/146/mother", "title":"Mother" }, { "rel":"children", "href":"http://family.danwallacenz.cloudfoundry.me/people/146/children", "title":"Children" } ]
"links" attempts to follow recommended RESTful HATEOAS principles.
->curl -i -X POST -H "Content-Type: application/json" -H "Accept: application/json"
-d '{"name": "Joan Margaret Carter", "sex" : "FEMALE", "dob": "02/14/1928", "placeOfBirth" : "Nelson, New Zealand"}'
http://family.danwallacenz.cloudfoundry.me/people
HTTP/1.1 201 Created
Server: nginx
Date: Sat, 03 Mar 2012 22:57:04 GMT
Content-Type: application/json;charset=UTF-8
Connection: keep-alive
Keep-Alive: timeout=20
Location: http://family.danwallacenz.cloudfoundry.me/people/148
Content-Length: 642
{
"id":148,
"name":"Joan Margaret Carter",
"version":0,
"sex":"FEMALE",
"dob":"14/02/1928",
"dod":"unknown",
"placeOfBirth":"Nelson, New Zealand",
"placeOfDeath":null,
"father":"null",
"mother":"null",
"children":[
],
"links":[
{
"rel":"self",
"href":"http://family.danwallacenz.cloudfoundry.me/people/148",
"title":"Joan Margaret Carter"
},
{
"rel":"father",
"href":"http://family.danwallacenz.cloudfoundry.me/people/148/father",
"title":"Father"
},
{
"rel":"mother",
"href":"http://family.danwallacenz.cloudfoundry.me/people/148/mother",
"title":"Mother"
},
{
"rel":"children",
"href":"http://family.danwallacenz.cloudfoundry.me/people/148/children",
"title":"Children"
}
]
}
->curl -i -X PUT -H "Content-Type: application/json" -H "Accept: application/json"
-d '' http://family.danwallacenz.cloudfoundry.me/people/146/mother/148
HTTP/1.1 200 OK
Server: nginx
Date: Sat, 03 Mar 2012 22:58:29 GMT
Content-Type: application/json;charset=UTF-8
Connection: keep-alive
Keep-Alive: timeout=20
Location: http://family.danwallacenz.cloudfoundry.me/people/146
Content-Length: 1361
{
"id":146,
"name":"Daniel Roy Wallace",
"version":1,
"sex":"MALE",
"dob":"27/06/1957",
"dod":"unknown",
"placeOfBirth":"Te Awamutu, New Zealand",
"placeOfDeath":null,
"father":"null",
"mother":{
"id":148,
"name":"Joan Margaret Carter",
"sex":"FEMALE",
"dob":"14/02/1928",
"dod":"unknown",
"placeOfBirth":"Nelson, New Zealand",
"placeOfDeath":null,
"version":1,
"links":[
{
"rel":"self",
"href":"http://family.danwallacenz.cloudfoundry.me/people/148",
"title":"Joan Margaret Carter"
},
{
"rel":"father",
"href":"http://family.danwallacenz.cloudfoundry.me/people/148/father",
"title":"Father"
},
{
"rel":"mother",
"href":"http://family.danwallacenz.cloudfoundry.me/people/148/mother",
"title":"Mother"
},
{
"rel":"children",
"href":"http://family.danwallacenz.cloudfoundry.me/people/148/children",
"title":"Children"
}
]
},
"children":[
],
"links":[
{
"rel":"self",
"href":"http://family.danwallacenz.cloudfoundry.me/people/146",
"title":"Daniel Roy Wallace"
},
{
"rel":"father",
"href":"http://family.danwallacenz.cloudfoundry.me/people/146/father",
"title":"Father"
},
{
"rel":"mother",
"href":"http://family.danwallacenz.cloudfoundry.me/people/148",
"title":"Joan Margaret Carter"
},
{
"rel":"children",
"href":"http://family.danwallacenz.cloudfoundry.me/people/146/children",
"title":"Children"
}
],
"affectedParties":[
{
"id":148,
"name":"Joan Margaret Carter",
"href":"http://family.danwallacenz.cloudfoundry.me/people/148"
}
]
}
1."affectedParties":[ { "id":148, "name":"Joan Margaret Carter", "href":"http://family.danwallacenz.cloudfoundry.me/people/148" } ]
This person is now STALE and should be refreshed at some stage.
2."links":[ { ... }, { "rel":"mother", "href":"http://family.danwallacenz.cloudfoundry.me/people/148", "title":"Joan Margaret Carter" }, ... ],
Conforming to HATEOAS principles, the mother now appears in the links.
3. ... "placeOfDeath":null, "father":"null", "mother":{ "id":148, "name":"Joan Margaret Carter", "sex":"FEMALE", "dob":"14/02/1928", "dod":"unknown", "placeOfBirth":"Nelson, New Zealand", "placeOfDeath":null, "version":1, ...
The person's mother is also now present in the 'main' JSON. That's three times in one response!
->curl -i -H "Accept: application/json" http://family.danwallacenz.cloudfoundry.me/people/148
HTTP/1.1 200 OK
Server: nginx
Date: Sat, 03 Mar 2012 23:51:01 GMT
Content-Type: application/json;charset=utf-8
Connection: keep-alive
Keep-Alive: timeout=20
Content-Length: 1272
{
"id":148,
"name":"Joan Margaret Carter",
"version":1,
"sex":"FEMALE",
"dob":"14/02/1928",
"dod":"unknown",
"placeOfBirth":"Nelson, New Zealand",
"placeOfDeath":null,
"father":"null",
"mother":"null",
"children":[
{
"id":146,
"version":1,
"name":"Daniel Roy Wallace",
"sex":"MALE",
"dob":"27/06/1957",
"dod":"unknown",
"placeOfBirth":"Te Awamutu, New Zealand",
"placeOfDeath":null,
"father":"null",
"mother":148,
"links":[
{
"rel":"self",
"href":"http://family.danwallacenz.cloudfoundry.me/people/146",
"title":"Daniel Roy Wallace"
},
{
"rel":"father",
"href":"http://family.danwallacenz.cloudfoundry.me/people/146/father",
"title":"Father"
},
{
"rel":"mother",
"href":"http://family.danwallacenz.cloudfoundry.me/people/148",
"title":"Joan Margaret Carter"
},
{
"rel":"children",
"href":"http://family.danwallacenz.cloudfoundry.me/people/146/children",
"title":"Children"
}
]
}
],
"links":[
{
"rel":"self",
"href":"http://family.danwallacenz.cloudfoundry.me/people/148",
"title":"Joan Margaret Carter"
},
{
"rel":"father",
"href":"http://family.danwallacenz.cloudfoundry.me/people/148/father",
"title":"Father"
},
{
"rel":"mother",
"href":"http://family.danwallacenz.cloudfoundry.me/people/148/mother",
"title":"Mother"
},
{
"rel":"children",
"href":"http://family.danwallacenz.cloudfoundry.me/people/148/children",
"title":"Children"
}
]
}
1. .. "mother":"null", "children":[ { "id":146, "version":1, "name":"Daniel Roy Wallace", "sex":"MALE", "dob":"27/06/1957", ...
The child is present under children (also with HATEOAS links). Notice that the version has incremented.
->curl -i -H "Accept: application/json" "http://family.danwallacenz.cloudfoundry.me/people?name=__an__&find=ByNameLike"
HTTP/1.1 200 OK
Server: nginx
Date: Sat, 03 Mar 2012 23:05:28 GMT
Content-Type: application/json;charset=utf-8
Connection: keep-alive
Keep-Alive: timeout=20
Content-Length: 631
{
"searchResults":[
{
"id":146,
"name":"Daniel Roy Wallace",
"sex":"MALE",
"dob":"27/06/1957",
"dod":"unknown",
"placeOfBirth":"Te Awamutu, New Zealand",
"placeOfDeath":null,
"href":"http://family.danwallacenz.cloudfoundry.me/146"
},
{
"id":148,
"name":"Joan Margaret Carter",
"sex":"FEMALE",
"dob":"14/02/1928",
"dod":"unknown",
"placeOfBirth":"Nelson, New Zealand",
"placeOfDeath":null,
"href":"http://family.danwallacenz.cloudfoundry.me/148"
}
]
}
vmc target http://api.danwallacenz.cloudfoundry.me
->vmc target http://api.danwallacenz.cloudfoundry.me
Successfully targeted to [http://api.danwallacenz.cloudfoundry.me]
->vmc login
Attempting login to [http://api.danwallacenz.cloudfoundry.me]
Email: daniel.wallace.nz@gmail.com
Password: ********
Successfully logged into [http://api.danwallacenz.cloudfoundry.me]
->vmc apps
+-------------+----+---------+----------------------------------------------+-------------+
| Application | # | Health | URLS | Services |
+-------------+----+---------+----------------------------------------------+-------------+
| caldecott | 1 | RUNNING | caldecott-7ee9e.danwallacenz.cloudfoundry.me | mysql-c9b0f |
| family | 1 | RUNNING | family.danwallacenz.cloudfoundry.me | mysql-c9b0f |
+-------------+----+---------+----------------------------------------------+-------------+
->vmc tunnel mysql-c9b0f
Password: ********
Getting tunnel connection info: OK
Service connection info:
username : uZItJ1E8jJsZh
password : p905HD4CXuJ9L
name : db9f50d98499e466baa3240bca1099f67
Starting tunnel to mysql-c9b0f on port 10000.
1: none
2: mysqldump
3: mysql
mysql>