java/code/src/com/redhat/rhn/domain/errata/AbstractErrata.java
| 2
java/code/src/com/redhat/rhn/frontend/xmlrpc/channel/software/ChannelSoftwareHandler.java
| 73 ++++++----
2 files changed, 52 insertions(+), 23 deletions(-)
New commits:
commit 5c14ba73da7e5f19bdc73092bbfa51f632cb536a
Author: Tomas Lestach <tlestach(a)redhat.com>
Date: Tue Jun 8 14:00:00 2010 +0200
591291 - clone errata instead of associating them to custom channels
diff --git
a/java/code/src/com/redhat/rhn/frontend/xmlrpc/channel/software/ChannelSoftwareHandler.java
b/java/code/src/com/redhat/rhn/frontend/xmlrpc/channel/software/ChannelSoftwareHandler.java
index b17d64e..b552262 100644
---
a/java/code/src/com/redhat/rhn/frontend/xmlrpc/channel/software/ChannelSoftwareHandler.java
+++
b/java/code/src/com/redhat/rhn/frontend/xmlrpc/channel/software/ChannelSoftwareHandler.java
@@ -30,6 +30,7 @@ import com.redhat.rhn.domain.channel.InvalidChannelRoleException;
import com.redhat.rhn.domain.channel.NewChannelHelper;
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.org.Org;
import com.redhat.rhn.domain.rhnpackage.Package;
import com.redhat.rhn.domain.rhnpackage.PackageFactory;
@@ -57,6 +58,7 @@ import com.redhat.rhn.frontend.xmlrpc.user.XmlRpcUserHelper;
import com.redhat.rhn.manager.channel.ChannelEditor;
import com.redhat.rhn.manager.channel.ChannelManager;
import com.redhat.rhn.manager.channel.CreateChannelCommand;
+import com.redhat.rhn.manager.errata.ErrataManager;
import com.redhat.rhn.manager.errata.cache.ErrataCacheManager;
import com.redhat.rhn.manager.system.IncompatibleArchException;
import com.redhat.rhn.manager.system.SystemManager;
@@ -1769,13 +1771,10 @@ public class ChannelSoftwareHandler extends BaseHandler {
mergeTo.getLabel()));
}
- Set<Errata> toErrata = mergeTo.getErratas();
- Set<Errata> fromErrata = mergeFrom.getErratas();
- Set<Errata> differentErrata = errataDiff(fromErrata, toErrata);
+ Set<Errata> mergedErrata =
+ mergeErrataToChannel(loggedInUser, mergeFrom.getErratas(), mergeTo);
- mergeTo.getErratas().addAll(differentErrata);
- ChannelFactory.save(mergeTo);
- return differentErrata.toArray();
+ return mergedErrata.toArray();
}
/**
@@ -1823,30 +1822,60 @@ public class ChannelSoftwareHandler extends BaseHandler {
Set<Errata> toErrata = mergeTo.getErratas();
List<Errata> fromErrata = ErrataFactory.lookupByChannelBetweenDates(
loggedInUser.getOrg(), mergeFrom, startDate, endDate);
- Set<Errata> differentErrata = errataDiff(new HashSet(fromErrata),
toErrata);
- mergeTo.getErratas().addAll(differentErrata);
- ChannelFactory.save(mergeTo);
- return differentErrata.toArray();
+ Set<Errata> mergedErrata =
+ mergeErrataToChannel(loggedInUser, mergeFrom.getErratas(), mergeTo);
+
+ return mergedErrata.toArray();
}
- private Set<Errata> errataDiff(Set<Errata> from, Set<Errata> to) {
- Set<Errata> diff = new HashSet<Errata>();
- for (Errata errata : from) {
- if (!errataInSet(to, errata)) {
- diff.add(errata);
+ private Set<Errata> mergeErrataToChannel(User user, Set<Errata>
fromErrata,
+ Channel toChannel) {
+ Set<Errata> toErrata = toChannel.getErratas();
+ Set<Errata> diffErrata = new HashSet(fromErrata);
+
+ for (Iterator iter = fromErrata.iterator(); iter.hasNext();) {
+ Errata errata = (Errata) iter.next();
+ if (toErrata.contains(errata)) {
+ // remove errata already in channel
+ diffErrata.remove(errata);
+ }
+ else if (errata.isCloned()) {
+ Errata origErrata = ((PublishedClonedErrata) errata).getOriginal();
+ if (cloneInSet(user, origErrata, toErrata)) {
+ // remove errata those brothers already in channel
+ // (different clones of the same original)
+ diffErrata.remove(errata);
+ }
+ }
+ else {
+ if (cloneInSet(user, errata, toErrata)) {
+ // remove errata those clones already in channel
+ diffErrata.remove(errata);
+ }
}
}
- return diff;
+
+ ErrataManager.publishErrataToChannel(toChannel, getErrataIds(diffErrata), user);
+ ChannelFactory.save(toChannel);
+
+ return diffErrata;
}
- private boolean errataInSet(Set<Errata> where, Errata what) {
- for (Errata errata : where) {
- if (errata.equals(what)) {
- return true;
- }
+ private Set<Long> getErrataIds(Set<Errata> errata) {
+ Set<Long> ids = new HashSet();
+ for (Errata erratum : errata) {
+ ids.add(erratum.getId());
}
- return false;
+ return ids;
+ }
+
+ private Boolean cloneInSet(User user, Errata original, Set<Errata> set) {
+ List<Errata> clones = ErrataManager.lookupPublishedByOriginal(
+ user, original);
+ int numOfClones = clones.size();
+ clones.removeAll(set);
+ return (clones.size() != numOfClones);
}
/*
commit 7021edfc653b6d422e9863a033171a792e545fb2
Author: Tomas Lestach <tlestach(a)redhat.com>
Date: Tue Jun 8 09:56:35 2010 +0200
fixing hashCode for Errata
the bug prevented to work errata comparism, errata set operations, ...
diff --git a/java/code/src/com/redhat/rhn/domain/errata/AbstractErrata.java
b/java/code/src/com/redhat/rhn/domain/errata/AbstractErrata.java
index b903f59..7d302d6 100644
--- a/java/code/src/com/redhat/rhn/domain/errata/AbstractErrata.java
+++ b/java/code/src/com/redhat/rhn/domain/errata/AbstractErrata.java
@@ -649,6 +649,6 @@ public abstract class AbstractErrata extends BaseDomainHelper
implements
eb.append(this.getAdvisoryRel());
eb.append(this.getAdvisorySynopsis());
eb.append(this.getOrg());
- return eb.hashCode();
+ return eb.toHashCode();
}
}