java/code/src/com/redhat/rhn/frontend/action/errata/DeleteErratumAction.java | 16
--
java/code/src/com/redhat/rhn/frontend/xmlrpc/errata/ErrataHandler.java | 63
++++++++--
java/code/src/com/redhat/rhn/frontend/xmlrpc/errata/test/ErrataHandlerTest.java | 36
+++--
java/code/src/com/redhat/rhn/manager/errata/ErrataManager.java | 35
+++--
4 files changed, 104 insertions(+), 46 deletions(-)
New commits:
commit aabbd6ec2a24997878f42050998e4852862314dc
Author: Brad Buckingham <bbuckingham(a)redhat.com>
Date: Thu Apr 2 13:24:21 2009 -0400
493111 - api - errata.delete added & fixed add/removePackages & setDetails to
only modify custom errata
There were a few notable changes introduced with this commit:
1. added the errata.delete api
2. updated errata addPackages/removePackages/setDetails to throw an exception
if the user attempts to make changes to a non-custom errata (e.g. RH)
3. refactored the logic used by the UI to delete errata... we currently have
multiple pages for deleting errata using the 'published' list,
'unpublished'
list as well as deleting from the errata details page; however, the logic
across these deletions was inconsistent wrt removing packages associated
the errata from the channel where the errata is published to... updated to
make this consistent...
diff --git a/java/code/src/com/redhat/rhn/frontend/action/errata/DeleteErratumAction.java
b/java/code/src/com/redhat/rhn/frontend/action/errata/DeleteErratumAction.java
index 56e16a0..a176656 100644
--- a/java/code/src/com/redhat/rhn/frontend/action/errata/DeleteErratumAction.java
+++ b/java/code/src/com/redhat/rhn/frontend/action/errata/DeleteErratumAction.java
@@ -14,9 +14,7 @@
*/
package com.redhat.rhn.frontend.action.errata;
-import com.redhat.rhn.domain.channel.Channel;
import com.redhat.rhn.domain.errata.Errata;
-import com.redhat.rhn.domain.rhnpackage.Package;
import com.redhat.rhn.frontend.struts.RequestContext;
import com.redhat.rhn.frontend.struts.StrutsDelegate;
import com.redhat.rhn.frontend.struts.StrutsDelegateFactory;
@@ -31,7 +29,6 @@ import org.apache.struts.actions.LookupDispatchAction;
import java.util.HashMap;
import java.util.Map;
-import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -86,19 +83,6 @@ public class DeleteErratumAction extends LookupDispatchAction {
RequestContext requestContext = new RequestContext(request);
Errata errata = requestContext.lookupErratum();
-
- //remove the packages in the channels associated with the errata
- Set<Package> errataPacks = errata.getPackages();
-
- Set<Channel> errataChans = errata.getChannels();
- for (Channel chan : errataChans) {
- for (Package pack : errataPacks) {
- if (chan.getPackages().contains(pack)) {
- chan.getPackages().remove(pack);
- }
- }
- }
-
ErrataManager.deleteErratum(requestContext.getLoggedInUser(), errata.getId());
ActionMessages msgs = new ActionMessages();
diff --git a/java/code/src/com/redhat/rhn/frontend/xmlrpc/errata/ErrataHandler.java
b/java/code/src/com/redhat/rhn/frontend/xmlrpc/errata/ErrataHandler.java
index 4589656..8c6cd88 100644
--- a/java/code/src/com/redhat/rhn/frontend/xmlrpc/errata/ErrataHandler.java
+++ b/java/code/src/com/redhat/rhn/frontend/xmlrpc/errata/ErrataHandler.java
@@ -36,6 +36,7 @@ import com.redhat.rhn.frontend.xmlrpc.DuplicateErrataException;
import com.redhat.rhn.frontend.xmlrpc.InvalidAdvisoryReleaseException;
import com.redhat.rhn.frontend.xmlrpc.InvalidAdvisoryTypeException;
import com.redhat.rhn.frontend.xmlrpc.InvalidChannelLabelException;
+import com.redhat.rhn.frontend.xmlrpc.InvalidErrataException;
import com.redhat.rhn.frontend.xmlrpc.InvalidPackageException;
import com.redhat.rhn.frontend.xmlrpc.MissingErrataAttributeException;
import com.redhat.rhn.frontend.xmlrpc.NoChannelsSelectedException;
@@ -251,7 +252,8 @@ public class ErrataHandler extends BaseHandler {
* @return 1 on success, exception thrown otherwise.
*
* @xmlrpc.doc Set erratum details. All arguments are optional and will only be
modified
- * if included in the struct.
+ * if included in the struct. This method will only allow for modification of custom
+ * errata created either through the UI or API.
* @xmlrpc.param #param("string", "sessionKey")
* @xmlrpc.param #param("string", "advisoryName")
* @xmlrpc.param
@@ -287,6 +289,12 @@ public class ErrataHandler extends BaseHandler {
User loggedInUser = getLoggedInUser(sessionKey);
Errata errata = lookupErrata(advisoryName, loggedInUser.getOrg());
+ if (errata.getOrg() == null) {
+ // Errata in the null org should not be modified; therefore, this is
+ // considered an invalid errata for this request
+ throw new InvalidErrataException(errata.getAdvisoryName());
+ }
+
if (details.containsKey("synopsis")) {
errata.setSynopsis((String)details.get("synopsis"));
}
@@ -609,7 +617,8 @@ public class ErrataHandler extends BaseHandler {
* given advisoryName cannot be found
*
* @xmlrpc.doc Add a set of packages to an erratum
- * with the given advisory name.
+ * with the given advisory name. This method will only allow for modification
+ * of custom errata created either through the UI or API.
* @xmlrpc.param #session_key()
* @xmlrpc.param #param("string", "advisoryName")
* @xmlrpc.param #array_single("int", "packageId")
@@ -623,6 +632,12 @@ public class ErrataHandler extends BaseHandler {
User loggedInUser = getLoggedInUser(sessionKey);
Errata errata = lookupErrata(advisoryName, loggedInUser.getOrg());
+ if (errata.getOrg() == null) {
+ // Errata in the null org should not be modified; therefore, this is
+ // considered an invalid errata for this request
+ throw new InvalidErrataException(errata.getAdvisoryName());
+ }
+
int packagesAdded = 0;
for (Integer packageId : packageIds) {
@@ -659,7 +674,8 @@ public class ErrataHandler extends BaseHandler {
* given advisoryName cannot be found
*
* @xmlrpc.doc Remove a set of packages from an erratum
- * with the given advisory name.
+ * with the given advisory name. This method will only allow for modification
+ * of custom errata created either through the UI or API.
* @xmlrpc.param #session_key()
* @xmlrpc.param #param("string", "advisoryName")
* @xmlrpc.param #array_single("int", "packageId")
@@ -673,6 +689,12 @@ public class ErrataHandler extends BaseHandler {
User loggedInUser = getLoggedInUser(sessionKey);
Errata errata = lookupErrata(advisoryName, loggedInUser.getOrg());
+ if (errata.getOrg() == null) {
+ // Errata in the null org should not be modified; therefore, this is
+ // considered an invalid errata for this request
+ throw new InvalidErrataException(errata.getAdvisoryName());
+ }
+
int packagesRemoved = 0;
for (Integer packageId : packageIds) {
@@ -727,7 +749,7 @@ public class ErrataHandler extends BaseHandler {
return errata;
}
-
+
/**
* Clones a list of errata into a specified channel
*
@@ -893,14 +915,12 @@ public class ErrataHandler extends BaseHandler {
newErrata = ErrataManager.createNewErrata();
newErrata.setOrg(loggedInUser.getOrg());
-
//all required
newErrata.setSynopsis(synopsis);
newErrata.setAdvisory(advisoryName + "-" +
advisoryRelease.toString());
newErrata.setAdvisoryName(advisoryName);
newErrata.setAdvisoryRel(new Long(advisoryRelease.longValue()));
-
if (advisoryType.equals("Security Advisory") ||
advisoryType.equals("Product Enhancement Advisory") ||
advisoryType.equals("Bug Fix Advisory")) {
@@ -933,7 +953,6 @@ public class ErrataHandler extends BaseHandler {
String keyword = (String) itr.next();
newErrata.addKeyword(keyword);
}
-
newErrata.setPackages(new HashSet());
for (Iterator itr = packageIds.iterator(); itr.hasNext();) {
@@ -958,7 +977,35 @@ public class ErrataHandler extends BaseHandler {
return newErrata;
}
}
-
+
+ /**
+ * Delete an erratum.
+ * @param sessionKey session of the logged in user
+ * @param advisoryName The advisory Name of the erratum to delete
+ * @throws FaultException if unknown or invalid erratum is provided.
+ * @return 1 on success, exception thrown otherwise.
+ *
+ * @xmlrpc.doc Delete an erratum. This method will only allow for deletion
+ * of custom errata created either through the UI or API.
+ * @xmlrpc.param #session_key()
+ * @xmlrpc.param #param("string", "advisoryName")
+ * @xmlrpc.returntype #return_int_success()
+ */
+ public Integer delete(String sessionKey, String advisoryName)
+ throws FaultException {
+ User loggedInUser = getLoggedInUser(sessionKey);
+ Errata errata = lookupErrata(advisoryName, loggedInUser.getOrg());
+
+ if (errata.getOrg() == null) {
+ // Errata in the null org should not be modified; therefore, this is
+ // considered an invalid errata for this request
+ throw new InvalidErrataException(errata.getAdvisoryName());
+ }
+
+ ErrataManager.deleteErratum(loggedInUser, errata.getId());
+ return 1;
+ }
+
/**
* Publishes an existing (unpublished) errata to a set of channels
* @param sessionKey session of the logged in user
diff --git
a/java/code/src/com/redhat/rhn/frontend/xmlrpc/errata/test/ErrataHandlerTest.java
b/java/code/src/com/redhat/rhn/frontend/xmlrpc/errata/test/ErrataHandlerTest.java
index 774e65e..aae045d 100644
--- a/java/code/src/com/redhat/rhn/frontend/xmlrpc/errata/test/ErrataHandlerTest.java
+++ b/java/code/src/com/redhat/rhn/frontend/xmlrpc/errata/test/ErrataHandlerTest.java
@@ -57,7 +57,6 @@ public class ErrataHandlerTest extends BaseHandlerTestCase {
super.setUp();
user = UserTestUtils.createUser("testUser", admin.getOrg().getId());
}
-
public void testGetDetails() throws Exception {
Errata errata = ErrataFactoryTest.createTestErrata(user.getOrg().getId());
@@ -91,7 +90,6 @@ public class ErrataHandlerTest extends BaseHandlerTestCase {
// we expect this test to fail
assertTrue(true);
}
-
}
public void testSetDetails() throws Exception {
@@ -349,10 +347,8 @@ public class ErrataHandlerTest extends BaseHandlerTestCase {
chanPack.setPackageName(errataPack.getPackageName());
chanPack.setPackageEvr(evr);
-
channel.addPackage(chanPack);
-
Errata toClone = ErrataFactoryTest.createTestPublishedErrata(
admin.getOrg().getId());
toClone.addPackage(errataPack);
@@ -373,7 +369,6 @@ public class ErrataHandlerTest extends BaseHandlerTestCase {
Channel sameChannel = ((Channel)channels.toArray()[0]);
assertEquals(channel, sameChannel);
-
Set packs = sameChannel.getPackages();
assertEquals(packs.size(), 2);
@@ -381,7 +376,6 @@ public class ErrataHandlerTest extends BaseHandlerTestCase {
assertTrue(packs.contains(chanPack));
}
-
public void testCreate() throws Exception {
@@ -389,7 +383,6 @@ public class ErrataHandlerTest extends BaseHandlerTestCase {
Map errataInfo = new HashMap();
-
String advisoryName = TestUtils.randomString();
populateErrataInfo(errataInfo);
errataInfo.put("advisory_name", advisoryName);
@@ -410,6 +403,30 @@ public class ErrataHandlerTest extends BaseHandlerTestCase {
}
+ public void testDelete() throws Exception {
+ Errata errata = ErrataFactoryTest.createTestErrata(user.getOrg().getId());
+ Errata check = ErrataManager.lookupErrata(errata.getId(), user);
+ assertTrue(check.getAdvisory().equals(errata.getAdvisory()));
+ assertTrue(check.getId().equals(errata.getId()));
+
+ // delete a published erratum
+ int result = handler.delete(adminKey, errata.getAdvisory());
+ assertEquals(1, result);
+ errata = (Errata) TestUtils.reload(errata);
+ assertNull(errata);
+
+ errata = ErrataFactoryTest.createTestUnpublishedErrata(user.getOrg().getId());
+ check = ErrataManager.lookupErrata(errata.getId(), user);
+ assertTrue(check.getAdvisory().equals(errata.getAdvisory()));
+ assertTrue(check.getId().equals(errata.getId()));
+
+ // delete an unpublished erratum
+ result = handler.delete(adminKey, errata.getAdvisory());
+ assertEquals(1, result);
+ errata = (Errata) TestUtils.reload(errata);
+ assertNull(errata);
+ }
+
private void populateErrataInfo(Map errataInfo) {
errataInfo.put("synopsis", TestUtils.randomString());
errataInfo.put("advisory_release", new Integer(2));
@@ -454,7 +471,6 @@ public class ErrataHandlerTest extends BaseHandlerTestCase {
Map errataInfo = new HashMap();
-
String advisoryName = TestUtils.randomString();
populateErrataInfo(errataInfo);
errataInfo.put("advisory_name", advisoryName);
@@ -482,7 +498,6 @@ public class ErrataHandlerTest extends BaseHandlerTestCase {
Map errataInfo = new HashMap();
-
String advisoryName = TestUtils.randomString();
populateErrataInfo(errataInfo);
errataInfo.put("advisory_name", advisoryName);
@@ -516,9 +531,7 @@ public class ErrataHandlerTest extends BaseHandlerTestCase {
}
-
public void testListByDate() throws Exception {
-
Calendar cal = Calendar.getInstance();
Date earlyDate = cal.getTime();
@@ -546,5 +559,4 @@ public class ErrataHandlerTest extends BaseHandlerTestCase {
assertEquals(array[0], earlyErrata);
assertEquals(array[1], laterErrata);
}
-
}
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 6a0070c..e77cc7a 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.rhnpackage.Package;
import com.redhat.rhn.domain.rhnset.RhnSet;
import com.redhat.rhn.domain.rhnset.RhnSetFactory;
import com.redhat.rhn.domain.role.RoleFactory;
@@ -455,14 +456,6 @@ public class ErrataManager extends BaseManager {
//
for (Iterator erratas = dr.iterator(); erratas.hasNext();) {
OwnedErrata oe = (OwnedErrata) erratas.next();
- DataResult channels = ErrataManager.applicableChannels(
- oe.getId().longValue(), user.getOrg().getId(), null);
- for (Iterator chanItr = channels.iterator(); chanItr.hasNext();) {
- Map chan = (Map)chanItr.next();
- String lbl = chan.get("label").toString();
- ChannelManager.queueChannelChange(lbl,
- "java::deleteErrata", oe.getAdvisory());
- }
deleteErratum(user, new Long(oe.getId().longValue()));
}
@@ -488,6 +481,30 @@ public class ErrataManager extends BaseManager {
* @param errataId The erratum for deletion
*/
public static void deleteErratum(User user, Long errataId) {
+
+ Errata errata = ErrataManager.lookupErrata(errataId, user);
+ if (errata != null) {
+ if (errata.isPublished()) {
+ // If this is a published errata, we should remove the packages in the
+ // channels associated with the errata
+ //
+ // In addition, for each of the channels associated with the errata,
+ // mark them as 'metadata may have changed'
+ Set<Package> errataPacks = errata.getPackages();
+ Set<Channel> errataChans = errata.getChannels();
+ for (Channel chan : errataChans) {
+ for (Package pack : errataPacks) {
+ if (chan.getPackages().contains(pack)) {
+ chan.getPackages().remove(pack);
+ }
+ }
+
+ ChannelManager.queueChannelChange(chan.getLabel(),
+ "java::deleteErrata", errata.getAdvisory());
+ }
+ }
+ }
+
List modes = new LinkedList();
modes.add(ModeFactory.getWriteMode("Errata_queries",
"deletePaidErrataTempCache"));
modes.add(ModeFactory.getWriteMode("Errata_queries",
"deleteErrataFile"));
@@ -511,9 +528,7 @@ public class ErrataManager extends BaseManager {
mode.executeUpdate(errataParams);
break;
}
-
}
-
}
/**