package org.fastcatsearch.ir.dictionary;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.apache.lucene.store.InputStreamDataInput;
import org.apache.lucene.store.OutputStreamDataOutput;
import org.fastcatsearch.ir.io.CharVector;
import org.fastcatsearch.ir.io.DataInput;
import org.fastcatsearch.ir.io.DataOutput;
import org.fastcatsearch.ir.util.CharVectorHashSet;
import org.fastcatsearch.plugin.analysis.AnalysisPluginSetting.ColumnSetting;
public class SetDictionary extends SourceDictionary {
private Set<CharVector> set;
public SetDictionary() {
this(false);
}
public SetDictionary(boolean ignoreCase) {
super(ignoreCase);
set = new CharVectorHashSet(ignoreCase);
}
public SetDictionary(CharVectorHashSet set, boolean ignoreCase) {
super(ignoreCase);
this.set = set;
}
public SetDictionary(File file, boolean ignoreCase) {
super(ignoreCase);
if(!file.exists()){
set = new CharVectorHashSet(ignoreCase);
logger.error("사전파일이 존재하지 않습니다. file={}", file.getAbsolutePath());
return;
}
InputStream is;
try {
is = new FileInputStream(file);
readFrom(is);
is.close();
} catch (IOException e) {
logger.error("", e);
}
}
public SetDictionary(InputStream is, boolean ignoreCase){
super(ignoreCase);
try {
readFrom(is);
} catch (IOException e) {
logger.error("", e);
}
}
@Override
public void addEntry(String keyword, Object[] value, List<ColumnSetting> columnList) {
keyword = keyword.trim();
if (keyword.length() > 0) {
CharVector cv = new CharVector(keyword).removeWhitespaces();
set.add(cv);
}
}
public Set<CharVector> getUnmodifiableSet() {
return Collections.unmodifiableSet(set);
}
public Set<CharVector> set() {
return set;
}
public void setSet(Set<CharVector> set) {
this.set = set;
}
public boolean contains(CharVector key){
return set.contains(key);
}
@Override
public void writeTo(OutputStream out) throws IOException {
DataOutput output = new OutputStreamDataOutput(out);
Iterator<CharVector> valueIter = set.iterator();
//write size of set
output.writeInt(set.size());
//write values
for(;valueIter.hasNext();) {
CharVector value = valueIter.next();
output.writeString(value.toString());
}
}
@Override
public void readFrom(InputStream in) throws IOException {
DataInput input = new InputStreamDataInput(in);
set = new CharVectorHashSet(ignoreCase);
int size = input.readInt();
for(int entryInx=0;entryInx < size; entryInx++) {
set.add(new CharVector(input.readString()));
}
}
@Override
public void addSourceLineEntry(String line) {
addEntry(line, null, null);
}
@Override
public void reload(Object object) throws IllegalArgumentException {
if(object != null && object instanceof SetDictionary){
SetDictionary setDictionary = (SetDictionary) object;
this.set = setDictionary.set();
}else{
throw new IllegalArgumentException("Reload dictionary argument error. argument = " + object);
}
}
@Override
public void clear() {
super.clear();
set.clear();
}
}