package org.jboss.windup.rules.apps.javaee.tests; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.UUID; import javax.inject.Inject; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.jboss.arquillian.junit.Arquillian; import org.jboss.windup.exec.WindupProcessor; import org.jboss.windup.exec.configuration.WindupConfiguration; import org.jboss.windup.graph.GraphContext; import org.jboss.windup.graph.GraphContextFactory; import org.jboss.windup.graph.model.ProjectModel; import org.jboss.windup.graph.model.resource.FileModel; import org.jboss.windup.graph.service.GraphService; import org.jboss.windup.rules.apps.javaee.AbstractTest; import org.jboss.windup.rules.apps.javaee.model.EjbMessageDrivenModel; import org.jboss.windup.rules.apps.javaee.model.EjbSessionBeanModel; import org.jboss.windup.rules.apps.javaee.model.EnvironmentReferenceModel; import org.jboss.windup.rules.apps.javaee.model.JNDIResourceModel; import org.jboss.windup.rules.apps.javaee.service.EnvironmentReferenceService; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; /** * Test XML parsing of different vendors. * @author <a href="mailto:mbriskar@gmail.com">Matej Briskar</a> */ @RunWith(Arquillian.class) public class EjbXmlParsingTest extends AbstractTest { private static final String WEBLOGIC_TEST_EJB_XMLS = "../../test-files/ejb/weblogic-ejb-test"; private static final String WEBSPHERE_TEST_EJB_XMLS = "../../test-files/ejb/websphere-ejb-test"; private static final String JBOSS_TEST_EJB_XMLS = "../../test-files/ejb/jboss-ejb-test"; private static final String ORION_TEST_EJB_XMLS = "../../test-files/ejb/orion-ejb-test"; @Inject private WindupProcessor processor; @Inject private GraphContextFactory factory; @Test public void testEJBWebLogic() throws Exception { try (GraphContext context = factory.create()) { startWindup(WEBLOGIC_TEST_EJB_XMLS, context); EnvironmentReferenceService envRefService = new EnvironmentReferenceService(context); GraphService<EjbSessionBeanModel> ejbSessionBeanService = new GraphService<>(context, EjbSessionBeanModel.class); EjbSessionBeanModel exampleService=ejbSessionBeanService.getUniqueByProperty(EjbMessageDrivenModel.EJB_BEAN_NAME, "WindupAnotherExampleService"); Assert.assertEquals(exampleService.getGlobalJndiReference().getJndiLocation(), "session/service/WindupAnotherExampleServiceLocalHome"); Assert.assertEquals(exampleService.getLocalJndiReference().getJndiLocation(), "ejb/WindupAnotherExampleServiceLocalHome"); GraphService<JNDIResourceModel> jndiResources = new GraphService<>(context, JNDIResourceModel.class); int jndiCount = 0; Map<String, String> jndiHandler = new HashMap<>(); testEjbSessionBeanTimeout(context, "WindupExampleService", "*", 3600); testMdbThreadPool(context, "WindupMLBean", "WindupMLBean-ThreadPool", 5, 2); int returnedJNDI = testResourceRef(context); Set<String> clusteredEjbNames = new HashSet<>(); clusteredEjbNames.add("WindupExampleService"); clusteredEjbNames.add("WindupAnotherExampleService"); clusteredEjbNames.add("WindupStatefulClusteredService"); testClusterdEjb(context, clusteredEjbNames); Assert.assertEquals("Directory " + WEBLOGIC_TEST_EJB_XMLS + " didn't register expected number of JNDIs for EJBs.", 14, returnedJNDI); } } private void testClusterdEjb(GraphContext context, Set<String> ejbNames) { GraphService<EjbSessionBeanModel> ejbService = new GraphService<>(context, EjbSessionBeanModel.class); for (EjbSessionBeanModel sessionBean : ejbService.findAll()) { if (sessionBean.isClustered() != null && sessionBean.isClustered()) { Assert.assertTrue("EJB: [" + sessionBean.getBeanName() + "] is not expected to be clustered.", ejbNames.remove(sessionBean.getBeanName())); } } if (!ejbNames.isEmpty()) { String results = StringUtils.join(ejbNames, ", "); Assert.fail("EJB(s) should be clustered but aren't: [" + results + "]"); } } @Test public void testEJBWebSphere() throws Exception { try (GraphContext context = factory.create()) { startWindup(WEBSPHERE_TEST_EJB_XMLS, context); EnvironmentReferenceService envRefService = new EnvironmentReferenceService(context); GraphService<JNDIResourceModel> jndiResources = new GraphService<>(context, JNDIResourceModel.class); int jndiCount = 0; Map<String, String> jndiHandler = new HashMap<>(); int returnedJNDI = testResourceRef(context); Assert.assertEquals("Directory " + WEBSPHERE_TEST_EJB_XMLS + " didn't register expected number of JNDIs for EJBs.", 9, returnedJNDI); } } @Test public void testEJBOrion() throws Exception { try (GraphContext context = factory.create()) { startWindup(ORION_TEST_EJB_XMLS, context); GraphService<EjbSessionBeanModel> ejbSessionBeanService = new GraphService<>(context, EjbSessionBeanModel.class); // test that session beans have set JNDI by <<session-deployment> EjbSessionBeanModel exampleService = ejbSessionBeanService.getUniqueByProperty(EjbMessageDrivenModel.EJB_BEAN_NAME, "WindupExampleService"); Assert.assertEquals(exampleService.getGlobalJndiReference().getJndiLocation(), "session/service/WindupExampleServiceLocalHome"); EjbSessionBeanModel anotherExampleService = ejbSessionBeanService.getUniqueByProperty(EjbMessageDrivenModel.EJB_BEAN_NAME, "WindupAnotherExampleService"); Assert.assertEquals(anotherExampleService.getGlobalJndiReference().getJndiLocation(), "session/service/WindupAnotherExampleServiceLocalHome"); // test <message-driven-deployment> GraphService<EjbMessageDrivenModel> mdbService = new GraphService<>(context, EjbMessageDrivenModel.class); EjbMessageDrivenModel mdb = mdbService.getUniqueByProperty(EjbMessageDrivenModel.EJB_BEAN_NAME, "WindupMLBean"); Assert.assertEquals("Message driven bean destination was not loaded correctly for Orion.", mdb.getDestination().getJndiLocation(), "queue/WindupMLQueue"); // test <resource-ref-mapping> int foundJndi = testResourceRef(context); Assert.assertEquals("Directory " + ORION_TEST_EJB_XMLS + " didn't register expected number of JNDIs for EJBs.", 8, foundJndi); } } @Test public void testEJBJBoss() throws Exception { try (GraphContext context = factory.create()) { startWindup(JBOSS_TEST_EJB_XMLS, context); GraphService<EjbSessionBeanModel> ejbSessionBeanService = new GraphService<>(context, EjbSessionBeanModel.class); //test <message-driven> GraphService<EjbMessageDrivenModel> mdbService = new GraphService<>(context, EjbMessageDrivenModel.class); EjbMessageDrivenModel mdb = mdbService.getUniqueByProperty(EjbMessageDrivenModel.EJB_BEAN_NAME, "WindupMLBean"); Assert.assertEquals("Message driven bean destination was not loaded correctly for JBoss.", mdb.getDestination().getJndiLocation(), "queue/WindupMLQueue"); Set<String> clusteredEjbNames = new HashSet<>(); clusteredEjbNames.add("WindupExampleService"); clusteredEjbNames.add("WindupAnotherExampleService"); clusteredEjbNames.add("WindupStatefulClusteredService"); testClusterdEjb(context, clusteredEjbNames); testEjbSessionBeanTimeout(context, "WindupExampleService", "*", 3600); // test <resource-ref-mapping> int foundJndi = testResourceRef(context); Assert.assertEquals("Directory " + JBOSS_TEST_EJB_XMLS + " didn't register expected number of JNDIs for EJBs.", 14, foundJndi); int msgDrivenFound = 0; } } private int testResourceRef(GraphContext context, Map<String, String> jndiToEnv) { GraphService<JNDIResourceModel> jndiResources = new GraphService<>(context, JNDIResourceModel.class); EnvironmentReferenceService envRefService = new EnvironmentReferenceService(context); int jndiCount = 0; for (JNDIResourceModel jndiResourceModel : jndiResources.findAll()) { if (jndiToEnv.containsKey(jndiResourceModel.getJndiLocation())) { String envRef = jndiToEnv.get(jndiResourceModel.getJndiLocation()); int envCount = 0; for (EnvironmentReferenceModel environmentReferenceModel : envRefService .findAllByProperty(EnvironmentReferenceModel.NAME, envRef)) { Assert.assertNotNull(environmentReferenceModel.getJndiReference()); Assert.assertEquals(environmentReferenceModel.getJndiReference().getJndiLocation(), jndiResourceModel.getJndiLocation()); envCount++; } Assert.assertTrue(envCount > 0); } jndiCount++; } return jndiCount; } /** * Tests that the jndiHandlers are correctly mapped to environment resources and returns the number of jndi Handlers registered * * @param context * @param jndiHandler * @return */ private int testResourceRef(GraphContext context) { Map<String, String> jndiHandler = new HashMap<>(); jndiHandler.put("/WindupMail", "smtp/WindupMail"); jndiHandler.put("jdbc/WindupDS", "jdbc/WindupDataSource"); jndiHandler.put("/ConnectionFactory", "jms/WindupTopicConnectionFactory"); return testResourceRef(context,jndiHandler); } private void testEjbSessionBeanTimeout(GraphContext context, String ejbName, String patternExpected, Integer timeoutInSecondsExpected) { GraphService<EjbSessionBeanModel> service = new GraphService<>(context, EjbSessionBeanModel.class); boolean found = false; EjbSessionBeanModel result = service.getUniqueByProperty(EjbSessionBeanModel.EJB_BEAN_NAME, ejbName); if(result != null) { if(result.getTxTimeouts().containsKey(patternExpected)) { Integer val = result.getTxTimeouts().get(patternExpected); found = true; Assert.assertTrue("For EJB: ["+ejbName+"] with pattern: ["+patternExpected+"] expected EJB timeout: ["+timeoutInSecondsExpected+"] actually ["+val+"]", timeoutInSecondsExpected.equals(val)); } } Assert.assertTrue("Expected EJB: ["+ejbName+"] with pattern: ["+patternExpected+"] and timeout ["+timeoutInSecondsExpected+"]", found); } private void testMdbSessionBeanTimeout(GraphContext context, String mdbName, String patternExpected, Integer timeoutInSecondsExpected) { GraphService<EjbMessageDrivenModel> service = new GraphService<>(context, EjbMessageDrivenModel.class); boolean found = false; EjbMessageDrivenModel result = service.getUniqueByProperty(EjbMessageDrivenModel.EJB_BEAN_NAME, mdbName); if(result != null) { if(result.getTxTimeouts().containsKey(patternExpected)) { Integer val = result.getTxTimeouts().get(patternExpected); found = true; Assert.assertTrue("For MDB: ["+mdbName+"] with pattern: ["+patternExpected+"] expected EJB timeout: ["+timeoutInSecondsExpected+"] actually ["+val+"]", timeoutInSecondsExpected.equals(val)); } } Assert.assertTrue("Expected MDB: [" + mdbName + "] with pattern: [" + patternExpected + "] and timeout [" + timeoutInSecondsExpected + "]", found); } private void startWindup(String xmlFilePath, GraphContext context) throws IOException { ProjectModel pm = context.getFramed().addVertex(null, ProjectModel.class); pm.setName("Main Project"); FileModel inputPath = context.getFramed().addVertex(null, FileModel.class); inputPath.setFilePath(xmlFilePath); Path outputPath = Paths.get(FileUtils.getTempDirectory().toString(), "windup_" + UUID.randomUUID().toString()); FileUtils.deleteDirectory(outputPath.toFile()); Files.createDirectories(outputPath); pm.addFileModel(inputPath); pm.setRootFileModel(inputPath); WindupConfiguration windupConfiguration = new WindupConfiguration() .setGraphContext(context); windupConfiguration.addInputPath(Paths.get(inputPath.getFilePath())); windupConfiguration.setOutputDirectory(outputPath); processor.execute(windupConfiguration); } private void testEjbSessionBeanThreadPool(GraphContext context, String ejbName, String threadPoolName, Integer maxPoolSize, Integer minPoolSize) { GraphService<EjbSessionBeanModel> service = new GraphService<>(context, EjbSessionBeanModel.class); boolean found = false; EjbSessionBeanModel result = service.getUniqueByProperty(EjbSessionBeanModel.EJB_BEAN_NAME, ejbName); if(result != null) { if(result.getThreadPool()!=null) { found = true; Assert.assertTrue("For EJB: ["+ejbName+"] with pool name: ["+threadPoolName+"] max: ["+maxPoolSize+"] min: ["+minPoolSize+"], actual name: ["+result.getThreadPool().getPoolName()+"] max: ["+result.getThreadPool().getMaxPoolSize()+"] min: ["+result.getThreadPool().getMinPoolSize()+"]", maxPoolSize.equals(result.getThreadPool().getMaxPoolSize()) && minPoolSize.equals(result.getThreadPool().getMinPoolSize()) && threadPoolName.equals(result.getThreadPool().getPoolName())); } } Assert.assertTrue("For EJB: ["+ejbName+"] with name: ["+threadPoolName+"] max: ["+maxPoolSize+"] min: ["+minPoolSize+"]", found); } private void testMdbThreadPool(GraphContext context, String mdbName, String threadPoolName, Integer maxPoolSize, Integer minPoolSize) { GraphService<EjbMessageDrivenModel> service = new GraphService<>(context, EjbMessageDrivenModel.class); boolean found = false; EjbMessageDrivenModel result = service.getUniqueByProperty(EjbMessageDrivenModel.EJB_BEAN_NAME, mdbName); if(result != null) { if(result.getThreadPool()!=null) { found = true; Assert.assertTrue("For MDB: ["+mdbName+"] with pool name: ["+threadPoolName+"] max: ["+maxPoolSize+"] min: ["+minPoolSize+"], actual name: ["+result.getThreadPool().getPoolName()+"] max: ["+result.getThreadPool().getMaxPoolSize()+"] min: ["+result.getThreadPool().getMinPoolSize()+"]", maxPoolSize.equals(result.getThreadPool().getMaxPoolSize()) && minPoolSize.equals(result.getThreadPool().getMinPoolSize()) && threadPoolName.equals(result.getThreadPool().getPoolName())); } } Assert.assertTrue("For MDB: ["+mdbName+"] with name: ["+threadPoolName+"] max: ["+maxPoolSize+"] min: ["+minPoolSize+"]", found); } }