/* * RHQ Management Platform * Copyright (C) 2009 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, version 2, as * published by the Free Software Foundation, and/or the GNU Lesser * General Public License, version 2.1, also as published by the Free * Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License and the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU General Public License * and the GNU Lesser General Public License along with this program; * if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package org.rhq.enterprise.server.plugin.pc.content.sync; import java.util.ArrayList; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.rhq.core.domain.auth.Subject; import org.rhq.core.domain.content.Advisory; import org.rhq.core.domain.content.AdvisoryBuglist; import org.rhq.core.domain.content.AdvisoryCVE; import org.rhq.core.domain.content.AdvisoryPackage; import org.rhq.core.domain.content.ContentSource; import org.rhq.core.domain.content.PackageVersion; import org.rhq.core.domain.content.Repo; import org.rhq.core.domain.content.RepoSyncResults; import org.rhq.core.domain.util.PageControl; import org.rhq.enterprise.server.auth.SubjectManagerLocal; import org.rhq.enterprise.server.content.AdvisoryManagerLocal; import org.rhq.enterprise.server.content.ContentSourceManagerLocal; import org.rhq.enterprise.server.content.RepoManagerLocal; import org.rhq.enterprise.server.plugin.pc.content.AdvisoryBugDetails; import org.rhq.enterprise.server.plugin.pc.content.AdvisoryCVEDetails; import org.rhq.enterprise.server.plugin.pc.content.AdvisoryDetails; import org.rhq.enterprise.server.plugin.pc.content.AdvisoryPackageDetails; import org.rhq.enterprise.server.plugin.pc.content.AdvisorySource; import org.rhq.enterprise.server.plugin.pc.content.AdvisorySyncReport; import org.rhq.enterprise.server.plugin.pc.content.ContentProvider; import org.rhq.enterprise.server.plugin.pc.content.SyncException; import org.rhq.enterprise.server.plugin.pc.content.SyncTracker; import org.rhq.enterprise.server.plugin.pc.content.ThreadUtil; import org.rhq.enterprise.server.util.LookupUtil; /** * Holds the methods necessary to interact with a plugin and execute its advisory related * synchronization tasks. * * @author Pradeep Kilambi */ public class AdvisorySourceSynchronizer { private final Log log = LogFactory.getLog(this.getClass()); private RepoManagerLocal repoManager; private ContentSourceManagerLocal contentSourceManager; private SubjectManagerLocal subjectManager; private Repo repo; private ContentSource source; private ContentProvider provider; private PageControl pc = PageControl.getUnlimitedInstance(); private Subject overlord; public AdvisorySourceSynchronizer(Repo repo, ContentSource source, ContentProvider provider) { this.repo = repo; this.source = source; this.provider = provider; repoManager = LookupUtil.getRepoManagerLocal(); contentSourceManager = LookupUtil.getContentSourceManager(); subjectManager = LookupUtil.getSubjectManager(); overlord = subjectManager.getOverlord(); } public SyncTracker synchronizeAdvisoryMetadata(SyncTracker tracker) throws SyncException, InterruptedException { if (!(provider instanceof AdvisorySource)) { // Nothing to do. return tracker; } AdvisorySource advisorySource = (AdvisorySource) provider; log.error("Synchronize Advisory: [" + source.getName() + "]: syncing repo [" + repo.getName() + "]"); long start = System.currentTimeMillis(); List<Advisory> advs = repoManager.findAssociatedAdvisory(overlord, repo.getId(), pc); log.error("Found " + advs.size() + " advisories for repo " + repo.getId()); ThreadUtil.checkInterrupted(); AdvisorySyncReport advReport = new AdvisorySyncReport(repo.getId()); List<AdvisoryDetails> advDetails = new ArrayList<AdvisoryDetails>(advs.size()); translateDomainToDto(advs, advDetails); ThreadUtil.checkInterrupted(); log.error("Synchronize Advisory: [" + source.getName() + "]: loaded existing list of size=[" + advs.size() + "] (" + (System.currentTimeMillis() - start) + ")ms"); // Ask source to do the sync // -------------------------------------------- start = System.currentTimeMillis(); advisorySource.synchronizeAdvisory(repo.getName(), advReport, advDetails); ThreadUtil.checkInterrupted(); log.error("Synchronize Advisory: [" + source.getName() + "]: got sync report from adapter=[" + advReport + "] (" + (System.currentTimeMillis() - start) + ")ms"); RepoSyncResults syncResults = contentSourceManager.mergeAdvisorySyncReport(source, advReport, tracker .getRepoSyncResults()); ThreadUtil.checkInterrupted(); log.error("Synchronize Advisory: [" + source.getName() + "]: finished mergeAdvisorySyncReport (" + (System.currentTimeMillis() - start) + ")ms"); tracker.setRepoSyncResults(syncResults); tracker.finishAdvisoryMetadataWork(provider); return tracker; } private void translateDomainToDto(List<Advisory> advs, List<AdvisoryDetails> advDetails) throws InterruptedException { AdvisoryManagerLocal advManager = LookupUtil.getAdvisoryManagerLocal(); for (Advisory d : advs) { AdvisoryDetails detail = new AdvisoryDetails(d.getAdvisory(), d.getAdvisoryType(), d.getSynopsis()); detail.setAdvisory(d.getAdvisory()); detail.setAdvisory_name(d.getAdvisory_name()); detail.setAdvisory_type(d.getAdvisoryType()); detail.setDescription(d.getDescription()); detail.setSolution(d.getSolution()); detail.setIssue_date(d.getIssue_date()); detail.setTopic(d.getTopic()); detail.setUpdate_date(d.getUpdate_date()); List<AdvisoryPackage> pkgs = advManager.findPackageByAdvisory(overlord, d.getId(), pc); for (AdvisoryPackage pkg : pkgs) { PackageVersion pv = advManager.findPackageVersionByPkgId(overlord, pkg.getPkg().getFileName(), pc); AdvisoryPackageDetails apkg = new AdvisoryPackageDetails(pv.getDisplayName(), pv.getVersion(), pv .getArchitecture().getName(), pv.getFileName()); detail.addPkg(apkg); } List<AdvisoryCVE> cves = advManager.getAdvisoryCVEByAdvId(overlord, d.getId(), pc); for (AdvisoryCVE cve : cves) { AdvisoryCVEDetails acve = new AdvisoryCVEDetails(cve.getCVE().getName()); detail.addCVE(acve); } List<AdvisoryBuglist> abugs = advManager.getAdvisoryBuglistByAdvId(overlord, d.getId()); if (abugs != null && abugs.size() > 0) { for (AdvisoryBuglist abug : abugs) { AdvisoryBugDetails abugdetail = new AdvisoryBugDetails(abug.getBugid()); detail.addBug(abugdetail); } } advDetails.add(detail); ThreadUtil.checkInterrupted(); } } }