/*
* 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.measurement.test;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import org.testng.Assert;
import org.testng.annotations.Test;
import org.rhq.core.domain.measurement.Availability;
import org.rhq.core.domain.measurement.AvailabilityType;
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.resource.composite.ResourceWithAvailability;
import org.rhq.core.domain.test.AbstractEJB3Test;
/**
* Simple test case that loads a composite object (with constructor queries).
* This serves to be able to identify the number of selects
* generated.
*
* To see the SQL generated, on needs to set hibernate.show_sql=true in the
* default.persistence.properties
* @author Heiko W. Rupp
*/
public class CompositeLoadingTest extends AbstractEJB3Test {
@SuppressWarnings("unchecked")
@Test(groups = "integration.ejb3")
public void testLoading() throws Exception {
getTransactionManager().begin();
EntityManager em = getEntityManager();
try {
List<Integer> ids = setupTables(em);
em.flush();
em.clear(); // clear out the entity manager, so we have to go to the DB for everything.
// Now trigger the loading
Query q = em
.createQuery("SELECT new org.rhq.core.domain.resource.composite.ResourceWithAvailability(res, a.availabilityType) "
+ " FROM Resource res JOIN res.availability a "
+ " WHERE a.endTime IS NULL AND a.resource.id = res.id AND res.id IN (:ids) ");
q.setParameter("ids", ids);
List<ResourceWithAvailability> rwas = q.getResultList();
// multiple by 2 as each will have an initial UNKNOWN avail
Assert.assertEquals(rwas.size(), (ids.size() * 2),
"Incorrect number of ResourceWithAvailability entities returned - rwas=" + rwas + ", ids=" + ids);
rwas.clear();
em.clear();
q = em.createQuery("SELECT res, a.availabilityType " //
+ " FROM Resource res LEFT JOIN res.availability a "
+ " WHERE a.endTime IS NULL AND a.resource.id = res.id AND res.id IN (:ids) " //
+ " ORDER BY res.name");
q.setParameter("ids", ids);
List<Object[]> rwas2 = q.getResultList();
Assert.assertEquals(rwas2.size(), (ids.size() * 2)); // multiple by 2 as each will have an initial UNKNOWN avail
for (Object[] ob : rwas2) {
Resource r = (Resource) ob[0];
AvailabilityType at = (AvailabilityType) ob[1];
ResourceWithAvailability rwa = new ResourceWithAvailability(r, at);
rwas.add(rwa);
}
Assert.assertEquals(rwas.size(), (ids.size() * 2)); // multiple by 2 as each will have an initial UNKNOWN avail
} finally {
getTransactionManager().rollback();
}
}
private List<Integer> setupTables(EntityManager em) {
List<Integer> ids = new ArrayList<Integer>();
long t = System.currentTimeMillis() - 1000L;
Date date = new Date(t);
ResourceType resourceType = new ResourceType("fake platform", "fake plugin", ResourceCategory.PLATFORM, null);
em.persist(resourceType);
Resource platform = new Resource("org.jboss.on.TestPlatfor", "Fake Platform", resourceType);
platform.setUuid(UUID.randomUUID().toString());
em.persist(platform);
Availability a = new Availability(platform, date.getTime(), AvailabilityType.UP);
ids.add(platform.getId());
Resource platform2 = new Resource("org.jboss.on.TestPlatform2", "Fake Platform2", resourceType);
platform2.setUuid(UUID.randomUUID().toString());
em.persist(platform2);
Availability a2 = new Availability(platform2, date.getTime(), AvailabilityType.UP);
ids.add(platform2.getId());
Resource platform3 = new Resource("org.jboss.on.TestPlatform3", "Fake Platform3", resourceType);
platform3.setUuid(UUID.randomUUID().toString());
em.persist(platform3);
Availability a3 = new Availability(platform3, date.getTime(), AvailabilityType.UP);
ids.add(platform3.getId());
em.persist(a);
em.persist(a2);
em.persist(a3);
return ids;
}
}