Hi all

I'm emailing this patch rather than just committing it as I'd like to
make sure I've done this correctly.

My main concern is the SQL I've put in Channel_queries.xml (I'm sure
it could be done better).

Could I get some feedback on this please?

Thanks

CC

-- 
RHCE#805007969328369
diff --git a/java/code/src/com/redhat/rhn/common/db/datasource/xml/Channel_queries.xml b/java/code/src/com/redhat/rhn/common/db/datasource/xml/Channel_queries.xml
index 0f7fe7e..e9a7d5f 100644
--- a/java/code/src/com/redhat/rhn/common/db/datasource/xml/Channel_queries.xml
+++ b/java/code/src/com/redhat/rhn/common/db/datasource/xml/Channel_queries.xml
@@ -1250,6 +1250,18 @@ END;
     </query>
 </callable-mode>
 
+<mode name="activation_key_child_channels">
+  <query params="token_id, user_id">
+    SELECT DISTINCT c1.id as id,
+       (select name from rhnChannel C2 where c1.parent_channel = c2.id) parent,
+       c1.name as name,
+       NVL2((SELECT 1 FROM rhnRegTokenChannels WHERE token_id = :token_id AND channel_id = c1.id), 'selected', '') s
+    FROM rhnChannel c1 inner join rhnUserChannel UC on UC.channel_id = C1.id
+    AND c1.parent_channel IS NOT NULL
+    AND UC.user_id = :user_id
+    ORDER BY parent, name
+  </query>
+</mode>
 <callable-mode name="can_convert_to_flex">
   <query params="result, sid, cfid">
       {:result = call rhn_channel.convert_to_fve(:sid, :cfid)}
diff --git a/java/code/src/com/redhat/rhn/frontend/action/token/ActivationKeyChildChannelsAction.java b/java/code/src/com/redhat/rhn/frontend/action/token/ActivationKeyChildChannelsAction.java
new file mode 100644
index 0000000..fe73cbe
--- /dev/null
+++ b/java/code/src/com/redhat/rhn/frontend/action/token/ActivationKeyChildChannelsAction.java
@@ -0,0 +1,150 @@
+/**
+ * Copyright (c) 2009--2010 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.token;
+
+import com.redhat.rhn.common.db.datasource.DataResult;
+import com.redhat.rhn.common.db.datasource.ModeFactory;
+import com.redhat.rhn.common.db.datasource.SelectMode;
+import com.redhat.rhn.domain.channel.Channel;
+import com.redhat.rhn.domain.channel.ChannelFactory;
+import com.redhat.rhn.domain.token.ActivationKey;
+import com.redhat.rhn.domain.token.ActivationKeyFactory;
+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.manager.token.ActivationKeyManager;
+
+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 java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+
+/**
+ * ActivationKeyDetailsAction
+ * @version $Rev$
+ */
+public class ActivationKeyChildChannelsAction extends RhnAction {
+    private static final String CHANNELS = "channels";
+    private static final Long DEFAULT_CHANNEL_ID = -1L;
+    private static final String POSSIBLE_CHANNELS = "possibleChannels";
+    private static final String SELECTED_CHANNEL = "selectedChannel";
+
+
+
+    /** {...@inheritdoc} */
+    @Override
+    public ActionForward execute(ActionMapping mapping,
+                                 ActionForm formIn,
+                                 HttpServletRequest request,
+                                 HttpServletResponse response) throws Exception {
+        RequestContext context = new RequestContext(request);
+        DynaActionForm form = (DynaActionForm) formIn;
+
+        ActivationKey key = context.lookupAndBindActivationKey();
+        Map params = new HashMap();
+        String fwd = "default";
+
+        request.setAttribute("description", key.getNote());
+
+        if (context.isSubmitted()) {
+            params.put(RequestContext.TOKEN_ID, key.getId().toString());
+            update(form, context);
+            fwd = "success";
+        }
+        else {
+            populateForm(form, key, context);
+        }
+
+        return getStrutsDelegate().forwardParams(
+            mapping.findForward(fwd), params);
+
+    }
+
+    private ActivationKey update(DynaActionForm form, RequestContext context) {
+        User user = context.getLoggedInUser();
+        ActivationKeyManager manager = ActivationKeyManager.getInstance();
+        ActivationKey key = context.lookupAndBindActivationKey();
+
+        Channel base = key.getBaseChannel();
+        key.clearChannels();
+        if (base != null) {
+            key.addChannel(base);
+        }
+
+        for (String id : (String[])form.get("childChannels")) {
+            key.addChannel(ChannelFactory.lookupById(Long.parseLong(id.trim())));
+        }
+
+        ActivationKeyFactory.save(key);
+        ActionMessages msg = new ActionMessages();
+        addToMessage(msg, "activation-key.java.modified", key.getNote());
+
+        getStrutsDelegate().saveMessages(context.getRequest(), msg);
+        return key;
+    }
+
+    private void populateForm(DynaActionForm form, ActivationKey key,
+                                                RequestContext context) {
+        context.getRequest().setAttribute(CHANNELS, key.getChannels());
+
+        User user = context.getLoggedInUser();
+        DataResult<HashMap> channelList = getPossibleChannels(user, key.getId());
+        ArrayList finalList = new ArrayList();
+
+        if (key.getBaseChannel() != null) {
+            for (HashMap c : channelList) {
+                Long id = (Long)c.get("id");
+                if (ChannelFactory.lookupById(id).getParentChannel().getId() ==
+                        key.getBaseChannel().getId()) {
+                    finalList.add(c);
+                }
+            }
+            context.getRequest().setAttribute("baseChannel",
+                    key.getBaseChannel().getName());
+        }
+        else {
+            finalList = (ArrayList)channelList;
+        }
+        context.getRequest().setAttribute(CHANNELS, finalList);
+        form.set(CHANNELS, finalList);
+    }
+
+    private void addToMessage(ActionMessages msgs, String key, Object... args) {
+        ActionMessage temp =  new ActionMessage(key, args);
+        msgs.add(ActionMessages.GLOBAL_MESSAGE, temp);
+    }
+
+    private static DataResult getPossibleChannels(User user, Long tokenId) {
+        SelectMode m = ModeFactory.getMode("Channel_queries",
+                                           "activation_key_child_channels");
+        Map params = new HashMap();
+        params.put("user_id", user.getId());
+        params.put("token_id", tokenId);
+        DataResult list = m.execute(params);
+        list.elaborate();
+        return list;
+    }
+
+}
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 b659fc3..277c33d 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
@@ -12649,6 +12649,20 @@ the &lt;strong&gt;Red Hat Enterprise Linux System Administration Guide.&lt;/stro
 
      <group>
        <context-group name="ctx">
+           <context context-type="sourcefile">/rhn/activationkeys/childchannels/* pages</context>
+       </context-group>
+
+       <trans-unit id="activation-key.childchannels.jsp.summary">
+           <source>Any system registered using this activation key will be subscribed to the selected child channels.</source>
+       </trans-unit>
+
+       <trans-unit id="activation-key.childchannels.jsp.blurb">
+           <source>The following child channels of &lt;strong&gt;{0}&lt;/strong&gt; can be associated with this activation key.</source>
+       </trans-unit>
+    </group>
+
+     <group>
+       <context-group name="ctx">
            <context context-type="sourcefile">/rhn/activationkeys/configuration/* pages</context>
        </context-group>
 
diff --git a/java/code/src/com/redhat/rhn/manager/channel/ChannelManager.java b/java/code/src/com/redhat/rhn/manager/channel/ChannelManager.java
index 397a8e2..8e6bf34 100644
--- a/java/code/src/com/redhat/rhn/manager/channel/ChannelManager.java
+++ b/java/code/src/com/redhat/rhn/manager/channel/ChannelManager.java
@@ -508,7 +508,7 @@ public class ChannelManager extends BaseManager {
 
     /**
      * Returns a list of ChannelTreeNodes that have orgId null
-     *      or has a prarent with org_id null
+     *      or has a parent with org_id null
      * @param user who we are requesting Red Hat channels for
      * @param lc ListControl to use
      * @return list of ChannelTreeNode's
diff --git a/java/code/webapp/WEB-INF/nav/activation_key.xml b/java/code/webapp/WEB-INF/nav/activation_key.xml
index c2b48c5..4343276 100644
--- a/java/code/webapp/WEB-INF/nav/activation_key.xml
+++ b/java/code/webapp/WEB-INF/nav/activation_key.xml
@@ -2,7 +2,7 @@
 <rhn-navi-tree label="activation_key" invisible="1" title-depth="1" formvar="tid"
         acl_mixins="com.redhat.rhn.common.security.acl.ActivationKeyAclHandler">
   <rhn-tab name="Details" url="/rhn/activationkeys/Edit.do" />
-  <rhn-tab name="Child Channels" url="/network/account/activation_keys/child_channels.pxt" />
+  <rhn-tab name="Child Channels" url="/rhn/activationkeys/channels/ChildChannels.do"/>
 
   <rhn-tab name="Packages"
            url="/rhn/activationkeys/packages/Packages.do"/>
diff --git a/java/code/webapp/WEB-INF/pages/activationkeys/childchannels/listeditchannels.jsp b/java/code/webapp/WEB-INF/pages/activationkeys/childchannels/listeditchannels.jsp
new file mode 100644
index 0000000..4b1d99f
--- /dev/null
+++ b/java/code/webapp/WEB-INF/pages/activationkeys/childchannels/listeditchannels.jsp
@@ -0,0 +1,73 @@
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core"; prefix="c" %>
+<%@ taglib uri="http://rhn.redhat.com/rhn"; prefix="rhn" %>
+<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean"; prefix="bean" %>
+<%@ taglib uri="http://jakarta.apache.org/struts/tags-html"; prefix="html" %>
+
+<html>
+
+<head>
+  <meta name="name" value="activationkeys.jsp.header" />
+</head>
+
+<body>
+<%@ include file="/WEB-INF/pages/common/fragments/activationkeys/common-header.jspf" %>
+
+<html:form action="/activationkeys/channels/ChildChannels">
+
+  <div class="page-summary">
+    <p>
+      <bean:message key="activation-key.childchannels.jsp.summary"/>
+    </p>
+    <c:if test='${not empty baseChannel}'>
+      <bean:message key="activation-key.childchannels.jsp.blurb" arg0="${baseChannel}"/>
+    </c:if>
+
+    <table class="details">
+      <tr>
+        <td>
+          <select multiple="multiple" name="childChannels" size="6">
+          <c:set var="first" scope="session" value="yes"/>
+          <c:forEach items="${channels}" var="channel" varStatus="loop">
+            <c:choose>
+              <c:when test="${first == 'yes'}">
+                <c:set var="first" scope="session" value="no"/>
+                <c:set var="last_parent" scope="session" value="${channel.parent}"/>
+                <c:if test="${empty baseChannel}">
+                  <optgroup label="${channel.parent}">
+                </c:if>
+              </c:when>
+              <c:otherwise>
+                <c:if test="${(channel.parent != last_parent) && empty baseChannel}">
+                  </optgroup>
+                  <optgroup label="${channel.parent}">
+                </c:if>
+              </c:otherwise>
+            </c:choose>
+            <option value="${channel.id}" ${channel.s}>${channel.name}</option>
+            <c:set var="last_parent" scope="session" value="${channel.parent}"/>
+          </c:forEach>
+          <c:if test="${empty baseChannel}">
+            </optgroup>
+          </c:if>
+        </select>
+        </td>
+      </tr>
+    </table>
+
+    <div align="right">
+      <rhn:submitted/>
+      <hr/>
+      <input type="submit" name ="dispatch" value='<bean:message key="keyedit.jsp.submit"/>'/>
+    </div>
+
+    <html:hidden property="submitted" value="true" />
+    <c:if test='${not empty param.tid}'>
+      <html:hidden property="tid" value="${param.tid}" />
+    </c:if>
+
+  </div>
+</html:form>
+
+</body>
+</html>
+
diff --git a/java/code/webapp/WEB-INF/struts-config.xml b/java/code/webapp/WEB-INF/struts-config.xml
index 674b833..7fa3c6a 100644
--- a/java/code/webapp/WEB-INF/struts-config.xml
+++ b/java/code/webapp/WEB-INF/struts-config.xml
@@ -27,6 +27,12 @@
            <form-property name="packages" type="java.lang.String"/>
            <form-property name="submitted" type="java.lang.Boolean"/>
        </form-bean>
+       <form-bean name="activationKeyChildChannelForm"
+           type="com.redhat.rhn.frontend.struts.ScrubbingDynaActionForm">
+           <form-property name="channels" type="java.util.ArrayList"/>
+           <form-property name="childChannels" type="java.lang.String[]"/>
+           <form-property name="submitted" type="java.lang.Boolean"/>
+       </form-bean>
        <form-bean name="storedProfileForm"
            type="com.redhat.rhn.frontend.struts.ScrubbingDynaActionForm">
            <form-property name="name" type="java.lang.String"/>
@@ -4832,6 +4838,20 @@
                  path="/activationkeys/List.do"/>
     </action>
 
+    <action path="/activationkeys/channels/ChildChannels"
+        name="activationKeyChildChannelForm"
+        scope="request"
+        input="/WEB-INF/pages/activationkeys/childchannels/listeditchannels.jsp"
+                type="com.redhat.rhn.frontend.action.token.ActivationKeyChildChannelsAction"
+                className="com.redhat.rhn.frontend.struts.RhnActionMapping"
+                parameter="dispatch">
+        <set-property property="acls" value="user_role(activation_key_admin)"/>
+        <forward name="default"
+                 path="/WEB-INF/pages/activationkeys/childchannels/listeditchannels.jsp"/>
+        <forward name="success" redirect="true"
+                 path="/activationkeys/channels/ChildChannels.do"/>
+    </action>
+
     <action path="/activationkeys/packages/Packages"
 	name="activationKeyPackagesForm"
         scope="request"
diff --git a/web/html/nav/activation_key.xml b/web/html/nav/activation_key.xml
index a0a1202..69a3ca7 100644
--- a/web/html/nav/activation_key.xml
+++ b/web/html/nav/activation_key.xml
@@ -3,7 +3,7 @@
   <rhn-formvar name="tid" />
 
   <rhn-tab name="Details" url="/rhn/activationkeys/Edit.do" />
-  <rhn-tab name="Child Channels" url="/network/account/activation_keys/child_channels.pxt" />
+  <rhn-tab name="Child Channels" url="/rhn/activationkeys/channels/ChildChannels.do"/>
 
   <rhn-tab name="Packages"
            url="/rhn/activationkeys/packages/Packages.do"/>
_______________________________________________
Spacewalk-devel mailing list
Spacewalk-devel@redhat.com
https://www.redhat.com/mailman/listinfo/spacewalk-devel

Reply via email to