package edu.isi.bmkeg.lapdf.classification.ruleBased;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.DecisionTableConfiguration;
import org.drools.builder.DecisionTableInputType;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.compiler.DecisionTableFactory;
import org.drools.definition.KnowledgePackage;
import org.drools.io.Resource;
import org.drools.io.ResourceFactory;
import org.drools.runtime.StatelessKnowledgeSession;
import edu.isi.bmkeg.lapdf.bin.CommandLineTool;
import edu.isi.bmkeg.lapdf.classification.Classifier;
import edu.isi.bmkeg.lapdf.features.ChunkFeatures;
import edu.isi.bmkeg.lapdf.model.ChunkBlock;
import edu.isi.bmkeg.lapdf.model.factory.AbstractModelFactory;
/**
* Rule based classification of blocks using drools.
* @author cartic
*
*/
public class RuleBasedChunkClassifier implements Classifier<ChunkBlock> {
private static Logger logger = Logger.getLogger(RuleBasedChunkClassifier.class);
private StatelessKnowledgeSession kSession;
private AbstractModelFactory modelFactory;
private KnowledgeBase kbase;
private void reportCompiledRules(String droolsFileName,
DecisionTableConfiguration dtableconfiguration) throws IOException {
String rules = DecisionTableFactory.loadFromInputStream(ResourceFactory.newFileResource(droolsFileName).getInputStream(), dtableconfiguration);
logger.debug(rules);
}
public RuleBasedChunkClassifier(String droolsFileName,
AbstractModelFactory modelFactory) throws IOException {
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbase = KnowledgeBaseFactory.newKnowledgeBase();
if(droolsFileName.endsWith(".csv")) {
DecisionTableConfiguration dtableconfiguration =
KnowledgeBuilderFactory.newDecisionTableConfiguration();
dtableconfiguration.setInputType( DecisionTableInputType.CSV );
Resource xlsRes = ResourceFactory.newFileResource( droolsFileName );
kbuilder.add( xlsRes, ResourceType.DTABLE, dtableconfiguration);
reportCompiledRules(droolsFileName,dtableconfiguration);
} else if(droolsFileName.endsWith(".xls")) {
DecisionTableConfiguration dtableconfiguration =
KnowledgeBuilderFactory.newDecisionTableConfiguration();
dtableconfiguration.setInputType( DecisionTableInputType.XLS );
Resource xlsRes = ResourceFactory.newFileResource( droolsFileName );
kbuilder.add( xlsRes, ResourceType.DTABLE, dtableconfiguration);
reportCompiledRules(droolsFileName,dtableconfiguration);
} else if( droolsFileName.endsWith(".drl")) {
kbuilder.add(ResourceFactory.newFileResource(droolsFileName),
ResourceType.DRL);
}
if (kbuilder.hasErrors()) {
logger.error(kbuilder.getErrors());
return;
}
ArrayList<KnowledgePackage> kpkgs = new ArrayList<KnowledgePackage>(
kbuilder.getKnowledgePackages());
kbase.addKnowledgePackages(kpkgs);
this.modelFactory = modelFactory;
}
@Override
public void classify(List<ChunkBlock> blockList) {
this.kSession = kbase.newStatelessKnowledgeSession();
for (ChunkBlock chunk : blockList) {
kSession.setGlobal("chunk", chunk);
kSession.execute(new ChunkFeatures(chunk, modelFactory));
}
this.kSession = null;
}
}