modules/core/domain/src/main/java/org/rhq/core/domain/content/PackageVersion.java
| 14
modules/core/domain/src/main/java/org/rhq/core/domain/content/PackageVersionContentSource.java
| 23
modules/core/domain/src/main/java/org/rhq/core/domain/content/RepoPackageVersion.java
| 13
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentSourceManagerBean.java
| 231 +++++-----
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentSourceManagerLocal.java
| 20
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/sync/PackageSourceSynchronizer.java
| 4
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/content/test/ContentSourceManagerBeanTest.java
| 59 +-
7 files changed, 204 insertions(+), 160 deletions(-)
New commits:
commit 1992722650053bcc1f5895b3bf1478f3298de6dd
Author: Jason Dobies <jason.dobies(a)redhat.com>
Date: Mon Nov 30 15:37:59 2009 -0500
1137 - Refactored server-side methods for handling a package sync that's scoped to
a particular repo.
diff --git
a/modules/core/domain/src/main/java/org/rhq/core/domain/content/PackageVersion.java
b/modules/core/domain/src/main/java/org/rhq/core/domain/content/PackageVersion.java
index 7d9b0d9..4a221e9 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/content/PackageVersion.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/content/PackageVersion.java
@@ -130,9 +130,16 @@ import org.rhq.core.domain.resource.ProductVersion;
// deletes orphaned package versions - that is, if they have no associated content
sources or repos and is not installed anywhere
@NamedQuery(name = PackageVersion.DELETE_IF_NO_CONTENT_SOURCES_OR_REPOS, query =
"DELETE PackageVersion pv "
- + " WHERE pv.id NOT IN (SELECT pvcs.packageVersion.id "
- + " FROM PackageVersionContentSource pvcs) "
- + " AND pv.repoPackageVersions IS EMPTY " + " AND
pv.installedPackages IS EMPTY "
+ + " WHERE pv.id NOT IN (SELECT pvcs.packageVersion.id " //
+ + " FROM PackageVersionContentSource pvcs) " //
+ + " AND pv.repoPackageVersions IS EMPTY " //
+ + " AND pv.installedPackages IS EMPTY " //
+ + " AND pv.installedPackageHistory IS EMPTY "),
+
+ @NamedQuery(name = PackageVersion.DELETE_SINGLE_IF_NO_CONTENT_SOURCES_OR_REPOS, query
= "DELETE PackageVersion pv "
+ + " WHERE pv.id = :packageVersionId" //
+ + " AND pv.repoPackageVersions IS EMPTY " //
+ + " AND pv.installedPackages IS EMPTY " //
+ " AND pv.installedPackageHistory IS EMPTY "),
// the bulk delete that removes the PVPV mapping from orphaned package versions
@@ -240,6 +247,7 @@ public class PackageVersion implements Serializable {
public static final String QUERY_FIND_BY_ID_IF_NO_CONTENT_SOURCES_OR_REPOS =
"PackageVersion.findByIdIfNoContentSourcesOrRepos";
public static final String QUERY_GET_PKG_BITS_LENGTH_BY_PKG_DETAILS_AND_RES_ID =
"PackageVersion.getPkgBitsLengthByPkgDetailsAndResId";
public static final String DELETE_IF_NO_CONTENT_SOURCES_OR_REPOS =
"PackageVersion.deleteIfNoContentSourcesOrRepos";
+ public static final String DELETE_SINGLE_IF_NO_CONTENT_SOURCES_OR_REPOS =
"PackageVersion.deleteSingleIfNoContentSourcesOrRepos";
public static final String DELETE_PVPV_IF_NO_CONTENT_SOURCES_OR_REPOS =
"PackageVersion.deletePVPVIfNoContentSourcesOrRepos";
public static final String FIND_EXTRA_PROPS_IF_NO_CONTENT_SOURCES_OR_REPOS =
"PackageVersion.findOrphanedExtraProps";
public static final String FIND_FILES_IF_NO_CONTENT_SOURCES_OR_REPOS =
"PackageVersion.findOrphanedFiles";
diff --git
a/modules/core/domain/src/main/java/org/rhq/core/domain/content/PackageVersionContentSource.java
b/modules/core/domain/src/main/java/org/rhq/core/domain/content/PackageVersionContentSource.java
index 6ae6c39..ffaaed7 100644
---
a/modules/core/domain/src/main/java/org/rhq/core/domain/content/PackageVersionContentSource.java
+++
b/modules/core/domain/src/main/java/org/rhq/core/domain/content/PackageVersionContentSource.java
@@ -76,17 +76,24 @@ import javax.persistence.Table;
// this is the same as FIND_BY_CONTENT_SOURCE_ID, but it only returns those PVs whose
bits are not loaded yet
@NamedQuery(name =
PackageVersionContentSource.QUERY_FIND_BY_CONTENT_SOURCE_ID_AND_NOT_LOADED, query =
"SELECT pvcs "
- + " FROM PackageVersionContentSource pvcs "
- + " LEFT JOIN FETCH pvcs.packageVersion pv "
- + " LEFT JOIN FETCH pv.generalPackage gp "
- + " LEFT JOIN FETCH gp.packageType pt "
- + " LEFT JOIN FETCH pv.architecture arch "
- + " LEFT JOIN FETCH pv.extraProperties extra "
- + " WHERE pvcs.contentSource.id = :id " + " AND pv.packageBits
IS NULL "),
+ + " FROM PackageVersionContentSource pvcs " //
+ + " LEFT JOIN FETCH pvcs.packageVersion pv " //
+ + " LEFT JOIN FETCH pv.generalPackage gp " //
+ + " LEFT JOIN FETCH gp.packageType pt " //
+ + " LEFT JOIN FETCH pv.architecture arch " //
+ + " LEFT JOIN FETCH pv.extraProperties extra " //
+ + " WHERE pvcs.contentSource.id = :id " //
+ + " AND pv.packageBits IS NULL " //
+ + " AND pv.id IN " //
+ + " (SELECT rpv.packageVersion.id FROM RepoPackageVersion rpv " //
+ + " WHERE rpv.repo.id = :repo_id)"),
@NamedQuery(name =
PackageVersionContentSource.QUERY_FIND_BY_CONTENT_SOURCE_ID_AND_NOT_LOADED_COUNT, query =
"SELECT COUNT(pvcs.contentSource.id) "
+ " FROM PackageVersionContentSource pvcs "
+ " WHERE pvcs.contentSource.id = :id "
- + " AND pvcs.packageVersion.packageBits IS NULL "),
+ + " AND pvcs.packageVersion.packageBits IS NULL "
+ + " AND pvcs.packageVersion.id IN " //
+ + " (SELECT rpv.packageVersion.id FROM RepoPackageVersion rpv " //
+ + " WHERE rpv.repo.id = :repo_id)"),
// finds the set of content sources that can deliver the pkg ver to the subscribed
resource
@NamedQuery(name = PackageVersionContentSource.QUERY_FIND_BY_PKG_VER_ID_AND_RES_ID,
query = "SELECT pvcs "
diff --git
a/modules/core/domain/src/main/java/org/rhq/core/domain/content/RepoPackageVersion.java
b/modules/core/domain/src/main/java/org/rhq/core/domain/content/RepoPackageVersion.java
index 6e603cb..668fa32 100644
---
a/modules/core/domain/src/main/java/org/rhq/core/domain/content/RepoPackageVersion.java
+++
b/modules/core/domain/src/main/java/org/rhq/core/domain/content/RepoPackageVersion.java
@@ -42,10 +42,21 @@ import javax.persistence.Table;
*/
@Entity
@IdClass(RepoPackageVersionPK.class)
-@NamedQueries( { @NamedQuery(name = RepoPackageVersion.DELETE_BY_REPO_ID, query =
"DELETE RepoPackageVersion cpv WHERE cpv.repo.id = :repoId") })
+@NamedQueries( {
+ @NamedQuery(name = RepoPackageVersion.DELETE_BY_REPO_ID,
+ query = "DELETE RepoPackageVersion cpv WHERE cpv.repo.id = :repoId"),
+
+ // Deletes the repo <-> package mapping when the package has no providers for
this package
+ @NamedQuery(name = RepoPackageVersion.DELETE_WHEN_NO_PROVIDER, query = "DELETE
RepoPackageVersion rpv "
+ + "WHERE rpv.repo.id = :repoId " //
+ + " AND (SELECT COUNT(pvcs.packageVersion.id) "
+ + " FROM PackageVersionContentSource pvcs) = 0"
+ )
+})
@Table(name = "RHQ_REPO_PKG_VERSION_MAP")
public class RepoPackageVersion implements Serializable {
public static final String DELETE_BY_REPO_ID =
"RepoPackageVersion.deleteByRepoId";
+ public static final String DELETE_WHEN_NO_PROVIDER =
"RepoPackageVersion.deleteWhenNoProvider";
private static final long serialVersionUID = 1L;
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 40bc541..0a1a148 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
@@ -383,7 +383,7 @@ public class ContentSourceManagerBean implements
ContentSourceManagerLocal {
String repoName = createMe.getName();
- // Make sure the repo doesn't already exist. If we add twice, currently
we'll get an exception
+ // Make sure the repo doesn't already exist. If we add twice, currently
we'll get an exception
List<Repo> existingRepo = repoManager.getRepoByName(repoName);
if (existingRepo != null) {
continue;
@@ -639,8 +639,8 @@ public class ContentSourceManagerBean implements
ContentSourceManagerLocal {
@SuppressWarnings("unchecked")
@RequiredPermission(Permission.MANAGE_INVENTORY)
- public PageList<PackageVersionContentSource>
getUnloadedPackageVersionsFromContentSource(Subject subject,
- int contentSourceId, PageControl pc) {
+ public PageList<PackageVersionContentSource>
getUnloadedPackageVersionsFromContentSourceInRepo(Subject subject,
+ int contentSourceId, int repoId, PageControl pc) {
pc.initDefaultOrderingField("pvcs.contentSource.id");
Query query = PersistenceUtility.createQueryWithOrderBy(entityManager,
@@ -649,7 +649,9 @@ public class ContentSourceManagerBean implements
ContentSourceManagerLocal {
PackageVersionContentSource.QUERY_FIND_BY_CONTENT_SOURCE_ID_AND_NOT_LOADED_COUNT);
query.setParameter("id", contentSourceId);
+ query.setParameter("repo_id", repoId);
countQuery.setParameter("id", contentSourceId);
+ countQuery.setParameter("repo_id", repoId);
List<PackageVersionContentSource> results = query.getResultList();
long count = (Long) countQuery.getSingleResult();
@@ -940,18 +942,18 @@ public class ContentSourceManagerBean implements
ContentSourceManagerLocal {
//////////////////
// REMOVE
- syncResults =
contentSourceManager._mergeContentSourceSyncReportREMOVE(contentSource, report,
syncResults,
- progress);
+ syncResults =
contentSourceManager._mergeDistributionSyncReportREMOVE(contentSource,
+ report, syncResults, progress);
//////////////////
// ADD
- syncResults =
contentSourceManager._mergeContentSourceSyncReportADD(contentSource, report, syncResults,
- progress);
+ syncResults =
contentSourceManager._mergeDistributionSyncReportADD(contentSource, report,
+ syncResults, progress);
// if we added/updated/deleted anything, change the last modified time of all
repos
// that get content from this content source
if ((report.getDistributions().size() > 0) ||
(report.getDeletedDistributions().size() > 0)) {
-
contentSourceManager._mergeContentSourceSyncReportUpdateRepo(contentSource.getId());
+
contentSourceManager._mergePackageSyncReportUpdateRepo(contentSource.getId());
}
// let our sync results object know that we completed the merge
@@ -972,7 +974,8 @@ public class ContentSourceManagerBean implements
ContentSourceManagerLocal {
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
// we really want NEVER, but support tests that might be in a tx
- public ContentSourceSyncResults mergePackageSyncReport(ContentSource contentSource,
PackageSyncReport report,
+ public ContentSourceSyncResults mergePackageSyncReport(ContentSource contentSource,
Repo repo,
+ PackageSyncReport report,
Map<ContentProviderPackageDetailsKey, PackageVersionContentSource>
previous,
ContentSourceSyncResults syncResults) {
try {
@@ -991,8 +994,8 @@ public class ContentSourceManagerBean implements
ContentSourceManagerLocal {
//////////////////
// REMOVE
- syncResults =
contentSourceManager._mergeContentSourceSyncReportREMOVE(contentSource, report, previous,
- syncResults, progress);
+ syncResults =
contentSourceManager._mergePackageSyncReportREMOVE(contentSource, repo,
+ report, previous, syncResults, progress);
//////////////////
// ADD
@@ -1015,8 +1018,8 @@ public class ContentSourceManagerBean implements
ContentSourceManagerLocal {
}
List<ContentProviderPackageDetails> pkgs =
newPackages.subList(fromIndex, toIndex);
- syncResults =
contentSourceManager._mergeContentSourceSyncReportADD(contentSource, pkgs, previous,
- syncResults, progress, fromIndex);
+ syncResults =
contentSourceManager._mergePackageSyncReportADD(contentSource, repo,
+ pkgs, previous, syncResults, progress, fromIndex);
addedCount += pkgs.size();
fromIndex += chunkSize;
toIndex += chunkSize;
@@ -1028,14 +1031,14 @@ public class ContentSourceManagerBean implements
ContentSourceManagerLocal {
//////////////////
// UPDATE
- syncResults =
contentSourceManager._mergeContentSourceSyncReportUPDATE(contentSource, report, previous,
+ syncResults =
contentSourceManager._mergePackageSyncReportUPDATE(contentSource, report, previous,
syncResults, progress);
// if we added/updated/deleted anything, change the last modified time of all
repos
// that get content from this content source
if ((report.getNewPackages().size() > 0) ||
(report.getUpdatedPackages().size() > 0)
|| (report.getDeletedPackages().size() > 0)) {
-
contentSourceManager._mergeContentSourceSyncReportUpdateRepo(contentSource.getId());
+
contentSourceManager._mergePackageSyncReportUpdateRepo(contentSource.getId());
}
// let our sync results object know that we completed the merge
@@ -1055,7 +1058,7 @@ public class ContentSourceManagerBean implements
ContentSourceManagerLocal {
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
- public void _mergeContentSourceSyncReportUpdateRepo(int contentSourceId) {
+ public void _mergePackageSyncReportUpdateRepo(int contentSourceId) {
// this method should be called only after a merge of a content source
// added/updated/removed one or more packages. When this happens, we need to
change
// the last modified time for all repos that get content from the changed content
source
@@ -1070,9 +1073,13 @@ public class ContentSourceManagerBean implements
ContentSourceManagerLocal {
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
- public ContentSourceSyncResults _mergeContentSourceSyncReportREMOVE(ContentSource
contentSource,
- PackageSyncReport report, Map<ContentProviderPackageDetailsKey,
PackageVersionContentSource> previous,
- ContentSourceSyncResults syncResults, StringBuilder progress) {
+ public ContentSourceSyncResults _mergePackageSyncReportREMOVE(ContentSource
contentSource,
+ Repo repo,
+ PackageSyncReport report,
+ Map<ContentProviderPackageDetailsKey, PackageVersionContentSource>
previous,
+ ContentSourceSyncResults syncResults,
+ StringBuilder progress) {
+
progress.append(new Date()).append(": ").append("Removing");
syncResults.setResults(progress.toString());
syncResults = contentSourceManager.mergeContentSourceSyncResults(syncResults);
@@ -1085,7 +1092,8 @@ public class ContentSourceManagerBean implements
ContentSourceManagerLocal {
// for each removed package, we need to purge the PVCS mapping and the PV itself
for (ContentProviderPackageDetails doomedDetails : report.getDeletedPackages())
{
- // this is the mapping between the content source and the package version
that needs to be deleted
+
+ // Delete the mapping between package version and content provider
ContentProviderPackageDetailsKey doomedDetailsKey =
doomedDetails.getContentProviderPackageDetailsKey();
PackageVersionContentSource doomedPvcs = previous.get(doomedDetailsKey);
doomedPvcs = entityManager.find(PackageVersionContentSource.class,
doomedPvcs
@@ -1094,17 +1102,20 @@ public class ContentSourceManagerBean implements
ContentSourceManagerLocal {
entityManager.remove(doomedPvcs);
}
- // this is the package version itself that we want to remove
- // but only delete if there are no other content sources that also serve that
PackageVersion
- // or repos that are directly associated with this package version
+ // Delete the relationship between package and repo IF no other providers
provide the
+ // package
+ q =
entityManager.createNamedQuery(RepoPackageVersion.DELETE_WHEN_NO_PROVIDER);
+ q.setParameter("repoId", repo.getId());
+ q.executeUpdate();
+
+ // Delete the package version if it is sufficiently orphaned:
+ // - No repos
+ // - No content providers
+ // - No installed packages
PackageVersion doomedPv =
doomedPvcs.getPackageVersionContentSourcePK().getPackageVersion();
- q =
entityManager.createNamedQuery(PackageVersion.QUERY_FIND_BY_ID_IF_NO_CONTENT_SOURCES_OR_REPOS);
- q.setParameter("id", doomedPv.getId());
- try {
- doomedPv = (PackageVersion) q.getSingleResult();
- entityManager.remove(doomedPv);
- } catch (NoResultException nre) {
- }
+ q =
entityManager.createNamedQuery(PackageVersion.DELETE_SINGLE_IF_NO_CONTENT_SOURCES_OR_REPOS);
+ q.setParameter("packageVersionId", doomedPv.getId());
+ q.executeUpdate();
if ((++flushCount % 200) == 0) {
entityManager.flush();
@@ -1125,78 +1136,10 @@ public class ContentSourceManagerBean implements
ContentSourceManagerLocal {
return syncResults;
}
- @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
- public ContentSourceSyncResults _mergeContentSourceSyncReportREMOVE(ContentSource
contentSource,
- DistributionSyncReport report, ContentSourceSyncResults syncResults,
StringBuilder progress) {
-
- progress.append(new Date()).append(": ").append("Removing");
- syncResults.setResults(progress.toString());
- syncResults = contentSourceManager.mergeContentSourceSyncResults(syncResults);
-
- DistributionManagerLocal distManager = LookupUtil.getDistributionManagerLocal();
- Subject overlord = LookupUtil.getSubjectManager().getOverlord();
-
- // remove all distributions that are no longer available on the remote
repository
- 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 =
contentSourceManager.mergeContentSourceSyncResults(syncResults);
- }
-
- progress.append("Finished Distribution
removal...").append('\n');
- syncResults.setResults(progress.toString());
- syncResults = contentSourceManager.mergeContentSourceSyncResults(syncResults);
-
- return syncResults;
- }
-
- @SuppressWarnings("unchecked")
- @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
- public ContentSourceSyncResults _mergeContentSourceSyncReportADD(ContentSource
contentSource,
- DistributionSyncReport report, ContentSourceSyncResults syncResults,
StringBuilder progress) {
-
- DistributionManagerLocal distManager = LookupUtil.getDistributionManagerLocal();
- RepoManagerLocal repoManager = LookupUtil.getRepoManagerLocal();
- Subject overlord = LookupUtil.getSubjectManager().getOverlord();
- 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();
- }
- } catch (DistributionException e) {
- progress.append("Caught exception when trying to add: " +
detail.getLabel() + "\n");
- progress.append("Error is: " + e.getMessage());
- syncResults.setResults(progress.toString());
- syncResults =
contentSourceManager.mergeContentSourceSyncResults(syncResults);
- log.error(e);
- }
- }
- return syncResults;
- }
-
@SuppressWarnings("unchecked")
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
- public ContentSourceSyncResults _mergeContentSourceSyncReportADD(ContentSource
contentSource,
+ public ContentSourceSyncResults _mergePackageSyncReportADD(ContentSource
contentSource,
+ Repo repo,
Collection<ContentProviderPackageDetails> newPackages,
Map<ContentProviderPackageDetailsKey, PackageVersionContentSource>
previous,
ContentSourceSyncResults syncResults, StringBuilder progress, int addCount) {
@@ -1206,10 +1149,12 @@ public class ContentSourceManagerBean implements
ContentSourceManagerLocal {
Map<ResourceType, ResourceType> knownResourceTypes = new
HashMap<ResourceType, ResourceType>();
Map<PackageType, PackageType> knownPackageTypes = new
HashMap<PackageType, PackageType>();
Map<Architecture, Architecture> knownArchitectures = new
HashMap<Architecture, Architecture>();
- List<Repo> associatedRepos = null;
Map<ResourceType, Map<String, ProductVersion>> knownProductVersions =
new HashMap<ResourceType, Map<String, ProductVersion>>();
+ // Load this so we have the attached version in the repo <-> package
mapping
+ repo = entityManager.find(Repo.class, repo.getId());
+
// add new packages that are new to the content source.
// for each new package, we have to find its resource type and package type
// (both of which must exist, or we abort that package and move on to the next);
@@ -1379,22 +1324,15 @@ public class ContentSourceManagerBean implements
ContentSourceManagerLocal {
newPvcs = entityManager.merge(newPvcs);
// for all repos that are associated with this content source, add this
package version directly to them
- if (associatedRepos == null) {
- q =
entityManager.createNamedQuery(Repo.QUERY_FIND_IMPORTED_BY_CONTENT_SOURCE_ID_FETCH_CCS);
- q.setParameter("id", contentSource.getId());
- associatedRepos = q.getResultList();
- }
+ RepoPackageVersion mapping = new RepoPackageVersion(repo, pv);
+ entityManager.merge(mapping); // use merge just in case this mapping somehow
already exists
- for (Repo associatedRepo : associatedRepos) {
- RepoPackageVersion mapping = new RepoPackageVersion(associatedRepo, pv);
- entityManager.merge(mapping); // use merge just in case this mapping
somehow already exists
- }
+ // Cleanup
if ((++flushCount % 100) == 0) {
knownResourceTypes.clear();
knownPackageTypes.clear();
knownArchitectures.clear();
- associatedRepos = null;
knownProductVersions.clear();
entityManager.flush();
entityManager.clear();
@@ -1411,7 +1349,7 @@ public class ContentSourceManagerBean implements
ContentSourceManagerLocal {
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
- public ContentSourceSyncResults _mergeContentSourceSyncReportUPDATE(ContentSource
contentSource,
+ public ContentSourceSyncResults _mergePackageSyncReportUPDATE(ContentSource
contentSource,
PackageSyncReport report, Map<ContentProviderPackageDetailsKey,
PackageVersionContentSource> previous,
ContentSourceSyncResults syncResults, StringBuilder progress) {
progress.append(new Date()).append(": ").append("Updating");
@@ -1488,6 +1426,75 @@ public class ContentSourceManagerBean implements
ContentSourceManagerLocal {
return syncResults;
}
+ @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
+ public ContentSourceSyncResults _mergeDistributionSyncReportREMOVE(ContentSource
contentSource,
+ DistributionSyncReport report, ContentSourceSyncResults syncResults,
StringBuilder progress) {
+
+ progress.append(new Date()).append(": ").append("Removing");
+ syncResults.setResults(progress.toString());
+ syncResults = contentSourceManager.mergeContentSourceSyncResults(syncResults);
+
+ DistributionManagerLocal distManager = LookupUtil.getDistributionManagerLocal();
+ Subject overlord = LookupUtil.getSubjectManager().getOverlord();
+
+ // remove all distributions that are no longer available on the remote
repository
+ 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 =
contentSourceManager.mergeContentSourceSyncResults(syncResults);
+ }
+
+ progress.append("Finished Distribution
removal...").append('\n');
+ syncResults.setResults(progress.toString());
+ syncResults = contentSourceManager.mergeContentSourceSyncResults(syncResults);
+
+ return syncResults;
+ }
+
+ @SuppressWarnings("unchecked")
+ @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
+ public ContentSourceSyncResults _mergeDistributionSyncReportADD(ContentSource
contentSource,
+ DistributionSyncReport report, ContentSourceSyncResults syncResults,
StringBuilder progress) {
+
+ DistributionManagerLocal distManager = LookupUtil.getDistributionManagerLocal();
+ RepoManagerLocal repoManager = LookupUtil.getRepoManagerLocal();
+ Subject overlord = LookupUtil.getSubjectManager().getOverlord();
+ 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();
+ }
+ } catch (DistributionException e) {
+ progress.append("Caught exception when trying to add: " +
detail.getLabel() + "\n");
+ progress.append("Error is: " + e.getMessage());
+ syncResults.setResults(progress.toString());
+ syncResults =
contentSourceManager.mergeContentSourceSyncResults(syncResults);
+ log.error(e);
+ }
+ }
+ return syncResults;
+ }
+
@SuppressWarnings("unchecked")
public PageList<PackageVersionMetadataComposite> getPackageVersionMetadata(int
resourceId, PageControl pc) {
pc.initDefaultOrderingField("pv.id");
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 c3eeb94..850cd6d 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
@@ -297,8 +297,8 @@ public interface ContentSourceManagerLocal {
* @return all unloaded package versions that the content source will be providing
content for. The object returned
* also contains the location where those package versions are located in the
content source
*/
- PageList<PackageVersionContentSource>
getUnloadedPackageVersionsFromContentSource(Subject subject,
- int contentSourceId, PageControl pc);
+ PageList<PackageVersionContentSource>
getUnloadedPackageVersionsFromContentSourceInRepo(Subject subject,
+ int contentSourceId, int repoId, PageControl pc);
@@ -402,6 +402,7 @@ public interface ContentSourceManagerLocal {
* was done
*/
ContentSourceSyncResults mergePackageSyncReport(ContentSource contentSource,
+ Repo repo,
PackageSyncReport report,
Map<ContentProviderPackageDetailsKey, PackageVersionContentSource>
previous,
ContentSourceSyncResults syncResults);
@@ -420,25 +421,26 @@ public interface ContentSourceManagerLocal {
DistributionSyncReport report,
ContentSourceSyncResults
syncResults);
- void _mergeContentSourceSyncReportUpdateRepo(int contentSourceId);
+ void _mergePackageSyncReportUpdateRepo(int contentSourceId);
- ContentSourceSyncResults _mergeContentSourceSyncReportREMOVE(ContentSource
contentSource, PackageSyncReport report,
+ ContentSourceSyncResults _mergePackageSyncReportREMOVE(ContentSource contentSource,
+ Repo repo, PackageSyncReport report,
Map<ContentProviderPackageDetailsKey, PackageVersionContentSource>
previous,
ContentSourceSyncResults syncResults, StringBuilder progress);
- ContentSourceSyncResults _mergeContentSourceSyncReportADD(ContentSource
contentSource,
- Collection<ContentProviderPackageDetails> newPackages,
+ ContentSourceSyncResults _mergePackageSyncReportADD(ContentSource contentSource,
+ Repo repo, Collection<ContentProviderPackageDetails> newPackages,
Map<ContentProviderPackageDetailsKey, PackageVersionContentSource>
previous,
ContentSourceSyncResults syncResults, StringBuilder progress, int addCount);
- ContentSourceSyncResults _mergeContentSourceSyncReportUPDATE(ContentSource
contentSource, PackageSyncReport report,
+ ContentSourceSyncResults _mergePackageSyncReportUPDATE(ContentSource contentSource,
PackageSyncReport report,
Map<ContentProviderPackageDetailsKey, PackageVersionContentSource>
previous,
ContentSourceSyncResults syncResults, StringBuilder progress);
- ContentSourceSyncResults _mergeContentSourceSyncReportREMOVE(ContentSource
contentSource, DistributionSyncReport report,
+ ContentSourceSyncResults _mergeDistributionSyncReportREMOVE(ContentSource
contentSource, DistributionSyncReport report,
ContentSourceSyncResults syncResults, StringBuilder progress);
- ContentSourceSyncResults _mergeContentSourceSyncReportADD(ContentSource
contentSource,
+ ContentSourceSyncResults _mergeDistributionSyncReportADD(ContentSource
contentSource,
DistributionSyncReport report, ContentSourceSyncResults syncResults,
StringBuilder progress);
/**
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 3d84178..6e6bc5a 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
@@ -122,7 +122,7 @@ public class PackageSourceSynchronizer {
// --------------------------------------------
start = System.currentTimeMillis();
- contentSourceManager.mergePackageSyncReport(source, report, keyPVCSMap, null);
+ contentSourceManager.mergePackageSyncReport(source, repo, report, keyPVCSMap,
null);
log.info("Synchronize Packages: [" + source.getName() +
"]: merged sync report=(" +
@@ -161,7 +161,7 @@ public class PackageSourceSynchronizer {
// TODO: jdob - Need to change this call to only load packages for this repo
List<PackageVersionContentSource> packageVersionContentSources =
contentSourceManager
- .getUnloadedPackageVersionsFromContentSource(overlord, source.getId(), pc);
+ .getUnloadedPackageVersionsFromContentSourceInRepo(overlord, source.getId(),
repo.getId(), pc);
log.info("Synchronize Package Bits: [" + source.getName() + "],
repo [" + repo.getName() +
"]: loaded package list for sync (" + (System.currentTimeMillis() -
start) + ")ms");
diff --git
a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/content/test/ContentSourceManagerBeanTest.java
b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/content/test/ContentSourceManagerBeanTest.java
index 0208014..c79ec39 100644
---
a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/content/test/ContentSourceManagerBeanTest.java
+++
b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/content/test/ContentSourceManagerBeanTest.java
@@ -69,8 +69,8 @@ import
org.rhq.enterprise.server.plugin.pc.content.TestContentServerPluginServic
import org.rhq.enterprise.server.test.AbstractEJB3Test;
import org.rhq.enterprise.server.util.LookupUtil;
-@Test
public class ContentSourceManagerBeanTest extends AbstractEJB3Test {
+
private static final boolean TESTS_ENABLED = true;
private ContentManagerLocal contentManager;
@@ -259,6 +259,11 @@ public class ContentSourceManagerBeanTest extends AbstractEJB3Test {
contentSourceId = contentSource.getId();
assert contentSourceId > 0;
+ // create a repo
+ Repo repo = new Repo("testRepo");
+ repo = repoManager.createRepo(overlord, repo);
+ repoId = repo.getId();
+
// this report will add a mapping to PV->CS
// we didn't set up any mappings like that yet - this will be the first
one
PackageSyncReport report = new PackageSyncReport();
@@ -279,7 +284,7 @@ public class ContentSourceManagerBeanTest extends AbstractEJB3Test {
results = contentSourceManager.persistContentSourceSyncResults(results);
assert results != null;
- results = contentSourceManager.mergePackageSyncReport(contentSource, report,
previous, results);
+ results = contentSourceManager.mergePackageSyncReport(contentSource, repo,
report, previous, results);
assert results != null;
// Verify the product version was created
@@ -306,14 +311,6 @@ public class ContentSourceManagerBeanTest extends AbstractEJB3Test {
em.close();
}
- // create a repo
- pc = PageControl.getUnlimitedInstance();
- int origRepoCount = repoManager.findRepos(overlord, pc).size();
- Repo repo = new Repo("testMergeSyncReportRepo");
- repo = repoManager.createRepo(overlord, repo);
- assert (origRepoCount + 1) == repoManager.findRepos(overlord, pc).size();
- repoId = repo.getId();
-
// see that the resource sees no metadata yet - not subscribed yet
pc = PageControl.getUnlimitedInstance();
PageList<PackageVersionMetadataComposite> metadataList;
@@ -355,7 +352,7 @@ public class ContentSourceManagerBeanTest extends AbstractEJB3Test {
// confirm that we didn't load the bits yet
pc = PageControl.getUnlimitedInstance();
List<PackageVersionContentSource> unloaded;
- unloaded =
contentSourceManager.getUnloadedPackageVersionsFromContentSource(overlord,
contentSourceId, pc);
+ unloaded =
contentSourceManager.getUnloadedPackageVersionsFromContentSourceInRepo(overlord,
contentSourceId, repoId, pc);
assert unloaded != null;
assert unloaded.size() == 1;
@@ -416,6 +413,7 @@ public class ContentSourceManagerBeanTest extends AbstractEJB3Test {
List<PackageVersionContentSource> inCS;
PageControl pc = PageControl.getUnlimitedInstance();
int contentSourceId = 0;
+ int repoId = 0;
try {
// create content source type and content source
@@ -430,6 +428,11 @@ public class ContentSourceManagerBeanTest extends AbstractEJB3Test {
contentSourceId = contentSource.getId();
assert contentSourceId > 0;
+ // create repo
+ Repo repo = new Repo("testRepo");
+ repo = repoManager.createRepo(overlord, repo);
+ repoId = repo.getId();
+
// just make sure there are no package versions yet
inCS = contentSourceManager.getPackageVersionsFromContentSource(overlord,
contentSourceId, pc);
assert inCS != null;
@@ -452,7 +455,7 @@ public class ContentSourceManagerBeanTest extends AbstractEJB3Test {
previous = new HashMap<ContentProviderPackageDetailsKey,
PackageVersionContentSource>();
// ADD: merge the report!
- results = contentSourceManager.mergePackageSyncReport(contentSource, report,
previous, results);
+ results = contentSourceManager.mergePackageSyncReport(contentSource, repo,
report, previous, results);
assert results != null;
// see the package version has been assigned to the content source
@@ -462,7 +465,7 @@ public class ContentSourceManagerBeanTest extends AbstractEJB3Test {
// confirm that we didn't load the bits yet
List<PackageVersionContentSource> unloaded;
- unloaded =
contentSourceManager.getUnloadedPackageVersionsFromContentSource(overlord,
contentSourceId, pc);
+ unloaded =
contentSourceManager.getUnloadedPackageVersionsFromContentSourceInRepo(overlord,
contentSourceId, repoId, pc);
assert unloaded != null;
assert unloaded.size() == 1;
@@ -483,7 +486,7 @@ public class ContentSourceManagerBeanTest extends AbstractEJB3Test {
report.addUpdatedPackage(details);
// UPDATE: merge the report!
- results = contentSourceManager.mergePackageSyncReport(contentSource, report,
previous, results);
+ results = contentSourceManager.mergePackageSyncReport(contentSource, repo,
report, previous, results);
assert results != null;
// see the package version is still assigned to the content source
@@ -492,7 +495,7 @@ public class ContentSourceManagerBeanTest extends AbstractEJB3Test {
assert inCS.size() == 1 : inCS;
// it should still be unloaded, make sure and check that it really was
updated
- unloaded =
contentSourceManager.getUnloadedPackageVersionsFromContentSource(overlord,
contentSourceId, pc);
+ unloaded =
contentSourceManager.getUnloadedPackageVersionsFromContentSourceInRepo(overlord,
contentSourceId, repoId, pc);
assert unloaded != null;
assert unloaded.size() == 1;
assert
unloaded.get(0).getPackageVersionContentSourcePK().getPackageVersion().getFileSize() ==
9999L;
@@ -504,7 +507,7 @@ public class ContentSourceManagerBeanTest extends AbstractEJB3Test {
report.addDeletePackage(details);
// REMOVE: merge the report!
- results = contentSourceManager.mergePackageSyncReport(contentSource, report,
previous, results);
+ results = contentSourceManager.mergePackageSyncReport(contentSource, repo,
report, previous, results);
assert results != null;
// see the package version is gone
@@ -522,6 +525,9 @@ public class ContentSourceManagerBeanTest extends AbstractEJB3Test {
throw e;
} finally {
try {
+ if (repoId != 0) {
+ repoManager.deleteRepo(overlord, repoId);
+ }
if (contentSourceId != 0) {
contentSourceManager.deleteContentSource(overlord, contentSourceId);
}
@@ -550,8 +556,9 @@ public class ContentSourceManagerBeanTest extends AbstractEJB3Test {
contentSource = contentSourceManager.simpleCreateContentSource(overlord,
contentSource);
contentSourceId = contentSource.getId();
assert contentSourceId > 0;
+
Repo repo = new Repo("testMergeSyncReportAMU2Ch");
- repoManager.createRepo(overlord, repo);
+ repo = repoManager.createRepo(overlord, repo);
repoId = repo.getId();
assert repoId > 0;
repoManager.addContentSourcesToRepo(overlord, repoId, new int[] {
contentSourceId });
@@ -576,15 +583,15 @@ public class ContentSourceManagerBeanTest extends AbstractEJB3Test
{
previous = new HashMap<ContentProviderPackageDetailsKey,
PackageVersionContentSource>();
// ADD: merge the report!
- results = contentSourceManager.mergePackageSyncReport(contentSource, report,
previous, results);
+ results = contentSourceManager.mergePackageSyncReport(contentSource, repo,
report, previous, results);
assert results != null;
List<PackageVersionContentSource> unloaded;
- unloaded =
contentSourceManager.getUnloadedPackageVersionsFromContentSource(overlord,
contentSourceId, pc);
+ unloaded =
contentSourceManager.getUnloadedPackageVersionsFromContentSourceInRepo(overlord,
contentSourceId, repoId, pc);
assert unloaded != null;
assert unloaded.size() == 1;
- // check the count - since content source was in a repo, the repo gets the PV
too
+ // check the count to make sure the pv was added to the repo
assert 1 ==
contentSourceManager.getPackageVersionCountFromContentSource(overlord, contentSourceId);
assert 1 == repoManager.getPackageVersionCountFromRepo(overlord, repoId);
@@ -597,12 +604,14 @@ public class ContentSourceManagerBeanTest extends AbstractEJB3Test
{
report.addDeletePackage(details);
// REMOVE: merge the report!
- results = contentSourceManager.mergePackageSyncReport(contentSource, report,
previous, results);
+ results = contentSourceManager.mergePackageSyncReport(contentSource, repo,
report, previous, results);
assert results != null;
- // check the count - note the repo's PV remains intact!!
+ // check the count - since the pv does not have a provider nor an installed
package,
+ // is it removed from the repo as well
assert 0 ==
contentSourceManager.getPackageVersionCountFromContentSource(overlord, contentSourceId);
- assert 1 == repoManager.getPackageVersionCountFromRepo(overlord, repoId);
+ long pvCountFromRepo = repoManager.getPackageVersionCountFromRepo(overlord,
repoId);
+ assert 0 == pvCountFromRepo : "Expected: 0, Found: " +
pvCountFromRepo;
} catch (Exception e) {
e.printStackTrace();
throw e;
@@ -853,7 +862,7 @@ public class ContentSourceManagerBeanTest extends AbstractEJB3Test {
// create a repo and associate the new content source with it
Repo repo = new Repo("testMergeWithRepo");
- repoManager.createRepo(overlord, repo);
+ repo = repoManager.createRepo(overlord, repo);
repoManager.addContentSourcesToRepo(overlord, repo.getId(), new int[] {
contentSourceId });
// this report will add a mapping to PV->CS
@@ -876,7 +885,7 @@ public class ContentSourceManagerBeanTest extends AbstractEJB3Test {
results = contentSourceManager.persistContentSourceSyncResults(results);
assert results != null;
- contentSourceManager.mergePackageSyncReport(contentSource, report, previous,
results);
+ contentSourceManager.mergePackageSyncReport(contentSource, repo, report,
previous, results);
List<PackageVersion> inRepo;
inRepo = repoManager.findPackageVersionsInRepo(overlord, repo.getId(),
PageControl.getUnlimitedInstance());