001    /**
002     * Copyright 2005-2011 The Kuali Foundation
003     *
004     * Licensed under the Educational Community License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     * http://www.opensource.org/licenses/ecl2.php
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package org.kuali.rice.krms.test;
017    
018    import org.apache.commons.lang.builder.ToStringBuilder;
019    import org.apache.commons.lang.builder.ToStringStyle;
020    import org.joda.time.DateTime;
021    import org.junit.Before;
022    import org.junit.Test;
023    import org.kuali.rice.krms.api.KrmsApiServiceLocator;
024    import org.kuali.rice.krms.api.KrmsConstants;
025    import org.kuali.rice.krms.api.engine.EngineResults;
026    import org.kuali.rice.krms.api.engine.ExecutionFlag;
027    import org.kuali.rice.krms.api.engine.ExecutionOptions;
028    import org.kuali.rice.krms.api.engine.Facts;
029    import org.kuali.rice.krms.api.engine.SelectionCriteria;
030    import org.kuali.rice.krms.api.repository.action.ActionDefinition;
031    import org.kuali.rice.krms.api.repository.agenda.AgendaDefinition;
032    import org.kuali.rice.krms.api.repository.agenda.AgendaItemDefinition;
033    import org.kuali.rice.krms.api.repository.context.ContextDefinition;
034    import org.kuali.rice.krms.api.repository.proposition.PropositionDefinition;
035    import org.kuali.rice.krms.api.repository.proposition.PropositionParameter;
036    import org.kuali.rice.krms.api.repository.proposition.PropositionParameterType;
037    import org.kuali.rice.krms.api.repository.proposition.PropositionType;
038    import org.kuali.rice.krms.api.repository.rule.RuleDefinition;
039    import org.kuali.rice.krms.api.repository.term.TermDefinition;
040    import org.kuali.rice.krms.api.repository.term.TermSpecificationDefinition;
041    import org.kuali.rice.krms.api.repository.type.KrmsAttributeDefinition;
042    import org.kuali.rice.krms.api.repository.type.KrmsTypeAttribute;
043    import org.kuali.rice.krms.api.repository.type.KrmsTypeDefinition;
044    import org.kuali.rice.krms.api.repository.type.KrmsTypeRepositoryService;
045    import org.kuali.rice.krms.framework.engine.expression.ComparisonOperator;
046    import org.kuali.rice.krms.framework.type.ValidationActionType;
047    import org.kuali.rice.krms.framework.type.ValidationActionTypeService;
048    import org.kuali.rice.krms.framework.type.ValidationRuleType;
049    import org.kuali.rice.krms.framework.type.ValidationRuleTypeService;
050    import org.kuali.rice.krms.impl.repository.ActionAttributeBo;
051    import org.kuali.rice.krms.impl.repository.ActionBo;
052    import org.kuali.rice.krms.impl.repository.ActionBoService;
053    import org.kuali.rice.krms.impl.repository.ActionBoServiceImpl;
054    import org.kuali.rice.krms.impl.repository.AgendaAttributeBo;
055    import org.kuali.rice.krms.impl.repository.AgendaBo;
056    import org.kuali.rice.krms.impl.repository.AgendaBoService;
057    import org.kuali.rice.krms.impl.repository.AgendaBoServiceImpl;
058    import org.kuali.rice.krms.impl.repository.AgendaItemBo;
059    import org.kuali.rice.krms.impl.repository.ContextAttributeBo;
060    import org.kuali.rice.krms.impl.repository.ContextBo;
061    import org.kuali.rice.krms.impl.repository.ContextBoService;
062    import org.kuali.rice.krms.impl.repository.ContextBoServiceImpl;
063    import org.kuali.rice.krms.impl.repository.KrmsAttributeDefinitionBo;
064    import org.kuali.rice.krms.impl.repository.KrmsAttributeDefinitionService;
065    import org.kuali.rice.krms.impl.repository.KrmsRepositoryServiceLocator;
066    import org.kuali.rice.krms.impl.repository.KrmsTypeBoServiceImpl;
067    import org.kuali.rice.krms.impl.repository.PropositionBoService;
068    import org.kuali.rice.krms.impl.repository.PropositionBoServiceImpl;
069    import org.kuali.rice.krms.impl.repository.RuleAttributeBo;
070    import org.kuali.rice.krms.impl.repository.RuleBo;
071    import org.kuali.rice.krms.impl.repository.RuleBoService;
072    import org.kuali.rice.krms.impl.repository.RuleBoServiceImpl;
073    import org.kuali.rice.krms.impl.repository.TermBoService;
074    import org.kuali.rice.krms.impl.repository.TermBoServiceImpl;
075    import org.kuali.rice.krms.impl.util.KRMSServiceLocatorInternal;
076    import org.kuali.rice.test.BaselineTestCase.BaselineMode;
077    import org.kuali.rice.test.BaselineTestCase.Mode;
078    import org.springframework.transaction.annotation.Transactional;
079    
080    import java.util.ArrayList;
081    import java.util.Collections;
082    import java.util.HashMap;
083    import java.util.HashSet;
084    import java.util.LinkedList;
085    import java.util.List;
086    import java.util.Map;
087    import java.util.Set;
088    
089    import static org.junit.Assert.assertEquals;
090    import static org.junit.Assert.assertNotNull;
091    import static org.junit.Assert.assertTrue;
092    
093    /**
094     * Validation Integration Test
095     * @author Kuali Rice Team (rice.collab@kuali.org)
096     */
097    @BaselineMode(Mode.CLEAR_DB)
098    public class ValidationIntegrationTest extends AbstractBoTest {
099    
100        private static final String EVENT_ATTRIBUTE = "Event";
101    //    private static final String TERM_NAME = "totalProposalDollarAmount";
102        private static final String TERM_NAME = "campusCodeTermSpec";
103    
104        private static final String CONTEXT_NAME = "ValidationITContext";
105        private static final String WARNING_MESSAGE = "Warning Message.";
106        private static final String ERROR_MESSAGE = "Error Message.";
107        private static final String VALIDATION_ACTION_TYPE_SERVICE = "validationActionTypeService";
108        private static final String VALIDATION_RULE_TYPE_SERVICE = "validationRuleTypeService";
109    
110        private KrmsTypeRepositoryService krmsTypeRepositoryService;
111        private KrmsAttributeDefinitionService krmsAttributeDefinitionService;
112        private PropositionBoService propositionBoService;
113        private TermBoService termBoService;
114        private ContextBoService contextRepository;
115        private AgendaBoService agendaBoService;
116        private RuleBoService ruleBoService;
117        private ActionBoService actionBoService;
118    
119    
120            @Before
121            public void setup() {
122    
123            krmsAttributeDefinitionService = KrmsRepositoryServiceLocator.getKrmsAttributeDefinitionService();
124            krmsTypeRepositoryService = new KrmsTypeBoServiceImpl();
125            ((KrmsTypeBoServiceImpl)krmsTypeRepositoryService).setBusinessObjectService(getBoService());
126    
127            // like RepositoryCreateAndExecuteIntegrationTest
128            propositionBoService = new PropositionBoServiceImpl();
129            ((PropositionBoServiceImpl)propositionBoService).setBusinessObjectService(getBoService());
130            termBoService = new TermBoServiceImpl();
131            ((TermBoServiceImpl)termBoService).setBusinessObjectService(getBoService());
132            contextRepository = new ContextBoServiceImpl();
133            ((ContextBoServiceImpl)contextRepository).setBusinessObjectService(getBoService());
134            agendaBoService = new AgendaBoServiceImpl();
135            ((AgendaBoServiceImpl)agendaBoService).setBusinessObjectService(getBoService());
136            ((AgendaBoServiceImpl)agendaBoService).setAttributeDefinitionService(krmsAttributeDefinitionService);
137            ruleBoService = new RuleBoServiceImpl();
138            ((RuleBoServiceImpl)ruleBoService).setBusinessObjectService(getBoService());
139            actionBoService = new ActionBoServiceImpl();
140            ((ActionBoServiceImpl)actionBoService).setBusinessObjectService(getBoService());
141        }
142    
143        @Transactional
144        @Test
145        public void testValidWarning() {
146            KrmsAttributeTypeDefinitionAndBuilders ruleDefs = createKrmsAttributeTypeDefinitionAndBuilders(
147                    ValidationRuleTypeService.VALIDATIONS_RULE_TYPE_CODE_ATTRIBUTE, KrmsConstants.KRMS_NAMESPACE,
148                    ValidationRuleType.VALID.toString(), true, ValidationRuleType.VALID.toString(),
149                    ValidationRuleType.VALID.getCode(), VALIDATION_RULE_TYPE_SERVICE, krmsTypeRepositoryService, 1);
150            KrmsAttributeTypeDefinitionAndBuilders actionDef = createKrmsAttributeTypeDefinitionAndBuilders(
151                    ValidationActionTypeService.VALIDATIONS_ACTION_TYPE_CODE_ATTRIBUTE, KrmsConstants.KRMS_NAMESPACE,
152                    ValidationActionType.WARNING.toString(), true, ValidationActionType.WARNING.toString(),
153                    ValidationActionType.WARNING.getCode(), VALIDATION_ACTION_TYPE_SERVICE, krmsTypeRepositoryService, 1);
154            KrmsAttributeTypeDefinitionAndBuilders actionMessageDef = createKrmsAttributeTypeDefinitionAndBuilders(
155                    ValidationActionTypeService.VALIDATIONS_ACTION_MESSAGE_ATTRIBUTE, KrmsConstants.KRMS_NAMESPACE,
156                    "Valdiation Action Message", true, "Valdiation Action Message",
157                    WARNING_MESSAGE, VALIDATION_ACTION_TYPE_SERVICE, krmsTypeRepositoryService, 1);
158    
159            List<KrmsAttributeTypeDefinitionAndBuilders> actionDefs = new LinkedList<KrmsAttributeTypeDefinitionAndBuilders>();
160            actionDefs.add(actionDef);
161            actionDefs.add(actionMessageDef);
162            ContextBo contextBo = createContext();
163            RuleBo ruleBo = createRuleWithAction(ruleDefs, actionDefs, contextBo, WARNING_MESSAGE);
164            createAgenda(ruleBo, contextBo, createEventAttributeDefinition());
165    
166            EngineResults results = engineExecute();
167            assertTrue(results.getAttribute(ValidationActionTypeService.VALIDATIONS_ACTION_ATTRIBUTE) == null);
168        }
169    
170        @Transactional
171        @Test
172        public void testInvalidWarning() {
173            KrmsAttributeTypeDefinitionAndBuilders ruleDefs = createKrmsAttributeTypeDefinitionAndBuilders(
174                    ValidationRuleTypeService.VALIDATIONS_RULE_TYPE_CODE_ATTRIBUTE, KrmsConstants.KRMS_NAMESPACE,
175                    ValidationRuleType.INVALID.toString(), true, ValidationRuleType.INVALID.toString(),
176                    ValidationRuleType.INVALID.getCode(), VALIDATION_RULE_TYPE_SERVICE, krmsTypeRepositoryService, 1);
177            KrmsAttributeTypeDefinitionAndBuilders actionDef = createKrmsAttributeTypeDefinitionAndBuilders(
178                    ValidationActionTypeService.VALIDATIONS_ACTION_TYPE_CODE_ATTRIBUTE, KrmsConstants.KRMS_NAMESPACE,
179                    ValidationActionType.WARNING.toString(), true, ValidationActionType.WARNING.toString(),
180                    ValidationActionType.WARNING.getCode(), VALIDATION_ACTION_TYPE_SERVICE, krmsTypeRepositoryService, 1);
181            KrmsAttributeTypeDefinitionAndBuilders actionMessageDef = createKrmsAttributeTypeDefinitionAndBuilders(
182                    ValidationActionTypeService.VALIDATIONS_ACTION_MESSAGE_ATTRIBUTE, KrmsConstants.KRMS_NAMESPACE,
183                    "Valdiation Action Message", true, "Valdiation Action Message",
184                    WARNING_MESSAGE, VALIDATION_ACTION_TYPE_SERVICE, krmsTypeRepositoryService, 1);
185    
186            List<KrmsAttributeTypeDefinitionAndBuilders> actionDefs = new LinkedList<KrmsAttributeTypeDefinitionAndBuilders>();
187            actionDefs.add(actionDef);
188            actionDefs.add(actionMessageDef);
189    
190            ContextBo contextBo = createContext();
191            RuleBo ruleBo = createRuleWithAction(ruleDefs, actionDefs, contextBo, WARNING_MESSAGE);
192            createAgenda(ruleBo, contextBo, createEventAttributeDefinition());
193    
194            EngineResults results = engineExecute();
195            assertNotNull(results.getAttribute(ValidationActionTypeService.VALIDATIONS_ACTION_ATTRIBUTE));
196            assertEquals(ValidationActionType.WARNING.getCode() + ":" + WARNING_MESSAGE,
197                    results.getAttribute(ValidationActionTypeService.VALIDATIONS_ACTION_ATTRIBUTE));
198        }
199    
200        @Transactional
201        @Test
202        public void testValidError() {
203            KrmsAttributeTypeDefinitionAndBuilders ruleDefs = createKrmsAttributeTypeDefinitionAndBuilders(
204                    ValidationRuleTypeService.VALIDATIONS_RULE_TYPE_CODE_ATTRIBUTE, KrmsConstants.KRMS_NAMESPACE,
205                    ValidationRuleType.VALID.toString(), true, ValidationRuleType.VALID.toString(),
206                    ValidationRuleType.VALID.getCode(), VALIDATION_RULE_TYPE_SERVICE, krmsTypeRepositoryService, 1);
207            KrmsAttributeTypeDefinitionAndBuilders actionDef = createKrmsAttributeTypeDefinitionAndBuilders(
208                    ValidationActionTypeService.VALIDATIONS_ACTION_TYPE_CODE_ATTRIBUTE, KrmsConstants.KRMS_NAMESPACE,
209                    ValidationActionType.ERROR.toString(), true, ValidationActionType.ERROR.toString(),
210                    ValidationActionType.ERROR.getCode(), VALIDATION_ACTION_TYPE_SERVICE, krmsTypeRepositoryService, 1);
211            KrmsAttributeTypeDefinitionAndBuilders actionMessageDef = createKrmsAttributeTypeDefinitionAndBuilders(
212                    ValidationActionTypeService.VALIDATIONS_ACTION_MESSAGE_ATTRIBUTE, KrmsConstants.KRMS_NAMESPACE,
213                    "Valdiation Action Message", true, "Valdiation Action Message",
214                    ERROR_MESSAGE, VALIDATION_ACTION_TYPE_SERVICE, krmsTypeRepositoryService, 1);
215            List<KrmsAttributeTypeDefinitionAndBuilders> actionDefs = new LinkedList<KrmsAttributeTypeDefinitionAndBuilders>();
216            actionDefs.add(actionDef);
217            actionDefs.add(actionMessageDef);
218    
219            ContextBo contextBo = createContext();
220            RuleBo ruleBo = createRuleWithAction(ruleDefs, actionDefs, contextBo, ERROR_MESSAGE);
221            createAgenda(ruleBo, contextBo, createEventAttributeDefinition());
222    
223            EngineResults results = engineExecute();
224            assertTrue(results.getAttribute(ValidationActionTypeService.VALIDATIONS_ACTION_ATTRIBUTE) == null);
225        }
226    
227        @Transactional
228        @Test
229        public void testInvalidError() {
230            KrmsAttributeTypeDefinitionAndBuilders ruleDefs = createKrmsAttributeTypeDefinitionAndBuilders(
231                    ValidationRuleTypeService.VALIDATIONS_RULE_TYPE_CODE_ATTRIBUTE, KrmsConstants.KRMS_NAMESPACE,
232                    ValidationRuleType.INVALID.toString(), true, ValidationRuleType.INVALID.toString(),
233                    ValidationRuleType.INVALID.getCode(), VALIDATION_RULE_TYPE_SERVICE, krmsTypeRepositoryService, 1);
234            KrmsAttributeTypeDefinitionAndBuilders actionDef = createKrmsAttributeTypeDefinitionAndBuilders(
235                    ValidationActionTypeService.VALIDATIONS_ACTION_TYPE_CODE_ATTRIBUTE, KrmsConstants.KRMS_NAMESPACE,
236                    ValidationActionType.ERROR.toString(), true, ValidationActionType.ERROR.toString(),
237                    ValidationActionType.ERROR.getCode(), VALIDATION_ACTION_TYPE_SERVICE, krmsTypeRepositoryService, 1);
238            KrmsAttributeTypeDefinitionAndBuilders actionMessageDef = createKrmsAttributeTypeDefinitionAndBuilders(
239                    ValidationActionTypeService.VALIDATIONS_ACTION_MESSAGE_ATTRIBUTE, KrmsConstants.KRMS_NAMESPACE,
240                    "Valdiation Action Message", true, "Valdiation Action Message",
241                    ERROR_MESSAGE, VALIDATION_ACTION_TYPE_SERVICE, krmsTypeRepositoryService, 1);
242            List<KrmsAttributeTypeDefinitionAndBuilders> actionDefs = new LinkedList<KrmsAttributeTypeDefinitionAndBuilders>();
243            actionDefs.add(actionDef);
244            actionDefs.add(actionMessageDef);
245    
246            ContextBo contextBo = createContext();
247            RuleBo ruleBo = createRuleWithAction(ruleDefs, actionDefs, contextBo, ERROR_MESSAGE);
248            createAgenda(ruleBo, contextBo, createEventAttributeDefinition());
249    
250            EngineResults results = engineExecute();
251            assertNotNull(results.getAttribute(ValidationActionTypeService.VALIDATIONS_ACTION_ATTRIBUTE));
252            assertEquals(ValidationActionType.ERROR.getCode() + ":" + ERROR_MESSAGE, results.getAttribute(
253                    ValidationActionTypeService.VALIDATIONS_ACTION_ATTRIBUTE));
254        }
255    
256        @Transactional
257        @Test
258        public void testDef() {
259            ContextDefinition contextDefinition = createContextDefinition(KrmsConstants.KRMS_NAMESPACE);
260            createAgendaDefinition(contextDefinition, "ValidationIntegration", KrmsConstants.KRMS_NAMESPACE);
261    
262            engineExecute();
263        }
264    
265        private ContextDefinition createContextDefinition(String nameSpace) {
266            // Attribute Defn for context;
267            KrmsAttributeDefinition.Builder contextTypeAttributeDefnBuilder = KrmsAttributeDefinition.Builder.create(null, "Context1Qualifier", nameSpace);
268            contextTypeAttributeDefnBuilder.setLabel("Context 1 Qualifier");
269            KrmsAttributeDefinition contextTypeAttributeDefinition = krmsAttributeDefinitionService.createAttributeDefinition(contextTypeAttributeDefnBuilder.build());
270    
271            // Attr for context;
272            KrmsTypeAttribute.Builder krmsTypeAttrBuilder = KrmsTypeAttribute.Builder.create(null, contextTypeAttributeDefinition.getId(), 1);
273    
274            // KrmsType for context
275            KrmsTypeDefinition.Builder krmsContextTypeDefnBuilder = KrmsTypeDefinition.Builder.create("KrmsTestContextType", nameSpace);
276            krmsContextTypeDefnBuilder.setAttributes(Collections.singletonList(krmsTypeAttrBuilder));
277            KrmsTypeDefinition krmsContextTypeDefinition = krmsContextTypeDefnBuilder.build();
278            krmsContextTypeDefinition = krmsTypeRepositoryService.createKrmsType(krmsContextTypeDefinition);
279    
280            // Context
281            ContextDefinition.Builder contextBuilder = ContextDefinition.Builder.create(nameSpace, CONTEXT_NAME);
282            contextBuilder.setTypeId(krmsContextTypeDefinition.getId());
283            ContextDefinition contextDefinition = contextBuilder.build();
284            contextDefinition = contextRepository.createContext(contextDefinition);
285    
286            // Context Attribute
287            // TODO: do this fur eel
288            ContextAttributeBo contextAttribute = new ContextAttributeBo();
289            contextAttribute.setAttributeDefinitionId(contextTypeAttributeDefinition.getId());
290            contextAttribute.setContextId(contextDefinition.getId());
291            contextAttribute.setValue("BLAH");
292            getBoService().save(contextAttribute);
293    
294            return contextDefinition;
295        }
296    
297        private void createAgendaDefinition(ContextDefinition contextDefinition, String eventName, String nameSpace ) {
298            AgendaDefinition agendaDef =
299                AgendaDefinition.Builder.create(null, "testAgenda", null, contextDefinition.getId()).build();
300            agendaDef = agendaBoService.createAgenda(agendaDef);
301    
302            AgendaItemDefinition.Builder agendaItemBuilder1 = AgendaItemDefinition.Builder.create(null, agendaDef.getId());
303            RuleDefinition ruleDefinition = createRuleDefinition1(contextDefinition, nameSpace);
304            agendaItemBuilder1.setRuleId(ruleDefinition.getId());
305    //        agendaItemBuilder1.setRule(RuleDefinition.Builder.create(ruleDefinition));
306    
307            AgendaItemDefinition agendaItem1 = agendaBoService.createAgendaItem(agendaItemBuilder1.build());
308    
309            AgendaDefinition.Builder agendaDefBuilder1 = AgendaDefinition.Builder.create(agendaDef);
310            agendaDefBuilder1.setFirstItemId(agendaItem1.getId());
311            agendaDef = agendaDefBuilder1.build();
312    
313            agendaBoService.updateAgenda(agendaDef);
314        }
315    
316        private RuleDefinition createRuleDefinition1(ContextDefinition contextDefinition, String nameSpace) {
317            // Rule 1
318            RuleDefinition.Builder ruleDefBuilder1 =
319                RuleDefinition.Builder.create(null, "Rule1", nameSpace, null, null);
320            RuleDefinition ruleDef1 = ruleBoService.createRule(ruleDefBuilder1.build());
321    
322    
323            ruleDefBuilder1 = RuleDefinition.Builder.create(ruleDef1);
324            ruleDefBuilder1.setProposition(createCompoundProposition(contextDefinition, ruleDef1));
325            ruleDef1 = ruleDefBuilder1.build();
326            ruleBoService.updateRule(ruleDef1);
327    
328            // Action
329            ActionDefinition.Builder actionDefBuilder1 = ActionDefinition.Builder.create(null, "testAction1", nameSpace, createKrmsActionTypeDefinition(nameSpace).getId(), ruleDef1.getId(), 1);
330            ActionDefinition actionDef1 = actionBoService.createAction(actionDefBuilder1.build());
331    
332            return ruleDef1;
333        }
334        
335    
336        private KrmsTypeDefinition createKrmsCampusTypeDefinition(String nameSpace) {
337                // KrmsType for campus svc
338            KrmsTypeDefinition.Builder krmsCampusTypeDefnBuilder = KrmsTypeDefinition.Builder.create("CAMPUS", nameSpace);
339            KrmsTypeDefinition krmsCampusTypeDefinition = krmsTypeRepositoryService.createKrmsType(krmsCampusTypeDefnBuilder.build());
340            return krmsCampusTypeDefinition;
341        }
342    
343        private KrmsTypeDefinition createKrmsActionTypeDefinition(String nameSpace) {
344            KrmsTypeDefinition.Builder krmsActionTypeDefnBuilder = KrmsTypeDefinition.Builder.create("KrmsActionResolverType", nameSpace);
345            krmsActionTypeDefnBuilder.setServiceName("testActionTypeService");
346            KrmsTypeDefinition krmsActionTypeDefinition = krmsTypeRepositoryService.createKrmsType(krmsActionTypeDefnBuilder.build());
347    
348            return krmsActionTypeDefinition;
349        }
350    
351    
352        private EngineResults engineExecute() {
353            Map<String, String> contextQualifiers = new HashMap<String, String>();
354            contextQualifiers.put("name", CONTEXT_NAME);
355            contextQualifiers.put("namespaceCode", KrmsConstants.KRMS_NAMESPACE);
356    
357            SelectionCriteria sc1 = SelectionCriteria.createCriteria(new DateTime(),
358                    contextQualifiers, Collections.<String,String>emptyMap());
359    
360            Facts.Builder factsBuilder1 = Facts.Builder.create();
361    //        factsBuilder1.addFact(TERM_NAME, 49999);
362            factsBuilder1.addFact(TERM_NAME, "BL");
363    
364            ExecutionOptions xOptions1 = new ExecutionOptions();
365            xOptions1.setFlag(ExecutionFlag.LOG_EXECUTION, true);
366    
367            EngineResults engineResults = KrmsApiServiceLocator.getEngine().execute(sc1, factsBuilder1.build(), xOptions1);
368            assertNotNull(engineResults);
369            assertTrue(engineResults.getAllResults().size() > 0);
370            print(engineResults);
371            return engineResults;
372        }
373    
374        private void print(EngineResults engineResults) {
375            System.out.println(ToStringBuilder.reflectionToString(engineResults, ToStringStyle.MULTI_LINE_STYLE));
376        }
377    
378        private ContextBo createContext() {
379            KrmsAttributeTypeDefinitionAndBuilders defs = createKrmsAttributeTypeDefinitionAndBuilders(
380                    "ContextAttributeName", KrmsConstants.KRMS_NAMESPACE, "ContextLabel", true, "ContextTypeName",
381                    "ContextTypeId", "ContextServiceName", krmsTypeRepositoryService, 1);
382    
383            ContextBo contextBo = new ContextBo();
384            contextBo.setNamespace(KrmsConstants.KRMS_NAMESPACE);
385            contextBo.setName(CONTEXT_NAME);
386            contextBo.setTypeId(defs.typeDef.getId());
387            return (ContextBo)getBoService().save(contextBo);
388        }
389    
390        private KrmsAttributeTypeDefinitionAndBuilders createKrmsAttributeTypeDefinitionAndBuilders(String attributeName,
391                String namespace, String label, boolean active, String typeName, String typeId, String serviceName,
392                KrmsTypeRepositoryService krmsTypeRepositoryService, Integer sequenceNumber) {
393            KrmsAttributeDefinitionBo attributeDefinitionBo = new KrmsAttributeDefinitionBo();
394            attributeDefinitionBo.setNamespace(namespace);
395            attributeDefinitionBo.setName(attributeName);
396            attributeDefinitionBo.setLabel(label);
397            attributeDefinitionBo.setActive(active);
398            attributeDefinitionBo = (KrmsAttributeDefinitionBo)getBoService().save(attributeDefinitionBo);
399            assertNotNull(attributeDefinitionBo.getId());
400            KrmsAttributeDefinition attribDef = KrmsAttributeDefinitionBo.to(attributeDefinitionBo);
401    
402            KrmsTypeDefinition.Builder typeDefinition = KrmsTypeDefinition.Builder.create(
403                typeName, namespace);
404            typeDefinition.setServiceName(serviceName);
405            KrmsTypeAttribute.Builder attribDefinitionBuilder = KrmsTypeAttribute.Builder.create(typeId, attribDef.getId(), sequenceNumber);
406            typeDefinition.getAttributes().add(attribDefinitionBuilder);
407            KrmsTypeDefinition typeDef = krmsTypeRepositoryService.createKrmsType(typeDefinition.build());
408            assertNotNull(typeDef);
409    
410            return new KrmsAttributeTypeDefinitionAndBuilders(attribDef, attribDefinitionBuilder, typeDef, typeDefinition);
411        }
412    
413        private RuleBo createRuleWithAction(KrmsAttributeTypeDefinitionAndBuilders ruleBits,
414                List<KrmsAttributeTypeDefinitionAndBuilders> actionBits, ContextBo contextBo, String message) {
415    
416            RuleBo rule = new RuleBo();
417            rule.setTypeId(ruleBits.typeDef.getId());
418            rule.setNamespace(ruleBits.typeDef.getNamespace());
419            rule.setName(ruleBits.typeDef.getName());
420            List<RuleAttributeBo> ruleAttributes = new ArrayList<RuleAttributeBo>();
421            rule.setAttributeBos(ruleAttributes);
422            RuleAttributeBo ruleType = new RuleAttributeBo();
423            ruleAttributes.add(ruleType);
424            ruleType.setAttributeDefinitionId(ruleBits.attribDef.getId());
425            ruleType.setAttributeDefinition(KrmsAttributeDefinitionBo.from(ruleBits.attribDef));
426            ruleType.setValue(ruleBits.typeAttribBuilder.getTypeId());
427            ruleType.setRuleId(rule.getId());
428    
429            List<ActionBo> actions = new ArrayList<ActionBo>();
430    
431            ActionBo action = new ActionBo();
432            action.setTypeId(actionBits.get(0).typeDef.getId());
433            action.setDescription("Description of validation action for message " + actionBits.get(0).attribDef.getDescription());
434            actions.add(action);
435            action.setNamespace(actionBits.get(0).typeDef.getNamespace());
436            action.setName(actionBits.get(0).typeDef.getName());
437            action.setSequenceNumber(actionBits.get(0).typeAttribBuilder.getSequenceNumber());
438            Set<ActionAttributeBo> actionAttributes = new HashSet<ActionAttributeBo>();
439            action.setAttributeBos(actionAttributes);
440    
441            for (KrmsAttributeTypeDefinitionAndBuilders actionBit : actionBits) {
442    
443                ActionAttributeBo actionAttribute = new ActionAttributeBo();
444                actionAttributes.add(actionAttribute);
445                actionAttribute.setAttributeDefinitionId(actionBit.attribDef.getId());
446                actionAttribute.setAttributeDefinition(KrmsAttributeDefinitionBo.from(actionBit.attribDef));
447                actionAttribute.setValue(actionBit.typeAttribBuilder.getTypeId());
448    
449    //            createActionAttributeBo(actionBit.attribDef.getNamespace(), actionBit.attribDef.getName(), "Action Message", actionBit.attribDef.isActive(), actionBit.attribDef.getDescription(), message, actionAttributes);
450            }
451    
452            rule = (RuleBo) getBoService().save(rule);
453            RuleDefinition ruleDef = RuleBo.to(rule);
454            
455            PropositionDefinition propDef = createPropositionDefinition1(ContextBo.to(contextBo), ruleDef).build();
456            propDef = propositionBoService.createProposition(propDef);
457            rule.setPropId(propDef.getId());
458            rule.setActions(actions);
459            rule = (RuleBo) getBoService().save(rule);
460    
461            assertNotNull(rule.getId());
462            assertNotNull(propDef.getId());
463            assertEquals(propDef.getRuleId(), rule.getId());
464            assertEquals(1, rule.getActions().size());
465            assertNotNull(rule.getActions().get(0).getId());
466            assertEquals(2, rule.getActions().get(0).getAttributeBos().size());
467            return rule;
468        }
469    
470        private void createActionAttributeBo(String namespace, String attributeName, String label, boolean active,
471                String actionAttribDefId, String value, Set<ActionAttributeBo> actionAttributes) {
472            KrmsAttributeDefinitionBo attributeDefinitionBo = new KrmsAttributeDefinitionBo();
473            attributeDefinitionBo.setNamespace(namespace);
474            attributeDefinitionBo.setName(attributeName);
475            attributeDefinitionBo.setLabel(label);
476            attributeDefinitionBo.setActive(active);
477            attributeDefinitionBo = (KrmsAttributeDefinitionBo)getBoService().save(attributeDefinitionBo);
478            assertNotNull(attributeDefinitionBo.getId());
479            KrmsAttributeDefinition attribDef = KrmsAttributeDefinitionBo.to(attributeDefinitionBo);
480    
481            ActionAttributeBo actionAttribute = new ActionAttributeBo();
482            actionAttributes.add(actionAttribute);
483            actionAttribute.setAttributeDefinitionId(attribDef.getId());
484            actionAttribute.setAttributeDefinition(KrmsAttributeDefinitionBo.from(attribDef));
485            actionAttribute.setValue(value);
486        }
487    
488        private PropositionDefinition.Builder createPropositionDefinition1(ContextDefinition contextDefinition, RuleDefinition ruleDef1) {
489            // Proposition for rule 1
490            PropositionDefinition.Builder propositionDefBuilder1 =
491                PropositionDefinition.Builder.create(null, PropositionType.SIMPLE.getCode(), ruleDef1.getId(), null /* type code is only for custom props */, Collections.<PropositionParameter.Builder>emptyList());
492            propositionDefBuilder1.setDescription("is campus bloomington");
493    
494            // PropositionParams for rule 1
495            List<PropositionParameter.Builder> propositionParams1 = new ArrayList<PropositionParameter.Builder>();
496            propositionParams1.add(
497                    PropositionParameter.Builder.create(null, null, createTermDefinition1(contextDefinition).getId(), PropositionParameterType.TERM.getCode(), 1)
498            );
499            propositionParams1.add(
500                    PropositionParameter.Builder.create(null, null, "BL", PropositionParameterType.CONSTANT.getCode(), 2)
501            );
502            propositionParams1.add(
503                    PropositionParameter.Builder.create(null, null, "=", PropositionParameterType.OPERATOR.getCode(), 3)
504            );
505    
506            // set the parent proposition so the builder will not puke
507            for (PropositionParameter.Builder propositionParamBuilder : propositionParams1) {
508                propositionParamBuilder.setProposition(propositionDefBuilder1);
509            }
510    
511            propositionDefBuilder1.setParameters(propositionParams1);
512    
513            return propositionDefBuilder1;
514        }
515    
516    
517        private PropositionDefinition.Builder createCompoundProposition(ContextDefinition contextDefinition,
518                RuleDefinition ruleDef1) {
519            // Proposition for rule 1
520            List<PropositionParameter.Builder> propositionParameterBuilderList = new ArrayList<PropositionParameter.Builder>();
521            propositionParameterBuilderList.add(PropositionParameter.Builder.create(null, null, createTermDefinition1(contextDefinition).getId(),
522                    PropositionParameterType.TERM.getCode(), 1)
523            );
524            propositionParameterBuilderList.add(PropositionParameter.Builder.create(null, null, "BL",
525                    PropositionParameterType.CONSTANT.getCode(), 2)
526            );
527            propositionParameterBuilderList.add(PropositionParameter.Builder.create(null, null, ComparisonOperator.EQUALS.getCode(),
528                    PropositionParameterType.OPERATOR.getCode(), 3)
529            );
530    
531            PropositionDefinition.Builder propositionDefBuilder1 =
532                PropositionDefinition.Builder.create(null, PropositionType.SIMPLE.getCode(), ruleDef1.getId(), null /* type code is only for custom props */, propositionParameterBuilderList);
533            propositionDefBuilder1.setDescription("propositionDefBuilder1 Description");
534    
535            // PropositionParams for rule 1
536    //        List<PropositionParameter.Builder> propositionParams1 = new ArrayList<PropositionParameter.Builder>();
537    //        propositionParams1.add(
538    //                PropositionParameter.Builder.create(null, null, createTermDefinition1(contextDefinition).getId(), PropositionParameterType
539    //                        .TERM.getCode(), 1)
540    //        );
541    
542            // set the parent proposition so the builder will not puke
543            for (PropositionParameter.Builder propositionParamBuilder : propositionParameterBuilderList) {
544                propositionParamBuilder.setProposition(propositionDefBuilder1);
545            }
546    
547    //        propositionDefBuilder1.setParameters(propositionParams1);
548    
549            return propositionDefBuilder1;
550        }
551    
552        private TermDefinition createTermDefinition1(ContextDefinition contextDefinition) {
553            // campusCode TermSpec
554            TermSpecificationDefinition campusCodeTermSpec =
555                TermSpecificationDefinition.Builder.create(null, "campusCodeTermSpec", contextDefinition.getId(),
556                        "java.lang.String").build();
557            campusCodeTermSpec = termBoService.createTermSpecification(campusCodeTermSpec);
558    
559            // Term 1
560            TermDefinition termDefinition1 =
561                TermDefinition.Builder.create(null, TermSpecificationDefinition.Builder.create(campusCodeTermSpec), null).build();
562            termDefinition1 = termBoService.createTerm(termDefinition1);
563    
564            return termDefinition1;
565        }
566    
567        private TermDefinition createTermDefinitionInteger(ContextDefinition contextDefinition) {
568            // campusCode TermSpec
569            TermSpecificationDefinition termSpec =
570                TermSpecificationDefinition.Builder.create(null, TERM_NAME, contextDefinition.getId(),
571                        "java.lang.Integer").build();
572            termSpec = termBoService.createTermSpecification(termSpec);
573    
574            // Term 1
575            TermDefinition termDefinition1 =
576                TermDefinition.Builder.create(null, TermSpecificationDefinition.Builder.create(termSpec), null).build();
577            termDefinition1 = termBoService.createTerm(termDefinition1);
578    
579            return termDefinition1;
580        }
581    
582    
583        private KrmsAttributeDefinitionBo createEventAttributeDefinition() {
584            KrmsAttributeDefinitionService service = KRMSServiceLocatorInternal.getService("krmsAttributeDefinitionService");
585            assertNotNull(service);
586            KrmsAttributeDefinitionBo attributeDefinitionBo = new KrmsAttributeDefinitionBo();
587            attributeDefinitionBo.setNamespace(KrmsConstants.KRMS_NAMESPACE);
588            attributeDefinitionBo.setName(EVENT_ATTRIBUTE);
589            attributeDefinitionBo.setLabel("Event");
590            attributeDefinitionBo.setActive(true);
591            attributeDefinitionBo = (KrmsAttributeDefinitionBo) getBoService().save(attributeDefinitionBo);
592            assertNotNull(attributeDefinitionBo.getId());
593            return attributeDefinitionBo;
594        }
595    
596        private AgendaBo createAgenda(RuleBo ruleBo, ContextBo contextBo, KrmsAttributeDefinitionBo eventAttributeDefinition) {
597            AgendaBo agendaBo = new AgendaBo();
598            agendaBo.setActive(true);
599            agendaBo.setContextId(contextBo.getId());
600            agendaBo.setName("MyAgenda");
601            agendaBo.setTypeId(null);
602            agendaBo = (AgendaBo)getBoService().save(agendaBo);
603    
604            agendaBo.setFirstItemId(ruleBo.getId());
605            AgendaItemBo agendaItemBo = new AgendaItemBo();
606            agendaItemBo.setRule(ruleBo);
607            agendaItemBo.setAgendaId(agendaBo.getId());
608            agendaItemBo = (AgendaItemBo)getBoService().save(agendaItemBo);
609    
610            List<AgendaItemBo> agendaItems = new ArrayList<AgendaItemBo>();
611            agendaItems.add(agendaItemBo);
612            agendaBo.setItems(agendaItems);
613            agendaBo.setFirstItemId(agendaItemBo.getId());
614    
615            // also add attribute to the agenda to store event
616            Set<AgendaAttributeBo> agendaAttributes = new HashSet<AgendaAttributeBo>();
617            agendaBo.setAttributeBos(agendaAttributes);
618            AgendaAttributeBo agendaAttribute = new AgendaAttributeBo();
619            agendaAttributes.add(agendaAttribute);
620            agendaAttribute.setAttributeDefinitionId(eventAttributeDefinition.getId());
621            agendaAttribute.setAttributeDefinition(eventAttributeDefinition);
622            agendaAttribute.setValue(EVENT_ATTRIBUTE);
623    //        agendaAttribute.setValue("workflow");
624            agendaBo = (AgendaBo)getBoService().save(agendaBo);
625    
626            contextBo.getAgendas().add(agendaBo);
627    
628            return agendaBo;
629        }
630    
631        class KrmsAttributeTypeDefinitionAndBuilders {
632            KrmsTypeDefinition typeDef;
633            KrmsTypeDefinition.Builder typeDefBuilder;
634            KrmsAttributeDefinition attribDef;
635            KrmsTypeAttribute.Builder typeAttribBuilder;
636            KrmsAttributeTypeDefinitionAndBuilders(KrmsAttributeDefinition krmsAttributeDefinition, KrmsTypeAttribute.Builder krmsAttributeDefinitionBuilder,
637                    KrmsTypeDefinition krmsTypeDefinition, KrmsTypeDefinition.Builder krmsTypeDefinitionBuilder) {
638                this.typeDef = krmsTypeDefinition;
639                this.typeDefBuilder = krmsTypeDefinitionBuilder;
640                this.attribDef = krmsAttributeDefinition;
641                this.typeAttribBuilder = krmsAttributeDefinitionBuilder;
642            }
643        }
644    }