/*
* RHQ Management Platform
* Copyright (C) 2005-2011 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 as published by
* the Free Software Foundation version 2 of the License.
*
* 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 for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.rhq.enterprise.server.xmlschema;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
import static org.testng.Assert.assertNotNull;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.ArrayList;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlRootElement;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.testng.annotations.Test;
import org.rhq.core.clientapi.descriptor.configuration.MapProperty;
import org.rhq.core.clientapi.descriptor.configuration.SimpleProperty;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.Property;
import org.rhq.core.domain.configuration.PropertyList;
import org.rhq.core.domain.configuration.PropertyMap;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
import org.rhq.core.domain.configuration.definition.PropertyDefinition;
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.PropertySimpleType;
import org.rhq.enterprise.server.xmlschema.generated.configuration.instance.ComplexValueMapDescriptor;
import org.rhq.enterprise.server.xmlschema.generated.configuration.instance.ComplexValueSimpleDescriptor;
import org.rhq.enterprise.server.xmlschema.generated.configuration.instance.ConfigurationInstanceDescriptor;
import org.rhq.enterprise.server.xmlschema.generated.configuration.instance.ListPropertyInstanceDescriptor;
import org.rhq.enterprise.server.xmlschema.generated.configuration.instance.SimplePropertyInstanceDescriptor;
/**
*
*
* @author Lukas Krejci
*/
@Test
public class ConfigurationInstanceDescriptorUtilTest {
private static final Log LOG = LogFactory.getLog(ConfigurationInstanceDescriptorUtilTest.class);
@XmlRootElement
public static final class StandaloneConfigurationInstance extends ConfigurationInstanceDescriptor {
public static StandaloneConfigurationInstance createFrom(ConfigurationInstanceDescriptor instance) {
StandaloneConfigurationInstance ret = new StandaloneConfigurationInstance();
ret.configurationProperty = new ArrayList<JAXBElement<?>>(instance.getConfigurationProperty());
return ret;
}
}
private static final Marshaller CONFIGURATION_INSTANCE_MARSHALLER;
private static final Unmarshaller CONFIGURATION_INSTANCE_UNMARSHALLER;
static {
try {
JAXBContext context = JAXBContext.newInstance(StandaloneConfigurationInstance.class);
CONFIGURATION_INSTANCE_MARSHALLER = context.createMarshaller();
CONFIGURATION_INSTANCE_UNMARSHALLER = context.createUnmarshaller();
} catch (Exception e) {
throw new IllegalStateException("Failed to initialize the configuration instance marshaller.", e);
}
}
public void testSimplePropertyConversion() throws Exception {
ConfigurationDefinition def = new ConfigurationDefinition("null", null);
PropertyDefinitionSimple propDef =
new PropertyDefinitionSimple("prop", "prop descr", true, PropertySimpleType.BOOLEAN);
def.put(propDef);
Configuration config = new Configuration();
PropertySimple prop = new PropertySimple("prop", "true");
config.put(prop);
ConfigurationInstanceDescriptor instance =
ConfigurationInstanceDescriptorUtil.createConfigurationInstance(def, config);
assertEquals(instance.getConfigurationProperty().size(), 1,
"Unexpected number of properties in the config instance.");
SimplePropertyInstanceDescriptor propInstance =
(SimplePropertyInstanceDescriptor) instance.getConfigurationProperty().get(0).getValue();
assertEquals(propInstance.getName(), "prop", "Unexpected property instance name");
assertEquals(propInstance.getValue(), "true", "Unexpected property instance value");
assertEquals(propInstance.getLongDescription(), "prop descr", "Unexpected property instance description");
assertTrue(propInstance.isRequired(), "Unexpected property instance required flag");
logInstance("Simple", instance);
}
public void testListOfSimplesPropertyConversion() throws Exception {
ConfigurationDefinition def = new ConfigurationDefinition("null", null);
PropertyDefinitionList listDef =
new PropertyDefinitionList("list", "list descr", true, new PropertyDefinitionSimple("prop", "prop descr",
false, PropertySimpleType.FLOAT));
def.put(listDef);
Configuration config = new Configuration();
PropertyList list =
new PropertyList("list", new PropertySimple("prop", "value1"), new PropertySimple("prop", "value2"));
config.put(list);
ConfigurationInstanceDescriptor instance =
ConfigurationInstanceDescriptorUtil.createConfigurationInstance(def, config);
assertEquals(instance.getConfigurationProperty().size(), 1,
"Unexpected number of properties in configuration instance.");
ListPropertyInstanceDescriptor listInstance =
(ListPropertyInstanceDescriptor) instance.getConfigurationProperty().get(0).getValue();
assertEquals(listInstance.getName(), "list", "Unexpected list instance name");
assertEquals(listInstance.getLongDescription(), "list descr", "Unexpected list instance description");
assertTrue(listInstance.isRequired(), "Unexpected list instance required flag");
SimpleProperty propDef = (SimpleProperty) listInstance.getConfigurationProperty().getValue();
assertEquals(propDef.getName(), "prop", "Unexpected simple instance name");
assertEquals(propDef.getLongDescription(), "prop descr", "Unexpected simple instance description");
assertTrue(!propDef.isRequired(), "Unexpected simple instance required flag");
assertEquals(listInstance.getValues().getComplexValue().size(), 2, "Unexpected number of list values");
ComplexValueSimpleDescriptor value1 =
(ComplexValueSimpleDescriptor) listInstance.getValues().getComplexValue().get(0).getValue();
ComplexValueSimpleDescriptor value2 =
(ComplexValueSimpleDescriptor) listInstance.getValues().getComplexValue().get(1).getValue();
assertEquals(value1.getValue(), "value1");
assertEquals(value2.getValue(), "value2");
logInstance("List of simples", instance);
}
public void testListOfMapsPropertyConversion() throws Exception {
ConfigurationDefinition def = new ConfigurationDefinition("null", null);
PropertyDefinitionList listDef =
new PropertyDefinitionList("list", "list descr", true, new PropertyDefinitionMap("map", "map descr", true,
new PropertyDefinitionSimple("prop1", "prop1 descr", true, PropertySimpleType.BOOLEAN),
new PropertyDefinitionSimple("prop2", "prop2 descr", false, PropertySimpleType.PASSWORD)));
def.put(listDef);
Configuration config = new Configuration();
PropertyList list =
new PropertyList("list", new PropertyMap("map", new PropertySimple("prop1", "value1"), new PropertySimple(
"prop2", "value1")), new PropertyMap("map", new PropertySimple("prop1", "value2"), new PropertySimple(
"prop2", "value2")));
config.put(list);
ConfigurationInstanceDescriptor instance =
ConfigurationInstanceDescriptorUtil.createConfigurationInstance(def, config);
assertEquals(instance.getConfigurationProperty().size(), 1,
"Unexpected number of properties in configuration instance.");
ListPropertyInstanceDescriptor listInstance =
(ListPropertyInstanceDescriptor) instance.getConfigurationProperty().get(0).getValue();
assertEquals(listInstance.getName(), "list", "Unexpected list instance name");
assertEquals(listInstance.getLongDescription(), "list descr", "Unexpected list instance description");
assertTrue(listInstance.isRequired(), "Unexpected list instance required flag");
MapProperty propDef = (MapProperty) listInstance.getConfigurationProperty().getValue();
assertEquals(propDef.getName(), "map", "Unexpected simple instance name");
assertEquals(propDef.getLongDescription(), "map descr", "Unexpected simple instance description");
assertTrue(propDef.isRequired(), "Unexpected simple instance required flag");
assertEquals(listInstance.getValues().getComplexValue().size(), 2, "Unexpected number of list values");
ComplexValueMapDescriptor map1 =
(ComplexValueMapDescriptor) listInstance.getValues().getComplexValue().get(0).getValue();
ComplexValueMapDescriptor map2 =
(ComplexValueMapDescriptor) listInstance.getValues().getComplexValue().get(1).getValue();
assertEquals(map1.getComplexValue().size(), 2, "Unexpected number of map elements in the first map value.");
assertEquals(map2.getComplexValue().size(), 2, "Unexpected number of map elements in the second map value.");
ComplexValueSimpleDescriptor value11 = (ComplexValueSimpleDescriptor) map1.getComplexValue().get(0).getValue();
ComplexValueSimpleDescriptor value12 = (ComplexValueSimpleDescriptor) map1.getComplexValue().get(1).getValue();
ComplexValueSimpleDescriptor value21 = (ComplexValueSimpleDescriptor) map2.getComplexValue().get(0).getValue();
ComplexValueSimpleDescriptor value22 = (ComplexValueSimpleDescriptor) map2.getComplexValue().get(1).getValue();
assertEquals(value11.getPropertyName(), "prop1", "Unexpected name of the first property in the first map value");
assertEquals(value11.getValue(), "value1", "Unexpected value of the first property in the first map value");
assertEquals(value12.getPropertyName(), "prop2", "Unexpected name of the second property in the first map value");
assertEquals(value12.getValue(), "value1", "Unexpected value of the second property in the first map value");
assertEquals(value21.getPropertyName(), "prop1", "Unexpected name of the first property in the second map value");
assertEquals(value21.getValue(), "value2", "Unexpected value of the first property in the second map value");
assertEquals(value22.getPropertyName(), "prop2", "Unexpected name of the second property in the second map value");
assertEquals(value22.getValue(), "value2", "Unexpected value of the second property in the second map value");
logInstance("List of maps", instance);
}
public void testMapOfComplexPropertyConversion() {
//TODO implement
}
public void testReverseSimplePropertyConversion() throws Exception {
String xml = "" +
"<standaloneConfigurationInstance xmlns:ci='urn:xmlns:rhq-configuration-instance' xmlns:c='urn:xmlns:rhq-configuration'>" +
" <ci:simple-property value='42' name='my-name' type='integer'/>" +
"</standaloneConfigurationInstance>";
ConfigurationInstanceDescriptor descriptor = (ConfigurationInstanceDescriptor) CONFIGURATION_INSTANCE_UNMARSHALLER.unmarshal(new StringReader(xml));
ConfigurationInstanceDescriptorUtil.ConfigurationAndDefinition ccd = ConfigurationInstanceDescriptorUtil.createConfigurationAndDefinition(descriptor);
ConfigurationDefinition def = ccd.definition;
Configuration conf = ccd.configuration;
assertEquals(def.getPropertyDefinitions().size(), 1, "Unexpected number of defined properties");
assertEquals(conf.getProperties().size(), 1, "Unexpected number of properties");
PropertyDefinition propDef = def.get("my-name");
Property prop = conf.get("my-name");
assertNotNull(propDef, "Could not find the expected property definition");
assertNotNull(prop, "Could not find the expected property");
assertEquals(propDef.getClass(), PropertyDefinitionSimple.class, "Unexpected type of the property definition");
assertEquals(prop.getClass(), PropertySimple.class, "Unexpecetd type of the property");
PropertyDefinitionSimple simpleDef = (PropertyDefinitionSimple) propDef;
PropertySimple simpleProp = (PropertySimple) prop;
assertEquals(simpleDef.getType(), PropertySimpleType.INTEGER, "Unexpected type of the simple property definition");
assertEquals(simpleProp.getIntegerValue(), Integer.valueOf(42), "Unexpected value of the simple property");
}
public void testReverseListPropertyConversion() throws Exception {
String xml = "" +
"<standaloneConfigurationInstance xmlns:ci='urn:xmlns:rhq-configuration-instance' xmlns:c='urn:xmlns:rhq-configuration'>" +
" <ci:list-property name='list'>" +
" <c:simple-property name='member' type='integer'/>" +
" <ci:values>" +
" <ci:simple-value value='1'/>" +
" <ci:simple-value value='2'/>" +
" <ci:simple-value value='3'/>" +
" </ci:values>" +
" </ci:list-property>" +
"</standaloneConfigurationInstance>";
ConfigurationInstanceDescriptor descriptor = (ConfigurationInstanceDescriptor) CONFIGURATION_INSTANCE_UNMARSHALLER.unmarshal(new StringReader(xml));
ConfigurationInstanceDescriptorUtil.ConfigurationAndDefinition ccd = ConfigurationInstanceDescriptorUtil.createConfigurationAndDefinition(descriptor);
ConfigurationDefinition def = ccd.definition;
Configuration conf = ccd.configuration;
assertEquals(def.getPropertyDefinitions().size(), 1, "Unexpected number of defined properties");
assertEquals(conf.getProperties().size(), 1, "Unexpected number of properties");
PropertyDefinition propDef = def.get("list");
Property prop = conf.get("list");
assertNotNull(propDef, "Could not find the expected property definition");
assertNotNull(prop, "Could not find the expected property");
assertEquals(propDef.getClass(), PropertyDefinitionList.class, "Unexpected type of the property definition");
assertEquals(prop.getClass(), PropertyList.class, "Unexpecetd type of the property");
PropertyDefinitionList listDef = (PropertyDefinitionList) propDef;
PropertyList listProp = (PropertyList) prop;
PropertyDefinition memberDef = listDef.getMemberDefinition();
assertEquals(memberDef.getClass(), PropertyDefinitionSimple.class, "Unexpected type of the list member property definition");
PropertyDefinitionSimple memberSimpleDef = (PropertyDefinitionSimple) memberDef;
assertEquals(memberSimpleDef.getName(), "member");
assertEquals(memberSimpleDef.getType(), PropertySimpleType.INTEGER);
assertEquals(listProp.getList().size(), 3, "Unexpected number of list members");
for(int i = 0; i < 3; ++i) {
Property memberProp = listProp.getList().get(i);
assertEquals(memberProp.getClass(), PropertySimple.class, "Unexpected type of the property in the list on index " + i);
assertEquals(memberProp.getName(), "member");
assertEquals(((PropertySimple)memberProp).getIntegerValue(), Integer.valueOf(i + 1));
}
}
public void testReverseMapPropertyConversion() throws Exception {
String xml = "" +
"<standaloneConfigurationInstance xmlns:ci='urn:xmlns:rhq-configuration-instance' xmlns:c='urn:xmlns:rhq-configuration'>" +
" <ci:map-property name='map'>" +
" <c:simple-property name='m1' type='integer'/>" +
" <c:simple-property name='m2' type='string'/>" +
" <ci:values>" +
" <ci:simple-value property-name='m1' value='1'/>" +
" <ci:simple-value property-name='m2' value='v'/>" +
" </ci:values>" +
" </ci:map-property>" +
"</standaloneConfigurationInstance>";
ConfigurationInstanceDescriptor descriptor = (ConfigurationInstanceDescriptor) CONFIGURATION_INSTANCE_UNMARSHALLER.unmarshal(new StringReader(xml));
ConfigurationInstanceDescriptorUtil.ConfigurationAndDefinition ccd = ConfigurationInstanceDescriptorUtil.createConfigurationAndDefinition(descriptor);
ConfigurationDefinition def = ccd.definition;
Configuration conf = ccd.configuration;
assertEquals(def.getPropertyDefinitions().size(), 1, "Unexpected number of defined properties");
assertEquals(conf.getProperties().size(), 1, "Unexpected number of properties");
PropertyDefinition propDef = def.get("map");
Property prop = conf.get("map");
assertNotNull(propDef, "Could not find the expected property definition");
assertNotNull(prop, "Could not find the expected property");
assertEquals(propDef.getClass(), PropertyDefinitionMap.class, "Unexpected type of the property definition");
assertEquals(prop.getClass(), PropertyMap.class, "Unexpecetd type of the property");
PropertyDefinitionMap mapDef = (PropertyDefinitionMap) propDef;
PropertyMap mapProp = (PropertyMap) prop;
assertEquals(mapDef.getMap().size(), 2, "Unexpected number of map member definitions");
assertEquals(mapProp.getMap().size(), 2, "Unexpected number of map members");
PropertyDefinition m1Def = mapDef.get("m1");
PropertyDefinition m2Def = mapDef.get("m2");
Property m1Prop = mapProp.get("m1");
Property m2Prop = mapProp.get("m2");
assertEquals(m1Def.getClass(), PropertyDefinitionSimple.class);
assertEquals(m2Def.getClass(), PropertyDefinitionSimple.class);
assertEquals(m1Prop.getClass(), PropertySimple.class);
assertEquals(m2Prop.getClass(), PropertySimple.class);
PropertyDefinitionSimple m1SimpleDef = (PropertyDefinitionSimple) m1Def;
PropertyDefinitionSimple m2SimpleDef = (PropertyDefinitionSimple) m2Def;
PropertySimple m1SimpleProp = (PropertySimple) m1Prop;
PropertySimple m2SimpleProp = (PropertySimple) m2Prop;
assertEquals(m1SimpleDef.getName(), "m1");
assertEquals(m2SimpleDef.getName(), "m2");
assertEquals(m1SimpleDef.getType(), PropertySimpleType.INTEGER);
assertEquals(m2SimpleDef.getType(), PropertySimpleType.STRING);
assertEquals(m1SimpleProp.getName(), "m1");
assertEquals(m2SimpleProp.getName(), "m2");
assertEquals(m1SimpleProp.getIntegerValue(), Integer.valueOf(1));
assertEquals(m2SimpleProp.getStringValue(), "v");
}
public void testReverseListOfMapsConversion() throws Exception {
String xml = "" +
"<standaloneConfigurationInstance xmlns:ci='urn:xmlns:rhq-configuration-instance' xmlns:c='urn:xmlns:rhq-configuration'>" +
" <ci:list-property name='list'>" +
" <c:map-property name='map'>" +
" <c:simple-property name='m1' type='integer'/>" +
" <c:simple-property name='m2' type='string'/>" +
" </c:map-property>" +
" <ci:values>" +
" <ci:map-value>" +
" <ci:simple-value property-name='m1' value='1'/>" +
" <ci:simple-value property-name='m2' value='m1'/>" +
" </ci:map-value>" +
" <ci:map-value>" +
" <ci:simple-value property-name='m1' value='2'/>" +
" <ci:simple-value property-name='m2' value='m2'/>" +
" </ci:map-value>" +
" </ci:values>" +
" </ci:list-property>" +
"</standaloneConfigurationInstance>";
ConfigurationInstanceDescriptor descriptor = (ConfigurationInstanceDescriptor) CONFIGURATION_INSTANCE_UNMARSHALLER.unmarshal(new StringReader(xml));
ConfigurationInstanceDescriptorUtil.ConfigurationAndDefinition ccd = ConfigurationInstanceDescriptorUtil.createConfigurationAndDefinition(descriptor);
ConfigurationDefinition def = ccd.definition;
Configuration conf = ccd.configuration;
assertEquals(def.getPropertyDefinitions().size(), 1, "Unexpected number of defined properties");
assertEquals(conf.getProperties().size(), 1, "Unexpected number of properties");
PropertyDefinitionList listDef = (PropertyDefinitionList) def.get("list");
PropertyList listProp = (PropertyList) conf.get("list");
PropertyDefinitionMap mapDef = (PropertyDefinitionMap) listDef.getMemberDefinition();
PropertyDefinitionSimple m1Def = (PropertyDefinitionSimple) mapDef.get("m1");
PropertyDefinitionSimple m2Def = (PropertyDefinitionSimple) mapDef.get("m2");
assertEquals(mapDef.getName(), "map");
assertEquals(m1Def.getType(), PropertySimpleType.INTEGER);
assertEquals(m2Def.getType(), PropertySimpleType.STRING);
assertEquals(listProp.getList().size(), 2, "Unexpected number of maps in the list");
PropertyMap firstMapValue = (PropertyMap) listProp.getList().get(0);
PropertyMap secondMapValue = (PropertyMap) listProp.getList().get(1);
assertEquals(firstMapValue.getName(), "map");
assertEquals(secondMapValue.getName(), "map");
assertEquals(firstMapValue.getSimpleValue("m1", null), "1", "Unexpected value of m1 property in the first map.");
assertEquals(firstMapValue.getSimpleValue("m2", null), "m1", "Unexpected value of m2 property in the first map.");
assertEquals(secondMapValue.getSimpleValue("m1", null), "2", "Unexpected value of m1 property in the second map.");
assertEquals(secondMapValue.getSimpleValue("m2", null), "m2", "Unexpected value of m2 property in the second map.");
}
private static void logInstance(String message, ConfigurationInstanceDescriptor instance) throws JAXBException,
IOException {
StringWriter wrt = new StringWriter();
try {
CONFIGURATION_INSTANCE_MARSHALLER.marshal(StandaloneConfigurationInstance.createFrom(instance), wrt);
LOG.debug(message + "\n" + wrt.toString());
} finally {
wrt.close();
}
}
}