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 }