View Javadoc

1   /**
2    * Copyright 2010 The Kuali Foundation Licensed under the
3    * Educational Community License, Version 2.0 (the "License"); you may
4    * not use this file except in compliance with the License. You may
5    * obtain a copy of the License at
6    *
7    * http://www.osedu.org/licenses/ECL-2.0
8    *
9    * Unless required by applicable law or agreed to in writing,
10   * software distributed under the License is distributed on an "AS IS"
11   * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
12   * or implied. See the License for the specific language governing
13   * permissions and limitations under the License.
14   */
15  
16  package org.kuali.student.lum.statement.config.context;
17  
18  import java.util.ArrayList;
19  import java.util.List;
20  import java.util.Map;
21  
22  import org.kuali.student.common.exceptions.OperationFailedException;
23  import org.kuali.student.common.versionmanagement.dto.VersionDisplayInfo;
24  import org.kuali.student.core.statement.dto.ReqComponentInfo;
25  import org.kuali.student.lum.lu.dto.CluInfo;
26  import org.kuali.student.lum.lu.dto.CluSetInfo;
27  import org.kuali.student.lum.lu.dto.CluSetTreeViewInfo;
28  import org.kuali.student.lum.lu.service.LuService;
29  import org.kuali.student.lum.lu.service.LuServiceConstants;
30  import org.kuali.student.lum.statement.config.context.util.NLCluSet;
31  import org.kuali.student.lum.statement.typekey.ReqComponentFieldTypes;
32  
33  /**
34   * This class creates the template context for course list types.
35   */
36  public class LuContextImpl extends BasicContextImpl {
37      /**
38       * Learning unit service.
39       */
40  	private LuService luService;
41  
42  	/**
43  	 * <code>clu</code> token (key) references a Clu object used in templates.
44  	 * e.g. 'Student must have completed all of 
45  	 * $clu.getOfficialIdentifier().getShortName()'
46  	 */
47  	public final static String CLU_TOKEN = "clu";
48  	public final static String COURSE_CLU_TOKEN = "courseClu";
49  	public final static String PROGRAM_CLU_TOKEN = "programClu";
50  	public final static String TEST_CLU_TOKEN = "testClu";
51  
52  	/**
53  	 * <code>cluSet</code> token (key) references a Clu set object
54  	 * used in templates.
55  	 * e.g. 'Student must have completed all of $cluSet.getCluSetAsCode()'
56  	 */
57  	public final static String CLU_SET_TOKEN = "cluSet";
58  	public final static String COURSE_CLU_SET_TOKEN = "courseCluSet";
59  	public final static String PROGRAM_CLU_SET_TOKEN = "programCluSet";
60  	public final static String TEST_CLU_SET_TOKEN = "testCluSet";
61  
62  	/**
63  	 * Sets the LU service.
64  	 *
65  	 * @param luService LU service
66  	 */
67      public void setLuService(LuService luService) {
68  		this.luService = luService;
69  	}
70  
71  	/**
72       * Gets a CLU.
73       *
74       * @param cluId CLU id
75       * @return CLU
76       * @throws OperationFailedException If retrieving CLU fails
77       */
78      public CluInfo getCluInfo(String cluId) throws OperationFailedException {
79  		if (cluId == null) {
80  			return null;
81  		}
82  		try {
83  			VersionDisplayInfo versionInfo = luService.getCurrentVersion(LuServiceConstants.CLU_NAMESPACE_URI, cluId);
84  			CluInfo clu = this.luService.getClu(versionInfo.getId());
85  			return clu;
86  		} catch(Exception e) {
87  			throw new OperationFailedException(e.getMessage(), e);
88  		}
89      }
90  
91      private CluInfo getClu(ReqComponentInfo reqComponent, String key) throws OperationFailedException {
92          Map<String, String> map = getReqComponentFieldMap(reqComponent);
93          if(map.containsKey(key)) {
94  	    	String cluId = map.get(key);
95  	    	return getCluInfo(cluId);
96          }
97          return null;
98      }
99      
100     /**
101      * Gets a CLU set.
102      *
103      * @param cluSetId CLU set id
104      * @return CLU set
105      * @throws OperationFailedException If retrieving CLU set fails
106      */
107     public CluSetInfo getCluSetInfo(String cluSetId) throws OperationFailedException {
108 		if (cluSetId == null) {
109 			return null;
110 		}
111 		try {
112 	    	CluSetInfo cluSet = this.luService.getCluSetInfo(cluSetId);
113 	    	return cluSet;
114 		} catch(Exception e) {
115 			throw new OperationFailedException(e.getMessage(), e);
116 		}
117     }
118 
119     /**
120      * Gets the CLU set.
121      *
122      * @param cluSetId CLU set id
123      * @return CLU set
124      * @throws OperationFailedException If building a custom CLU set fails
125      */
126     public NLCluSet getCluSet(String cluSetId) throws OperationFailedException {
127 		if (cluSetId == null) {
128 			return null;
129 		}
130     	CluSetInfo cluSet = getCluSetInfo(cluSetId);
131 		try {
132 	    	List<CluInfo> list = new ArrayList<CluInfo>();
133 	    	CluSetTreeViewInfo tree = luService.getCluSetTreeView(cluSetId);
134 	    	findClusInCluSet(tree, list);
135 	    	return new NLCluSet(cluSet.getId(), list);
136 		} catch(Exception e) {
137 			throw new OperationFailedException(e.getMessage(), e);
138 		}
139     }
140 
141     private static void findClusInCluSet(CluSetTreeViewInfo tree, List<CluInfo> cluList) {
142     	if (tree.getCluSets() != null) {
143 			for (CluSetTreeViewInfo cluSet : tree.getCluSets()) {
144 				findClusInCluSet(cluSet, cluList);
145 			}
146 		} else {
147 			for (CluInfo clu : tree.getClus()) {
148 				if (!containsClu(cluList, clu)) {
149 					cluList.add(clu);
150 				}
151 			}
152 		}
153 	}
154 
155 	private static boolean containsClu(List<CluInfo> cluList, CluInfo clu) {
156 		for (CluInfo clu2 : cluList) {
157 			if (clu2.getId().equals(clu.getId())) {
158 				return true;
159 			}
160 		}
161 		return false;
162 	}
163 
164 	/**
165      * Gets a new CLU set from comma separated list of CLU ids.
166      *
167      * @param cluIds Comma separated list of CLU ids
168      * @return A new CLU set
169      * @throws OperationFailedException If building a custom CLU set fails
170      */
171     /*public NLCluSet getClusAsCluSet(String cluIds) throws OperationFailedException {
172     	String[] cluIdArray = cluIds.split("\\s*,\\s*");
173     	List<CluInfo> list = new ArrayList<CluInfo>();
174     	for(String cluId : cluIdArray) {
175     		CluInfo clu = getCluInfo(cluId);
176     		list.add(clu);
177     	}
178     	return new NLCluSet(null, list);
179     }*/
180 
181     /**
182      * Gets a custom CLU set from a requirement component.
183      *
184      * @param reqComponent Requirement component
185      * @return custom CLU set
186      * @throws OperationFailedException If building a custom CLU set fails
187      */
188     public NLCluSet getCluSet(ReqComponentInfo reqComponent, String key) throws OperationFailedException {
189         Map<String, String> map = getReqComponentFieldMap(reqComponent);
190     	NLCluSet cluSet = null;
191     	if(map.containsKey(key)) {
192         	String cluSetId = map.get(key);
193             cluSet = getCluSet(cluSetId);
194         }
195     	return cluSet;
196     }
197 
198     /**
199      * Creates the context map (template data) for the requirement component.
200      * 
201      * @param reqComponent Requirement component
202      * @throws OperationFailedException Creating context map fails
203      */
204     public Map<String, Object> createContextMap(ReqComponentInfo reqComponent) throws OperationFailedException {
205         Map<String, Object> contextMap = super.createContextMap(reqComponent);
206 
207         CluInfo clu = getClu(reqComponent, ReqComponentFieldTypes.CLU_KEY.getId());
208         if(clu != null) {
209 	        contextMap.put(CLU_TOKEN, clu);
210         }
211         CluInfo courseClu = getClu(reqComponent, ReqComponentFieldTypes.COURSE_CLU_KEY.getId());
212         if(courseClu != null) {
213 	        contextMap.put(COURSE_CLU_TOKEN, courseClu);
214         }
215         CluInfo programClu = getClu(reqComponent, ReqComponentFieldTypes.PROGRAM_CLU_KEY.getId());
216         if(programClu != null) {
217 	        contextMap.put(PROGRAM_CLU_TOKEN, programClu);
218         }
219         CluInfo testClu = getClu(reqComponent, ReqComponentFieldTypes.TEST_CLU_KEY.getId());
220         if(testClu != null) {
221 	        contextMap.put(TEST_CLU_TOKEN, testClu);
222         }
223 
224         NLCluSet cluSet = getCluSet(reqComponent, ReqComponentFieldTypes.CLUSET_KEY.getId());
225         if(cluSet != null) {
226         	contextMap.put(CLU_SET_TOKEN, cluSet);
227         }
228         NLCluSet courseCluSet = getCluSet(reqComponent, ReqComponentFieldTypes.COURSE_CLUSET_KEY.getId());
229         if(courseCluSet != null) {
230         	contextMap.put(COURSE_CLU_SET_TOKEN, courseCluSet);
231         }
232         NLCluSet programCluSet = getCluSet(reqComponent, ReqComponentFieldTypes.PROGRAM_CLUSET_KEY.getId());
233         if(programCluSet != null) {
234         	contextMap.put(PROGRAM_CLU_SET_TOKEN, programCluSet);
235         }
236         NLCluSet testCluSet = getCluSet(reqComponent, ReqComponentFieldTypes.TEST_CLUSET_KEY.getId());
237         if(testCluSet != null) {
238         	contextMap.put(TEST_CLU_SET_TOKEN, testCluSet);
239         }
240 
241         return contextMap;
242     }
243 }