package org.picketlink.idm.drools;
import javax.enterprise.inject.Produces;
import javax.inject.Inject;
import org.kie.api.cdi.KSession;
import org.kie.api.runtime.KieSession;
import org.picketlink.idm.permission.spi.PermissionVoter;
//import javax.servlet.ServletContext;
//import org.apache.deltaspike.servlet.api.Web;
/**
* Produces a DroolsPermissionVoter if a security rules drl file is found.
*
* @author Shane Bryzak
*
*/
public class PermissionVoterProducer {
private static final String SECURITY_RULES = "/WEB-INF/classes/security/security-rules.drl";
/* THIS DOESN'T WORK YET - SEE DROOLS-299*/
@Inject
@KSession("ksession1")
KieSession kSession;
private DroolsPermissionVoter voter;
/**
* This is all a nasty hack for now until Drools 6 supports injection of rules based on
* a configuration defined within a war file - see DROOLS-299 in JIRA
*/
/*@Inject
public void init(@Web ServletContext servletContext) {
KieServices kServices = KieServices.Factory.get();
KieResources kieResources = kServices.getResources();
KieFileSystem kieFileSystem = kServices.newKieFileSystem();
InputStream in = servletContext.getResourceAsStream(SECURITY_RULES);
String path = "src/main/resources/optaplanner-kie-namespace/" + SECURITY_RULES;
kieFileSystem.write(path, kieResources.newInputStreamResource(in, "UTF-8"));
KieBuilder kieBuilder = kServices.newKieBuilder(kieFileSystem);
kieBuilder.buildAll();
Results results = kieBuilder.getResults();
if (results.hasMessages(Message.Level.ERROR)) {
StringBuilder sb = new StringBuilder();
for (Message msg : results.getMessages(Message.Level.ERROR)) {
sb.append(msg.getText());
}
throw new RuntimeException("Error parsing security rules: " + sb.toString());
}
KieContainer kieContainer = kServices.newKieContainer(kieBuilder.getKieModule().getReleaseId());
//KieContainer kContainer = kServices.getKieClasspathContainer();
//KieBase kBase = kieContainer.getKieBase("security");
//KieSession ks = kc.newKieSession("ksession1");
KieBaseConfiguration kieBaseConfiguration = kServices.newKieBaseConfiguration();
KieBase kBase = kieContainer.newKieBase(kieBaseConfiguration);
voter = new DroolsPermissionVoter(kBase);
}*/
@Produces
public PermissionVoter createPermissionVoter() {
return voter;
}
}