Package org.jboss.test.metadata.ejb

Source Code of org.jboss.test.metadata.ejb.EjbJarJBossMergeEverythingUnitTestCase

/*
* JBoss, Home of Professional Open Source
* Copyright 2006, JBoss Inc., and individual contributors as indicated
* by the @authors tag. See the copyright.txt 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.metadata.ejb;

import java.io.File;
import java.io.FilenameFilter;
import java.lang.reflect.AnnotatedElement;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;

import junit.framework.Test;

import org.jboss.metadata.annotation.creator.ejb.EjbJar30Creator;
import org.jboss.metadata.annotation.finder.AnnotationFinder;
import org.jboss.metadata.annotation.finder.DefaultAnnotationFinder;
import org.jboss.metadata.ejb.jboss.InvokerProxyBindingsMetaData;
import org.jboss.metadata.ejb.jboss.JBoss50DTDMetaData;
import org.jboss.metadata.ejb.jboss.JBoss50MetaData;
import org.jboss.metadata.ejb.jboss.JBossEnterpriseBeanMetaData;
import org.jboss.metadata.ejb.jboss.JBossEnterpriseBeansMetaData;
import org.jboss.metadata.ejb.jboss.JBossMessageDrivenBeanMetaData;
import org.jboss.metadata.ejb.jboss.JBossMetaData;
import org.jboss.metadata.ejb.jboss.JBossSessionBeanMetaData;
import org.jboss.metadata.ejb.spec.EjbJar21MetaData;
import org.jboss.metadata.ejb.spec.EjbJar30MetaData;
import org.jboss.metadata.ejb.spec.EjbJar3xMetaData;
import org.jboss.metadata.ejb.spec.EjbJarMetaData;
import org.jboss.metadata.ejb.spec.EnterpriseBeansMetaData;
import org.jboss.metadata.ejb.spec.SessionBeanMetaData;
import org.jboss.metadata.javaee.spec.DescriptionGroupMetaData;
import org.jboss.metadata.javaee.spec.EJBLocalReferenceMetaData;
import org.jboss.metadata.javaee.spec.EJBReferenceMetaData;
import org.jboss.metadata.javaee.spec.EJBReferencesMetaData;
import org.jboss.metadata.javaee.spec.Environment;

/**
* Tests the merge of ejb-jar.xml and jboss.xml
* @author <a href="alex@jboss.com">Alexey Loubyansky</a>
* @author Anil.Saldhana@jboss.com
* @version $Revision: 1.1 $
*/
public class EjbJarJBossMergeEverythingUnitTestCase
   extends AbstractEJBEverythingTest
{
   public static Test suite()
   {
      return suite(EjbJarJBossMergeEverythingUnitTestCase.class);
   }
  
   public EjbJarJBossMergeEverythingUnitTestCase(String name)
   {
      super(name);
   }

   /**
    * Very basic merge test
    */
   public void testEJB3xEverything() throws Exception
   {
      EjbJar3xMetaData ejbJarMetaData = unmarshal("EjbJar3xEverything_testEverything.xml", EjbJar30MetaData.class, null);
      EjbJar3xEverythingUnitTestCase ejbJar = new EjbJar3xEverythingUnitTestCase("ejb-jar");
      ejbJar.assertEverything(ejbJarMetaData, Mode.SPEC);

      JBoss50MetaData jbossMetaData = unmarshal("JBoss5xEverything_testEverything.xml", JBoss50MetaData.class, null);
      JBoss5xEverythingUnitTestCase jboss = new JBoss5xEverythingUnitTestCase("jboss");
      jboss.assertEverything(jbossMetaData, Mode.JBOSS);
     
      // Create the merged view
      jbossMetaData.merge(null, ejbJarMetaData);
     
      assertTrue(jbossMetaData.isEJB3x());
     
      ejbJar.assertInterceptors(jbossMetaData, Mode.JBOSS);
     
      JBossEnterpriseBeanMetaData ejb = jbossMetaData.getEnterpriseBean("session1EjbName");     
      assertNotNull(ejb);
      JBossSessionBeanMetaData jejb = (JBossSessionBeanMetaData) ejb;
      ejbJar.assertFullSessionBean("session1", jejb, Mode.JBOSS);
      jboss.assertWebservices(jbossMetaData.getWebservices(), Mode.JBOSS);
     
      {
         JBossMessageDrivenBeanMetaData mdb = (JBossMessageDrivenBeanMetaData) jbossMetaData.getEnterpriseBean("mdb1EjbName");
         ejbJar.assertActivationConfig("mdb1", mdb.getActivationConfig(), Mode.JBOSS);
      }
     
      ejbJar.assertInterceptorBindings(3, jbossMetaData.getAssemblyDescriptor().getInterceptorBindings());
     
      // Basic check if EjbReferences.invokerBindings are merged
      assertEjbReferenceInvokerBindings(ejb);
      //this is ejb2 only? assertInvokerBindings(jbossMetaData.getInvokerProxyBindings());
   }

   /**
    * merge jbossMetaData more times
    */
   public void testEJB3xEverythingDualMerge() throws Exception
   {
      EjbJar3xMetaData ejbJarMetaData = unmarshal("EjbJar3xEverything_testEverything.xml", EjbJar30MetaData.class, null);
      EjbJar3xEverythingUnitTestCase ejbJar = new EjbJar3xEverythingUnitTestCase("ejb-jar");
      ejbJar.assertEverything(ejbJarMetaData, Mode.SPEC);

      JBossMetaData specMetaData = new JBossMetaData();
      specMetaData.merge(null, ejbJarMetaData);
     
      JBoss50MetaData jbossMetaData = unmarshal("JBoss5xEverything_testEverything.xml", JBoss50MetaData.class, null);
      JBoss5xEverythingUnitTestCase jboss = new JBoss5xEverythingUnitTestCase("jboss");
      jboss.assertEverything(jbossMetaData, Mode.JBOSS);
      jboss.assertWebservices(jbossMetaData.getWebservices(), Mode.JBOSS);
     
      // Create the merged view
      JBossMetaData mergedMetaData = new JBossMetaData();
      mergedMetaData.merge(jbossMetaData, specMetaData);
     
      assertTrue(mergedMetaData.isEJB3x());
      ejbJar.assertInterceptors(mergedMetaData, Mode.JBOSS);
     
      JBossEnterpriseBeanMetaData ejb = mergedMetaData.getEnterpriseBean("session1EjbName");     
      assertNotNull(ejb);
      JBossSessionBeanMetaData jejb = (JBossSessionBeanMetaData) ejb;
      ejbJar.assertFullSessionBean("session1", jejb, Mode.JBOSS);
      jboss.assertWebservices(mergedMetaData.getWebservices(), Mode.JBOSS);
     
      {
         JBossMessageDrivenBeanMetaData mdb = (JBossMessageDrivenBeanMetaData) mergedMetaData.getEnterpriseBean("mdb1EjbName");
         ejbJar.assertActivationConfig("mdb1", mdb.getActivationConfig(), Mode.JBOSS);
      }
     
      ejbJar.assertInterceptorBindings(3, mergedMetaData.getAssemblyDescriptor().getInterceptorBindings());
     
      // Basic check if EjbReferences.invokerBindings are merged
      assertEjbReferenceInvokerBindings(ejb);
      // this is ejb2 only? assertInvokerBindings(mergedMetaData.getInvokerProxyBindings());
   }

   /**
    * merge jbossMetaData more times
    */
   public void testEJB21EverythingDualMerge() throws Exception
   {
      EjbJar21MetaData ejbJarMetaData = unmarshal("EjbJar21Everything_testEverything.xml", EjbJar21MetaData.class, null);
      EjbJar21EverythingUnitTestCase ejbJar = new EjbJar21EverythingUnitTestCase("ejb-jar");
      ejbJar.assertEverything(ejbJarMetaData, Mode.SPEC);
     
      JBossMetaData specMetaData = new JBossMetaData();
      specMetaData.merge(null, ejbJarMetaData);
     
      JBoss50DTDMetaData jbossMetaData = unmarshal("JBoss5xEverything_testEverythingDTD.xml", JBoss50DTDMetaData.class, null);
      JBoss5xEverythingUnitTestCase jboss = new JBoss5xEverythingUnitTestCase("jboss");
      jboss.assertEverything(jbossMetaData, Mode.JBOSS_DTD);
      jboss.assertWebservices(jbossMetaData.getWebservices(), Mode.JBOSS_DTD);

      //jbossMetaData.setOverridenMetaData(ejbJarMetaData);
      // Create the merged view
      JBossMetaData mergedMetaData = new JBossMetaData();
      mergedMetaData.merge(jbossMetaData, specMetaData);

      assertTrue(mergedMetaData.isEJB2x());
     
      JBossEnterpriseBeanMetaData ejb = mergedMetaData.getEnterpriseBean("session1EjbName");     
      assertNotNull(ejb);
      JBossSessionBeanMetaData jejb = (JBossSessionBeanMetaData) ejb;
      ejbJar.assertFullSessionBean("session1", jejb, Mode.JBOSS_DTD);
      jboss.assertWebservices(mergedMetaData.getWebservices(), Mode.JBOSS_DTD);
      // Basic check if EjbReferences.invokerBindings are merged
      assertEjbReferenceInvokerBindings(ejb);
      assertInvokerBindings(mergedMetaData.getInvokerProxyBindings());
   }
  
  
   /**
    * Very basic merge test
    */
   public void testEJB21Everything() throws Exception
   {
      EjbJar21MetaData ejbJarMetaData = unmarshal("EjbJar21Everything_testEverything.xml", EjbJar21MetaData.class, null);
      EjbJar21EverythingUnitTestCase ejbJar = new EjbJar21EverythingUnitTestCase("ejb-jar");
      ejbJar.assertEverything(ejbJarMetaData, Mode.SPEC);

      JBoss50DTDMetaData jbossMetaData = unmarshal("JBoss5xEverything_testEverythingDTD.xml", JBoss50DTDMetaData.class, null);
      JBoss5xEverythingUnitTestCase jboss = new JBoss5xEverythingUnitTestCase("jboss");
      jboss.assertEverything(jbossMetaData, Mode.JBOSS_DTD);
      jboss.assertWebservices(jbossMetaData.getWebservices(), Mode.JBOSS_DTD);
     
      //jbossMetaData.setOverridenMetaData(ejbJarMetaData);
      // Create the merged view
      jbossMetaData.merge(null, ejbJarMetaData);

      assertTrue(jbossMetaData.isEJB2x());
     
      JBossEnterpriseBeanMetaData ejb = jbossMetaData.getEnterpriseBean("session1EjbName");     
      assertNotNull(ejb);
      JBossSessionBeanMetaData jejb = (JBossSessionBeanMetaData) ejb;
      ejbJar.assertFullSessionBean("session1", jejb, Mode.JBOSS_DTD);
      // Basic check if EjbReferences.invokerBindings are merged
      assertEjbReferenceInvokerBindings(ejb);
      assertInvokerBindings(jbossMetaData.getInvokerProxyBindings());
   }
  
   /**
    * Tests the merge of EJB3 beans defining RunAs annotations internally
    * with a ejb-jar.xml and a jboss.xml customization
    * @throws Exception
    */
   public void testRunAsMerge() throws Exception
   {
      //Parse the EJB3 Beans to get the EJB3 MetaData
      AnnotationFinder<AnnotatedElement> finder = new DefaultAnnotationFinder<AnnotatedElement>();
     
      Collection<Class<?>> classes = loadClassesFromCurrentClassDir();
      System.out.println("Processing classes: "+classes);

      //enableTrace("org.jboss.metadata.annotation.creator");
      EjbJar30Creator creator = new EjbJar30Creator(finder);
      EjbJar30MetaData ejb3MetaData = creator.create(classes);
     
      assertTrue(ejb3MetaData.isEJB3x());
      assertEquals("3.0", ejb3MetaData.getVersion());
     
      //Parse the ejb-jar.xml
      EjbJarMetaData specResult = unmarshal("EjbJar3xCTSRunAsConfig.xml",
            EjbJarMetaData.class, null);
     
      //Parse a jboss-xml customization
      JBossMetaData jbossxmlMetaData = unmarshal("JBoss42_testRunAsMerge.xml",
            JBossMetaData.class, null);
      JBossMetaData merged = new JBossMetaData();
      //Merge the EJB30 metadata first
      merged.merge(ejb3MetaData, specResult);
      //Merge the JBoss metadata
      merged.merge(jbossxmlMetaData, specResult);

      EnterpriseBeansMetaData ebsmd = specResult.getEnterpriseBeans();
      assertNotNull(ebsmd)
      assertNotNull(specResult.getEnterpriseBean("BusinessBean"));
   }
  
   /**
    * Tests that merge of ejb-jar.xml and jboss.xml preserves beans
    * that only exist in jboss.xml.
    *
    * @throws Exception
    */
   public void testBeanOnlyInJBoss() throws Exception
   {
      EjbJarMetaData ejbJarMetaData = unmarshal("EjbJar3xEverything_testBeanOnlyInJBoss.xml", EjbJar30MetaData.class, null);
      JBossMetaData jbossMetaData = unmarshal("JBoss5xEverything_testBeanOnlyInJBoss.xml", JBoss50MetaData.class, null);
      // Create a merged view
      JBossMetaData mergedMetaData = new JBossMetaData();
      mergedMetaData.merge(jbossMetaData, ejbJarMetaData);     

      JBossEnterpriseBeansMetaData beans = mergedMetaData.getEnterpriseBeans();
      assertNotNull(beans);
      assertEquals(3, beans.size());
     
      JBossEnterpriseBeanMetaData bean = beans.get("session0EjbName");
      assertNotNull(bean);
      DescriptionGroupMetaData descGroup = bean.getDescriptionGroup();
      assertNotNull(descGroup);
      assertEquals("en-session0-desc", descGroup.getDescription());
     
      bean = beans.get("session1EjbName");
      assertNotNull(bean);
      descGroup = bean.getDescriptionGroup();
      assertNotNull(descGroup);
      assertEquals("en-session1-desc", descGroup.getDescription());
     
      bean = beans.get("session2EjbName");
      assertNotNull(bean);
      descGroup = bean.getDescriptionGroup();
      assertNotNull(descGroup);
      assertEquals("en-session2-override", descGroup.getDescription());
   }

   /**
    * There was a CCE during merge since every generic bean was assumed to be a session bean
    */
   public void testMdbGeneric() throws Exception
   {
      EjbJarMetaData ejbJarMetaData = unmarshal("EjbJarJBossMerge_MdbGeneric_ejb-jar.xml", EjbJar30MetaData.class, null);
      JBossMetaData jbossMetaData = unmarshal("EjbJarJBossMerge_generic_jboss.xml", JBoss50MetaData.class, null);
      // Create a merged view
      JBossMetaData mergedMetaData = new JBossMetaData();
      mergedMetaData.merge(jbossMetaData, ejbJarMetaData);     

      JBossEnterpriseBeansMetaData beans = mergedMetaData.getEnterpriseBeans();
      assertNotNull(beans);
      assertEquals(1, beans.size());
      JBossEnterpriseBeanMetaData bean = beans.get("myEjbName");
      assertNotNull(bean);
      assertTrue(bean.isMessageDriven());
   }

   /**
    * There was a CCE during merge since every generic bean was assumed to be a session bean
    */
   public void testSessionGeneric() throws Exception
   {
      EjbJarMetaData ejbJarMetaData = unmarshal("EjbJarJBossMerge_SessionGeneric_ejb-jar.xml", EjbJar30MetaData.class, null);
      JBossMetaData jbossMetaData = unmarshal("EjbJarJBossMerge_generic_jboss.xml", JBoss50MetaData.class, null);
      // Create a merged view
      JBossMetaData mergedMetaData = new JBossMetaData();
      mergedMetaData.merge(jbossMetaData, ejbJarMetaData);     

      JBossEnterpriseBeansMetaData beans = mergedMetaData.getEnterpriseBeans();
      assertNotNull(beans);
      assertEquals(1, beans.size());
      JBossEnterpriseBeanMetaData bean = beans.get("myEjbName");
      assertNotNull(bean);
      assertTrue(bean.isSession());
   }

   /**
    * There was a CCE during merge since every generic bean was assumed to be a session bean
    */
   public void testEntityGeneric() throws Exception
   {
      EjbJarMetaData ejbJarMetaData = unmarshal("EjbJarJBossMerge_EntityGeneric_ejb-jar.xml", EjbJar30MetaData.class, null);
      JBossMetaData jbossMetaData = unmarshal("EjbJarJBossMerge_generic_jboss.xml", JBoss50MetaData.class, null);
      // Create a merged view
      JBossMetaData mergedMetaData = new JBossMetaData();
      mergedMetaData.merge(jbossMetaData, ejbJarMetaData);     

      JBossEnterpriseBeansMetaData beans = mergedMetaData.getEnterpriseBeans();
      assertNotNull(beans);
      assertEquals(1, beans.size());
      JBossEnterpriseBeanMetaData bean = beans.get("myEjbName");
      assertNotNull(bean);
      assertTrue(bean.isEntity());
   }

   public void testEJBLocalReferenceMerge() throws Exception
   {
      EJBLocalReferenceMetaData original = new EJBLocalReferenceMetaData();
      original.setEjbRefName("crucialEjb");
      EJBLocalReferenceMetaData override = new EJBLocalReferenceMetaData();
      override.setLocal("CrucialLocal");

      EJBLocalReferenceMetaData merged = new EJBLocalReferenceMetaData();
      merged.merge(override, original);
      assertEquals("crucialEjb", merged.getEjbRefName());
      assertEquals("CrucialLocal", merged.getLocal());
   }

   public void testHomeJndiNameForEJB3() throws Exception
   {
      EjbJar30MetaData spec = new EjbJar30MetaData();
      EnterpriseBeansMetaData specBeans = new EnterpriseBeansMetaData();
      spec.setEnterpriseBeans(specBeans);
      SessionBeanMetaData specBean = new SessionBeanMetaData();
      specBean.setEjbName("ejb3session");
      specBeans.add(specBean);
     
      JBossMetaData jboss = new JBossMetaData();
      JBossEnterpriseBeansMetaData jbossBeans = new JBossEnterpriseBeansMetaData();
      jboss.setEnterpriseBeans(jbossBeans);
      JBossSessionBeanMetaData jbossBean = new JBossSessionBeanMetaData();
      jbossBean.setEjbName("ejb3session");
      jbossBean.setHomeJndiName("home-jndi-name");
      jbossBeans.add(jbossBean);

      JBossMetaData merged = new JBossMetaData();
      try
      {
         merged.merge(jboss, spec);
         fail("ejb3 session bean can't have home-jndi-name");
      }
      catch(IllegalStateException e)
      {
         assertEquals("EJB3 bean ejb3session doesn't define home interface but defines home-jndi-name 'home-jndi-name' in jboss.xml", e.getMessage());
      }
     
      jbossBean = new JBossSessionBeanMetaData();
      jbossBean.setEjbName("ejb3session");
      jbossBean.setLocalHomeJndiName("local-home-jndi-name");
      jbossBeans.clear();
      jbossBeans.add(jbossBean);

      merged = new JBossMetaData();
      try
      {
         merged.merge(jboss, spec);
         fail("ejb3 session bean can't have local-home-jndi-name");
      }
      catch(IllegalStateException e)
      {
         assertEquals("EJB3 bean ejb3session doesn't define local-home interface but defines local-home-jndi-name 'local-home-jndi-name' in jboss.xml", e.getMessage());
      }
   }

   private Collection<Class<?>> loadClassesFromCurrentClassDir()
   {
      // In real life the deployer will pass probably pass a class scanner
      Collection<Class<?>> classes = new ArrayList<Class<?>>();
      URL currentClassDirURL = getClass().getResource(".");
      File currentDir;
      try
      {
         currentDir = new File(currentClassDirURL.toURI());
      }
      catch (URISyntaxException e)
      {
         throw new RuntimeException(e);
      }
      String classFileNames[] = currentDir.list(new FilenameFilter() {
         public boolean accept(File dir, String name)
         {
            return name.endsWith(".class");
         }
      });
      if(classFileNames == null)
         throw new RuntimeException("list failed");
     
      Arrays.sort(classFileNames);
     
      for(String classFileName : classFileNames)
      {
         String className = getClass().getPackage().getName() + "." + classFileName.substring(0, classFileName.length() - 6);
         try
         {
            classes.add(Class.forName(className));
         }
         catch (ClassNotFoundException e)
         {
            throw new RuntimeException(e);
         }
      }
      return classes;
   }
  
   private void assertEjbReferenceInvokerBindings(JBossEnterpriseBeanMetaData bean)
   {
      Environment envRefs = bean.getJndiEnvironmentRefsGroup();
      assertNotNull(envRefs);
      EJBReferencesMetaData ejbReferences = envRefs.getEjbReferences();
      assertNotNull(ejbReferences);
      EJBReferenceMetaData ejbRef = ejbReferences.get("session1EjbRef1Name");
      assertNotNull(ejbRef);
     
      assertEquals("session1Invoker1EjbName1", ejbRef.getInvokerBinding("invokerProxyBinding1Name"));
      assertEquals("session1Invoker2EjbName1", ejbRef.getInvokerBinding("invokerProxyBinding2Name"));
   }
  
   private void assertInvokerBindings(InvokerProxyBindingsMetaData invokers)
   {
      assertNotNull(invokers);
      assertTrue(invokers.size() > 0);
      assertNotNull(invokers.get("invokerProxyBinding1Name"));
      assertNotNull(invokers.get("invokerProxyBinding2Name"));
   }
}
TOP

Related Classes of org.jboss.test.metadata.ejb.EjbJarJBossMergeEverythingUnitTestCase

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.