/** * Copyright (c) 2009--2015 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.channel.manage; import com.redhat.rhn.common.db.datasource.DataResult; import com.redhat.rhn.common.localization.LocalizationService; import com.redhat.rhn.common.security.PermissionException; import com.redhat.rhn.common.util.StringUtil; import com.redhat.rhn.domain.channel.Channel; import com.redhat.rhn.domain.channel.ChannelArch; import com.redhat.rhn.domain.channel.ChannelFactory; import com.redhat.rhn.domain.common.ChecksumType; import com.redhat.rhn.domain.org.Org; import com.redhat.rhn.domain.role.RoleFactory; import com.redhat.rhn.domain.server.Server; import com.redhat.rhn.domain.server.ServerFactory; import com.redhat.rhn.domain.user.User; import com.redhat.rhn.frontend.dto.OrgTrust; 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.frontend.taglibs.list.helper.ListHelper; import com.redhat.rhn.frontend.taglibs.list.helper.Listable; import com.redhat.rhn.frontend.xmlrpc.InvalidChannelLabelException; import com.redhat.rhn.frontend.xmlrpc.InvalidChannelNameException; import com.redhat.rhn.frontend.xmlrpc.InvalidGPGKeyException; import com.redhat.rhn.frontend.xmlrpc.InvalidGPGUrlException; import com.redhat.rhn.manager.channel.ChannelManager; import com.redhat.rhn.manager.channel.CloneChannelCommand; import com.redhat.rhn.manager.channel.CreateChannelCommand; import com.redhat.rhn.manager.channel.InvalidGPGFingerprintException; import com.redhat.rhn.manager.channel.UpdateChannelCommand; import com.redhat.rhn.manager.download.DownloadManager; import com.redhat.rhn.manager.system.SystemManager; import com.redhat.rhn.manager.user.UserManager; import org.apache.commons.lang.StringUtils; import org.apache.struts.action.ActionErrors; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.struts.action.ActionMessage; import org.apache.struts.action.ActionMessages; import org.apache.struts.action.DynaActionForm; import org.stringtree.json.JSONWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * EditChannelAction * @version $Rev: 1 $ */ public class EditChannelAction extends RhnAction implements Listable<OrgTrust> { public static final String GPG_FINGERPRINT = "gpg_key_fingerprint"; public static final String GPG_KEY = "gpg_key_id"; public static final String GPG_URL = "gpg_key_url"; public static final String SUPPORT_POLICY = "support_policy"; public static final String ORG_SHARING = "org_sharing"; public static final String MAINT_PHONE = "maintainer_phone"; public static final String MAINT_EMAIL = "maintainer_email"; public static final String MAINT_NAME = "maintainer_name"; public static final String SUBSCRIPTIONS = "per_user_subscriptions"; public static final String NAME = "name"; public static final String LABEL = "label"; public static final String PARENT = "parent"; public static final String ARCH = "arch"; public static final String ARCH_NAME = "arch_name"; public static final String CHECKSUM = "checksum"; public static final String SUMMARY = "summary"; public static final String DESCRIPTION = "description"; public static final String CLONE_TYPE = "clone_type"; public static final String ORIGINAL_ID = "original_id"; public static final String ORIGINAL_NAME = "original_name"; public static final String CHANNEL_NAME = "channel_name"; public static final String CHANNEL_LABEL = "channel_label"; public static final String CHANNEL_ARCH = "channel_arch"; public static final String CHANNEL_ARCH_LABEL = "channel_arch_label"; public static final String DEFAULT_ARCH = "channel-x86_64"; public static final String DEFAULT_CHECKSUM = "sha1"; public static final String DEFAULT_ORG_SHARING = "private"; public static final String DEFAULT_SUBSCRIPTIONS = "all"; /** {@inheritDoc} */ public ActionForward execute(ActionMapping mapping, ActionForm formIn, HttpServletRequest request, HttpServletResponse response) { ActionErrors errors = new ActionErrors(); DynaActionForm form = (DynaActionForm)formIn; Map<String, Object> params = makeParamMap(request); RequestContext ctx = new RequestContext(request); boolean cloneSelect = false; // keep the cid if (ctx.hasParam("cid")) { params.put("cid", ctx.getParam("cid", true)); } if (!isSubmitted(form)) { setupForm(request, form); return getStrutsDelegate().forwardParams( mapping.findForward(RhnHelper.DEFAULT_FORWARD), request.getParameterMap()); } if (ctx.hasParam("clone_button")) { Long cid = clone(form, errors, ctx); params.put("cid", cid); if (errors.isEmpty()) { String[] msgParams = new String[2]; msgParams[0] = form.getString(NAME); msgParams[1] = form.getString(ORIGINAL_NAME); createMessage(request, "message.channelcloned", msgParams); if (form.getString(CLONE_TYPE).equals("select")) { cloneSelect = true; createSuccessMessage(request, "message.cloneselect", form .getString(ORIGINAL_NAME)); } } } else if (ctx.hasParam("create_button")) { Long cid = create(form, errors, ctx); params.put("cid", cid); if (errors.isEmpty()) { createSuccessMessage(request, "message.channelcreated", form .getString(NAME)); } } else if (ctx.hasParam("edit_button")) { String sharing = (String) form.get(ORG_SHARING); if (hasSharingChanged(form, ctx) && ("private".equals(sharing) || "protected".equals(sharing))) { // forward to confirm page request.setAttribute("org", ctx.getCurrentUser().getOrg()); formToAttributes(request, form); Map urlParams = new HashMap(); urlParams.put(RequestContext.CID, ctx.getRequiredParam(RequestContext.CID)); ListHelper helper = new ListHelper(this, request, urlParams); helper.setDataSetName(getDataSetName()); helper.setListName(getListName()); // ignore the return helper.execute(); request.setAttribute(CHANNEL_NAME, form.getString(NAME)); return getStrutsDelegate().forwardParams( mapping.findForward(sharing), params); } edit(form, errors, ctx); if (errors.isEmpty()) { createSuccessMessage(request, "message.channelupdated", form .getString(NAME)); } //did they enable per user subscriptions? String sub = (String) form.get(SUBSCRIPTIONS); if (!sub.equals("all")) { addMessage(request, "message.channelsubscribers"); } } // handler for private confirmation page else if (ctx.hasParam(RequestContext.DISPATCH)) { makePrivate(form, errors, ctx); if (errors.isEmpty()) { createSuccessMessage(request, "message.channelupdated", form .getString(NAME)); } } else if (ctx.hasParam("deny")) { deny(form, errors, ctx); if (errors.isEmpty()) { createSuccessMessage(request, "message.channelupdated", form .getString(NAME)); } } else if (ctx.hasParam("grant")) { grant(form, errors, ctx); if (errors.isEmpty()) { createSuccessMessage(request, "message.channelupdated", form .getString(NAME)); } } if (!errors.isEmpty()) { request.setAttribute(CHANNEL_LABEL, form.get(LABEL)); request.setAttribute(CHANNEL_NAME, form.getString(NAME)); request.setAttribute(CHANNEL_ARCH, form.get(ARCH_NAME)); request.setAttribute(CHANNEL_ARCH_LABEL, form.get(ARCH)); request.setAttribute(CHECKSUM, form.get(CHECKSUM)); addErrors(request, errors); prepDropdowns(new RequestContext(request), null); return getStrutsDelegate().forwardParams( mapping.findForward(RhnHelper.DEFAULT_FORWARD), params); } if (cloneSelect) { return getStrutsDelegate().forwardParams(mapping.findForward("select"), params); } return getStrutsDelegate().forwardParams( mapping.findForward("success"), params); } /** * Return true if the form value of org_sharing is different than the * Channel for the given id. * @param form contains the user entered values. * @param ctx current Request context. * @return true if the form value of org_sharing is different than the * Channel for the given id. */ private boolean hasSharingChanged(DynaActionForm form, RequestContext ctx) { Long cid = ctx.getParamAsLong("cid"); Channel c = ChannelFactory.lookupByIdAndUser(cid, ctx.getCurrentUser()); return !c.getAccess().equals(form.get(ORG_SHARING)); } /** * Stupid method to copy the contents of the form to the request so that we * can perform the confirmation. There's probably a better way, but I've * spent way too long battling Struts. * @param request ServletRequest to which the form will be copied as * attributes. * @param form The DynaActionForm to be copied. */ private void formToAttributes(HttpServletRequest request, DynaActionForm form) { request.setAttribute(NAME, form.get(NAME)); request.setAttribute(LABEL, form.get(LABEL)); request.setAttribute(PARENT, form.get(PARENT)); request.setAttribute(ARCH, form.get(ARCH)); request.setAttribute(CHECKSUM, form.get(CHECKSUM)); request.setAttribute(ARCH_NAME, form.get(ARCH_NAME)); request.setAttribute(SUMMARY, form.get(SUMMARY)); request.setAttribute(DESCRIPTION, form.get(DESCRIPTION)); request.setAttribute(MAINT_NAME, form.get(MAINT_NAME)); request.setAttribute(MAINT_EMAIL, form.get(MAINT_EMAIL)); request.setAttribute(MAINT_PHONE, form.get(MAINT_PHONE)); request.setAttribute(SUPPORT_POLICY, form.get(SUPPORT_POLICY)); request.setAttribute(SUBSCRIPTIONS, form.get(SUBSCRIPTIONS)); request.setAttribute(ORG_SHARING, form.get(ORG_SHARING)); request.setAttribute(GPG_URL, form.get(GPG_URL)); request.setAttribute(GPG_KEY, form.get(GPG_KEY)); request.setAttribute(GPG_FINGERPRINT, form.get(GPG_FINGERPRINT)); } /** * * @param form form to check * @param errors errors to report * @param ctx context * @return Channel */ private Channel deny(DynaActionForm form, ActionErrors errors, RequestContext ctx) { Channel c = edit(form, errors, ctx); User user = ctx.getCurrentUser(); unsubscribeOrgsFromChannel(user, c, Channel.PROTECTED); c.getTrustedOrgs().clear(); ChannelFactory.save(c); return c; } /** * * @param user User that owns parent channel * @param channelIn base channel to unsubscribe from. */ private void unsubscribeOrgsFromChannel(User user, Channel channelIn, String accessIn) { Org org = channelIn.getOrg(); // find trusted orgs Set<Org> trustedOrgs = org.getTrustedOrgs(); for (Org o : trustedOrgs) { // find systems subscribed in org Trust DataResult<Map<String, Object>> dr = SystemManager.sidsInOrgTrust( org.getId(), o.getId()); for (Map<String, Object> item : dr) { Long sid = (Long) item.get("id"); Server s = ServerFactory.lookupById(sid); if (s.isSubscribed(channelIn)) { // check if this is a base custom channel if (channelIn.getParentChannel() == null) { // unsubscribe children first if subscribed List<Channel> children = channelIn .getAccessibleChildrenFor(user); Iterator<Channel> i = children.iterator(); while (i.hasNext()) { Channel child = i.next(); if (s.isSubscribed(child)) { // unsubscribe server from child channel child.getTrustedOrgs().remove(o); child.setAccess(accessIn); ChannelFactory.save(child); s = SystemManager. unsubscribeServerFromChannel(s, child); } } } // unsubscribe server from channel ChannelFactory.save(channelIn); s = SystemManager.unsubscribeServerFromChannel(s, channelIn); } } } } private void grant(DynaActionForm form, ActionErrors errors, RequestContext ctx) { Channel c = edit(form, errors, ctx); // if there was no exception during the above edit // add all of the orgs to the "rhnchanneltrust" if (c != null) { Org org = ctx.getCurrentUser().getOrg(); Set<Org> trustedorgs = org.getTrustedOrgs(); c.setTrustedOrgs(trustedorgs); ChannelFactory.save(c); } } private Channel makePrivate(DynaActionForm form, ActionErrors errors, RequestContext ctx) { User user = ctx.getCurrentUser(); Long cid = ctx.getParamAsLong("cid"); Channel channel = ChannelFactory.lookupById(cid); unsubscribeOrgsFromChannel(user, channel, Channel.PRIVATE); return edit(form, errors, ctx); } private Channel edit(DynaActionForm form, ActionErrors errors, RequestContext ctx) { User loggedInUser = ctx.getCurrentUser(); Channel updated = null; // handle submission // why can't I just pass in a dictionary? sigh, there are // times where python would make this SOOOO much easier. UpdateChannelCommand ucc = new UpdateChannelCommand(); ucc.setArchLabel((String) form.get(ARCH)); ucc.setChecksumLabel((String) form.get(CHECKSUM)); ucc.setLabel((String) form.get(LABEL)); ucc.setName((String) form.get(NAME)); ucc.setSummary((String) form.get(SUMMARY)); ucc.setDescription((String) form.get(DESCRIPTION)); ucc.setUser(loggedInUser); ucc.setGpgKeyId((String) form.get(GPG_KEY)); ucc.setGpgKeyUrl((String) form.get(GPG_URL)); ucc.setGpgKeyFp((String) form.get(GPG_FINGERPRINT)); ucc.setMaintainerName((String) form.get(MAINT_NAME)); ucc.setMaintainerEmail((String) form.get(MAINT_EMAIL)); ucc.setMaintainerPhone((String) form.get(MAINT_PHONE)); ucc.setSupportPolicy((String) form.get(SUPPORT_POLICY)); ucc.setAccess((String) form.get(ORG_SHARING)); String parent = (String) form.get(PARENT); if (parent == null || parent.equals("")) { ucc.setParentId(null); } else { ucc.setParentId(Long.valueOf(parent)); } try { updated = ucc.update(ctx.getParamAsLong("cid")); String sharing = (String) form.get(SUBSCRIPTIONS); updated.setGloballySubscribable((sharing != null) && ("all".equals(sharing)), loggedInUser.getOrg()); updated = (Channel) ChannelFactory.reload(updated); } catch (InvalidGPGFingerprintException borg) { errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("edit.channel.invalidgpgfp")); } catch (InvalidGPGKeyException dukat) { errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("edit.channel.invalidgpgkey")); } catch (InvalidGPGUrlException khan) { errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("edit.channel.invalidgpgurl")); } catch (InvalidChannelNameException ferengi) { handleChannelNameException(errors, ferengi); } catch (InvalidChannelLabelException q) { handleChannelLabelException(errors, q); } catch (IllegalArgumentException iae) { errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(iae.getMessage())); } return updated; } private Long createChannelHelper(CreateChannelCommand command, DynaActionForm form, ActionErrors errors, RequestContext ctx) { User user = ctx.getCurrentUser(); String parentString = form.getString(PARENT); Long parentId = null; if (parentString != null && !StringUtils.isEmpty(parentString)) { parentId = Long.valueOf(parentString); } command.setName(form.getString(NAME)); command.setLabel(form.getString(LABEL)); command.setSummary(form.getString(SUMMARY)); command.setDescription(StringUtil.nullIfEmpty(form.getString(DESCRIPTION))); command.setArchLabel(form.getString(ARCH)); command.setChecksumLabel(form.getString(CHECKSUM)); command.setGpgKeyFp(StringUtil.nullIfEmpty(form.getString(GPG_FINGERPRINT))); command.setGpgKeyId(StringUtil.nullIfEmpty(form.getString(GPG_KEY))); command.setGpgKeyUrl(StringUtil.nullIfEmpty(form.getString(GPG_URL))); command.setParentId(parentId); command.setUser(user); command.setMaintainerName(StringUtil.nullIfEmpty(form.getString(MAINT_NAME))); command.setMaintainerEmail(StringUtil.nullIfEmpty(form.getString(MAINT_EMAIL))); command.setMaintainerPhone(StringUtil.nullIfEmpty(form.getString(MAINT_PHONE))); command.setSupportPolicy(StringUtil.nullIfEmpty(form.getString(SUPPORT_POLICY))); command.setAccess(form.getString(ORG_SHARING)); String sharing = form.getString(SUBSCRIPTIONS); command.setGloballySubscribable((sharing != null) && ("all".equals(sharing))); try { Channel c = command.create(); return c.getId(); } catch (InvalidGPGFingerprintException borg) { errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( "edit.channel.invalidgpgfp")); } catch (InvalidGPGKeyException dukat) { errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( "edit.channel.invalidgpgkey")); } catch (InvalidGPGUrlException khan) { errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( "edit.channel.invalidgpgurl")); } catch (InvalidChannelNameException ferengi) { handleChannelNameException(errors, ferengi); } catch (InvalidChannelLabelException q) { handleChannelLabelException(errors, q); } catch (IllegalArgumentException iae) { errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(iae.getMessage())); } return null; } private Long clone(DynaActionForm form, ActionErrors errors, RequestContext ctx) { User user = ctx.getCurrentUser(); Channel original = ChannelManager.lookupByIdAndUser((Long) form.get(ORIGINAL_ID), user); boolean originalState = true; if (form.getString(CLONE_TYPE).equals("current")) { originalState = false; } CloneChannelCommand command = new CloneChannelCommand(originalState, original); return createChannelHelper(command, form, errors, ctx); } private Long create(DynaActionForm form, ActionErrors errors, RequestContext ctx) { CreateChannelCommand ccc = new CreateChannelCommand(); return createChannelHelper(ccc, form, errors, ctx); } private void handleChannelNameException(ActionErrors errors, InvalidChannelNameException ferengi) { switch (ferengi.getReason()) { case IS_MISSING: errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("edit.channel.invalidchannelname.missing")); break; case REGEX_FAILS: errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("edit.channel.invalidchannelname.regex")); break; case REDHAT_REGEX_FAILS: errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("edit.channel.invalidchannelname.redhat", ferengi.getArgs())); break; case TOO_SHORT: errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("edit.channel.invalidchannelname.minlength", CreateChannelCommand.CHANNEL_NAME_MIN_LENGTH)); break; case TOO_LONG: errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("edit.channel.invalidchannelname.maxlength", CreateChannelCommand.CHANNEL_NAME_MAX_LENGTH)); break; case NAME_IN_USE: errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("edit.channel.invalidchannelname.nameinuse", ferengi.getName())); break; default: errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("edit.channel.invalidchannelname")); } } private void handleChannelLabelException(ActionErrors errors, InvalidChannelLabelException q) { switch (q.getReason()) { case IS_MISSING: errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("edit.channel.invalidchannellabel.missing")); break; case REGEX_FAILS: errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("edit.channel.invalidchannellabel.regex")); break; case REDHAT_REGEX_FAILS: errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("edit.channel.invalidchannellabel.redhat", q.getArgs())); break; case TOO_SHORT: errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("edit.channel.invalidchannellabel.minlength", CreateChannelCommand.CHANNEL_LABEL_MIN_LENGTH)); break; case LABEL_IN_USE: errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("edit.channel.invalidchannellabel.labelinuse", q.getLabel())); break; default: errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("edit.channel.invalidchannellabel")); } } /** * Set up things required for edit.jsp to render correctly * @param request the request * @param form the form * @param c the channel */ public static void setupFormHelper(HttpServletRequest request, DynaActionForm form, Channel c) { form.set(SUMMARY, c.getSummary()); form.set(DESCRIPTION, c.getDescription()); form.set(ORG_SHARING, c.getAccess()); form.set(GPG_URL, c.getGPGKeyUrl()); form.set(GPG_KEY, c.getGPGKeyId()); form.set(GPG_FINGERPRINT, c.getGPGKeyFp()); form.set(MAINT_NAME, c.getMaintainerName()); form.set(MAINT_PHONE, c.getMaintainerPhone()); form.set(MAINT_EMAIL, c.getMaintainerEmail()); form.set(SUPPORT_POLICY, c.getSupportPolicy()); if (c.getChecksumTypeLabel() == null) { form.set(CHECKSUM, null); } else { form.set(CHECKSUM, c.getChecksumTypeLabel()); } if (c.getParentChannel() != null) { request.setAttribute("parent_name", c.getParentChannel().getName()); request.setAttribute("parent_id", c.getParentChannel().getId()); } else { request.setAttribute("parent_name", LocalizationService.getInstance() .getMessage("generic.jsp.none")); } request.setAttribute(CHANNEL_ARCH, c.getChannelArch().getName()); request.setAttribute(CHANNEL_ARCH_LABEL, c.getChannelArch().getLabel()); } private static void setupForm(HttpServletRequest request, DynaActionForm form) { RequestContext ctx = new RequestContext(request); prepDropdowns(ctx, null); Long cid = ctx.getParamAsLong("cid"); if (cid != null) { Channel c = ChannelManager.lookupByIdAndUser(cid, ctx.getCurrentUser()); if (!UserManager.verifyChannelAdmin(ctx.getCurrentUser(), c)) { throw new PermissionException(RoleFactory.CHANNEL_ADMIN); } form.set(NAME, c.getName()); request.setAttribute(CHANNEL_LABEL, c.getLabel()); request.setAttribute(CHANNEL_NAME, c.getName()); if (c.getSources().isEmpty()) { request.setAttribute("last_sync", ""); } else { String lastSync = LocalizationService.getInstance().getMessage( "channel.edit.repo.neversynced"); if (c.getLastSynced() != null) { lastSync = LocalizationService.getInstance().formatCustomDate( c.getLastSynced()); } request.setAttribute("last_sync", lastSync); if (!ChannelManager.getLatestSyncLogFiles(c).isEmpty()) { request.setAttribute("log_url", DownloadManager.getChannelSyncLogDownloadPath(c, ctx.getCurrentUser())); } } if (c.isGloballySubscribable(ctx.getCurrentUser().getOrg())) { form.set(SUBSCRIPTIONS, "all"); } else { form.set(SUBSCRIPTIONS, "selected"); } setupFormHelper(request, form, c); } else { // default settings String channelName = LocalizationService.getInstance() .getMessage("frontend.actions.channels.manager.create"); request.setAttribute(CHANNEL_NAME, channelName); form.set(ORG_SHARING, DEFAULT_ORG_SHARING); form.set(SUBSCRIPTIONS, DEFAULT_SUBSCRIPTIONS); form.set(CHECKSUM, DEFAULT_CHECKSUM); request.setAttribute(CHANNEL_ARCH_LABEL, DEFAULT_ARCH); } } /** * prep the dropdown menues for the edit page * @param ctx request context for this request * @param original original channel if cloning, null otherwise */ public static void prepDropdowns(RequestContext ctx, Channel original) { User loggedInUser = ctx.getCurrentUser(); // populate parent base channels List<Map<String, String>> baseChannels = new ArrayList<Map<String, String>>(); List<Channel> bases = ChannelManager.findAllBaseChannelsForOrg( loggedInUser); LocalizationService ls = LocalizationService.getInstance(); // if cloning a base channel "None" should be the only option for parents // if cloning a child channel "None" should not be an option // if not cloning everything should be an option if (original == null || original.isBaseChannel()) { addOption(baseChannels, ls.getMessage("generic.jsp.none"), ""); } if (original == null || !original.isBaseChannel()) { for (Channel c : bases) { addOption(baseChannels, c.getName(), c.getId().toString()); } // if cloning a child channel, make a guess as to who the parent should be if (original != null) { ctx.getRequest().setAttribute("defaultParent", ChannelManager.likelyParentId(original, loggedInUser.getOrg())); } } ctx.getRequest().setAttribute("parentChannels", baseChannels); Map<Long, String> parentChannelArches = new HashMap<Long, String>(); for (Channel c : bases) { parentChannelArches.put(c.getId(), c.getChannelArch().getLabel()); } ctx.getRequest().setAttribute("parentChannelArches", parentChannelArches); Map<Long, String> parentChannelChecksums = new HashMap<Long, String>(); for (Channel c : bases) { parentChannelChecksums.put(c.getId(), c.getChecksumTypeLabel()); } ctx.getRequest().setAttribute("parentChannelChecksums", parentChannelChecksums); JSONWriter json = new JSONWriter(); // base channel arches List<Map<String, String>> channelArches = new ArrayList<Map<String, String>>(); List<ChannelArch> arches = ChannelManager.getChannelArchitectures(); List<Map<String, String>> allArchConstruct = new ArrayList<Map<String, String>>(); for (ChannelArch arch : arches) { addOption(channelArches, arch.getName(), arch.getLabel()); Map<String, String> archAttrs = new HashMap<String, String>(); archAttrs.put(NAME, arch.getName()); archAttrs.put(LABEL, arch.getLabel()); allArchConstruct.add(archAttrs); } ctx.getRequest().setAttribute("channelArches", channelArches); Map<String, String> archCompatMap = new HashMap<String, String>(); Set<String> uniqueParentChannelArches = new HashSet<String>(parentChannelArches .values()); for (String arch : uniqueParentChannelArches) { archCompatMap.put( arch, json.write(ChannelManager.compatibleChildChannelArches(arch))); } // empty string for when there is no parent, all arches are available archCompatMap.put("", json.write(allArchConstruct)); ctx.getRequest().setAttribute("archCompatMap", archCompatMap); // set the list of yum supported checksums List<Map<String, String>> checksums = new ArrayList<Map<String, String>>(); for (ChecksumType chType : ChannelFactory.listYumSupportedChecksums()) { addOption(checksums, chType.getLabel(), chType.getLabel()); } ctx.getRequest().setAttribute("checksums", checksums); } /** * Utility function to create options for the dropdown. * @param options list containing all options. * @param key resource bundle key used as the display value. * @param value value to be submitted with form. */ private static void addOption(List<Map<String, String>> options, String key, String value) { Map<String, String> selection = new HashMap<String, String>(); selection.put(LABEL, key); selection.put("value", value); options.add(selection); } /** {@inheritDoc} */ public String getDataSetName() { return RequestContext.PAGE_LIST; } /** {@inheritDoc} */ public String getListName() { // TODO Auto-generated method stub return "trustedOrgList"; } /** {@inheritDoc} */ public String getParentUrl(RequestContext ctx) { return ctx.getRequest().getRequestURI() + "?cid=" + ctx.getParamAsLong("cid"); } /** {@inheritDoc} */ public List<OrgTrust> getResult(RequestContext ctx) { Org org = ctx.getCurrentUser().getOrg(); Set<Org> trustedorgs = org.getTrustedOrgs(); List<OrgTrust> trusts = new ArrayList<OrgTrust>(); for (Org o : trustedorgs) { DataResult<Map<String, Object>> dr = SystemManager.sidsInOrgTrust(org.getId(), o.getId()); OrgTrust trust = new OrgTrust(o); if (!dr.isEmpty()) { for (Map<String, Object> m : dr) { Long sid = (Long)m.get("id"); trust.getSubscribed().add(sid); } } trusts.add(trust); } return trusts; } }