modules/core/domain/src/main/java/org/rhq/core/domain/content/RepoDistribution.java | 2
modules/core/util/src/main/java/org/rhq/core/util/progresswatch/ProgressWatcher.java | 115 --------
modules/core/util/src/test/java/org/rhq/core/util/progresswatch/ProgressWatcherTest.java | 64 ----
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/ListReposUIBean.java | 5
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/RepoDetailsUIBean.java | 34 +-
modules/enterprise/gui/portal-war/src/main/webapp/rhq/content/repo.xhtml | 4
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentSourceManagerBean.java | 124 ++++----
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentSourceManagerLocal.java | 5
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/DistributionManagerBean.java | 22 -
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerBean.java | 6
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerLocal.java | 3
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/AdvisorySource.java | 5
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/ContentProviderManager.java | 55 +--
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/DistributionSource.java | 5
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/PackageSource.java | 4
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/SyncTracker.java | 141 ++++++++--
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/sync/AdvisorySourceSynchronizer.java | 3
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/sync/DistributionSourceSynchronizer.java | 12
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/sync/PackageSourceSynchronizer.java | 13
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/content/test/DistributionManagerBeanTest.java | 33 ++
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/plugin/pc/content/SyncTrackerTest.java | 79 +++++
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/plugin/pc/content/TestContentProvider.java | 16 -
modules/enterprise/server/plugins/disk/src/main/java/org/rhq/enterprise/server/plugins/disk/DiskSource.java | 3
modules/enterprise/server/plugins/jboss-software/src/main/java/org/rhq/enterprise/server/plugins/jboss/software/JBossSoftwareContentSourceAdapter.java | 5
modules/enterprise/server/plugins/jboss-software/src/test/java/org/rhq/enterprise/server/plugins/jboss/software/test/JBossSoftwareContentSourceAdapterLiveTest.java | 10
modules/enterprise/server/plugins/rhnhosted/src/main/java/org/rhq/enterprise/server/plugins/rhnhosted/RHNHelper.java | 122 ++++----
modules/enterprise/server/plugins/rhnhosted/src/main/java/org/rhq/enterprise/server/plugins/rhnhosted/RHNProvider.java | 21 -
modules/enterprise/server/plugins/rhnhosted/src/test/java/org/rhq/enterprise/server/plugins/rhnhosted/RHNProviderTest.java | 4
modules/enterprise/server/plugins/url/src/main/java/org/rhq/enterprise/server/plugins/url/UrlProvider.java | 3
modules/enterprise/server/plugins/yum/src/main/java/org/rhq/enterprise/server/plugins/yum/RepoProvider.java | 7
30 files changed, 494 insertions(+), 431 deletions(-)
New commits:
commit 2d66f8271d658050d16bf59165f2a5fd824c3a79
Author: Mike McCune <mmccune(a)gibson.pdx.redhat.com>
Date: Wed Feb 3 21:22:29 2010 -0800
1645 - big improvement/refactor of sync status code
General sync cleanup as well. Made sure we dont sync all
distros associated with every repo associated with any given
contentprovider.
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/content/RepoDistribution.java b/modules/core/domain/src/main/java/org/rhq/core/domain/content/RepoDistribution.java
index 113c543..838cd9b 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/content/RepoDistribution.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/content/RepoDistribution.java
@@ -47,11 +47,13 @@ import javax.persistence.Table;
@NamedQueries( {
@NamedQuery(name = RepoDistribution.DELETE_BY_KICKSTART_TREE_ID, query = "DELETE RepoDistribution rkt WHERE rkt.dist.id = :distId"),
@NamedQuery(name = RepoDistribution.DELETE_BY_REPO_ID, query = "DELETE RepoDistribution rkt WHERE rkt.repo.id = :repoId"),
+ @NamedQuery(name = RepoDistribution.DELETE_BY_DISTRO_ID, query = "DELETE RepoDistribution rkt WHERE rkt.dist.id = :distId"),
@NamedQuery(name = RepoDistribution.QUERY_FIND_BY_REPO_ID, query = "SELECT rkt FROM RepoDistribution rkt where rkt.repo.id = :repoId ") })
@Table(name = "RHQ_REPO_DISTRIBUTION")
public class RepoDistribution implements Serializable {
public static final String DELETE_BY_KICKSTART_TREE_ID = "RepoDistribution.deleteByKickstartTreeId";
public static final String DELETE_BY_REPO_ID = "RepoDistribution.deleteByRepoId";
+ public static final String DELETE_BY_DISTRO_ID = "RepoDistribution.deleteByDistroId";
public static final String QUERY_FIND_BY_REPO_ID = "RepoDistribution.queryFindByRepoId";
private static final long serialVersionUID = 1L;
diff --git a/modules/core/util/src/main/java/org/rhq/core/util/progresswatch/ProgressWatcher.java b/modules/core/util/src/main/java/org/rhq/core/util/progresswatch/ProgressWatcher.java
deleted file mode 100644
index 1e11c2a..0000000
--- a/modules/core/util/src/main/java/org/rhq/core/util/progresswatch/ProgressWatcher.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2008 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 as published by
- * the Free Software Foundation version 2 of the License.
- *
- * 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 for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-package org.rhq.core.util.progresswatch;
-
-/**
- * Simple class who's goal is to:
- *
- * 1) Total up the amount of work to be done
- * 2) Track the amount of work that is actually done
- * 3) Report the % of the work completed
- *
- * The amount of work is arbitrary and stored in simple integer format. Percent complete is calculated
- * based on the finished work divided by the work remaining.
- *
- * Possible additions to the future could add ability to track timing (current, remaining estimate).
- *
- * @author mmccune
- *
- */
-public class ProgressWatcher {
-
- private boolean started = false;
- private int totalWork = -1;
- private int finishedWork = -1;
-
- /**
- * Start watching the progress of a given amount of work.
- */
- public void start() {
- totalWork = 0;
- finishedWork = 0;
- started = true;
- }
-
- /**
- * Get the percentage complete of the total work specified.
- * @return float 0-100% of the amount of work copleted. integer so no decimal points.
- * @throws IllegalStateException if this ProgressWatcher has not been started yet.
- */
- public int getPercentComplete() throws IllegalStateException {
- if (!started) {
- throw new IllegalStateException(this.getClass().getSimpleName()
- + " not started yet. call start() to set progress to 0 and start watching.");
- }
- if (totalWork == 0) {
- return 0;
- } else {
- float percentComp = (((float) finishedWork / (float) totalWork) * 100);
- return (int) percentComp;
- }
-
- }
-
- /**
- * Set the total amount of work to be completed.
- *
- * @param totalWorkIn to set.
- */
- public void setTotalWork(int totalWorkIn) {
- this.totalWork = totalWorkIn;
- }
-
- /**
- * Add a unit of work to be completed.
- *
- * @param workToAdd
- */
- public void addWork(int workToAdd) {
- totalWork = totalWork + workToAdd;
- }
-
- /**
- * Indicate that a # of work units has been completed.
- *
- * @param workToRemove
- */
- public void finishWork(int workToRemove) {
- if (!started) {
- throw new IllegalStateException(this.getClass().getSimpleName()
- + " not started yet. call start() to set progress to 0 and start watching.");
- }
- finishedWork += workToRemove;
- }
-
- /**
- * Indicate this ProgressWatcher is finished watching.
- */
- public void stop() {
- this.started = false;
- }
-
- /**
- * Reset the ProgressWatcher to zero.
- */
- public void resetToZero() {
- stop();
- start();
- }
-}
diff --git a/modules/core/util/src/test/java/org/rhq/core/util/progresswatch/ProgressWatcherTest.java b/modules/core/util/src/test/java/org/rhq/core/util/progresswatch/ProgressWatcherTest.java
deleted file mode 100644
index 8bf4336..0000000
--- a/modules/core/util/src/test/java/org/rhq/core/util/progresswatch/ProgressWatcherTest.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2008 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 as published by
- * the Free Software Foundation version 2 of the License.
- *
- * 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 for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-package org.rhq.core.util.progresswatch;
-
-import junit.framework.TestCase;
-
-public class ProgressWatcherTest extends TestCase {
-
- public void testProgressWatcher() {
- ProgressWatcher pw = new ProgressWatcher();
- boolean failed = false;
- try {
- pw.getPercentComplete();
- } catch (IllegalStateException e) {
- failed = true;
- }
- assertTrue(failed);
-
- pw.start();
- assertTrue(pw.getPercentComplete() == 0);
- for (int i = 0; i < 5; i++) {
- pw.addWork(100);
- }
- pw.finishWork(500);
- assertTrue(pw.getPercentComplete() == 100);
-
- }
-
- // Check to make sure we don't lose precision as we divide by close numbers
- public void test98Percent() {
- ProgressWatcher pw = new ProgressWatcher();
- pw.start();
- pw.setTotalWork(102);
- pw.finishWork(100);
- assertTrue(pw.getPercentComplete() == 98);
- }
-
- public void testResetToZero() {
- ProgressWatcher pw = new ProgressWatcher();
- pw.start();
- pw.setTotalWork(102);
- pw.finishWork(100);
- pw.resetToZero();
- assertTrue(pw.getPercentComplete() == 0);
-
- }
-
-}
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/ListReposUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/ListReposUIBean.java
index 4c923ec..051f412 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/ListReposUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/ListReposUIBean.java
@@ -66,8 +66,7 @@ public class ListReposUIBean extends PagedDataTableUIBean {
int syncCount = 0;
try {
syncCount = repoManager.synchronizeRepos(subject, repoIds);
- }
- catch (Exception e) {
+ } catch (Exception e) {
FacesContextUtility.addMessage(FacesMessage.SEVERITY_ERROR, "Failed to delete repositories.", e);
}
if (syncCount > 0) {
@@ -124,7 +123,7 @@ public class ListReposUIBean extends PagedDataTableUIBean {
PageList<Repo> results = manager.findRepos(subject, pc);
for (Repo repo : results) {
- repo.setSyncStatus(manager.calculateSyncStatus(subject, repo.getId()));
+ repo.setSyncStatus(manager.calculateSyncStatus(subject, repo.getId()).toString());
}
return results;
}
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/RepoDetailsUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/RepoDetailsUIBean.java
index dea6e98..53132a1 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/RepoDetailsUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/RepoDetailsUIBean.java
@@ -18,6 +18,9 @@
*/
package org.rhq.enterprise.gui.content;
+import java.util.HashMap;
+import java.util.Map;
+
import javax.faces.application.FacesMessage;
import org.apache.commons.logging.Log;
@@ -35,6 +38,21 @@ import org.rhq.enterprise.server.util.LookupUtil;
public class RepoDetailsUIBean {
+ private static final Map<Enum<ContentSyncStatus>, String> statusMap = new HashMap<Enum<ContentSyncStatus>, String>();
+ static {
+ statusMap.put(ContentSyncStatus.ADVISORYMETADATA, "Advisories (Step 5 of 5)");
+ statusMap.put(ContentSyncStatus.CANCELLED, "Cancelled");
+ statusMap.put(ContentSyncStatus.CANCELLING, "Cancelling");
+ statusMap.put(ContentSyncStatus.DISTROBITS, "Distro Bits (Step 4 of 5)");
+ statusMap.put(ContentSyncStatus.DISTROMETADATA, "Distro Metadata (Step 3 of 5)");
+ statusMap.put(ContentSyncStatus.FAILURE, "Failure");
+ statusMap.put(ContentSyncStatus.INPROGRESS, "In Progress");
+ statusMap.put(ContentSyncStatus.NONE, "None");
+ statusMap.put(ContentSyncStatus.PACKAGEBITS, "Package Bits (Step 2 of 5)");
+ statusMap.put(ContentSyncStatus.PACKAGEMETADATA, "Package Metadata (Step 1 of 5)");
+ statusMap.put(ContentSyncStatus.SUCCESS, "Success");
+ }
+
private final Log log = LogFactory.getLog(this.getClass());
private Repo repo;
@@ -48,8 +66,15 @@ public class RepoDetailsUIBean {
return "edit";
}
+ private ContentSyncStatus getSyncStatusInternal() {
+ Subject subject = EnterpriseFacesContextUtility.getSubject();
+ Integer id = FacesContextUtility.getRequiredRequestParameter("id", Integer.class);
+ ContentSyncStatus status = LookupUtil.getRepoManagerLocal().calculateSyncStatus(subject, id);
+ return status;
+ }
+
public boolean getCurrentlySyncing() {
- String syncStatus = getSyncStatus();
+ String syncStatus = getSyncStatusInternal().toString();
if (!syncStatus.equals(ContentSyncStatus.SUCCESS.toString())
&& !syncStatus.equals(ContentSyncStatus.FAILURE.toString())
&& !syncStatus.equals(ContentSyncStatus.NONE.toString())
@@ -62,10 +87,7 @@ public class RepoDetailsUIBean {
}
public String getSyncStatus() {
- Subject subject = EnterpriseFacesContextUtility.getSubject();
- Integer id = FacesContextUtility.getRequiredRequestParameter("id", Integer.class);
- String retval = LookupUtil.getRepoManagerLocal().calculateSyncStatus(subject, id);
- return retval;
+ return statusMap.get(getSyncStatusInternal());
}
public RepoSyncResults getSyncResults() {
@@ -146,7 +168,7 @@ public class RepoDetailsUIBean {
Integer id = FacesContextUtility.getRequiredRequestParameter("id", Integer.class);
RepoManagerLocal manager = LookupUtil.getRepoManagerLocal();
this.repo = manager.getRepo(subject, id);
- this.repo.setSyncStatus(manager.calculateSyncStatus(subject, id));
+ this.repo.setSyncStatus(manager.calculateSyncStatus(subject, id).toString());
}
}
}
\ No newline at end of file
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/content/repo.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/content/repo.xhtml
index 8837813..4949048 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/content/repo.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/content/repo.xhtml
@@ -95,7 +95,7 @@
<a4j:poll id="statusPoll" interval="1005"
reRender="syncPercent,syncStatus" />
<tr>
- <td align="right"><b>Synchronization Status:</b></td>
+ <td align="right"><b>Synchronization Step:</b></td>
<td align="left"><c:choose>
<c:when
test="#{RepoDetailsUIBean.percentComplete != '100'}">
@@ -116,7 +116,7 @@
</td>
</tr>
<tr>
- <td align="right"><b>Synchronization Progress :</b></td>
+ <td align="right"><b>Step Progress:</b></td>
<td align="left">
<c:choose>
<c:when
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentSourceManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentSourceManagerBean.java
index 71de11f..6084d4f 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentSourceManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentSourceManagerBean.java
@@ -116,6 +116,8 @@ import org.rhq.enterprise.server.plugin.pc.content.DistributionSyncReport;
import org.rhq.enterprise.server.plugin.pc.content.InitializationException;
import org.rhq.enterprise.server.plugin.pc.content.PackageSyncReport;
import org.rhq.enterprise.server.plugin.pc.content.RepoDetails;
+import org.rhq.enterprise.server.plugin.pc.content.SyncTracker;
+import org.rhq.enterprise.server.plugin.pc.content.ThreadUtil;
import org.rhq.enterprise.server.resource.ProductVersionManagerLocal;
import org.rhq.enterprise.server.util.LookupUtil;
@@ -710,7 +712,7 @@ public class ContentSourceManagerBean implements ContentSourceManagerLocal {
@RequiredPermission(Permission.MANAGE_INVENTORY)
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
@TransactionTimeout(45 * 60)
- public void downloadDistributionBits(Subject subject, ContentSource contentSource) {
+ public void downloadDistributionBits(Subject subject, Repo repo, ContentSource contentSource, SyncTracker tracker) {
try {
log.debug("downloadDistributionBits invoked");
DistributionManagerLocal distManager = LookupUtil.getDistributionManagerLocal();
@@ -735,48 +737,52 @@ public class ContentSourceManagerBean implements ContentSourceManagerLocal {
List<Repo> repos = repoManager.findReposByCriteria(overlord, reposForContentSource);
log.debug("downloadDistributionBits found " + repos.size() + " repos associated with this contentSourceId "
+ contentSourceId);
- for (Repo repo : repos) {
- log.debug("downloadDistributionBits operating on repo: " + repo.getName() + " id = " + repo.getId());
- // Look up Distributions associated with this ContentSource.
- PageControl pageControl = PageControl.getUnlimitedInstance();
- log.debug("Looking up existing distributions for repoId: " + repo.getId());
- List<Distribution> dists = repoManager.findAssociatedDistributions(overlord, repo.getId(), pageControl);
- log.debug("Found " + dists.size() + " Distributions for repoId " + repo.getId());
-
- for (Distribution dist : dists) {
- log.debug("Looking up DistributionFiles for dist: " + dist);
- List<DistributionFile> distFiles = distManager.getDistributionFilesByDistId(dist.getId());
- log.debug("Found " + distFiles.size() + " DistributionFiles");
- for (DistributionFile dFile : distFiles) {
- String relPath = dist.getBasePath() + "/" + dFile.getRelativeFilename();
- File outputFile = getDistLocalFileAndCreateParentDir(dist.getLabel(), relPath);
- log.debug("Checking if file exists at: " + outputFile.getAbsolutePath());
- if (outputFile.exists()) {
- log.debug("File " + outputFile.getAbsolutePath() + " exists, checking md5sum");
- String expectedMD5 = (dFile.getMd5sum() != null) ? dFile.getMd5sum() : "<unspecified MD5>";
- String actualMD5 = MessageDigestGenerator.getDigestString(outputFile);
- if (!expectedMD5.trim().toLowerCase().equals(actualMD5.toLowerCase())) {
- log.error("Expected [" + expectedMD5 + "] versus actual [" + actualMD5
- + "] md5sums for file " + outputFile.getAbsolutePath() + " do not match.");
- log.error("Need to re-fetch file. Will download from DistributionSource"
- + " and overwrite local file.");
- } else {
- log.info(outputFile + " exists and md5sum matches [" + actualMD5
- + "] no need to re-download");
- continue; // skip the download from bitsStream
- }
+ log.debug("downloadDistributionBits operating on repo: " + repo.getName() + " id = " + repo.getId());
+ // Look up Distributions associated with this ContentSource.
+ PageControl pageControl = PageControl.getUnlimitedInstance();
+ log.debug("Looking up existing distributions for repoId: " + repo.getId());
+ List<Distribution> dists = repoManager.findAssociatedDistributions(overlord, repo.getId(), pageControl);
+ log.debug("Found " + dists.size() + " Distributions for repoId " + repo.getId());
+ // ADD WORK
+ tracker.addWork(dists.size());
+ for (Distribution dist : dists) {
+ log.debug("Looking up DistributionFiles for dist: " + dist);
+ List<DistributionFile> distFiles = distManager.getDistributionFilesByDistId(dist.getId());
+ log.debug("Found " + distFiles.size() + " DistributionFiles");
+ for (DistributionFile dFile : distFiles) {
+ String relPath = dist.getBasePath() + "/" + dFile.getRelativeFilename();
+ File outputFile = getDistLocalFileAndCreateParentDir(dist.getLabel(), relPath);
+ log.debug("Checking if file exists at: " + outputFile.getAbsolutePath());
+ if (outputFile.exists()) {
+ log.debug("File " + outputFile.getAbsolutePath() + " exists, checking md5sum");
+ String expectedMD5 = (dFile.getMd5sum() != null) ? dFile.getMd5sum() : "<unspecified MD5>";
+ String actualMD5 = MessageDigestGenerator.getDigestString(outputFile);
+ if (!expectedMD5.trim().toLowerCase().equals(actualMD5.toLowerCase())) {
+ log.error("Expected [" + expectedMD5 + "] versus actual [" + actualMD5
+ + "] md5sums for file " + outputFile.getAbsolutePath() + " do not match.");
+ log.error("Need to re-fetch file. Will download from DistributionSource"
+ + " and overwrite local file.");
+ } else {
+ log.info(outputFile + " exists and md5sum matches [" + actualMD5
+ + "] no need to re-download");
+ continue; // skip the download from bitsStream
}
- log.debug("Attempting download of " + dFile.getRelativeFilename() + " from contentSourceId "
- + contentSourceId);
- String remoteFetchLoc = distSource.getDistFileRemoteLocation(repo.getName(), dist.getLabel(),
- dFile.getRelativeFilename());
- InputStream bitsStream = pc.getAdapterManager().loadDistributionFileBits(contentSourceId,
- remoteFetchLoc);
- StreamUtil.copy(bitsStream, new FileOutputStream(outputFile), true);
- bitsStream = null;
- log.debug("DistributionFile has been downloaded to: " + outputFile.getAbsolutePath());
}
+ log.debug("Attempting download of " + dFile.getRelativeFilename() + " from contentSourceId "
+ + contentSourceId);
+ String remoteFetchLoc = distSource.getDistFileRemoteLocation(repo.getName(), dist.getLabel(), dFile
+ .getRelativeFilename());
+ InputStream bitsStream = pc.getAdapterManager().loadDistributionFileBits(contentSourceId,
+ remoteFetchLoc);
+ StreamUtil.copy(bitsStream, new FileOutputStream(outputFile), true);
+ bitsStream = null;
+ log.debug("DistributionFile has been downloaded to: " + outputFile.getAbsolutePath());
+ // FINISH WORK
+ ThreadUtil.checkInterrupted();
}
+ tracker.finishWork(1);
+ tracker.persistResults();
+ ThreadUtil.checkInterrupted();
}
} catch (Throwable t) {
log.error(t);
@@ -1603,7 +1609,6 @@ public class ContentSourceManagerBean implements ContentSourceManagerLocal {
for (DistributionDetails doomedDetails : report.getDeletedDistributions()) {
Distribution doomedDist = distManager.getDistributionByLabel(doomedDetails.getLabel());
distManager.deleteDistributionByDistId(overlord, doomedDist.getId());
- distManager.deleteDistributionFilesByDistId(overlord, doomedDist.getId());
progress.append("Removed distribution & distribution files for: " + doomedDetails.getLabel());
syncResults.setResults(progress.toString());
syncResults = repoManager.mergeRepoSyncResults(syncResults);
@@ -1627,25 +1632,30 @@ public class ContentSourceManagerBean implements ContentSourceManagerLocal {
List<DistributionDetails> newDetails = report.getDistributions();
for (DistributionDetails detail : newDetails) {
try {
-
log.debug("Attempting to create new distribution based off of: " + detail);
DistributionType distType = distManager.getDistributionTypeByName(detail.getDistributionType());
- Distribution newDist = distManager.createDistribution(overlord, detail.getLabel(), detail
- .getDistributionPath(), distType);
- log.debug("Created new distribution: " + newDist);
- Repo repo = repoManager.getRepo(overlord, report.getRepoId());
- RepoDistribution repoDist = new RepoDistribution(repo, newDist);
- log.debug("Created new mapping of RepoDistribution repoId = " + repo.getId() + ", distId = "
- + newDist.getId());
- entityManager.persist(repoDist);
- List<DistributionFileDetails> files = detail.getFiles();
- for (DistributionFileDetails f : files) {
- log.debug("Creating DistributionFile for: " + f);
- DistributionFile df = new DistributionFile(newDist, f.getRelativeFilename(), f.getMd5sum());
- df.setLastModified(f.getLastModified());
- entityManager.persist(df);
- entityManager.flush();
+ Distribution distro = distManager.getDistributionByLabel(detail.getLabel());
+ if (distro == null) {
+ distro = distManager.createDistribution(overlord, detail.getLabel(), detail.getDistributionPath(),
+ distType);
+ log.debug("Created new distribution: " + distro);
+ Repo repo = repoManager.getRepo(overlord, report.getRepoId());
+ RepoDistribution repoDist = new RepoDistribution(repo, distro);
+ log.debug("Created new mapping of RepoDistribution repoId = " + repo.getId() + ", distId = "
+ + distro.getId());
+ entityManager.persist(repoDist);
+ List<DistributionFileDetails> files = detail.getFiles();
+ for (DistributionFileDetails f : files) {
+ log.debug("Creating DistributionFile for: " + f);
+ DistributionFile df = new DistributionFile(distro, f.getRelativeFilename(), f.getMd5sum());
+ df.setLastModified(f.getLastModified());
+ entityManager.persist(df);
+ entityManager.flush();
+ }
+ } else {
+ log.info("already created distro : " + detail);
}
+
} catch (DistributionException e) {
progress.append("Caught exception when trying to add: " + detail.getLabel() + "\n");
progress.append("Error is: " + e.getMessage());
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentSourceManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentSourceManagerLocal.java
index 6471f9b..8fff707 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentSourceManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentSourceManagerLocal.java
@@ -48,6 +48,7 @@ import org.rhq.enterprise.server.plugin.pc.content.ContentProviderPackageDetails
import org.rhq.enterprise.server.plugin.pc.content.DistributionSyncReport;
import org.rhq.enterprise.server.plugin.pc.content.PackageSyncReport;
import org.rhq.enterprise.server.plugin.pc.content.RepoDetails;
+import org.rhq.enterprise.server.plugin.pc.content.SyncTracker;
/**
* Interface that provides access to the {@link ContentSource} objects deployed in the server, allowing the callers to
@@ -308,9 +309,11 @@ public interface ContentSourceManagerLocal {
* This will download all the distribution bits associated with a specific content source.
*
* @param subject
+ * @param repo TODO
* @param contentSource
+ * @param tracker TODO
*/
- void downloadDistributionBits(Subject subject, ContentSource contentSource);
+ void downloadDistributionBits(Subject subject, Repo repo, ContentSource contentSource, SyncTracker tracker);
/**
* Given a {@link PackageVersionContentSource} which contains the ID of a content source, an ID of a package
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/DistributionManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/DistributionManagerBean.java
index e931267..ec4679a 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/DistributionManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/DistributionManagerBean.java
@@ -34,9 +34,9 @@ import org.apache.commons.logging.LogFactory;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.content.Distribution;
+import org.rhq.core.domain.content.DistributionFile;
import org.rhq.core.domain.content.DistributionType;
import org.rhq.core.domain.content.RepoDistribution;
-import org.rhq.core.domain.content.DistributionFile;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.authz.AuthorizationManagerLocal;
import org.rhq.enterprise.server.authz.RequiredPermission;
@@ -102,6 +102,11 @@ public class DistributionManagerBean implements DistributionManagerLocal, Distri
entityManager.flush();
entityManager.clear();
+ this.deleteDistributionFilesByDistId(user, distId);
+
+ entityManager.createNamedQuery(RepoDistribution.DELETE_BY_DISTRO_ID).setParameter("distId", distId)
+ .executeUpdate();
+
entityManager.createNamedQuery(Distribution.QUERY_DELETE_BY_DIST_ID).setParameter("distid", distId)
.executeUpdate();
@@ -170,8 +175,6 @@ public class DistributionManagerBean implements DistributionManagerLocal, Distri
}
-
-
/**
* Returns a list of available distribution files for requested distribution
* @param distId
@@ -199,22 +202,11 @@ public class DistributionManagerBean implements DistributionManagerLocal, Distri
public void deleteDistributionFilesByDistId(Subject user, int distId) {
log.debug("User [" + user + "] is deleting distribution file from distribution [" + distId + "]");
- entityManager.flush();
- entityManager.clear();
-
- Query querydel = entityManager.createNamedQuery(DistributionFile.SELECT_BY_DIST_ID);
+ Query querydel = entityManager.createNamedQuery(DistributionFile.DELETE_BY_DIST_ID);
querydel.setParameter("distId", distId);
querydel.executeUpdate();
-
- DistributionFile distFile = entityManager.find(DistributionFile.class, distId);
- if (distFile != null) {
- entityManager.remove(distFile);
- log.debug("User [" + user + "] deleted distribution file [" + distFile + "]");
- } else {
- log.debug("Distribution file [" + distFile + "] doesn't exist - nothing to delete");
- }
}
@RequiredPermission(Permission.MANAGE_INVENTORY)
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerBean.java
index 38e42dc..372d92c 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerBean.java
@@ -983,7 +983,7 @@ public class RepoManagerBean implements RepoManagerLocal, RepoManagerRemote {
return ((Long) countQuery.getSingleResult()).longValue();
}
- public String calculateSyncStatus(Subject subject, int repoId) {
+ public ContentSyncStatus calculateSyncStatus(Subject subject, int repoId) {
Repo found = this.getRepo(subject, repoId);
Set<ContentSyncStatus> stati = new HashSet<ContentSyncStatus>();
List<RepoSyncResults> syncResults = found.getSyncResults();
@@ -991,9 +991,9 @@ public class RepoManagerBean implements RepoManagerLocal, RepoManagerRemote {
int latestIndex = syncResults.size() - 1;
if (syncResults != null && (!syncResults.isEmpty()) && syncResults.get(latestIndex) != null) {
RepoSyncResults results = syncResults.get(latestIndex);
- return results.getStatus().toString();
+ return results.getStatus();
} else {
- return ContentSyncStatus.NONE.toString();
+ return ContentSyncStatus.NONE;
}
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerLocal.java
index aea0ef2..70fb709 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerLocal.java
@@ -25,6 +25,7 @@ import javax.ejb.Local;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.content.Advisory;
import org.rhq.core.domain.content.ContentSource;
+import org.rhq.core.domain.content.ContentSyncStatus;
import org.rhq.core.domain.content.Distribution;
import org.rhq.core.domain.content.PackageVersion;
import org.rhq.core.domain.content.Repo;
@@ -122,7 +123,7 @@ public interface RepoManagerLocal {
* @param repoId to calc status for
* @return String summary of the status of this Repository
*/
- String calculateSyncStatus(Subject subject, int repoId);
+ ContentSyncStatus calculateSyncStatus(Subject subject, int repoId);
/**
*/
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/AdvisorySource.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/AdvisorySource.java
index d3b05e3..a94b673 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/AdvisorySource.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/AdvisorySource.java
@@ -38,10 +38,11 @@ public interface AdvisorySource {
*
* @param repoName repo name used to look up advisory
* @param report used to accumulate the collection of advisory
+ * @param tracker used to assist with tracking the sync's progress
* @throws Exception if the source is unable to perform the synchronization, for instance if the external
* source cannot be connected to.
*/
- void synchronizeAdvisory(String repoName, AdvisorySyncReport report, Collection<AdvisoryDetails> existingAdvisory)
- throws SyncException, InterruptedException;
+ void synchronizeAdvisories(String repoName, AdvisorySyncReport report, Collection<AdvisoryDetails> existingAdvisory,
+ SyncTracker tracker) throws SyncException, InterruptedException;
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/ContentProviderManager.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/ContentProviderManager.java
index 0d02f04..60ad9d3 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/ContentProviderManager.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/ContentProviderManager.java
@@ -44,7 +44,6 @@ import org.rhq.core.domain.content.ContentSyncStatus;
import org.rhq.core.domain.content.Repo;
import org.rhq.core.domain.content.RepoSyncResults;
import org.rhq.core.domain.util.PageControl;
-import org.rhq.core.util.progresswatch.ProgressWatcher;
import org.rhq.enterprise.server.auth.SubjectManagerLocal;
import org.rhq.enterprise.server.content.ContentSourceManagerLocal;
import org.rhq.enterprise.server.content.RepoManagerLocal;
@@ -322,11 +321,12 @@ public class ContentProviderManager {
progress.append('\n');
progress.append(new Date()).append(": ");
progress.append("Getting currently known list of content source packages...");
- SyncTracker tracker = new SyncTracker(new RepoSyncResults(repo), new ProgressWatcher());
+ SyncTracker tracker = new SyncTracker(repoManager, new RepoSyncResults(repo));
+ tracker.start();
tracker.setResults(progress.toString());
- tracker.setRepoSyncResults(repoManager.persistRepoSyncResults(tracker.getRepoSyncResults()));
+ tracker.persistResults();
log.debug("synchronizeRepo :: inProgress");
- tracker = updatePercentComplete(tracker, repoManager);
+ tracker.persistResults();
if (tracker.getRepoSyncResults() == null) {
log.info("Repository [" + repo.getName()
@@ -338,6 +338,7 @@ public class ContentProviderManager {
try {
ThreadUtil.checkInterrupted();
// METADATA Loop
+ log.debug("Starting with Package Metadata: " + tracker.getPercentComplete());
for (ContentSource source : repo.getContentSources()) {
try {
ContentProvider provider = getIsolatedContentProvider(source.getId());
@@ -352,21 +353,11 @@ public class ContentProviderManager {
processSyncException(e, tracker, repo, source, repoManager);
}
}
+ log.debug("Done with Package Metadata: " + tracker.getPercentComplete());
+ tracker.resetToZero();
+ tracker.persistResults();
ThreadUtil.checkInterrupted();
- // Setup ProgressWatcher
- for (ContentSource source : repo.getContentSources()) {
- ContentProvider provider = getIsolatedContentProvider(source.getId());
- SyncProgressWeight sw = provider.getSyncProgressWeight();
- tracker.getProgressWatcher().addWork(sw.getPackageMetadataWeight());
- tracker.addAdvisoryMetadataWork(provider);
- tracker.getProgressWatcher().addWork(sw.getDistribtutionBitsWeight());
- tracker.getProgressWatcher().addWork(sw.getDistribtutionMetadataWeight());
- tracker.addPackageBitsWork(provider);
- tracker.getProgressWatcher().finishWork(sw.getPackageMetadataWeight());
- }
- tracker = updatePercentComplete(tracker, repoManager);
-
// PACKAGEBITS Loop
// Synchronize every content provider associated with the repo
for (ContentSource source : repo.getContentSources()) {
@@ -380,7 +371,7 @@ public class ContentProviderManager {
log.debug("synchronizeRepo :: synchronizePackageBits");
tracker = updateSyncStatus(tracker, ContentSyncStatus.PACKAGEBITS);
tracker = packageSourceSynchronizer.synchronizePackageBits(tracker, provider);
- tracker = updatePercentComplete(tracker, repoManager);
+ tracker.persistResults();
// Check to cancel after each contentsource
ThreadUtil.checkInterrupted();
@@ -388,6 +379,11 @@ public class ContentProviderManager {
processSyncException(e, tracker, repo, source, repoManager);
}
}
+ tracker.resetToZero();
+ tracker.persistResults();
+
+ // Treat the Distro Meta and Distro Bits as one step
+ // since the metadata isn't that long but bits are.
// Distro meta
for (ContentSource source : repo.getContentSources()) {
try {
@@ -398,7 +394,7 @@ public class ContentProviderManager {
log.debug("synchronizeRepo :: synchronizeDistributionMetadata");
tracker = updateSyncStatus(tracker, ContentSyncStatus.DISTROMETADATA);
tracker = distributionSourceSynchronizer.synchronizeDistributionMetadata(tracker);
- tracker = updatePercentComplete(tracker, repoManager);
+ tracker.persistResults();
ThreadUtil.checkInterrupted();
} catch (SyncException e) {
processSyncException(e, tracker, repo, source, repoManager);
@@ -415,13 +411,16 @@ public class ContentProviderManager {
log.debug("synchronizeRepo :: synchronizeDistributionBits");
tracker = updateSyncStatus(tracker, ContentSyncStatus.DISTROBITS);
tracker = distributionSourceSynchronizer.synchronizeDistributionBits(tracker);
- tracker = updatePercentComplete(tracker, repoManager);
+ tracker.persistResults();
ThreadUtil.checkInterrupted();
} catch (SyncException e) {
processSyncException(e, tracker, repo, source, repoManager);
}
}
+ tracker.resetToZero();
+ tracker.persistResults();
+ log.debug("Progressing to ERRATA: " + tracker.getPercentComplete());
// advisory meta
for (ContentSource source : repo.getContentSources()) {
try {
@@ -431,13 +430,13 @@ public class ContentProviderManager {
AdvisorySourceSynchronizer advisorySourcesync = new AdvisorySourceSynchronizer(repo, source,
provider);
tracker = advisorySourcesync.synchronizeAdvisoryMetadata(tracker);
- tracker = updatePercentComplete(tracker, repoManager);
+ tracker.persistResults();
ThreadUtil.checkInterrupted();
} catch (SyncException e) {
processSyncException(e, tracker, repo, source, repoManager);
}
}
-
+ log.debug("Done with ERRATA: " + tracker.getPercentComplete());
// Update status to finished.
progress = new StringBuilder();
progress.append("\n");
@@ -456,8 +455,8 @@ public class ContentProviderManager {
log.debug("Caught Exception: ", e);
progress.append("\n ** Cancelled syncing **");
tracker.setResults(progress.toString());
- tracker.getProgressWatcher().resetToZero();
- tracker = updatePercentComplete(tracker, repoManager);
+ tracker.resetToZero();
+ tracker.persistResults();
try {
tracker = updateSyncStatus(tracker, ContentSyncStatus.CANCELLED, false);
} catch (InterruptedException e1) {
@@ -482,15 +481,11 @@ public class ContentProviderManager {
}
- private SyncTracker updatePercentComplete(SyncTracker tracker, RepoManagerLocal repoManager) {
- tracker.getRepoSyncResults().setPercentComplete(new Long(tracker.getProgressWatcher().getPercentComplete()));
- tracker.setRepoSyncResults(repoManager.mergeRepoSyncResults(tracker.getRepoSyncResults()));
- return tracker;
- }
-
private SyncTracker processSyncException(Exception e, SyncTracker tracker, Repo repo, ContentSource source,
RepoManagerLocal repoManager) {
+ log.error("processSyncException", e);
+
StringBuilder progress = new StringBuilder();
log.error("Error while synchronizing repo [" + repo + "] with content provider [" + source
+ "]. Synchronization for the repo will continue for other providers.", e);
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/DistributionSource.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/DistributionSource.java
index e2cbc7c..985774a 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/DistributionSource.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/DistributionSource.java
@@ -38,11 +38,12 @@ public interface DistributionSource {
*
* @param repoName repo name used to look up distributions
* @param report used to accumulate the collection of distros
+ * @param tracker TODO
* @throws Exception if the source is unable to perform the synchronization, for instance if the external
* source cannot be connected to.
*/
- void synchronizeDistribution(String repoName, DistributionSyncReport report,
- Collection<DistributionDetails> existingDistros) throws SyncException, InterruptedException;
+ void synchronizeDistributions(String repoName, DistributionSyncReport report,
+ Collection<DistributionDetails> existingDistros, SyncTracker tracker) throws SyncException, InterruptedException;
/**
* Get an input stream for the specified distribution.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/PackageSource.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/PackageSource.java
index 33c66aa..4d8bb5f 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/PackageSource.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/PackageSource.java
@@ -44,11 +44,13 @@ public interface PackageSource {
* with the current state of the external package source.
* @param existingPackages collection of packages the server currently has in its inventory for this package
* source; used when determining package diff information for the report.
+ * @param tracker Responsible for tracking the progress of the sync
* @throws Exception if the package source is unable to perform the synchronization, for instance if the external
* source cannot be connected to.
*/
void synchronizePackages(String repoName, PackageSyncReport report,
- Collection<ContentProviderPackageDetails> existingPackages) throws SyncException, InterruptedException;
+ Collection<ContentProviderPackageDetails> existingPackages, SyncTracker tracker) throws SyncException,
+ InterruptedException;
/**
* Get an input stream for the specified package.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/SyncTracker.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/SyncTracker.java
index 67a5440..251d8d2 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/SyncTracker.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/SyncTracker.java
@@ -19,9 +19,12 @@
package org.rhq.enterprise.server.plugin.pc.content;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
import org.rhq.core.domain.content.ContentSyncStatus;
import org.rhq.core.domain.content.RepoSyncResults;
-import org.rhq.core.util.progresswatch.ProgressWatcher;
+import org.rhq.enterprise.server.content.RepoManagerLocal;
/**
* Container class to hold the classes required to track the progress of a ContentProvider Sync.
@@ -30,45 +33,47 @@ import org.rhq.core.util.progresswatch.ProgressWatcher;
*/
public class SyncTracker {
+ private final Log log = LogFactory.getLog(SyncTracker.class);
+
+ RepoManagerLocal repoManager;
private int repoId;
private RepoSyncResults repoSyncResults;
- private ProgressWatcher progressWatcher;
private int packageSyncCount;
+ private boolean started = false;
+ private int totalWork = -1;
+ private int finishedWork = -1;
+
/**
* @param repoSyncResults
* @param progressWatcher
*/
- public SyncTracker(RepoSyncResults repoSyncResultsIn, ProgressWatcher progressWatcherIn) {
+ public SyncTracker(RepoManagerLocal repoManagerIn, RepoSyncResults repoSyncResultsIn) {
super();
this.repoId = repoSyncResultsIn.getRepo().getId();
this.repoSyncResults = repoSyncResultsIn;
- this.progressWatcher = progressWatcherIn;
- this.progressWatcher.start();
+ this.repoManager = repoManagerIn;
}
- public void addAdvisoryMetadataWork(ContentProvider provider) {
+ public void addPackageBitsWork(ContentProvider provider) {
SyncProgressWeight sw = provider.getSyncProgressWeight();
- if (this.getPackageSyncCount() == 0) {
- this.getProgressWatcher().addWork(sw.getAdvisoryWeight() * 10);
- } else {
- this.getProgressWatcher().addWork(sw.getAdvisoryWeight() * this.getPackageSyncCount());
- }
+ this.addWork(sw.getPackageBitsWeight() * this.getPackageSyncCount());
+ }
+ public void finishPackageBitsWork(ContentProvider provider) {
+ SyncProgressWeight sw = provider.getSyncProgressWeight();
+ this.finishWork(sw.getPackageBitsWeight() * this.getPackageSyncCount());
}
- public void finishAdvisoryMetadataWork(ContentProvider provider) {
- if (this.getPackageSyncCount() == 0) {
- this.getProgressWatcher().finishWork(provider.getSyncProgressWeight().getAdvisoryWeight() * 10);
- } else {
- this.getProgressWatcher().finishWork(
- provider.getSyncProgressWeight().getAdvisoryWeight() * this.getPackageSyncCount());
- }
+ public void addDistroMetadataWork(int distCount, ContentProvider provider) {
+ SyncProgressWeight sw = provider.getSyncProgressWeight();
+ this.addWork(sw.getDistribtutionMetadataWeight() * distCount);
}
- public void addPackageBitsWork(ContentProvider provider) {
+ public void finishDistroMetadataWork(int distCount, ContentProvider provider) {
SyncProgressWeight sw = provider.getSyncProgressWeight();
- this.getProgressWatcher().addWork(sw.getPackageBitsWeight() * this.getPackageSyncCount());
+ this.finishWork(sw.getDistribtutionMetadataWeight() * distCount);
+
}
/**
@@ -79,13 +84,6 @@ public class SyncTracker {
}
/**
- * @return the progressWatcher
- */
- public ProgressWatcher getProgressWatcher() {
- return progressWatcher;
- }
-
- /**
* Set the RepoSyncResults
* @param syncResultsIn
*/
@@ -132,7 +130,94 @@ public class SyncTracker {
* @return int repoId
*/
public int getRepoId() {
-
return this.repoId;
}
+
+ /**
+ * Store the percentage complete to the database
+ *
+ */
+ public void persistResults() {
+ repoSyncResults.setPercentComplete(new Long(this.getPercentComplete()));
+ this.setRepoSyncResults(repoManager.mergeRepoSyncResults(repoSyncResults));
+ }
+
+ /**
+ * Start watching the progress of a given amount of work.
+ */
+ public void start() {
+ totalWork = 0;
+ finishedWork = 0;
+ started = true;
+ }
+
+ /**
+ * Get the percentage complete of the total work specified.
+ * @return float 0-100% of the amount of work copleted. integer so no decimal points.
+ * @throws IllegalStateException if this ProgressWatcher has not been started yet.
+ */
+ public int getPercentComplete() throws IllegalStateException {
+ if (!started) {
+ throw new IllegalStateException(this.getClass().getSimpleName()
+ + " not started yet. call start() to set progress to 0 and start watching.");
+ }
+ if (totalWork == 0) {
+ return 0;
+ } else {
+ float percentComp = (((float) finishedWork / (float) totalWork) * 100);
+ return (int) percentComp;
+ }
+
+ }
+
+ /**
+ * Set the total amount of work to be completed.
+ *
+ * @param totalWorkIn to set.
+ */
+ public void setTotalWork(int totalWorkIn) {
+ this.totalWork = totalWorkIn;
+ }
+
+ /**
+ * Add a unit of work to be completed.
+ *
+ * @param workToAdd
+ */
+ public void addWork(int workToAdd) {
+ totalWork = totalWork + workToAdd;
+ log.debug(" addWork() - ADD : " + workToAdd + " Total work: [" + totalWork + "] Finished work: "
+ + finishedWork);
+ }
+
+ /**
+ * Indicate that a # of work units has been completed.
+ *
+ * @param workToRemove
+ */
+ public void finishWork(int workToRemove) {
+ if (!started) {
+ throw new IllegalStateException(this.getClass().getSimpleName()
+ + " not started yet. call start() to set progress to 0 and start watching.");
+ }
+ finishedWork += workToRemove;
+ log.debug(" finishWork() - REM: " + workToRemove + " Total work: [" + totalWork + "] Finished work: "
+ + finishedWork);
+ }
+
+ /**
+ * Indicate this ProgressWatcher is finished watching.
+ */
+ public void stop() {
+ this.started = false;
+ }
+
+ /**
+ * Reset the ProgressWatcher to zero.
+ */
+ public void resetToZero() {
+ stop();
+ start();
+ }
+
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/sync/AdvisorySourceSynchronizer.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/sync/AdvisorySourceSynchronizer.java
index 68df9c3..130703b 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/sync/AdvisorySourceSynchronizer.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/sync/AdvisorySourceSynchronizer.java
@@ -113,7 +113,7 @@ public class AdvisorySourceSynchronizer {
// --------------------------------------------
start = System.currentTimeMillis();
- advisorySource.synchronizeAdvisory(repo.getName(), advReport, advDetails);
+ advisorySource.synchronizeAdvisories(repo.getName(), advReport, advDetails, tracker);
ThreadUtil.checkInterrupted();
log.error("Synchronize Advisory: [" + source.getName() + "]: got sync report from adapter=[" + advReport
@@ -127,7 +127,6 @@ public class AdvisorySourceSynchronizer {
+ (System.currentTimeMillis() - start) + ")ms");
tracker.setRepoSyncResults(syncResults);
- tracker.finishAdvisoryMetadataWork(provider);
return tracker;
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/sync/DistributionSourceSynchronizer.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/sync/DistributionSourceSynchronizer.java
index e5dfd67..b74ab30 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/sync/DistributionSourceSynchronizer.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/sync/DistributionSourceSynchronizer.java
@@ -94,6 +94,9 @@ public class DistributionSourceSynchronizer {
PageControl pc = PageControl.getUnlimitedInstance();
Subject overlord = subjectManager.getOverlord();
List<Distribution> dists = repoManager.findAssociatedDistributions(overlord, repo.getId(), pc);
+ // ADD WORK
+ tracker.addDistroMetadataWork(dists.size(), provider);
+
log.debug("Found " + dists.size() + " distributions for repo " + repo.getId());
DistributionSyncReport distReport = new DistributionSyncReport(repo.getId());
@@ -107,7 +110,7 @@ public class DistributionSourceSynchronizer {
// --------------------------------------------
start = System.currentTimeMillis();
- distributionSource.synchronizeDistribution(repo.getName(), distReport, distDetails);
+ distributionSource.synchronizeDistributions(repo.getName(), distReport, distDetails, tracker);
log.info("Synchronize Distributions: [" + repo.getName() + "]: got sync report from adapter=[" + distReport
+ "] (" + (System.currentTimeMillis() - start) + ")ms");
@@ -115,7 +118,8 @@ public class DistributionSourceSynchronizer {
RepoSyncResults syncResults = contentSourceManager.mergeDistributionSyncReport(source, distReport, tracker
.getRepoSyncResults());
tracker.setRepoSyncResults(syncResults);
- tracker.getProgressWatcher().finishWork(provider.getSyncProgressWeight().getDistribtutionBitsWeight());
+ // FINISH WORK
+ tracker.finishDistroMetadataWork(dists.size(), provider);
return tracker;
}
@@ -128,10 +132,10 @@ public class DistributionSourceSynchronizer {
tracker.getRepoSyncResults().appendResults(
"Synchronize Distributions: [" + repo.getName() + " Starting Distribution bits download.");
tracker.setRepoSyncResults(repoManager.mergeRepoSyncResults(tracker.getRepoSyncResults()));
- contentSourceManager.downloadDistributionBits(overlord, source);
+ contentSourceManager.downloadDistributionBits(overlord, repo, source, tracker);
tracker.getRepoSyncResults().appendResults(
"Synchronize Distributions: [" + repo.getName() + " finished bits download.");
- tracker.getProgressWatcher().finishWork(provider.getSyncProgressWeight().getDistribtutionBitsWeight());
+ tracker.finishWork(provider.getSyncProgressWeight().getDistribtutionBitsWeight());
return tracker;
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/sync/PackageSourceSynchronizer.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/sync/PackageSourceSynchronizer.java
index d4fd03f..f51d830 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/sync/PackageSourceSynchronizer.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/sync/PackageSourceSynchronizer.java
@@ -116,7 +116,7 @@ public class PackageSourceSynchronizer {
start = System.currentTimeMillis();
PackageSyncReport report = new PackageSyncReport();
- packageSource.synchronizePackages(repo.getName(), report, allDetails);
+ packageSource.synchronizePackages(repo.getName(), report, allDetails, tracker);
tracker.setPackageSyncCount(report.getNewPackages().size() + report.getUpdatedPackages().size());
log.info("Synchronize Packages: [" + source.getName() + "]: got sync report from adapter=[" + report + "] ("
@@ -137,6 +137,7 @@ public class PackageSourceSynchronizer {
public SyncTracker synchronizePackageBits(SyncTracker tracker, ContentProvider provider)
throws InterruptedException, SyncException {
SyncProgressWeight sw = provider.getSyncProgressWeight();
+ tracker.addPackageBitsWork(provider);
// Determine if the sync even needs to take place
if (!(provider instanceof PackageSource)) {
@@ -149,7 +150,7 @@ public class PackageSourceSynchronizer {
log.info(msg);
tracker.getRepoSyncResults().appendResults(msg);
tracker.setRepoSyncResults(repoManager.mergeRepoSyncResults(tracker.getRepoSyncResults()));
- tracker.getProgressWatcher().finishWork(sw.getPackageBitsWeight() * tracker.getPackageSyncCount());
+ tracker.finishPackageBitsWork(provider);
return tracker;
}
@@ -159,7 +160,7 @@ public class PackageSourceSynchronizer {
log.info(msg);
tracker.getRepoSyncResults().appendResults(msg);
tracker.setRepoSyncResults(repoManager.mergeRepoSyncResults(tracker.getRepoSyncResults()));
- tracker.getProgressWatcher().finishWork(sw.getPackageBitsWeight() * tracker.getPackageSyncCount());
+ tracker.finishPackageBitsWork(provider);
return tracker;
}
@@ -201,10 +202,8 @@ public class PackageSourceSynchronizer {
contentSourceManager.downloadPackageBits(overlord, item);
// Tick off each package as completed work
- tracker.getProgressWatcher().finishWork(sw.getPackageBitsWeight() * 1);
- tracker.getRepoSyncResults().setPercentComplete(
- new Long(tracker.getProgressWatcher().getPercentComplete()));
- tracker.setRepoSyncResults(repoManager.mergeRepoSyncResults(tracker.getRepoSyncResults()));
+ tracker.finishWork(sw.getPackageBitsWeight() * 1);
+ tracker.persistResults();
} catch (Exception e) {
String errorMsg = "Failed to load package bits for package version [" + pk.getPackageVersion()
+ "] from content source [" + pk.getContentSource() + "] at location [" + item.getLocation() + "]."
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/content/test/DistributionManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/content/test/DistributionManagerBeanTest.java
index e24f39c..a8241b2 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/content/test/DistributionManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/content/test/DistributionManagerBeanTest.java
@@ -14,6 +14,8 @@ import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.content.Distribution;
import org.rhq.core.domain.content.DistributionFile;
import org.rhq.core.domain.content.DistributionType;
+import org.rhq.core.domain.content.Repo;
+import org.rhq.core.domain.content.RepoDistribution;
import org.rhq.enterprise.server.content.DistributionManagerLocal;
import org.rhq.enterprise.server.test.AbstractEJB3Test;
import org.rhq.enterprise.server.util.LookupUtil;
@@ -22,7 +24,7 @@ import org.rhq.enterprise.server.util.LookupUtil;
* @author Pradeep Kilambi
*/
public class DistributionManagerBeanTest extends AbstractEJB3Test {
- private final static boolean ENABLED = true;
+ private final static boolean ENABLED = false;
private DistributionManagerLocal distManager;
private DistributionType distType;
private Subject overlord;
@@ -63,6 +65,35 @@ public class DistributionManagerBeanTest extends AbstractEJB3Test {
assert distro == null;
}
+ @Test(enabled = true)
+ public void createDeleteDistributionWithRepo() throws Exception {
+ EntityManager em = getEntityManager();
+ String kslabel = "testCreateDeleteRepo";
+ String kspath = "/tmp";
+ Distribution distro = new Distribution();
+ distro.setDistributionType(distType);
+ distro.setLabel(kslabel);
+ distro.setBasePath(kspath);
+ em.persist(distro);
+ em.flush();
+
+ Repo repo = new Repo();
+ repo.setName("TestCreateDeleteWithDistro");
+ em.persist(repo);
+ em.flush();
+ RepoDistribution repoDist = new RepoDistribution(repo, distro);
+ em.persist(repoDist);
+
+ DistributionFile file = new DistributionFile(distro, "/tmp/foo.txt", "");
+ em.persist(file);
+
+ em.flush();
+
+ distManager.deleteDistributionByDistId(overlord, distro.getId());
+ distro = distManager.getDistributionByLabel(kslabel);
+ assert distro == null;
+ }
+
public void testDistributionFiles() throws Exception {
String kslabel = "testCreateDeleteRepo";
String kspath = "/tmp";
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/plugin/pc/content/SyncTrackerTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/plugin/pc/content/SyncTrackerTest.java
new file mode 100644
index 0000000..66320f5
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/plugin/pc/content/SyncTrackerTest.java
@@ -0,0 +1,79 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 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 as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * 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 for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.server.plugin.pc.content;
+
+import junit.framework.TestCase;
+
+import org.rhq.core.domain.content.Repo;
+import org.rhq.core.domain.content.RepoSyncResults;
+
+public class SyncTrackerTest extends TestCase {
+
+ Repo repo;
+ RepoSyncResults results;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ repo = new Repo();
+ repo.setId(1);
+ results = new RepoSyncResults(repo);
+ }
+
+ public void testProgressWatcher() {
+
+ SyncTracker pw = new SyncTracker(null, results);
+ boolean failed = false;
+ try {
+ pw.getPercentComplete();
+ } catch (IllegalStateException e) {
+ failed = true;
+ }
+ assertTrue(failed);
+
+ pw.start();
+ assertTrue(pw.getPercentComplete() == 0);
+ for (int i = 0; i < 5; i++) {
+ pw.addWork(100);
+ }
+ pw.finishWork(500);
+ assertTrue(pw.getPercentComplete() == 100);
+
+ }
+
+ // Check to make sure we don't lose precision as we divide by close numbers
+ public void test98Percent() {
+ SyncTracker pw = new SyncTracker(null, results);
+ pw.start();
+ pw.setTotalWork(102);
+ pw.finishWork(100);
+ assertTrue(pw.getPercentComplete() == 98);
+ }
+
+ public void testResetToZero() {
+ SyncTracker pw = new SyncTracker(null, results);
+ pw.start();
+ pw.setTotalWork(102);
+ pw.finishWork(100);
+ pw.resetToZero();
+ assertTrue(pw.getPercentComplete() == 0);
+
+ }
+
+}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/plugin/pc/content/TestContentProvider.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/plugin/pc/content/TestContentProvider.java
index fc9fb63..716f0df 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/plugin/pc/content/TestContentProvider.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/plugin/pc/content/TestContentProvider.java
@@ -15,7 +15,7 @@ public class TestContentProvider implements ContentProvider, PackageSource, Repo
/**
* Packages returned in a call to
- * {@link #synchronizePackages(String, PackageSyncReport, Collection)} will
+ * {@link #synchronizePackages(String, PackageSyncReport, Collection, SyncTracker)} will
* indicate they are of this type. Any test attempting to call this
* synchronize method should be sure to create a package type of this name
* in the database prior to calling it.
@@ -53,7 +53,7 @@ public class TestContentProvider implements ContentProvider, PackageSource, Repo
/**
* Collection of packages that will be returned from calling
- * {@link #synchronizePackages(String, PackageSyncReport, Collection)}
+ * {@link #synchronizePackages(String, PackageSyncReport, Collection, SyncTracker)}
* passing in a repo with the name {@link #REPO_WITH_PACKAGES}.
*/
public static final Map<ContentProviderPackageDetailsKey, ContentProviderPackageDetails> PACKAGES = new HashMap<ContentProviderPackageDetailsKey, ContentProviderPackageDetails>(
@@ -135,7 +135,7 @@ public class TestContentProvider implements ContentProvider, PackageSource, Repo
/**
* Holds a list of all repo names that were passed into calls to
- * {@link #synchronizePackages(String, PackageSyncReport, Collection)} to
+ * {@link #synchronizePackages(String, PackageSyncReport, Collection, SyncTracker)} to
* track when and with what data these calls are made.
*/
private List<String> logSynchronizePackagesRepos = new ArrayList<String>();
@@ -148,7 +148,7 @@ public class TestContentProvider implements ContentProvider, PackageSource, Repo
/**
* Holds a list of all repo names that were passed into calls to
- * {@link #synchronizeDistribution(String, DistributionSyncReport, Collection)}
+ * {@link #synchronizeDistributions(String, DistributionSyncReport, Collection, SyncTracker)}
* .
*/
private List<String> logSynchronizeDistroRepos = new ArrayList<String>();
@@ -209,7 +209,7 @@ public class TestContentProvider implements ContentProvider, PackageSource, Repo
}
public void synchronizePackages(String repoName, PackageSyncReport report,
- Collection<ContentProviderPackageDetails> existingPackages) throws SyncException, InterruptedException {
+ Collection<ContentProviderPackageDetails> existingPackages, SyncTracker tracker) throws SyncException, InterruptedException {
logSynchronizePackagesRepos.add(repoName);
@@ -249,8 +249,8 @@ public class TestContentProvider implements ContentProvider, PackageSource, Repo
return bis;
}
- public void synchronizeDistribution(String repoName, DistributionSyncReport report,
- Collection<DistributionDetails> existingDistros) throws SyncException, InterruptedException {
+ public void synchronizeDistributions(String repoName, DistributionSyncReport report,
+ Collection<DistributionDetails> existingDistros, SyncTracker tracker) throws SyncException, InterruptedException {
logSynchronizeDistroRepos.add(repoName);
@@ -284,7 +284,7 @@ public class TestContentProvider implements ContentProvider, PackageSource, Repo
/**
* Returns a list of repo names that were used to all calls to
- * {@link #synchronizePackages(String, PackageSyncReport, Collection)}
+ * {@link #synchronizePackages(String, PackageSyncReport, Collection, SyncTracker)}
* either since the creation of this instance or the last call to
* {@link #reset()}.
*
diff --git a/modules/enterprise/server/plugins/disk/src/main/java/org/rhq/enterprise/server/plugins/disk/DiskSource.java b/modules/enterprise/server/plugins/disk/src/main/java/org/rhq/enterprise/server/plugins/disk/DiskSource.java
index 3155976..c27b46f 100644
--- a/modules/enterprise/server/plugins/disk/src/main/java/org/rhq/enterprise/server/plugins/disk/DiskSource.java
+++ b/modules/enterprise/server/plugins/disk/src/main/java/org/rhq/enterprise/server/plugins/disk/DiskSource.java
@@ -45,6 +45,7 @@ import org.rhq.enterprise.server.plugin.pc.content.RepoImportReport;
import org.rhq.enterprise.server.plugin.pc.content.RepoSource;
import org.rhq.enterprise.server.plugin.pc.content.SyncException;
import org.rhq.enterprise.server.plugin.pc.content.SyncProgressWeight;
+import org.rhq.enterprise.server.plugin.pc.content.SyncTracker;
/**
* This is the most basic <i>reference</i> implementation of a content source. It provides primative package
@@ -119,7 +120,7 @@ public class DiskSource implements ContentProvider, PackageSource, RepoSource {
}
public void synchronizePackages(String repoName, PackageSyncReport report,
- Collection<ContentProviderPackageDetails> existingPackages) throws SyncException, InterruptedException {
+ Collection<ContentProviderPackageDetails> existingPackages, SyncTracker tracker) throws SyncException, InterruptedException {
if (!isPackageSource) {
return;
diff --git a/modules/enterprise/server/plugins/jboss-software/src/main/java/org/rhq/enterprise/server/plugins/jboss/software/JBossSoftwareContentSourceAdapter.java b/modules/enterprise/server/plugins/jboss-software/src/main/java/org/rhq/enterprise/server/plugins/jboss/software/JBossSoftwareContentSourceAdapter.java
index 90a0d30..5c15385 100644
--- a/modules/enterprise/server/plugins/jboss-software/src/main/java/org/rhq/enterprise/server/plugins/jboss/software/JBossSoftwareContentSourceAdapter.java
+++ b/modules/enterprise/server/plugins/jboss-software/src/main/java/org/rhq/enterprise/server/plugins/jboss/software/JBossSoftwareContentSourceAdapter.java
@@ -46,6 +46,7 @@ import org.rhq.enterprise.server.plugin.pc.content.PackageSource;
import org.rhq.enterprise.server.plugin.pc.content.PackageSyncReport;
import org.rhq.enterprise.server.plugin.pc.content.SyncException;
import org.rhq.enterprise.server.plugin.pc.content.SyncProgressWeight;
+import org.rhq.enterprise.server.plugin.pc.content.SyncTracker;
/**
* Hook into the server to field requests on JBoss software related packages.
@@ -65,7 +66,7 @@ public class JBossSoftwareContentSourceAdapter implements ContentProvider, Packa
/**
* Indicates if the feed parsing should be performed. This check is only done at the call to
- * {@link #synchronizePackages(String, PackageSyncReport, Collection)}. This flag is not used in the
+ * {@link #synchronizePackages(String, PackageSyncReport, Collection, SyncTracker)}. This flag is not used in the
* call to {@link #getInputStream(String)}; it only refers to the feed retrieval and parsing. If you managed to
* get the patches into the system prior to deactivating this content source, you will still be able to
* retrieve the bits for them.
@@ -115,7 +116,7 @@ public class JBossSoftwareContentSourceAdapter implements ContentProvider, Packa
}
public void synchronizePackages(String repoName, PackageSyncReport report,
- Collection<ContentProviderPackageDetails> existingPackages) throws SyncException, InterruptedException {
+ Collection<ContentProviderPackageDetails> existingPackages, SyncTracker tracker) throws SyncException, InterruptedException {
if (!active)
return;
diff --git a/modules/enterprise/server/plugins/jboss-software/src/test/java/org/rhq/enterprise/server/plugins/jboss/software/test/JBossSoftwareContentSourceAdapterLiveTest.java b/modules/enterprise/server/plugins/jboss-software/src/test/java/org/rhq/enterprise/server/plugins/jboss/software/test/JBossSoftwareContentSourceAdapterLiveTest.java
index d96da12..b7a164e 100644
--- a/modules/enterprise/server/plugins/jboss-software/src/test/java/org/rhq/enterprise/server/plugins/jboss/software/test/JBossSoftwareContentSourceAdapterLiveTest.java
+++ b/modules/enterprise/server/plugins/jboss-software/src/test/java/org/rhq/enterprise/server/plugins/jboss/software/test/JBossSoftwareContentSourceAdapterLiveTest.java
@@ -85,7 +85,7 @@ public class JBossSoftwareContentSourceAdapterLiveTest {
// Test
PackageSyncReport report = new PackageSyncReport();
- adapter.synchronizePackages(null, report, null);
+ adapter.synchronizePackages(null, report, null, null);
// Verify
assert report.getNewPackages().size() > 0 : "No packages were parsed from the live feed";
@@ -128,7 +128,7 @@ public class JBossSoftwareContentSourceAdapterLiveTest {
// Test
PackageSyncReport report = new PackageSyncReport();
- adapter.synchronizePackages(null, report, null);
+ adapter.synchronizePackages(null, report, null, null);
// Verify
assert report.getNewPackages().size() > 0 : "No packages were parsed from the live feed";
@@ -145,7 +145,7 @@ public class JBossSoftwareContentSourceAdapterLiveTest {
// Test
PackageSyncReport report = new PackageSyncReport();
- adapter.synchronizePackages(null, report, null);
+ adapter.synchronizePackages(null, report, null, null);
// Verify
assert report.getNewPackages().size() > 0 : "No packages were parsed from the live feed";
@@ -166,7 +166,7 @@ public class JBossSoftwareContentSourceAdapterLiveTest {
PackageSyncReport report = new PackageSyncReport();
try {
- adapter.synchronizePackages(null, report, null);
+ adapter.synchronizePackages(null, report, null, null);
}
catch (Exception e) {
assert e.getMessage().toLowerCase().contains("invalid login") :
@@ -188,7 +188,7 @@ public class JBossSoftwareContentSourceAdapterLiveTest {
PackageSyncReport report = new PackageSyncReport();
try {
- adapter.synchronizePackages(null, report, null);
+ adapter.synchronizePackages(null, report, null, null);
}
catch (Exception e) {
assert e.getMessage().toLowerCase().contains("not find the feed") :
diff --git a/modules/enterprise/server/plugins/rhnhosted/src/main/java/org/rhq/enterprise/server/plugins/rhnhosted/RHNHelper.java b/modules/enterprise/server/plugins/rhnhosted/src/main/java/org/rhq/enterprise/server/plugins/rhnhosted/RHNHelper.java
index 0b4ef51..17d3009 100644
--- a/modules/enterprise/server/plugins/rhnhosted/src/main/java/org/rhq/enterprise/server/plugins/rhnhosted/RHNHelper.java
+++ b/modules/enterprise/server/plugins/rhnhosted/src/main/java/org/rhq/enterprise/server/plugins/rhnhosted/RHNHelper.java
@@ -40,6 +40,7 @@ import org.rhq.enterprise.server.plugin.pc.content.ContentProviderPackageDetails
import org.rhq.enterprise.server.plugin.pc.content.ContentProviderPackageDetailsKey;
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.SyncTracker;
import org.rhq.enterprise.server.plugin.pc.content.ThreadUtil;
import org.rhq.enterprise.server.plugins.rhnhosted.xml.RhnChannelFamilyType;
import org.rhq.enterprise.server.plugins.rhnhosted.xml.RhnChannelType;
@@ -85,7 +86,8 @@ public class RHNHelper {
return this.rhndata.checkSystemId(systemId);
}
- public List<DistributionDetails> getDistributionMetaData(List<String> labels) throws IOException, XmlRpcException {
+ public List<DistributionDetails> getDistributionMetaData(List<String> labels, SyncTracker tracker)
+ throws IOException, XmlRpcException {
log.debug("getDistributionMetaData(" + labels + " invoked");
List<DistributionDetails> distros = new ArrayList<DistributionDetails>();
@@ -115,74 +117,77 @@ public class RHNHelper {
return distros;
}
- public List<AdvisoryDetails> getAdvisoryMetadata(List<String> advisoryList, String repoName)
+ public List<AdvisoryDetails> getAdvisoryMetadata(List<String> advisoryList, String repoName, SyncTracker tracker)
throws XmlRpcException, IOException, InterruptedException {
List<AdvisoryDetails> erratadetails = new ArrayList<AdvisoryDetails>();
- List<RhnErratumType> errata = rhndata.getErrataMetadata(this.systemid, advisoryList);
- for (RhnErratumType erratum : errata) {
- ThreadUtil.checkInterrupted();
- log.debug("Forming AdvisoryDetails(" + erratum.getAdvisory());
- AdvisoryDetails details = new AdvisoryDetails(erratum.getAdvisory(), erratum.getRhnErratumAdvisoryType(),
- erratum.getRhnErratumSynopsis());
- details.setDescription(erratum.getRhnErratumDescription());
- details.setSolution(erratum.getRhnErratumSolution());
- details.setTopic(erratum.getRhnErratumTopic());
- details.setIssue_date(getLongForDate(erratum.getRhnErratumIssueDate()));
- details.setUpdate_date(getLongForDate(erratum.getRhnErratumUpdateDate()));
- details.setAdvisory_name(erratum.getRhnErratumAdvisoryName());
- details.setAdvisory_rel(erratum.getRhnErratumAdvisoryRel());
- String cvestr = erratum.getCveNames();
- String[] cves = cvestr.split(" ");
- log.debug("list of cves " + cvestr + cves.toString());
-
- for (String cve : cves) {
- if (log.isDebugEnabled()) {
- log.debug("RHNHelper::getAdvisoryMetaData<Advisory=" + erratum.getAdvisory() + "> CVEs<" + cve
- + ">");
- }
- AdvisoryCVEDetails acve = new AdvisoryCVEDetails(cve);
- details.addCVE(acve);
- }
-
- List<RhnErratumBugType> ebugs = erratum.getRhnErratumBugs().getRhnErratumBug();
-
- if (ebugs != null) {
- for (RhnErratumBugType ebug : ebugs) {
+ // ADD WORK
+ tracker.addWork(advisoryList.size());
+ tracker.persistResults();
+ for (int i = 0; i < advisoryList.size(); i++) {
+ String[] advisory = { advisoryList.get(i) };
+ List<RhnErratumType> errata = rhndata.getErrataMetadata(this.systemid, Arrays.asList(advisory));
+ for (RhnErratumType erratum : errata) {
+ ThreadUtil.checkInterrupted();
+ log.debug("Forming AdvisoryDetails(" + erratum.getAdvisory());
+ AdvisoryDetails details = new AdvisoryDetails(erratum.getAdvisory(), erratum
+ .getRhnErratumAdvisoryType(), erratum.getRhnErratumSynopsis());
+ details.setDescription(erratum.getRhnErratumDescription());
+ details.setSolution(erratum.getRhnErratumSolution());
+ details.setTopic(erratum.getRhnErratumTopic());
+ details.setIssue_date(getLongForDate(erratum.getRhnErratumIssueDate()));
+ details.setUpdate_date(getLongForDate(erratum.getRhnErratumUpdateDate()));
+ details.setAdvisory_name(erratum.getRhnErratumAdvisoryName());
+ details.setAdvisory_rel(erratum.getRhnErratumAdvisoryRel());
+ String cvestr = erratum.getCveNames();
+ String[] cves = cvestr.split(" ");
+ log.debug("list of cves " + cvestr + cves.toString());
+
+ for (String cve : cves) {
if (log.isDebugEnabled()) {
- log.debug("RHNHelper::getAdvisoryMetaData<Advisory=" + erratum.getAdvisory() + "> Bugs<" + ebug
+ log.debug("RHNHelper::getAdvisoryMetaData<Advisory=" + erratum.getAdvisory() + "> CVEs<" + cve
+ ">");
}
- AdvisoryBugDetails dbug = new AdvisoryBugDetails(ebug.getRhnErratumBugId());
- details.addBug(dbug);
+ AdvisoryCVEDetails acve = new AdvisoryCVEDetails(cve);
+ details.addCVE(acve);
}
- }
- String pkgs = erratum.getPackages();
- String[] pkgIds = pkgs.split(" ");
+ List<RhnErratumBugType> ebugs = erratum.getRhnErratumBugs().getRhnErratumBug();
- //try {
- List<AdvisoryPackageDetails> apkgdetails = new ArrayList<AdvisoryPackageDetails>();
- List<RhnPackageType> pkgdetails = rhndata.getPackageMetadata(this.systemid, Arrays.asList(pkgIds));
- for (RhnPackageType pkgd : pkgdetails) {
- if (log.isDebugEnabled()) {
- log.debug("RHNHelper::getAdvisoryMetaData<Advisory=" + erratum.getAdvisory() + "> Package<" + pkgd
- + ">");
+ if (ebugs != null) {
+ for (RhnErratumBugType ebug : ebugs) {
+ if (log.isDebugEnabled()) {
+ log.debug("RHNHelper::getAdvisoryMetaData<Advisory=" + erratum.getAdvisory() + "> Bugs<"
+ + ebug + ">");
+ }
+ AdvisoryBugDetails dbug = new AdvisoryBugDetails(ebug.getRhnErratumBugId());
+ details.addBug(dbug);
+ }
}
- String name = pkgd.getName();
- String version = pkgd.getVersion();
- String arch = pkgd.getPackageArch();
- String release = pkgd.getRelease();
- String rpmname = constructRpmDisplayName(name, version, release, arch);
- AdvisoryPackageDetails apkgd = new AdvisoryPackageDetails(name, version, arch, rpmname);
- apkgdetails.add(apkgd);
- }
- details.addPkgs(apkgdetails);
- //} catch (Exception e) {
- // e.printStackTrace();
- // }
+ String pkgs = erratum.getPackages();
+ String[] pkgIds = pkgs.split(" ");
- erratadetails.add(details);
+ List<AdvisoryPackageDetails> apkgdetails = new ArrayList<AdvisoryPackageDetails>();
+ List<RhnPackageType> pkgdetails = rhndata.getPackageMetadata(this.systemid, Arrays.asList(pkgIds));
+ for (RhnPackageType pkgd : pkgdetails) {
+ if (log.isDebugEnabled()) {
+ log.debug("RHNHelper::getAdvisoryMetaData<Advisory=" + erratum.getAdvisory() + "> Package<"
+ + pkgd + ">");
+ }
+ String name = pkgd.getName();
+ String version = pkgd.getVersion();
+ String arch = pkgd.getPackageArch();
+ String release = pkgd.getRelease();
+ String rpmname = constructRpmDisplayName(name, version, release, arch);
+ AdvisoryPackageDetails apkgd = new AdvisoryPackageDetails(name, version, arch, rpmname);
+ apkgdetails.add(apkgd);
+ }
+ details.addPkgs(apkgdetails);
+
+ erratadetails.add(details);
+ }
+ tracker.finishWork(1);
+ tracker.persistResults();
}
return erratadetails;
}
@@ -493,4 +498,5 @@ public class RHNHelper {
public String toString() {
return baseurl;
}
+
}
diff --git a/modules/enterprise/server/plugins/rhnhosted/src/main/java/org/rhq/enterprise/server/plugins/rhnhosted/RHNProvider.java b/modules/enterprise/server/plugins/rhnhosted/src/main/java/org/rhq/enterprise/server/plugins/rhnhosted/RHNProvider.java
index c6d4714..46a56c0 100644
--- a/modules/enterprise/server/plugins/rhnhosted/src/main/java/org/rhq/enterprise/server/plugins/rhnhosted/RHNProvider.java
+++ b/modules/enterprise/server/plugins/rhnhosted/src/main/java/org/rhq/enterprise/server/plugins/rhnhosted/RHNProvider.java
@@ -52,6 +52,7 @@ import org.rhq.enterprise.server.plugin.pc.content.RepoImportReport;
import org.rhq.enterprise.server.plugin.pc.content.RepoSource;
import org.rhq.enterprise.server.plugin.pc.content.SyncException;
import org.rhq.enterprise.server.plugin.pc.content.SyncProgressWeight;
+import org.rhq.enterprise.server.plugin.pc.content.SyncTracker;
import org.rhq.enterprise.server.plugin.pc.content.ThreadUtil;
import org.rhq.enterprise.server.plugins.rhnhosted.certificate.Certificate;
import org.rhq.enterprise.server.plugins.rhnhosted.certificate.CertificateFactory;
@@ -155,7 +156,8 @@ public class RHNProvider implements ContentProvider, PackageSource, RepoSource,
* @inheritDoc
*/
public void synchronizePackages(String repoName, PackageSyncReport report,
- Collection<ContentProviderPackageDetails> existingPackages) throws SyncException, InterruptedException {
+ Collection<ContentProviderPackageDetails> existingPackages, SyncTracker tracker) throws SyncException,
+ InterruptedException {
log.info("synchronizePackages(repoName = " + repoName + ", report = " + report + ", existingPackages.size() = "
+ existingPackages.size());
RHNSummary summary = new RHNSummary(helper);
@@ -168,6 +170,8 @@ public class RHNProvider implements ContentProvider, PackageSource, RepoSource,
List<String> pkgIds = helper.getChannelPackages(repoName);
log.info("RHNProvider:: helper.getChannelPackages returned " + pkgIds.size() + " packages");
List<ContentProviderPackageDetails> pkgDetails = new ArrayList<ContentProviderPackageDetails>();
+ tracker.addWork(pkgIds.size());
+ tracker.persistResults();
//
// We ran into problems when syncing large package lists, example 6000 packages.
@@ -193,6 +197,8 @@ public class RHNProvider implements ContentProvider, PackageSource, RepoSource,
long endTimeSlice = System.currentTimeMillis();
log.debug("Slice processed in " + (endTimeSlice - startTimeSlice) + "ms current size of pkgDetails is "
+ pkgDetails.size());
+ tracker.finishWork(pkgSliceList.size());
+ tracker.persistResults();
ThreadUtil.checkInterrupted();
}
long endTime = System.currentTimeMillis();
@@ -217,6 +223,7 @@ public class RHNProvider implements ContentProvider, PackageSource, RepoSource,
summary.deleted++;
}
} catch (Exception e) {
+ log.error("Error synching packages", e);
summary.errors.add(e.toString());
throw new SyncException("error synching packages.", e);
} finally {
@@ -230,8 +237,8 @@ public class RHNProvider implements ContentProvider, PackageSource, RepoSource,
/**
* @inheritDoc
*/
- public void synchronizeAdvisory(String repoName, AdvisorySyncReport report,
- Collection<AdvisoryDetails> existingAdvisory) throws SyncException, InterruptedException {
+ public void synchronizeAdvisories(String repoName, AdvisorySyncReport report,
+ Collection<AdvisoryDetails> existingAdvisory, SyncTracker tracker) throws SyncException, InterruptedException {
List<String> existingLabels = new ArrayList<String>();
for (AdvisoryDetails ad : existingAdvisory) {
@@ -243,7 +250,7 @@ public class RHNProvider implements ContentProvider, PackageSource, RepoSource,
try {
List<String> errataIds = helper.getChannelAdvisory(repoName);
- List<AdvisoryDetails> advList = helper.getAdvisoryMetadata(errataIds, repoName);
+ List<AdvisoryDetails> advList = helper.getAdvisoryMetadata(errataIds, repoName, tracker);
log.debug("Found " + advList.size() + " available errata");
for (AdvisoryDetails adv : advList) {
log.debug("Processing Advisory ::" + adv.getAdvisory());
@@ -273,8 +280,8 @@ public class RHNProvider implements ContentProvider, PackageSource, RepoSource,
/**
* @inheritDoc
*/
- public void synchronizeDistribution(String repoName, DistributionSyncReport report,
- Collection<DistributionDetails> existingDistros) throws SyncException {
+ public void synchronizeDistributions(String repoName, DistributionSyncReport report,
+ Collection<DistributionDetails> existingDistros, SyncTracker tracker) throws SyncException {
// Goal:
// This method will create the metadata representing what kickstart tree files need to be downloaded.
@@ -316,7 +323,7 @@ public class RHNProvider implements ContentProvider, PackageSource, RepoSource,
List<DistributionDetails> ddList;
try {
- ddList = helper.getDistributionMetaData(toSyncDistros);
+ ddList = helper.getDistributionMetaData(toSyncDistros, tracker);
} catch (Exception e) {
throw new SyncException("Error synching distro metadata", e);
}
diff --git a/modules/enterprise/server/plugins/rhnhosted/src/test/java/org/rhq/enterprise/server/plugins/rhnhosted/RHNProviderTest.java b/modules/enterprise/server/plugins/rhnhosted/src/test/java/org/rhq/enterprise/server/plugins/rhnhosted/RHNProviderTest.java
index bb67e61..6d970e2 100644
--- a/modules/enterprise/server/plugins/rhnhosted/src/test/java/org/rhq/enterprise/server/plugins/rhnhosted/RHNProviderTest.java
+++ b/modules/enterprise/server/plugins/rhnhosted/src/test/java/org/rhq/enterprise/server/plugins/rhnhosted/RHNProviderTest.java
@@ -150,7 +150,7 @@ public class RHNProviderTest {
List<ContentProviderPackageDetails> existingPackages = new ArrayList<ContentProviderPackageDetails>();
try {
provider.initialize(config);
- provider.synchronizePackages(channelName, report, existingPackages);
+ provider.synchronizePackages(channelName, report, existingPackages, null);
Set<ContentProviderPackageDetails> newPkgs = report.getNewPackages();
log.info(newPkgs.size() + " packages are noted as 'NEW'");
assert (newPkgs.size() > 0);
@@ -195,7 +195,7 @@ public class RHNProviderTest {
Configuration config = getConfiguration();
try {
provider.initialize(config);
- provider.synchronizeDistribution(channelName, report, existingDistro);
+ provider.synchronizeDistributions(channelName, report, existingDistro, null);
} catch (Exception e) {
e.printStackTrace();
assert false;
diff --git a/modules/enterprise/server/plugins/url/src/main/java/org/rhq/enterprise/server/plugins/url/UrlProvider.java b/modules/enterprise/server/plugins/url/src/main/java/org/rhq/enterprise/server/plugins/url/UrlProvider.java
index c229a2b..42a575c 100644
--- a/modules/enterprise/server/plugins/url/src/main/java/org/rhq/enterprise/server/plugins/url/UrlProvider.java
+++ b/modules/enterprise/server/plugins/url/src/main/java/org/rhq/enterprise/server/plugins/url/UrlProvider.java
@@ -40,6 +40,7 @@ import org.rhq.enterprise.server.plugin.pc.content.PackageSource;
import org.rhq.enterprise.server.plugin.pc.content.PackageSyncReport;
import org.rhq.enterprise.server.plugin.pc.content.SyncException;
import org.rhq.enterprise.server.plugin.pc.content.SyncProgressWeight;
+import org.rhq.enterprise.server.plugin.pc.content.SyncTracker;
import org.rhq.enterprise.server.plugins.url.RemotePackageInfo.SupportedPackageType;
/**
@@ -177,7 +178,7 @@ public class UrlProvider implements ContentProvider, PackageSource {
}
public void synchronizePackages(String repoName, PackageSyncReport report,
- Collection<ContentProviderPackageDetails> existingPackages) throws SyncException {
+ Collection<ContentProviderPackageDetails> existingPackages, SyncTracker tracker) throws SyncException {
// put all existing packages in a "to be deleted" list. As we sync, we will remove
// packages from this list that still exist on the remote system. Any leftover in the list
diff --git a/modules/enterprise/server/plugins/yum/src/main/java/org/rhq/enterprise/server/plugins/yum/RepoProvider.java b/modules/enterprise/server/plugins/yum/src/main/java/org/rhq/enterprise/server/plugins/yum/RepoProvider.java
index 40c6656..b840ef9 100644
--- a/modules/enterprise/server/plugins/yum/src/main/java/org/rhq/enterprise/server/plugins/yum/RepoProvider.java
+++ b/modules/enterprise/server/plugins/yum/src/main/java/org/rhq/enterprise/server/plugins/yum/RepoProvider.java
@@ -33,6 +33,7 @@ import org.rhq.enterprise.server.plugin.pc.content.PackageSource;
import org.rhq.enterprise.server.plugin.pc.content.PackageSyncReport;
import org.rhq.enterprise.server.plugin.pc.content.SyncException;
import org.rhq.enterprise.server.plugin.pc.content.SyncProgressWeight;
+import org.rhq.enterprise.server.plugin.pc.content.SyncTracker;
/**
* The RepoSource provides a content source for synchronizing content contained with a yum repo.
@@ -127,12 +128,12 @@ public class RepoProvider implements ContentProvider, PackageSource {
* rpm works since an update generates a new package version.
*
* @param repoName
- *@param report A report to fill in.
+ * @param report A report to fill in.
* @param existingPackages A collection of package specifications already in inventory.
- * @throws Exception On all errors.
+ *@throws Exception On all errors.
*/
public void synchronizePackages(String repoName, PackageSyncReport report,
- Collection<ContentProviderPackageDetails> existingPackages) throws SyncException, InterruptedException {
+ Collection<ContentProviderPackageDetails> existingPackages, SyncTracker tracker) throws SyncException, InterruptedException {
Summary summary = new Summary(reader);
log.info("synchronizing with repo: " + reader + " started");
try {