サムネイルサイズの調整
現状では動画のプレーヤーサイズに対し、画像のサムネイルが小さすぎます。そこで、画像のサムネイルのサイズをプレーヤーのサイズに合わせます。サムネイルサイズの調整は「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」を修正してください。
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を更新しています。
