package org.osbl.agent.logic;
import org.concern.Controller;
import org.concern.ControllerLookup;
import org.concern.LoaderException;
import org.concern.Subject;
import org.concern.SubjectNotFoundException;
import org.concern.controller.LoaderFactory;
import org.conform.BeanMeta;
import org.conform.hibernate.HibernateEnvironment;
import org.osbl.agent.model.Rule;
import org.osbl.agent.model.RuleContext;
/**
* The Class SubjectRuntimeContext.
*
* @author Sebastian Nozzi.
*/
public class SubjectRuntimeContext extends RuntimeContext {
/* (non-Javadoc)
* @see org.osbl.agent.logic.RuntimeContext#populateRuleContext(org.osbl.agent.model.RuleContext, java.lang.Object)
*/
public void populateRuleContext(RuleContext rtc, Object concernSubject) {
Subject subject = (Subject) concernSubject;
Controller controller = ControllerLookup.getInstance().getController(subject.getProcess());
HibernateEnvironment.getInstance().beginTransaction();
org.concern.controller.Loader loader = new LoaderFactory().getLoader(controller);
try {
subject.setSubject(loader.load(subject.getSubjectId()));
} catch (LoaderException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SubjectNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
HibernateEnvironment.getInstance().endTransaction();
}
rtc.setTargetObject(subject.getSubject());
rtc.put(rtc.SUBJECT_ID, subject.getSubjectId());
rtc.put(rtc.PROCESS_NAME_KEY, subject.getProcess());
BeanMeta beanMeta = new BeanMeta(subject.getSubject().getClass());
rtc.put(rtc.BEAN_META, beanMeta);
}
/* (non-Javadoc)
* @see org.osbl.agent.logic.RuntimeContext#ruleIsApplicable(org.osbl.agent.model.Rule, java.lang.Object)
*/
public boolean ruleIsApplicable(Rule rule, Object concernSubject) {
if(concernSubject instanceof Subject == false)
return false;
Subject subject = (Subject) concernSubject;
String processNameInSubject = subject.getProcess();
String processNameInRule = (String) rule.getMetaInformation().get(
RuleContext.PROCESS_NAME_KEY);
return processNameInSubject.equals(processNameInRule);
}
}
|