1 package org.kuali.student.lum.lu.ui.course.server.gwt;
2
3 import java.util.Iterator;
4 import java.util.List;
5
6 import org.kuali.student.r2.common.dto.ContextInfo;
7 import org.kuali.student.r2.common.dto.DtoConstants;
8 import org.kuali.student.r2.common.dto.StatusInfo;
9 import org.kuali.student.r2.common.exceptions.CircularReferenceException;
10 import org.kuali.student.r2.common.exceptions.DataValidationErrorException;
11 import org.kuali.student.r2.common.exceptions.DoesNotExistException;
12 import org.kuali.student.r2.common.exceptions.InvalidParameterException;
13 import org.kuali.student.r2.common.exceptions.MissingParameterException;
14 import org.kuali.student.r2.common.exceptions.OperationFailedException;
15 import org.kuali.student.r2.common.exceptions.PermissionDeniedException;
16 import org.kuali.student.r2.common.exceptions.VersionMismatchException;
17 import org.kuali.student.r2.core.versionmanagement.dto.VersionDisplayInfo;
18 import org.kuali.student.r1.core.statement.dto.StatementTreeViewInfo;
19 import org.kuali.student.lum.common.server.StatementUtil;
20 import org.kuali.student.r2.lum.course.dto.CourseInfo;
21 import org.kuali.student.r2.lum.course.service.CourseService;
22 import org.kuali.student.r2.lum.util.constants.CourseServiceConstants;
23 import org.springframework.transaction.annotation.Transactional;
24
25 @Transactional(noRollbackFor = { DoesNotExistException.class }, rollbackFor = { Throwable.class })
26 public class CourseStateChangeServiceImpl {
27 private CourseService courseService;
28
29
30
31
32
33
34
35
36
37
38 public StatusInfo changeState(String courseId, String newState, String prevEndTermAtpId,ContextInfo contextInfo) throws Exception {
39
40 CourseInfo courseInfo = courseService.getCourse(courseId,contextInfo);
41
42 StatusInfo ret = new StatusInfo();
43 try {
44 if (newState.equals(DtoConstants.STATE_ACTIVE)) {
45 activateCourse(courseInfo, prevEndTermAtpId,contextInfo);
46 } else if (newState.equals(DtoConstants.STATE_RETIRED)) {
47 retireCourse(courseInfo,contextInfo);
48 }
49
50 ret.setSuccess(new Boolean(true));
51 } catch (Exception e) {
52 ret.setSuccess(new Boolean(false));
53 ret.setMessage(e.getMessage());
54 }
55
56 return ret;
57 }
58
59
60
61
62
63
64
65 protected void activateCourse(CourseInfo courseToActivate, String prevEndTermAtpId,ContextInfo contextInfo) throws Exception{
66 CourseInfo currVerCourse = getCurrentVersionOfCourse(courseToActivate,contextInfo);
67 String existingState = courseToActivate.getStateKey();
68 String currVerState = currVerCourse.getStateKey();
69 boolean isCurrVer = (courseToActivate.getId().equals(currVerCourse.getId()));
70
71 if (existingState.equals(DtoConstants.STATE_DRAFT)) {
72
73 if (isCurrVer) {
74
75 updateCourseVersionStates(courseToActivate, DtoConstants.STATE_ACTIVE, currVerCourse, null, true, prevEndTermAtpId,contextInfo);
76 } else if (currVerState.equals(DtoConstants.STATE_ACTIVE) ||
77 currVerState.equals(DtoConstants.STATE_SUSPENDED)) {
78 updateCourseVersionStates(courseToActivate, DtoConstants.STATE_ACTIVE, currVerCourse, DtoConstants.STATE_SUPERSEDED, true, prevEndTermAtpId,contextInfo);
79 }
80 }
81 }
82
83
84
85
86
87
88 protected void retireCourse(CourseInfo courseToRetire,ContextInfo contextInfo) throws Exception{
89 String existingState = courseToRetire.getStateKey();
90
91 if (existingState.equals(DtoConstants.STATE_ACTIVE) || existingState.equals(DtoConstants.STATE_SUSPENDED)){
92 courseToRetire.setStateKey(DtoConstants.STATE_RETIRED);
93
94 courseService.updateCourse(courseToRetire.getId(),courseToRetire, contextInfo);
95 updateStatementTreeViewInfoState(courseToRetire,contextInfo);
96 }
97 }
98
99
100
101
102
103
104 protected CourseInfo getCurrentVersionOfCourse(CourseInfo course,ContextInfo contextInfo)
105 throws Exception {
106
107 String verIndId = course.getVersionInfo().getVersionIndId();
108
109
110 VersionDisplayInfo curVerDisplayInfo = courseService.getCurrentVersion(
111 CourseServiceConstants.COURSE_NAMESPACE_URI, verIndId, contextInfo);
112 String curVerId = curVerDisplayInfo.getId();
113
114
115 CourseInfo currVerCourse = courseService.getCourse(curVerId,contextInfo);
116
117 return currVerCourse;
118 }
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142 @Transactional(readOnly = false)
143 private void updateCourseVersionStates(CourseInfo thisVerCourse,
144 String thisVerNewState, CourseInfo currVerCourse,
145 String currVerNewState, boolean makeCurrent,
146 String prevEndTermAtpId,ContextInfo contextInfo) throws Exception {
147 String thisVerPrevState = thisVerCourse.getStateKey();
148
149
150
151 boolean isCurrent = thisVerCourse.getId().equals(currVerCourse.getId());
152 if(!makeCurrent || !isCurrent || !thisVerCourse.getVersionInfo().getSequenceNumber().equals(1)){
153 makeCurrent &= !isCurrent;
154 }
155
156 if (thisVerNewState == null) {
157 throw new InvalidParameterException("new state cannot be null");
158 } else {
159 thisVerCourse.setStateKey(thisVerNewState);
160 courseService.updateCourse(thisVerCourse.getId(),thisVerCourse,contextInfo);
161 updateStatementTreeViewInfoState(thisVerCourse,contextInfo);
162 }
163
164
165 if (currVerNewState != null) {
166 currVerCourse.setStateKey(currVerNewState);
167 if(currVerCourse.getEndTerm()==null){
168 currVerCourse.setEndTerm(prevEndTermAtpId);
169 }
170 courseService.updateCourse(currVerCourse.getId(),currVerCourse,contextInfo);
171 updateStatementTreeViewInfoState(currVerCourse,contextInfo);
172 }
173
174 if (makeCurrent == true) {
175 courseService.setCurrentCourseVersion(thisVerCourse.getId(),
176 null,contextInfo);
177 }
178
179
180
181
182
183 if (thisVerPrevState.equals(DtoConstants.STATE_APPROVED)
184 && thisVerNewState.equals(DtoConstants.STATE_ACTIVE)) {
185
186 List<VersionDisplayInfo> versions = courseService.getVersions(
187 CourseServiceConstants.COURSE_NAMESPACE_URI, thisVerCourse
188 .getVersionInfo().getVersionIndId(), contextInfo);
189 Long startSeq = new Long(1);
190
191 if (!isCurrent && (currVerCourse.getId() != thisVerCourse.getId())) {
192 startSeq = currVerCourse.getVersionInfo().getSequenceNumber() + 1;
193 }
194
195 for (VersionDisplayInfo versionInfo : versions) {
196 if (versionInfo.getSequenceNumber() >= startSeq) {
197 CourseInfo otherCourse = courseService
198 .getCourse(""+versionInfo.getId(),contextInfo);
199 if (otherCourse.getStateKey().equals(
200 DtoConstants.STATE_APPROVED)
201 || otherCourse.getStateKey().equals(
202 DtoConstants.STATE_SUBMITTED)
203 || otherCourse.getStateKey().equals(
204 DtoConstants.STATE_DRAFT)) {
205 otherCourse.setStateKey(DtoConstants.STATE_SUPERSEDED);
206 courseService.updateCourse(otherCourse.getId(),otherCourse,contextInfo);
207 updateStatementTreeViewInfoState(otherCourse,contextInfo);
208 }
209 }
210 }
211 }
212
213 }
214
215 public void setCourseService(CourseService courseService) {
216 this.courseService = courseService;
217 }
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237 public void updateStatementTreeViewInfoState(CourseInfo courseInfo,ContextInfo contextInfo)
238 throws DoesNotExistException, InvalidParameterException,
239 MissingParameterException, OperationFailedException,
240 PermissionDeniedException, DataValidationErrorException,
241 CircularReferenceException, VersionMismatchException {
242
243
244
245 List<StatementTreeViewInfo> statementTreeViewInfos = courseService
246 .getCourseStatements(courseInfo.getId(), null, null,contextInfo);
247
248 if (statementTreeViewInfos != null){
249
250 for (Iterator<StatementTreeViewInfo> it = statementTreeViewInfos
251 .iterator(); it.hasNext();)
252 StatementUtil.updateStatementTreeViewInfoState(courseInfo
253 .getStateKey(), it.next());
254
255
256
257 for (Iterator<StatementTreeViewInfo> it = statementTreeViewInfos
258 .iterator(); it.hasNext();)
259 courseService.updateCourseStatement(courseInfo.getId(),null, it.next(),contextInfo);
260 }
261 }
262
263 }