/* * 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.configuration.test; import java.util.HashMap; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.Query; import javax.transaction.TransactionManager; import org.testng.annotations.Test; import org.rhq.core.domain.configuration.definition.ConfigurationDefinition; import org.rhq.core.domain.configuration.definition.ConfigurationFormat; import org.rhq.core.domain.configuration.definition.PropertyDefinition; import org.rhq.core.domain.configuration.definition.PropertyDefinitionEnumeration; import org.rhq.core.domain.configuration.definition.PropertyDefinitionList; import org.rhq.core.domain.configuration.definition.PropertyDefinitionMap; import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple; import org.rhq.core.domain.configuration.definition.PropertyGroupDefinition; import org.rhq.core.domain.configuration.definition.PropertySimpleType; import org.rhq.core.domain.configuration.definition.constraint.Constraint; import org.rhq.core.domain.configuration.definition.constraint.FloatRangeConstraint; import org.rhq.core.domain.test.AbstractEJB3Test; public class ConfigurationDefinitionTest extends AbstractEJB3Test { public static final String CONFIG_NAME = "TEST_CONFIG"; public static final String TEST_CONFIG_CONSTRAINT_NAME = "CONFIG_CONSTRAINT_TEST"; @Test(groups = "integration.ejb3") public void testStoreDefinition() throws Exception { TransactionManager transactionManager = getTransactionManager(); transactionManager.begin(); try { EntityManager em = getEntityManager(); ConfigurationDefinition definition = new ConfigurationDefinition(CONFIG_NAME, "Config definition for the thing"); definition.setConfigurationFormat(ConfigurationFormat.STRUCTURED); definition.put(new PropertyDefinitionSimple("SimpleProp", "My Simple Property", true, PropertySimpleType.STRING)); definition.put(new PropertyDefinitionMap("MapProp", "Map Properties", true, new PropertyDefinitionSimple( "IntInMap", "Integer In Map", true, PropertySimpleType.INTEGER))); PropertyDefinitionSimple enumeratedString = new PropertyDefinitionSimple("ConnectionType", "My conn type", true, PropertySimpleType.STRING); enumeratedString.addEnumeratedValues(new PropertyDefinitionEnumeration("Local", "local"), new PropertyDefinitionEnumeration("JSR160", "jsr160"), new PropertyDefinitionEnumeration("JBoss", "jboss")); enumeratedString.setAllowCustomEnumeratedValue(true); PropertyGroupDefinition basicGroup = new PropertyGroupDefinition("Basic Group"); enumeratedString.setPropertyGroupDefinition(basicGroup); definition.put(enumeratedString); PropertyDefinitionSimple secondGroupedProperty = new PropertyDefinitionSimple("SimpleBool", "bool", false, PropertySimpleType.BOOLEAN); secondGroupedProperty.setPropertyGroupDefinition(basicGroup); definition.put(secondGroupedProperty); em.persist(definition); testReadDefinition(em); } catch (Exception e) { e.printStackTrace(); throw e; } finally { transactionManager.rollback(); } } private void testReadDefinition(EntityManager em) throws Exception { Query query = em.createQuery("select e from ConfigurationDefinition e where e.name = :name"); List<ConfigurationDefinition> definitions = query.setParameter("name", CONFIG_NAME).getResultList(); HashMap<Integer, PropertyGroupDefinition> doomedGroups = new HashMap<Integer, PropertyGroupDefinition>(); for (ConfigurationDefinition definition : definitions) { prettyPrintConfigurationDefinition(definition); for (PropertyGroupDefinition def : definition.getGroupDefinitions()) { doomedGroups.put(def.getId(), def); } em.remove(definition); } for (PropertyGroupDefinition doomed : doomedGroups.values()) { em.remove(doomed); } } @Test(groups = "integration.ejb3") public void testEnumeratedValues() throws Exception { TransactionManager transactionManager = getTransactionManager(); transactionManager.begin(); try { EntityManager em = getEntityManager(); String testDefName = "CONFIG_ENUM_VAL_TEST"; ConfigurationDefinition def = new ConfigurationDefinition(testDefName, "test data"); PropertyDefinitionSimple prop = new PropertyDefinitionSimple("EnumeratedProperty", "", true, PropertySimpleType.STRING); prop.addEnumeratedValues(new PropertyDefinitionEnumeration("A", "a"), new PropertyDefinitionEnumeration( "B", "b")); def.put(prop); em.persist(def); List<ConfigurationDefinition> definitions = em.createQuery( "select e from ConfigurationDefinition e where e.name = :name").setParameter("name", testDefName) .getResultList(); for (ConfigurationDefinition definition : definitions) { prettyPrintConfigurationDefinition(definition); PropertyDefinitionSimple propDef = definition.getPropertyDefinitionSimple("EnumeratedProperty"); System.out.println("Before: " + propDef.getEnumeratedValues()); PropertyDefinitionEnumeration enumVal = propDef.getEnumeratedValues().remove(0); propDef.getEnumeratedValues().add(enumVal); definition = em.merge(definition); System.out.println("After: " + definition.getPropertyDefinitionSimple("EnumeratedProperty").getEnumeratedValues()); assert (definition.getPropertyDefinitionSimple("EnumeratedProperty").getEnumeratedValues().get(0) .getValue().equals("b")) : "Values were not properly reordered"; em.remove(definition); } } finally { transactionManager.rollback(); } } @Test(groups = "integration.ejb3") public void testStoreConstraints() throws Exception { TransactionManager transactionManager = getTransactionManager(); transactionManager.begin(); try { EntityManager em = getEntityManager(); ConfigurationDefinition def = new ConfigurationDefinition(TEST_CONFIG_CONSTRAINT_NAME, "test data"); PropertyDefinitionSimple prop = new PropertyDefinitionSimple("ConstrainedProperty", "", true, PropertySimpleType.FLOAT); prop.addConstraints(new FloatRangeConstraint(1d, 3d)); def.put(prop); em.persist(def); testReadConstraints(em); } catch (Exception e) { e.printStackTrace(); throw e; } finally { transactionManager.rollback(); } } private void testReadConstraints(EntityManager em) throws Exception { Query query = em.createQuery("select e from ConfigurationDefinition e where e.name = :name"); List<ConfigurationDefinition> definitions = query.setParameter("name", TEST_CONFIG_CONSTRAINT_NAME) .getResultList(); for (ConfigurationDefinition definition : definitions) { prettyPrintConfigurationDefinition(definition); PropertyDefinitionSimple propDef = definition.getPropertyDefinitionSimple("ConstrainedProperty"); for (Constraint constraint : propDef.getConstraints()) { System.out.println("Constraint: " + constraint); } em.remove(definition); } } public static void prettyPrintConfigurationDefinition(ConfigurationDefinition definition) { System.out.println("Configuration definition: " + definition.getName() + " (" + definition.getDescription() + ")"); for (PropertyDefinition propertyDefinition : definition.getPropertyDefinitions().values()) { prettyPrintPropertyDefinition(propertyDefinition, 1); } } private static void prettyPrintPropertyDefinition(PropertyDefinition propDef, int indent) { if (propDef instanceof PropertyDefinitionList) { indent(indent); System.out.println("List Property [" + propDef.getName() + "]"); indent(indent); prettyPrintPropertyDefinition(((PropertyDefinitionList) propDef).getMemberDefinition(), indent + 1); } else if (propDef instanceof PropertyDefinitionMap) { for (int i = 0; i < indent; i++) { System.out.print("\t"); } System.out.println("Map Property [" + propDef.getName() + "]"); for (PropertyDefinition p : ((PropertyDefinitionMap) propDef).getMap().values()) { prettyPrintPropertyDefinition(p, indent + 1); } } else if (propDef instanceof PropertyDefinitionSimple) { for (int i = 0; i < indent; i++) { System.out.print("\t"); } System.out.println(propDef.toString()); } } private static void indent(int indent) { for (int i = 0; i < indent; i++) { System.out.print("\t"); } } }