1 package org.kuali.ole.ingest.krms.builder;
2
3 import org.apache.log4j.Logger;
4 import org.kuali.ole.OLEConstants;
5 import org.kuali.ole.docstore.model.xmlpojo.work.bib.marc.DataField;
6 import org.kuali.ole.docstore.model.xmlpojo.work.bib.marc.SubField;
7 import org.kuali.ole.ingest.krms.pojo.*;
8 import org.kuali.ole.ingest.pojo.*;
9 import org.kuali.rice.core.api.resourceloader.GlobalResourceLoader;
10 import org.kuali.rice.kew.impl.peopleflow.PeopleFlowBo;
11 import org.kuali.rice.krad.service.BusinessObjectService;
12 import org.kuali.rice.krad.service.KRADServiceLocator;
13 import org.kuali.rice.krms.api.repository.term.TermSpecificationDefinition;
14 import org.kuali.rice.krms.impl.repository.*;
15
16 import java.io.IOException;
17 import java.net.URISyntaxException;
18 import java.util.*;
19
20
21
22
23
24
25
26
27 public class OleKrmsBuilder {
28
29 private BusinessObjectService businessObjectService;
30 private TermBoService termBoService;
31 private OleKrmsObjectGeneratorFromXML krmsObjectGeneratorFromXML;
32 private CategoryBo category;
33 private ContextBo context;
34 private AgendaBo agendaBo;
35 private RuleBo ruleBo;
36 private HashMap<String,String> operators;
37 private static final Logger LOG = Logger.getLogger(OleKrmsBuilder.class);
38
39 public OleKrmsBuilder() {
40 operators = new HashMap<String, String>();
41 operators.put("AND","&");
42 operators.put("OR","|");
43 operators.put("and","&");
44 operators.put("or","|");
45 operators.put("IN","=");
46 operators.put("in","=");
47 operators.put("=","=");
48 operators.put("greaterThan",">");
49 operators.put("lessThan","<");
50 operators.put(">",">");
51 operators.put("<","<");
52 operators.put("!=","!=");
53 }
54
55
56
57
58
59
60
61
62
63
64 public ContextBo createContext(String namespace, String contextName) {
65
66 ContextBo contextBo;
67 Object existing = objectExists(ContextBo.class, "nm", contextName);
68 if (null == existing) {
69 contextBo = new ContextBo();
70 contextBo.setNamespace(namespace);
71 contextBo.setName(contextName);
72 getBusinessObjectService().save(contextBo);
73 } else {
74 contextBo = (ContextBo) existing;
75 }
76 return contextBo;
77 }
78
79
80
81
82
83
84
85
86 public Object objectExists(Class objectClass, String key, String value) {
87
88 HashMap<String, String> map = new HashMap<String, String>();
89 map.put(key, value);
90 List<Object> matching = (List<Object>) getBusinessObjectService().findMatching(objectClass, map);
91 return matching.isEmpty() ? null : matching.get(0);
92 }
93
94
95
96
97
98 private BusinessObjectService getBusinessObjectService() {
99 if (null == businessObjectService) {
100 businessObjectService = KRADServiceLocator.getBusinessObjectService();
101 }
102 return businessObjectService;
103 }
104
105
106
107
108
109
110
111
112 public CategoryBo createCategory(String namespace, String categoryName) {
113
114 CategoryBo categoryBo;
115 Object existing = objectExists(CategoryBo.class, "nm", categoryName);
116 if (existing == null) {
117 categoryBo = new CategoryBo();
118 categoryBo.setName(categoryName);
119 categoryBo.setNamespace(namespace);
120 getBusinessObjectService().save(categoryBo);
121 } else {
122 categoryBo = (CategoryBo) existing;
123 }
124 return categoryBo;
125 }
126
127
128
129
130 public void registerDefaultFunctionLoader() {
131 if (null == objectExists(KrmsTypeBo.class, "nm", "FunctionLoader")) {
132 KrmsTypeBo krmsTypeBo = new KrmsTypeBo();
133 krmsTypeBo.setNamespace(OLEConstants.OLE_NAMESPACE);
134 krmsTypeBo.setName("FunctionLoader");
135 krmsTypeBo.setServiceName("functionLoader");
136 getBusinessObjectService().save(krmsTypeBo);
137 }
138 }
139
140
141
142
143
144
145
146
147 public AgendaBo createAgenda(String agendaName, ContextBo contextBo) {
148 AgendaBo agendaBo;
149 Object existing = objectExists(AgendaBo.class, "nm", agendaName);
150 if (existing == null) {
151 agendaBo = new AgendaBo();
152 agendaBo.setActive(true);
153 agendaBo.setName(agendaName);
154 agendaBo.setContext(contextBo);
155 agendaBo.setContextId(contextBo.getId());
156 getBusinessObjectService().save(agendaBo);
157 List<AgendaBo> agendas = contextBo.getAgendas();
158 if (null == agendas) {
159 agendas = new ArrayList<AgendaBo>();
160 }
161 agendas.add(agendaBo);
162 contextBo.setAgendas(agendas);
163 getBusinessObjectService().save(contextBo);
164 } else {
165 agendaBo = (AgendaBo) existing;
166 }
167 return agendaBo;
168 }
169
170
171
172
173
174
175
176
177
178
179
180 public TermSpecificationBo createTermSpecification(String namespace, String termSpecificationName, String type, List<CategoryBo> categoryBoList, List<ContextBo> contextBoList) {
181
182 TermSpecificationBo termSpecificationBo;
183 Object existing = objectExists(TermSpecificationBo.class, "nm", termSpecificationName);
184 if (existing == null) {
185 termSpecificationBo = new TermSpecificationBo();
186 termSpecificationBo.setActive(true);
187 termSpecificationBo.setName(termSpecificationName);
188 termSpecificationBo.setNamespace(namespace);
189 termSpecificationBo.setCategories(categoryBoList);
190 termSpecificationBo.setDescription(termSpecificationName);
191 termSpecificationBo.setContexts(contextBoList);
192 termSpecificationBo.setType(type);
193 TermSpecificationDefinition termSpecification = getTermBoService().createTermSpecification(TermSpecificationDefinition.Builder.create(termSpecificationBo).build());
194 termSpecificationBo = TermSpecificationBo.from(termSpecification);
195 } else {
196 termSpecificationBo = (TermSpecificationBo) existing;
197 }
198 return termSpecificationBo;
199 }
200
201
202
203
204
205 private TermBoService getTermBoService() {
206 if (null == termBoService) {
207 termBoService = GlobalResourceLoader.getService("termBoService");
208 }
209 return termBoService;
210 }
211
212
213
214
215
216
217
218
219 public TermBo createTerm(String name, TermSpecificationBo termSpecificationBo) {
220 TermBo termBo;
221 Object existing = objectExists(TermBo.class, "term_spec_id", termSpecificationBo.getId());
222 if (existing == null) {
223 termBo = new TermBo();
224 termBo.setSpecification(termSpecificationBo);
225 termBo.setSpecificationId(termSpecificationBo.getId());
226 termBo.setDescription(name);
227 getBusinessObjectService().save(termBo);
228 } else {
229 termBo = (TermBo) existing;
230 }
231 return termBo;
232 }
233
234
235
236
237
238
239
240
241 public RuleBo createRule(String namespace, String ruleName) {
242 RuleBo ruleBo = new RuleBo();
243 Object existing = objectExists(RuleBo.class, "nm", ruleName);
244 if (existing == null) {
245 ruleBo.setName(ruleName);
246 ruleBo.setNamespace(namespace);
247 getBusinessObjectService().save(ruleBo);
248 } else {
249 ruleBo = (RuleBo) existing;
250 }
251 return ruleBo;
252 }
253
254
255
256
257
258
259
260
261 public AgendaBo addRuleToAgenda(AgendaBo agendaBo, RuleBo ruleBo) {
262 AgendaItemBo agendaItemBo = new AgendaItemBo();
263 agendaItemBo.setAgendaId(agendaBo.getId());
264 agendaItemBo.setRule(ruleBo);
265 getBusinessObjectService().save(agendaItemBo);
266 List<AgendaItemBo> agendaBoItems = agendaBo.getItems();
267 if (null == agendaBoItems) {
268 agendaBoItems = new ArrayList<AgendaItemBo>();
269 }
270 agendaBoItems.add(agendaItemBo);
271 agendaBo.setItems(agendaBoItems);
272 if(agendaBo.getFirstItemId()==null){
273 agendaBo.setFirstItemId(agendaBoItems.get(0).getId());
274 getBusinessObjectService().save(agendaBo);
275 }
276 return agendaBo;
277 }
278
279
280
281
282
283
284
285
286
287
288
289 public PropositionBo createProposition(String categoryId, String propositionDescription, String propositionType, RuleBo rule,Integer seqNum) {
290 PropositionBo propositionBo = new PropositionBo();
291 propositionBo.setCategoryId(categoryId);
292 propositionBo.setDescription(propositionDescription);
293 propositionBo.setRuleId(rule.getId());
294 propositionBo.setPropositionTypeCode(propositionType);
295 propositionBo.setCompoundSequenceNumber(seqNum);
296 getBusinessObjectService().save(propositionBo);
297 return propositionBo;
298 }
299
300
301
302
303
304
305
306
307
308
309
310 public PropositionBo createCompoundProposition(String categoryId, String propositionDescription, String propositionType, RuleBo rule,String operatorCode) {
311 PropositionBo propositionBo = new PropositionBo();
312 propositionBo.setCategoryId(categoryId);
313 propositionBo.setDescription(propositionDescription);
314 propositionBo.setRuleId(rule.getId());
315 propositionBo.setPropositionTypeCode(propositionType);
316 propositionBo.setCompoundOpCode(operatorCode);
317 getBusinessObjectService().save(propositionBo);
318 return propositionBo;
319 }
320
321
322
323
324
325
326
327
328
329
330
331 public FunctionBo createFunction(String namespace, String functionName, String returnType, List categories,List<String> parameterTypes) {
332 Object existing = objectExists(FunctionBo.class, "nm", functionName);
333 FunctionBo functionBo;
334 if (existing == null) {
335 HashMap<String, String> map = new HashMap<String, String>();
336 map.put("nm", "FunctionLoader");
337 List<KrmsTypeBo> matching =
338 (List<KrmsTypeBo>) getBusinessObjectService().findMatching(KrmsTypeBo.class, map);
339 KrmsTypeBo krmsTypeBo = matching.get(0);
340 functionBo = new FunctionBo();
341 functionBo.setActive(true);
342 functionBo.setName(functionName);
343 functionBo.setNamespace(namespace);
344 functionBo.setReturnType(returnType);
345 functionBo.setCategories(categories);
346 functionBo.setTypeId(krmsTypeBo.getId());
347 getBusinessObjectService().save(functionBo);
348 List<FunctionParameterBo> parameters = functionBo.getParameters();
349 if (null == parameters) {
350 parameters = new ArrayList<FunctionParameterBo>();
351 }
352 FunctionParameterBo functionParameterBo = null;
353 int i =0;
354 for(String parameterType : parameterTypes){
355 functionParameterBo = new FunctionParameterBo();
356 functionParameterBo.setFunctionId(functionBo.getId());
357 functionParameterBo.setParameterType(parameterType);
358 functionParameterBo.setName(functionName);
359 functionParameterBo.setSequenceNumber(i++);
360
361 getBusinessObjectService().save(functionParameterBo);
362 parameters.add(functionParameterBo);
363 }
364 functionBo.setParameters(parameters);
365
366 getBusinessObjectService().save(functionBo);
367 } else {
368 functionBo = (FunctionBo) existing;
369 List<FunctionParameterBo> parameters = functionBo.getParameters();
370 if (null == parameters) {
371 parameters = new ArrayList<FunctionParameterBo>();
372 }
373 FunctionParameterBo functionParameterBo = null;
374 int j = 0;
375 for(int i=0 ; i< parameterTypes.size(); i++){
376 if(parameters.size() > i){
377 functionParameterBo = parameters.get(i);
378 functionParameterBo.setFunctionId(functionBo.getId());
379 functionParameterBo.setParameterType(parameterTypes.get(i));
380 functionParameterBo.setName(functionName);
381 functionParameterBo.setSequenceNumber(j++);
382
383 getBusinessObjectService().save(functionParameterBo);
384 }else{
385 functionParameterBo = new FunctionParameterBo();
386 functionParameterBo.setFunctionId(functionBo.getId());
387 functionParameterBo.setParameterType(parameterTypes.get(i));
388 functionParameterBo.setName(functionName);
389 functionParameterBo.setSequenceNumber(i++);
390
391 getBusinessObjectService().save(functionParameterBo);
392 parameters.add(functionParameterBo);
393 }
394 }
395 functionBo.setParameters(parameters);
396
397 getBusinessObjectService().save(functionBo);
398 }
399
400 return functionBo;
401 }
402
403
404
405
406
407
408
409
410 public PropositionBo addTermToPropositionParameter(String termId, PropositionBo proposition,Integer seqNum) {
411 PropositionParameterBo propositionParameterBo = new PropositionParameterBo();
412 propositionParameterBo.setPropId(proposition.getId());
413 propositionParameterBo.setValue(termId);
414 propositionParameterBo.setSequenceNumber(seqNum);
415 propositionParameterBo.setParameterType("T");
416 getBusinessObjectService().save(propositionParameterBo);
417 List<PropositionParameterBo> parameters = proposition.getParameters();
418 if (null == parameters) {
419 parameters = new ArrayList<PropositionParameterBo>();
420 }
421 parameters.add(propositionParameterBo);
422 proposition.setParameters(parameters);
423 getBusinessObjectService().save(proposition);
424 return proposition;
425 }
426
427
428
429
430
431
432
433
434 public PropositionBo addOperatorToPropositionParameter(String operator,PropositionBo proposition){
435 PropositionParameterBo propositionParameterBo = new PropositionParameterBo();
436 propositionParameterBo.setPropId(proposition.getId());
437 propositionParameterBo.setValue(operator);
438 propositionParameterBo.setSequenceNumber(2);
439 propositionParameterBo.setParameterType("O");
440 getBusinessObjectService().save(propositionParameterBo);
441 List<PropositionParameterBo> parameters = proposition.getParameters();
442 if (null == parameters) {
443 parameters = new ArrayList<PropositionParameterBo>();
444 }
445 parameters.add(propositionParameterBo);
446 proposition.setParameters(parameters);
447 getBusinessObjectService().save(proposition);
448 return proposition;
449 }
450
451
452
453
454
455
456
457
458 public PropositionBo addConstantToPropositionParameter(String constant,PropositionBo proposition){
459 PropositionParameterBo propositionParameterBo = new PropositionParameterBo();
460 propositionParameterBo.setPropId(proposition.getId());
461 propositionParameterBo.setValue(constant!=null && !constant.isEmpty() ? constant : null);
462 propositionParameterBo.setSequenceNumber(1);
463 propositionParameterBo.setParameterType("C");
464 getBusinessObjectService().save(propositionParameterBo);
465 List<PropositionParameterBo> parameters = proposition.getParameters();
466 if (null == parameters) {
467 parameters = new ArrayList<PropositionParameterBo>();
468 }
469 parameters.add(propositionParameterBo);
470 proposition.setParameters(parameters);
471 getBusinessObjectService().save(proposition);
472 return proposition;
473 }
474
475
476
477
478
479
480
481
482 public PropositionBo addCustomFunctionToPropositionParameter(String functionId, PropositionBo proposition,Integer seqNum) {
483 PropositionParameterBo propositionParameterBo = new PropositionParameterBo();
484 propositionParameterBo.setPropId(proposition.getId());
485 propositionParameterBo.setValue(functionId);
486 propositionParameterBo.setSequenceNumber(seqNum);
487 propositionParameterBo.setParameterType("F");
488 getBusinessObjectService().save(propositionParameterBo);
489 List<PropositionParameterBo> parameters = proposition.getParameters();
490 if (null == parameters) {
491 parameters = new ArrayList<PropositionParameterBo>();
492 }
493 parameters.add(propositionParameterBo);
494 proposition.setParameters(parameters);
495 getBusinessObjectService().save(proposition);
496 return proposition;
497 }
498
499
500
501
502
503
504 public String persist(OleKrmsAgenda oleAgenda) {
505 boolean agendaExists = doesKrmsExist(oleAgenda.getName());
506 if(agendaExists){
507 deleteAgenda(oleAgenda);
508 }
509 context = createContext(OLEConstants.OLE_NAMESPACE, "OLE-CONTEXT");
510 category = createCategory(OLEConstants.OLE_NAMESPACE, "OLE_CATEGORY");
511
512 registerDefaultFunctionLoader();
513 agendaBo = createAgenda(oleAgenda.getName(), context);
514 createRules(oleAgenda.getRules());
515 updateAgendaItems(oleAgenda.getRules(),null,null,agendaBo.getId());
516 persistProfileAttributes(oleAgenda);
517 persistOverlayOptions(oleAgenda);
518
519 return agendaBo.getName();
520 }
521
522
523
524
525
526 private void persistProfileAttributes(OleKrmsAgenda oleAgenda) {
527 List<ProfileAttributeBo> profileAttributes = oleAgenda.getProfileAttributes()!=null?oleAgenda.getProfileAttributes():new ArrayList<ProfileAttributeBo>();
528 for (Iterator<ProfileAttributeBo> iterator = profileAttributes.iterator(); iterator.hasNext(); ) {
529 ProfileAttributeBo profileAttributeBo = iterator.next();
530 profileAttributeBo.setAgendaName(oleAgenda.getName());
531 }
532 getBusinessObjectService().save(profileAttributes);
533 }
534
535
536
537
538
539 private void persistOverlayOptions(OleKrmsAgenda oleAgenda) {
540 List<OverlayOption> overlayOptionList = oleAgenda.getOverlayOptions()!=null?oleAgenda.getOverlayOptions():new ArrayList<OverlayOption>();
541 for(OverlayOption overlayOption : overlayOptionList){
542 overlayOption.setAgendaName(oleAgenda.getName());
543 getBusinessObjectService().save(overlayOption);
544 for(DataField dataField : overlayOption.getDataFields()){
545 List<OleDataField> oleDataFieldList = new ArrayList<OleDataField>();
546 setOleDataField(dataField,oleDataFieldList,overlayOption);
547 getBusinessObjectService().save(oleDataFieldList);
548 if(LOG.isInfoEnabled()){
549 LOG.info("dataField.getTag---------->"+dataField.getTag());
550 LOG.info("dataField.getInd1--------->"+dataField.getInd1());
551 LOG.info("dataField.getInd2--------->"+dataField.getInd2());
552 for(SubField subField : dataField.getSubFields()){
553 LOG.info("subField.getCode--------->"+subField.getCode());
554 }
555 }
556 }
557 }
558 }
559
560 private void setOleDataField(DataField dataField,List<OleDataField> oleDataFieldList,OverlayOption overlayOption){
561 for(SubField subField : dataField.getSubFields()){
562 OleDataField oleDataField = new OleDataField();
563 oleDataField.setOverlayOptionId(overlayOption.getId());
564 oleDataField.setAgendaName(overlayOption.getAgendaName());
565 oleDataField.setDataFieldTag(dataField.getTag());
566 oleDataField.setDataFieldInd1(dataField.getInd1());
567 oleDataField.setDataFieldInd2(dataField.getInd2());
568 oleDataField.setSubFieldCode(subField.getCode());
569 oleDataFieldList.add(oleDataField);
570 }
571 }
572
573
574 private void updateAgendaItems(List<OleKrmsRule> rules,AgendaItemBo oldAgendaItemBo,AgendaItemBo agendaItemBo,String agendaId) {
575 for (Iterator<OleKrmsRule> iterator = rules.iterator(); iterator.hasNext(); ) {
576 OleKrmsRule rule = iterator.next();
577 Object existing = objectExists(RuleBo.class, "nm", rule.getName());
578 OleKrmsRuleAction oleKrmsRuleFalseAction= rule.getFalseActions();
579 OleKrmsRuleAction oleKrmsRuleTrueAction = rule.getTrueActions();
580 RuleBo oleRuleBo = existing!=null? (RuleBo)existing:null;
581 Map<String, String> rulePk = new HashMap<String, String>() ;
582 rulePk.put("ruleId",oleRuleBo.getId());
583 rulePk.put("agendaId",agendaId);
584 List<AgendaItemBo> agendaItemBos =(List<AgendaItemBo>) getBusinessObjectService().findMatching(AgendaItemBo.class,rulePk);
585 agendaItemBo = agendaItemBos!=null && agendaItemBos.size()>0?agendaItemBos.get(0):null;
586 if(oleKrmsRuleTrueAction!=null && oleKrmsRuleTrueAction.getKrmsRules()!=null && oleKrmsRuleTrueAction.getKrmsRules().size()>0){
587 agendaItemBo.setWhenTrue(getTrueOrFalseItem( oleKrmsRuleTrueAction.getKrmsRules().get(0),agendaId));
588 getBusinessObjectService().save(agendaItemBo);
589 }
590 if(oleKrmsRuleFalseAction!=null && oleKrmsRuleFalseAction.getKrmsRules()!=null && oleKrmsRuleFalseAction.getKrmsRules().size()>0){
591 agendaItemBo.setWhenFalse(getTrueOrFalseItem( oleKrmsRuleFalseAction.getKrmsRules().get(0),agendaId));
592 getBusinessObjectService().save(agendaItemBo);
593 }
594 if(rules.size()>1 && !rules.get(0).equals(rule) && oldAgendaItemBo!=null) {
595 rulePk = new HashMap<String, String>() ;
596 rulePk.put("ruleId",oldAgendaItemBo.getRuleId());
597 rulePk.put("agendaId",agendaId);
598 agendaItemBos =(List<AgendaItemBo>) getBusinessObjectService().findMatching(AgendaItemBo.class,rulePk);
599 oldAgendaItemBo = agendaItemBos!=null && agendaItemBos.size()>0?agendaItemBos.get(0):null;
600 if(oldAgendaItemBo!=null){
601 oldAgendaItemBo.setAlways(agendaItemBo);
602 getBusinessObjectService().save(oldAgendaItemBo);
603 }
604 }
605 oldAgendaItemBo = agendaItemBo;
606 if(oleKrmsRuleTrueAction!=null && oleKrmsRuleTrueAction.getKrmsRules()!=null){
607 agendaItemBo = new AgendaItemBo();
608 updateAgendaItems(oleKrmsRuleTrueAction.getKrmsRules(),oldAgendaItemBo,agendaItemBo,agendaId);
609 }
610 if(oleKrmsRuleFalseAction!=null && oleKrmsRuleFalseAction.getKrmsRules()!=null){
611 agendaItemBo = new AgendaItemBo();
612 updateAgendaItems(oleKrmsRuleFalseAction.getKrmsRules(),oldAgendaItemBo,agendaItemBo,agendaId);
613 }
614 }
615 }
616 private AgendaItemBo getTrueOrFalseItem(OleKrmsRule rule,String agendaId) {
617 Object existing = objectExists(RuleBo.class, "nm", rule.getName());
618 RuleBo oleRuleBo = existing!=null? (RuleBo)existing:null;
619 return getAgendaItemUsingRuleId(oleRuleBo.getId(),agendaId);
620 }
621 private AgendaItemBo getAgendaItemUsingRuleId(String ruleId,String agendaId){
622 Map<String, String> rulePk = new HashMap<String, String>() ;
623 rulePk.put("ruleId",ruleId);
624 rulePk.put("agendaId",agendaId);
625 List<AgendaItemBo> agendaItemBos =(List<AgendaItemBo>) getBusinessObjectService().findMatching(AgendaItemBo.class,rulePk);
626 for(AgendaItemBo agendaItemBo : agendaItemBos){
627 rulePk = new HashMap<String, String>() ;
628 rulePk.put("whenFalseId",agendaItemBo.getId());
629 List<AgendaItemBo> whenFalse =(List<AgendaItemBo>) getBusinessObjectService().findMatching(AgendaItemBo.class,rulePk);
630
631 rulePk = new HashMap<String, String>() ;
632 rulePk.put("whenTrueId",agendaItemBo.getId());
633 List<AgendaItemBo> whenTrue =(List<AgendaItemBo>) getBusinessObjectService().findMatching(AgendaItemBo.class,rulePk);
634
635 rulePk = new HashMap<String, String>() ;
636 rulePk.put("alwaysId",agendaItemBo.getId());
637 List<AgendaItemBo> always =(List<AgendaItemBo>) getBusinessObjectService().findMatching(AgendaItemBo.class,rulePk);
638
639 if(whenFalse.size()==0 && whenTrue.size()==0 && always.size()==0){
640 return agendaItemBo;
641 }
642 }
643 return null;
644 }
645
646 private void createRules(List<OleKrmsRule> oleKrmsRules){
647 ContextValidActionBo contextValidActionBo = registerDefaultServiceTypes(context);
648 List<OleKrmsRule> rules =oleKrmsRules;
649
650 for (Iterator<OleKrmsRule> iterator = rules.iterator(); iterator.hasNext(); ) {
651 OleKrmsRule rule = iterator.next();
652 ruleBo = createRule(OLEConstants.OLE_NAMESPACE, rule.getName());
653
654 addRuleToAgenda(agendaBo, ruleBo);
655 PropositionBo propositionBo = null;
656 OleKrmsProposition oleProposition = rule.getOleProposition();
657 if(oleProposition!=null){
658 OleSimpleProposition simpleProposition = oleProposition.getSimpleProposition();
659 OleCompoundProposition compoundProposition = oleProposition.getCompoundProposition();
660 if(simpleProposition!=null){
661 propositionBo = createSimpleProposition(simpleProposition);
662 }
663 if(compoundProposition!=null){
664 List<PropositionBo> propositionBos = createCompoundProposition(compoundProposition.getCompoundPropositions(),compoundProposition.getSimplePropositions(),operators.get(compoundProposition.getOperator()));
665 propositionBo = propositionBos.get(0);
666
667 }
668 }
669 ruleBo.setProposition(propositionBo);
670 getBusinessObjectService().save(ruleBo);
671 OleKrmsRuleAction oleKrmsRuleTrueAction = rule.getTrueActions();
672 List<OleKrmsAction> trueActions =oleKrmsRuleTrueAction!=null && oleKrmsRuleTrueAction.getKrmsActions()!=null && oleKrmsRuleTrueAction.getKrmsActions().size()>0 ? oleKrmsRuleTrueAction.getKrmsActions():new ArrayList<OleKrmsAction>();
673 int i = 0;
674 for (Iterator<OleKrmsAction> oleActionIterator = trueActions.iterator(); oleActionIterator.hasNext(); ) {
675 OleKrmsAction trueAction = oleActionIterator.next();
676 contextValidActionBo = getContextValidActionBo(context,trueAction);
677 String description = trueAction.getParameters()!=null && trueAction.getParameters().size()>0?trueAction.getParameters().get(0).getValue():"null";
678 ActionBo actionBo = addActionToRule(OLEConstants.OLE_NAMESPACE, trueAction.getName(),description , contextValidActionBo.getActionTypeId(), ruleBo,i++);
679 addActionAttributes(actionBo,trueAction);
680 }
681 OleKrmsRuleAction oleKrmsRuleFalseAction= rule.getFalseActions();
682
683 List<OleKrmsAction> falseActions =oleKrmsRuleFalseAction!=null && oleKrmsRuleFalseAction.getKrmsActions()!=null && oleKrmsRuleFalseAction.getKrmsActions().size()>0 ? oleKrmsRuleFalseAction.getKrmsActions():new ArrayList<OleKrmsAction>();
684 int j=0;
685 if(falseActions.size()>0){
686 RuleBo falseActionRuleBo = createRule(OLEConstants.OLE_NAMESPACE, rule.getName() + "_falseActionRule");
687 for (Iterator<OleKrmsAction> oleActionIterator = falseActions.iterator(); oleActionIterator.hasNext(); ) {
688 OleKrmsAction falseAction = oleActionIterator.next();
689 contextValidActionBo = getContextValidActionBo(context,falseAction);
690 String description = falseAction.getParameters()!=null && falseAction.getParameters().size()>0?falseAction.getParameters().get(0).getValue():"null";
691 ActionBo actionBo = addActionToRule(OLEConstants.OLE_NAMESPACE, falseAction.getName(), description, contextValidActionBo.getActionTypeId(), falseActionRuleBo, j++);
692 addActionAttributes(actionBo,falseAction);
693 }
694 addDummyRuleForFalseAction(ruleBo, falseActionRuleBo);
695 }
696 if(oleKrmsRuleTrueAction!=null && oleKrmsRuleTrueAction.getKrmsRules()!=null){
697 createRules(oleKrmsRuleTrueAction.getKrmsRules());
698 }
699
700 if(oleKrmsRuleFalseAction!=null && oleKrmsRuleFalseAction.getKrmsRules()!=null){
701 createRules(oleKrmsRuleFalseAction.getKrmsRules());
702 }
703 }
704 }
705
706
707
708
709 private List<PropositionBo> createCompoundProposition(List<OleCompoundProposition> compoundPropositions,List<OleSimpleProposition> simplePropositions,String operator){
710 if(compoundPropositions!=null){
711 List<PropositionBo> propositionBos = new ArrayList<PropositionBo>();
712 PropositionBo propositionBo = null;
713 for(OleCompoundProposition compoundProposition :compoundPropositions){
714 propositionBos.addAll(createCompoundProposition(compoundProposition.getCompoundPropositions(),compoundProposition.getSimplePropositions(),operators.get(compoundProposition.getOperator())));
715 }
716 if(simplePropositions!=null){
717 propositionBos.addAll(createCompoundProposition(null,simplePropositions,operator));
718 }
719 propositionBo = createCompoundProposition(category.getId(), "compound","C",ruleBo,operator);
720 propositionBo.setCompoundComponents(propositionBos);
721 getBusinessObjectService().save(propositionBo);
722 propositionBos = new ArrayList<PropositionBo>();
723 propositionBos.add(propositionBo);
724 return propositionBos;
725 }else if(simplePropositions!=null){
726 List<PropositionBo> propositionBos = new ArrayList<PropositionBo>() ;
727 PropositionBo propositionBo = null;
728 for(OleSimpleProposition simpleProposition : simplePropositions){
729 propositionBos.add(createSimpleProposition(simpleProposition));
730 }
731 if(simplePropositions.size()>1){
732 propositionBo = createCompoundProposition(category.getId(), "compound","C",ruleBo,operator);
733 propositionBo.setCompoundComponents(propositionBos);
734 getBusinessObjectService().save(propositionBo);
735 propositionBos = new ArrayList<PropositionBo>();
736 propositionBos.add(propositionBo);
737 }
738 return propositionBos;
739 }
740 return null;
741 }
742
743
744
745
746
747
748 private void addActionAttributes(ActionBo action,OleKrmsAction oleKrmsAction){
749 Set<ActionAttributeBo> actionAttributeBos = new HashSet<ActionAttributeBo>();
750 List<OleParameter> oleParameters = oleKrmsAction.getParameters()!=null ? oleKrmsAction.getParameters() :new ArrayList<OleParameter>();
751 for(OleParameter oleParameter : oleParameters) {
752 Map<String, String> peopleFlowPk = new HashMap<String, String>();
753 peopleFlowPk.put("nm", oleParameter.getValue());
754 List<PeopleFlowBo> peopleFlowBos =(List<PeopleFlowBo>) getBusinessObjectService().findMatching(PeopleFlowBo.class, peopleFlowPk);
755 if(peopleFlowBos!=null && peopleFlowBos.size()>0){
756 Map<String, String> attrDefPk = new HashMap<String, String>();
757 attrDefPk.put("nm", "peopleFlowId");
758 attrDefPk.put("nmspc_cd", "KR-RULE");
759 KrmsAttributeDefinitionBo peopleFlowIdDef = getKrmsAttributeDefinitionBo(attrDefPk);
760 attrDefPk = new HashMap<String, String>();
761 attrDefPk.put("nm", "peopleFlowName");
762 attrDefPk.put("nmspc_cd", "KR-RULE");
763 KrmsAttributeDefinitionBo peopleFlowNameDef = getKrmsAttributeDefinitionBo(attrDefPk);
764 String peopleFlowId = peopleFlowBos.get(0).getId();
765 ActionAttributeBo actionAttributeBo = new ActionAttributeBo();
766 actionAttributeBo.setActionId(action.getId());
767 actionAttributeBo.setAttributeDefinitionId(peopleFlowIdDef.getId());
768 actionAttributeBo.setAttributeDefinition(peopleFlowIdDef);
769 actionAttributeBo.setValue(peopleFlowId);
770 getBusinessObjectService().save(actionAttributeBo);
771 actionAttributeBos.add(actionAttributeBo);
772
773 actionAttributeBo = new ActionAttributeBo();
774 actionAttributeBo.setActionId(action.getId());
775 actionAttributeBo.setAttributeDefinitionId(peopleFlowNameDef.getId());
776 actionAttributeBo.setAttributeDefinition(peopleFlowNameDef);
777 actionAttributeBo.setValue(oleParameter.getValue());
778 getBusinessObjectService().save(actionAttributeBo);
779 actionAttributeBos.add(actionAttributeBo);
780 } else{
781 KrmsAttributeDefinitionBo attributeDefinitionBo = createAttributeDefinition(oleParameter);
782
783 actionAttributeBos.add(createActionAttribute(attributeDefinitionBo,action,oleParameter));
784 }
785 }
786 if(actionAttributeBos.size()>0){
787 action.setAttributeBos(actionAttributeBos);
788 getBusinessObjectService().save(action);
789 }
790
791 }
792
793 private KrmsAttributeDefinitionBo getKrmsAttributeDefinitionBo( Map<String, String> attrDefPk){
794 List<KrmsAttributeDefinitionBo> krmsAttributeDefinitionBos = ( List<KrmsAttributeDefinitionBo>)getBusinessObjectService().findMatching(KrmsAttributeDefinitionBo.class,attrDefPk);
795 return krmsAttributeDefinitionBos!=null && krmsAttributeDefinitionBos.size()>0 ? krmsAttributeDefinitionBos.get(0) : null;
796 }
797 private KrmsAttributeDefinitionBo createAttributeDefinition(OleParameter oleParameter){
798 Map<String, String> attrDefPk = new HashMap<String, String>();
799 attrDefPk.put("nm", oleParameter.getName());
800 attrDefPk.put("nmspc_cd",OLEConstants.OLE_NAMESPACE);
801 KrmsAttributeDefinitionBo attributeDefinitionBo = getBusinessObjectService().findByPrimaryKey(KrmsAttributeDefinitionBo.class,attrDefPk);
802 if(attributeDefinitionBo==null){
803 attributeDefinitionBo = new KrmsAttributeDefinitionBo();
804 }
805 attributeDefinitionBo.setNamespace(OLEConstants.OLE_NAMESPACE);
806 attributeDefinitionBo.setName(oleParameter.getName());
807 getBusinessObjectService().save(attributeDefinitionBo);
808 return attributeDefinitionBo;
809 }
810 private KrmsAttributeDefinitionBo createTypeAttribute(KrmsAttributeDefinitionBo attributeDefinitionBo,ActionBo action){
811 Map<String, String> typeAttrPk = new HashMap<String, String>();
812 typeAttrPk.put("typ_id", action.getTypeId());
813 typeAttrPk.put("attr_defn_id",attributeDefinitionBo.getId());
814 KrmsTypeAttributeBo typeAttributeBo = getBusinessObjectService().findByPrimaryKey(KrmsTypeAttributeBo.class,typeAttrPk);
815 if(typeAttributeBo==null){
816 typeAttributeBo = new KrmsTypeAttributeBo();
817 }
818 typeAttributeBo.setAttributeDefinitionId(attributeDefinitionBo.getId());
819 typeAttributeBo.setTypeId(action.getTypeId());
820 typeAttributeBo.setSequenceNumber(0);
821 getBusinessObjectService().save(typeAttributeBo);
822 return attributeDefinitionBo;
823 }
824 private ActionAttributeBo createActionAttribute(KrmsAttributeDefinitionBo attributeDefinitionBo,ActionBo action,OleParameter oleParameter){
825
826
827
828
829
830 ActionAttributeBo actionAttributeBo = new ActionAttributeBo();
831 actionAttributeBo.setActionId(action.getId());
832 actionAttributeBo.setAttributeDefinitionId(attributeDefinitionBo.getId());
833 actionAttributeBo.setAttributeDefinition(attributeDefinitionBo);
834 actionAttributeBo.setValue(oleParameter.getValue());
835 getBusinessObjectService().save(actionAttributeBo);
836 return actionAttributeBo;
837 }
838
839
840
841
842
843
844
845 private ContextValidActionBo getContextValidActionBo(ContextBo contextBo,OleKrmsAction action){
846 KrmsTypeBo actionTypeService = getActiontypeService(action);
847 ContextValidActionBo contextValidActionBo =null;
848 if(actionTypeService!=null){
849 Object existing = objectExists(ContextValidActionBo.class, "actn_typ_id", actionTypeService.getId());
850 if (existing == null) {
851 contextValidActionBo = new ContextValidActionBo();
852 contextValidActionBo.setActionType(actionTypeService);
853 contextValidActionBo.setActionTypeId(actionTypeService.getId());
854 contextValidActionBo.setContextId(contextBo.getId());
855 getBusinessObjectService().save(contextValidActionBo);
856 } else {
857 contextValidActionBo = (ContextValidActionBo) existing;
858 }
859 }
860 if(contextValidActionBo==null){
861 contextValidActionBo = registerDefaultServiceTypes(contextBo);
862 }
863 return contextValidActionBo;
864 }
865
866
867
868
869
870
871 private KrmsTypeBo getActiontypeService(OleKrmsAction action){
872 Map<String, String> krmsTypePk = new HashMap<String, String>();
873 krmsTypePk.put("nm", action.getName());
874 krmsTypePk.put("nmspc_cd",OLEConstants.OLE_NAMESPACE);
875 KrmsTypeBo krmsTypeBo = getBusinessObjectService().findByPrimaryKey(KrmsTypeBo.class, krmsTypePk);
876 if(krmsTypeBo==null){
877 krmsTypePk.put("nmspc_cd","KR-RULE");
878 krmsTypeBo = getBusinessObjectService().findByPrimaryKey(KrmsTypeBo.class, krmsTypePk);
879 }
880 return krmsTypeBo;
881 }
882
883
884
885
886
887
888 private void persistMatchBo(AgendaBo agendaBo, OleTerm term) {
889 MatchBo matchBo = new MatchBo();
890 matchBo.setAgendaName(agendaBo.getName());
891 matchBo.setTermName(term.getValue());
892 String[] termNames = term.getValue().split("-");
893 if(termNames[0].equalsIgnoreCase(OLEConstants.INCOMING_FIELD)){
894 matchBo.setIncomingField(termNames[1]);
895 }
896 else if(termNames[0].equalsIgnoreCase(OLEConstants.EXISTING_FIELD)){
897 matchBo.setExistingField(termNames[1]);
898 }
899 getBusinessObjectService().save(matchBo);
900 }
901
902
903
904
905
906
907
908
909 public List<String> persistKrmsFromFileContent(String fileContent) throws IOException, URISyntaxException {
910 OleKrms krms = getKrmsObjectGeneratorFromXML().buildKrmsFromFileContent(fileContent);
911 List<String> agendaNames = new ArrayList<String>();
912 for(OleKrmsAgenda oleAgenda :krms.getAgendas()){
913 agendaNames.add(persist(oleAgenda));
914 }
915 updateDefinitions();
916 return agendaNames;
917
918 }
919
920 private void updateDefinitions(){
921 Map<String, Object> contextMap = new HashMap<String, Object>();
922 contextMap.put("name", "OLE-CONTEXT");
923 contextMap.put("namespace", "OLE");
924 ContextBo contextBo = getBusinessObjectService().findByPrimaryKey(ContextBo.class, contextMap);
925 KrmsRepositoryServiceLocator.getContextBoService().updateContext(ContextBo.to(contextBo));
926 }
927
928
929
930
931
932 public OleKrmsObjectGeneratorFromXML getKrmsObjectGeneratorFromXML() {
933 if(null==krmsObjectGeneratorFromXML){
934 krmsObjectGeneratorFromXML = new OleKrmsObjectGeneratorFromXML();
935 }
936 return krmsObjectGeneratorFromXML;
937 }
938
939
940
941
942
943 public void setKrmsObjectGeneratorFromXML(OleKrmsObjectGeneratorFromXML krmsObjectGeneratorFromXML) {
944 this.krmsObjectGeneratorFromXML = krmsObjectGeneratorFromXML;
945 }
946
947
948
949
950
951
952 public Boolean doesKrmsExist(String agendaName) {
953 HashMap<String, String> map = new HashMap<String, String>();
954 map.put("nm", agendaName);
955 List<AgendaBo> matching = (List<AgendaBo>) getBusinessObjectService().findMatching(AgendaBo.class, map);
956 return !matching.isEmpty();
957 }
958
959
960
961
962
963 public void deleteAgenda(OleKrmsAgenda oleAgenda) {
964
965 LOG.info(" inside deleteAgenda method ");
966 Map<String, String> contextPks = new HashMap<String, String>();
967 contextPks.put("nm", "OLE-CONTEXT");
968 contextPks.put("nmspc_cd", OLEConstants.OLE_NAMESPACE);
969 ContextBo context = getBusinessObjectService().findByPrimaryKey(ContextBo.class, contextPks);
970 String contextId = context.getId();
971
972 Map<String, String> agendaPks = new HashMap<String, String>();
973 agendaPks.put("nm", oleAgenda.getName());
974 agendaPks.put("cntxt_id", contextId);
975 AgendaBo oldAgenda = getBusinessObjectService().findByPrimaryKey(AgendaBo.class, agendaPks);
976
977 Map<String, String> itemPks = new HashMap<String, String>();
978 LOG.info(" oldAgenda.getId() --------------> " + oldAgenda.getId());
979 itemPks.put("agenda_id", oldAgenda.getId());
980 List<AgendaItemBo> items = (List<AgendaItemBo>) getBusinessObjectService().findMatching(AgendaItemBo.class, itemPks);
981 for(AgendaItemBo agendaItemBo : items){
982 itemPks = new HashMap<String, String>();
983 itemPks.put("rule_id", agendaItemBo.getRuleId());
984 List<AgendaItemBo> agendaItemBos =(List<AgendaItemBo>) getBusinessObjectService().findMatching(AgendaItemBo.class, itemPks);
985 if(agendaItemBos.size()>1){
986 agendaItemBo.setRule(null);
987 agendaItemBo.setRuleId(null);
988 }
989 if(agendaItemBo.getWhenTrue()!=null){
990 agendaItemBo.setWhenTrue(null);
991 agendaItemBo.setWhenTrueId(null);
992 }
993 if(agendaItemBo.getWhenFalse()!=null){
994 agendaItemBo.setWhenFalse(null);
995 agendaItemBo.setWhenFalseId(null);
996 }
997 if(agendaItemBo.getAlways()!=null){
998 agendaItemBo.setAlways(null);
999 agendaItemBo.setAlwaysId(null);
1000 }
1001 getBusinessObjectService().save(agendaItemBo);
1002 }
1003
1004 itemPks = new HashMap<String, String>();
1005 itemPks.put("agenda_id", oldAgenda.getId());
1006 items = (List<AgendaItemBo>) getBusinessObjectService().findMatching(AgendaItemBo.class, itemPks);
1007 for(AgendaItemBo agendaItemBo : items){
1008 getBusinessObjectService().delete(agendaItemBo);
1009 }
1010
1011 getBusinessObjectService().delete(oldAgenda);
1012 List<AgendaBo> agendas = context.getAgendas();
1013 AgendaBo removeAgenda = null;
1014 for (AgendaBo agenda : agendas) {
1015 if (agenda.getName().equalsIgnoreCase(oldAgenda.getName())) {
1016 removeAgenda = agenda;
1017 }
1018 }
1019 agendas.remove(removeAgenda);
1020 context.setAgendas(agendas);
1021 getBusinessObjectService().save(context);
1022
1023
1024
1025
1026 HashMap matchingProfileAttr = new HashMap();
1027 matchingProfileAttr.put("agenda_name", oldAgenda.getName());
1028 List<ProfileAttributeBo> profileAttributeBos =
1029 (List<ProfileAttributeBo>) getBusinessObjectService().findMatching(ProfileAttributeBo.class, matchingProfileAttr);
1030 getBusinessObjectService().delete(profileAttributeBos);
1031
1032 HashMap matchingOleDataField = new HashMap();
1033 matchingProfileAttr.put("agenda_name", oldAgenda.getName());
1034 List<OleDataField> matchingOleDataFields =
1035 (List<OleDataField>) getBusinessObjectService().findMatching(OleDataField.class, matchingOleDataField);
1036 getBusinessObjectService().delete(matchingOleDataFields);
1037
1038 HashMap matchingOverlayOption = new HashMap();
1039 matchingProfileAttr.put("agenda_name", oldAgenda.getName());
1040 List<OverlayOption> matchingOverlayOptions =
1041 (List<OverlayOption>) getBusinessObjectService().findMatching(OverlayOption.class, matchingOverlayOption);
1042 getBusinessObjectService().delete(matchingOverlayOptions);
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056 HashMap matchingProfileFacts = new HashMap();
1057 matchingProfileFacts.put("agenda_name", oldAgenda.getName());
1058 List<MatchBo> matchBos =
1059 (List<MatchBo>) getBusinessObjectService().findMatching(MatchBo.class, matchingProfileFacts);
1060 getBusinessObjectService().delete(matchBos);
1061 }
1062
1063
1064
1065
1066 private void unregisterFunctionLoader() {
1067 HashMap map = new HashMap();
1068 map.put("nm", "functionLoader");
1069 List<KrmsTypeBo> matching = (List<KrmsTypeBo>) getBusinessObjectService().findMatching(KrmsTypeBo.class, map);
1070 if (!matching.isEmpty()) {
1071 getBusinessObjectService().delete(matching);
1072 }
1073 }
1074
1075
1076
1077
1078 private void deleteRegisteredRules(OleKrmsAgenda oleAgenda) {
1079 Map map = new HashMap();
1080 List<OleKrmsRule> rules = oleAgenda.getRules();
1081 for (Iterator<OleKrmsRule> iterator = rules.iterator(); iterator.hasNext(); ) {
1082 OleKrmsRule krmsRule = iterator.next();
1083 OleSimpleProposition simpleProposition = krmsRule.getOleProposition().getSimpleProposition();
1084 OleCompoundProposition compoundProposition = krmsRule.getOleProposition().getCompoundProposition();
1085 if(simpleProposition!=null){
1086 List<OleTerm> terms =simpleProposition.getTerms();
1087 for(OleTerm term : terms){
1088 deleteTerm(term.getValue()) ;
1089 }
1090 }
1091 if(compoundProposition!=null){
1092 deleteCompoundProposition(compoundProposition);
1093 }
1094 map.put("nm", krmsRule.getName()+oleAgenda.getName());
1095 List<RuleBo> matching = (List<RuleBo>) getBusinessObjectService().findMatching(RuleBo.class, map);
1096 getBusinessObjectService().delete(matching);
1097 }
1098 }
1099
1100
1101
1102
1103
1104 private void deleteCompoundProposition(OleCompoundProposition compoundProposition){
1105 for(OleCompoundProposition compoundProposition1 : compoundProposition.getCompoundPropositions()!=null?compoundProposition.getCompoundPropositions():new ArrayList<OleCompoundProposition>()){
1106 deleteCompoundProposition(compoundProposition1);
1107 }
1108 for(OleSimpleProposition simpleProposition : compoundProposition.getSimplePropositions()!=null?compoundProposition.getSimplePropositions():new ArrayList<OleSimpleProposition>()){
1109 List<OleTerm> terms =simpleProposition.getTerms();
1110 for(OleTerm term : terms){
1111 deleteTerm(term.getValue()) ;
1112 }
1113 }
1114 }
1115
1116
1117
1118
1119
1120 private void deleteTerm(String term) {
1121 Map map = new HashMap();
1122 map.put("desc_txt", term);
1123 List<TermBo> termsToBeDeleted = (List<TermBo>) getBusinessObjectService().findMatching(TermBo.class, map);
1124 if (!termsToBeDeleted.isEmpty()) {
1125 getBusinessObjectService().delete(termsToBeDeleted);
1126 }
1127 }
1128
1129
1130
1131
1132
1133
1134 public ContextValidActionBo registerDefaultServiceTypes(ContextBo contextBo) {
1135 KrmsTypeBo actionTypeService = createActionTypeService();
1136 ContextValidActionBo contextValidActionBo;
1137 Object existing = objectExists(ContextValidActionBo.class, "actn_typ_id", actionTypeService.getId());
1138 if (existing == null) {
1139 contextValidActionBo = new ContextValidActionBo();
1140 contextValidActionBo.setActionType(actionTypeService);
1141 contextValidActionBo.setActionTypeId(actionTypeService.getId());
1142 contextValidActionBo.setContextId(contextBo.getId());
1143 getBusinessObjectService().save(contextValidActionBo);
1144 } else {
1145 contextValidActionBo = (ContextValidActionBo) existing;
1146 }
1147 return contextValidActionBo;
1148 }
1149
1150
1151
1152
1153 public KrmsTypeBo createActionTypeService() {
1154 KrmsTypeBo actionTypeService;
1155 String typeName = "KRMS Action";
1156 Object existing = objectExists(KrmsTypeBo.class, "nm", typeName);
1157 if (existing == null) {
1158 actionTypeService = new KrmsTypeBo();
1159 actionTypeService.setActive(true);
1160 actionTypeService.setName("KRMS Action");
1161 actionTypeService.setNamespace(OLEConstants.OLE_NAMESPACE);
1162 actionTypeService.setServiceName("krmsActionTypeService");
1163 getBusinessObjectService().save(actionTypeService);
1164 } else {
1165 actionTypeService = (KrmsTypeBo) existing;
1166 }
1167 return actionTypeService;
1168 }
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179 public ActionBo addActionToRule(String namespace, String actionName, String description, String actionTypeId, RuleBo ruleBo, Integer sequenceNumber) {
1180 ActionBo actionBo = new ActionBo();
1181 HashMap<String, String> map = new HashMap<String, String>();
1182 map.put("nm", actionName);
1183 map.put("rule_id",ruleBo.getId());
1184 List<ActionBo> matching = (List<ActionBo>) getBusinessObjectService().findMatching(ActionBo.class, map);
1185 Object existing = matching.isEmpty() ? null : matching.get(0);
1186 if (existing == null) {
1187 actionBo.setName(actionName);
1188 actionBo.setRuleId(ruleBo.getId());
1189 actionBo.setNamespace(namespace);
1190 actionBo.setSequenceNumber(sequenceNumber);
1191 actionBo.setDescription(description);
1192 actionBo.setTypeId(actionTypeId);
1193 getBusinessObjectService().save(actionBo);
1194 List<ActionBo> actionBos = ruleBo.getActions();
1195 if (null == actionBos) {
1196 actionBos = new ArrayList<ActionBo>();
1197 }
1198 actionBos.add(actionBo);
1199 ruleBo.setActions(actionBos);
1200 getBusinessObjectService().save(ruleBo);
1201 } else {
1202 actionBo = (ActionBo) existing;
1203 }
1204 return actionBo;
1205 }
1206
1207
1208
1209
1210
1211
1212
1213 public AgendaItemBo addDummyRuleForFalseAction(RuleBo ruleBo, RuleBo falseActionRuleBo) {
1214 HashMap<String, String> map = new HashMap<String, String>();
1215 map.put("rule_id", ruleBo.getId());
1216 List<AgendaItemBo> matching =
1217 (List<AgendaItemBo>) getBusinessObjectService().findMatching(AgendaItemBo.class, map);
1218 AgendaItemBo existingAgendaItemBo = matching.get(0);
1219
1220 AgendaItemBo falseActionAgendaItemBo = new AgendaItemBo();
1221 falseActionAgendaItemBo.setAgendaId(existingAgendaItemBo.getAgendaId());
1222 RuleBo falseRuleBo = getBusinessObjectService().findBySinglePrimaryKey(RuleBo.class,falseActionRuleBo.getId());
1223 if(falseRuleBo!=null){
1224 falseActionAgendaItemBo.setRule(falseRuleBo);
1225 falseActionAgendaItemBo.setRuleId(falseRuleBo.getId());
1226 }
1227 getBusinessObjectService().save(falseActionAgendaItemBo);
1228 existingAgendaItemBo.setWhenFalse(falseActionAgendaItemBo);
1229 getBusinessObjectService().save(existingAgendaItemBo);
1230 return existingAgendaItemBo;
1231 }
1232
1233
1234
1235
1236
1237
1238
1239 private PropositionBo createSimpleProposition(OleSimpleProposition proposition){
1240 List<String> parameterTypes = new ArrayList<String>();
1241 List<OleTerm> terms = proposition.getTerms();
1242 OleTerm term =terms.get(0);
1243 if(terms.size()>1){
1244 return createSimplePropositionWithTerms(proposition, terms,parameterTypes) ;
1245 }
1246 List<OleValue> values = proposition.getValues()!=null?proposition.getValues():new ArrayList<OleValue>();
1247
1248 TermSpecificationBo termSpecification =
1249 createTermSpecification(OLEConstants.OLE_NAMESPACE,term.getValue(), term.getType(), Arrays.asList(category), Arrays.asList(context));
1250
1251 TermBo termBo = createTerm(term.getValue(), termSpecification);
1252 List<PropositionBo> propositionBos = new ArrayList<PropositionBo>();
1253 int i =0;
1254 PropositionBo propositionBo = null;
1255 for(OleValue value :values){
1256
1257 propositionBo = createProposition(category.getId(), term.getValue() + value.getName(), "S", ruleBo,i++);
1258
1259 addTermToPropositionParameter(termBo.getId(), propositionBo,0);
1260
1261 addConstantToPropositionParameter(value.getName(),propositionBo);
1262
1263 addOperatorToPropositionParameter(operators.get(proposition.getOperator()),propositionBo);
1264
1265 propositionBos.add(propositionBo);
1266
1267 }
1268 if(propositionBo==null && proposition.getFunction()!=null){
1269
1270 propositionBo = createProposition(category.getId(), term.getValue() + proposition.getFunction(), "S", ruleBo,i++);
1271
1272
1273 parameterTypes.add(term.getType());
1274
1275 FunctionBo function = createFunction(OLEConstants.OLE_NAMESPACE, proposition.getFunction(), "java.lang.Boolean", Arrays.asList(category),parameterTypes);
1276
1277 addTermToPropositionParameter(termBo.getId(), propositionBo,0);
1278
1279 addCustomFunctionToPropositionParameter(function.getId(),propositionBo,1);
1280 }
1281 if(propositionBos.size()>1){
1282 propositionBo = createCompoundProposition(category.getId(),term.getValue() + "compound","C",ruleBo,"|");
1283 propositionBo.setCompoundComponents(propositionBos);
1284 getBusinessObjectService().save(propositionBo);
1285 }
1286 persistMatchBo(agendaBo, term);
1287 return propositionBo;
1288 }
1289
1290 private PropositionBo createSimplePropositionWithTerms(OleSimpleProposition proposition, List<OleTerm> terms,List<String> parameterTypes) {
1291 PropositionBo propositionBo = createProposition(category.getId(), "Two Terms", "S", ruleBo,0);
1292 int seqNum=0;
1293 for(OleTerm term :terms){
1294 TermSpecificationBo termSpecification =
1295 createTermSpecification(OLEConstants.OLE_NAMESPACE,term.getValue(), term.getType(), Arrays.asList(category), Arrays.asList(context));
1296 TermBo termBo = createTerm(term.getValue(), termSpecification);
1297 addTermToPropositionParameter(termBo.getId(), propositionBo,seqNum);
1298 parameterTypes.add(term.getType()) ;
1299 persistMatchBo(agendaBo, term);
1300 seqNum ++;
1301 }
1302 if(proposition.getFunction()!=null){
1303 FunctionBo function = createFunction(OLEConstants.OLE_NAMESPACE, proposition.getFunction(), "java.lang.Boolean", Arrays.asList(category),parameterTypes);
1304 addCustomFunctionToPropositionParameter(function.getId(),propositionBo,seqNum);
1305 }
1306 if(proposition.getOperator()!=null){
1307 addOperatorToPropositionParameter(operators.get(proposition.getOperator()),propositionBo);
1308 }
1309 getBusinessObjectService().save(propositionBo);
1310 return propositionBo;
1311 }
1312
1313
1314
1315
1316
1317
1318 public CategoryBo getCategory() {
1319 return category;
1320 }
1321
1322
1323
1324
1325
1326 public void setCategory(CategoryBo category) {
1327 this.category = category;
1328 }
1329
1330
1331
1332
1333
1334 public ContextBo getContext() {
1335 return context;
1336 }
1337
1338
1339
1340
1341
1342 public void setContext(ContextBo context) {
1343 this.context = context;
1344 }
1345
1346
1347
1348
1349
1350 public AgendaBo getAgendaBo() {
1351 return agendaBo;
1352 }
1353
1354
1355
1356
1357
1358 public void setAgendaBo(AgendaBo agendaBo) {
1359 this.agendaBo = agendaBo;
1360 }
1361
1362
1363
1364
1365
1366 public RuleBo getRuleBo() {
1367 return ruleBo;
1368 }
1369
1370
1371
1372
1373
1374 public void setRuleBo(RuleBo ruleBo) {
1375 this.ruleBo = ruleBo;
1376 }
1377 }