/* * 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 java.io.IOException; import java.io.Reader; import java.io.StringReader; import java.util.Collection; import java.util.Properties; import org.drools.compiler.CommonTestMethodBase; import org.drools.compiler.compiler.DroolsParserException; import org.junit.Test; import org.kie.api.KieBaseConfiguration; import org.kie.internal.KnowledgeBase; import org.kie.internal.KnowledgeBaseFactory; import org.kie.internal.builder.KnowledgeBuilder; import org.kie.internal.builder.KnowledgeBuilderConfiguration; import org.kie.internal.builder.KnowledgeBuilderFactory; import org.kie.internal.builder.conf.DefaultDialectOption; import org.kie.internal.conf.SequentialOption; import org.kie.internal.conf.ShareAlphaNodesOption; import org.kie.internal.conf.ShareBetaNodesOption; import org.kie.internal.definition.KnowledgePackage; import org.kie.internal.io.ResourceFactory; import org.kie.internal.runtime.StatefulKnowledgeSession; import org.kie.api.io.ResourceType; public class FailureOnRemovalTest extends CommonTestMethodBase { private static final String LS = System.getProperty( "line.separator" ); private static final String PACKAGE = "failure_on_removal"; private static final String RULE_1 = "rule_1"; private static final String RULE_2 = "rule_2"; private static final String RULE_3 = "rule_3"; private static final boolean SHARE_BETA_NODES = true; private static final boolean NOT_SHARE_BETA_NODES = false; @Test public void testWithBetaNodeSharing() throws Exception { runTest( SHARE_BETA_NODES ); } @Test public void testWithoutBetaNodeSharing() throws Exception { runTest( NOT_SHARE_BETA_NODES ); } private void runTest(boolean shareBetaNodes) throws Exception { KnowledgeBase kbase = createKnowledgeBase( shareBetaNodes ); Collection<KnowledgePackage> rule1 = compileRule( RULE_1 ); kbase.addKnowledgePackages( rule1 ); // we need to add at least two rules. Test will not fail with only one rule. Collection<KnowledgePackage> rule2 = compileRule( RULE_2 ); kbase.addKnowledgePackages( rule2 ); kbase.removeRule( PACKAGE, RULE_1 ); StatefulKnowledgeSession ksession = createKnowledgeSession(kbase); int fired = ksession.fireAllRules(); ksession.dispose(); assertEquals( 1, fired ); Collection<KnowledgePackage> rule3 = compileRule( RULE_3 ); kbase.addKnowledgePackages( rule3 ); } private Collection<KnowledgePackage> compileRule(String name) throws DroolsParserException, IOException { KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(createKnowledgeBuilderConfiguration()); String drl = getDrl( name ); Reader drlReader = new StringReader( drl ); kbuilder.add( ResourceFactory.newReaderResource( drlReader ), ResourceType.DRL ); assertFalse( kbuilder.getErrors().toString(), kbuilder.hasErrors() ); return kbuilder.getKnowledgePackages(); } private KnowledgeBuilderConfiguration createKnowledgeBuilderConfiguration() { Properties properties = new Properties(); properties.setProperty( "drools.dialect.java.compiler", "JANINO" ); KnowledgeBuilderConfiguration kconf = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration( properties, getClass().getClassLoader() ); kconf.setOption( DefaultDialectOption.get( "java" ) ); return kconf; } private KnowledgeBase createKnowledgeBase(boolean shareBetaNodes) { KieBaseConfiguration ruleBaseConfiguration = createKnowledgeBaseConfiguration( shareBetaNodes ); return KnowledgeBaseFactory.newKnowledgeBase( ruleBaseConfiguration ); } private KieBaseConfiguration createKnowledgeBaseConfiguration(boolean shareBetaNodes) { KieBaseConfiguration kconf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration(); kconf.setOption( SequentialOption.NO ); kconf.setOption( ShareAlphaNodesOption.YES ); kconf.setOption( shareBetaNodes ? ShareBetaNodesOption.YES : ShareBetaNodesOption.NO ); return kconf; } private String getDrl(String name) { return new StringBuffer( "package " ).append( PACKAGE ).append( LS ).append( "rule '" ).append( name ).append( '\'' ).append( LS ).append( "when" ).append( LS ).append( "eval (true)" ).append( LS ).append( "then" ).append( LS ).append( "end" ).append( LS ).toString(); } }