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@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@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(); } }
spacewalk-commits@lists.fedorahosted.org