rt = knownResourceTypes.get(rt);
}
}
// find the new package's type (package types should already exist, agent plugin descriptors define them)
PackageType pt = new PackageType(key.getPackageTypeName(), rt);
if (!knownPackageTypes.containsKey(pt)) {
if (rt != null) {
q = entityManager.createNamedQuery(PackageType.QUERY_FIND_BY_RESOURCE_TYPE_ID_AND_NAME);
q.setParameter("typeId", rt.getId());
} else {
q = entityManager.createNamedQuery(PackageType.QUERY_FIND_BY_NAME_AND_NULL_RESOURCE_TYPE);
}
q.setParameter("name", pt.getName());
try {
pt = (PackageType) q.getSingleResult();
pt.setResourceType(rt); // we don't fetch join this, but we already know it, so just set it
knownPackageTypes.put(pt, pt); // cache it so we don't have to keep querying the DB
} catch (NoResultException nre) {
log.warn("Content source adapter found a package of an unknown package type ["
+ key.getPackageTypeName() + "|" + rt + "] Skipping it.");
continue; // skip this one but move on to the next
}
} else {
pt = knownPackageTypes.get(pt);
}
// create the new package, if one does not already exist
// we don't bother caching these - we won't have large amounts of the same packages
q = entityManager.createNamedQuery(Package.QUERY_FIND_BY_NAME_PKG_TYPE_RESOURCE_TYPE);
q.setParameter("name", newDetails.getName());
q.setParameter("packageTypeName", newDetails.getPackageTypeName());
q.setParameter("resourceTypeId", rt != null ? rt.getId() : null);
Package pkg;
try {
pkg = (Package) q.getSingleResult();
} catch (NoResultException nre) {
pkg = new Package(newDetails.getName(), pt);
pkg.setClassification(newDetails.getClassification());
// we would have liked to rely on merge cascading when we merge the PV
// but we need to watch out for the fact that we could be running at the
// same time an agent sent us a content report that wants to create the same package.
// if this is too hard a hit on performance, we can comment out the below line
// and just accept the fact we might fail if the package is created underneath us,
// which would cause our tx to rollback. the next sync should help us survive this failure.
pkg = this.contentManager.persistOrMergePackageSafely(pkg);
}
// find and, if necessary create, the architecture
Architecture arch = new Architecture(newDetails.getArchitectureName());
if (!knownArchitectures.containsKey(arch)) {
q = entityManager.createNamedQuery(Architecture.QUERY_FIND_BY_NAME);
q.setParameter("name", arch.getName());
try {
arch = (Architecture) q.getSingleResult();
knownArchitectures.put(arch, arch); // cache it so we don't have to keep querying the DB
} catch (NoResultException nre) {
log.info("Content source adapter found a previously unknown architecture [" + arch
+ "] - it will be added to the list of known architectures");
}
} else {
arch = knownArchitectures.get(arch);
}
// now finally create the new package version - this cascade-persists down several levels
// note that other content sources might already be previously defined this, so only
// persist it if it does not yet exist
PackageVersion pv = new PackageVersion(pkg, newDetails.getVersion(), arch);
pv.setDisplayName(newDetails.getDisplayName());
pv.setDisplayVersion(newDetails.getDisplayVersion());
pv.setExtraProperties(newDetails.getExtraProperties());
pv.setFileCreatedDate(newDetails.getFileCreatedDate());
pv.setFileName(newDetails.getFileName());
pv.setFileSize(newDetails.getFileSize());
pv.setLicenseName(newDetails.getLicenseName());
pv.setLicenseVersion(newDetails.getLicenseVersion());
pv.setLongDescription(newDetails.getLongDescription());
pv.setMD5(newDetails.getMD5());
pv.setMetadata(newDetails.getMetadata());
pv.setSHA256(newDetails.getSHA256());
pv.setShortDescription(newDetails.getShortDescription());
q = entityManager.createNamedQuery(PackageVersion.QUERY_FIND_BY_PACKAGE_DETAILS_KEY);
q.setParameter("packageName", newDetails.getName());
q.setParameter("packageTypeName", pt.getName());
q.setParameter("resourceType", rt);
q.setParameter("architectureName", arch.getName());
q.setParameter("version", newDetails.getVersion());
try {