/*
* Copyright 2015 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* 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.drools.compiler.integrationtests;
import org.drools.core.impl.KnowledgeBaseImpl;
import org.junit.Test;
import org.kie.api.event.rule.DebugRuleRuntimeEventListener;
import org.kie.api.io.Resource;
import org.kie.api.time.SessionPseudoClock;
import org.junit.After;
import org.junit.Before;
import org.kie.api.KieBase;
import org.kie.api.KieBaseConfiguration;
import org.kie.api.conf.EventProcessingOption;
import org.kie.api.io.ResourceType;
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.KieSessionConfiguration;
import org.kie.api.runtime.conf.ClockTypeOption;
import org.kie.internal.KnowledgeBaseFactory;
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.io.ResourceFactory;
import java.util.Collection;
import static org.junit.Assert.assertTrue;
public class DynamicEvalTest {
KieBase kbase;
KieSession session;
SessionPseudoClock clock;
Collection<? extends Object> effects;
KnowledgeBuilder kbuilder;
KieBaseConfiguration baseConfig;
KieSessionConfiguration sessionConfig;
@Before
public void setUp() throws Exception {
baseConfig = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
// use stream mode to enable proper event processing (see Drools Fusion 5.5.0 Doc "Event Processing Modes")
baseConfig.setOption( EventProcessingOption.STREAM );
kbase = KnowledgeBaseFactory.newKnowledgeBase(baseConfig);
// config
sessionConfig = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
// use a pseudo clock, which starts at 0 and can be advanced manually
sessionConfig.setOption( ClockTypeOption.get("pseudo") );
// create and return session
session = kbase.newKieSession(sessionConfig, null);
clock = session.getSessionClock();
}
public void loadPackages( Resource res, ResourceType type ) {
kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add( res, type );
KnowledgeBuilderErrors errors = kbuilder.getErrors();
if (errors.size() > 0) {
for (KnowledgeBuilderError error : errors) {
System.err.println( error );
}
throw new IllegalArgumentException( "Could not parse knowledge." );
}
}
@After
public void tearDown() {
if (session != null) {
session.dispose();
}
kbase = null;
effects = null;
clock = null;
kbuilder = null;
baseConfig = null;
sessionConfig = null;
}
@Test
public void testDynamicAdd() {
String test =
"\nrule id3" +
"\nwhen" +
"\neval(0 < 1)" + // this eval works
"\nthen" +
"\ninsertLogical( \"done\" );" +
"\nend";
loadPackages( ResourceFactory.newByteArrayResource( test.getBytes() ), ResourceType.DRL );
((KnowledgeBaseImpl)session.getKieBase()).addKnowledgePackages(kbuilder.getKnowledgePackages());
session.addEventListener( new DebugRuleRuntimeEventListener( ) );
int fired = session.fireAllRules(); // 1
System.out.println(fired);
effects = session.getObjects();
assertTrue("fired", effects.contains("done"));
// so the above works, let's try it again
String test2 =
"\nrule id4" +
"\nwhen" +
"\neval(0 == 0 )" + // this eval doesn't
"\nthen" +
"\ninsertLogical( \"done2\" );" +
"\nend";
loadPackages(ResourceFactory.newByteArrayResource(test2.getBytes()), ResourceType.DRL);
((KnowledgeBaseImpl)session.getKieBase()).addKnowledgePackages(kbuilder.getKnowledgePackages());
fired = session.fireAllRules(); // 0
System.out.println(fired);
effects = session.getObjects();
assertTrue("fired", effects.contains("done2")); // fails
}
@Test
public void testDynamicAdd2() {
String test =
"rule id3\n" +
"when\n" +
"eval(0 == 0)\n" +
"String( this == \"go\" )\n" + // this eval works
"then\n" +
"insertLogical( \"done\" );\n" +
"end\n" +
"rule id5\n" +
"when\n" +
"eval(0 == 0)\n" +
"Integer( this == 7 )\n" + // this eval works
"then\n" +
"insertLogical( \"done3\" );\n" +
"end\n";
loadPackages( ResourceFactory.newByteArrayResource( test.getBytes() ), ResourceType.DRL );
((KnowledgeBaseImpl)session.getKieBase()).addKnowledgePackages(kbuilder.getKnowledgePackages());
session.addEventListener( new DebugRuleRuntimeEventListener( ) );
session.insert( "go" );
session.insert( 5 );
session.insert( 7 );
int fired = session.fireAllRules(); // 1
System.out.println(fired);
effects = session.getObjects();
assertTrue("fired", effects.contains("done"));
// so the above works, let's try it again
String test2 =
"\nrule id4" +
"\nwhen" +
"\neval(0 == 0 )" + // this eval doesn't
"\nInteger( this == 5 )" +
"\nthen" +
"\ninsertLogical( \"done2\" );" +
"\nend";
loadPackages(ResourceFactory.newByteArrayResource(test2.getBytes()), ResourceType.DRL);
((KnowledgeBaseImpl)session.getKieBase()).addKnowledgePackages(kbuilder.getKnowledgePackages());
fired = session.fireAllRules(); // 0
System.out.println(fired);
effects = session.getObjects();
assertTrue("fired", effects.contains("done2")); // fails
for ( Object o : session.getObjects() ) {
System.out.println( o );
}
}
}