/**
* Most of the code in the Qalingo project is copyrighted Hoteia and licensed
* under the Apache License Version 2.0 (release version 0.8.0)
* http://www.apache.org/licenses/LICENSE-2.0
*
* Copyright (c) Hoteia, 2012-2014
* http://www.hoteia.com - http://twitter.com/hoteia - contact@hoteia.com
*
*/
package org.hoteia.qalingo.core.rule.util;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.hoteia.qalingo.core.domain.RuleRepository;
import org.hoteia.qalingo.core.service.RuleRepositoryService;
import org.kie.api.KieBase;
import org.kie.api.KieServices;
import org.kie.api.io.Resource;
import org.kie.api.io.ResourceType;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.kie.internal.builder.KnowledgeBuilder;
import org.kie.internal.builder.KnowledgeBuilderError;
import org.kie.internal.builder.KnowledgeBuilderErrors;
import org.kie.internal.builder.KnowledgeBuilderFactory;
import org.kie.internal.definition.KnowledgePackage;
import org.kie.internal.io.ResourceFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* <p>
* <a href="RuleUtil.java.html"><i>View Source</i></a>
* </p>
*
* @author Denis Gosset <a href="http://www.hoteia.com"><i>Hoteia.com</i></a>
*
*/
@Service("ruleUtil")
@Transactional
public class RuleUtil {
private final Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
protected RuleRepositoryService ruleRepositoryService;
protected KieContainer container = null;
public KieContainer getKieContainer() throws IOException {
if(container == null){
KieServices ks = KieServices.Factory.get();
container = ks.getKieClasspathContainer();
}
return container;
}
public void handleRuleSession(List<Object> objects){
try {
KieBase kbase = getKieContainer().getKieBase("kbaseQalingo");
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
List<RuleRepository> activeRules = ruleRepositoryService.findActiveRuleRepositories();
for (Iterator<RuleRepository> iterator = activeRules.iterator(); iterator.hasNext();) {
RuleRepository ruleRepository = (RuleRepository) iterator.next();
String ruleDRL = ruleRepository.getRuleString().toString();
Resource ruleResource = ResourceFactory.newReaderResource((Reader) new StringReader(ruleDRL));
kbuilder.add(ruleResource, ResourceType.DRL);
}
if (kbuilder.hasErrors()) {
KnowledgeBuilderErrors errors = kbuilder.getErrors();
if(errors != null){
for (Iterator<KnowledgeBuilderError> iterator = errors.iterator(); iterator.hasNext();) {
KnowledgeBuilderError knowledgeBuilderError = (KnowledgeBuilderError) iterator.next();
logger.error(knowledgeBuilderError.getMessage());
}
}
throw new RuntimeException("Unable to compile drl");
}
Collection<KnowledgePackage> pkgs = kbuilder.getKnowledgePackages();
// kbase.addKnowledgePackages(pkgs);
kbase.getKiePackages().addAll(pkgs);
KieSession kSession = container.newKieSession();
for (Iterator<Object> iterator = objects.iterator(); iterator.hasNext();) {
Object object = (Object) iterator.next();
kSession.insert(object);
}
kSession.fireAllRules();
} catch (Exception e) {
logger.error("UrlParams Filter & HandleUrlParameters failed, e");
}
}
}