001 /*
002 * Copyright 2011 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.kfs.sys.web.struts;
017
018 import java.util.Date;
019
020 import javax.servlet.http.HttpServletRequest;
021 import javax.servlet.http.HttpServletResponse;
022
023 import org.apache.commons.lang.StringUtils;
024 import org.apache.struts.action.ActionForm;
025 import org.apache.struts.action.ActionForward;
026 import org.apache.struts.action.ActionMapping;
027 import org.kuali.kfs.sys.KFSConstants;
028 import org.kuali.kfs.sys.batch.BatchJobStatus;
029 import org.kuali.kfs.sys.batch.service.SchedulerService;
030 import org.kuali.kfs.sys.context.SpringContext;
031 import org.kuali.kfs.sys.identity.KfsKimAttributes;
032 import org.kuali.kfs.sys.service.impl.KfsParameterConstants;
033 import org.kuali.rice.kim.bo.types.dto.AttributeSet;
034 import org.kuali.rice.kim.service.IdentityManagementService;
035 import org.kuali.rice.kim.service.KIMServiceLocator;
036 import org.kuali.rice.kim.util.KimCommonUtils;
037 import org.kuali.rice.kim.util.KimConstants;
038 import org.kuali.rice.kns.exception.AuthorizationException;
039 import org.kuali.rice.kns.service.DateTimeService;
040 import org.kuali.rice.kns.service.KualiConfigurationService;
041 import org.kuali.rice.kns.service.ParameterService;
042 import org.kuali.rice.kns.util.GlobalVariables;
043 import org.kuali.rice.kns.util.KNSConstants;
044 import org.kuali.rice.kns.util.UrlFactory;
045 import org.kuali.rice.kns.web.struts.action.KualiAction;
046
047 public class KualiBatchJobModifyAction extends KualiAction {
048
049 private static final String JOB_NAME_PARAMETER = "name";
050 private static final String JOB_GROUP_PARAMETER = "group";
051 private static final String START_STEP_PARAMETER = "startStep";
052 private static final String END_STEP_PARAMETER = "endStep";
053 private static final String START_TIME_PARAMETER = "startTime";
054 private static final String EMAIL_PARAMETER = "emailAddress";
055
056 private static SchedulerService schedulerService;
057 private static ParameterService parameterService;
058 private static IdentityManagementService identityManagementService;
059 private static DateTimeService dateTimeService;
060
061 @Override
062 protected void checkAuthorization(ActionForm form, String methodToCall) throws AuthorizationException {
063 if (form instanceof KualiBatchJobModifyForm) {
064 if (!getIdentityManagementService().isAuthorizedByTemplateName(GlobalVariables.getUserSession().getPrincipalId(), KNSConstants.KNS_NAMESPACE, KimConstants.PermissionTemplateNames.LOOK_UP_RECORDS, KimCommonUtils.getNamespaceAndComponentSimpleName(BatchJobStatus.class), new AttributeSet(getRoleQualification(form, "use")))) {
065 throw new AuthorizationException(GlobalVariables.getUserSession().getPrincipalName(), "view", "batch jobs");
066 }
067 }
068 else {
069 super.checkAuthorization(form, methodToCall);
070 }
071 }
072
073 /**
074 * Performs the actual authorization check for a given job and action against the current user. This method can be overridden by
075 * sub-classes if more granular controls are desired.
076 *
077 * @param job
078 * @param actionType
079 * @throws AuthorizationException
080 */
081 protected boolean canModifyJob(KualiBatchJobModifyForm form, String actionType) {
082 AttributeSet permissionDetails = new AttributeSet();
083 permissionDetails.put(KfsKimAttributes.NAMESPACE_CODE, form.getJob().getNamespaceCode());
084 permissionDetails.put(KfsKimAttributes.BEAN_NAME, form.getJob().getName());
085 return getIdentityManagementService().isAuthorizedByTemplateName(GlobalVariables.getUserSession().getPrincipalId(), KNSConstants.KNS_NAMESPACE, KFSConstants.PermissionTemplate.MODIFY_BATCH_JOB.name, permissionDetails, new AttributeSet(getRoleQualification(form, actionType)));
086 }
087
088 protected void checkJobAuthorization(KualiBatchJobModifyForm form, String actionType) throws AuthorizationException {
089 if (!canModifyJob(form, actionType)) {
090 throw new AuthorizationException(GlobalVariables.getUserSession().getPrincipalName(), "actionType", form.getJob().getName());
091 }
092 }
093
094 @Override
095 public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
096 // load the given job and map into the form
097 String jobName = request.getParameter(JOB_NAME_PARAMETER);
098 String jobGroup = request.getParameter(JOB_GROUP_PARAMETER);
099 if (form instanceof KualiBatchJobModifyForm) {
100 ((KualiBatchJobModifyForm)form).setJob(getSchedulerService().getJob(jobGroup, jobName));
101 }
102 ActionForward forward = super.execute(mapping, form, request, response);
103 return forward;
104 }
105
106 private IdentityManagementService getIdentityManagementService() {
107 if (identityManagementService == null) {
108 identityManagementService = SpringContext.getBean(IdentityManagementService.class);
109 }
110 return identityManagementService;
111 }
112
113 private SchedulerService getSchedulerService() {
114 if (schedulerService == null) {
115 schedulerService = SpringContext.getBean(SchedulerService.class);
116 }
117 return schedulerService;
118 }
119
120 public static ParameterService getParameterService() {
121 if (parameterService == null) {
122 parameterService = SpringContext.getBean(ParameterService.class);
123 }
124 return parameterService;
125 }
126
127 public ActionForward start(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
128 KualiBatchJobModifyForm batchModifyForm = (KualiBatchJobModifyForm)form;
129
130 request.setAttribute("job", batchModifyForm.getJob());
131 request.setAttribute("canRunJob", canModifyJob(batchModifyForm, "runJob"));
132 request.setAttribute("canSchedule", canModifyJob(batchModifyForm, "schedule"));
133 request.setAttribute("canUnschedule", canModifyJob(batchModifyForm, "unschedule"));
134 request.setAttribute("canStopJob", canModifyJob(batchModifyForm, "stopJob"));
135 request.setAttribute("userEmailAddress", GlobalVariables.getUserSession().getPerson().getEmailAddressUnmasked());
136
137 return mapping.findForward(KFSConstants.MAPPING_BASIC);
138 }
139
140 public ActionForward runJob(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
141 KualiBatchJobModifyForm batchModifyForm = (KualiBatchJobModifyForm)form;
142
143 checkJobAuthorization(batchModifyForm, "runJob");
144
145 String startStepStr = request.getParameter(START_STEP_PARAMETER);
146 String endStepStr = request.getParameter(END_STEP_PARAMETER);
147 String startTimeStr = request.getParameter(START_TIME_PARAMETER);
148 String emailAddress = request.getParameter(EMAIL_PARAMETER);
149
150 int startStep = Integer.parseInt(startStepStr);
151 int endStep = Integer.parseInt(endStepStr);
152 Date startTime;
153 if (!StringUtils.isBlank(startTimeStr)) {
154 startTime = getDateTimeService().convertToDateTime(startTimeStr);
155 } else {
156 startTime = getDateTimeService().getCurrentDate();
157 }
158
159 batchModifyForm.getJob().runJob(startStep, endStep, startTime, emailAddress);
160
161 // redirect to display form to prevent re-execution of the job by mistake
162 return getForward(batchModifyForm.getJob());
163 }
164
165 public ActionForward stopJob(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
166 KualiBatchJobModifyForm batchModifyForm = (KualiBatchJobModifyForm)form;
167
168 checkJobAuthorization(batchModifyForm, "stopJob");
169
170 batchModifyForm.getJob().interrupt();
171
172 return getForward(batchModifyForm.getJob());
173 }
174
175
176 public ActionForward schedule(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
177 KualiBatchJobModifyForm batchModifyForm = (KualiBatchJobModifyForm)form;
178
179 checkJobAuthorization(batchModifyForm, "schedule");
180
181 batchModifyForm.getJob().schedule();
182
183 return getForward(batchModifyForm.getJob());
184 }
185
186 public ActionForward unschedule(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
187 KualiBatchJobModifyForm batchModifyForm = (KualiBatchJobModifyForm)form;
188
189 checkJobAuthorization(batchModifyForm, "unschedule");
190
191 batchModifyForm.getJob().unschedule();
192
193 // move to the unscheduled job object since the scheduled one has been removed
194 batchModifyForm.setJob(getSchedulerService().getJob(SchedulerService.UNSCHEDULED_GROUP, batchModifyForm.getJob().getName()));
195
196 return getForward(batchModifyForm.getJob());
197 }
198
199 private ActionForward getForward(BatchJobStatus job) {
200 return new ActionForward(SpringContext.getBean(KualiConfigurationService.class).getPropertyString(KFSConstants.APPLICATION_URL_KEY) + "/batchModify.do?methodToCall=start&name=" + UrlFactory.encode(job.getName()) + "&group=" + UrlFactory.encode(job.getGroup()), true);
201 }
202
203 public static DateTimeService getDateTimeService() {
204 if (dateTimeService == null) {
205 dateTimeService = SpringContext.getBean(DateTimeService.class);
206 }
207 return dateTimeService;
208 }
209 }
210