SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

OSSフレームワーク「dataforms.jar」でサンプルプログラムを構築する(2)

サムネイルサイズの調整

 現状では動画のプレーヤーサイズに対し、画像のサムネイルが小さすぎます。そこで、画像のサムネイルのサイズをプレーヤーのサイズに合わせます。サムネイルサイズの調整は「AttachImageField.java」で行います。以下のソースの太字部分を追加してください。

「AttachImageField.java」の修正箇所
package bbs.field;

import dataforms.field.common.BlobStoreImageField;


/**
 * AttachImageFieldフィールドクラス。
 *
 */
public class AttachImageField extends BlobStoreImageField {

    /**
     * フィールドコメント。
     */
    private static final String COMMENT = "画像";
    /**
     * コンストラクタ。
     */

    ・・・ 中略 ・・・


    @Override
    protected void onBind() {
        super.onBind();
        
        this.setThumbnailWidth(420);
        this.setThumbnailHeight(315);
        
    }
}

 この修正の結果は以下のようになります。

サムネイルサイズを調整した画像フィールド
サムネイルサイズを調整した画像フィールド

データ保存処理の実装

 開発ツールで自動生成された「ArticleDao.java」にはArticleTableの操作の記述しかないため、AttachFileTableの操作を追加します。まず保存処理を実装します。以下の通り「ArticleDao.java」を修正してください。

AttachFileTableの保存処理の追加
package bbs.dao;

    ・・・ 中略 ・・・

/**
 * Daoクラス。
 *
 */
public class ArticleDao extends Dao {
    /**
     * Logger.
     */
    private static Logger logger = Logger.getLogger(ArticleDao.class);

    ・・・ 中略 ・・・


    /**
     * POSTされた情報から添付ファイルのリストを取得します。
     * @param data POSTされた情報。
     * @return 添付ファイルリスト。
     */
    private List<Map<String, Object>> getAttachFileList(final Map<String, Object> data) {
        ArticleTable.Entity ae = new ArticleTable.Entity(data);
        @SuppressWarnings("unchecked")
        List<Map<String, Object>> list = (List<Map<String, Object>>) data.get("attachFileTable");
        for (Map<String, Object> m: list) {
            AttachFileTable.Entity fe = new AttachFileTable.Entity(m);
            fe.setArticleId(ae.getArticleId());
        }
        return list;
    }


    /**
     * データを追加します。
     * @param data データ。
     * @return 追加件数。
     * @throws Exception 例外。
     */
    public int insert(final Map<String, Object> data) throws Exception {
    
        logger.debug("data=" + JSON.encode(data, true));
        ArticleTable.Entity e = new ArticleTable.Entity(data);
        ArticleTable table = new ArticleTable();
        int ret = this.executeInsert(table, data);
        if (e.getThreadId() == null) {
            e.setThreadId(e.getArticleId());
            this.executeUpdate(table, data);
        }
        List<Map<String, Object>> list = this.getAttachFileList(data);
        this.saveTable(new AttachFileTable(), list, data);
        return ret;
    
    }


    /**
     * データを更新します。
     * @param data データ。
     * @return 更新件数。
     * @throws Exception 例外。
     */
    public int update(final Map<String, Object> data) throws Exception {
        // 楽観ロックチェック
        Table table = new ArticleTable();
        boolean ret = this.isUpdatable(table, data);
        if (!ret) {
            throw new ApplicationException(this.getPage(), "error.notupdatable");
        }
        // データ更新
        
        int cnt = this.executeUpdate(table, data);
        List<Map<String, Object>> list = this.getAttachFileList(data);
        this.saveTable(new AttachFileTable(), list, data);
        return cnt;
        
    }


    ・・・ 後略 ・・・

}

 insert,updateメソッドにはArticleEditFormで入力されたデータのマップが渡ってきます。フィールドIDをキーにして値を取得すれば、それぞれのフィールドに入力された値を取得することができます。添付ファイルテーブルに入力されたリストは、"attachFileTable"というキーで取得することができます。このキーで取得されるオブジェクトの型はList<Map<String, Object>>になります。insertメソッドには渡されたマップをJSON形式にしてログ出力する処理が入っているので、マップがどのようになっているかを確認することができます。

 insertメソッドでは、渡ってきたマップをそのままArticleTableに追加しています。ArticleTableの主キーは記事ID(articleId)のみで主キーの自動生成が指定されているため、executeInsertの実行時にシーケンスなどを利用して自動生成され、その値はマップに設定されるようになっています。

 現在はArticleEditFormにスレッドIDの入力フィールドが存在しないため、スレッドIDがnullで登録されてしまいます。スレッドIDが指定されない場合、新規スレッドの1つめの記事にしたいので、スレッドIDに記事IDを設定するexecuteUpdateを行っています。

 getAttachFileListメソッドでは添付ファイルリストを取得し、その各レコードに記事IDを設定しています。その後、このメソッドで取得したリストをsaveTableメソッドに渡して保存しています。

 saveTableメソッドは、記事テーブル1レコードに結びつく添付ファイルテーブルの複数レコードを保存するときに便利なメソッドです。このメソッドは、新規レコードは記事ID以外のもう1つの主キーであるファイルIDを自動的に生成して保存し、更新されたレコードはそのまま更新して、なくなったレコードは削除するようになっています。そのため、insertメソッドだけでなくupdateメソッドでも使用できます。

 updateメソッドではArticleTableの更新を行った後、saveTableを使用してAttachFileTableを更新しています。

次のページ
データ読み込み処理の実装

この記事は参考になりましたか?

特集記事連載記事一覧

もっと読む

この記事の著者

高柳 正彦(タカヤナギ マサヒコ)

経験年数30年を超えた、システムエンジニアです。一応管理職のはずですが、未だにコードを書いています。この仕事を長々とやっていると、それなりにノウハウがたまってきます。そのノウハウをまとめたものができないかと思い、独自のフレームワークを作り始めました。そのフレームワークもそれなりに使えるようになってき...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/10043 2017/05/22 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー