DataStoreにLow-Level APIを使ってみた

やっぱこっちのほうが速い


実行結果

client

package sample.lowlevel.client;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;

/**
 * Entry point classes define <code>onModuleLoad()</code>.
 */
public class GwtSampleLowLevelAPI implements EntryPoint {
	private final GreetingServiceAsync greetingService = GWT
			.create(GreetingService.class);

	private Panel panel = new VerticalPanel();
	private Label lbResponce = new Label();
	private TextBox name = new TextBox();
	private Button btCreate = new Button("create");
	private Button btGet = new Button("Get!");
	
	public void onModuleLoad() {
		this.panel.add(this.lbResponce);
		this.panel.add(this.name);
		this.panel.add(this.btCreate);
		this.panel.add(this.btGet);
		
		//Entityを作成するボタンを押したとき
		this.btCreate.addClickHandler(new ClickHandler(){

			@Override
			public void onClick(ClickEvent event) {
				greetingService.addEntity(name.getText(), new AsyncCallback<String>(){

					@Override
					public void onFailure(Throwable caught) {
						lbResponce.setText(caught.toString());
					}

					@Override
					public void onSuccess(String result) {
						lbResponce.setText(result);
					}
					
				});
				
			}
			
		});
		
		this.btGet.addClickHandler(new ClickHandler(){

			@Override
			public void onClick(ClickEvent event) {
				greetingService.getEntity(new AsyncCallback<String>(){

					@Override
					public void onFailure(Throwable caught) {
						lbResponce.setText(caught.toString());
					}

					@Override
					public void onSuccess(String result) {
						lbResponce.setText(result);
					}
					
				});
				
			}
			
		});
		RootPanel.get("panel").add(panel);
		
	}
}

Service

package sample.lowlevel.client;

import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;

/**
 * The client side stub for the RPC service.
 */
@RemoteServiceRelativePath("greet")
public interface GreetingService extends RemoteService {
	String addEntity(String name);
	String getEntity();
}

ServiceAsync
package sample.lowlevel.client;

import com.google.gwt.user.client.rpc.AsyncCallback;

/**
* The async counterpart of GreetingService.
*/
public interface GreetingServiceAsync {
void addEntity(String input, AsyncCallback callback);
void getEntity(AsyncCallback callback);
}

ServiceImple

package sample.lowlevel.server;

import sample.lowlevel.client.GreetingService;

import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.Query;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;

/**
 * The server side implementation of the RPC service.
 */
@SuppressWarnings("serial")
public class GreetingServiceImpl extends RemoteServiceServlet implements
		GreetingService {

	public String addEntity(String input) {
		DatastoreService datastoreService = DatastoreServiceFactory.getDatastoreService();
        Entity entity = new Entity("Hoge");
        entity.setProperty("name", input);
        datastoreService.put(entity);
		return "Data created";
	}

	@Override
	public String getEntity() {
		DatastoreService datastoreService = DatastoreServiceFactory.getDatastoreService();
		Query hogeQuery = new Query("Hoge");
		Iterable<Entity> hogeIter = datastoreService.prepare(hogeQuery).asIterable();
		StringBuilder result = new StringBuilder();
		for (Entity hoge : hogeIter) {
			result.append((String)hoge.getProperty("name"));
			result.append(" ");
			System.out.println(hoge.getKey().getId());
		}
		return result.toString();
	}
	
}

html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<!-- The HTML 4.01 Transitional DOCTYPE declaration-->
<!-- above set at the top of the file will set     -->
<!-- the browser's rendering engine into           -->
<!-- "Quirks Mode". Replacing this declaration     -->
<!-- with a "Standards Mode" doctype is supported, -->
<!-- but may lead to some differences in layout.   -->

<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">

    <!--                                                               -->
    <!-- Consider inlining CSS to reduce the number of requested files -->
    <!--                                                               -->
    <link type="text/css" rel="stylesheet" href="GwtSampleLowLevelAPI.css">

    <!--                                           -->
    <!-- Any title is fine                         -->
    <!--                                           -->
    <title>Web Application Starter Project</title>
    
    <!--                                           -->
    <!-- This script loads your compiled module.   -->
    <!-- If you add any GWT meta tags, they must   -->
    <!-- be added before this line.                -->
    <!--                                           -->
    <script type="text/javascript" language="javascript" src="gwtsamplelowlevelapi/gwtsamplelowlevelapi.nocache.js"></script>
  </head>

  <!--                                           -->
  <!-- The body can have arbitrary html, or      -->
  <!-- you can leave the body empty if you want  -->
  <!-- to create a completely dynamic UI.        -->
  <!--                                           -->
  <body>

    <!-- OPTIONAL: include this if you want history support -->
    <iframe src="javascript:''" id="__gwt_historyFrame" tabIndex='-1' style="position:absolute;width:0;height:0;border:0"></iframe>

    <h1>Web Application Starter Project</h1>

    <table align="center">
      <tr>
        <td colspan="2" style="font-weight:bold;">Please enter your name:</td>        
      </tr>
      <tr>
        <td id="panel"></td>
      </tr>
    </table>
  </body>
</html>