/**
* @version $Id: PatternMatcher.java 1839 2014-04-16 02:33:51Z yukihiro-kinjyo $
*
* 2011/08/29 21:30:11
* @author imai
*
* Copyright 2011-2014 TIDAコンソーシアム All Rights Reserved.
*/
package com.tida_okinawa.corona.ui.controllers;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import com.tida_okinawa.corona.CoronaActivator;
import com.tida_okinawa.corona.common.CleansingNameVariable;
import com.tida_okinawa.corona.correction.controller.IListener;
import com.tida_okinawa.corona.correction.parsing.ICoronaPatternParser;
import com.tida_okinawa.corona.correction.parsing.PatternParserFactory;
import com.tida_okinawa.corona.io.IoActivator;
import com.tida_okinawa.corona.io.model.ClaimWorkDataType;
import com.tida_okinawa.corona.io.model.IClaimWorkData;
import com.tida_okinawa.corona.io.model.IClaimWorkPattern;
import com.tida_okinawa.corona.io.model.ICoronaProduct;
import com.tida_okinawa.corona.io.model.ICoronaProject;
import com.tida_okinawa.corona.io.model.IResultCoronaPattern;
import com.tida_okinawa.corona.io.model.dic.ICoronaDic;
import com.tida_okinawa.corona.io.model.dic.IPatternDic;
import com.tida_okinawa.corona.ui.UIActivator;
import com.tida_okinawa.corona.ui.data.MorphemeRecord;
import com.tida_okinawa.corona.ui.data.PatternMatcherRecord;
/**
* 構文解析のコントローラクラス
*
* @author imai
*/
public class PatternMatcher extends ClaimWorkDataController<MorphemeRecord, PatternMatcherRecord> {
/**
* 構文パターンの解析器
*/
final ICoronaPatternParser parser;
final List<ICoronaDic> dics;
/**
* ひとつのフィールドに対して構文解析する場合のコンストラクタ
*
* @param product
* 解析対象のターゲット
* @param works
* 問い合わせデータリスト
* @param listener
* 処理結果を受け取るリスナー
* @param dics
* 辞書リスト
* @param hitFlag
* 複数解析を行う場合true
*/
public PatternMatcher(ICoronaProduct product, List<IClaimWorkData> works, IListener<PatternMatcherRecord> listener, List<ICoronaDic> dics, boolean hitFlag) {
super(CleansingNameVariable.PATTERN_PARSING, product, works, ClaimWorkDataType.RESLUT_PATTERN, listener);
ICoronaProject project = IoActivator.getService().getProject(product.getProjectId());
parser = PatternParserFactory.getInstance().createPatternParser(project, product);
parser.setMaltiHit(hitFlag);
this.dics = dics;
}
/**
* 複数フィールドに対して構文解析する場合のコンストラクタ
*
* @param product
* ターゲット名
* @param work
* 解析元データ情報
* @param listener
* 処理結果を受け取るリスナー
* @param dics
* 解析に使用する辞書一覧
* @param hitFlag
* 複数解析を行う場合true
*/
public PatternMatcher(ICoronaProduct product, IClaimWorkData work, IListener<PatternMatcherRecord> listener, List<ICoronaDic> dics, boolean hitFlag) {
super(CleansingNameVariable.PATTERN_PARSING, product, work, ClaimWorkDataType.RESLUT_PATTERN, listener);
ICoronaProject project = IoActivator.getService().getProject(product.getProjectId());
parser = PatternParserFactory.getInstance().createPatternParser(project, product);
parser.setMaltiHit(hitFlag);
this.dics = dics;
}
@Override
IListener<PatternMatcherRecord> createCommitter() {
return new ClaimWorkPatternCommitter(product, typeR, dics);
}
static class ClaimWorkPatternCommitter extends ClaimWorkDataRecordCommitter<PatternMatcherRecord> {
final List<ICoronaDic> dics;
/**
* @param product
* 処理対象のターゲット
* @param typeR
* 出力データのタイプ
* @param dics
* 解析に使用する辞書一覧
*/
ClaimWorkPatternCommitter(ICoronaProduct product, ClaimWorkDataType typeR, List<ICoronaDic> dics) {
super(product, typeR);
this.dics = dics;
}
@Override
public void inputChanged(IClaimWorkData newWorkS) {
int claimId = newWorkS.getClaimId();
int fieldId = newWorkS.getFieldId();
claimWorkData = product.getClaimWorkData(claimId, typeR, fieldId);
if (claimWorkData == null) {
/* 新しく作る */
claimWorkData = IoActivator.getModelFactory().createClaimWorkPattern(claimId, fieldId, typeR, product.getProjectId(), product.getId());
try {
product.addClaimWorkData(claimWorkData);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
/* メモリ上の履歴IDを更新 */
claimWorkData.upgreadHistoryId();
/* end でNoteを更新するために、値を入れておく */
claimWorkData.setNote(newWorkS.getNote());
/* 旧データのクリア */
((IClaimWorkPattern) claimWorkData).clearRelPattern();
/* パターン辞書の更新 */
List<IPatternDic> pdics = new ArrayList<IPatternDic>();
for (ICoronaDic dic : dics) {
if (dic instanceof IPatternDic) {
pdics.add((IPatternDic) dic);
}
}
((IClaimWorkPattern) claimWorkData).addPatternDic(pdics);
}
@Override
public void receiveResult(PatternMatcherRecord result) {
((IClaimWorkPattern) claimWorkData).setClaimWorkPattern(result.getRecordId(), result.getResultPattern());
}
}
@Override
MorphemeRecord createRecordImpl(int claimId, int fieldId, int recordId, String text) {
return new MorphemeRecord(claimId, fieldId, recordId, "", text);
}
@Override
void startImpl(IProgressMonitor monitor) throws InterruptedException {
String message = "";
if (dics.size() > 0) {
monitor.beginTask("準備", dics.size());
monitor.setTaskName("辞書データ準備");
for (ICoronaDic dic : dics) {
monitor.subTask(dic.getName());
parser.addDic(dic);
monitor.worked(1);
}
monitor.done();
if (parser.getPatternMapSize() == 0) {
monitor.setCanceled(true);
message = "解析するパターンがありません。";
CoronaActivator.log(new Status(IStatus.INFO, UIActivator.PLUGIN_ID, message, null), true);
}
} else {
monitor.setCanceled(true);
message = "パターン辞書がありません";
CoronaActivator.log(new Status(IStatus.INFO, UIActivator.PLUGIN_ID, message, null), true);
}
if (monitor.isCanceled()) {
throw new InterruptedException(message);
}
};
@Override
PatternMatcherRecord execImpl(MorphemeRecord record) {
IResultCoronaPattern result = parser.parsing(record.getResult());
return new PatternMatcherRecord(record.getClaimId(), record.getFieldId(), record.getRecordId(), result);
}
}