/*
* JBoss, Home of Professional Open Source.
* Copyright 2009, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.test.profileservice.persistenceformat.test;
import java.io.File;
import java.util.List;
import javax.management.ObjectName;
import javax.xml.parsers.DocumentBuilderFactory;
import org.jboss.managed.api.ManagedComponent;
import org.jboss.managed.api.ManagedObject;
import org.jboss.managed.api.ManagedProperty;
import org.jboss.metatype.api.values.CollectionValue;
import org.jboss.metatype.api.values.GenericValue;
import org.jboss.metatype.api.values.SimpleValueSupport;
import org.jboss.system.deployers.managed.ServiceDeploymentComponentMapper;
import org.jboss.system.deployers.managed.ServiceMetaDataICF;
import org.jboss.system.metadata.ServiceAttributeMetaData;
import org.jboss.system.metadata.ServiceDependencyValueMetaData;
import org.jboss.system.metadata.ServiceDeployment;
import org.jboss.system.metadata.ServiceDeploymentParser;
import org.jboss.system.metadata.ServiceMetaData;
import org.jboss.system.metadata.ServiceMetaDataParser;
import org.jboss.system.metadata.ServiceTextValueMetaData;
import org.jboss.system.server.profileservice.persistence.PersistenceFactory;
import org.jboss.system.server.profileservice.persistence.xml.PersistedComponent;
import org.jboss.system.server.profileservice.persistence.xml.PersistedManagedObject;
import org.jboss.system.server.profileservice.persistence.xml.PersistenceRoot;
import org.w3c.dom.Document;
/**
* Test the merging of JMSDestination attributes.
*
* @author <a href="mailto:emuckenh@redhat.com">Emanuel Muckenhuber</a>
* @version $Revision: 88716 $
*/
public class JMSDestinationPersistenceFormatTestCase extends AbstractPersistenceFormatTest
{
public JMSDestinationPersistenceFormatTestCase(String name)
{
super(name);
}
protected void setUp() throws Exception
{
super.setUp();
enableTrace("org.jboss.system");
}
public void testTopic() throws Throwable
{
doTestMerge("profileservice/override/testTopic-service.xml");
}
public void testQueue() throws Throwable
{
doTestMerge("profileservice/override/testQueue-service.xml");
}
protected void doTestMerge(String xmlName) throws Throwable
{
// Set the ICF
getMOF().addInstanceClassFactory(new ServiceMetaDataICF());
// TODO create dependency on messaging project ?
// getMOF().addManagedObjectDefinition(new QueueMODefinition(getMOF()));
// getMOF().addManagedObjectDefinition(new TopicMODefinition(getMOF()));
// Add the testmapper
addComponentMapper(new TestMapper(getPersistenceFactory()));
// create
ManagedObject deploymentMO = getDeploymentMO(xmlName);
ManagedComponent component = createJMSComponent(deploymentMO);
// update property
component.getProperty("downCacheSize").setValue(SimpleValueSupport.wrap(123456));
ServiceDeployment deployment = parseJbossServiceXml(xmlName);
PersistenceRoot root = updateComponent(deploymentMO, component);
getPersistenceFactory().restorePersistenceRoot(root, deployment, null);
//
ManagedObject restored = getMOF().initManagedObject(deployment, null);
component = createJMSComponent(restored);
// assert
assertEquals(SimpleValueSupport.wrap(123456), component.getProperty("downCacheSize").getValue());
// Assert attachment meta data
ServiceMetaData service = deployment.getServices().get(0);
assertNotNull(service);
boolean foundAttribute = false;
for(ServiceAttributeMetaData attribute : service.getAttributes())
{
if("DownCacheSize".equals(attribute.getName()))
{
String text = ((ServiceTextValueMetaData) attribute.getValue()).getText();
assertEquals("123456", text);
foundAttribute = true;
}
else if("ServerPeer".equals(attribute.getName()))
{
ServiceDependencyValueMetaData value = ((ServiceDependencyValueMetaData) attribute.getValue());
ObjectName name = value.getObjectName();
assertNotNull(name);
}
else if("ExpiryQueue".equals(attribute.getName()))
{
ServiceTextValueMetaData value = (ServiceTextValueMetaData) attribute.getValue();
assertNotNull(value.getText());
}
}
assertTrue(foundAttribute);
}
protected ManagedComponent createJMSComponent(ManagedObject serviceDeploymentMO)
{
assertNotNull(serviceDeploymentMO);
CollectionValue collection = (CollectionValue) serviceDeploymentMO.getProperty("services").getValue();
assertNotNull(collection);
GenericValue topic = (GenericValue) collection.iterator().next();
assertNotNull(topic);
ManagedObject topicMO = (ManagedObject) topic.getValue();
return createComponent(topicMO);
}
protected ManagedProperty getProperty(ManagedObject serviceDeploymentMO, String propertyName)
{
assertNotNull(serviceDeploymentMO);
CollectionValue collection = (CollectionValue) serviceDeploymentMO.getProperty("services").getValue();
assertNotNull(collection);
GenericValue topic = (GenericValue) collection.iterator().next();
assertNotNull(topic);
ManagedObject topicMO = (ManagedObject) topic.getValue();
assertNotNull(topicMO);
// downCacheSize
return topicMO.getProperty(propertyName);
}
protected ManagedObject getDeploymentMO(String resource) throws Exception
{
ServiceDeployment deployment = parseJbossServiceXml(resource);
assertNotNull(deployment);
return getMOF().initManagedObject(deployment, null);
}
protected ServiceDeployment parseJbossServiceXml(String resource) throws Exception
{
File file = new File(Thread.currentThread().getContextClassLoader().getResource(resource).toURI());
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
Document document = factory.newDocumentBuilder().parse(file);
ServiceDeploymentParser parser = new ServiceDeploymentParser(document);
ServiceDeployment deployment = parser.parse();
assertNotNull(deployment);
ServiceMetaDataParser serviceParser = new ServiceMetaDataParser(deployment.getConfig());
List<ServiceMetaData> services = serviceParser.parse();
assertNotNull(services);
deployment.setServices(services);
return deployment;
}
private static final class TestMapper extends ServiceDeploymentComponentMapper
{
public TestMapper(PersistenceFactory persistenceFactory)
{
super(persistenceFactory);
}
protected PersistedComponent createComponent(Object attachment, ManagedComponent component)
{
// Note: this is using the TestMgtComponentImpl to get the MO
ManagedObject mo = (ManagedObject) component.getParent();
PersistedManagedObject persisted = getPersistencePlugin().createPersistedManagedObject(mo);
PersistedComponent persistedComponent = new PersistedComponent(persisted);
setComponentName(persistedComponent, mo);
return persistedComponent;
}
}
}