/** * @version $Id: CleansingSynonymHandler.java 1840 2014-04-16 05:38:34Z yukihiro-kinjyo $ * * 2011/08/09 16:22:54 * @author takayuki-matsumoto * * Copyright 2011-2014 TIDAコンソーシアム All Rights Reserved. */ package com.tida_okinawa.corona.ui.handlers; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.handlers.HandlerUtil; import com.tida_okinawa.corona.CoronaActivator; import com.tida_okinawa.corona.common.CleansingNameVariable; import com.tida_okinawa.corona.internal.ui.util.Kernel; import com.tida_okinawa.corona.internal.ui.views.model.IUIProduct; import com.tida_okinawa.corona.internal.ui.views.model.IUIWork; import com.tida_okinawa.corona.internal.ui.views.model.impl.CoronaModel; import com.tida_okinawa.corona.io.IoActivator; import com.tida_okinawa.corona.io.model.ClaimWorkDataType; import com.tida_okinawa.corona.io.model.IClaimData; import com.tida_okinawa.corona.io.model.IClaimWorkData; import com.tida_okinawa.corona.io.model.ICoronaDicPri; import com.tida_okinawa.corona.io.model.ICoronaProduct; import com.tida_okinawa.corona.io.model.ICoronaProject; import com.tida_okinawa.corona.io.model.dic.ICoronaDic; import com.tida_okinawa.corona.io.model.dic.IFlucDic; import com.tida_okinawa.corona.io.model.dic.ISynonymDic; import com.tida_okinawa.corona.io.model.table.IFieldHeader; import com.tida_okinawa.corona.ui.ViewUtil; import com.tida_okinawa.corona.ui.controllers.SynonymController; import com.tida_okinawa.corona.ui.controllers.SynonymControllerForUI; import com.tida_okinawa.corona.ui.wizards.CleansingWizard; /** * 同義語補正実行・結果表示 * * @author takayuki-matsumoto, imai */ public class CleansingSynonymHandler extends AbstractCleansingHandler { List<ICoronaDic> checkedDics; @Override public Object execute(ExecutionEvent event) throws ExecutionException { super.execute(event); /* ウィザードを表示  */ Shell shell = HandlerUtil.getActiveShell(event); IClaimWorkData data = getUIWork().getObject(); if (data == null) { CoronaActivator.debugLog("ICoronaObjectをUIWorkから取得できませんでした"); throw new IllegalStateException("ゆらぎ・同義語補正処理に必要な入力データが取得できませんでした"); } Kernel.startSuppressSleep(); try { List<CleansingWizard> wizards = new ArrayList<CleansingWizard>(); for (IUIProduct uiProduct : getProducts()) { /* 辞書優先度情報は、出力先処理結果から取ってくる */ CleansingWizard wizard = new CleansingWizard(dstWorkList, EXEC_TYPE, uiProduct); WizardDialog d = new WizardDialog(shell, wizard); if (d.open() != Dialog.OK) { return false; } wizards.add(wizard); } int i = 0; for (IUIProduct uiProduct : getProducts()) { CleansingWizard wizard = wizards.get(i++); List<IClaimData> claims = uiProduct.getObject().getClaimDatas(); ICoronaProduct product = uiProduct.getObject(); for (IClaimData claim : claims) { int claimId = claim.getId(); Collection<Integer> fieldIds = product.getMiningFields(claimId); for (Integer fieldId : fieldIds) { IClaimWorkData srcWork = null; /* クレームワークデータを探す */ for (IClaimWorkData work : srcWorkList) { if (work.getClaimId() == claimId && work.getFieldId() == fieldId) { srcWork = work; break; } } if (!(srcWork != null && product.getId() == srcWork.getProductId())) { continue; } /* 処理対象のデータが存在する */ IClaimWorkData dstWork = null; if (wizard.isFieldSelect()) { /* フィールド毎の指定あり */ for (IClaimWorkData work : dstWorkList) { if ((work.getClaimId() == claimId) && (work.getFieldId() == fieldId)) { dstWork = work; break; } } if (dstWork == null) { /* 対応する辞書リストが取得できない場合、後続の処理を行わない */ continue; } /* 辞書を取得 */ checkedDics = getDictionary(wizard.getFieldDicPriorityList(dstWork)); } else { /* 共通の場合 */ checkedDics = getDictionary(wizard.getDicPriorityList()); } try { stepFields(uiProduct, srcWork); // 同義語補正実行 } catch (InterruptedException e1) { e1.printStackTrace(); IClaimWorkData cwd = product.getClaimWorkData(claimId, EXEC_TYPE, fieldId); if (cwd != null) { /* * 失敗したので日付情報が入っていない。日付を入れるためにupdate。 * これで、途中経過までのデータが表示できる。 * TODO ただし、処理前に前回結果を破棄しないので処理結果が混ざる可能性あり。 * ウィザードで辞書が選択されていないか、辞書が空のときは実行できなくしたので、 * 全部が前の結果にはならないはず */ cwd.update(); } } if (dstWork != null && dstWork.getWorkdataId() == 0 && dstWork.getLasted() != null) { /* 処理結果後のクレームワークデータでマップを置き換える */ // Memo dstWorkを作成した時、ターゲットに追加してしまえば置き換えずに済むのでは? IClaimWorkData cwd = product.getClaimWorkData(claimId, EXEC_TYPE, fieldId); wizard.updateDicPriMap(dstWork, cwd); } } } /* 保存処理 */ wizard.saveDicPriList(); // TODO dstWorkListじゃなくて、実際に処理したIClaimWorkDataの一覧から取得する if (dstWorkList.size() > 0) { IClaimWorkData targetWork = dstWorkList.get(dstWorkList.size() - 1); IClaimWorkData work = getClaimWorkData(uiProduct, EXEC_TYPE, targetWork.getFieldId(), targetWork.getClaimId()); if (work != null && work.getLasted() != null) { /* ダイアログメッセージ用に処理した列名を取得 */ StringBuilder dialogMessage = new StringBuilder(); dialogMessage.append(CleansingNameVariable.FLUC_SYNONYM); dialogMessage.append("が終了しました。\n\n対象列:\n"); for (int ch = 0; ch < (dstWorkList.size()); ch++) { IClaimData claimData = IoActivator.getService().getClaimData(work.getClaimId()); IFieldHeader header = claimData.getFieldInformation(dstWorkList.get(ch).getFieldId()); dialogMessage.append("  ["); dialogMessage.append(header.getName()); dialogMessage.append("]\n"); } /* 処理結果ダイアログを表示 */ MessageDialog.openInformation(shell, CleansingNameVariable.FLUC_SYNONYM + "終了", dialogMessage.toString()); } else { CoronaActivator.debugLog("workdata is null"); } } } } catch (InvocationTargetException e1) { e1.printStackTrace(); } catch (PartInitException e) { e.printStackTrace(); } finally { Kernel.stopSuppressSleep(); } ViewUtil.refreshProjectExplorer(0); return null; } private static final ClaimWorkDataType EXEC_TYPE = ClaimWorkDataType.CORRECTION_SYNONYM; @Override ClaimWorkDataType getExecType() { return EXEC_TYPE; } private static List<ICoronaDic> getDictionary(List<ICoronaDicPri> priList) { List<ICoronaDic> list = new ArrayList<ICoronaDic>(); /* 後に渡したものが優先されるため、辞書を逆から設定  */ for (int i = priList.size(); i > 0; i--) { ICoronaDicPri pri = priList.get(i - 1); if (!pri.isInActive()) { list.add(IoActivator.getService().getDictionary(pri.getDicId())); } } return list; } private void stepFields(IUIProduct uiProduct, IClaimWorkData cwd) throws InvocationTargetException, InterruptedException, PartInitException { IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); IUIWork uiWork = CoronaModel.INSTANCE.getWork(uiProduct, cwd); SynonymController controller = new SynonymControllerForUI(uiProduct, uiWork, null, checkedDics); NewProgress newProgress = new NewProgress(); newProgress.addRunnable(controller); Shell shell = window.getShell(); ProgressMonitorDialog dialog = new ProgressMonitorDialog(shell); /* 同義語補正実行 */ long s = System.currentTimeMillis(); dialog.run(true, true, newProgress); CoronaActivator.debugLog("ゆらぎ・同義語補正時間: " + (System.currentTimeMillis() - s) + "mSec"); } @Override protected boolean isEnabled(ClaimWorkDataType type) { switch (type) { case DEPENDENCY_STRUCTURE: return true; default: return false; } } List<ICoronaDic> getDics(IUIProduct uiProduct) { // 同義語辞書 ターゲット + プロジェクト共通 ICoronaProduct product = uiProduct.getObject(); List<ICoronaDic> dics = product.getDictionarys(ISynonymDic.class); dics.addAll(product.getDictionarys(IFlucDic.class)); ICoronaProject project = IoActivator.getService().getProject(product.getProjectId()); dics.addAll(project.getDictionarys(ISynonymDic.class)); dics.addAll(project.getDictionarys(IFlucDic.class)); return dics; } static class NewProgress implements IRunnableWithProgress { List<IRunnableWithProgress> runs = new ArrayList<IRunnableWithProgress>(); public void addRunnable(IRunnableWithProgress runnable) { if (runnable != null) { runs.add(runnable); } } @Override public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { for (IRunnableWithProgress run : runs) { run.run(monitor); } } } }