com.redhat.rhn.frontend.action.tasko.ScheduleDetailAction.java Source code

Java tutorial

Introduction

Here is the source code for com.redhat.rhn.frontend.action.tasko.ScheduleDetailAction.java

Source

/**
 * Copyright (c) 2011--2014 Red Hat, Inc.
 *
 * This software is licensed to you under the GNU General Public License,
 * version 2 (GPLv2). There is NO WARRANTY for this software, express or
 * implied, including the implied warranties of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
 * along with this software; if not, see
 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
 *
 * Red Hat trademarks are not licensed under GPLv2. No permission is
 * granted to use or replicate Red Hat trademarks that are incorporated
 * in this software or its documentation.
 */
package com.redhat.rhn.frontend.action.tasko;

import com.redhat.rhn.common.util.RecurringEventPicker;
import com.redhat.rhn.domain.user.User;
import com.redhat.rhn.frontend.struts.RequestContext;
import com.redhat.rhn.frontend.struts.RhnAction;
import com.redhat.rhn.frontend.struts.RhnHelper;
import com.redhat.rhn.taskomatic.TaskomaticApi;
import com.redhat.rhn.taskomatic.TaskomaticApiException;

import org.apache.commons.lang.StringUtils;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.DynaActionForm;

import java.util.ArrayList;
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;

/**
 * ScheduleDetailAction
 * @version $Rev$
 */
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, HttpServletRequest request,
            HttpServletResponse response) {

        DynaActionForm form = (DynaActionForm) formIn;
        Map params = makeParamMap(request);
        RequestContext ctx = new RequestContext(request);
        User loggedInUser = ctx.getCurrentUser();
        Long scheduleId = ctx.getParamAsLong(("schid"));

        if (ctx.hasParam("schid")) {
            params.put("schid", scheduleId);
            Map schedule = new HashMap();
            try {
                schedule = new TaskomaticApi().lookupScheduleById(loggedInUser, scheduleId);
            } catch (TaskomaticApiException e) {
                createErrorMessage(request, "repos.jsp.message.taskomaticdown", null);
            }
            String scheduleName = (String) schedule.get("job_label");
            String bunchName = (String) schedule.get("bunch");
            request.setAttribute("schedulename", scheduleName);
            form.set("schedulename", scheduleName);
            request.setAttribute("bunch", bunchName);
            Boolean active = isActive(schedule);
            request.setAttribute("active", active);
            if (!active) {
                request.setAttribute("activetill", schedule.get("active_till"));
            }
        }

        prepDropdowns(ctx);
        if (!isSubmitted(form)) {
            setupForm(request, form);
            return getStrutsDelegate().forwardParams(mapping.findForward(RhnHelper.DEFAULT_FORWARD),
                    request.getParameterMap());
        }

        RecurringEventPicker picker = RecurringEventPicker.prepopulatePicker(request, "date", null);

        if (picker.isDisabled() || StringUtils.isEmpty(picker.getCronEntry())) {
            if (scheduleId == null) {
                prepDropdowns(ctx);
                createErrorMessage(request, "message.scheduledisabled", null);

                return getStrutsDelegate().forwardParams(mapping.findForward(RhnHelper.DEFAULT_FORWARD), params);
            }
            return getStrutsDelegate().forwardParams(mapping.findForward("disable"), params);
        }

        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(RhnHelper.DEFAULT_FORWARD), 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(RhnHelper.DEFAULT_FORWARD), params);
            }
            // set the schedule
            tapi.scheduleSatBunch(loggedInUser, scheduleName, bunchName, picker.getCronEntry());
            // check, whether it was created
            Map schedule = tapi.lookupScheduleByBunchAndLabel(loggedInUser, bunchName, scheduleName);
            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")) {
                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(RhnHelper.DEFAULT_FORWARD), params);
    }

    private Boolean isActive(Map schedule) {
        Date till = (Date) schedule.get("active_till");
        if (till == null) {
            return Boolean.TRUE;
        }
        Date now = new Date();
        return now.before(till);
    }

    private void setupForm(HttpServletRequest request, DynaActionForm form) {
        RequestContext ctx = new RequestContext(request);
        User loggedInUser = ctx.getCurrentUser();
        Long schid = ctx.getParamAsLong("schid");

        if (schid != null) {
            try {
                TaskomaticApi tapi = new TaskomaticApi();
                Map schedule = tapi.lookupScheduleById(loggedInUser, schid);
                String scheduleName = (String) schedule.get("job_label");
                String bunchName = (String) schedule.get("bunch");
                request.setAttribute("schedulename", scheduleName);
                form.set("schedulename", scheduleName);
                request.setAttribute("bunch", bunchName);
                Map bunch = tapi.lookupBunchByName(loggedInUser, bunchName);
                request.setAttribute("bunchdescription", bunch.get("description"));
                RecurringEventPicker.prepopulatePicker(request, "date", (String) schedule.get(("cron_expr")));
            } catch (TaskomaticApiException e) {
                createErrorMessage(request, "repos.jsp.message.taskomaticdown", null);
            }
        } else {
            RecurringEventPicker.prepopulatePicker(request, "date", null);
        }
    }

    private void prepDropdowns(RequestContext ctx) {
        User loggedInUser = ctx.getCurrentUser();
        // populate parent base channels
        List dropDown = new ArrayList();
        try {
            List<Map> bunches = new TaskomaticApi().listSatBunchSchedules(loggedInUser);

            for (Map b : bunches) {
                addOption(dropDown, (String) b.get("name"), (String) b.get("name"));
            }
        } catch (TaskomaticApiException e) {
            // do not create error message, it was created before
        }
        ctx.getRequest().setAttribute("bunches", dropDown);
    }

    private void addOption(List options, String key, String value) {
        Map selection = new HashMap();
        selection.put("label", key);
        selection.put("value", value);
        options.add(selection);
    }
}