2010年3月5日金曜日

GAE上での開発メモ

いちおうファイルアップロード管理システムができたので
今後の為にここでいくつかメモっておこうかと思う。

1.GAEjからデータストアにアクセスする場合、次の2つ方式がある。

・JDO(Java Data Objects)
・JPA(Java Presistence API)


今回は、JDO(Java Data Objects)の方式で作成してみた。


■サーバー側プログラム
(1)データクラスを定義するクラス
[fileMaster.java]
@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable="true")
public class fileMaster {
     @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Key key;
    @Persistent
    private String caption;
    @Persistent
    private String name;
    @Persistent
    private String deftag;
    @Persistent
    private Date date;
    @Persistent
    private String filename;
    @Persistent
    private String contentType;
    @Persistent
    private Blob binData;


省略(コンストラクター、セッターメソッド、ゲッターメソッドなど)





}




【説明】
・JDOで保存されたオブジェクトは、GAEデータストア内のエンティティになる。
データストアでのJavaクラスの永続化と参照等にJDOを使用できるようにするには、
クラスに@PersistenceCapableを付加する必要がある。

@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable="true")
は、データストアでのJavaクラスの格納と取得にJDOを使用できるようにする

identityType = IdentityType.APPLICATIONは、主キー(PrimaryKey)の定義を
アプリケーション側で行うという宣言で、GAEでは必ずこの宣言にする必要がある。
detachable="true"はエンティティを永続化後、transientな状態に戻ってしまうのを防ぐ。


・永続化対象プロパティ定義
     @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Key key;
    @Persistent
    private String caption;
    @Persistent
    private String name;
    @Persistent
    private String deftag;
    @Persistent
    private Date date;
    @Persistent
    private String filename;
    @Persistent
    private String contentType;
    @Persistent
    private Blob binData;



@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)は、システムで生成されたKeyを
使用するための記述
 




(2)永続化処理を実行するクラスファイル
[PMF.java]
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;
    }
}


(3)永続化処理の基本パターン

// 永続化マネージャのインスタンス生成
PersistenceManager pm = PMF.get().getPersistenceManager();
//  データクラスのインスタンス生成と値設定
fileMaster fmas = new fileMaster(key, caption, name, deftag, date,filename, contentType, b);

try {
//永続化の実行
pm.makePersistent(fmas);
} finally {
//永続化マネージャのクローズ
    pm.close();
}


(4)永続化処理の基本パターン(サーブレットの一部)

        boolean    adddata = false;
        String registerno = futil.getParameter("registerno");
        Key key = KeyFactory.createKey(fileMaster.class.getSimpleName(),registerno);
        PersistenceManager pm = PMF.get().getPersistenceManager();
        try {
            fileMaster echeck = pm.getObjectById(fileMaster.class, key); // キーでオブジェクトを取得
        } catch (JDOObjectNotFoundException e) {
            adddata = true;
        }
        if (uniq) {
            // データ登録を行う
            String caption = futil.getParameter("caption");
            String name = futil.getParameter("name");
            String filename = futil.getParameter("filename");
            String contentType = futil.getParameter("contentType");
            String deftag = futil.getParameter("deftag");
            Date date = new Date();
            byte[] b = futil.getFileData();

            fileMaster fmas = new fileMaster(key, caption, name, deftag, date,
                    filename, contentType,
                    auth.getAdmin_Email(),
                    "",
                    true,    // User_r
                    true,   // User_w
                    true,   // User_x
                    false,  // Group_r
                    false,  // Group_w
                    false,  // Group_x
                    false,  // Other_r
                    false,  // Other_w
                    false,  // Other_x
                    b);

            try {
                pm.makePersistent(fmas);
                // 登録成功処理記述
            } catch (Exception e) {
                // 登録失敗処理記述
            } finally {
                pm.close();
            }
        }




(5)永続化処理の基本パターン-削除(サーブレットの一部)
    public void doPost(HttpServletRequest req, HttpServletResponse resp)
                                                    throws IOException {
        resp.setContentType("text/plain");
        resp.setCharacterEncoding("utf-8");
       
        // ユーザチェック
        ・
        ・
        省略
        ・
        ・
       
        String registerno = req.getParameter("registerno");
        PersistenceManager pm = PMF.get().getPersistenceManager();       
        try {
            Key key = KeyFactory.createKey(fileMaster.class.getSimpleName(), registerno);
            fileMaster fmas = pm.getObjectById(fileMaster.class, key);
            pm.deletePersistent(fmas);
            resp.getWriter().println("削除成功  登録番号="+registerno);
        }catch(JDOObjectNotFoundException e){
            resp.getWriter().println("削除データなし  エラー:"+e);   
        }catch (Exception e){
            resp.getWriter().println("削除不成功   エラー:"+e);
        } finally {
            pm.close();
        }               
    }


(6)トランザクション処理(いまのところどれくらいつかえるのか未検証)
    ・
    ・ 省略

    ・


Transaction tx = pm.currentTransaction();
try{
  tx.begin();
  pm.deletePersistent(fmas);
    ・
    ・ 省略
    ・
  pm.makePersistent(fmas);
  tx.commit();

    ・
    ・ 省略

    ・

}catch(Exception e){
   // エラー処理
}
finally{
  if(tx.isActive()){
    tx.rollback();
  }
  pm.close();
}

    ・
    ・ 省略
    ・

0 件のコメント:

コメントを投稿