/**
* YogaFinder.java
* Created On 2007, Nov 15, 2007 4:10:53 PM
* @author E. Rajasekar
*/
package app.astrosoft.xps.yoga;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Reader;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.drools.RuleBase;
import org.drools.RuleBaseFactory;
import org.drools.StatefulSession;
import org.drools.compiler.DroolsParserException;
import org.drools.compiler.PackageBuilder;
import org.drools.event.DebugAgendaEventListener;
import org.drools.event.DebugWorkingMemoryEventListener;
import org.drools.rule.Package;
import app.astrosoft.consts.Varga;
import app.astrosoft.core.Horoscope;
import app.astrosoft.exception.AstrosoftException;
import app.astrosoft.test.SampleHoroscopes;
import app.astrosoft.util.Timer;
import app.astrosoft.xps.XpsUtil;
import app.astrosoft.xps.beans.PlanetChart;
import app.astrosoft.xps.beans.YogaFacts;
public class YogaFinder {
private static final Logger log = Logger.getLogger(YogaFinder.class.getName());
private static String RULE_FILE = "YogaCombinations.dslr";
private static String DSL_FILE = "YogaCombinations.dsl";
private static String PACKAGE_FILE = "YogaCombinations.pkg";
private RuleBase ruleBase;
private static YogaFinder instance = null;
private YogaFinder() {
try {
Timer t = new Timer();
//final Package pkg = buildPackage();
final Package pkg = deserializePackage();
ruleBase = RuleBaseFactory.newRuleBase();
ruleBase.addPackage( pkg );
t.print("Time taken for creating rule base ");
}catch (Exception e) {
log.log(Level.SEVERE, "Exception in initializing rules " ,e);
throw new AstrosoftException("Exception in initializing rules " ,e);
}
}
public static YogaFinder getInstance(){
if (instance == null){
instance = new YogaFinder();
}
return instance;
}
public YogaResults findYogas(Horoscope h){
Timer t = new Timer();
final StatefulSession session = ruleBase.newStatefulSession();
if (log.isLoggable(Level.FINE)){
registerListener(session);
}
//final WorkingMemoryFileLogger logger = new WorkingMemoryFileLogger( session );
loadFacts(h,session);
session.fireAllRules();
//logger.writeToDisk();
YogaResults yogas = (YogaResults) session.getGlobal("yogas");
session.dispose();
t.print("FindYoga Execution time for " + h.getPersonName());
return yogas;
}
private static void loadFacts(Horoscope h, StatefulSession session) {
YogaResults yogas = new YogaResults();
session.setGlobal("yogas", yogas);
YogaFacts facts = new YogaFacts(h);
session.setGlobal("$facts", facts);
PlanetChart chart = new PlanetChart(Varga.Rasi, h.getPlanetaryInfo());
session.insert(chart);
}
private static void registerListener(StatefulSession session) {
session.addEventListener( new DebugAgendaEventListener() );
session.addEventListener( new DebugWorkingMemoryEventListener() );
}
private static Package buildPackage() throws DroolsParserException, IOException {
final Reader rule = new InputStreamReader( XpsUtil.getRuleAsStream(RULE_FILE));
final Reader dsl = new InputStreamReader( XpsUtil.getRuleAsStream(DSL_FILE));
final PackageBuilder builder = new PackageBuilder();
builder.addPackageFromDrl( rule,dsl );
// Check the builder for errors
if ( builder.hasErrors() ) {
log.severe("Compilation Errors in rule : " + builder.getErrors().toString() );
throw new AstrosoftException( "Compilation Errors in " + RULE_FILE);
}
return builder.getPackage();
}
public void serializePackage(){
ObjectOutputStream os;
try {
os = new ObjectOutputStream(new FileOutputStream(PACKAGE_FILE));
os.writeObject(buildPackage());
} catch (Exception e) {
log.log(Level.SEVERE,"Exception in Serializing Package");
}
}
private static Package deserializePackage(){
Package pkg = null;
try {
ObjectInputStream in = new ObjectInputStream(XpsUtil.getRuleAsStream(PACKAGE_FILE));
pkg = (Package) in.readObject();
}catch(Exception e){
log.log(Level.SEVERE,"Exception in Serializing Package");
throw new AstrosoftException("Exception in Serializing Package", e);
}
return pkg;
}
public static void main(String[] args) {
//YogaFinder finder = YogaFinder.getInstance();
//finder.serializePackage();
//YogaResults yogas = finder.findYogas(SampleHoroscopes.getMyHoroscope());
//System.out.println("Yogas Found --> " + yogas);
//Horoscope h = SampleHoroscopes.getMyHoroscope();
//System.out.println(h);
//System.out.println("Yogas Found --> " + h.getYogaCombinations());
// Ignore first construction
Horoscope h = SampleHoroscopes.getMyHoroscope();
Timer t = new Timer();
h = SampleHoroscopes.getMyHoroscope();
t.print("Default Horoscope construction time ");
t.reset();
h = SampleHoroscopes.getMyHoroscope();
h.calculateAll();
t.print("Full Horoscope construction time ");
}
}