001package org.kuali.ole.ingest; 002 003import org.kuali.ole.OLEConstants; 004import org.kuali.ole.ingest.pojo.*; 005import org.kuali.rice.core.api.resourceloader.GlobalResourceLoader; 006import org.kuali.rice.kew.impl.peopleflow.PeopleFlowBo; 007import org.kuali.rice.krad.service.BusinessObjectService; 008import org.kuali.rice.krad.service.KRADServiceLocator; 009import org.kuali.rice.krms.impl.repository.*; 010 011import java.io.IOException; 012import java.net.URISyntaxException; 013import java.util.*; 014 015/** 016 * KrmsBuilder will create context,category and rules for creating agenda and finally persists into database. 017 */ 018public class KrmsBuilder { 019 020 private BusinessObjectService businessObjectService; 021 private TermBoService termBoService; 022 private KrmsObjectGeneratorFromXML krmsObjectGeneratorFromXML; 023 private ProfileBuilder profileBuilder = new ProfileBuilder(); 024 private CategoryBo category; 025 private ContextBo context; 026 private AgendaBo agendaBo; 027 private RuleBo ruleBo; 028 029 /** 030 * This method returns the contextBo object based on the namespace and contextName parameters. 031 * Creates a new object, stores it in database and returns if none exists, otherwise returns the existing object. 032 * @param namespace 033 * @param contextName 034 * @return contextBo 035 */ 036 public ContextBo createContext(String namespace, String contextName) { 037 038 return profileBuilder.createContext(namespace,contextName); 039 } 040 041 /** 042 * This method returns the Object value if it exists or else null value based on objectClass, key and value parameters. 043 * @param objectClass 044 * @param key 045 * @param value 046 * @return object 047 */ 048 public Object objectExists(Class objectClass, String key, String value) { 049 050 return profileBuilder.objectExists(objectClass,key,value); 051 } 052 053 /** 054 * Returns the businessObjectService value 055 * @return businessObjectService 056 */ 057 private BusinessObjectService getBusinessObjectService() { 058 if (null == businessObjectService) { 059 businessObjectService = KRADServiceLocator.getBusinessObjectService(); 060 } 061 return businessObjectService; 062 } 063 064 /** 065 * This method returns the categoryBo object based on the namespace and the categoryName parameters. 066 * Creates a new object, stores it in database and returns if none exists, otherwise returns the existing object. 067 * @param namespace 068 * @param categoryName 069 * @return categoryBo 070 */ 071 public CategoryBo createCategory(String namespace, String categoryName) { 072 073 return profileBuilder.createCategory(namespace,categoryName); 074 } 075 076 /** 077 * This method save the DefaultFunctionLoader into the database. 078 */ 079 public void registerDefaultFunctionLoader() { 080 profileBuilder.registerDefaultFunctionLoader(); 081 } 082 083 /** 084 * This method returns the agendaBo object based on the agendaName and contextBo parameters. 085 * Creates a new object, stores it in database and returns if none exists, otherwise returns the existing object. 086 * @param agendaName 087 * @param contextBo 088 * @return agendaBo 089 */ 090 public AgendaBo createAgenda(String agendaName, ContextBo contextBo) { 091 092 return profileBuilder.createAgenda(agendaName, contextBo); 093 } 094 095 /** 096 * This method returns the termSpecificationBo object based on the namespace, termSpecificationName, type, categoryBoList and contextBoList parameters. 097 * Creates a new object, stores it in database and returns if none exists, otherwise returns the existing object. 098 * @param namespace 099 * @param termSpecificationName 100 * @param type 101 * @param categoryBoList 102 * @param contextBoList 103 * @return termSpecificationBo 104 */ 105 public TermSpecificationBo createTermSpecification(String namespace, String termSpecificationName, String type, List<CategoryBo> categoryBoList, List<ContextBo> contextBoList) { 106 107 return profileBuilder.createTermSpecification(namespace,termSpecificationName,type,categoryBoList,contextBoList); 108 } 109 110 /** 111 * This method returns the termBoService object through the GlobalResourceLoader class. 112 * @return termBoService 113 */ 114 private TermBoService getTermBoService() { 115 if (null == termBoService) { 116 termBoService = GlobalResourceLoader.getService("termBoService"); 117 } 118 return termBoService; 119 } 120 121 /** 122 * This method returns the termBo object based on the name and termSpecificationBo parameters 123 * Creates a new object, stores it in database and returns if none exists, otherwise returns the existing object. 124 * @param name 125 * @param termSpecificationBo 126 * @return termBo 127 */ 128 public TermBo createTerm(String name, TermSpecificationBo termSpecificationBo) { 129 130 return profileBuilder.createTerm(name,termSpecificationBo); 131 } 132 133 /** 134 * This method returns the ruleBo object based on the name and termSpecificationBo parameters 135 * Creates a new object, stores it in database and returns if none exists, otherwise returns the existing object. 136 * @param namespace 137 * @param ruleName 138 * @return ruleBo 139 */ 140 public RuleBo createRule(String namespace, String ruleName) { 141 142 return profileBuilder.createRule(namespace, ruleName); 143 } 144 145 /** 146 * This method returns the agendaBo object based on the agendaBo, ruleBo and count parameters 147 * Creates a new object, stores it in database and returns if none exists, otherwise returns the existing object. 148 * @param agendaBo 149 * @param ruleBo 150 * @param count 151 * @return agendaBo 152 */ 153 public AgendaBo addRuleToAgenda(AgendaBo agendaBo, RuleBo ruleBo,int count) { 154 AgendaItemBo agendaItemBo = new AgendaItemBo(); 155 agendaItemBo.setAgendaId(agendaBo.getId()); 156 agendaItemBo.setRule(ruleBo); 157 getBusinessObjectService().save(agendaItemBo); 158 List<AgendaItemBo> agendaBoItems = agendaBo.getItems(); 159 if (null == agendaBoItems) { 160 agendaBoItems = new ArrayList<AgendaItemBo>(); 161 } 162 agendaBoItems.add(agendaItemBo); 163 agendaBo.setItems(agendaBoItems); 164 agendaBo.setFirstItemId(agendaBoItems.get(0).getId()); 165 if(count>-1){ 166 AgendaItemBo updateAgendaItem = agendaBoItems.get(count); 167 updateAgendaItem.setAlways(agendaItemBo); 168 getBusinessObjectService().save(updateAgendaItem); 169 } 170 getBusinessObjectService().save(agendaBo); 171 return agendaBo; 172 } 173 174 /** 175 * This method returns the propositionBo object based on the categoryId, propositionDescription, propositionType, rule and seqNum parameters 176 * Creates a new object, stores it in database and returns the object. 177 * @param categoryId 178 * @param propositionDescription 179 * @param propositionType 180 * @param rule 181 * @param seqNum 182 * @return propositionBo 183 */ 184 public PropositionBo createProposition(String categoryId, String propositionDescription, String propositionType, RuleBo rule,Integer seqNum) { 185 PropositionBo propositionBo = new PropositionBo(); 186 propositionBo.setCategoryId(categoryId); 187 propositionBo.setDescription(propositionDescription); 188 propositionBo.setRuleId(rule.getId()); 189 propositionBo.setPropositionTypeCode(propositionType); 190 propositionBo.setCompoundSequenceNumber(seqNum); 191 getBusinessObjectService().save(propositionBo); 192 return propositionBo; 193 } 194 195 /** 196 * This method returns the propositionBo object based on the categoryId, propositionDescription, propositionType, rule and operatorCode parameters 197 * Creates a new object, stores it in database and returns the object. 198 * @param categoryId 199 * @param propositionDescription 200 * @param propositionType 201 * @param rule 202 * @param operatorCode 203 * @return propositionBo 204 */ 205 public PropositionBo createCompoundProposition(String categoryId, String propositionDescription, String propositionType, RuleBo rule,String operatorCode) { 206 PropositionBo propositionBo = new PropositionBo(); 207 propositionBo.setCategoryId(categoryId); 208 propositionBo.setDescription(propositionDescription); 209 propositionBo.setRuleId(rule.getId()); 210 propositionBo.setPropositionTypeCode(propositionType); 211 propositionBo.setCompoundOpCode(operatorCode); 212 getBusinessObjectService().save(propositionBo); 213 return propositionBo; 214 } 215 216 /** 217 * This method returns the functionBo object based on the namespace, termName, returnType, categories and parameterType parameters 218 * Creates a new object, stores it in database and returns if none exists, otherwise returns the existing object. 219 * @param namespace 220 * @param termName 221 * @param returnType 222 * @param categories 223 * @param parameterType 224 * @return functionBo 225 */ 226 public FunctionBo createFunction(String namespace, String termName, String returnType, List categories,String parameterType) { 227 Object existing = objectExists(FunctionBo.class, "nm", termName + "Function"); 228 FunctionBo functionBo; 229 if (existing == null) { 230 HashMap<String, String> map = new HashMap<String, String>(); 231 map.put("nm", "FunctionLoader"); 232 List<KrmsTypeBo> matching = 233 (List<KrmsTypeBo>) getBusinessObjectService().findMatching(KrmsTypeBo.class, map); 234 KrmsTypeBo krmsTypeBo = matching.get(0); 235 functionBo = new FunctionBo(); 236 functionBo.setActive(true); 237 functionBo.setName(termName + "Function"); 238 functionBo.setNamespace(namespace); 239 functionBo.setReturnType(returnType); 240 functionBo.setCategories(categories); 241 functionBo.setTypeId(krmsTypeBo.getId()); 242 getBusinessObjectService().save(functionBo); 243 244 FunctionParameterBo functionParameterBo = new FunctionParameterBo(); 245 functionParameterBo.setFunctionId(functionBo.getId()); 246 functionParameterBo.setParameterType(parameterType); 247 functionParameterBo.setName(termName); 248 functionParameterBo.setSequenceNumber(0); 249 250 getBusinessObjectService().save(functionParameterBo); 251 252 List<FunctionParameterBo> parameters = functionBo.getParameters(); 253 if (null == parameters) { 254 parameters = new ArrayList<FunctionParameterBo>(); 255 } 256 parameters.add(functionParameterBo); 257 functionBo.setParameters(parameters); 258 259 getBusinessObjectService().save(functionBo); 260 } else { 261 functionBo = (FunctionBo) existing; 262 } 263 264 return functionBo; 265 } 266 267 /** 268 * This method returns the PropositionBo object based on the termId and proposition parameters 269 * Creates a new object, stores it in database and returns the object. 270 * @param termId 271 * @param proposition 272 * @return PropositionBo 273 */ 274 public PropositionBo addTermToPropositionParameter(String termId, PropositionBo proposition) { 275 276 return profileBuilder.addTermToPropositionParameter(termId,proposition); 277 } 278 279 /** 280 * This method returns the PropositionBo object based on the operator and proposition parameters 281 * Creates a new object, stores it in database and returns the object. 282 * @param operator 283 * @param proposition 284 * @return proposition 285 */ 286 public PropositionBo addOperatorToPropositionParameter(String operator,PropositionBo proposition){ 287 PropositionParameterBo propositionParameterBo = new PropositionParameterBo(); 288 propositionParameterBo.setPropId(proposition.getId()); 289 propositionParameterBo.setValue(operator); 290 propositionParameterBo.setSequenceNumber(2); 291 propositionParameterBo.setParameterType("O"); 292 getBusinessObjectService().save(propositionParameterBo); 293 List<PropositionParameterBo> parameters = proposition.getParameters(); 294 if (null == parameters) { 295 parameters = new ArrayList<PropositionParameterBo>(); 296 } 297 parameters.add(propositionParameterBo); 298 proposition.setParameters(parameters); 299 getBusinessObjectService().save(proposition); 300 return proposition; 301 } 302 303 /** 304 * This method returns the PropositionBo object based on the constant and proposition parameters 305 * Creates a new object, stores it in database and returns the object. 306 * @param constant 307 * @param proposition 308 * @return proposition 309 */ 310 public PropositionBo addConstantToPropositionParameter(String constant,PropositionBo proposition){ 311 PropositionParameterBo propositionParameterBo = new PropositionParameterBo(); 312 propositionParameterBo.setPropId(proposition.getId()); 313 propositionParameterBo.setValue(constant); 314 propositionParameterBo.setSequenceNumber(1); 315 propositionParameterBo.setParameterType("C"); 316 getBusinessObjectService().save(propositionParameterBo); 317 List<PropositionParameterBo> parameters = proposition.getParameters(); 318 if (null == parameters) { 319 parameters = new ArrayList<PropositionParameterBo>(); 320 } 321 parameters.add(propositionParameterBo); 322 proposition.setParameters(parameters); 323 getBusinessObjectService().save(proposition); 324 return proposition; 325 } 326 327 /** 328 * This method returns the PropositionBo object based on the functionId and proposition parameters 329 * Creates a new object, stores it in database and returns the object. 330 * @param functionId 331 * @param proposition 332 * @return PropositionBo 333 */ 334 public PropositionBo addCustomFunctionToPropositionParameter(String functionId, PropositionBo proposition) { 335 336 return profileBuilder.addCustomFunctionToPropositionParameter(functionId,proposition); 337 } 338 339 /** 340 * This method will create context,category and rules for creating agenda and finally persists into database. 341 * @param oleAgenda 342 * @return agendaName 343 */ 344 public String persist(OleAgenda oleAgenda) { 345 boolean agendaExists = doesKrmsExist(oleAgenda.getName()); 346 if(agendaExists){ 347 deleteAgenda(oleAgenda); 348 } 349 context = createContext(OLEConstants.OLE_NAMESPACE, oleAgenda.getContextName()); 350 category = createCategory(OLEConstants.OLE_NAMESPACE, oleAgenda.getCategoryName()); 351 352 registerDefaultFunctionLoader(); 353 354 ContextValidActionBo contextValidActionBo = registerDefaultServiceTypes(context); 355 356 agendaBo = createAgenda(oleAgenda.getName(), context); 357 358 List<KrmsRule> rules = oleAgenda.getRules(); 359 int count = -1; 360 for (Iterator<KrmsRule> iterator = rules.iterator(); iterator.hasNext(); ) { 361 KrmsRule rule = iterator.next(); 362 ruleBo = createRule(OLEConstants.OLE_NAMESPACE, rule.getName()); 363 364 addRuleToAgenda(agendaBo, ruleBo,count); 365 366 count++; 367 PropositionBo propositionBo = null; 368 369 if(rule.getProposition()!=null){ 370 propositionBo = createSimpleProposition(rule.getProposition(),1); 371 } 372 if(rule.getCompoundProposition()!=null){ 373 OleProposition oleProposition = rule.getCompoundProposition(); 374 List<PropositionBo> propositionBos = new ArrayList<PropositionBo>(); 375 propositionBos.addAll(createCompoundProposition(oleProposition, propositionBos)); 376 propositionBo = propositionBos.get(0); 377 } 378 ruleBo.setProposition(propositionBo); 379 getBusinessObjectService().save(ruleBo); 380 List<KrmsAction> trueActions =rule.getTrueActions()!=null && rule.getTrueActions().size()>0 ? rule.getTrueActions():new ArrayList<KrmsAction>(); 381 for (Iterator<KrmsAction> oleActionIterator = trueActions.iterator(); oleActionIterator.hasNext(); ) { 382 KrmsAction trueAction = oleActionIterator.next(); 383 contextValidActionBo = getContextValidActionBo(context,trueAction); 384 ActionBo actionBo = addActionToRule(OLEConstants.OLE_NAMESPACE, trueAction.getName(), trueAction.getDescription(), contextValidActionBo.getActionTypeId(), ruleBo, trueAction.getSequenceNumber()); 385 addActionAttributes(actionBo,trueAction.getName()); 386 } 387 388 List<KrmsAction> falseActions = rule.getFalseActions()!=null && rule.getFalseActions().size()>0 ? rule.getFalseActions():new ArrayList<KrmsAction>(); 389 for (Iterator<KrmsAction> oleActionIterator = falseActions.iterator(); oleActionIterator.hasNext(); ) { 390 KrmsAction falseAction = oleActionIterator.next(); 391 RuleBo falseActionRuleBo = createRule(OLEConstants.OLE_NAMESPACE, rule.getName() + "_falseActionRule"); 392 addActionToRule(OLEConstants.OLE_NAMESPACE, falseAction.getName(), falseAction.getDescription(), contextValidActionBo.getActionTypeId(), falseActionRuleBo, falseAction.getSequenceNumber()); 393 addDummyRuleForFalseAction(ruleBo, falseActionRuleBo); 394 } 395 396 } 397 persistProfileAttributes(oleAgenda); 398 return agendaBo.getName(); 399 } 400 401 /** 402 * This method creates compound proposition from the oleProposition and propositionBos parameters 403 * @param oleProposition 404 * @param propositionBos 405 */ 406 private List<PropositionBo> createCompoundProposition(OleProposition oleProposition, List<PropositionBo> propositionBos){ 407 408 if(oleProposition.getPropositions()!=null){ 409 List<PropositionBo> propositionBoList = new ArrayList<PropositionBo>(); 410 propositionBoList.add(createCompoundProposition(oleProposition.getPropositions(), oleProposition.getPropositionType())); 411 return propositionBoList; 412 } else if(oleProposition.getOlePropositions()!=null){ 413 PropositionBo propositionBo = null; 414 List<PropositionBo> propositionBoList = new ArrayList<PropositionBo>(); 415 for(OleProposition oleProposition1 : oleProposition.getOlePropositions()){ 416 propositionBoList.addAll(createCompoundProposition(oleProposition1, propositionBoList)); 417 } 418 propositionBo = createCompoundProposition(category.getId(),"compound","C",ruleBo,oleProposition.getPropositionType()); 419 propositionBo.setCompoundComponents(propositionBoList); 420 getBusinessObjectService().save(propositionBo); 421 propositionBoList = new ArrayList<PropositionBo>(); 422 propositionBoList.add(propositionBo); 423 return propositionBoList; 424 } 425 return null; 426 } 427 428 /** 429 * This method adds the action attributes to create the agenda. 430 * @param action 431 * @param peopleFlowName 432 */ 433 private void addActionAttributes(ActionBo action,String peopleFlowName){ 434 Map<String, String> peopleFlowPk = new HashMap<String, String>(); 435 peopleFlowPk.put("nm", peopleFlowName); 436 List<PeopleFlowBo> peopleFlowBos =(List<PeopleFlowBo>) getBusinessObjectService().findMatching(PeopleFlowBo.class, peopleFlowPk); 437 if(peopleFlowBos!=null && peopleFlowBos.size()>0){ 438 Map<String, String> attrDefPk = new HashMap<String, String>(); 439 attrDefPk.put("attr_defn_id", "1000"); 440 KrmsAttributeDefinitionBo peopleFlowIdDef = getBusinessObjectService().findByPrimaryKey(KrmsAttributeDefinitionBo.class,attrDefPk); 441 442 attrDefPk = new HashMap<String, String>(); 443 attrDefPk.put("attr_defn_id", "1006"); 444 KrmsAttributeDefinitionBo peopleFlowNameDef = getBusinessObjectService().findByPrimaryKey(KrmsAttributeDefinitionBo.class,attrDefPk); 445 446 Set<ActionAttributeBo> actionAttributeBos = new HashSet<ActionAttributeBo>(); 447 String peopleFlowId = peopleFlowBos.get(0).getId(); 448 ActionAttributeBo actionAttributeBo = new ActionAttributeBo(); 449 actionAttributeBo.setActionId(action.getId()); 450 actionAttributeBo.setAttributeDefinitionId(peopleFlowIdDef.getId()); 451 actionAttributeBo.setAttributeDefinition(peopleFlowIdDef); 452 actionAttributeBo.setValue(peopleFlowId); 453 getBusinessObjectService().save(actionAttributeBo); 454 actionAttributeBos.add(actionAttributeBo); 455 456 actionAttributeBo = new ActionAttributeBo(); 457 actionAttributeBo.setActionId(action.getId()); 458 actionAttributeBo.setAttributeDefinitionId(peopleFlowNameDef.getId()); 459 actionAttributeBo.setAttributeDefinition(peopleFlowNameDef); 460 actionAttributeBo.setValue(peopleFlowName); 461 getBusinessObjectService().save(actionAttributeBo); 462 actionAttributeBos.add(actionAttributeBo); 463 464 action.setAttributeBos(actionAttributeBos); 465 getBusinessObjectService().save(action); 466 467 } 468 469 } 470 471 /** 472 * This method returns the contextValidActionBo object based on the contextBo and action parameters 473 * Creates a new object, stores it in database and returns if none exists, otherwise returns the existing object. 474 * @param contextBo 475 * @param action 476 * @return contextValidActionBo 477 */ 478 private ContextValidActionBo getContextValidActionBo(ContextBo contextBo,KrmsAction action){ 479 KrmsTypeBo actionTypeService = getActiontypeService(action); 480 ContextValidActionBo contextValidActionBo =null; 481 if(actionTypeService!=null){ 482 Object existing = objectExists(ContextValidActionBo.class, "actn_typ_id", actionTypeService.getId()); 483 if (existing == null) { 484 contextValidActionBo = new ContextValidActionBo(); 485 contextValidActionBo.setActionType(actionTypeService); 486 contextValidActionBo.setActionTypeId(actionTypeService.getId()); 487 contextValidActionBo.setContextId(contextBo.getId()); 488 getBusinessObjectService().save(contextValidActionBo); 489 } else { 490 contextValidActionBo = (ContextValidActionBo) existing; 491 } 492 } 493 if(contextValidActionBo==null){ 494 contextValidActionBo = registerDefaultServiceTypes(contextBo); 495 } 496 return contextValidActionBo; 497 } 498 499 /** 500 * Lookups the database for the particular Servicename and the returns the krmsTypeBo object. 501 * @param action 502 * @return krmsTypeBo 503 */ 504 private KrmsTypeBo getActiontypeService(KrmsAction action){ 505 Map<String, String> krmsTypePk = new HashMap<String, String>(); 506 krmsTypePk.put("srvc_nm", action.getServiceName()); 507 KrmsTypeBo krmsTypeBo = getBusinessObjectService().findByPrimaryKey(KrmsTypeBo.class, krmsTypePk); 508 return krmsTypeBo; 509 } 510 511 /** 512 * This method persists the matchBo object based on the agendaBo and proposition parameters.. 513 * @param agendaBo 514 * @param proposition 515 */ 516 private void persistMatchBo(AgendaBo agendaBo, KrmsProposition proposition) { 517 MatchBo matchBo = new MatchBo(); 518 matchBo.setAgendaName(agendaBo.getName()); 519 matchBo.setTermName(proposition.getTerm()); 520 getBusinessObjectService().save(matchBo); 521 } 522 523 /** 524 * This method builds the Krms object from the fileContent parameter and the returns the list of agendaNames from the Krms object. 525 * @param fileContent 526 * @return agendaNames 527 * @throws java.io.IOException 528 * @throws java.net.URISyntaxException 529 */ 530 public List<String> persistKrmsFromFileContent(String fileContent) throws IOException, URISyntaxException { 531 Krms krms = getKrmsObjectGeneratorFromXML().buildKrmsFromFileContent(fileContent); 532 List<String> agendaNames = new ArrayList<String>(); 533 for(OleAgenda oleAgenda :krms.getOleAgendaList()){ 534 agendaNames.add(persist(oleAgenda)); 535 } 536 return agendaNames; 537 538 } 539 540 /** 541 * Gets the krmsObjectGeneratorFromXML object if exists, otherwise it creates a new object. 542 * @return krmsObjectGeneratorFromXML 543 */ 544 public KrmsObjectGeneratorFromXML getKrmsObjectGeneratorFromXML() { 545 if(null==krmsObjectGeneratorFromXML){ 546 krmsObjectGeneratorFromXML = new KrmsObjectGeneratorFromXML(); krmsObjectGeneratorFromXML = new KrmsObjectGeneratorFromXML(); 547 } 548 return krmsObjectGeneratorFromXML; 549 } 550 551 /** 552 * Sets the krmsObjectGeneratorFromXML value. 553 * @param krmsObjectGeneratorFromXML 554 */ 555 public void setKrmsObjectGeneratorFromXML(KrmsObjectGeneratorFromXML krmsObjectGeneratorFromXML) { 556 this.krmsObjectGeneratorFromXML = krmsObjectGeneratorFromXML; 557 } 558 559 /** 560 * Lookups the database based on the agendaName and returns a boolean value. 561 * @param agendaName 562 * @return Boolean 563 */ 564 public Boolean doesKrmsExist(String agendaName) { 565 HashMap<String, String> map = new HashMap<String, String>(); 566 map.put("nm", agendaName); 567 List<AgendaBo> matching = (List<AgendaBo>) getBusinessObjectService().findMatching(AgendaBo.class, map); 568 return !matching.isEmpty(); 569 } 570 571 /** 572 * This method deletes the term record from database. 573 * @param oleAgenda 574 */ 575 public void deleteAgenda(OleAgenda oleAgenda) { 576 577 Map<String, String> contextPks = new HashMap<String, String>(); 578 contextPks.put("nm", oleAgenda.getContextName()); 579 contextPks.put("nmspc_cd", OLEConstants.OLE_NAMESPACE); 580 ContextBo context = getBusinessObjectService().findByPrimaryKey(ContextBo.class, contextPks); 581 String contextId = context.getId(); 582 583 Map<String, String> agendaPks = new HashMap<String, String>(); 584 agendaPks.put("nm", oleAgenda.getName()); 585 agendaPks.put("cntxt_id", contextId); 586 AgendaBo oldAgenda = getBusinessObjectService().findByPrimaryKey(AgendaBo.class, agendaPks); 587 588 Map<String, String> itemPks = new HashMap<String, String>(); 589 itemPks.put("agenda_id", oldAgenda.getId()); 590 List<AgendaItemBo> items = (List<AgendaItemBo>) getBusinessObjectService().findMatching(AgendaItemBo.class, itemPks); 591 for(AgendaItemBo agendaItemBo : items){ 592 getBusinessObjectService().delete(agendaItemBo); 593 } 594 getBusinessObjectService().delete(oldAgenda); 595 596 List<AgendaBo> agendas = context.getAgendas(); 597 AgendaBo removeAgenda = null; 598 for (AgendaBo agenda : agendas) { 599 if (agenda.getName().equalsIgnoreCase(oldAgenda.getName())) { 600 removeAgenda = agenda; 601 } 602 } 603 agendas.remove(removeAgenda); 604 context.setAgendas(agendas); 605 getBusinessObjectService().save(context); 606 607 deleteRegisteredRules(oleAgenda); 608 609 HashMap matchingProfileAttr = new HashMap(); 610 matchingProfileAttr.put("agenda_name", oldAgenda.getName()); 611 List<ProfileAttributeBo> profileAttributeBos = 612 (List<ProfileAttributeBo>) getBusinessObjectService().findMatching(ProfileAttributeBo.class, matchingProfileAttr); 613 getBusinessObjectService().delete(profileAttributeBos); 614 615 HashMap matchingProfileFacts = new HashMap(); 616 matchingProfileFacts.put("agenda_name", oldAgenda.getName()); 617 List<MatchBo> matchBos = 618 (List<MatchBo>) getBusinessObjectService().findMatching(MatchBo.class, matchingProfileFacts); 619 getBusinessObjectService().delete(matchBos); 620 } 621 622 /** 623 * This method deletes the term related rules from database. 624 * @param oleAgenda 625 */ 626 private void deleteRegisteredRules(OleAgenda oleAgenda) { 627 Map map = new HashMap(); 628 List<KrmsRule> rules = oleAgenda.getRules(); 629 for (Iterator<KrmsRule> iterator = rules.iterator(); iterator.hasNext(); ) { 630 KrmsRule krmsRule = iterator.next(); 631 if(krmsRule.getProposition()!=null){ 632 String term = krmsRule.getProposition().getTerm(); 633 deleteTerm(term) ; 634 } 635 if(krmsRule.getCompoundProposition()!=null){ 636 deleteCompoundProposition(krmsRule.getCompoundProposition()); 637 } 638 map.put("nm", krmsRule.getName()); 639 List<RuleBo> matching = (List<RuleBo>) getBusinessObjectService().findMatching(RuleBo.class, map); 640 getBusinessObjectService().delete(matching); 641 } 642 } 643 644 /** 645 * This method deletes the compound proposition based on the oleProposition from database. 646 * @param oleProposition 647 */ 648 private void deleteCompoundProposition(OleProposition oleProposition){ 649 for(OleProposition oleProposition1 : oleProposition.getOlePropositions()!=null?oleProposition.getOlePropositions():new ArrayList<OleProposition>()){ 650 deleteCompoundProposition(oleProposition1); 651 } 652 for(KrmsProposition krmsProposition : oleProposition.getPropositions()!=null?oleProposition.getPropositions():new ArrayList<KrmsProposition>()){ 653 String term = krmsProposition.getTerm(); 654 deleteTerm(term) ; 655 } 656 } 657 658 /** 659 * This method deletes the term from database. 660 * @param term 661 */ 662 private void deleteTerm(String term) { 663 Map map = new HashMap(); 664 map.put("desc_txt", term); 665 List<TermBo> termsToBeDeleted = (List<TermBo>) getBusinessObjectService().findMatching(TermBo.class, map); 666 if (!termsToBeDeleted.isEmpty()) { 667 getBusinessObjectService().delete(termsToBeDeleted); 668 } 669 } 670 671 /** 672 * This method registers the default service types in the database for the context. 673 * @param contextBo 674 * @return ContextValidActionBo 675 */ 676 public ContextValidActionBo registerDefaultServiceTypes(ContextBo contextBo) { 677 return profileBuilder.registerDefaultServiceTypes(contextBo); 678 } 679 680 /** 681 * This method adds the action into rule to create the agenda. 682 * @param namespace 683 * @param actionName 684 * @param description 685 * @param actionTypeId 686 * @param ruleBo 687 * @param sequenceNumber 688 * @return ActionBo 689 */ 690 public ActionBo addActionToRule(String namespace, String actionName, String description, String actionTypeId, RuleBo ruleBo, Integer sequenceNumber) { 691 return profileBuilder.addActionToRule(namespace,actionName,description,actionTypeId,ruleBo,sequenceNumber); 692 } 693 694 /** 695 * This method adds the dummy rule into database for falseAction. 696 * @param ruleBo 697 * @param falseActionRuleBo 698 * @return AgendaItemBo 699 */ 700 public AgendaItemBo addDummyRuleForFalseAction(RuleBo ruleBo, RuleBo falseActionRuleBo) { 701 return profileBuilder.addDummyRuleForFalseAction(ruleBo,falseActionRuleBo); 702 } 703 704 /** 705 * This method persists the profile attributes in to database. 706 * @param oleAgenda 707 */ 708 private void persistProfileAttributes(OleAgenda oleAgenda) { 709 List<ProfileAttributeBo> profileAttributes = oleAgenda.getProfileAttributes(); 710 for (Iterator<ProfileAttributeBo> iterator = profileAttributes.iterator(); iterator.hasNext(); ) { 711 ProfileAttributeBo profileAttributeBo = iterator.next(); 712 profileAttributeBo.setAgendaName(oleAgenda.getName()); 713 } 714 getBusinessObjectService().save(profileAttributes); 715 } 716 717 /** 718 * This method creates a compound proposition based on the propositions list and opCode parameters and returns the propositionBo. 719 * @param propositions 720 * @param opCode 721 * @return PropositionBo 722 */ 723 private PropositionBo createCompoundProposition(List<KrmsProposition> propositions,String opCode){ 724 List<PropositionBo> propositionBos = new ArrayList<PropositionBo>(); 725 int seqNum = 0; 726 for(KrmsProposition proposition : propositions){ 727 PropositionBo propositionBo = createSimpleProposition(proposition,seqNum); 728 if(opCode==null){ 729 return propositionBo; 730 } 731 seqNum++; 732 propositionBos.add(propositionBo); 733 } 734 PropositionBo propositionBo = createCompoundProposition(category.getId(),"compound","C",ruleBo,opCode); 735 propositionBo.setCompoundComponents(propositionBos); 736 return propositionBo; 737 } 738 739 /** 740 * This method creates a simple proposition based on the proposition and seqNum parameters and returns the propositionBo. 741 * @param proposition 742 * @param seqNum 743 * @return PropositionBo 744 */ 745 private PropositionBo createSimpleProposition(KrmsProposition proposition,int seqNum){ 746 TermSpecificationBo termSpecification = 747 createTermSpecification(OLEConstants.OLE_NAMESPACE, proposition.getTerm(), proposition.getType(), Arrays.asList(category), Arrays.asList(context)); 748 749 TermBo termBo = createTerm(proposition.getTerm(), termSpecification); 750 751 752 PropositionBo propositionBo = createProposition(category.getId(), proposition.getTerm() + " check", "S", ruleBo,seqNum); 753 754 if(proposition.getFunction()!=null && proposition.getFunction().equalsIgnoreCase("yes")){ 755 756 FunctionBo function = createFunction(OLEConstants.OLE_NAMESPACE, proposition.getTerm(), "java.lang.Boolean", Arrays.asList(category),proposition.getType()); 757 758 addTermToPropositionParameter(termBo.getId(), propositionBo); 759 760 addCustomFunctionToPropositionParameter(function.getId(), propositionBo); 761 } else{ 762 763 addTermToPropositionParameter(termBo.getId(), propositionBo); 764 765 addConstantToPropositionParameter(proposition.getConstant(),propositionBo); 766 767 addOperatorToPropositionParameter(proposition.getOperator(),propositionBo); 768 } 769 persistMatchBo(agendaBo, proposition); 770 return propositionBo; 771 } 772 773 /** 774 * Gets the category attribute. 775 * @return Returns the category 776 */ 777 public CategoryBo getCategory() { 778 return category; 779 } 780 781 /** 782 * Sets the category attribute value. 783 * @param category .The category to set. 784 */ 785 public void setCategory(CategoryBo category) { 786 this.category = category; 787 } 788 789 /** 790 * Gets the context attribute. 791 * @return Returns the context 792 */ 793 public ContextBo getContext() { 794 return context; 795 } 796 797 /** 798 * Sets the Context attribute value. 799 * @param context 800 */ 801 public void setContext(ContextBo context) { 802 this.context = context; 803 } 804 805 /** 806 * Gets the agendaBo attribute. 807 * @return Returns agendaBo. 808 */ 809 public AgendaBo getAgendaBo() { 810 return agendaBo; 811 } 812 813 /** 814 * Sets the agendaBo attribute value. 815 * @param agendaBo 816 */ 817 public void setAgendaBo(AgendaBo agendaBo) { 818 this.agendaBo = agendaBo; 819 } 820 821 /** 822 * Gets the ruleBo attribute. 823 * @return Returns ruleBo. 824 */ 825 public RuleBo getRuleBo() { 826 return ruleBo; 827 } 828 829 /** 830 * Sets the ruleBo attribute value. 831 * @param ruleBo 832 */ 833 public void setRuleBo(RuleBo ruleBo) { 834 this.ruleBo = ruleBo; 835 } 836}