/* * 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.incrementalcompilation; import static org.junit.Assume.assumeTrue; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.drools.compiler.TurtleTestCategory; import org.junit.Assert; import org.junit.experimental.categories.Category; import org.kie.api.definition.KiePackage; import org.kie.api.io.ResourceType; import org.kie.internal.KnowledgeBase; import org.kie.internal.KnowledgeBaseFactory; import org.kie.internal.builder.KnowledgeBuilder; import org.kie.internal.builder.KnowledgeBuilderFactory; import org.kie.internal.io.ResourceFactory; import org.kie.internal.runtime.StatefulKnowledgeSession; /** * Abstract class for tests that test adding and removing rules at runtime. */ @Category(TurtleTestCategory.class) public abstract class AbstractAddRemoveRulesTest { protected static final String PKG_NAME_TEST = "com.rules"; protected static final String RULE1_NAME = "R1"; protected static final String RULE2_NAME = "R2"; protected static final String RULE3_NAME = "R3"; // TODO - remove these two methods - they are also in TestContext protected KnowledgeBuilder createKnowledgeBuilder(final KnowledgeBase kbase, final String drl) { final KnowledgeBuilder kbuilder; if (kbase == null) { kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); } else { kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(kbase); } kbuilder.add(ResourceFactory.newByteArrayResource(drl.getBytes()), ResourceType.DRL); if (kbuilder.hasErrors()) { Assert.fail(kbuilder.getErrors().toString()); } return kbuilder; } protected StatefulKnowledgeSession buildSessionInSteps(final String... drls) { if (drls == null || drls.length == 0) { return KnowledgeBaseFactory.newKnowledgeBase().newStatefulKnowledgeSession(); } else { String drl = drls[0]; final KnowledgeBuilder kbuilder = createKnowledgeBuilder(null, drl); final KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); final StatefulKnowledgeSession kSession = kbase.newStatefulKnowledgeSession(); kSession.fireAllRules(); for (int i = 1; i < drls.length; i++) { drl = drls[i]; final KnowledgeBuilder kbuilder2 = createKnowledgeBuilder(kSession.getKieBase(), drl); kSession.getKieBase().addKnowledgePackages(kbuilder2.getKnowledgePackages()); } return kSession; } } protected void runAddRemoveTests(final String rule1, final String rule2, final String rule1Name, final String rule2Name, final Object[] facts, final Map<String, Object> additionalGlobals) { final List<List<TestOperation>> testPlans = AddRemoveTestBuilder.getTestPlan(rule1, rule2, rule1Name, rule2Name, facts); runAddRemoveTests(testPlans, additionalGlobals); } protected void runAddRemoveTests(final List<List<TestOperation>> testPlans, final Map<String, Object> additionalGlobals) { for (List<TestOperation> testPlan : testPlans) { runAddRemoveTest(testPlan, additionalGlobals); } } protected StatefulKnowledgeSession runAddRemoveTest(final List<TestOperation> testOperations, final Map<String, Object> additionalGlobals) { final List resultsList = new ArrayList(); final Map<String, Object> sessionGlobals = new HashMap<String, Object>(); if (additionalGlobals != null) { sessionGlobals.putAll(additionalGlobals); } sessionGlobals.put("list", resultsList); final TestContext testContext = new TestContext(PKG_NAME_TEST, sessionGlobals, resultsList); testContext.executeTestOperations(testOperations); return testContext.getSession(); } protected int getRulesCount(final KnowledgeBase kBase) { int result = 0; for (KiePackage kiePackage : kBase.getKiePackages()) { result += kiePackage.getRules().size(); } return result; } }