/* * Copyright 2011 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.drools.informer; 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.agent.conf.NewInstanceOption; import org.drools.builder.KnowledgeBuilder; import org.drools.builder.KnowledgeBuilderFactory; import org.drools.builder.ResourceType; import org.drools.informer.generator.annotations.QuestionMark; import org.drools.io.Resource; import org.drools.io.impl.ChangeSetImpl; import org.drools.io.impl.ClassPathResource; import org.drools.runtime.StatefulKnowledgeSession; import org.drools.runtime.rule.FactHandle; import org.drools.runtime.rule.Variable; import org.junit.Test; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Collection; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; public class AnnotationsTest { @Test public void testGenerateQuestionnaireWithAnnotations() throws NoSuchFieldException { KnowledgeAgentConfiguration kaConfig = KnowledgeAgentFactory.newKnowledgeAgentConfiguration(); kaConfig.setProperty( NewInstanceOption.PROPERTY_NAME , NewInstanceOption.NO.name() ); KnowledgeAgent kAgent = KnowledgeAgentFactory.newKnowledgeAgent("testAnnotationKA",kaConfig); // kAgent.setSystemEventListener( new PrintStreamSystemEventListener() ); ChangeSetImpl changeSet = new ChangeSetImpl(); ClassPathResource res1 = new ClassPathResource("org/drools/informer/informer-changeset.xml"); res1.setResourceType(ResourceType.CHANGE_SET); changeSet.setResourcesAdded(Arrays.asList((Resource) res1)); kAgent.applyChangeSet(changeSet); StatefulKnowledgeSession kSession = kAgent.getKnowledgeBase().newStatefulKnowledgeSession(); kSession.setGlobal("kAgent",kAgent); Person p1 = new Person("0001",null,18); Person p2 = new Person("0002","alan",35); assertTrue(p1.getClass().getDeclaredField("birthDate").getAnnotations()[0] instanceof QuestionMark ); assertEquals(1, p1.getClass().getDeclaredField("birthDate").getAnnotations().length); kSession.insert(p1); kSession.insert(p2); kSession.fireAllRules(); for ( Object o : kSession.getObjects() ) { System.err.println(o); } assertEquals(1, kSession.getQueryResults("getQuestionnaire", p1.getQuestionnaireId(), Variable.v).size()); assertEquals(1, kSession.getQueryResults("getQuestionnaire",p2.getQuestionnaireId(), Variable.v).size()); assertEquals(1, kSession.getQueryResults("getItem", "name", p1.getQuestionnaireId(), Variable.v ).size()); assertEquals(1, kSession.getQueryResults("getItem", "age", p1.getQuestionnaireId(), Variable.v ).size()); assertEquals(1, kSession.getQueryResults("getItem", "hobbies", p1.getQuestionnaireId(), Variable.v ).size()); assertEquals(1, kSession.getQueryResults("getItem", "luckyNumbers", p1.getQuestionnaireId(), Variable.v ).size()); assertEquals(5, kSession.getQueryResults("getAssociations", p1).size()); assertEquals(5, kSession.getQueryResults("getAssociations", p2).size()); Answer ans = new Answer("age",p1.getQuestionnaireId(),"44"); kSession.insert(ans); kSession.fireAllRules(); assertEquals(44,p1.getAge()); assertEquals(35,p2.getAge()); Answer ans2 = new Answer("name",p1.getQuestionnaireId(),"joe"); kSession.insert(ans2); kSession.fireAllRules(); assertEquals("joe",p1.getName()); assertEquals("alan",p2.getName()); Answer ans3 = new Answer("hobbies",p1.getQuestionnaireId(),"Reading"); kSession.insert(ans3); kSession.fireAllRules(); assertEquals(Arrays.asList("Reading"),p1.getHobbies()); assertNull(p2.getHobbies()); Answer ans35 = new Answer("hobbies",p1.getQuestionnaireId(),"Reading,Swimming,Sleeping"); kSession.insert(ans35); kSession.fireAllRules(); assertEquals(Arrays.asList("Reading"),p1.getHobbies()); assertNull(p2.getHobbies()); Answer ans4 = new Answer("hobbies",p1.getQuestionnaireId(),"Reading,Sleeping"); kSession.insert(ans4); kSession.fireAllRules(); assertEquals(Arrays.asList("Reading", "Sleeping"),p1.getHobbies()); assertNull(p2.getHobbies()); Answer ans5 = new Answer("luckyNumbers",p1.getQuestionnaireId(),"13"); kSession.insert(ans5); kSession.fireAllRules(); assertEquals(Arrays.asList("13"),p1.getLuckyNumbers()); assertNull(p2.getLuckyNumbers()); // Cannot change the birthdate!! The question is not relevant and thus detached Answer ans6 = new Answer("birthDate",p1.getQuestionnaireId(),"01/12/1981"); kSession.insert(ans6); kSession.fireAllRules(); assertNull(p1.getBirthDate()); assertNull(p2.getBirthDate()); Answer ans7 = new Answer("doomsHour",p1.getQuestionnaireId(),"01:32:44"); kSession.insert(ans7); kSession.fireAllRules(); try { assertEquals(new SimpleDateFormat("HH:mm:SS").parse("01:32:44"),p1.getDoomsHour()); assertNull(p2.getDoomsHour()); } catch (java.text.ParseException pe) { pe.printStackTrace(); fail(); } Answer ans8 = new Answer("name",p1.getQuestionnaireId(),"this will never change the name"); kSession.insert(ans8); kSession.fireAllRules(); assertEquals("joe",p1.getName()); assertEquals("alan",p2.getName()); Answer ans10 = new Answer("age",p1.getQuestionnaireId(),"4"); kSession.insert(ans10); kSession.fireAllRules(); assertEquals(4,p1.getAge()); assertEquals(35,p2.getAge()); // now we CAN change the date for p1, ans6 again! kSession.insert(ans6); kSession.fireAllRules(); try { assertEquals(new SimpleDateFormat("dd/MM/yyyy").parse("01/12/1981"),p1.getBirthDate()); assertNull(p2.getBirthDate()); } catch (java.text.ParseException pe) { pe.printStackTrace(); fail(); } // not for p2 Answer ans11 = new Answer("birthDate",p2.getQuestionnaireId(),"01/12/1981"); kSession.insert(ans11); kSession.fireAllRules(); try { assertEquals(new SimpleDateFormat("dd/MM/yyyy").parse("01/12/1981"),p1.getBirthDate()); assertNull(p2.getBirthDate()); } catch (java.text.ParseException pe) { pe.printStackTrace(); fail(); } Collection k = kSession.getObjects(); kSession.retract(kSession.getFactHandle(p1)); kSession.retract(kSession.getFactHandle(p2)); kSession.fireAllRules(); Collection c = kSession.getObjects(); assertEquals(0,kSession.getObjects().size()); kSession.insert(p1); kSession.fireAllRules(); Answer ans99 = new Answer("age",p1.getQuestionnaireId(),"44"); kSession.insert(ans99); kSession.fireAllRules(); assertEquals(44,p1.getAge()); System.out.println(p1); System.out.println(p2); kSession.dispose(); kAgent.dispose(); } @Test public void testDisableQuestionnaire() { KnowledgeBuilder kBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); ClassPathResource res1 = new ClassPathResource("org/drools/informer/informer-changeset.xml"); kBuilder.add(res1, ResourceType.CHANGE_SET); assertFalse( kBuilder.hasErrors() ); KnowledgeBase kBase = KnowledgeBaseFactory.newKnowledgeBase(); kBase.addKnowledgePackages( kBuilder.getKnowledgePackages() ); StatefulKnowledgeSession kSession = kBase.newStatefulKnowledgeSession(); Person p1 = new Person("0001",null,18); p1.disableSurvey(); FactHandle handle = kSession.insert(p1); kSession.fireAllRules(); assertEquals(1, kSession.getObjects().size()); p1.enableSurvey(); assertTrue( p1.isSurveyEnabled() ); kSession.update( handle, p1 ); kSession.fireAllRules(); assertEquals(1, kSession.getQueryResults("getQuestionnaire", p1.getQuestionnaireId(), Variable.v ).size()); assertEquals(1, kSession.getQueryResults("getItem", "age", p1.getQuestionnaireId(), Variable.v ).size()); Answer ans = new Answer("age",p1.getQuestionnaireId(),"44"); kSession.insert(ans); kSession.fireAllRules(); assertEquals(44,p1.getAge()); handle = kSession.getFactHandle( p1 ); p1.disableSurvey(); assertFalse(p1.isSurveyEnabled()); assertTrue( kSession.getObjects().contains( p1 )); kSession.update( handle, p1 ); kSession.fireAllRules(); assertEquals(1, kSession.getObjects().size()); // for ( Object o : kSession.getObjects() ) { // System.err.println( o ); // } } }