View Javadoc

1   package org.kuali.student.enrollment.class2.scheduleofclasses.util;
2   
3   import org.apache.commons.lang.StringUtils;
4   import org.kuali.student.enrollment.class2.courseoffering.dto.ActivityOfferingWrapper;
5   import org.kuali.student.enrollment.class2.courseoffering.dto.RegistrationGroupWrapper;
6   
7   import java.util.HashMap;
8   import java.util.List;
9   import java.util.Map;
10  import java.util.TreeMap;
11  
12  /**
13   * Helper class for building the requisites for display on Schedule of Classes screens
14   *
15   * @author Kuali Student Team
16   */
17  public class SOCRequisiteHelper {
18  
19      private SOCRequisiteWrapper reqWrapper;
20  
21      public SOCRequisiteHelper() {
22          reqWrapper = new SOCRequisiteWrapper();
23      }
24  
25      public SOCRequisiteWrapper getReqWrapper() {
26          return reqWrapper;
27      }
28  
29      public void setReqWrapper(SOCRequisiteWrapper reqWrapper) {
30          this.reqWrapper = reqWrapper;
31      }
32  
33      /**
34       * Build and populate requisites
35       *
36       * @param activityOfferingWrapperList
37       */
38      public void loadRequisites(List<ActivityOfferingWrapper> activityOfferingWrapperList) {
39          Map<String, String> overriddenRules = new TreeMap<String, String>();
40  
41          //Populate map of overridden CO requisites
42          for (String ruleType : reqWrapper.getRuleTypes()) {
43              if (!reqWrapper.getAoRequisiteTypeMap().isEmpty()) {
44                  for (Map.Entry<String, Map<String, String>> aoEntry : reqWrapper.getAoRequisiteTypeMap().entrySet()) {
45                      if (reqWrapper.getCoRequisiteTypeMap().containsKey(ruleType) && aoEntry.getValue().containsKey(ruleType)) {
46                          overriddenRules.put(ruleType, reqWrapper.getCoRequisiteTypeMap().get(ruleType));
47                          reqWrapper.getCoRequisiteTypeMap().remove(ruleType);
48                      }
49                  }
50              }
51          }
52  
53          loadAORequisites(overriddenRules);
54  
55          if (!overriddenRules.isEmpty()) {
56              loadcoOverridenRules(overriddenRules, activityOfferingWrapperList);
57          }
58  
59          if (!reqWrapper.getCoRequisiteTypeMap().isEmpty()) {
60              loadCORequisites();
61          }
62      }
63  
64      /**
65       * Build map of AO requisites and add overridden requisites
66       *
67       * @param overriddenRules
68       */
69      private void loadAORequisites(Map<String, String> overriddenRules) {
70          String aoRequisite;
71          for (String ruleType : reqWrapper.getRuleTypes()) {
72              if (!reqWrapper.getAoRequisiteTypeMap().isEmpty()) {
73                  for (Map.Entry<String, Map<String, String>> aoEntry : reqWrapper.getAoRequisiteTypeMap().entrySet()) {
74                      aoRequisite = new String();
75                      if (aoEntry.getValue().containsKey(ruleType)) {
76                          String aoValue = StringUtils.substringAfter(aoEntry.getValue().get(ruleType), ":");
77                          if(aoValue.length() > 1) {
78                              aoRequisite = aoEntry.getValue().get(ruleType);
79                          } else {
80                              reqWrapper.getSuppressNullMap().put(aoEntry.getKey(), ruleType);
81                          }
82                      } else if (!overriddenRules.isEmpty()) {
83                          if (overriddenRules.containsKey(ruleType)) {
84                              aoRequisite = overriddenRules.get(ruleType);
85                          }
86                      }
87  
88                      if (!aoRequisite.isEmpty()) {
89                          if (reqWrapper.getAoRequisiteMap().containsKey(aoEntry.getKey())) {
90                              reqWrapper.getAoRequisiteMap().get(aoEntry.getKey()).put(ruleType, aoRequisite);
91                              continue;
92                          }
93                          Map<String, String> temp = new TreeMap<String, String>();
94                          temp.put(ruleType, aoRequisite);
95                          reqWrapper.getAoRequisiteMap().put(aoEntry.getKey(), temp);
96                      }
97                  }
98              }
99          }
100     }
101 
102     /**
103      * Populate AO requisite map with overridden requisites for all outstanding ActivityOfferingWrappers
104      *
105      * @param overriddenRules
106      * @param activityOfferingWrapperList
107      */
108     private void loadcoOverridenRules(Map<String, String> overriddenRules, List<ActivityOfferingWrapper> activityOfferingWrapperList) {
109         for (ActivityOfferingWrapper activityOfferingWrapper : activityOfferingWrapperList) {
110             if(activityOfferingWrapper.getRequisite() == null) {
111                 if(!reqWrapper.getAoRequisiteMap().containsKey(activityOfferingWrapper.getActivityCode())) {
112                     if (reqWrapper.getSuppressNullMap().containsKey(activityOfferingWrapper.getActivityCode())) {
113                         Map<String, String> temp = new HashMap<String, String>(overriddenRules);
114                         temp.remove(reqWrapper.getSuppressNullMap().get(activityOfferingWrapper.getActivityCode()));
115                         reqWrapper.getAoRequisiteMap().put(activityOfferingWrapper.getActivityCode(), temp);
116                         continue;
117                     }
118                     reqWrapper.getAoRequisiteMap().put(activityOfferingWrapper.getActivityCode(), overriddenRules);
119                 }
120             }
121         }
122     }
123 
124     /**
125      * Populate CO requisites with requisites not overridden
126      */
127     private void loadCORequisites() {
128         for(Map.Entry<String, String> coReq : reqWrapper.getCoRequisiteTypeMap().entrySet()) {
129             reqWrapper.getCoRequisite().append(coReq.getValue());
130         }
131     }
132 
133     /**
134      * Build and populate RegistrationGroupWrappers requisites from AO requisite map
135      *
136      * @param registrationGroupWrapperList
137      */
138     public void loadRegRequisites(List<RegistrationGroupWrapper> registrationGroupWrapperList) {
139         StringBuilder firstReq;
140         StringBuilder secondReq;
141         StringBuilder commonReq;
142 
143         //For each RegistrationGroupWrapper and its partner with same name
144         for(int i = 0; i < registrationGroupWrapperList.size(); i = i + 2) {
145             RegistrationGroupWrapper registrationGroupWrapper = registrationGroupWrapperList.get(i);
146 
147             firstReq = new StringBuilder();
148             secondReq = new StringBuilder();
149             commonReq = new StringBuilder();
150 
151             //Retrieve RegistrationGroupWrapper with same name
152             RegistrationGroupWrapper partnerRegGroup = getRegistrationGroupWrapper(registrationGroupWrapperList, registrationGroupWrapper.getRgInfo().getName(), registrationGroupWrapper.getAoActivityCodeText());
153 
154             //Determine each RegistrationGroupWrapper's requisite and common requisite
155             if(reqWrapper.getAoRequisiteMap().containsKey(registrationGroupWrapper.getAoActivityCodeText()) ||
156                     reqWrapper.getAoRequisiteMap().containsKey(partnerRegGroup.getAoActivityCodeText())) {
157 
158                 for(String rule : reqWrapper.getRuleTypes()) {
159                     Map<String, String> firstReqMap = reqWrapper.getAoRequisiteMap().get(registrationGroupWrapper.getAoActivityCodeText());
160                     Map<String, String> secondReqMap = reqWrapper.getAoRequisiteMap().get(partnerRegGroup.getAoActivityCodeText());
161 
162                     if (firstReqMap != null && secondReqMap != null) {
163                         if (firstReqMap.containsKey(rule) && secondReqMap.containsKey(rule)) {
164                             if (firstReqMap.get(rule).equals(secondReqMap.get(rule))) {
165                                 commonReq.append(firstReqMap.get(rule));
166                                 continue;
167                             }
168                         }
169                     }
170                     if (firstReqMap != null) {
171                         if (firstReqMap.containsKey(rule)) {
172                             firstReq.append(firstReqMap.get(rule));
173                         }
174                     }
175                     if (secondReqMap != null) {
176                         if (secondReqMap.containsKey(rule)) {
177                             secondReq.append(secondReqMap.get(rule));
178                         }
179                     }
180                 }
181                 //Set requisite on RegistrationGroupWrapper
182                 if (!commonReq.toString().isEmpty()) {
183                     registrationGroupWrapper.setCommonRequisite(commonReq.toString());
184                 }
185                 if (!firstReq.toString().isEmpty()) {
186                     registrationGroupWrapper.setRequisite(firstReq.toString());
187                 }
188                 if (!secondReq.toString().isEmpty()) {
189                     partnerRegGroup.setRequisite(secondReq.toString());
190                 }
191             }
192         }
193     }
194 
195     private RegistrationGroupWrapper getRegistrationGroupWrapper(List<RegistrationGroupWrapper> registrationGroupWrapperList, String name, String aoCode) {
196         for (RegistrationGroupWrapper registrationGroupWrapper : registrationGroupWrapperList) {
197             if(registrationGroupWrapper.getRgInfo().getName().equals(name) && !registrationGroupWrapper.getAoActivityCodeText().equals(aoCode)) {
198                 return registrationGroupWrapper;
199             }
200         }
201         RegistrationGroupWrapper emptyRegistrationGroupWrapper = new RegistrationGroupWrapper();
202         emptyRegistrationGroupWrapper.setAoActivityCodeText("null");
203         return emptyRegistrationGroupWrapper;
204     }
205 
206     /**
207      * Build string for display of AO requisites
208      *
209      * @param aoCode
210      * @return string of requisites
211      */
212     public String prepareAORequisites(String aoCode) {
213         StringBuilder requisites = new StringBuilder();
214         Map<String, String> requisiteMap = reqWrapper.getAoRequisiteMap().get(aoCode);
215 
216         for (String req : requisiteMap.values()) {
217             requisites.append(req);
218         }
219 
220         return requisites.toString();
221     }
222 }