/** * @version $Id: TemplateFactory.java 997 2013-06-05 01:58:11Z yukihiro-kinjyo $ * * 2012/11/27 0:44:18 * @author s.takuro * * Copyright 2011-2014 TIDAコンソーシアム All Rights Reserved. */ package com.tida_okinawa.corona.io.dam.hibernate; import java.util.ArrayList; import java.util.List; import java.util.Set; import org.eclipse.core.runtime.IProgressMonitor; import org.hibernate.HibernateException; import org.hibernate.Session; import com.tida_okinawa.corona.io.bean.TemplatePatternBean; import com.tida_okinawa.corona.io.model.dic.ITemplateItem; import com.tida_okinawa.corona.io.model.dic.abstraction.AbstractTemplate; import com.tida_okinawa.corona.io.model.dic.impl.TemplateItem; /** * @author s.takuro * #187 構文パターン自動生成 */ public class TemplateFactory extends AbstractTemplate { private static TemplateFactory _instance = new TemplateFactory(); /** * ひな型オブジェクト生成クラスのインスタンスを取得する * * @return iDicFactoryを実装したDicFactoryのインスタンス */ public static TemplateFactory getInstance() { return _instance; } /** * ひな型オブジェクト生成クラス */ public TemplateFactory() { super(); } /* **************************************** * ICoronaComponent */ @Override public boolean update() { return false; } @Override public boolean commit(boolean bRecords, IProgressMonitor monitor) { /* プログレス・モニタの初期設定 */ int count = 0; count += addItems.size(); if (removeItems != null) { count += removeItems.size(); } if (items != null) { count += items.size(); } if (monitor != null) monitor.beginTask("ひな型の更新", count); //$NON-NLS-1$ /* Insert */ items.addAll(addItems); boolean result = insertRecords(items); addItems.clear(); if (monitor != null) monitor.worked(items.size()); /* * Remove * ⇒ 削除に成功したアイテムのみリストから消去 */ items.removeAll(deleteRecords(removeItems)); removeItems.clear(); if (monitor != null) monitor.worked(removeItems.size()); /* itemsの再構築 */ updateRecords(); if (monitor != null) monitor.done(); return result; } @Override public boolean commit(IProgressMonitor monitor) { /* bRecordsによる処理制限は不要なのでtrue/falseは不問 */ return commit(true, monitor); } /* **************************************** * ITemplateFactory */ @Override public List<ITemplateItem> getItems() { updateRecords(); return items; } @Override public Set<ITemplateItem> getAddItems() { return addItems; } @Override public boolean updateRecords() { List<ITemplateItem> list = new ArrayList<ITemplateItem>(); if (items == null) { items = new ArrayList<ITemplateItem>(); } try { Session session = IoService.getInstance().getSession(); /* データを取得 */ /* TemplateDao.getRecords(); を置換する。 */ String strHQL = "FROM TemplatePatternBean WHERE inactive=false"; //$NON-NLS-1$ /* HQL実行 */ @SuppressWarnings("unchecked") List<TemplatePatternBean> beanList = session.createQuery(strHQL).list(); if (beanList != null) { /* 取得結果編集 */ for (TemplatePatternBean rs : beanList) { ITemplateItem template = null; int id = rs.getId(); /* 既存データかチェック */ if (items.size() > 0) { for (ITemplateItem t : items) { if (t.getId() == id) { template = t; break; } } } /* 存在しないデータの場合 */ if (template == null) { template = new TemplateItem(rs.getTemplateId(), rs.getName(), rs.getTemplate(), rs.getTypeId(), rs.isParts()); template.setId(id); } /* 存在するデータの場合 */ else { template.setTemplateId(rs.getTemplateId()); template.setName(rs.getName()); template.setText(rs.getTemplate()); template.setPatternType(rs.getTypeId()); template.setParts(rs.isParts()); } template.setDirty(false); list.add(template); } /* 構築したリストに入れ替える */ items.clear(); items.addAll(list); } } catch (HibernateException e) { e.printStackTrace(); return false; } return true; } @Override public int getItemCount() { return 0; } /** * ひな型更新 * * @param records * 登録対象のアイテム * @return true */ private static boolean insertRecords(List<ITemplateItem> records) { //TemplateDaoから移設 if (records.size() == 0) return true; try { TemplatePatternBean tpBean = new TemplatePatternBean(); Session session = IoService.getInstance().getSession(); for (ITemplateItem rec : records) { if (rec.isDirty()) { final ITemplateItem ptn = rec; tpBean.setId(ptn.getId()); tpBean.setTemplateId(ptn.getTemplateId()); tpBean.setName(ptn.getName()); tpBean.setTemplate(ptn.getText()); tpBean.setTypeId(ptn.getPatternType()); tpBean.setParts(ptn.isParts()); tpBean.setInactive(false); try { /* トランザクション開始 */ session.beginTransaction(); /* INSERT or UPDATE */ session.save(tpBean); session.flush(); /* トランザクションコミット */ session.getTransaction().commit(); } finally { if (session.getTransaction().isActive()) { /* トランザクションロールバック */ session.getTransaction().rollback(); } } if (ptn.getId() == ITemplateItem.UNSAVED_ID) { /* INSERT */ /* 登録したアイテムのID取得 */ String getIdSql = "Select Max(id) From template_pattern"; //$NON-NLS-1$ int id = 0; try { @SuppressWarnings("unchecked") List<Object> idList = session.createSQLQuery(getIdSql).list(); if (idList != null && idList.size() > 0) { Object rs = idList.get(0); id = Integer.parseInt(rs.toString()); } } catch (HibernateException e) { id = -1; } if (id > 0) { ptn.setId(id); } } } } } catch (HibernateException e) { //jdbc版では処理なし } return true; } /** * ひな型削除 * * @param records * 削除対象のアイテム * @return 削除に成功したアイテムのリスト */ private static List<ITemplateItem> deleteRecords(List<ITemplateItem> records) { List<ITemplateItem> ret = new ArrayList<ITemplateItem>(); if (records.size() == 0) return ret; try { Session session = IoService.getInstance().getSession(); for (ITemplateItem rec : records) { TemplatePatternBean tpBean = (TemplatePatternBean) session.get(TemplatePatternBean.class, rec.getId()); if (tpBean != null) { try { /* トランザクション開始 */ session.beginTransaction(); session.delete(tpBean); session.flush(); /* トランザクションコミット */ session.getTransaction().commit(); ret.add(rec); } catch (HibernateException e) { e.printStackTrace(); } finally { if (session.getTransaction().isActive()) { /* トランザクションロールバック */ session.getTransaction().rollback(); } } } } } catch (HibernateException e) { //jdbc版では処理なし } return ret; } }