modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentManagerBean.java | 123 ++++++++++
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentManagerLocal.java | 3
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentManagerRemote.java | 9
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentSourceManagerBean.java | 4
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java | 6
5 files changed, 143 insertions(+), 2 deletions(-)
New commits:
commit 0fa409e8594472409f4d7759e724d40308ba26a6
Author: Pradeep Kilambi <pkilambi(a)redhat.com>
Date: Mon Feb 1 13:54:17 2010 -0500
Adding calls to create and store the packages uploaded from platform's upload tool to either db or filesystem. Subsequent additions will have support for metadata storage and other pkg details.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentManagerBean.java
index 8f8a024..9395355 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentManagerBean.java
@@ -84,6 +84,7 @@ import org.rhq.core.domain.resource.Agent;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.util.PageList;
+import org.rhq.core.util.MessageDigestGenerator;
import org.rhq.core.util.collection.ArrayUtils;
import org.rhq.core.util.exception.ThrowableUtil;
import org.rhq.core.util.stream.StreamUtil;
@@ -133,6 +134,9 @@ public class ContentManagerBean implements ContentManagerLocal, ContentManagerRe
@EJB
private ResourceTypeManagerLocal resourceTypeManager;
+ @EJB
+ private ContentSourceManagerBean contentSourceManager;
+
// ContentManagerLocal Implementation --------------------------------------------
@SuppressWarnings("unchecked")
@@ -1233,6 +1237,125 @@ public class ContentManagerBean implements ContentManagerLocal, ContentManagerRe
return newPackageVersion;
}
+ public PackageVersion uploadPlatformPackageVersion(Subject subject, String packageName, int packageTypeId,
+ String version, Integer architectureId, String fileName, byte[] packageBytes, boolean dbmode) {
+
+ // Check permissions first
+ if (!authorizationManager.hasGlobalPermission(subject, Permission.MANAGE_CONTENT)) {
+ throw new PermissionException("User [" + subject.getName()
+ + "] does not have permission to Upload Packages");
+ }
+
+ return uploadPlatformPackageVersion(packageName, packageTypeId, version,
+ (null == architectureId) ? getNoArchitecture().getId() : architectureId, fileName,
+ new ByteArrayInputStream(packageBytes), dbmode);
+ }
+
+ public PackageVersion uploadPlatformPackageVersion(String packageName, int packageTypeId, String version,
+ int architectureId, String fileName, InputStream packageBitStream, boolean dbmode) {
+ // See if the package version already exists and return that if it does
+ Query packageVersionQuery = entityManager.createNamedQuery(PackageVersion.QUERY_FIND_BY_PACKAGE_VER_ARCH);
+ packageVersionQuery.setParameter("name", packageName);
+ packageVersionQuery.setParameter("packageTypeId", packageTypeId);
+ packageVersionQuery.setParameter("architectureId", architectureId);
+ packageVersionQuery.setParameter("version", version);
+
+ // Result of the query should be either 0 or 1
+ List existingVersionList = packageVersionQuery.getResultList();
+ if (existingVersionList.size() > 0) {
+ return (PackageVersion) existingVersionList.get(0);
+ }
+
+ // If the package doesn't exist, create that here
+ Query packageQuery = entityManager.createNamedQuery(Package.QUERY_FIND_BY_NAME_PKG_TYPE_ID);
+ packageQuery.setParameter("name", packageName);
+ packageQuery.setParameter("packageTypeId", packageTypeId);
+
+ Package existingPackage;
+
+ List existingPackageList = packageQuery.getResultList();
+
+ if (existingPackageList.size() == 0) {
+ PackageType packageType = entityManager.find(PackageType.class, packageTypeId);
+ existingPackage = new Package(packageName, packageType);
+ existingPackage = persistOrMergePackageSafely(existingPackage);
+ } else {
+ existingPackage = (Package) existingPackageList.get(0);
+ }
+
+ // Create a package version and add it to the package
+ Architecture architecture = entityManager.find(Architecture.class, architectureId);
+
+ PackageVersion newPackageVersion = new PackageVersion(existingPackage, version, architecture);
+ newPackageVersion.setDisplayName(existingPackage.getName());
+ // TODO: Add metadata info for each package
+ //newPackageVersion.setMetadata(metadata);
+ newPackageVersion.setFileName(fileName);
+ if (dbmode) {
+ // Write the content into the newly created package version. This may eventually move, but for now we'll just
+ // use the byte array in the package version to store the bits.
+ byte[] packageBits;
+ try {
+ packageBits = StreamUtil.slurp(packageBitStream);
+ } catch (RuntimeException re) {
+ throw new RuntimeException("Error reading in the package file", re);
+ }
+
+ PackageBits bits = new PackageBits();
+ bits.setBits(packageBits);
+
+ newPackageVersion.setPackageBits(bits);
+
+ newPackageVersion = persistOrMergePackageVersionSafely(newPackageVersion);
+
+ existingPackage.addVersion(newPackageVersion);
+ } else {
+ try {
+ // store content to local file system
+ File outputFile = contentSourceManager.getPackageBitsLocalFileAndCreateParentDir(newPackageVersion
+ .getId(), newPackageVersion.getFileName());
+ log.info("OutPutFile is located at: " + outputFile);
+ boolean store = false;
+
+ if (outputFile.exists()) {
+ String expectedMD5 = (newPackageVersion.getMD5() != null) ? newPackageVersion.getMD5()
+ : "<unspecified MD5>";
+ String actualMD5 = MessageDigestGenerator.getDigestString(outputFile);
+ if (!expectedMD5.trim().toLowerCase().equals(actualMD5.toLowerCase())) {
+ log.info("Package [" + fileName + "] Already exists, Nothing to do");
+ store = true;
+ } else {
+ store = false;
+ }
+ } else {
+ store = true;
+ }
+ if (store) {
+ StreamUtil.copy(packageBitStream, new FileOutputStream(outputFile), true);
+ packageBitStream = null;
+ }
+
+ newPackageVersion = persistOrMergePackageVersionSafely(newPackageVersion);
+
+ existingPackage.addVersion(newPackageVersion);
+ } catch (Throwable t) {
+ throw new RuntimeException("Did not store the package bits for [" + fileName + "]. Cause: "
+ + ThrowableUtil.getAllMessages(t), t);
+ } finally {
+ if (packageBitStream != null) {
+ try {
+ packageBitStream.close();
+ } catch (Exception e) {
+ log.warn("Failed to close stream to package bits located ");
+ }
+ }
+ }
+
+ }
+
+ return newPackageVersion;
+ }
+
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public PackageVersion persistPackageVersion(PackageVersion pv) {
// EM.persist requires related entities to be attached, let's attach them now
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentManagerLocal.java
index d07f87a..ab9d46c 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentManagerLocal.java
@@ -341,4 +341,7 @@ public interface ContentManagerLocal {
byte[] getPackageBytes(Subject user, int resourceId, int installedPackageId);
+ PackageVersion uploadPlatformPackageVersion(Subject subject, String packageName, int packageTypeId, String version,
+ Integer architectureId, String fileName, byte[] packageBytes, boolean dbmode);
+
}
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentManagerRemote.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentManagerRemote.java
index 1b28633..1ef07a4 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentManagerRemote.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentManagerRemote.java
@@ -163,4 +163,13 @@ public interface ContentManagerRemote {
byte[] getPackageBytes(@WebParam(name = "subject") Subject user, @WebParam(name = "resourceId") int resourceId,
@WebParam(name = "installedPackageId") int installedPackageId);
+ @WebMethod
+ PackageVersion uploadPlatformPackageVersion(@WebParam(name = "subject") Subject user,
+ @WebParam(name = "packageName") String packageName, //
+ @WebParam(name = "packageTypeId") int packageTypeId, //
+ @WebParam(name = "version") String version, //
+ @WebParam(name = "architectureId") Integer architectureId, //
+ @WebParam(name = "fileName") String fileName, //
+ @WebParam(name = "packageBytes") byte[] packageBytes, //
+ @WebParam(name = "dbmode") boolean dbmode);
}
\ No newline at end of file
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 cc1b11b..e08531e 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
@@ -2022,7 +2022,7 @@ public class ContentSourceManagerBean implements ContentSourceManagerLocal {
return distBitsFile;
}
- private File getPackageBitsLocalFilesystemFile(int packageVersionId, String fileName) {
+ protected File getPackageBitsLocalFilesystemFile(int packageVersionId, String fileName) {
String filesystem = System.getProperty(FILESYSTEM_PROPERTY);
@@ -2074,7 +2074,7 @@ public class ContentSourceManagerBean implements ContentSourceManagerLocal {
return distBitsFile;
}
- private File getPackageBitsLocalFileAndCreateParentDir(int packageVersionId, String fileName) throws Exception {
+ File getPackageBitsLocalFileAndCreateParentDir(int packageVersionId, String fileName) throws Exception {
File packageBitsFile = getPackageBitsLocalFilesystemFile(packageVersionId, fileName);
File parentDir = packageBitsFile.getParentFile();
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
index a111f46..c7f61c2 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
@@ -1076,4 +1076,10 @@ public class WebservicesManagerBean implements WebservicesRemote {
public List<EntitlementCertificate> getCertificates(Subject subject, int resourceId) {
return entitlementManager.getCertificates(subject, resourceId);
}
+
+ public PackageVersion uploadPlatformPackageVersion(Subject user, String packageName, int packageTypeId,
+ String version, Integer architectureId, String fileName, byte[] packageBytes, boolean dbmode) {
+ return contentManager.uploadPlatformPackageVersion(user, packageName, packageTypeId, version, architectureId,
+ fileName, packageBytes, dbmode);
+ }
}