/**
* Copyright (c) 2009--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.kickstart;
import com.redhat.rhn.domain.kickstart.KickstartData;
import com.redhat.rhn.domain.kickstart.KickstartPackage;
import com.redhat.rhn.domain.kickstart.KickstartFactory;
import com.redhat.rhn.domain.rhnpackage.PackageFactory;
import com.redhat.rhn.domain.rhnpackage.PackageName;
import com.redhat.rhn.frontend.struts.RequestContext;
import com.redhat.rhn.frontend.struts.RhnAction;
import com.redhat.rhn.manager.kickstart.KickstartEditCommand;
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.Iterator;
import java.util.Set;
import java.util.StringTokenizer;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Manages displaying/updating package names
* associated with Kickstarts
*
* @version $Rev $
*/
public class EditPackagesAction extends RhnAction {
private static final String PACKAGE_LIST = "packageList";
private static final String NO_BASE = "noBase";
private static final String IGNORE_MISSING = "ignoreMissing";
/**
* {@inheritDoc}
*/
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws Exception {
DynaActionForm dynaForm = (DynaActionForm) form;
RequestContext ctx = new RequestContext(request);
KickstartEditCommand cmd = new KickstartEditCommand(
ctx.getRequiredParam(RequestContext.KICKSTART_ID),
ctx.getCurrentUser());
KickstartData ksdata = cmd.getKickstartData();
request.setAttribute(RequestContext.KICKSTART, ksdata);
if (isSubmitted(dynaForm)) {
ActionForward returnForward = save(mapping, dynaForm, request, response,
ctx, ksdata);
addMessage(request, "kickstart.edit.pkgs.updated");
return returnForward;
}
return display(mapping, dynaForm, request, response, ctx, ksdata);
}
/**
* Handles form submission and database update
* @param mapping from Struts
* @param form from Struts
* @param request from Struts
* @param response from Struts
* @param ctx RequestContext corresponding to the request
* @param ksdata KickstartData
* @return pointer to jsp page
* @throws Exception signalling error
*/
public ActionForward save(ActionMapping mapping,
DynaActionForm form,
HttpServletRequest request,
HttpServletResponse response,
RequestContext ctx,
KickstartData ksdata) throws Exception {
transferEdits(ksdata, form, ctx);
StringBuilder redirectUrl = new StringBuilder();
redirectUrl.append(request.getContextPath());
redirectUrl.append(mapping.getPath());
redirectUrl.append(".do?ksid=").append(form.get("ksid"));
response.sendRedirect(redirectUrl.toString());
return null;
}
/**
* Handles display
* @param mapping from Struts
* @param form from Struts
* @param request from Struts
* @param response from Struts
* @param ctx RequestContext corresponding to the request
* @param ksdata KickstartData
* @return pointer to jsp page
* @throws Exception signalling error
*/
public ActionForward display(ActionMapping mapping,
DynaActionForm form,
HttpServletRequest request,
HttpServletResponse response,
RequestContext ctx,
KickstartData ksdata) throws Exception {
prepareForm(ksdata, form);
return mapping.findForward("display");
}
private void prepareForm(KickstartData ksdata, DynaActionForm form) {
Set ksPackages = ksdata.getKsPackages();
if (ksPackages != null && ksPackages.size() > 0) {
StringBuilder buf = new StringBuilder();
for (Iterator iter = ksPackages.iterator(); iter.hasNext();) {
KickstartPackage pn = (KickstartPackage)iter.next();
buf.append(pn.getPackageName().getName());
buf.append("\n");
}
form.set(PACKAGE_LIST, buf.toString());
}
form.set(NO_BASE, ksdata.getNoBase());
form.set(IGNORE_MISSING, ksdata.getIgnoreMissing());
form.set("submitted", Boolean.TRUE);
}
private void transferEdits(KickstartData ksdata, DynaActionForm form,
RequestContext ctx) {
ksdata.setNoBase(Boolean.TRUE.equals(form.get(NO_BASE)));
ksdata.setIgnoreMissing(Boolean.TRUE.equals(form.get(IGNORE_MISSING)));
// first clear the kickstart packages set
ksdata.clearKsPackages();
Set ksPackages = ksdata.getKsPackages();
String newPackages = form.getString(PACKAGE_LIST);
if (newPackages != null && newPackages.length() > 0) {
Boolean first = Boolean.TRUE;
for (StringTokenizer strtok = new StringTokenizer(newPackages, "\n");
strtok.hasMoreTokens();) {
// This is a hack but I can't think of a better way to do it
String pkg = null;
if (first && (!ksdata.getNoBase())) {
pkg = "@ Base";
PackageName pn = PackageFactory.lookupOrCreatePackageByName(pkg);
KickstartPackage kp = new KickstartPackage(ksdata, pn);
if (KickstartFactory.lookupKsPackageByKsDataAndPackageName(
ksdata, pn).isEmpty()) {
ksdata.addKsPackage(kp);
}
}
first = false;
pkg = strtok.nextToken();
pkg = pkg.trim();
if (pkg.length() == 0) {
continue;
}
// if noBase is checked and the current package is @base, ignore it
PackageName pn = PackageFactory.lookupOrCreatePackageByName(pkg);
if ((pn.getName().toLowerCase().replaceAll("\\s", "")
.equals("@base")) && (ksdata.getNoBase())) {
continue;
}
KickstartPackage kp = new KickstartPackage(ksdata, pn);
if (KickstartFactory.lookupKsPackageByKsDataAndPackageName(
ksdata, pn).isEmpty()) {
ksdata.addKsPackage(kp);
}
}
}
KickstartFactory.saveKickstartData(ksdata);
}
}