001 /** 002 * Copyright 2005-2014 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.impl.repository; 017 018 import java.util.ArrayList; 019 import java.util.List; 020 021 import org.kuali.rice.krad.inquiry.InquirableImpl; 022 import org.kuali.rice.krad.uif.component.Component; 023 import org.kuali.rice.krad.uif.container.Container; 024 import org.kuali.rice.krad.uif.container.Group; 025 import org.kuali.rice.krad.uif.element.Message; 026 import org.kuali.rice.krad.uif.field.SpaceField; 027 import org.kuali.rice.krad.uif.layout.GridLayoutManager; 028 import org.kuali.rice.krad.uif.util.ComponentFactory; 029 import org.kuali.rice.krad.uif.view.ViewModel; 030 import org.kuali.rice.krad.web.form.InquiryForm; 031 import org.kuali.rice.krms.api.repository.proposition.PropositionType; 032 033 /** 034 * This class is responsible for building the recursive components on the Rule Inquiry View. 035 */ 036 public class RuleStudentInquiryViewHelperServiceImpl extends InquirableImpl { 037 038 private static int ID = 1; 039 040 private static final String PROPOSITION_GROUP_ID = "propositionGroup"; 041 042 private static final String PROPOSITION_ID = "proposition"; 043 044 private enum Operator { 045 OR("|"), AND("&"); 046 047 private String code; 048 049 Operator(String code) { 050 this.code = code; 051 } 052 053 private static Operator fromCode(String code) { 054 if (code == null) { 055 return null; 056 } 057 for (Operator operator : values()) { 058 if (operator.code.equals(code)) { 059 return operator; 060 } 061 } 062 throw new IllegalArgumentException("Failed to locate the Operator with the given code: " + code); 063 } 064 } 065 066 067 068 @Override 069 public void addCustomContainerComponents(ViewModel model, Container container) { 070 if (PROPOSITION_GROUP_ID.equals(container.getId())) { 071 RuleBo ruleDataObj = (RuleBo)((InquiryForm)model).getDataObject(); 072 PropositionBo proposition = ruleDataObj.getProposition(); 073 if (proposition != null) { 074 if (PropositionType.COMPOUND.getCode().equals(proposition.getPropositionTypeCode())) { 075 List<Component> groups = new ArrayList<Component>(); 076 handleCompoundPropositions(groups, proposition); 077 container.setItems(groups); 078 } else { 079 Message simplePropName = ComponentFactory.getMessage(); 080 simplePropName.setId(PROPOSITION_ID + "_" + ID++); 081 simplePropName.setMessageText(proposition.getDescription()); 082 List<Message> simpleProps = new ArrayList<Message>(); 083 simpleProps.add(simplePropName); 084 container.setItems(simpleProps); 085 } 086 } 087 } 088 } 089 090 private void handleCompoundPropositions(List<Component> components, PropositionBo proposition) { 091 Group compoundGroup = getPropositionGroup(); 092 compoundGroup.setId(String.valueOf(PROPOSITION_GROUP_ID + "_" + ID++)); 093 ((GridLayoutManager)compoundGroup.getLayoutManager()).setNumberOfColumns(2); 094 095 List<Component> componentItems = new ArrayList<Component>(); 096 097 //Heading 098 Message propositionName = ComponentFactory.getMessage(); 099 propositionName.setId(PROPOSITION_ID + "_" + ID++); 100 propositionName.setMessageText(proposition.getDescription()); 101 102 componentItems.add(propositionName); 103 104 //Space (for layout purposes) 105 SpaceField spaceField1 = ComponentFactory.getSpaceField(); 106 spaceField1.setId("space" + "_" + ID++); 107 componentItems.add(spaceField1); 108 109 //Space (for layout purposes) 110 SpaceField spaceField2 = ComponentFactory.getSpaceField(); 111 spaceField2.setId("space" + "_" + ID++); 112 componentItems.add(spaceField2); 113 114 if (proposition.getCompoundComponents() != null) { 115 int loopCounter = 0; 116 for (PropositionBo nestedProposition : proposition.getCompoundComponents()) { 117 if (loopCounter != 0) { 118 119 //Space (for layout purposes) 120 SpaceField spaceField3 = ComponentFactory.getSpaceField(); 121 spaceField3.setId("space" + "_" + ID++); 122 componentItems.add(spaceField3); 123 124 Message operator = ComponentFactory.getMessage(); 125 operator.setId(PROPOSITION_ID + "_" + ID++); 126 operator.setMessageText(Operator.fromCode(proposition.getCompoundOpCode()).toString()); 127 componentItems.add(operator); 128 129 //Space (for layout purposes) 130 SpaceField spaceField4 = ComponentFactory.getSpaceField(); 131 spaceField4.setId("space" + "_" + ID++); 132 componentItems.add(spaceField4); 133 } 134 if (PropositionType.COMPOUND.getCode().equals(nestedProposition.getPropositionTypeCode())) { 135 handleCompoundPropositions(components, nestedProposition); 136 } else { 137 Message simplePropName = ComponentFactory.getMessage(); 138 simplePropName.setId(PROPOSITION_ID + "_" + ID++); 139 simplePropName.setMessageText(nestedProposition.getDescription()); 140 141 componentItems.add(simplePropName); 142 } 143 loopCounter++; 144 } 145 } 146 compoundGroup.setItems(componentItems); 147 148 components.add(compoundGroup); 149 } 150 151 private static Group getPropositionGroup() { 152 Group group = (Group) ComponentFactory.getGroupGridBodyOnly(); 153 group.getDisclosure().setId(String.valueOf(ID++)); 154 return group; 155 } 156 157 }