/*
* Copyright 2010 JBoss Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jboss.drools.guvnor.importgenerator.example.domain;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.agent.KnowledgeAgent;
import org.drools.agent.KnowledgeAgentConfiguration;
import org.drools.agent.KnowledgeAgentFactory;
import org.drools.command.Command;
import org.drools.command.CommandFactory;
import org.drools.definition.KnowledgePackage;
import org.drools.io.ResourceChangeScannerConfiguration;
import org.drools.io.ResourceFactory;
import org.drools.io.impl.ResourceChangeScannerImpl;
import org.drools.runtime.ExecutionResults;
import org.drools.runtime.StatefulKnowledgeSession;
import org.drools.runtime.StatelessKnowledgeSession;
public class KagentTestApp {
private boolean changeScannerInitialised = false;
private Map<String, KnowledgeAgent> cache = new HashMap<String, KnowledgeAgent>();
public enum KnowledgeResourceType {
DRL, PKG
}
public static void main(String[] args) {
new KagentTestApp().run();
}
public void run() {
initChangeScanner();
Set<String> packageNames = new HashSet<String>();
packageNames.add("ping.test/1.0.0-SNAPSHOT");
if (true) {
KnowledgeAgent kagent = getKnowledgeAgent("ping.test/1.0.0-SNAPSHOT");
StatelessKnowledgeSession s = kagent.newStatelessKnowledgeSession();
// List facts=new ArrayList();
// facts.add("ping");
s.execute(Arrays.asList(CommandFactory.newGetObjects(), CommandFactory.newFireAllRules()));
// for (Object x : facts) {
// System.out.println("fact-"+x);
// }
}
if (false) {
StatefulKnowledgeSession s = createStatefulSession(packageNames);
// List facts=new ArrayList();
// facts.add("ping");
org.drools.runtime.rule.FactHandle fact1 = s.insert("ping");
s.fireAllRules();
System.out.println(fact1.toString());
// for (Object x : facts) {
// System.out.println(x);
// }
s.dispose();
}
ResourceFactory.getResourceChangeNotifierService().stop();
ResourceFactory.getResourceChangeScannerService().stop();
}
public void initChangeScanner() {
// if (!changeScannerInitialised) {
// ResourceChangeScannerConfiguration c = ResourceFactory.getResourceChangeScannerService().newResourceChangeScannerConfiguration();
// c.setProperty("drools.resource.scanner.interval", "10");
// ((ResourceChangeScannerImpl) ResourceFactory.getResourceChangeScannerService()).reset();
// ResourceFactory.getResourceChangeNotifierService().start();
// ResourceFactory.getResourceChangeScannerService().start();
// ResourceFactory.getResourceChangeScannerService().configure(c);
// }
// changeScannerInitialised = true;
}
public KnowledgeAgentConfiguration getConfig() {
KnowledgeAgentConfiguration c = KnowledgeAgentFactory.newKnowledgeAgentConfiguration();
c.setProperty("drools.agent.scanDirectories", "true");
c.setProperty("drools.agent.scanResources", "true");
c.setProperty("drools.agent.newInstance", "true");
return c;
}
public StatelessKnowledgeSession createSession(Set<String> packageNames) {
return getKnowledgeBase(packageNames).newStatelessKnowledgeSession();
}
public StatefulKnowledgeSession createStatefulSession(Set<String> packageNames) {
return getKnowledgeBase(packageNames).newStatefulKnowledgeSession();
}
private KnowledgeBase getKnowledgeBase(Set<String> packageNames, boolean ignorMissing) {
KnowledgeBase kb = KnowledgeBaseFactory.newKnowledgeBase();
Collection<KnowledgePackage> kpl = new ArrayList<KnowledgePackage>();
for (String packageName : packageNames) {
try {
KnowledgeAgent kagent = getKnowledgeAgent(packageName);
kb.addKnowledgePackages(kagent.getKnowledgeBase().getKnowledgePackages());
} catch (java.lang.IllegalArgumentException e) {
// boolean packageDoesntExist=e.getMessage().startsWith("The directory")
// && e.getMessage().endsWith("is not valid");
if (ignorMissing) {
continue;
} else
throw new RuntimeException(e.getMessage(), e);
}
}
return kb;
}
private KnowledgeBase getKnowledgeBase(Set<String> packageNames) {
return getKnowledgeBase(packageNames, false);
}
private KnowledgeAgent getKnowledgeAgent(String packageName) {
if (cache.get(packageName) == null) {
cache.put(packageName, createKnowledgeAgent(packageName));
}
return cache.get(packageName);
}
private KnowledgeAgent createKnowledgeAgent(String packageName) {
initChangeScanner();
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
KnowledgeAgent kagent = KnowledgeAgentFactory.newKnowledgeAgent("KAgent for " + packageName, kbase, getConfig());
kagent.applyChangeSet(ResourceFactory.newReaderResource(new StringReader(getChangeSet(packageName))));
return kagent;
}
private String getChangeSet(String packageName) {
// packageName=toCustomPackage(packageName, ".");
String url = "http://localhost:8080/brms/org.drools.guvnor.Guvnor/package/";
KnowledgeResourceType type = KnowledgeResourceType.PKG;// valueOf(System.getProperty("PKG"));
StringBuffer xml = new StringBuffer();
xml.append("<change-set xmlns='http://drools.org/drools-5.0/change-set'");
xml.append(" xmlns:xs='http://www.w3.org/2001/XMLSchema-instance'");
xml.append(" xs:schemaLocation='http://drools.org/drools-5.0/change-set http://anonsvn.jboss.org/repos/labs/labs/jbossrules/trunk/drools-api/src/main/resources/change-set-1.0.0.xsd' >");
xml.append(" <add> ");
xml.append(" <resource source='" + url + packageName + "' type='" + type.name() + "' />");
xml.append(" </add> ");
xml.append("</change-set>");
return xml.toString();
}
}