/* * JBoss, Home of Professional Open Source. * Copyright 2008, 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.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.xml.parsers.DocumentBuilderFactory; import org.jboss.managed.api.ManagedComponent; import org.jboss.managed.api.ManagedObject; import org.jboss.mx.loading.LoaderRepositoryFactory.LoaderRepositoryConfig; import org.jboss.system.deployers.managed.ServiceDeploymentComponentMapper; import org.jboss.system.metadata.ServiceAttributeMetaData; import org.jboss.system.metadata.ServiceConstructorMetaData; import org.jboss.system.metadata.ServiceDependencyMetaData; import org.jboss.system.metadata.ServiceDeployment; import org.jboss.system.metadata.ServiceDeploymentClassPath; import org.jboss.system.metadata.ServiceDeploymentParser; import org.jboss.system.metadata.ServiceMetaData; import org.jboss.system.metadata.ServiceMetaDataParser; import org.jboss.system.metadata.ServiceValueMetaData; import org.jboss.system.server.profileservice.persistence.ManagedObjectPersistencePlugin; import org.jboss.system.server.profileservice.persistence.PersistenceFactory; import org.jboss.system.server.profileservice.persistence.xml.ModificationInfo; 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; /** * Persistence test for ServiceMetaData components. * * TODO the ManagedObject view of ServiceMetaData needs to be completed. * * @author <a href="mailto:emuckenh@redhat.com">Emanuel Muckenhuber</a> * @version $Revision: 88906 $ */ public class JBossServicePersistenceFormatTestCase extends AbstractPersistenceFormatTest { public JBossServicePersistenceFormatTestCase(String name) { super(name); } public void testServiceMetaData() throws Exception { // Don't use the ServiceMetaDataICF - to be able to test plain // ServiceMetaData without MOClass override... // getMOF().addInstanceClassFactory(new ServiceMetaDataICF()); addComponentMapper(new TestMapper(getPersistenceFactory())); ServiceDeployment deployment = parseJbossServiceXml("profileservice/persistence/jboss-service.xml"); // Manually create a persistence view List<ServiceMetaData> services = deployment.getServices(); List<PersistedComponent> components = new ArrayList<PersistedComponent>(); ManagedObjectPersistencePlugin plugin = getPersistenceFactory().getPersistencePlugin(); for(ServiceMetaData md : deployment.getServices()) { // Bypass the ServiceMetaDataICF... ManagedObject mo = getMOF().initManagedObject(md, null); PersistedManagedObject persisted = plugin.createPersistedManagedObject(mo); // Fix the names, as we don't use the ServiceMetaDataICF String name = md.getObjectName().getCanonicalName(); persisted.setName(name); persisted.setOriginalName(name); persisted.setModificationInfo(ModificationInfo.ADDED); components.add(new PersistedComponent(persisted)); } PersistenceRoot root = new PersistenceRoot(); root.setComponents(components); root = restore(root); // Test if we can recreate a complete view, without // requiring any previous service deployment = new ServiceDeployment(); deployment.setServices(new ArrayList<ServiceMetaData>()); getPersistenceFactory().restorePersistenceRoot(root, deployment, null); assertServices(services, deployment.getServices()); } // // public void testJbossService() throws Exception // { // // Parse // ServiceDeployment deployment = parseJbossServiceXml("profileservice/persistence/jboss-service.xml"); // assertNotNull(deployment); // // Create serializer // AbstractFileAttachmentsSerializer serializer = getAttachmentSerializer(); // // Save // serializer.saveAttachment("test", deployment); // // Restore // ServiceDeployment restored = serializer.loadAttachment("test", ServiceDeployment.class); // assertNotNull(restored); // // // Assert services // assertServices(deployment.getServices(), restored.getServices()); // // loader repository // assertLoaderRepository(deployment.getLoaderRepositoryConfig(), restored.getLoaderRepositoryConfig()); // // classpath // assertClassPaths(deployment.getClassPaths(), restored.getClassPaths()); // } protected void assertServices(List<ServiceMetaData> original, List<ServiceMetaData> restored) throws Exception { assertNotNull(original); assertNotNull(restored); assertEquals("same size", original.size(), restored.size()); Map<String, ServiceMetaData> restoredMap = new HashMap<String, ServiceMetaData>(); for(ServiceMetaData service : restored) restoredMap.put(service.getObjectName().getCanonicalName(), service); for(ServiceMetaData originalService : original) { ServiceMetaData restoredService = restoredMap.get(originalService.getObjectName().getCanonicalName()); assertNotNull(restoredService); // assert service assertServiceMetaData(originalService, restoredService); } } protected void assertServiceMetaData(ServiceMetaData original, ServiceMetaData restored) throws Exception { // Code assertEquals(original.getCode(), restored.getCode()); // Interface assertEquals(original.getInterfaceName(), restored.getInterfaceName()); // XMBeanCode assertEquals(original.getXMBeanCode(), restored.getXMBeanCode()); // XMBeanDD assertEquals(original.getXMBeanDD(), restored.getXMBeanDD()); // ClassLoaderName assertEquals(original.getClassLoaderName(), restored.getClassLoaderName()); // Mode assertEquals(original.getMode(), restored.getMode()); // XMBeanDescriptor assertEquals(original.getXMBeanDescriptor(), restored.getXMBeanDescriptor()); // Constructor assertServiceConstructor(original.getConstructor(), restored.getConstructor()); // TODO more checking List<String> originalAliasases = original.getAliases(); List<String> restoredAliasases = restored.getAliases(); assertEquals(originalAliasases, restoredAliasases); assertEquals(original.getAnnotations(), restored.getAnnotations()); if(original.getAnnotations() != null) { assertNotNull(restored.getAnnotations()); assertEquals(original.getAnnotations().size(), restored.getAnnotations().size()); } assertEquals(original.getDependencies(), restored.getDependencies()); if(original.getDependencies() != null) { assertNotNull(restored.getDependencies()); assertEquals(original.getDependencies().size(), restored.getDependencies().size()); // TODO assertDependency } else { assertNull(restored.getDependencies()); } // assertAttributes(original.getAttributes(), restored.getAttributes()); assertDependencies(original.getDependencies(), restored.getDependencies()); } protected void assertAttributes(List<ServiceAttributeMetaData> original, List<ServiceAttributeMetaData> restored) { if(original == null) { assertNull(restored); return; } else { assertNotNull(restored); } assertEquals(original.size(), restored.size()); if(original.isEmpty()) return; Map<String, ServiceAttributeMetaData> attributesMap = new HashMap<String, ServiceAttributeMetaData>(); for(ServiceAttributeMetaData attribute : restored) attributesMap.put(attribute.getName(), attribute); for(ServiceAttributeMetaData attribute : original) assertAttributeMetaData(attribute, attributesMap.get(attribute.getName())); } protected void assertAttributeMetaData(ServiceAttributeMetaData original, ServiceAttributeMetaData restored) { assertNotNull(original); assertNotNull(original.getName(), restored); if(original.getValue() == null) { assertNull(restored.getValue()); return; } else { assertNotNull(restored.getValue()); } ServiceValueMetaData value = original.getValue(); // TODO we need some MetaMapping for attributes assertEquals(original.getName(), value.getClass().getName(), restored.getValue().getClass().getName()); } protected void assertServiceConstructor(ServiceConstructorMetaData original, ServiceConstructorMetaData restored) throws Exception { if(original == null) { assertNull(restored); return; } else { assertNotNull(restored); } if(original.getParams() != null) { assertNotNull(restored.getParams()); assertEquals(original.getParams().length, restored.getParams().length); assertEquals(original.getParams(), restored.getParams()); } if(original.getSignature() != null) { assertNotNull(restored.getSignature()); assertEquals(original.getParams().length, restored.getParams().length); assertEquals(original.getSignature(), restored.getSignature()); } } protected void assertDependencies(List<ServiceDependencyMetaData> original, List<ServiceDependencyMetaData> restored) { if(original == null) { assertNull(restored); return; } else { assertNotNull(restored); } assertEquals(original.size(), restored.size()); // TODO assertDependency } protected void assertDependency(ServiceDependencyMetaData original, ServiceDependencyMetaData restored) { if(original == null) { assertNull(restored); return; } else { assertNotNull(restored); } assertEquals(original.getIDependOn(), restored.getIDependOn()); } protected void assertLoaderRepository(LoaderRepositoryConfig original, LoaderRepositoryConfig restored) { if(original == null) { assertNull(restored); return; } else { assertNotNull(restored); } assertEquals(original.configParserClassName, restored.configParserClassName); assertEquals(original.repositoryClassName, restored.repositoryClassName); assertEquals(original.repositoryConfig, restored.repositoryConfig); assertEquals(original.repositoryName, restored.repositoryName); } protected void assertClassPaths(List<ServiceDeploymentClassPath> original, List<ServiceDeploymentClassPath> restored) { if(original == null) { assertNull(restored); return; } else { assertNotNull(restored); } assertEquals(original.size(), restored.size()); } 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); } @Override 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; } } }