/** * @version $Id: SynonymDic.java 997 2013-06-05 01:58:11Z yukihiro-kinjyo $ * * 2011/08/03 * @author yukihiro-kinjo * * Copyright 2011-2014 TIDAコンソーシアム All Rights Reserved. */ package com.tida_okinawa.corona.io.dam.hibernate; import java.io.Serializable; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.TreeMap; import org.eclipse.core.runtime.IProgressMonitor; import org.hibernate.HibernateException; import org.hibernate.Session; import com.tida_okinawa.corona.io.bean.DicSynonymBean; import com.tida_okinawa.corona.io.bean.DicTableBean; import com.tida_okinawa.corona.io.bean.RelSynonymBean; import com.tida_okinawa.corona.io.bean.RelSynonymPKBean; import com.tida_okinawa.corona.io.bean.SynonymTblBean; import com.tida_okinawa.corona.io.model.dic.ICoronaDic; import com.tida_okinawa.corona.io.model.dic.IDependSub; import com.tida_okinawa.corona.io.model.dic.IDicItem; import com.tida_okinawa.corona.io.model.dic.IUserDic; import com.tida_okinawa.corona.io.model.dic.abstraction.AbstractSynonymDic; import com.tida_okinawa.corona.io.model.dic.impl.SynonymItem; import com.tida_okinawa.corona.io.model.dic.impl.SynonymSubItem; import com.tida_okinawa.corona.io.model.dic.impl.Term; import com.tida_okinawa.corona.io.util.CoronaIoUtils; /** * @author yukihiro-kinjo * */ public final class SynonymDic extends AbstractSynonymDic { /** * アイテムの更新を行ったかどうか */ private boolean bRefreshRecords = false; /** * @param id * @param name * @param parentId */ public SynonymDic(int id, String name, int parentId) { super(id, name, null); this.addParentId(parentId); } /** * @param id * ID * @param name * 辞書名 * @param lasted * 更新日時 * @param parentId * 親辞書ID */ public SynonymDic(int id, String name, Date lasted, Set<Integer> parentId) { super(id, name, lasted, parentId); } @Override protected boolean doCommit(boolean bRecords, IProgressMonitor monitor) { Session session = IoService.getInstance().getSession(); try { @SuppressWarnings("unchecked") List<DicTableBean> dicTableList = session.createQuery("from DicTableBean where dicId = :dicId") //$NON-NLS-1$ .setInteger("dicId", this.getId()).list(); //$NON-NLS-1$ if (dicTableList != null && dicTableList.size() > 0) { for (DicTableBean dic : dicTableList) { dic.setParentId(CoronaIoUtils.intListToString(this.getParentIds())); dic.setDicName(this.getName()); /* トランザクション開始 */ session.beginTransaction(); session.save(dic); session.flush(); /* トランザクションコミット */ session.getTransaction().commit(); } } } catch (HibernateException e) { e.printStackTrace(); return false; } finally { if (session.getTransaction().isActive()) { /* トランザクションロールバック */ session.getTransaction().rollback(); } } if (!bRecords) { return true; } int work = 0; int count = 0; if (delItems != null) { count += delItems.size(); } if (items != null) { count += items.size(); } monitor.beginTask("辞書の更新", count); //$NON-NLS-1$ /* 代表語削除 */ if ((this.delItems != null) && (this.delItems.size() > 0)) { for (IDicItem i : this.delItems) { SynonymItem synonym = (SynonymItem) i; try { session.beginTransaction(); // セッションより、主キーを元にデータを取り出す。 DicSynonymBean insertDs = (DicSynonymBean) session.get(DicSynonymBean.class, synonym.getId()); if (insertDs == null) { insertDs = new DicSynonymBean(); insertDs.setSynonymId(synonym.getId()); } insertDs.setDicId(getId()); insertDs.setItemId(synonym.getMain().getId()); insertDs.setInactive(true); session.save(insertDs); session.flush(); session.getTransaction().commit(); } catch (HibernateException e) { e.printStackTrace(); } finally { if (session.getTransaction().isActive()) { session.getTransaction().rollback(); } } try { List<SynonymSubItem> list = new ArrayList<SynonymSubItem>(); /* UI上で削除されているかもしれない従属語をリストへ追加 */ list.addAll(synonym.getDelSubs()); /* 代表語に紐づく従属語をリストへ追加 */ for (Entry<Integer, IDependSub> entry : synonym.getSubs().entrySet()) { list.add((SynonymSubItem) entry.getValue()); } /* 代表語に紐づく従属語のINACTIVEをtrueにする */ for (SynonymSubItem delSub : list) { session.beginTransaction(); // セッションより、主キーを元にデータを取り出す。 SynonymTblBean insertSt = (SynonymTblBean) session.get(SynonymTblBean.class, delSub.getId()); if (insertSt == null) { insertSt = new SynonymTblBean(); insertSt.setId(delSub.getId()); } insertSt.setDicId(getId()); insertSt.setItemId(delSub.getTerm().getId()); insertSt.setInactive(true); session.save(insertSt); session.flush(); session.getTransaction().commit(); } } catch (HibernateException e) { e.printStackTrace(); } finally { if (session.getTransaction().isActive()) { session.getTransaction().rollback(); } } monitor.worked(work++); } } for (IDicItem item : this.items) { /* 変更済か、ID無しの場合 */ if (item.isDirty() || item.getId() == SynonymItem.UNSAVED_ID) { SynonymItem synonym = (SynonymItem) item; try { session.beginTransaction(); /* 代表語追加 */ DicSynonymBean insertDs = (DicSynonymBean) session.get(DicSynonymBean.class, synonym.getId()); if (insertDs == null) { insertDs = new DicSynonymBean(); insertDs.setSynonymId(synonym.getId()); } insertDs.setDicId(getId()); insertDs.setItemId(synonym.getMain().getId()); insertDs.setInactive(false); session.save(insertDs); session.flush(); session.getTransaction().commit(); DicSynonymBean ds = (DicSynonymBean) session .createQuery("from DicSynonymBean where synonymId = (select max(synonymId) from DicSynonymBean " //$NON-NLS-1$ + "where dicId = :paramDicId and itemId = :paramItemId))").setInteger("paramDicId", getId()) //$NON-NLS-1$ //$NON-NLS-2$ .setInteger("paramItemId", synonym.getMain().getId()).uniqueResult(); //$NON-NLS-1$ if (ds != null) { synonym.setId(ds.getSynonymId()); } else { synonym.setId(0); } } catch (HibernateException e) { synonym.setId(-1); e.printStackTrace(); } finally { if (session.getTransaction().isActive()) { session.getTransaction().rollback(); } } /* 従属語削除 */ for (SynonymSubItem delSub : synonym.getDelSubs()) { int subId = delSub.getId(); try { session.beginTransaction(); SynonymTblBean insertSt = (SynonymTblBean) session.get(SynonymTblBean.class, subId); if (insertSt == null) { insertSt = new SynonymTblBean(); insertSt.setId(delSub.getId()); } insertSt.setDicId(getId()); insertSt.setItemId(delSub.getTerm().getId()); insertSt.setInactive(true); session.save(insertSt); session.flush(); session.getTransaction().commit(); } catch (HibernateException e) { e.printStackTrace(); } finally { if (session.getTransaction().isActive()) { session.getTransaction().rollback(); } } if (subId < 1) { subId = 0; try { SynonymTblBean dt = (SynonymTblBean) session.createQuery("from SynonymTblBean where id = (select max(id) from SynonymTblBean " //$NON-NLS-1$ + "where dicId = :paramDicId and itemId = :paramItemId))").setInteger("paramDicId", getId()) //$NON-NLS-1$ //$NON-NLS-2$ .setInteger("paramItemId", delSub.getTerm().getId()).uniqueResult(); //$NON-NLS-1$ if (dt != null) { subId = dt.getId(); } } catch (HibernateException e) { subId = -1; e.printStackTrace(); } } try { if (delSub.isInActive() == false) { session.beginTransaction(); Serializable pKey = new RelSynonymPKBean(subId, synonym.getId()); // セッションより、主キーを元にデータを取り出す。 RelSynonymBean insertRs = (RelSynonymBean) session.get(RelSynonymBean.class, pKey); if (insertRs == null) { insertRs = new RelSynonymBean(); insertRs.setPrimaryKey((RelSynonymPKBean) pKey); } insertRs.setStatus(delSub.getLevel()); session.save(insertRs); session.flush(); session.getTransaction().commit(); } } catch (HibernateException e) { subId = -1; e.printStackTrace(); } finally { if (session.getTransaction().isActive()) { session.getTransaction().rollback(); } } } synonym.getDelSubs().clear(); /* 従属語追加 */ for (Entry<Integer, IDependSub> entry : synonym.getSubs().entrySet()) { SynonymSubItem sub = (SynonymSubItem) entry.getValue(); int subId = sub.getId(); try { session.beginTransaction(); SynonymTblBean insertSt = (SynonymTblBean) session.get(SynonymTblBean.class, subId); if (insertSt == null) { insertSt = new SynonymTblBean(); insertSt.setId(sub.getId()); } insertSt.setDicId(getId()); insertSt.setItemId(sub.getTerm().getId()); insertSt.setInactive(sub.isInActive()); session.save(insertSt); session.flush(); session.getTransaction().commit(); } catch (HibernateException e) { e.printStackTrace(); } finally { if (session.getTransaction().isActive()) { session.getTransaction().rollback(); } } if (subId < 1) { try { SynonymTblBean dt = (SynonymTblBean) session.createQuery("from SynonymTblBean where id = (select max(id) from SynonymTblBean " //$NON-NLS-1$ + "where dicId = :paramDicId and itemId = :paramItemId))").setInteger("paramDicId", getId()) //$NON-NLS-1$ //$NON-NLS-2$ .setInteger("paramItemId", sub.getTerm().getId()).uniqueResult(); //$NON-NLS-1$ if (dt != null) { subId = dt.getId(); } } catch (HibernateException e) { subId = -1; e.printStackTrace(); } } try { if (sub.isInActive() == false) { session.beginTransaction(); Serializable pKey = new RelSynonymPKBean(subId, synonym.getId()); RelSynonymBean insertRs = (RelSynonymBean) session.get(RelSynonymBean.class, pKey); if (insertRs == null) { insertRs = new RelSynonymBean(); insertRs.setPrimaryKey((RelSynonymPKBean) pKey); } insertRs.setStatus(sub.getLevel()); session.save(insertRs); session.flush(); session.getTransaction().commit(); } } catch (HibernateException e) { subId = -1; e.printStackTrace(); } finally { if (session.getTransaction().isActive()) { session.getTransaction().rollback(); } } sub.setId(subId); sub.setDirty(false); } item.setDirty(false); } monitor.worked(work++); } if (delItems != null) { delItems.clear(); } monitor.done(); return true; } @Override public boolean update() { try { Session session = IoService.getInstance().getSession(); String hql = "from DicTableBean as dt where dt.dicId = :dicIdValue and dt.inactive = false"; //$NON-NLS-1$ @SuppressWarnings("unchecked") List<DicTableBean> result = session.createQuery(hql).setInteger("dicIdValue", this.getId()).list(); //$NON-NLS-1$ for (DicTableBean item : result) { this._name = item.getDicName(); this._creationTime = item.getCreationTime(); this._lasted = item.getDate(); } bRefreshRecords = false; return true; } catch (HibernateException e) { e.printStackTrace(); return false; } } @Override public boolean updateRecords() { bRefreshRecords = true; Map<Integer, IDicItem> tmpMap = new TreeMap<Integer, IDicItem>(); /* 従属語用一時保管マップ */ Map<Integer, Map<Integer, IDependSub>> subMapMap = new TreeMap<Integer, Map<Integer, IDependSub>>(); /* 代表表記情報取得 */ List<ICoronaDic> parentDics = ((IoService) IoService.getInstance()).getDictionary(getParentIds()); if (items == null) { items = new ArrayList<IDicItem>(); } try { String hql = "from RelSynonymBean rel, DicSynonymBean dic, SynonymTblBean sub " //$NON-NLS-1$ + "where dic.dicId = sub.dicId and dic.synonymId = rel.primaryKey.synonymId and rel.primaryKey.id = sub.id and dic.inactive = false and " //$NON-NLS-1$ + "sub.inactive = false and dic.dicId = :dicId"; //$NON-NLS-1$ Session session = IoService.getInstance().getSession(); @SuppressWarnings("unchecked") List<Object[]> result = session.createQuery(hql).setInteger("dicId", getId()).list(); //$NON-NLS-1$ for (Object[] resultItem : result) { RelSynonymBean relSynonymItem = (RelSynonymBean) resultItem[0]; DicSynonymBean dicSynonymItem = (DicSynonymBean) resultItem[1]; SynonymTblBean synonymTblItem = (SynonymTblBean) resultItem[2]; int synonymId = dicSynonymItem.getSynonymId(); SynonymItem item = null; /* 代表語設定 */ int itemId = dicSynonymItem.getItemId(); Term main = null; if (parentDics.size() > 0) { for (ICoronaDic pdic : parentDics) { if (pdic instanceof IUserDic) { main = (Term) ((UserDic) pdic).getItem(itemId); if (main != null) { break; } } } } if (main == null) { /* 代表語が取得できなかった場合は、後続の処理をスキップ */ continue; } item = (SynonymItem) tmpMap.get(synonymId); if (item == null) { item = new SynonymItem(main); item.setId(synonymId); item.setDicId(getId()); tmpMap.put(synonymId, item); } /* 従属語設定 */ int subId = synonymTblItem.getId(); if (subId > 0) { int subItemId = synonymTblItem.getItemId(); Term term = null; if (parentDics.size() > 0) { for (ICoronaDic pdic : parentDics) { if (pdic instanceof IUserDic) { term = (Term) ((UserDic) pdic).getItem(subItemId); if (term != null) { break; } } } } if (term == null) { // ERROR } Map<Integer, IDependSub> subMap = subMapMap.get(synonymId); if (subMap == null) { subMap = new HashMap<Integer, IDependSub>(); subMapMap.put(synonymId, subMap); item.setSubs(subMap); } SynonymSubItem sub = (SynonymSubItem) subMap.get(subItemId); if (sub == null) { sub = new SynonymSubItem(subId, term, item); } item.getSubs().put(subItemId, sub); sub.setDicId(item.getComprehensionDicId()); sub.setLevel(relSynonymItem.getStatus()); sub.setDirty(false); } item.setDirty(false); } /* Memo モデルのフィールドのListインスタンスは、置き換えしない。 Morishima */ items.clear(); items.addAll(tmpMap.values()); /* 削除用オブジェクトをクリア */ this.delItems.clear(); setDirty(false); String getDtHql = "from DicTableBean where dicId = :dicId"; //$NON-NLS-1$ @SuppressWarnings("unchecked") List<DicTableBean> dtList = session.createQuery(getDtHql).setInteger("dicId", this.getId()).list(); //$NON-NLS-1$ Date updDate = new Date(); if (dtList != null && dtList.size() > 0) { updDate = dtList.get(0).getDate(); } this.setLasted(updDate); return true; } catch (HibernateException e) { bRefreshRecords = false; e.printStackTrace(); return false; } } @Override public void setItems(List<IDicItem> items) { if (!bRefreshRecords) { updateRecords(); bRefreshRecords = true; } super.setItems(items); } @Override public int getItemCount() { if (items == null) { try { Session session = IoService.getInstance().getSession(); String hql = "select count(*) from DicSynonymBean where dicId= :dicId and inactive=:inactive"; //$NON-NLS-1$ Object count = session.createQuery(hql).setInteger("dicId", getId()).setBoolean("inactive", false).uniqueResult(); //$NON-NLS-1$ //$NON-NLS-2$ return count == null ? 0 : Integer.parseInt(count.toString()); } catch (HibernateException e) { e.printStackTrace(); return 0; } } return items.size(); } @Override public List<IDicItem> getItems() { if (!bRefreshRecords) { updateRecords(); } return super.getItems(); } @Override public void addItem(IDicItem item) { if (!bRefreshRecords) { updateRecords(); } super.addItem(item); } @Override public void removeItem(IDicItem item) { if (!bRefreshRecords) { updateRecords(); } super.removeItem(item); } /** * アイテム取得 * * @param id * @return ITerm */ @Override public IDicItem getItem(int id) { if (!bRefreshRecords || (itemsForSearch == null)) { itemsForSearch = new TreeMap<Integer, IDicItem>(); List<IDicItem> items = getItems(); for (IDicItem item : items) { itemsForSearch.put(item.getId(), item); } } return itemsForSearch.get(id); } /** * 外部辞書インポート * * @param path * */ @Deprecated @Override protected void importDicDam(String path) { } }