java/code/src/com/redhat/rhn/frontend/action/tasko/ScheduleDetailAction.java | 58
+++++++---
java/code/src/com/redhat/rhn/frontend/strings/jsp/StringResource_en_US.xml | 18 +++
java/code/src/com/redhat/rhn/taskomatic/TaskomaticApi.java | 16 ++
3 files changed, 78 insertions(+), 14 deletions(-)
New commits:
commit 8cfa182beb513179efd62338c4202d30c55004cd
Author: Tomas Lestach <tlestach(a)redhat.com>
Date: Fri May 20 16:21:06 2011 +0200
659138 - extend schedule creation error handling
diff --git a/java/code/src/com/redhat/rhn/frontend/action/tasko/ScheduleDetailAction.java
b/java/code/src/com/redhat/rhn/frontend/action/tasko/ScheduleDetailAction.java
index db7c810..f7bfbe9 100644
--- a/java/code/src/com/redhat/rhn/frontend/action/tasko/ScheduleDetailAction.java
+++ b/java/code/src/com/redhat/rhn/frontend/action/tasko/ScheduleDetailAction.java
@@ -32,6 +32,7 @@ import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.regex.Pattern;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -43,6 +44,8 @@ import javax.servlet.http.HttpServletResponse;
*/
public class ScheduleDetailAction extends RhnAction {
+ static final String SCHEDULE_NAME_REGEX = "^[a-z\\d][a-z\\d\\-\\.\\_]*$";
+
/** {@inheritDoc} */
public ActionForward execute(ActionMapping mapping,
ActionForm formIn,
@@ -100,40 +103,67 @@ public class ScheduleDetailAction extends RhnAction {
mapping.findForward("disable"), params);
}
- String scheduleName = form.getString("schedulename");
String bunchName = form.getString("bunch");
+ String scheduleName = form.getString("schedulename");
+ if (!Pattern.compile(SCHEDULE_NAME_REGEX).matcher(scheduleName).find()) {
+ createErrorMessage(request, "schedule.jsp.schedulenameregex",
null);
+
+ return getStrutsDelegate().forwardParams(
+ mapping.findForward("default"), params);
+ }
try {
TaskomaticApi tapi = new TaskomaticApi();
+ // check, whether there's not already a schedule of this name
+ if (scheduleId == null && tapi.satScheduleActive(scheduleName,
loggedInUser)) {
+ createErrorMessage(request,
+ "schedule.jsp.schedulenameinuse", scheduleName);
+ return getStrutsDelegate().forwardParams(
+ mapping.findForward("default"), params);
+ }
+ // set the schedule
tapi.scheduleSatBunch(loggedInUser,
scheduleName,
bunchName,
picker.getCronEntry()
);
- if (ctx.hasParam("create_button")) {
- createSuccessMessage(request, "message.schedulecreated",
scheduleName);
- }
- else {
- createSuccessMessage(request, "message.scheduleupdated",
scheduleName);
- }
+ // check, whether it was created
Map schedule = tapi.lookupScheduleByBunchAndLabel(loggedInUser, bunchName,
scheduleName);
- params.put("schid", schedule.get("id"));
- return getStrutsDelegate().forwardParams(
- mapping.findForward("success"), params);
+ if (schedule != null) {
+ if (ctx.hasParam("create_button")) {
+ createSuccessMessage(request, "message.schedulecreated",
scheduleName);
+ }
+ else {
+ createSuccessMessage(request, "message.scheduleupdated",
scheduleName);
+ }
+ params.put("schid", schedule.get("id"));
+ return getStrutsDelegate().forwardParams(
+ mapping.findForward("success"), params);
+ }
+ // something went wrong
+ tapi.unscheduleSatTask(scheduleName, loggedInUser);
+ createErrorMessage(request,
+ "schedule.jsp.schedulefailed", scheduleName);
}
catch (TaskomaticApiException e) {
if (e.getMessage().contains("InvalidParamException")) {
- createErrorMessage(request,
- "repos.jsp.message.invalidcron",
picker.getCronEntry());
+ if (e.getMessage().contains("Cron trigger")) {
+ createErrorMessage(request,
+ "repos.jsp.message.invalidcron",
picker.getCronEntry());
+ }
+ else {
+ createErrorMessage(request,
+ "schedule.jsp.schedulefailed", scheduleName);
+ }
}
else {
createErrorMessage(request,
"repos.jsp.message.taskomaticdown", null);
}
- return getStrutsDelegate().forwardParams(
- mapping.findForward("default"), params);
}
+ return getStrutsDelegate().forwardParams(
+ mapping.findForward("default"), params);
}
private Boolean isActive(Map schedule) {
diff --git a/java/code/src/com/redhat/rhn/frontend/strings/jsp/StringResource_en_US.xml
b/java/code/src/com/redhat/rhn/frontend/strings/jsp/StringResource_en_US.xml
index 14f72b9..1cf501e 100644
--- a/java/code/src/com/redhat/rhn/frontend/strings/jsp/StringResource_en_US.xml
+++ b/java/code/src/com/redhat/rhn/frontend/strings/jsp/StringResource_en_US.xml
@@ -22843,6 +22843,24 @@ given channel.</source>
<context
context-type="sourcefile">/rhn/admin/DeleteSchedule.do</context>
</context-group>
</trans-unit>
+ <trans-unit id="schedule.jsp.schedulenameinuse">
+ <source>Schedule name {0} is already in use. Please choose another
one.</source>
+ <context-group name="ctx">
+ <context
context-type="sourcefile">/rhn/admin/ScheduleDetail.do</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="schedule.jsp.schedulenameregex">
+ <source>Schedule name must begin with a letter and may contain only
lowercase letters, hyphens ('-'), periods ('.'), underscores
('_'), and numerals.</source>
+ <context-group name="ctx">
+ <context
context-type="sourcefile">/rhn/admin/ScheduleDetail.do</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="schedule.jsp.schedulefailed">
+ <source>Setting of {0} schedule failed.</source>
+ <context-group name="ctx">
+ <context
context-type="sourcefile">/rhn/admin/ScheduleDetail.do</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="schedule.edit.jsp.toolbar">
<source>Schedule {0}</source>
<context-group name="ctx">
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskomaticApi.java
b/java/code/src/com/redhat/rhn/taskomatic/TaskomaticApi.java
index 838d7fd..5345f0c 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskomaticApi.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskomaticApi.java
@@ -226,6 +226,22 @@ public class TaskomaticApi {
}
/**
+ * Check whether there's an active schedule of given job label
+ * @param jobLabel job label
+ * @param user the user
+ * @return true, if schedule exists
+ */
+ public boolean satScheduleActive(String jobLabel, User user) {
+ List<Map> schedules = (List<Map>)
invoke("tasko.listActiveSatSchedules");
+ for (Map schedule : schedules) {
+ if (schedule.get("job_label").equals(jobLabel)) {
+ return Boolean.TRUE;
+ }
+ }
+ return Boolean.FALSE;
+ }
+
+ /**
* Get the cron format for a single channel
* @param chan the channel
* @param user the user