/* * 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, version 2, as * published by the Free Software Foundation, and/or the GNU Lesser * General Public License, version 2.1, also as published by the Free * Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License and the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU General Public License * and the GNU Lesser General Public License along with this program; * if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package org.rhq.core.domain.content.test; import java.util.List; import java.util.Random; import javax.persistence.EntityManager; import javax.persistence.Query; import org.testng.annotations.Test; import org.rhq.core.domain.configuration.Configuration; import org.rhq.core.domain.configuration.PropertySimple; import org.rhq.core.domain.content.Architecture; import org.rhq.core.domain.content.ContentSource; import org.rhq.core.domain.content.ContentSourceType; import org.rhq.core.domain.content.Package; import org.rhq.core.domain.content.PackageBits; import org.rhq.core.domain.content.PackageBitsBlob; import org.rhq.core.domain.content.PackageType; import org.rhq.core.domain.content.PackageVersion; import org.rhq.core.domain.content.PackageVersionContentSource; import org.rhq.core.domain.content.PackageVersionContentSourcePK; import org.rhq.core.domain.content.Repo; import org.rhq.core.domain.content.RepoContentSource; import org.rhq.core.domain.content.RepoPackageVersion; import org.rhq.core.domain.content.ResourceRepo; import org.rhq.core.domain.content.composite.PackageVersionMetadataComposite; import org.rhq.core.domain.resource.Resource; import org.rhq.core.domain.resource.ResourceCategory; import org.rhq.core.domain.resource.ResourceType; import org.rhq.core.domain.test.AbstractEJB3Test; /** * Test the many-to-many relationship that we model with an explicit entity representing the mapping table. * * @author John Mazzitelli */ @Test(groups = "integration.ejb3") public class PackageVersionContentSourceTest extends AbstractEJB3Test { public void testInsert() throws Exception { getTransactionManager().begin(); try { EntityManager em = getEntityManager(); ResourceType rt = new ResourceType("testPVCSResourceType", "testPlugin", ResourceCategory.PLATFORM, null); Resource resource = new Resource("testPVCSResource", "testPVCSResource", rt); resource.setUuid("" + new Random().nextInt()); Architecture arch = new Architecture("testPVCSInsertArch"); PackageType pt = new PackageType("testPVCSInsertPT", resource.getResourceType()); Package pkg = new Package("testPVCSInsertPackage", pt); PackageVersion pv = new PackageVersion(pkg, "version", arch); ContentSourceType cst = new ContentSourceType("testPVCSContentSourceType"); ContentSource cs = new ContentSource("testPVCSContentSource", cst); PackageVersionContentSource pvcs = new PackageVersionContentSource(pv, cs, "fooLocation"); Configuration csConfig = new Configuration(); csConfig.put(new PropertySimple("csConfig1", "csConfig1Value")); cs.setConfiguration(csConfig); Configuration pvConfig = new Configuration(); pvConfig.put(new PropertySimple("pvConfig1", "pvConfig1Value")); pv.setExtraProperties(pvConfig); String pvMetadata = "testInsertMetadata"; pv.setMetadata(pvMetadata.getBytes()); em.persist(rt); em.persist(resource); em.persist(arch); em.persist(pt); em.persist(pkg); em.persist(pv); em.persist(cst); em.persist(cs); em.persist(pvcs); em.flush(); em.clear(); PackageVersionContentSourcePK pk = new PackageVersionContentSourcePK(pv, cs); PackageVersionContentSource pvcsDup = em.find(PackageVersionContentSource.class, pk); em.clear(); assert pvcsDup != null; assert pvcsDup.equals(pvcs); assert pvcsDup.getLocation().equals("fooLocation"); PackageVersionContentSourcePK pkDup = pvcsDup.getPackageVersionContentSourcePK(); assert pkDup.getContentSource().getName().equals("testPVCSContentSource"); assert pkDup.getPackageVersion().getGeneralPackage().getName().equals("testPVCSInsertPackage"); Query q = em.createNamedQuery(PackageVersionContentSource.QUERY_FIND_BY_CONTENT_SOURCE_ID); q.setParameter("id", cs.getId()); List<PackageVersionContentSource> allPvcs = q.getResultList(); // make sure the fetch joining works by looking deep inside the objects assert allPvcs != null; assert allPvcs.size() == 1; pvcs = allPvcs.get(0); assert pvcs.getPackageVersionContentSourcePK() != null; assert pvcs.getLocation().equals("fooLocation"); assert pvcs.getPackageVersionContentSourcePK().getPackageVersion().equals(pv); assert pvcs.getPackageVersionContentSourcePK().getPackageVersion().getArchitecture().equals(arch); assert pvcs.getPackageVersionContentSourcePK().getPackageVersion().getGeneralPackage().equals(pkg); assert pvcs.getPackageVersionContentSourcePK().getPackageVersion().getExtraProperties().equals(pvConfig); assert new String(pvcs.getPackageVersionContentSourcePK().getPackageVersion().getMetadata()) .equals(pvMetadata); assert pvcs.getPackageVersionContentSourcePK().getContentSource().equals(cs); assert pvcs.getPackageVersionContentSourcePK().getContentSource().getConfiguration().equals(csConfig); assert pvcs.getPackageVersionContentSourcePK().getPackageVersion().getGeneralPackage().getPackageType() .getResourceType().equals(rt); // add repo and subscribe resource to it; test metadata query Repo repo = new Repo("testPVCSRepo"); em.persist(repo); RepoContentSource ccsmapping = repo.addContentSource(cs); em.persist(ccsmapping); ResourceRepo subscription = repo.addResource(resource); em.persist(subscription); RepoPackageVersion mapping = repo.addPackageVersion(pv); em.persist(mapping); em.flush(); repo = em.find(Repo.class, repo.getId()); assert repo.getResources().contains(resource); assert repo.getContentSources().contains(cs); q = em.createNamedQuery(PackageVersion.QUERY_FIND_METADATA_BY_RESOURCE_ID); q.setParameter("resourceId", resource.getId()); List<PackageVersionMetadataComposite> metadataList = q.getResultList(); assert metadataList.size() == 1 : "-->" + metadataList; PackageVersionMetadataComposite composite = metadataList.get(0); assert composite.getPackageVersionId() == pv.getId(); assert new String(composite.getMetadata()).equals(new String(pv.getMetadata())); assert new String(composite.getPackageDetailsKey().getName()).equals(pkg.getName()); assert new String(composite.getPackageDetailsKey().getVersion()).equals(pv.getVersion()); assert new String(composite.getPackageDetailsKey().getPackageTypeName()).equals(pt.getName()); assert new String(composite.getPackageDetailsKey().getArchitectureName()).equals(arch.getName()); em.clear(); // remove cs from pv pvcs = em.find(PackageVersionContentSource.class, pvcs.getPackageVersionContentSourcePK()); em.remove(pvcs); } finally { getTransactionManager().rollback(); } } public void testDelete() throws Exception { getTransactionManager().begin(); try { EntityManager em = getEntityManager(); ResourceType rt = new ResourceType("testPVCSResourceType", "testPlugin", ResourceCategory.PLATFORM, null); Resource resource = new Resource("testPVCSResource", "testPVCSResource", rt); resource.setUuid("" + new Random().nextInt()); Architecture arch = new Architecture("testPVCSInsertArch"); PackageType pt = new PackageType("testPVCSInsertPT", resource.getResourceType()); Package pkg = new Package("testPVCSInsertPackage", pt); PackageVersion pv = new PackageVersion(pkg, "version", arch); ContentSourceType cst = new ContentSourceType("testPVCSContentSourceType"); ContentSource cs = new ContentSource("testPVCSContentSource", cst); PackageVersionContentSource pvcs = new PackageVersionContentSource(pv, cs, "fooLocation"); Configuration csConfig = new Configuration(); csConfig.put(new PropertySimple("csConfig1", "csConfig1Value")); cs.setConfiguration(csConfig); Configuration pvConfig = new Configuration(); pvConfig.put(new PropertySimple("pvConfig1", "pvConfig1Value")); pv.setExtraProperties(pvConfig); em.persist(rt); em.persist(resource); em.persist(arch); em.persist(pt); em.persist(pkg); em.persist(pv); em.persist(cst); em.persist(cs); em.persist(pvcs); em.flush(); em.clear(); PackageVersionContentSourcePK pk = new PackageVersionContentSourcePK(pv, cs); PackageVersionContentSource pvcsDup = em.find(PackageVersionContentSource.class, pk); em.clear(); assert pvcsDup != null; assert pvcsDup.equals(pvcs); assert pvcsDup.getLocation().equals("fooLocation"); Query q = em.createNamedQuery(PackageVersionContentSource.DELETE_BY_CONTENT_SOURCE_ID); q.setParameter("contentSourceId", cs.getId()); assert 1 == q.executeUpdate(); em.clear(); } finally { getTransactionManager().rollback(); } } public void testDeleteOrphanedPV() throws Exception { getTransactionManager().begin(); try { EntityManager em = getEntityManager(); ResourceType rt = new ResourceType("testPVCSResourceType", "testPlugin", ResourceCategory.PLATFORM, null); Resource resource = new Resource("testPVCSResource", "testPVCSResource", rt); resource.setUuid("" + new Random().nextInt()); Architecture arch = new Architecture("testPVCSInsertArch"); PackageType pt = new PackageType("testPVCSInsertPT", resource.getResourceType()); Package pkg = new Package("testPVCSInsertPackage", pt); PackageBits bits = createPackageBits(em); PackageVersion pv = new PackageVersion(pkg, "version", arch); ContentSourceType cst = new ContentSourceType("testPVCSContentSourceType"); ContentSource cs = new ContentSource("testPVCSContentSource", cst); PackageVersionContentSource pvcs = new PackageVersionContentSource(pv, cs, "fooLocation"); Configuration csConfig = new Configuration(); csConfig.put(new PropertySimple("csConfig1", "csConfig1Value")); cs.setConfiguration(csConfig); Configuration pvConfig = new Configuration(); pvConfig.put(new PropertySimple("pvConfig1", "pvConfig1Value")); pv.setExtraProperties(pvConfig); bits.getBlob().setBits("testDeleteOrphanedPV".getBytes()); pv.setPackageBits(bits); em.persist(rt); em.persist(resource); em.persist(arch); em.persist(pt); em.persist(pkg); em.persist(pv); em.persist(cst); em.persist(cs); em.persist(pvcs); em.flush(); em.clear(); PackageVersionContentSourcePK pk = new PackageVersionContentSourcePK(pv, cs); PackageVersionContentSource pvcsDup = em.find(PackageVersionContentSource.class, pk); em.clear(); assert pvcsDup != null; assert pvcsDup.equals(pvcs); assert pvcsDup.getLocation().equals("fooLocation"); Query q = em.createNamedQuery(PackageVersionContentSource.DELETE_BY_CONTENT_SOURCE_ID); q.setParameter("contentSourceId", cs.getId()); assert 1 == q.executeUpdate(); em.clear(); PackageBits findBits = em.find(PackageBits.class, bits.getId()); assert findBits != null : "The bits did not cascade-persist for some reason"; assert findBits.getId() > 0 : "The package bits did not cascade-persist for some reason!"; assert new String(bits.getBlob().getBits()).equals(new String(findBits.getBlob().getBits())); q = em.createNamedQuery(PackageVersion.DELETE_IF_NO_CONTENT_SOURCES_OR_REPOS); assert 1 == q.executeUpdate(); em.clear(); q = em.createNamedQuery(PackageBits.DELETE_IF_NO_PACKAGE_VERSION); assert q.executeUpdate() > 0; em.clear(); findBits = em.find(PackageBits.class, bits.getId()); em.clear(); assert findBits == null : "The bits did not delete for some reason"; } finally { getTransactionManager().rollback(); } } private PackageBits createPackageBits(EntityManager em) { PackageBits bits = null; PackageBitsBlob blob = null; // We have to work backwards to avoid constraint violations. PackageBits requires a PackageBitsBlob, // so create and persist that first, getting the ID blob = new PackageBitsBlob(); em.persist(blob); // Now create the PackageBits entity and assign the Id and blob. Note, do not persist the // entity, the row already exists. Just perform and flush the update. bits = new PackageBits(); bits.setId(blob.getId()); bits.setBlob(blob); em.flush(); // return the new PackageBits and associated PackageBitsBlob return bits; } }