A more consistent way of handling the interfacing of JDO queries.
diff --git a/taverna-server-webapp/src/main/java/org/taverna/server/master/ManagementState.java b/taverna-server-webapp/src/main/java/org/taverna/server/master/ManagementState.java
index 31d5356..c65a334 100644
--- a/taverna-server-webapp/src/main/java/org/taverna/server/master/ManagementState.java
+++ b/taverna-server-webapp/src/main/java/org/taverna/server/master/ManagementState.java
@@ -110,9 +110,9 @@
 	private static final int KEY = 42; // whatever
 
 	private WebappState get() {
-		Query q = query("id == " + KEY);
+		Query<WebappState> q = query("id == " + KEY);
 		q.setUnique(true);
-		return (WebappState) q.execute();
+		return q.executeUnique();
 	}
 
 	private boolean loadedState;
diff --git a/taverna-server-webapp/src/main/java/org/taverna/server/master/notification/atom/EventDAO.java b/taverna-server-webapp/src/main/java/org/taverna/server/master/notification/atom/EventDAO.java
index aaab2a1..8bec456 100644
--- a/taverna-server-webapp/src/main/java/org/taverna/server/master/notification/atom/EventDAO.java
+++ b/taverna-server-webapp/src/main/java/org/taverna/server/master/notification/atom/EventDAO.java
@@ -83,9 +83,7 @@
 	@Nonnull
 	@WithinSingleTransaction
 	public List<Event> getEvents(@Nonnull UsernamePrincipal user) {
-		@SuppressWarnings("unchecked")
-		List<String> ids = (List<String>) namedQuery("eventsForUser").execute(
-				user.getName());
+		List<String> ids = eventsForUser(user);
 		if (log.isDebugEnabled())
 			log.debug("found " + ids.size() + " events for user " + user);
 
@@ -97,6 +95,12 @@
 		return result;
 	}
 
+	@SuppressWarnings("unchecked")
+	private List<String> eventsForUser(UsernamePrincipal user) {
+		return (List<String>) namedQuery("eventsForUser").execute(
+				user.getName());
+	}
+
 	/**
 	 * Get a particular event.
 	 * 
@@ -109,9 +113,7 @@
 	@Nonnull
 	@WithinSingleTransaction
 	public Event getEvent(@Nonnull UsernamePrincipal user, @Nonnull String id) {
-		@SuppressWarnings("unchecked")
-		List<String> ids = (List<String>) namedQuery("eventForUserAndId")
-				.execute(user.getName(), id);
+		List<String> ids = eventsForUserAndId(user, id);
 		if (log.isDebugEnabled())
 			log.debug("found " + ids.size() + " events for user " + user
 					+ " with id = " + id);
@@ -121,6 +123,12 @@
 		return detach(getById(ids.get(0)));
 	}
 
+	@SuppressWarnings("unchecked")
+	private List<String> eventsForUserAndId(UsernamePrincipal user, String id) {
+		return (List<String>) namedQuery("eventForUserAndId").execute(
+				user.getName(), id);
+	}
+
 	/**
 	 * Delete a particular event.
 	 * 
@@ -140,9 +148,7 @@
 		Date death = new DateTime().plusDays(-expiryAgeDays).toDate();
 		death = new Timestamp(death.getTime()); // UGLY SQL HACK
 
-		@SuppressWarnings("unchecked")
-		List<String> ids = (List<String>) namedQuery("eventsFromBefore")
-				.execute(death);
+		List<String> ids = eventsFromBefore(death);
 		if (log.isDebugEnabled() && !ids.isEmpty())
 			log.debug("found " + ids.size()
 					+ " events to be squelched (older than " + death + ")");
@@ -151,6 +157,11 @@
 			delete(getById(id));
 	}
 
+	@SuppressWarnings("unchecked")
+	private List<String> eventsFromBefore(Date death) {
+		return (List<String>) namedQuery("eventsFromBefore").execute(death);
+	}
+
 	@Override
 	public boolean isAvailable() {
 		return true;
diff --git a/taverna-server-webapp/src/main/java/org/taverna/server/master/usage/UsageRecordRecorder.java b/taverna-server-webapp/src/main/java/org/taverna/server/master/usage/UsageRecordRecorder.java
index dc9289b..d8989b5 100644
--- a/taverna-server-webapp/src/main/java/org/taverna/server/master/usage/UsageRecordRecorder.java
+++ b/taverna-server-webapp/src/main/java/org/taverna/server/master/usage/UsageRecordRecorder.java
@@ -24,7 +24,6 @@
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.List;
 
 import javax.annotation.PreDestroy;
@@ -155,9 +154,7 @@
 
 	@WithinSingleTransaction
 	public List<JobUsageRecord> getUsageRecords() {
-		@SuppressWarnings("unchecked")
-		Collection<String> urs = (Collection<String>) namedQuery("allByDate")
-				.execute();
+		List<String> urs = allByDate();
 		List<JobUsageRecord> result = new ArrayList<>();
 		for (String ur : urs)
 			try {
@@ -168,6 +165,11 @@
 		return result;
 	}
 
+	@SuppressWarnings("unchecked")
+	private List<String> allByDate() {
+		return (List<String>) namedQuery("allByDate").execute();
+	}
+
 	@PreDestroy
 	public void close() {
 		if (writer != null)
diff --git a/taverna-server-webapp/src/main/java/org/taverna/server/master/utils/JDOSupport.java b/taverna-server-webapp/src/main/java/org/taverna/server/master/utils/JDOSupport.java
index 29a6c53..96f6a11 100644
--- a/taverna-server-webapp/src/main/java/org/taverna/server/master/utils/JDOSupport.java
+++ b/taverna-server-webapp/src/main/java/org/taverna/server/master/utils/JDOSupport.java
@@ -99,13 +99,14 @@
 	 * @return The query, which should be executed to retrieve the results.
 	 */
 	@Nonnull
-	protected Query query(@Nonnull String filter) {
+	protected Query<T> query(@Nonnull String filter) {
 		return pm().newQuery(contextClass, filter);
 	}
 
 	/**
 	 * Get an instance of a named query attached to the context class (as an
-	 * annotation).
+	 * annotation). Note that the result is a <i>raw</i> {@link Query} because
+	 * not all queries return instances of the context class.
 	 * 
 	 * @param name
 	 *            The name of the query.
@@ -113,6 +114,7 @@
 	 * @see javax.jdo.annotations.Query
 	 */
 	@Nonnull
+	@SuppressWarnings("rawtypes")
 	protected Query namedQuery(@Nonnull String name) {
 		return pm().newNamedQuery(contextClass, name);
 	}
diff --git a/taverna-server-webapp/src/main/java/org/taverna/server/master/worker/RunDatabaseDAO.java b/taverna-server-webapp/src/main/java/org/taverna/server/master/worker/RunDatabaseDAO.java
index 18f0e49..1c75d22 100644
--- a/taverna-server-webapp/src/main/java/org/taverna/server/master/worker/RunDatabaseDAO.java
+++ b/taverna-server-webapp/src/main/java/org/taverna/server/master/worker/RunDatabaseDAO.java
@@ -64,7 +64,7 @@
 	// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
 	@SuppressWarnings("unchecked")
-	private List<String> nameRuns() {
+	private List<String> names() {
 		if (log.isDebugEnabled())
 			log.debug("fetching all run names");
 		return (List<String>) namedQuery("names").execute();
@@ -77,16 +77,20 @@
 	public int countRuns() {
 		if (log.isDebugEnabled())
 			log.debug("counting the number of runs");
+		return count();
+	}
+
+	private Integer count() {
 		return (Integer) namedQuery("count").execute();
 	}
 
 	@SuppressWarnings("unchecked")
-	private List<String> expiredRuns() {
+	private List<String> timedout() {
 		return (List<String>) namedQuery("timedout").execute();
 	}
 
 	@SuppressWarnings("unchecked")
-	private List<String> unterminatedRuns() {
+	private List<String> unterminated() {
 		return (List<String>) namedQuery("unterminated").execute();
 	}
 
@@ -122,7 +126,7 @@
 	private List<RunConnection> allRuns() {
 		try {
 			List<RunConnection> rcs = new ArrayList<>();
-			List<String> names = nameRuns();
+			List<String> names = names();
 			for (String id : names) {
 				try {
 					if (id != null)
@@ -171,7 +175,7 @@
 	@WithinSingleTransaction
 	public Map<String, TavernaRun> listRuns(UsernamePrincipal user, Policy p) {
 		Map<String, TavernaRun> result = new HashMap<>();
-		for (String id : nameRuns())
+		for (String id : names())
 			try {
 				RemoteRunDelegate rrd = pickRun(id).fromDBform(facade);
 				if (p.permitAccess(user, rrd))
@@ -264,7 +268,7 @@
 	public List<String> doClean() {
 		if (log.isDebugEnabled())
 			log.debug("deleting runs that timed out before " + new Date());
-		List<String> toDelete = expiredRuns();
+		List<String> toDelete = timedout();
 		if (log.isDebugEnabled())
 			log.debug("found " + toDelete.size() + " runs to delete");
 		for (String id : toDelete) {
@@ -290,7 +294,7 @@
 	@WithinSingleTransaction
 	public List<RemoteRunDelegate> getPotentiallyNotifiable() {
 		List<RemoteRunDelegate> toNotify = new ArrayList<>();
-		for (String id : unterminatedRuns())
+		for (String id : unterminated())
 			try {
 				RunConnection rc = getById(id);
 				toNotify.add(rc.fromDBform(facade));