Google App Engine JDOサンプルプログラム

デモサイト

ソース

  • Google Code
    • http://reflexworks.googlecode.com/svn/trunk/reflexgaetest

Servlet (servlet.ReflexGaeServlet)

package servlet;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import model.Content;
import model.Login;
import model.RequestHdr;

import org.json.JSONException;

import util.JdoUtils;

import jp.sourceforge.reflex.IResourceMapper;
import jp.sourceforge.reflex.core.ResourceMapper;

public class ReflexGaeServlet extends HttpServlet {

        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                        throws ServletException, IOException {

                resp.setContentType("text/plain");
                resp.setCharacterEncoding("UTF-8");

                // 親
                Login login = new Login();

                // 子要素が1つ場合
                login.requestHdr = new RequestHdr();
                login.requestHdr.clientID = "clientid";
                login.requestHdr.ver = "version";
                login.requestHdr.ver_$title = "xmlns1"; // 属性の指定は必ずStringで

                // 子要素が多重度0,∞で存在する場合
                login.content = new ArrayList<Content>();
                Content id = new Content();
                id.val = "001あ";
                login.content.add(id);
                id = new Content();
                id.val = "002い";
                login.content.add(id);
                id = new Content();
                id.val = "003う";
                login.content.add(id);

                // Reflex独自のfield名変換例(コロンとマイナスの表現)
                //   例えば、QNAMEの:は$に、-は__に変換される
                login.minus__fld = " - ⇔ __に変換 ";
                login.colon$fld = " : ⇔ $ ";

                // モデルビーンのパッケージ名(model)を指定してリソースマッパーをnewする
                IResourceMapper mapper = new ResourceMapper("model");

                // そしてXMLにシリアライズ
                String toXML = mapper.toXML(login);
                resp.getWriter().println("\n【JavaBeanからXMLへのシリアライズテスト】:");
                resp.getWriter().println("\nNamespace:");
                resp.getWriter().println(toXML);

                // JSONにシリアライズ 
                String toJSON = mapper.toJSON(login);
                resp.getWriter().println("\n【JSON(0,1) JSONにシリアライズ】:");
                resp.getWriter().println(toJSON);

            // JSON デシリアライズテスト
                Login loginnew;
                try {
                        loginnew = (Login) mapper.fromJSON(toJSON);
                        // XMLにシリアライズ
                        toXML = mapper.toXML(loginnew);
                        resp.getWriter().println("\n【XMLにシリアライズ】:");
                        resp.getWriter().println("\nNamespace:");
                        resp.getWriter().println(toXML);
                        
                } catch (JSONException e) {
                        throw new IOException(e);
                }

        }

        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp)
                        throws ServletException, IOException {

                resp.setContentType("text/plain");
                resp.setCharacterEncoding("UTF-8");

                // モデルビーンのパッケージ名(model)を指定してリソースマッパーをnewする
                IResourceMapper mapper = new ResourceMapper("model");

                resp.getWriter().println(req.getParameter("json"));
                
            // JSON デシリアライズテスト
                Login loginnew;
                try {
                        loginnew = (Login) mapper.fromJSON(req.getParameter("json"));
                        // XMLにシリアライズ
                        String toXML = mapper.toXML(loginnew);
                        resp.getWriter().println("\n【XMLにシリアライズ】:");
                        resp.getWriter().println("\nNamespace:");
                        resp.getWriter().println(toXML);
                        
                } catch (JSONException e) {
                        throw new IOException(e);
                }
            
                // デシリアライズしたものをDatastoreにINSERT
                JdoUtils.insert(loginnew);

                // INSERTしたものを読み取る
                List<Login> entries = JdoUtils.getEntries();

                resp.getWriter().println("\n【DataStoreに格納されているものを全部取り出して表示】");
                
                for (Login aEntry : entries) {

                        // XMLにシリアライズ
                        String toXML = mapper.toXML(aEntry);
                        resp.getWriter().println("\n【XMLにシリアライズ】:");
                        resp.getWriter().println("\nNamespace:");
                        resp.getWriter().println(toXML);
                        
                        // XMLからデシリアライズしてみる
                        Login loginnew2 = (Login) mapper.fromXML(toXML);
                        
                        // さらにJSONにシリアライズ 
                        String toJSON = mapper.toJSON(loginnew2);
                        resp.getWriter().println("\n【XMLをデシリアライズしてさらにJSONにシリアライズ】:");
                        resp.getWriter().println(toJSON);
                        
                }
        }

        
        
}

Model (model.Login)

package model;

import java.util.List;

import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;

import com.google.appengine.api.datastore.Key;

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Login {

        @PrimaryKey
        @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
        private Key key;

        @Persistent
        public static String _$xmlns;

        @Persistent
        public String _$xmlns$atr1;

        @Persistent
        public String minus__fld;

        @Persistent
        public String colon$fld;

        @Persistent
        public RequestHdr requestHdr;   // one-to-one

        @Persistent(mappedBy = "login")
        public List<Content> content;   // one-to-many

        
}


Model (model.Content)

package model;

import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;

import com.google.appengine.api.datastore.Key;

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Content {

        @PrimaryKey
        @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
        private Key key;

        @Persistent
        private Login login;

        @Persistent
        public String val;

}


Model (model.RequestHdr)

package model;

import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;

import com.google.appengine.api.datastore.Key;

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class RequestHdr {

        @PrimaryKey
        @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
        private Key key;

        @Persistent
        public String ver;

        @Persistent
        public String ver_$title = "xxx";

        @Persistent
        public String clientID;

        @Persistent
        public String userID;

        @Persistent
        public String password;

}


Util (util.JdoUtils)

package util;

import java.util.List;

import javax.jdo.PersistenceManager;
import javax.jdo.Query;

import model.Login;


public class JdoUtils {

        public static void insert(Login entry) {
                PersistenceManager pm = PMF.get().getPersistenceManager();
                pm.makePersistent(entry);
        }

        public static List<Login> getEntries() {
                PersistenceManager pm = PMF.get().getPersistenceManager();
                Query query = pm.newQuery(Login.class);

                List<Login> entries = (List<Login>) query.execute();
                return entries;
        }

}
     

Util (util.PMF)

package util;

import javax.jdo.JDOHelper;
import javax.jdo.PersistenceManagerFactory;

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

        private PMF() {
        }

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

web.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5">
        <servlet>
                <servlet-name>ReflexGaeServlet</servlet-name>
                <servlet-class>servlet.ReflexGaeServlet</servlet-class>
        </servlet>
        <servlet-mapping>
                <servlet-name>ReflexGaeServlet</servlet-name>
                <url-pattern>/reflexGae</url-pattern>
        </servlet-mapping>
        <welcome-file-list>
                <welcome-file>index.html</welcome-file>
        </welcome-file-list>
</web-app>

index.html

<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN'>

<html>
  <head>
    <meta http-equiv='content-type' content='text/html; charset=UTF-8'>
    <title>Reflex/GAE Test</title>
  </head>

  <body>
    <h1>Reflex/GAE Test</h1>
        
    <table>
      <tr>
        <td colspan='2' style='font-weight:bold;'>JDOから直接XMLやJSONに変換できます:</td>        
      </tr>
      <tr>
        <td><a href='reflexGae'/>1.JDOからXML,JSONに変換</td>
      </tr>
      <tr>
        <td>
        <form action='/reflexGae' method='post'>
<p>JSON:<input type='text' name='json' value='{"login" : {"minus-fld" : " - ⇔ __に変換 ","colon:fld" : " \: ⇔ $ ","requestHdr" : {"ver" : "version","ver_:title" : "xmlns1","clientID" : "clientid"},"content" : [{"val" : "001あ"},{"val" : "002い"},{"val" : "003う"}]}}' size='500' />
</p>
<p><input type='submit' name='submit' value='2.JSONからJDOに変換' /></p>
</form>
      <tr>
        <td colspan='2' style='font-weight:bold;'>Source:</td>        
      </tr>
      <tr>
        <td><a href='ReflexGaeTest.zip'/>ReflexGaeTest.zip</td>
      </tr>
      <tr>
        <td></td>
      </tr>
      <tr>
        <td></td>
      </tr>
      <tr>
        <td colspan='2' style='font-weight:bold;'>deploy方法:</td>        
      </tr>
      <tr>
        <td>GAEのWebApplicationProjectを作成して以下のように配置してください。</td>
      </tr>
      <tr>
        <td>1.srcフォルダ以下のソースをプロジェクトのsrcに置いてください</td>
      </tr>
      <tr>
        <td>2.libフォルダの4つのファイル(reflexcore-0.8.jar,xstream-1.1.2.jar,xpp3-1.1.3.4-RC8.jar,json-20070829.jar)をwar/WEB-INF/libの下に置きプロジェクトからはビルドパスを通してください</td>
      </tr>
      <tr>
        <td>3.web.xmlをwar/WEB-INFに置いてください</td>
      </tr>
      <tr>
        <td>4.index.htmlをwarに置いてください</td>
      </tr>
        
        </td>
      </tr>
    </table>
  </body>
</html>