package fst;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.core.WhitespaceTokenizer;
import org.apache.lucene.analysis.synonym.SynonymFilterFactory;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.util.FilesystemResourceLoader;
import org.apache.lucene.store.DataInput;
import org.apache.lucene.store.InputStreamDataInput;
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.CharsRef;
import org.apache.lucene.util.IntsRef;
import org.apache.lucene.util.NumericUtils;
import org.apache.lucene.util.Version;
import org.apache.lucene.util.fst.Builder;
import org.apache.lucene.util.fst.ByteSequenceOutputs;
import org.apache.lucene.util.fst.FST;
import org.apache.lucene.util.fst.Util;
class FSTDic{
	 FST fst ;
	 FST.BytesReader fstReader;
	public FSTDic() throws IOException{
		File file=new File("fst");
		if(file.exists()){
			fst=load(file);
		}else{
			List words=new ArrayList();
			words.add("中国");
			words.add("中国人");
			words.add("中国人民");
			words.add("中国人民解放军");
			fst=build(words);
		}
		fstReader = fst.getBytesReader();
	}
	
	public void save() throws IOException{
		fst.save(new File("fst"));
	}
	
	public FST load(File file) throws IOException{
		return new FST(new InputStreamDataInput(new FileInputStream("fst")),ByteSequenceOutputs.getSingleton() );
	}
	
	private  FST build(List words) throws IOException{
		 ByteSequenceOutputs outputs = ByteSequenceOutputs.getSingleton();
		 Builder builder = new Builder(FST.INPUT_TYPE.BYTE4, outputs);
		 final IntsRef scratchIntsRef = new IntsRef();
		 BytesRef output = new BytesRef(4);
		
		 for(String word: words){
			 NumericUtils.intToPrefixCodedBytes(word.length(), 0, output);
			 builder.add(Util.toUTF32(word, scratchIntsRef), BytesRef.deepCopyOf(output));
		 }
		 return builder.finish();
	}
	
	public boolean contains(String word) throws IOException{
		 FST.Arc scratchArc = new FST.Arc();
		 int bufUpto=0,buflen=word.length();
		 BytesRef pendingOutput=fst.outputs.getNoOutput();
		 BytesRef matchOutput = null;
		 fst.getFirstArc(scratchArc);
		 while(bufUpto 
  

(随记,稍后补全……)