/*
* 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.ContentSource;
import org.rhq.core.domain.content.Distribution;
import org.rhq.core.domain.content.DistributionFile;
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.ContentSourceManagerLocal;
import org.rhq.enterprise.server.content.DistributionManagerLocal;
import org.rhq.enterprise.server.content.RepoManagerLocal;
import org.rhq.enterprise.server.plugin.pc.content.ContentProvider;
import org.rhq.enterprise.server.plugin.pc.content.DistributionDetails;
import org.rhq.enterprise.server.plugin.pc.content.DistributionFileDetails;
import org.rhq.enterprise.server.plugin.pc.content.DistributionSource;
import org.rhq.enterprise.server.plugin.pc.content.DistributionSyncReport;
import org.rhq.enterprise.server.plugin.pc.content.SyncException;
import org.rhq.enterprise.server.plugin.pc.content.SyncTracker;
import org.rhq.enterprise.server.util.LookupUtil;
/**
* Holds the methods necessary to interact with a plugin and execute its distribution related
* synchronization tasks.
*
* @author Jason Dobies
*/
public class DistributionSourceSynchronizer {
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;
public DistributionSourceSynchronizer(Repo repo, ContentSource source, ContentProvider provider) {
this.repo = repo;
this.source = source;
this.provider = provider;
repoManager = LookupUtil.getRepoManagerLocal();
contentSourceManager = LookupUtil.getContentSourceManager();
subjectManager = LookupUtil.getSubjectManager();
}
public SyncTracker synchronizeDistributionMetadata(SyncTracker tracker) throws SyncException, InterruptedException {
if (!(provider instanceof DistributionSource)) {
// Nothing to do.
return tracker;
}
DistributionSource distributionSource = (DistributionSource) provider;
String msg = "Synchronize Distributions: [" + source.getName() + "]: syncing repo [" + repo.getName() + "]";
log.info(msg);
tracker.getRepoSyncResults().appendResults(msg);
// Load existing distributions to send to source
// --------------------------------------------
long start = System.currentTimeMillis();
PageControl pc = PageControl.getUnlimitedInstance();
Subject overlord = subjectManager.getOverlord();
List<Distribution> dists = repoManager.findAssociatedDistributions(overlord, repo.getId(), pc);
log.debug("Found " + dists.size() + " distributions for repo " + repo.getId());
DistributionSyncReport distReport = new DistributionSyncReport(repo.getId());
List<DistributionDetails> distDetails = new ArrayList<DistributionDetails>(dists.size());
translateDomainToDto(dists, distDetails);
log.info("Synchronize Distributions: [" + repo.getName() + "]: loaded existing list of size=[" + dists.size()
+ "] (" + (System.currentTimeMillis() - start) + ")ms");
// Ask source to do the sync
// --------------------------------------------
start = System.currentTimeMillis();
distributionSource.synchronizeDistribution(repo.getName(), distReport, distDetails);
log.info("Synchronize Distributions: [" + repo.getName() + "]: got sync report from adapter=[" + distReport
+ "] (" + (System.currentTimeMillis() - start) + ")ms");
RepoSyncResults syncResults = contentSourceManager.mergeDistributionSyncReport(source, distReport, tracker
.getRepoSyncResults());
tracker.setRepoSyncResults(syncResults);
tracker.getProgressWatcher().finishWork(provider.getSyncProgressWeight().getDistribtutionBitsWeight());
return tracker;
}
public SyncTracker synchronizeDistributionBits(SyncTracker tracker) throws SyncException, InterruptedException {
if (!(provider instanceof DistributionSource)) {
return tracker;
}
Subject overlord = subjectManager.getOverlord();
tracker.getRepoSyncResults().appendResults(
"Synchronize Distributions: [" + repo.getName() + " Starting Distribution bits download.");
tracker.setRepoSyncResults(repoManager.mergeRepoSyncResults(tracker.getRepoSyncResults()));
contentSourceManager.downloadDistributionBits(overlord, source);
tracker.getRepoSyncResults().appendResults(
"Synchronize Distributions: [" + repo.getName() + " finished bits download.");
tracker.getProgressWatcher().finishWork(provider.getSyncProgressWeight().getDistribtutionBitsWeight());
return tracker;
}
private void translateDomainToDto(List<Distribution> dists, List<DistributionDetails> distDetails) {
DistributionManagerLocal distManager = LookupUtil.getDistributionManagerLocal();
for (Distribution d : dists) {
DistributionDetails detail = new DistributionDetails(d.getLabel(), d.getDistributionType().getName());
detail.setLabel(d.getLabel());
detail.setDistributionPath(d.getBasePath());
detail.setDescription(d.getDistributionType().getDescription());
List<DistributionFile> files = distManager.getDistributionFilesByDistId(d.getId());
for (DistributionFile f : files) {
DistributionFileDetails dfd = new DistributionFileDetails(f.getRelativeFilename(), f.getLastModified(),
f.getMd5sum());
detail.addFile(dfd);
}
distDetails.add(detail);
}
}
}