/**
* @version $Id: DicExport.java 1839 2014-04-16 02:33:51Z yukihiro-kinjyo $
*
* 2012/10/17 17:18:27
* @author yukihiro-kinjyo
*
* Copyright 2011-2014 TIDAコンソーシアム All Rights Reserved.
*/
package com.tida_okinawa.corona.io.command;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.xml.parsers.ParserConfigurationException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.xml.sax.SAXException;
import com.tida_okinawa.corona.common.Encoding;
import com.tida_okinawa.corona.io.ArrayToXlsfile;
import com.tida_okinawa.corona.io.IoActivator;
import com.tida_okinawa.corona.io.model.dic.ICoronaDic;
import com.tida_okinawa.corona.io.model.dic.IDicItem;
import com.tida_okinawa.corona.io.model.dic.IFlucDic;
import com.tida_okinawa.corona.io.model.dic.ILabel;
import com.tida_okinawa.corona.io.model.dic.ILabelDic;
import com.tida_okinawa.corona.io.model.dic.IPatternDic;
import com.tida_okinawa.corona.io.model.dic.ISynonymDic;
import com.tida_okinawa.corona.io.model.dic.ITerm;
import com.tida_okinawa.corona.io.model.dic.IUserDic;
/**
* 辞書のエクスポートを行う.
*
* @author yukihiro-kinjyo
*/
public class DicExport implements IDicExport {
private static final String SYNONYM_HEADER = Messages.DicExport_synonymHeader;
private static final String CSV_HEADER = Messages.DicExport_csvHeader;
private static final String CSV_HEADER_USER = Messages.DicExport_csvHeaderUser;
private static final String CSV_HEADER_SYNONYM = Messages.DicExport_csvHeaderSynonym;
Map<Integer, List<ILabel>> labelMap = new HashMap<Integer, List<ILabel>>();
private String encode = Encoding.UTF_8.toString();
@Override
public IStatus export(String path, ICoronaDic dic, IProgressMonitor monitor) throws IOException, ParserConfigurationException, SAXException {
monitor.beginTask(Messages.DicExport_monitorExport, 3);
monitor.subTask(Messages.DicExport_monitorMakingData);
monitor.worked(1);
/* パターン辞書は例外 */
if (dic instanceof IPatternDic) {
PatternDicExport patternExport = new PatternDicExport(getEncode());
return patternExport.export(path, (IPatternDic) dic, monitor);
}
/* 現行 CSV のファイル名は入力ファイル名+".csv"を付与 */
String setpath = path + ".csv";
DicExportEncoder encoder = new DicExportEncoder(setpath, labelMap, encode);
/* ヘッダを構築 */
StringBuffer header = new StringBuffer(100);
/* XLS出力用 */
String xlsheader = null;
ArrayList<String> meisai = new ArrayList<String>();
if (dic instanceof ISynonymDic || dic instanceof IFlucDic)
header.append(SYNONYM_HEADER);
header.append(CSV_HEADER);
if (dic instanceof IUserDic) {
header.append(CSV_HEADER_USER);
} else if (dic instanceof ISynonymDic || dic instanceof IFlucDic) {
header.append(CSV_HEADER_SYNONYM);
} else {
header = null;
}
if (header != null) {
header.append(DicIEConstants.CRLF);
xlsheader = encoder.createobject(header);
}
monitor.subTask(Messages.DicExport_monitorOutput);
monitor.worked(1);
/* アイテムの書き込み */
for (Object obj : dic.getItems()) {
/* 新規 xlsx 出力 */
/*
* cdicは問題無いが、fdicは 1行に代表語、従属語を保持している為、 CRLFにてレコード分割を行う
*/
String retmeisai = encoder.createobject(obj);
String[] splitstrAry = retmeisai.split(DicIEConstants.CRLF);
for (int j = 0; j < splitstrAry.length; j++) {
meisai.add(splitstrAry[j]);
}
}
/* ArrayToXlsfile */
ArrayToXlsfile xArray = new ArrayToXlsfile(path);
xArray.createFile(xlsheader, meisai);
monitor.worked(1);
monitor.done();
return Status.OK_STATUS;
}
@Override
public IStatus export(String path, IUserDic dic, Set<ILabelDic> ldics, IProgressMonitor monitor) throws IOException {
/* ラベル辞書のMAPを作成 */
labelMap = new HashMap<Integer, List<ILabel>>();
if (ldics != null && ldics.size() > 0) {
for (ILabelDic ldic : ldics) {
for (IDicItem item : ldic.getLabelsRecursive(ldic.getLabels())) {
ILabel l = (ILabel) item;
for (ITerm t : l.getTerms()) {
List<ILabel> list = labelMap.get(t.getId());
if (list == null) {
list = new ArrayList<ILabel>();
labelMap.put(t.getId(), list);
}
list.add(l);
}
}
}
}
/* ユーザ辞書を渡しているので、XML解析系のExceptionが起こることはありえない */
try {
return export(path, dic, monitor);
} catch (ParserConfigurationException e) {
return new Status(IStatus.ERROR, IoActivator.PLUGIN_ID, e.getLocalizedMessage());
} catch (SAXException e) {
return new Status(IStatus.ERROR, IoActivator.PLUGIN_ID, e.getLocalizedMessage());
}
}
@Override
public void setEncode(String encode) {
this.encode = encode;
}
@Override
public String getEncode() {
return this.encode;
}
}