/* * 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.test; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Map; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.NoResultException; import javax.persistence.Query; import org.hibernate.Session; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.metadata.ClassMetadata; import org.testng.Assert; import org.testng.annotations.Test; import org.rhq.core.domain.alert.Alert; import org.rhq.core.domain.alert.AlertCondition; import org.rhq.core.domain.alert.AlertConditionLog; import org.rhq.core.domain.alert.AlertDefinition; import org.rhq.core.domain.alert.notification.AlertNotification; import org.rhq.core.domain.auth.Principal; import org.rhq.core.domain.auth.Subject; import org.rhq.core.domain.authz.Role; import org.rhq.core.domain.bundle.Bundle; import org.rhq.core.domain.bundle.BundleDeployment; import org.rhq.core.domain.bundle.BundleFile; import org.rhq.core.domain.bundle.BundleResourceDeployment; import org.rhq.core.domain.bundle.BundleType; import org.rhq.core.domain.bundle.BundleVersion; import org.rhq.core.domain.bundle.BundleVersionRepo; import org.rhq.core.domain.cloud.Server; import org.rhq.core.domain.common.SystemConfiguration; import org.rhq.core.domain.content.Architecture; import org.rhq.core.domain.content.ContentServiceRequest; import org.rhq.core.domain.content.ContentSource; import org.rhq.core.domain.content.ContentSourceSyncResults; import org.rhq.core.domain.content.ContentSourceType; import org.rhq.core.domain.content.InstalledPackage; import org.rhq.core.domain.content.PackageBits; import org.rhq.core.domain.content.PackageInstallationStep; 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.Repo; import org.rhq.core.domain.event.Event; import org.rhq.core.domain.install.remote.AgentInstall; import org.rhq.core.domain.measurement.MeasurementDataNumeric1D; import org.rhq.core.domain.measurement.MeasurementDataNumeric1H; import org.rhq.core.domain.measurement.MeasurementDataNumeric6H; import org.rhq.core.domain.measurement.MeasurementDataTrait; import org.rhq.core.domain.measurement.MeasurementDefinition; import org.rhq.core.domain.measurement.MeasurementSchedule; import org.rhq.core.domain.measurement.calltime.CallTimeDataKey; import org.rhq.core.domain.measurement.calltime.CallTimeDataValue; import org.rhq.core.domain.operation.GroupOperationHistory; import org.rhq.core.domain.operation.GroupOperationScheduleEntity; import org.rhq.core.domain.operation.OperationDefinition; import org.rhq.core.domain.operation.OperationHistory; import org.rhq.core.domain.operation.OperationScheduleEntity; import org.rhq.core.domain.operation.ResourceOperationHistory; import org.rhq.core.domain.operation.ResourceOperationScheduleEntity; 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.resource.group.GroupDefinition; import org.rhq.core.domain.resource.group.ResourceGroup; import org.rhq.core.domain.server.PersistenceUtility; import org.rhq.core.domain.util.OrderingField; import org.rhq.core.domain.util.PageOrdering; import org.rhq.core.util.exception.ThrowableUtil; @SuppressWarnings("unchecked") public class QueryAllTest extends AbstractEJB3Test { protected SessionFactoryImplementor sessionFactory; private static final String[] ENTITY_NAMES = { // auth stuff Principal.class.getSimpleName(), Subject.class.getSimpleName(), Role.class.getSimpleName(), SystemConfiguration.class.getSimpleName(), // op stuff OperationDefinition.class.getSimpleName(), OperationHistory.class.getSimpleName(), ResourceOperationHistory.class.getSimpleName(), GroupOperationHistory.class.getSimpleName(), OperationScheduleEntity.class.getSimpleName(), ResourceOperationScheduleEntity.class.getSimpleName(), GroupOperationScheduleEntity.class.getSimpleName(), // alert stuff Alert.class.getSimpleName(), AlertCondition.class.getSimpleName(), AlertConditionLog.class.getSimpleName(), AlertDefinition.class.getSimpleName(), AlertNotification.class.getSimpleName(), // measurement stuff MeasurementDataTrait.class.getSimpleName(), MeasurementDataNumeric1H.class.getSimpleName(), MeasurementDataNumeric6H.class.getSimpleName(), MeasurementDataNumeric1D.class.getSimpleName(), MeasurementDefinition.class.getSimpleName(), MeasurementSchedule.class.getSimpleName(), // agent/inventory stuff // Plugin.class.getSimpleName(), do not test this - its got a blob that may be very large Agent.class.getSimpleName(), AgentInstall.class.getSimpleName(), Resource.class.getSimpleName(), ResourceType.class.getSimpleName(), // HA stuff Server.class.getSimpleName(), // content stuff Architecture.class.getSimpleName(), Repo.class.getSimpleName(), ContentServiceRequest.class.getSimpleName(), ContentSource.class.getSimpleName(), ContentSourceType.class.getSimpleName(), InstalledPackage.class.getSimpleName(), Package.class.getSimpleName(), PackageBits.class.getSimpleName(), PackageInstallationStep.class.getSimpleName(), PackageType.class.getSimpleName(), PackageVersion.class.getSimpleName(), PackageVersionContentSource.class.getSimpleName(), ContentSourceSyncResults.class.getSimpleName(), // bundle stuff BundleType.class.getSimpleName(), Bundle.class.getSimpleName(), BundleVersion.class.getSimpleName(), BundleVersionRepo.class.getSimpleName(), BundleDeployment.class.getSimpleName(), BundleFile.class.getSimpleName(), BundleResourceDeployment.class.getSimpleName(), // group stuff GroupDefinition.class.getSimpleName(), ResourceGroup.class.getSimpleName(), // event Event.class.getSimpleName(), // measurement calltime CallTimeDataKey.class.getSimpleName(), CallTimeDataValue.class.getSimpleName() }; @Test(groups = "integration.ejb3") public void testQueryAllEntities() throws Exception { for (String entityName : ENTITY_NAMES) { System.out.print("Querying " + entityName); Query query = em.createQuery("SELECT e FROM " + entityName + " e"); query.setMaxResults(100); try { Collection results = query.getResultList(); System.out.println(", found: " + results.size()); // if (results.size() > 0) { // System.out.println("### toString: " + results.iterator().next()); } catch (Throwable t) { assert false : "Failed to query for entity " + entityName + ": " + ThrowableUtil.getAllMessages(t, true); } } } @Test(groups = "integration.ejb3") public void testSimpleQueryWithOrderBy() throws Exception { Query q = em.createNamedQuery(SystemConfiguration.QUERY_FIND_ALL); List l = q.getResultList(); int results = l.size(); for (PageOrdering ord : PageOrdering.values()) { q = PersistenceUtility.createQueryWithOrderBy(em, SystemConfiguration.QUERY_FIND_ALL, new OrderingField( "propertyKey", ord)); l = q.getResultList(); Assert.assertEquals(results, l.size()); } } @Test(groups = "integration.ejb3") public void testSimpleQueryWithMultipleOrderByAndCount() throws Exception { String queryString = "SELECT COUNT(*) FROM Subject s WHERE s.fsystem = false"; Query q = em.createQuery(queryString); long count = (Long) q.getSingleResult(); queryString = "SELECT s FROM Subject s WHERE s.fsystem = false ORDER BY s.firstName ASC, s.lastName DESC"; q = em.createQuery(queryString); long size = q.getResultList().size(); assert count == size; } @Test(groups = "integration.ejb3") public void testAdvQueryWithOrderby() throws Exception { Query q = em.createNamedQuery(SystemConfiguration.QUERY_FIND_ALL); List l = q.getResultList(); int results = l.size(); for (PageOrdering order : PageOrdering.values()) { q = PersistenceUtility.createQueryWithOrderBy(em, SystemConfiguration.QUERY_FIND_ALL, new OrderingField( "propertyKey", order)); l = q.getResultList(); Assert.assertEquals(results, l.size()); } } @Test(groups = "integration.ejb3") public void testCountQuery() throws Exception { Long count = (Long) PersistenceUtility.createCountQuery(em, SystemConfiguration.QUERY_FIND_ALL) .getSingleResult(); System.out.println("Transformed query to get count found: " + count); } /** * Run those NamedQueries that do not need parameters to be set. * * @throws Exception */ @Test(groups = "integration.ejb3") public void testQueryAllSimpleNamedQueries() throws Exception { Object o = em.getDelegate(); Class del = o.getClass(); System.out.println("Delegate is " + del.toString()); Session sess = (Session) o; // Hibernate Session in JBoss sessionFactory = (SessionFactoryImplementor) sess.getSessionFactory(); Map cMeta = sessionFactory.getAllClassMetadata(); List<String> configuredEntities = Arrays.asList(ENTITY_NAMES); Collection<ClassMetadata> metas = cMeta.values(); try { for (ClassMetadata cm : metas) { String entity = cm.getEntityName(); String shortName = entity.substring(entity.lastIndexOf(".") + 1); // Skip entites that are not in above list if (!configuredEntities.contains(shortName)) { //System.out.println("== Skipping " + entity ); continue; } System.out.println("Testing queries for: " + shortName); List<NamedQuery> nqs = getNamedQueriesForEntity(entity); for (NamedQuery nq : nqs) { boolean hasId; // Skip those with non-ID parameters for now, as we dont not // know how to obtain the parameters from Hibernate, as // they are not set when parsing the NamedQuery annotation :-( // we can just give bogus ID numbers by param indexes. // I would like to use the regex (nq.query().matches(".*:(?!([a-zA-Z]*[iI]d)[ =]).*")) // to match anything like :*id or :*Id but too hard to think how to // set the parameter names. so for now, just look for :id (ignore :ids too) if (nq.query().matches(".*:(?!(id([^s]|$))).*")) { continue; } hasId = nq.query().contains(":id"); if (nq.query().contains("UPDATE ") || nq.query().contains("update ")) { continue; } if (nq.query().contains("DELETE ") || nq.query().contains("delete ")) { continue; } if (nq.query().contains("INSERT ") || nq.query().contains("insert ")) { continue; } try { //System.out.print(" == query " + nq.name()); Query query = em.createNamedQuery(nq.name()); // TODO set parameters here // fillParameters(query, nq); // if we have some ID params, just set them to something if (hasId) { query.setParameter("id", Integer.valueOf(0)); //System.out.println("Query with ID parameter: " + nq.query()); } query.setMaxResults(5); Collection results = query.getResultList(); System.out.println(" " + nq.name() + "==> #results: " + results.size()); } catch (Throwable t) { assert false : "Failed to query named query " + nq.name() + ": " + ThrowableUtil.getAllMessages(t, true); } } } } catch (NoResultException nre) { System.out.println(" ==> no results found"); } } /** * Return the NamedQueries from the entity class * * @param entity * * @return not null */ public List<NamedQuery> getNamedQueriesForEntity(String entity) { List<NamedQuery> lnq = new ArrayList<NamedQuery>(); ClassLoader cl = getClass().getClassLoader(); Class<?> clazz; try { clazz = cl.loadClass(entity); // System.out.println(" Class " + clazz.getName() + " found"); } catch (ClassNotFoundException c) { // System.err.println(" Entity class " + entity + " not found"); return lnq; } if (clazz.isAnnotationPresent(NamedQuery.class)) { NamedQuery nq = clazz.getAnnotation(NamedQuery.class); lnq.add(nq); } else if (clazz.isAnnotationPresent(NamedQueries.class)) { NamedQueries nqs = clazz.getAnnotation(NamedQueries.class); NamedQuery[] nq = nqs.value(); for (int j = 0; j < nq.length; j++) { lnq.add(nq[j]); } } return lnq; } // public void fillParameters(Query q, NamedQuery namedQuery) // { // String queryName = namedQuery.name(); // String queryString = namedQuery.query(); // System.out.println(" >> Looking at " + queryString); // // NamedQueryDefinition nqd = fac.getNamedQuery(queryName); // System.out.println("NQD ist " + nqd); // Map params = nqd.getParameterTypes(); // System.out.println("Map ist " + params); // System.out.println("NQD.cache " + nqd.getCacheRegion()); // System.out.println("NQD.flush " + nqd.getFlushMode()); // System.out.println("NQD.query " + nqd.getQuery()); // System.out.println("NQD.queryString " + nqd.getQueryString()); // // Pattern p = Pattern.compile(":\\w+"); // Matcher m = p.matcher(queryString); // while (m.find()) // { // String par = m.group(); // par = par.substring(1); // first char is : // System.out.println(" >> " + m.group()); // q.setParameter(par, "1"); // } // } }