/* * Copyright 2013 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. * 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.drools.compiler.integrationtests; import java.util.Map; import org.drools.core.base.MapGlobalResolver; import org.drools.core.impl.StatelessKnowledgeSessionImpl; import org.junit.Test; import org.kie.api.io.ResourceType; import org.kie.api.runtime.KieSession; 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; import org.kie.internal.runtime.StatelessKnowledgeSession; import org.kie.internal.utils.KieHelper; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; public class GlobalsTest { @Test public void testGlobalAccess() { String drl = "import org.drools.core.base.MapGlobalResolver;\n" + "global java.lang.String myGlobal;\n" + "global String unused; \n" ; KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add(ResourceFactory.newByteArrayResource(drl.getBytes()), ResourceType.DRL); KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); StatefulKnowledgeSession session1 = kbase.newStatefulKnowledgeSession(); String sample = "default string"; // Testing 1. System.out.println("Start testing 1."); session1.setGlobal("myGlobal", "Testing 1"); session1.insert(sample); session1.fireAllRules(); Map.Entry[] entries1 = ((MapGlobalResolver) session1.getGlobals()).getGlobals(); assertEquals( 1, entries1.length ); assertEquals( entries1[0].getValue(), "Testing 1" ); assertEquals( 1, session1.getGlobals().getGlobalKeys().size() ); assertTrue( session1.getGlobals().getGlobalKeys().contains("myGlobal") ); session1.dispose(); // Testing 2. System.out.println("Start testing 2."); StatelessKnowledgeSession session2 = session1.getKieBase().newStatelessKnowledgeSession(); session2.setGlobal("myGlobal", "Testing 2"); session2.execute(sample); Map.Entry[] entries2 = ((MapGlobalResolver) session2.getGlobals()).getGlobals(); assertEquals(1, entries2.length); assertEquals( entries2[0].getValue(), "Testing 2" ); assertEquals( 1, session2.getGlobals().getGlobalKeys().size() ); assertTrue( session2.getGlobals().getGlobalKeys().contains("myGlobal") ); // Testing 3. System.out.println("Start testing 3."); StatefulKnowledgeSession session3 = ((StatelessKnowledgeSessionImpl) session2).newWorkingMemory(); session3.insert(sample); session3.fireAllRules(); Map.Entry[] entries3 = ((MapGlobalResolver) session3.getGlobals()).getGlobals(); assertEquals( 1, entries3.length ); assertEquals( entries3[0].getValue(), "Testing 2" ); assertEquals( 1, session3.getGlobals().getGlobalKeys().size() ); assertTrue( session3.getGlobals().getGlobalKeys().contains("myGlobal") ); session3.setGlobal("myGlobal", "Testing 3 Over"); entries3 = ((MapGlobalResolver) session3.getGlobals()).getGlobals(); assertEquals(1, entries3.length); assertEquals( entries3[0].getValue(), "Testing 3 Over" ); assertEquals( 1, session3.getGlobals().getGlobalKeys().size() ); assertTrue( session3.getGlobals().getGlobalKeys().contains("myGlobal") ); session3.dispose(); // Testing 4. System.out.println("Start testing 4."); StatefulKnowledgeSession session4 = ((StatelessKnowledgeSessionImpl) session2).newWorkingMemory(); session4.setGlobal("myGlobal", "Testing 4"); session4.insert(sample); session4.fireAllRules(); Map.Entry[] entries4 = ((MapGlobalResolver) session4.getGlobals()).getGlobals(); assertEquals(1, entries4.length); assertEquals( entries4[0].getValue(), "Testing 4" ); assertEquals( 1, session4.getGlobals().getGlobalKeys().size() ); assertTrue( session4.getGlobals().getGlobalKeys().contains("myGlobal") ); session4.dispose(); } @Test public void testEvalNullGlobal() { // RHBPMS-4649 String str = "import org.drools.compiler.Cheese\n" + "global Boolean b\n" + "rule R when\n" + " eval(b)\n" + "then\n" + "end\n"; KieSession ksession = new KieHelper().addContent( str, ResourceType.DRL ).build().newKieSession(); ksession.setGlobal( "b", null ); assertEquals( 0, ksession.fireAllRules() ); } }