Java で Google App Engine メモ

Last Updated : 2010/3/18 (2009/11/29 より執筆開始)
asato shimotaki <asatohan at gmail.com>
内容に関するコメント(感想、提案、書き間違いの指摘)は歓迎します。

概要

Java で Google App Engine メモ

実験環境

Datastore - put - 1

キー名を指定する場合。
public class ExampleServlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {

		 DatastoreService ds = DatastoreServiceFactory.getDatastoreService();

		 Entity e = new Entity("MyEntity", "mykey");

		 Key key = ds.put(e);

		 System.out.println( key );
		 System.out.println( key.getKind() );
		 System.out.println( key.getName() );
		 System.out.println( key.getId() );
		 System.out.println( KeyFactory.keyToString(key) );
	}
}
before:

after:

出力結果:

MyEntity("mykey")
MyEntity
mykey
0
aghhc2F0b2hhbnITCxIITXlFbnRpdHkiBW15a2V5DA

Datastore - put - 2

キー名を指定しない場合。
public class ExampleServlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {

		 DatastoreService ds = DatastoreServiceFactory.getDatastoreService();

		 Entity e = new Entity("MyEntity"); // kindだけ指定。

		 Key key = ds.put(e);

		 System.out.println( key );
		 System.out.println( key.getKind() );
		 System.out.println( key.getName() );
		 System.out.println( key.getId() );
		 System.out.println( KeyFactory.keyToString(key) );
	}
}
before:

after:

出力結果:

MyEntity(54)
MyEntity
null
54
aghhc2F0b2hhbnIOCxIITXlFbnRpdHkYNgw

Datastore - put - 3

プロパティを指定する場合。
public class ExampleServlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {

		 DatastoreService ds = DatastoreServiceFactory.getDatastoreService();

		 Entity e = new Entity("MyEntity");

		 e.setProperty("myproperty1", "aaa");
		 e.setProperty("myproperty2", 111);

		 ds.put(e);
	}
}
before:

after:

Datastore - put - 4

同じkindのエンティティが異なるプロパティを持つ場合。
public class ExampleServlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {

		 DatastoreService ds = DatastoreServiceFactory.getDatastoreService();

		 Entity e1 = new Entity("MyEntity");

		 e1.setProperty("myproperty1", "aaa");
		 e1.setProperty("myproperty2", 111);

		 Entity e2 = new Entity("MyEntity"); // e1と同じkind

		 e2.setProperty("myproperty1", 999); // e1と同じプロパティ。型が異なってもよい。
		 e2.setProperty("myproperty3", "xxx"); // e1が持っていないプロパティ

		 ds.put(e1);
		 ds.put(e2);
	}
}
before:

after:

Datastore - put - 5

同じキーでエンティティをputした場合。
public class ExampleServlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {

		 DatastoreService ds = DatastoreServiceFactory.getDatastoreService();

		 Entity e = new Entity("MyEntity", "mykey");

		 e.setProperty("myproperty1", "bbb");

		 ds.put(e);
	}
}
before:

after:

Datastore - put - 6

エンティティ間のParent/Child関係の例。同じkindに属しても属していなくてもよい。
public class ExampleServlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {

		 DatastoreService ds = DatastoreServiceFactory.getDatastoreService();

		 Entity parent = new Entity("MyEntity", "myparentkey");

		 Entity child = new Entity("MyEntity", "mychildkey", parent.getKey());

		 ds.put(child);
		 ds.put(parent);
	}
}
before:

after:

Datastore - get - 1

public class ExampleServlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {

		DatastoreService ds = DatastoreServiceFactory.getDatastoreService();

		Key key = KeyFactory.createKey("MyEntity", "mykey");
		
		try {
			Entity e = ds.get(key);
			System.out.println(e);

		} catch(EntityNotFoundException e) {
			System.out.println(e);
		}
	}
}

出力結果:

<Entity [MyEntity("mykey")]:
>

Datastore - delete - 1

public class ExampleServlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {

		DatastoreService ds = DatastoreServiceFactory.getDatastoreService();

		Key key = KeyFactory.createKey("MyEntity", "mykey");
		
		ds.delete(key);
	}
}
before:

after:

JDO 準備

public final class PMF {

	private static final PersistenceManagerFactory pmfInstance =
		JDOHelper.getPersistenceManagerFactory("transactions-optional");

	private PMF() {}
	
	public static PersistenceManagerFactory get() {
		return pmfInstance;
	}
}

JDO - 基本 - 1

主キーが Key 型の場合。
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class MyEntity {
   
	@PrimaryKey
	@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
	private Key key;

	@Persistent
	private String name;
	
	public MyEntity(String name) {
		this.name = name;
	}
}
public class ExampleServlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
		
		PersistenceManager pm = PMF.get().getPersistenceManager();
		
		
		MyEntity e = new MyEntity("aaa");
		
		try {
			pm.makePersistent(e);
            
		} finally {
			pm.close();
		}
	}
}
before:

after:

JDO - 基本 - 2

主キーが Long 型の場合。
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class MyEntity {
    
	@PrimaryKey
	@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
	private Long id;

	@Persistent
	private String name;
    
	public MyEntity(String name) {
		this.name = name;
	}
}
public class ExampleServlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {

		PersistenceManager pm = PMF.get().getPersistenceManager();
		
		
		MyEntity e = new MyEntity("bbb");
		
		try {
			pm.makePersistent(e);
		} finally {
			pm.close();
		}
	}
}
before:

after:

JDO - 基本 - 3

主キーが Unencoded な String 型の場合。
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class MyEntity {
    
	@PrimaryKey
	private String id;

	@Persistent
	private String name;
    
	public MyEntity(String id, String name) {
		this.id = id;
		this.name = name;
	}
}
public class ExampleServlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {

		PersistenceManager pm = PMF.get().getPersistenceManager();
		
		
		MyEntity e = new MyEntity("abc123", "ccc");
		
		try {
			pm.makePersistent(e);

		} finally {
			pm.close();
		}
	}
}
before:

after:

JDO - Relationships - 1

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Parent {
    
	@PrimaryKey
	@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
	private Key key;
	
	@Persistent
	private Child child;
	
	public void setChild(Child child) {
		this.child = child;
	}
}
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Child {
	
	@PrimaryKey   
	@Persistent(valueStrategy=IdGeneratorStrategy.IDENTITY)
	private Key key;
}
public class ExampleServlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {

		PersistenceManager pm = PMF.get().getPersistenceManager();
			
		Parent p = new Parent();
		p.setChild( new Child() );

		try {
			Transaction tx = pm.currentTransaction();
			try {
				tx.begin();
		        
				pm.makePersistent(p);

				tx.commit();
		        
			} finally {
				if (tx.isActive()) {
					tx.rollback();
				}
			}
		} finally {
			pm.close();
		}
	}
}
before:

after:



JDO - Cursor - 1

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class MyEntity {
    
	@PrimaryKey
	@Persistent
	private String id;
    
	public MyEntity(String id) {
		this.id = id;
	}
	
	public String getID() {
		return id;
	}
}
import com.google.appengine.api.datastore.Cursor;
import org.datanucleus.store.appengine.query.JDOCursorHelper;
import javax.jdo.Query;

public class ExampleServlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {

		PersistenceManager pm = PMF.get().getPersistenceManager();
		
		
		Query query = pm.newQuery(MyEntity.class);
		query.setRange(0, 2);

		List results = (List) query.execute();
		for(MyEntity e: results) {
			resp.getWriter().println( e.getID() );
		}
		
		Cursor cursor = JDOCursorHelper.getCursor(results);
		String cursorString = cursor.toWebSafeString();

		resp.getWriter().println(cursorString);

		
		cursor = Cursor.fromWebSafeString(cursorString);

		Map extensionMap = new HashMap();
		extensionMap.put(JDOCursorHelper.CURSOR_EXTENSION, cursor);

		query.setExtensions(extensionMap);
		query.setRange(0, 8);
	
		results = (List) query.execute();
		for(MyEntity e: results) {
			resp.getWriter().println( e.getID() );
		}
	
	}
}
出力結果:
0
1
E9oBMGoraghhc2F0b2hhbnIfCxIMCgAaCE15RW50aXR5DAsSCE15RW50aXR5IgExDIIBAOABABQ
2
3
4
5
6
7
8
9

JDO - Cursor - 2

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class MyEntity {
    
	@PrimaryKey
	@Persistent
	private String id;
    
	public MyEntity(String id) {
		this.id = id;
	}
	
	public String getID() {
		return id;
	}
}
import com.google.appengine.api.datastore.Cursor;
import org.datanucleus.store.appengine.query.JDOCursorHelper;
import javax.jdo.Query;

public class ExampleServlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {

		PersistenceManager pm = PMF.get().getPersistenceManager();
		
		
		Query query = pm.newQuery(MyEntity.class);
		query.setRange(0, 2);

		List results = (List) query.execute();
		for(MyEntity e: results) {
			resp.getWriter().println( e.getID() );
		}
		
		Cursor cursor = JDOCursorHelper.getCursor(results);
		String cursorString = cursor.toWebSafeString();

		resp.getWriter().println(cursorString);

		
		pm.deletePersistent( pm.getObjectById(MyEntity.class, "0") );

		
		cursor = Cursor.fromWebSafeString(cursorString);

		Map extensionMap = new HashMap();
		extensionMap.put(JDOCursorHelper.CURSOR_EXTENSION, cursor);
	
		query.setExtensions(extensionMap);        
		query.setRange(0, 8);

		results = (List) query.execute();
		for(MyEntity e: results) {
			resp.getWriter().println( e.getID() );
		}
	}
}
出力結果:
0
1
E9oBMGoraghhc2F0b2hhbnIfCxIMCgAaCE15RW50aXR5DAsSCE15RW50aXR5IgExDIIBAOABABQ
2
3
4
5
6
7
8
9

JDO - Cursor - 3

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class MyEntity {
    
	@PrimaryKey
	@Persistent
	private String id;
    
	public MyEntity(String id) {
		this.id = id;
	}
	
	public String getID() {
		return id;
	}
}
import com.google.appengine.api.datastore.Cursor;
import org.datanucleus.store.appengine.query.JDOCursorHelper;
import javax.jdo.Query;

public class ExampleServlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {

		PersistenceManager pm = PMF.get().getPersistenceManager();
		
		
		Query query = pm.newQuery(MyEntity.class);
		query.setRange(0, 2);

		List results = (List) query.execute();
		for(MyEntity e: results) {
			resp.getWriter().println( e.getID() );
		}
		
		Cursor cursor = JDOCursorHelper.getCursor(results);
		String cursorString = cursor.toWebSafeString();

		resp.getWriter().println(cursorString);

		
		pm.deletePersistent( pm.getObjectById(MyEntity.class, "2") );

		
		cursor = Cursor.fromWebSafeString(cursorString);

		Map extensionMap = new HashMap();
		extensionMap.put(JDOCursorHelper.CURSOR_EXTENSION, cursor);
	
		query.setExtensions(extensionMap);        
		query.setRange(0, 8);

		results = (List) query.execute();
		for(MyEntity e: results) {
			resp.getWriter().println( e.getID() );
		}
	}
}
出力結果:
0
1
E9oBMGoraghhc2F0b2hhbnIfCxIMCgAaCE15RW50aXR5DAsSCE15RW50aXR5IgExDIIBAOABABQ
3
4
5
6
7
8
9

URL Fetch - fetchAsync

public class ExampleServlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {

		URL url = new URL("http://www.google.co.jp/");
		
		URLFetchService service = URLFetchServiceFactory.getURLFetchService();
		Future asyncHttpResp = service.fetchAsync(url);
		
		resp.getWriter().println("fetch");
		
		try {
			HTTPResponse httpResp = asyncHttpResp.get();
			
			resp.getWriter().println("resp");

			resp.getWriter().println("content length: " + httpResp.getContent().length);
			
			for(HTTPHeader header : httpResp.getHeaders()){
				resp.getWriter().println(header.getName() + ": " + header.getValue());
			}

		} catch (InterruptedException e) {
			resp.getWriter().println(e);
			
		} catch (ExecutionException e) {
			resp.getWriter().println(e);
		}
	}
}
出力結果:
fetch
resp
content length: 6930
Date: Sat, 13 Feb 2010 00:26:02 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=Shift_JIS
Server: gws
X-XSS-Protection: 0
Transfer-Encoding: chunked

参考文献とリソース

更新履歴

todo