java/code/src/com/redhat/rhn/common/db/datasource/xml/Errata_queries.xml
| 53 +++
java/code/src/com/redhat/rhn/domain/channel/Channel.java
| 17 +
java/code/src/com/redhat/rhn/domain/errata/ErrataFactory.java
| 58 +--
java/code/src/com/redhat/rhn/domain/errata/test/ErrataFactoryTest.java
| 10
java/code/src/com/redhat/rhn/frontend/action/channel/manage/SyncErrataAction.java
| 97 ++++++
java/code/src/com/redhat/rhn/frontend/action/channel/manage/SyncErrataPackagesAction.java
| 148 ++++++++++
java/code/src/com/redhat/rhn/frontend/strings/jsp/StringResource_en_US.xml
| 25 +
java/code/src/com/redhat/rhn/frontend/strings/nav/StringResource_en_US.xml
| 8
java/code/src/com/redhat/rhn/frontend/taglibs/list/helper/ListSetHelper.java
| 33 ++
java/code/src/com/redhat/rhn/manager/channel/ChannelEditor.java
| 37 --
java/code/src/com/redhat/rhn/manager/channel/ChannelManager.java
| 91 ++++++
java/code/src/com/redhat/rhn/manager/channel/test/ChannelManagerTest.java
| 62 ++++
java/code/src/com/redhat/rhn/manager/errata/ErrataManager.java
| 16 +
java/code/src/com/redhat/rhn/manager/rhnset/RhnSetDecl.java
| 7
java/code/webapp/WEB-INF/nav/manage_channel.xml
| 4
java/code/webapp/WEB-INF/pages/channel/manage/erratapackagesync.jsp
| 80 +++++
java/code/webapp/WEB-INF/pages/channel/manage/erratasync.jsp
| 110 +++++++
java/code/webapp/WEB-INF/struts-config.xml
| 21 +
web/html/nav/manage_channel.xml
| 4
19 files changed, 816 insertions(+), 65 deletions(-)
New commits:
commit f7d6ead5ffe7ea99e446122c9337c6f14b4eb55e
Author: Justin Sherrill <jsherril(a)redhat.com>
Date: Tue Jun 2 14:35:58 2009 -0400
435043 - adding errata sync page for syncing out of date errata (that have been
updated by red hat)
diff --git a/java/code/src/com/redhat/rhn/common/db/datasource/xml/Errata_queries.xml
b/java/code/src/com/redhat/rhn/common/db/datasource/xml/Errata_queries.xml
index 78a3e84..6ad0a82 100644
--- a/java/code/src/com/redhat/rhn/common/db/datasource/xml/Errata_queries.xml
+++ b/java/code/src/com/redhat/rhn/common/db/datasource/xml/Errata_queries.xml
@@ -1185,4 +1185,57 @@ SELECT E.id, E.advisory, E.synopsis
</query>
</mode>
+
+
+<mode name="list_errata_needing_sync"
class="com.redhat.rhn.frontend.dto.ErrataOverview">
+ <query params="cid, ocid">
+ select distinct E.id, E.advisory_name, E.advisory, E.advisory_type, E.synopsis as
advisory_synopsis, E.update_date
+ from rhnChannelErrata CE inner join
+ rhnErrataPackage EP on CE.errata_id = EP.errata_id inner join
+ rhnErrataCloned EC on EC.original_id = CE.errata_id inner join
+ rhnChannelErrata CE2 on CE2.errata_id = EC.id inner join
+ rhnErrata E on E.id = EC.id
+ where CE.channel_id = :ocid --original
+ and CE2.channel_id = :cid --clone
+ and Ep.package_id in (select CP.package_id
+ from rhnChannelPackage CP
+ where
+ CP.channel_id = :ocid --original
+ and CP.package_id not in (select CP2.package_id
+ from rhnChannelPackage CP2
+ where CP2.channel_id = :cid)) --clone
+ </query>
+</mode>
+
+<mode name="list_packages_needing_sync_from_set"
class="com.redhat.rhn.frontend.dto.PackageOverview">
+ <query params="set_label, ocid, cid">
+ select P.id id, PN.name || '-' || PE.version
+ || '-' || PE.release || (CASE WHEN PE.epoch IS NULL THEN '' ELSE
':' || PE.epoch END)
+ || '-' || PA.label nvrea,
+ P.summary
+ from rhnPackage P inner join
+ rhnPackageArch PA on P.package_arch_id = PA.id inner join
+ rhnPackageEVR PE on P.evr_id = PE.id inner join
+ rhnPackageName PN on PN.id = P.name_id inner join
+ rhnErrataPackage EP on EP.package_id = P.id inner join
+ rhnErrataCloned EC on EC.original_id = EP.errata_id inner join
+ rhnChannelPackage CP on CP.package_id = P.id
+ where CP.channel_id = :ocid
+ and EC.id in ( select element
+ from rhnSet S
+ where S.label = :set_label)
+ and P.id not in ( select CP2.package_id
+ from rhnChannelPackage CP2
+ where CP2.channel_id = :cid)
+ </query>
+</mode>
+
+<mode name="list_channel_errata_ids">
+ <query params="cid">
+ select CE.errata_id as id
+ from rhnChannelErrata CE
+ where CE.channel_id = :cid
+ </query>
+</mode>
+
</datasource_modes>
diff --git a/java/code/src/com/redhat/rhn/domain/channel/Channel.java
b/java/code/src/com/redhat/rhn/domain/channel/Channel.java
index 07ab885..cef2312 100644
--- a/java/code/src/com/redhat/rhn/domain/channel/Channel.java
+++ b/java/code/src/com/redhat/rhn/domain/channel/Channel.java
@@ -387,6 +387,7 @@ public class Channel extends BaseDomainHelper implements Comparable {
/**
* Adds a single package to the channel
* @param packageIn The package to add
+ * @deprecated
*/
public void addPackage(Package packageIn) {
if (!getChannelArch().isCompatible(packageIn.getPackageArch())) {
@@ -397,6 +398,22 @@ public class Channel extends BaseDomainHelper implements Comparable
{
}
/**
+ * Adds a single package to the channel
+ * @param packageIn The package to add
+ * @param user the user doign the add
+ */
+ public void addPackage(Package packageIn, User user) {
+ if (!getChannelArch().isCompatible(packageIn.getPackageArch())) {
+ throw new IncompatibleArchException(packageIn.getPackageArch(),
+ getChannelArch());
+ }
+ List<Long> list = new ArrayList<Long>();
+ list.add(packageIn.getId());
+ ChannelManager.addPackages(this, list, user);
+ }
+
+
+ /**
* Removes a single package from the channel
* @param user the user doing the remove
* @param packageIn The package to remove
diff --git a/java/code/src/com/redhat/rhn/domain/errata/ErrataFactory.java
b/java/code/src/com/redhat/rhn/domain/errata/ErrataFactory.java
index 0d6733a..d87966a 100644
--- a/java/code/src/com/redhat/rhn/domain/errata/ErrataFactory.java
+++ b/java/code/src/com/redhat/rhn/domain/errata/ErrataFactory.java
@@ -204,7 +204,7 @@ public class ErrataFactory extends HibernateFactory {
published = ErrataFactory.createPublishedErrata();
}
- copyDetails(published, unpublished);
+ copyDetails(published, unpublished, false);
//Save the published Errata
save(published);
@@ -353,7 +353,7 @@ public class ErrataFactory extends HibernateFactory {
UnpublishedClonedErrata clone = new UnpublishedClonedErrata();
- copyDetails(clone, e);
+ copyDetails(clone, e, true);
clone.setAdvisoryName(clonedAdvisoryName);
clone.setAdvisory(clonedAdvisory);
@@ -368,11 +368,19 @@ public class ErrataFactory extends HibernateFactory {
* Helper method to copy the details for.
* @param copy The object to copy into.
* @param original The object to copy from.
+ * @param clone set to true if this is a cloned errata, and thus
+ * things like org or advisory name shouldn't be set
*/
- private static void copyDetails(Errata copy, Errata original) {
+ private static void copyDetails(Errata copy, Errata original, boolean clone) {
//Set the easy things first ;)
- copy.setAdvisory(original.getAdvisory());
+
+ if (!clone) {
+ copy.setAdvisory(original.getAdvisory());
+ copy.setAdvisoryName(original.getAdvisoryName());
+ copy.setOrg(original.getOrg());
+ }
+
copy.setAdvisoryType(original.getAdvisoryType());
copy.setProduct(original.getProduct());
copy.setDescription(original.getDescription());
@@ -383,11 +391,10 @@ public class ErrataFactory extends HibernateFactory {
copy.setUpdateDate(original.getUpdateDate());
copy.setNotes(original.getNotes());
copy.setRefersTo(original.getRefersTo());
- copy.setAdvisoryName(original.getAdvisoryName());
copy.setAdvisoryRel(original.getAdvisoryRel());
copy.setLocallyModified(original.getLocallyModified());
copy.setLastModified(original.getLastModified());
- copy.setOrg(original.getOrg());
+
/*
* Copy the packages
@@ -415,39 +422,16 @@ public class ErrataFactory extends HibernateFactory {
Iterator bugsItr = IteratorUtils.getIterator(original.getBugs());
while (bugsItr.hasNext()) {
Bug bugIn = (Bug) bugsItr.next();
- Bug clone;
+ Bug cloneB;
if (copy.isPublished()) { //we want published bugs
- clone = ErrataManager.createNewPublishedBug(bugIn.getId(),
+ cloneB = ErrataManager.createNewPublishedBug(bugIn.getId(),
bugIn.getSummary());
}
else { //we want unpublished bugs
- clone = ErrataManager.createNewUnpublishedBug(bugIn.getId(),
+ cloneB = ErrataManager.createNewUnpublishedBug(bugIn.getId(),
bugIn.getSummary());
}
- copy.addBug(clone);
- }
-
- /*
- * Copy the files using the same idea as the above bug copying
- */
- Iterator filesItr = IteratorUtils.getIterator(original.getFiles());
- while (filesItr.hasNext()) {
- ErrataFile fileIn = (ErrataFile) filesItr.next();
- ErrataFile clone;
- Set packages = new HashSet(fileIn.getPackages());
- if (copy.isPublished()) {
- clone = ErrataManager.createNewPublishedErrataFile(fileIn.getFileType(),
- fileIn.getChecksum(),
- fileIn.getFileName(),
- packages);
- }
- else {
- clone =
ErrataManager.createNewUnpublishedErrataFile(fileIn.getFileType(),
-
fileIn.getChecksum(),
-
fileIn.getFileName(),
- packages);
- }
- copy.addFile(clone);
+ copy.addBug(cloneB);
}
}
@@ -1048,7 +1032,13 @@ public class ErrataFactory extends HibernateFactory {
}
-
+ /**
+ * Sync all the errata details from one errata to another
+ * @param cloned the cloned errata that needs syncing
+ */
+ public static void syncErrataDetails(PublishedClonedErrata cloned) {
+ copyDetails(cloned, cloned.getOriginal(), true);
+ }
}
diff --git a/java/code/src/com/redhat/rhn/domain/errata/test/ErrataFactoryTest.java
b/java/code/src/com/redhat/rhn/domain/errata/test/ErrataFactoryTest.java
index 13e2fda..42988a6 100644
--- a/java/code/src/com/redhat/rhn/domain/errata/test/ErrataFactoryTest.java
+++ b/java/code/src/com/redhat/rhn/domain/errata/test/ErrataFactoryTest.java
@@ -270,7 +270,9 @@ public class ErrataFactoryTest extends BaseTestCaseWithUser {
private static void fillOutErrata(Errata e, Long orgId) throws Exception {
String name = "JAVA Test " + TestUtils.randomString();
- e.setOrg(OrgFactory.lookupById(orgId));
+ if (orgId != null) {
+ e.setOrg(OrgFactory.lookupById(orgId));
+ }
e.setAdvisory(name);
e.setAdvisoryType(ErrataFactory.ERRATA_TYPE_BUG);
e.setProduct("Red Hat Linux");
@@ -334,11 +336,7 @@ public class ErrataFactoryTest extends BaseTestCaseWithUser {
assertEquals(published.getLocallyModified(), clone.getLocallyModified());
assertEquals(clonedAdvisoryName, clone.getAdvisoryName());
assertEquals(clonedAdvisory, clone.getAdvisory());
-
- assertEquals(1, clone.getFiles().size());
- ErrataFile ef = (ErrataFile)clone.getFiles().iterator().next();
- assertEquals(1, ef.getPackages().size());
-
+
/* Create a 2nd clone and make sure that the cloning function
* does not create a clone whose name collides with the already
* existing clone
diff --git
a/java/code/src/com/redhat/rhn/frontend/action/channel/manage/SyncErrataAction.java
b/java/code/src/com/redhat/rhn/frontend/action/channel/manage/SyncErrataAction.java
new file mode 100644
index 0000000..88410bd
--- /dev/null
+++ b/java/code/src/com/redhat/rhn/frontend/action/channel/manage/SyncErrataAction.java
@@ -0,0 +1,97 @@
+/**
+ * Copyright (c) 2009 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.domain.channel.Channel;
+import com.redhat.rhn.domain.channel.InvalidChannelRoleException;
+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.taglibs.list.helper.ListRhnSetHelper;
+import com.redhat.rhn.frontend.taglibs.list.helper.Listable;
+import com.redhat.rhn.manager.channel.ChannelManager;
+import com.redhat.rhn.manager.rhnset.RhnSetDecl;
+
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * SyncErrataAction
+ * @version $Rev$
+ */
+public class SyncErrataAction extends RhnAction implements Listable {
+
+ /**
+ *
+ * {@inheritDoc}
+ */
+ public ActionForward execute(ActionMapping mapping,
+ ActionForm formIn,
+ HttpServletRequest request,
+ HttpServletResponse response) {
+
+ RequestContext rc = new RequestContext(request);
+ User user = rc.getLoggedInUser();
+
+ Channel chan = ChannelManager.lookupByIdAndUser(
+ rc.getRequiredParam(RequestContext.CID), user);
+
+ try {
+ ChannelManager.verifyChannelAdmin(user, chan.getId());
+ }
+ catch (InvalidChannelRoleException e) {
+ addMessage(request, e.getMessage());
+ return mapping.findForward("default");
+ }
+
+ ListRhnSetHelper helper = new ListRhnSetHelper(this, request,
+ RhnSetDecl.ERRATA_TO_SYNC.createCustom(chan.getId()));
+
+ helper.execute();
+ if (helper.isDispatched()) {
+ Map params = new HashMap();
+ params.put(RequestContext.CID, chan.getId());
+ return
getStrutsDelegate().forwardParams(mapping.findForward("submit"),
+ params);
+ }
+
+ request.setAttribute("channel_name", chan.getName());
+ request.setAttribute(RequestContext.CID, chan.getId());
+ return mapping.findForward("default");
+ }
+
+
+ /**
+ *
+ * {@inheritDoc}
+ */
+ public List getResult(RequestContext context) {
+ User user = context.getLoggedInUser();
+ Channel chan = ChannelManager.lookupByIdAndUser(
+ context.getRequiredParam(RequestContext.CID), user);
+
+ return ChannelManager.listErrataNeedingResync(chan, user);
+ }
+
+
+}
diff --git
a/java/code/src/com/redhat/rhn/frontend/action/channel/manage/SyncErrataPackagesAction.java
b/java/code/src/com/redhat/rhn/frontend/action/channel/manage/SyncErrataPackagesAction.java
new file mode 100644
index 0000000..88b4234
--- /dev/null
+++
b/java/code/src/com/redhat/rhn/frontend/action/channel/manage/SyncErrataPackagesAction.java
@@ -0,0 +1,148 @@
+/**
+ * Copyright (c) 2009 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.domain.channel.Channel;
+import com.redhat.rhn.domain.channel.InvalidChannelRoleException;
+import com.redhat.rhn.domain.errata.Errata;
+import com.redhat.rhn.domain.errata.ErrataFactory;
+import com.redhat.rhn.domain.errata.impl.PublishedClonedErrata;
+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.taglibs.list.helper.ListRhnSetHelper;
+import com.redhat.rhn.frontend.taglibs.list.helper.Listable;
+import com.redhat.rhn.manager.channel.ChannelEditor;
+import com.redhat.rhn.manager.channel.ChannelManager;
+import com.redhat.rhn.manager.errata.ErrataManager;
+import com.redhat.rhn.manager.rhnset.RhnSetDecl;
+
+import org.apache.log4j.Logger;
+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 java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * SyncErrataAction
+ * @version $Rev$
+ */
+public class SyncErrataPackagesAction extends RhnAction implements Listable {
+
+
+ private Logger log = Logger.getLogger(SyncErrataPackagesAction.class);
+
+ /**
+ *
+ * {@inheritDoc}
+ */
+ public ActionForward execute(ActionMapping mapping,
+ ActionForm formIn,
+ HttpServletRequest request,
+ HttpServletResponse response) {
+
+ RequestContext rc = new RequestContext(request);
+ User user = rc.getLoggedInUser();
+
+ Channel chan = ChannelManager.lookupByIdAndUser(
+ rc.getRequiredParam(RequestContext.CID), user);
+
+ try {
+ ChannelManager.verifyChannelAdmin(user, chan.getId());
+ }
+ catch (InvalidChannelRoleException e) {
+ addMessage(request, e.getMessage());
+ return mapping.findForward("default");
+ }
+
+ RhnSetDecl pkgDecl =
RhnSetDecl.ERRATA_PACKAGES_TO_SYNC.createCustom(chan.getId());
+
+ ListRhnSetHelper helper = new ListRhnSetHelper(this, request,
+ pkgDecl);
+
+ helper.setPreSelectAll(true);
+ helper.execute();
+
+ if (helper.isDispatched()) {
+
+ Set eSet = RhnSetDecl.ERRATA_TO_SYNC.createCustom(
+ chan.getId()).get(user).getElementValues();
+ Set pSet = pkgDecl.get(user).getElementValues();
+ syncErrata(eSet, pSet, chan, user);
+
+
+ ActionMessages msg = new ActionMessages();
+ String[] msgParams = {eSet.size() + "", pSet.size() + "",
chan.getName()};
+ msg.add(ActionMessages.GLOBAL_MESSAGE,
+ new ActionMessage("channel.jsp.errata.sync.complete",
+ msgParams));
+ getStrutsDelegate().saveMessages(rc.getRequest(), msg);
+
+
+ Map params = new HashMap();
+ params.put(RequestContext.CID, chan.getId());
+ return
getStrutsDelegate().forwardParams(mapping.findForward("submit"),
+ params);
+ }
+
+ request.setAttribute("channel_name", chan.getName());
+ request.setAttribute(RequestContext.CID, chan.getId());
+ return mapping.findForward("default");
+ }
+
+
+ /**
+ *
+ * {@inheritDoc}
+ */
+ public List getResult(RequestContext context) {
+ User user = context.getLoggedInUser();
+ Channel chan = ChannelManager.lookupByIdAndUser(
+ context.getRequiredParam(RequestContext.CID), user);
+ String label = RhnSetDecl.ERRATA_TO_SYNC.createCustom(
+ chan.getId()).getLabel();
+
+ return ChannelManager.listErrataPackagesForResync(chan, user, label);
+ }
+
+
+ private void syncErrata(Collection<Long> eids, Collection<Long> pids,
+ Channel chan, User user) {
+
+ ChannelEditor.getInstance().addPackages(user, chan, pids);
+ for (Long eid : eids) {
+ Errata e = ErrataManager.lookupErrata(eid, user);
+ if (e.isPublished() && e.isCloned()) {
+ ErrataFactory.syncErrataDetails((PublishedClonedErrata) e);
+ }
+ else {
+ log.fatal("Tried to sync errata with id " + eid +
+ " But it was not published or was not cloned");
+ }
+ }
+
+ }
+
+}
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 2470475..a5a3751 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
@@ -21302,6 +21302,31 @@ given channel.</source>
<trans-unit id="actions.jsp.pickedup">
<source>Picked Up</source>
</trans-unit>
+ <trans-unit id="header.jsp.errata.sync">
+ <source>Sync Errata</source>
+ </trans-unit>
+ <trans-unit id="channel.jsp.errata.sync.message">
+ <source>The following errata were cloned from errata that have since been
updated.
+ This page will allow you to syncronize your cloned errata to that of its
original.</source>
+ </trans-unit>
+ <trans-unit id="channel.jsp.errata.sync.note">
+ <source>Packages that were omitted as part of the origianl cloning process will
be included here.</source>
+ </trans-unit>
+ <trans-unit id="channel.jsp.errata.sync.listempty">
+ <source>No out of date errata were found.</source>
+ </trans-unit>
+ <trans-unit id="header.jsp.errata.sync.packagepush">
+ <source>Packages to Push</source>
+ </trans-unit>
+ <trans-unit id="channel.jsp.errata.sync.packages.message">
+ <source>The following packages will be pushed to this channel as part of the
errata sync process. Please review this list and unselect any unwanted
packages.</source>
+ </trans-unit>
+ <trans-unit id="channel.jsp.errata.sync.complete">
+ <source>Sucessfully syncronized {0} errata and pushed {1} packages to channel
{2}.</source>
+ </trans-unit>
+
+
+
</body>
</file>
</xliff>
diff --git a/java/code/src/com/redhat/rhn/frontend/strings/nav/StringResource_en_US.xml
b/java/code/src/com/redhat/rhn/frontend/strings/nav/StringResource_en_US.xml
index 93f3b37..0722a3c 100644
--- a/java/code/src/com/redhat/rhn/frontend/strings/nav/StringResource_en_US.xml
+++ b/java/code/src/com/redhat/rhn/frontend/strings/nav/StringResource_en_US.xml
@@ -1006,6 +1006,13 @@
http://www.oasis-open.org/committees/xliff/documents/xliff-core-1.1.xsd&q...
</context-group>
</trans-unit>
+ <trans-unit id="Sync">
+ <source>Sync</source>
+ <context-group name="ctx">
+ <context
context-type="sourcefile">/rhn/channels/manage/errata/SyncErrata.do</context>
+ </context-group>
+ </trans-unit>
+
<trans-unit id="Organizations">
<source>Organizations</source>
<context-group name="ctx">
@@ -1013,6 +1020,7 @@
http://www.oasis-open.org/committees/xliff/documents/xliff-core-1.1.xsd&q...
</context-group>
</trans-unit>
+
<trans-unit id="Trusts">
<source>Trusts</source>
<context-group name="ctx">
diff --git a/java/code/src/com/redhat/rhn/frontend/taglibs/list/helper/ListSetHelper.java
b/java/code/src/com/redhat/rhn/frontend/taglibs/list/helper/ListSetHelper.java
index d6a8e8f..ed7d337 100644
--- a/java/code/src/com/redhat/rhn/frontend/taglibs/list/helper/ListSetHelper.java
+++ b/java/code/src/com/redhat/rhn/frontend/taglibs/list/helper/ListSetHelper.java
@@ -15,6 +15,7 @@
package com.redhat.rhn.frontend.taglibs.list.helper;
+import com.redhat.rhn.frontend.dto.BaseDto;
import com.redhat.rhn.frontend.struts.RequestContext;
import com.redhat.rhn.frontend.struts.RhnHelper;
import com.redhat.rhn.frontend.struts.Selectable;
@@ -24,6 +25,7 @@ import com.redhat.rhn.frontend.taglibs.list.TagHelper;
import java.util.Collection;
import java.util.Collections;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -86,6 +88,7 @@ abstract class ListSetHelper extends ListHelper {
private boolean dispatched = false;
private boolean ignoreEmptySelection = false;
private boolean willClearSet = true;
+ private boolean preSelectAll = false;
private Set initSet = Collections.EMPTY_SET;
/**
@@ -138,8 +141,8 @@ abstract class ListSetHelper extends ListHelper {
if (!context.isSubmitted() && alphaBarPressed == null &&
willClearSet) {
clear();
add(getPreSelected());
- }
-
+ }
+
if (request.getParameter(RequestContext.DISPATCH) != null) {
// if its one of the Dispatch actions handle it..
update();
@@ -161,6 +164,16 @@ abstract class ListSetHelper extends ListHelper {
List dataSet = getDataSet();
+
+ if (!context.isSubmitted() && alphaBarPressed == null &&
preSelectAll) {
+ Set selSet = new HashSet();
+ for (BaseDto bdto : (List<BaseDto>) dataSet) {
+ selSet.add(bdto.getId());
+ }
+ add(selSet);
+ }
+
+
// if its a list action update the set and the selections
if (ListTagHelper.getListAction(getListName(), request) != null) {
execute(dataSet);
@@ -290,4 +303,20 @@ abstract class ListSetHelper extends ListHelper {
this.willClearSet = willClearSetIn;
}
+
+ /**
+ * @return Returns the preSelectAll.
+ */
+ public boolean isPreSelectAll() {
+ return preSelectAll;
+ }
+
+
+ /**
+ * @param preSelectAllIn The preSelectAll to set.
+ */
+ public void setPreSelectAll(boolean preSelectAllIn) {
+ this.preSelectAll = preSelectAllIn;
+ }
+
}
diff --git a/java/code/src/com/redhat/rhn/manager/channel/ChannelEditor.java
b/java/code/src/com/redhat/rhn/manager/channel/ChannelEditor.java
index 5b00f26..651ee8a 100644
--- a/java/code/src/com/redhat/rhn/manager/channel/ChannelEditor.java
+++ b/java/code/src/com/redhat/rhn/manager/channel/ChannelEditor.java
@@ -16,16 +16,15 @@ package com.redhat.rhn.manager.channel;
import com.redhat.rhn.common.db.datasource.CallableMode;
import com.redhat.rhn.common.db.datasource.ModeFactory;
-import com.redhat.rhn.common.hibernate.LookupException;
import com.redhat.rhn.common.localization.LocalizationService;
import com.redhat.rhn.common.security.PermissionException;
import com.redhat.rhn.domain.channel.Channel;
import com.redhat.rhn.domain.channel.ChannelFactory;
-import com.redhat.rhn.domain.rhnpackage.Package;
import com.redhat.rhn.domain.user.User;
-import com.redhat.rhn.manager.rhnpackage.PackageManager;
import com.redhat.rhn.manager.user.UserManager;
+import java.util.ArrayList;
+import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
@@ -57,7 +56,7 @@ public class ChannelEditor {
* @param channel The channel to add the packages to
* @param packageIds A list containing the ids of packages to add.
*/
- public void addPackages(User user, Channel channel, List packageIds) {
+ public void addPackages(User user, Channel channel, Collection packageIds) {
changePackages(user, channel, packageIds, true);
}
@@ -67,7 +66,7 @@ public class ChannelEditor {
* @param channel The channel to remove the packages from
* @param packageIds A list containing the ids of packages to remove.
*/
- public void removePackages(User user, Channel channel, List packageIds) {
+ public void removePackages(User user, Channel channel, Collection packageIds) {
changePackages(user, channel, packageIds, false);
}
@@ -76,7 +75,8 @@ public class ChannelEditor {
* @param add If true, we are adding the list of packages to the channel. Otherwise,
* remove the list of packages from the channel.
*/
- private void changePackages(User user, Channel channel, List packageIds, boolean add)
{
+ private void changePackages(User user, Channel channel,
+ Collection packageIds, boolean add) {
//Make sure the person adding packages is a channel admin
if (!UserManager.verifyChannelAdmin(user, channel)) {
StringBuffer msg = new StringBuffer("User: ");
@@ -112,27 +112,18 @@ public class ChannelEditor {
}
}
+ List<Long> existingPids = ChannelFactory.getPackageIds(channel.getId());
+
//Loop through packages and add to channel.
for (Iterator itr = packageIds.iterator(); itr.hasNext();) {
Long pid = convertObjectToLong(itr.next());
- Package pkg = PackageManager.lookupByIdAndUser(pid, user);
- if (pkg != null) {
- if (add) {
- channel.addPackage(pkg);
- }
- else {
- channel.removePackage(pkg, user);
- }
+ List list = new ArrayList();
+ list.add(pid);
+ if (add && !existingPids.contains(pid)) {
+ ChannelManager.addPackages(channel, list, user);
}
- else {
- //throw a lookup exception
- LocalizationService ls = LocalizationService.getInstance();
- String msg = "The package: " + pid + " could not be
found.";
- LookupException e = new LookupException(msg);
-
e.setLocalizedTitle(ls.getMessage("lookup.jsp.title.package"));
-
e.setLocalizedReason1(ls.getMessage("lookup.jsp.reason1.package"));
-
e.setLocalizedReason2(ls.getMessage("lookup.jsp.reason2.package"));
- throw e;
+ else if (!add) {
+ ChannelManager.removePackages(channel, list, user);
}
}
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 f84a434..41433a2 100644
--- a/java/code/src/com/redhat/rhn/manager/channel/ChannelManager.java
+++ b/java/code/src/com/redhat/rhn/manager/channel/ChannelManager.java
@@ -32,6 +32,7 @@ import com.redhat.rhn.domain.channel.ChannelFactory;
import com.redhat.rhn.domain.channel.ChannelFamily;
import com.redhat.rhn.domain.channel.ChannelFamilyFactory;
import com.redhat.rhn.domain.channel.ChannelVersion;
+import com.redhat.rhn.domain.channel.ClonedChannel;
import com.redhat.rhn.domain.channel.DistChannelMap;
import com.redhat.rhn.domain.channel.InvalidChannelRoleException;
import com.redhat.rhn.domain.channel.ProductName;
@@ -2506,6 +2507,42 @@ public class ChannelManager extends BaseManager {
}
/**
+ * Remove packages from a channel very quickly
+ * @param chan the channel
+ * @param packageIds list of package ids
+ * @param user the user doing the removing
+ */
+ public static void addPackages(Channel chan, List<Long> packageIds, User user)
{
+
+ if (!UserManager.verifyChannelAdmin(user, chan)) {
+ StringBuffer msg = new StringBuffer("User: ");
+ msg.append(user.getLogin());
+ msg.append(" does not have channel admin access to channel: ");
+ msg.append(chan.getLabel());
+
+ LocalizationService ls = LocalizationService.getInstance();
+ PermissionException pex = new PermissionException(msg.toString());
+
pex.setLocalizedTitle(ls.getMessage("permission.jsp.title.channel"));
+
pex.setLocalizedSummary(ls.getMessage("permission.jsp.summary.channel"));
+ throw pex;
+ }
+
+ Map params = new HashMap();
+ params.put("cid", chan.getId());
+
+ WriteMode m = ModeFactory.getWriteMode("Channel_queries",
"add_channel_package");
+ for (Long pid : packageIds) {
+ params.put("pid", pid);
+ m.executeUpdate(params);
+ }
+
+
+ HibernateFactory.getSession().refresh(chan);
+
+ }
+
+
+ /**
* Remove a set of erratas from a channel
* and remove associated packages
* @param chan The channel to remove from
@@ -2553,4 +2590,58 @@ public class ChannelManager extends BaseManager {
return (List<PackageDto>) mode.execute(params);
}
+ /**
+ * List errata that is within a channel that needs to be resynced
+ * This is determined by the packages in the channel
+ *
+ * @param c the channel
+ * @param user the user
+ * @return list of errataOverview objects that need to be resynced
+ */
+ public static List listErrataNeedingResync(Channel c, User user) {
+ if (!user.hasRole(RoleFactory.CHANNEL_ADMIN)) {
+ throw new PermissionException(RoleFactory.CHANNEL_ADMIN);
+ }
+
+ if (c.isCloned()) {
+ Map params = new HashMap();
+ params.put("cid", c.getId());
+ ClonedChannel cc = (ClonedChannel) c;
+ params.put("ocid", cc.getOriginal().getId());
+ SelectMode m = ModeFactory.getMode("Errata_queries",
+ "list_errata_needing_sync");
+ return m.execute(params);
+ }
+ else {
+ return Collections.EMPTY_LIST;
+ }
+ }
+
+ /**
+ * List errata packages that need to be resynced
+ * @param c the channel to look for packages in
+ * @param user the user doing it
+ * @param setLabel the set of errata to base the package off of
+ * @return the list of PackageOverview objects
+ */
+ public static List listErrataPackagesForResync(Channel c, User user, String setLabel)
{
+ if (!user.hasRole(RoleFactory.CHANNEL_ADMIN)) {
+ throw new PermissionException(RoleFactory.CHANNEL_ADMIN);
+ }
+
+ if (c.isCloned()) {
+ Map params = new HashMap();
+ params.put("cid", c.getId());
+ params.put("set_label", setLabel);
+ ClonedChannel cc = (ClonedChannel) c;
+ params.put("ocid", cc.getOriginal().getId());
+ SelectMode m = ModeFactory.getMode("Errata_queries",
+ "list_packages_needing_sync_from_set");
+ return m.execute(params);
+ }
+ else {
+ return Collections.EMPTY_LIST;
+ }
+ }
+
}
diff --git a/java/code/src/com/redhat/rhn/manager/channel/test/ChannelManagerTest.java
b/java/code/src/com/redhat/rhn/manager/channel/test/ChannelManagerTest.java
index 4f52632..7818c97 100644
--- a/java/code/src/com/redhat/rhn/manager/channel/test/ChannelManagerTest.java
+++ b/java/code/src/com/redhat/rhn/manager/channel/test/ChannelManagerTest.java
@@ -39,6 +39,7 @@ import com.redhat.rhn.domain.server.ServerFactory;
import com.redhat.rhn.domain.server.VirtualInstance;
import com.redhat.rhn.domain.server.test.ServerFactoryTest;
import com.redhat.rhn.domain.user.User;
+import com.redhat.rhn.frontend.action.user.AdminUserEditAction;
import com.redhat.rhn.frontend.dto.ChannelOverview;
import com.redhat.rhn.frontend.dto.ErrataOverview;
import com.redhat.rhn.frontend.dto.EssentialChannelDto;
@@ -49,6 +50,7 @@ import com.redhat.rhn.frontend.xmlrpc.NoSuchChannelException;
import com.redhat.rhn.manager.channel.ChannelEntitlementCounter;
import com.redhat.rhn.manager.channel.ChannelManager;
import com.redhat.rhn.manager.entitlement.EntitlementManager;
+import com.redhat.rhn.manager.errata.ErrataManager;
import com.redhat.rhn.manager.rhnpackage.test.PackageManagerTest;
import com.redhat.rhn.manager.rhnset.RhnSetDecl;
import com.redhat.rhn.manager.rhnset.RhnSetManager;
@@ -747,4 +749,64 @@ public class ChannelManagerTest extends BaseTestCaseWithUser {
}
+
+ public void testListErrataNeedingResync() throws Exception {
+
+ user.addRole(RoleFactory.CHANNEL_ADMIN);
+
+ Channel ochan = ChannelFactoryTest.createTestChannel();
+ Channel cchan = ChannelFactoryTest.createTestClonedChannel(ochan, user);
+
+ Errata oe = ErrataFactoryTest.createTestErrata(null);
+ ochan.addErrata(oe);
+
+ List list = new ArrayList();
+ list.add(cchan.getId());
+
+ Errata ce = ErrataManager.createClone(user, oe);
+ ce = ErrataManager.publish(ce, list, user);
+
+ Package testPackage = PackageTest.createTestPackage();
+ oe.addPackage(testPackage);
+ ochan.addPackage(testPackage);
+
+ List<ErrataOverview> result =
ChannelManager.listErrataNeedingResync(cchan, user);
+ assertTrue(result.size() == 1);
+ assertEquals(result.get(0).getId(), ce.getId());
+
+ }
+
+ public void testListErrataPackagesForResync() throws Exception {
+
+ user.addRole(RoleFactory.CHANNEL_ADMIN);
+
+ Channel ochan = ChannelFactoryTest.createTestChannel();
+ Channel cchan = ChannelFactoryTest.createTestClonedChannel(ochan, user);
+
+ Errata oe = ErrataFactoryTest.createTestErrata(null);
+ ochan.addErrata(oe);
+
+ List list = new ArrayList();
+ list.add(cchan.getId());
+
+ Errata ce = ErrataManager.createClone(user, oe);
+ ce = ErrataManager.publish(ce, list, user);
+
+ Package testPackage = PackageTest.createTestPackage();
+ oe.addPackage(testPackage);
+ ochan.addPackage(testPackage);
+
+ RhnSet set = RhnSetDecl.ERRATA_TO_SYNC.get(user);
+ set.clear();
+ set.add(ce.getId());
+ RhnSetManager.store(set);
+
+ List<PackageOverview> result =
ChannelManager.listErrataPackagesForResync(cchan, user, set.getLabel());
+ assertTrue(result.size() == 1);
+
+ assertEquals(result.get(0).getId(), testPackage.getId());
+
+ }
+
+
}
diff --git a/java/code/src/com/redhat/rhn/manager/errata/ErrataManager.java
b/java/code/src/com/redhat/rhn/manager/errata/ErrataManager.java
index 2535b63..2f757e0 100644
--- a/java/code/src/com/redhat/rhn/manager/errata/ErrataManager.java
+++ b/java/code/src/com/redhat/rhn/manager/errata/ErrataManager.java
@@ -31,6 +31,7 @@ import com.redhat.rhn.domain.errata.Errata;
import com.redhat.rhn.domain.errata.ErrataFactory;
import com.redhat.rhn.domain.errata.ErrataFile;
import com.redhat.rhn.domain.errata.ErrataFileType;
+import com.redhat.rhn.domain.errata.impl.PublishedClonedErrata;
import
com.redhat.rhn.domain.org.Org;
import com.redhat.rhn.domain.rhnset.RhnSet;
import com.redhat.rhn.domain.role.RoleFactory;
@@ -1237,4 +1238,19 @@ public class ErrataManager extends BaseManager {
return flag;
}
+
+ /**
+ * resync an errata, including all it's details
+ * doesn't actually push any packages to a channel
+ * @param cloned the cloned errata needing resyncing
+ * @param user the user doign the syncing
+ */
+ public static void reSyncErrata(PublishedClonedErrata cloned, User user) {
+ if (!user.hasRole(RoleFactory.CHANNEL_ADMIN)) {
+ throw new PermissionException(RoleFactory.CHANNEL_ADMIN);
+ }
+ ErrataFactory.syncErrataDetails(cloned);
+ }
+
+
}
diff --git a/java/code/src/com/redhat/rhn/manager/rhnset/RhnSetDecl.java
b/java/code/src/com/redhat/rhn/manager/rhnset/RhnSetDecl.java
index d1cd5fb..a151135 100644
--- a/java/code/src/com/redhat/rhn/manager/rhnset/RhnSetDecl.java
+++ b/java/code/src/com/redhat/rhn/manager/rhnset/RhnSetDecl.java
@@ -81,6 +81,13 @@ public class RhnSetDecl {
public static final RhnSetDecl ERRATA_TO_DELETE_BULK =
make("errata_to_delete_bulk",
SetCleanup.UNOWNED_ERRATA);
+ // set of errata by errata_id; needs new cleanup
+ public static final RhnSetDecl ERRATA_TO_SYNC = make("errata_to_sync",
+ SetCleanup.UNOWNED_ERRATA);
+
+ public static final RhnSetDecl ERRATA_PACKAGES_TO_SYNC =
make("errata_packages_to_sync",
+ SetCleanup.UNOWNED_PACKAGES);
+
// set of file list: needs new cleanup
public static final RhnSetDecl FILE_LISTS = make("file_lists",
SetCleanup.UNOWNED_FILE_LIST);
diff --git a/java/code/webapp/WEB-INF/nav/manage_channel.xml
b/java/code/webapp/WEB-INF/nav/manage_channel.xml
index ae6cc40..acdb4cd 100644
--- a/java/code/webapp/WEB-INF/nav/manage_channel.xml
+++ b/java/code/webapp/WEB-INF/nav/manage_channel.xml
@@ -29,6 +29,10 @@
<rhn-tab-url>/network/software/channels/manage/errata/clone.pxt?pxt:trap=rhn:empty_set&set_label=errata_clone_actions</rhn-tab-url>
<rhn-tab-url>/network/software/channels/manage/errata/clone_confirm.pxt</rhn-tab-url>
</rhn-tab>
+ <rhn-tab name="Sync"
acl="channel_is_clone();user_role(channel_admin);">
+ <rhn-tab-url>/rhn/channels/manage/errata/SyncErrata.do</rhn-tab-url>
+
<rhn-tab-url>/rhn/channels/manage/errata/ConfirmSyncPackages.do</rhn-tab-url>
+ </rhn-tab>
</rhn-tab>
<rhn-tab name="Packages" acl="channel_exists()"
node-id="remove_channel_packages">
<rhn-tab-url>/rhn/channels/manage/ChannelPackageMenu.do</rhn-tab-url>
diff --git a/java/code/webapp/WEB-INF/pages/channel/manage/erratapackagesync.jsp
b/java/code/webapp/WEB-INF/pages/channel/manage/erratapackagesync.jsp
new file mode 100644
index 0000000..6a82188
--- /dev/null
+++ b/java/code/webapp/WEB-INF/pages/channel/manage/erratapackagesync.jsp
@@ -0,0 +1,80 @@
+<%@ taglib
uri="http://rhn.redhat.com/rhn" prefix="rhn" %>
+<%@ taglib
uri="http://java.sun.com/jsp/jstl/core" prefix="c"
%>
+<%@ taglib
uri="http://jakarta.apache.org/struts/tags-html"
prefix="html" %>
+<%@ taglib
uri="http://jakarta.apache.org/struts/tags-bean"
prefix="bean" %>
+<%@ taglib
uri="http://rhn.redhat.com/tags/list" prefix="rl"
%>
+
+<html:xhtml/>
+<html>
+<head>
+ <meta name="page-decorator" content="none" />
+</head>
+<body>
+
+<html:messages id="message" message="true">
+ <rhn:messages><c:out escapeXml="false"
value="${message}" /></rhn:messages>
+</html:messages>
+
+<html:messages id="message" message="true">
+ <rhn:messages><c:out escapeXml="false"
value="${message}" /></rhn:messages>
+</html:messages>
+
+ <%@ include
file="/WEB-INF/pages/common/fragments/channel/manage/manage_channel_header.jspf"
%>
+<BR>
+
+<h2><img src="/img/rhn-icon-packages.gif"> <bean:message
key="header.jsp.errata.sync.packagepush"/></h2>
+
+ <bean:message key="channel.jsp.errata.sync.packages.message"/>
+
+<rl:listset name="packageSet" legend="system-group">
+
+<input type="hidden" name="cid" value="${cid}" />
+
+ <rl:list
+ decorator="SelectableDecorator"
+ emptykey="package.jsp.emptylist"
+ alphabarcolumn="nvrea"
+ filter="com.redhat.rhn.frontend.taglibs.list.filters.PackageFilter" >
+
+
+ <rl:decorator name="PageSizeDecorator"/>
+
+ <rl:selectablecolumn value="${current.id}"
+ selected="${current.selected}"
+ disabled="${not current.selectable}"
+ styleclass="first-column"/>
+
+
+
+ <rl:column sortable="true"
+ bound="false"
+ headerkey="download.jsp.package"
+ sortattr="nvrea"
+ defaultsort="asc"
+ >
+
+ <a
href="/rhn/software/packages/Details.do?pid=${current.id}">${current.nvrea}</a>
+ </rl:column>
+
+
+ <rl:column sortable="false"
+ bound="false"
+ headerkey="packagesearch.jsp.summary"
+ styleclass="last-column"
+ >
+ ${current.summary}
+ </rl:column>
+ </rl:list>
+
+ <div align="right">
+ <hr />
+ <input type="submit" name="dispatch"
+ value="<bean:message key="confirm"/>" />
+ </div>
+ <rhn:submitted/>
+
+
+</rl:listset>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/java/code/webapp/WEB-INF/pages/channel/manage/erratasync.jsp
b/java/code/webapp/WEB-INF/pages/channel/manage/erratasync.jsp
new file mode 100644
index 0000000..089d675
--- /dev/null
+++ b/java/code/webapp/WEB-INF/pages/channel/manage/erratasync.jsp
@@ -0,0 +1,110 @@
+<%@ taglib
uri="http://rhn.redhat.com/rhn" prefix="rhn" %>
+<%@ taglib
uri="http://java.sun.com/jsp/jstl/core" prefix="c"
%>
+<%@ taglib
uri="http://jakarta.apache.org/struts/tags-html"
prefix="html" %>
+<%@ taglib
uri="http://jakarta.apache.org/struts/tags-bean"
prefix="bean" %>
+<%@ taglib
uri="http://rhn.redhat.com/tags/list" prefix="rl"
%>
+
+<html:xhtml/>
+<html>
+<head>
+ <meta name="page-decorator" content="none" />
+</head>
+<body>
+
+<html:messages id="message" message="true">
+ <rhn:messages><c:out escapeXml="false"
value="${message}" /></rhn:messages>
+</html:messages>
+
+
+
+ <%@ include
file="/WEB-INF/pages/common/fragments/channel/manage/manage_channel_header.jspf"
%>
+ <h2>
+ <img src="/img/rhn-icon-errata.gif" alt="erratum" />
<bean:message key="header.jsp.errata.sync"/>
+ </h2>
+
+ <bean:message key="channel.jsp.errata.sync.message"/>
+
+ <rl:listset name="errata_list_set">
+ <input type="hidden" name="cid" value="${cid}">
+
+ <rl:list
+ decorator="SelectableDecorator"
+ emptykey="channel.jsp.errata.sync.listempty"
+ alphabarcolumn="advisorySynopsis" >
+
+ <rl:decorator name="ElaborationDecorator"/>
+ <rl:decorator name="PageSizeDecorator"/>
+
+ <rl:selectablecolumn value="${current.selectionKey}"
+ selected="${current.selected}"
+ styleclass="first-column"/>
+
+
+
+
+
+ <rl:column sortable="true"
+ bound="false"
+ headerkey="erratalist.jsp.type"
+ headerclass="thin-column"
+ sortattr="advisoryType">
+ <c:if test="${current.advisoryType == 'Product
Enhancement Advisory'}">
+ <img src="/img/wrh-product.gif" alt="Product Enhancement
Advisory" title="Product Enhancement Advisory" />
+ </c:if>
+ <c:if test="${current.advisoryType == 'Security
Advisory'}">
+ <img src="/img/wrh-product.gif" alt="Product Enhancement
Advisory" title="Product Enhancement Advisory" />
+ </c:if>
+ <c:if test="${current.advisoryType == 'Bug Fix
Advisory'}">
+ <img src="/img/wrh-bug.gif" alt="Bug Fix Advisory"
title="Bug Fix Advisory" />
+ </c:if>
+
+ </rl:column>
+
+
+ <rl:column sortable="true"
+ bound="false"
+ headerkey="erratalist.jsp.advisory"
+ sortattr="advisory"
+ >
+
+ <a
href="/rhn/errata/manage/Edit.do?eid=${current.id}">${current.advisoryName}</a>
+ </rl:column>
+
+
+ <rl:column sortable="false"
+ bound="false"
+ filterattr="advisorySynopsis"
+ headerkey="erratalist.jsp.synopsis"
+ >
+ ${current.advisorySynopsis}
+ </rl:column>
+
+
+ <rl:column sortable="true"
+ bound="false"
+ headerkey="erratalist.jsp.updated"
+ styleclass="last-column"
+ sortattr="updateDateObj"
+ defaultsort="desc"
+ >
+ ${current.updateDate}
+ </rl:column>
+
+
+ </rl:list>
+
+
+ <rhn:tooltip key="channel.jsp.errata.sync.note"/>
+
+ <p align="right">
+ <input type="submit" name="dispatch"
value="<bean:message key="header.jsp.errata.sync"/>">
+ </p>
+ <rhn:submitted/>
+
+
+</rl:listset>
+
+
+</body>
+</html>
+
\ No newline at end of file
diff --git a/java/code/webapp/WEB-INF/struts-config.xml
b/java/code/webapp/WEB-INF/struts-config.xml
index 31c416e..1b8023b 100644
--- a/java/code/webapp/WEB-INF/struts-config.xml
+++ b/java/code/webapp/WEB-INF/struts-config.xml
@@ -6169,6 +6169,27 @@
<forward name="default"
path="/channels/manage/errata/Add.do" />
</action>
+
+ <action path="/channels/manage/errata/SyncErrata"
+ scope="request"
+ input="/WEB-INF/pages/channel/manage/erratasync.jsp"
+ type="com.redhat.rhn.frontend.action.channel.manage.SyncErrataAction"
+ className="com.redhat.rhn.frontend.struts.RhnActionMapping">
+ <forward name="default"
path="/WEB-INF/pages/channel/manage/erratasync.jsp" />
+ <forward name="submit"
path="/channels/manage/errata/ConfirmSyncPackages.do"
redirect="true"/>
+ </action>
+
+ <action path="/channels/manage/errata/ConfirmSyncPackages"
+ scope="request"
+ input="/WEB-INF/pages/channel/manage/erratapackagesync.jsp"
+
type="com.redhat.rhn.frontend.action.channel.manage.SyncErrataPackagesAction"
+ className="com.redhat.rhn.frontend.struts.RhnActionMapping">
+ <forward name="default"
path="/WEB-INF/pages/channel/manage/erratapackagesync.jsp" />
+ <forward name="submit"
path="/channels/manage/errata/SyncErrata.do" redirect="true"/>
+ </action>
+
+
+
<action path="/channels/manage/errata/Errata"
scope="request"
type="com.redhat.rhn.frontend.action.channel.manage.ErrataIndexAction"
diff --git a/web/html/nav/manage_channel.xml b/web/html/nav/manage_channel.xml
index 97d2a8f..cb764a4 100644
--- a/web/html/nav/manage_channel.xml
+++ b/web/html/nav/manage_channel.xml
@@ -26,6 +26,10 @@
<rhn-tab-url>/network/software/channels/manage/errata/clone.pxt</rhn-tab-url>
<rhn-tab-url>/network/software/channels/manage/errata/clone_confirm.pxt</rhn-tab-url>
</rhn-tab>
+ <rhn-tab name="Sync"
acl="channel_is_clone();user_role(channel_admin);"
node-id="sync_errata">
+ <rhn-tab-url>/rhn/channels/manage/errata/SyncErrata.do</rhn-tab-url>
+
<rhn-tab-url>/rhn/channels/manage/errata/ConfirmSyncPackages.do</rhn-tab-url>
+ </rhn-tab>
</rhn-tab>
<rhn-tab name="Packages" acl="channel_exists()">
<rhn-tab-url>/rhn/channels/manage/ChannelPackageMenu.do</rhn-tab-url>