Subscribed unsubscribe Subscribe Subscribe

GAE/J 開発サーバー上でのローカルData Viewer

Python版GAEなら、開発サーバー上でも http://localhost:8080/_ah/admin/ でローカル環境用のDashboardを見ることができて便利なんだけど、どうやらJava版にはそれがないらしい(むしろあるのなら教えて下さい)。
せめてData Viewer的なものはローカル環境にも欲しい、ということで、中途半端なJSPで書いた。
編集も削除もできないけど、とにかく指定したKindのデータを全部一覧表示するように。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page import="com.google.appengine.api.datastore.DatastoreService" %>
<%@ page import="com.google.appengine.api.datastore.DatastoreServiceFactory" %>
<%@ page import="com.google.appengine.api.datastore.Entity" %>
<%@ page import="com.google.appengine.api.datastore.PreparedQuery" %>
<%@ page import="com.google.appengine.api.datastore.Query" %>
<%
	DatastoreService datastoreService = DatastoreServiceFactory.getDatastoreService();
	String kind = request.getParameter("kind");
	if (kind == null) {
	    response.sendError(400);
	    return;
	}
	Query query = new Query(kind);
	PreparedQuery preparedQuery = datastoreService.prepare(query);
	int count = preparedQuery.countEntities();
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>Datastore View</title>
	</head>
	<body>
		<h1><%= kind %></h1>
		<h2><%= count %></h2>
<%
	if (count > 0) {
		out.println("<table border=\"1\">");
		out.println("<tr>");
		out.println("<th>key</th>");
		List<String> properties =
		    new ArrayList<String>(preparedQuery.asIterator().next().getProperties().keySet());
		for (String property : properties) {
		    out.println("<th>" + property + "</th>");
		}
		out.println("</tr>");
		for (Entity entity : preparedQuery.asIterable()) {
		    out.println("<tr>");
		    out.println("<td>" + entity.getKey() + "</td>");
			for (String property : properties) {
			    out.println("<td>" + entity.getProperty(property) + "</td>");
			}
		    out.println("</tr>");
		}
		out.println("</table>");
	}
%>
	</body>
</html>

リクエストでkind=をパラメータに渡すだけ。web.xmlでURLをadmin権限に限定してやれば、そのままデプロイしてしまっても大丈夫なはず。

プロパティを取得するのに、Query結果の1件目からgetProperties()のkeySet()を使っているので、1件目のEntityに存在するプロパティしか羅列できない。予めすべてのEntityのプロパティをなめていってもいいけど…まぁ必要な場合は、ですかね。
Queryを弄ってやれば、表示順くらいはどうにかできるはず。
編集/削除はそれ用のサーブレット作ってやらないことにはどうしようもない。JSP内で処理できなくもないかもしれないけど、かなり汚くなるだろうし。