package org.jboss.windup.tests.application;
import java.io.File;
import java.nio.file.Path;
import java.util.Iterator;
import java.util.List;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.forge.arquillian.AddonDependencies;
import org.jboss.forge.arquillian.AddonDependency;
import org.jboss.forge.arquillian.archive.AddonArchive;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.windup.graph.GraphContext;
import org.jboss.windup.graph.service.GraphService;
import org.jboss.windup.graph.service.Service;
import org.jboss.windup.reporting.model.ReportModel;
import org.jboss.windup.reporting.model.source.SourceReportModel;
import org.jboss.windup.reporting.service.ReportService;
import org.jboss.windup.reporting.service.SourceReportService;
import org.jboss.windup.rules.apps.javaee.model.EjbDeploymentDescriptorModel;
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.rules.CreateEJBReportRuleProvider;
import org.jboss.windup.testutil.html.TestEJBReportUtil;
import org.jboss.windup.testutil.html.TestEJBReportUtil.EJBType;
import org.jboss.windup.testutil.html.TestJavaApplicationOverviewUtil;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(Arquillian.class)
public class WindupArchitectureJEEExampleTest extends WindupArchitectureTest
{
@Deployment
@AddonDependencies({
@AddonDependency(name = "org.jboss.windup.graph:windup-graph"),
@AddonDependency(name = "org.jboss.windup.exec:windup-exec"),
@AddonDependency(name = "org.jboss.windup.rules.apps:windup-rules-java"),
@AddonDependency(name = "org.jboss.windup.rules.apps:windup-rules-java-ee"),
@AddonDependency(name = "org.jboss.windup.utils:windup-utils"),
@AddonDependency(name = "org.jboss.windup.tests:test-util"),
@AddonDependency(name = "org.jboss.windup.reporting:windup-reporting"),
@AddonDependency(name = "org.jboss.windup.config:windup-config-groovy"),
@AddonDependency(name = "org.jboss.forge.furnace.container:cdi"),
})
public static AddonArchive getDeployment()
{
return ShrinkWrap.create(AddonArchive.class)
.addBeansXML()
.addClass(WindupArchitectureTest.class)
.addAsResource(new File("src/test/groovy/GroovyExampleRule.windup.groovy"));
}
@Test
public void testRunWindupJEEExampleMode() throws Exception
{
try (GraphContext context = super.createGraphContext())
{
// The test-files folder in the project root dir.
super.runTest(context, "../test-files/jee-example-app-1.0.0.ear", false);
validateEjbXmlReferences(context);
validateReports(context);
validateParentOfSourceReports(context);
}
}
/**
* Validate that a ejb-jar.xml file was found, and that the metadata was extracted correctly
*/
private void validateEjbXmlReferences(GraphContext context)
{
Service<EjbDeploymentDescriptorModel> ejbXmlService = new GraphService<>(context,
EjbDeploymentDescriptorModel.class);
Iterator<EjbDeploymentDescriptorModel> models = ejbXmlService.findAll().iterator();
// There should be at least one file
Assert.assertTrue(models.hasNext());
EjbDeploymentDescriptorModel model = models.next();
// and only two files
EjbDeploymentDescriptorModel model2 = models.next();
Assert.assertFalse(models.hasNext());
// We don't know which one will come first, and the beans are only in one of them.
if (!model.getEjbSessionBeans().iterator().hasNext())
model = model2;
int sessionBeansFound = 0;
for (EjbSessionBeanModel sessionBean : model.getEjbSessionBeans())
{
if (sessionBean.getBeanName().equals("ItemLookupBean"))
{
Assert.assertEquals("com.acme.anvil.service.ItemLookupHome", sessionBean.getEjbHome()
.getQualifiedName());
Assert.assertEquals("com.acme.anvil.service.ItemLookup", sessionBean.getEjbRemote().getQualifiedName());
Assert.assertEquals("com.acme.anvil.service.ItemLookupLocalHome", sessionBean.getEjbLocalHome()
.getQualifiedName());
Assert.assertEquals("com.acme.anvil.service.ItemLookupLocal", sessionBean.getEjbLocal()
.getQualifiedName());
Assert.assertEquals("com.acme.anvil.service.ItemLookupBean", sessionBean.getEjbClass()
.getQualifiedName());
Assert.assertEquals("Stateless", sessionBean.getSessionType());
Assert.assertEquals("Container", sessionBean.getTransactionType());
}
else if (sessionBean.getBeanName().equals("ProductCatalogBean"))
{
Assert.assertEquals("com.acme.anvil.service.ProductCatalogHome", sessionBean.getEjbHome()
.getQualifiedName());
Assert.assertEquals("com.acme.anvil.service.ProductCatalog", sessionBean.getEjbRemote()
.getQualifiedName());
Assert.assertEquals("com.acme.anvil.service.ProductCatalogLocalHome", sessionBean.getEjbLocalHome()
.getQualifiedName());
Assert.assertEquals("com.acme.anvil.service.ProductCatalogLocal", sessionBean.getEjbLocal()
.getQualifiedName());
Assert.assertEquals("com.acme.anvil.service.ProductCatalogBean", sessionBean.getEjbClass()
.getQualifiedName());
Assert.assertEquals("Stateless", sessionBean.getSessionType());
Assert.assertEquals("Container", sessionBean.getTransactionType());
}
else
{
Assert.fail("Unrecognized session bean found: " + sessionBean.getBeanName());
}
sessionBeansFound++;
}
Assert.assertEquals(2, sessionBeansFound);
int messageDrivenFound = 0;
for (EjbMessageDrivenModel messageDriven : model.getMessageDriven())
{
Assert.assertEquals("LogEventSubscriber", messageDriven.getBeanName());
Assert.assertEquals("com.acme.anvil.service.jms.LogEventSubscriber", messageDriven.getEjbClass()
.getQualifiedName());
Assert.assertEquals("Container", messageDriven.getTransactionType());
messageDrivenFound++;
}
Assert.assertEquals(1, messageDrivenFound);
}
private void validateEJBBeanReport(GraphContext context)
{
ReportService reportService = new ReportService(context);
ReportModel reportModel = reportService.getUniqueByProperty(
ReportModel.TEMPLATE_PATH,
CreateEJBReportRuleProvider.TEMPLATE_EJB_REPORT);
TestEJBReportUtil util = new TestEJBReportUtil();
Path reportPath = reportService.getReportDirectory().resolve(reportModel.getReportFilename());
util.loadPage(reportPath);
Assert.assertTrue(util.checkBeanInReport(EJBType.MDB, "LogEventSubscriber", "com.acme.anvil.service.jms.LogEventSubscriber"));
Assert.assertTrue(util.checkBeanInReport(EJBType.STATELESS, "ItemLookupBean", "LocalRemote", "com.acme.anvil.service.ItemLookupBean"));
Assert.assertTrue(util.checkBeanInReport(EJBType.STATELESS, "ProductCatalogBean", "LocalRemote", "com.acme.anvil.service.ProductCatalogBean"));
}
private void validateReports(GraphContext context)
{
ReportService reportService = new ReportService(context);
ReportModel reportModel = getMainApplicationReport(context);
Path appReportPath = reportService.getReportDirectory().resolve(reportModel.getReportFilename());
TestJavaApplicationOverviewUtil util = new TestJavaApplicationOverviewUtil();
util.loadPage(appReportPath);
util.checkFilePathAndTag("jee-example-app-1.0.0.ear/jee-example-services.jar", "META-INF/ejb-jar.xml",
"EJB XML 2.1");
validateEJBBeanReport(context);
}
private void validateParentOfSourceReports(GraphContext context)
{
SourceReportService reportService = new SourceReportService(context);
for (SourceReportModel sourceReportModel : reportService.findAll())
{
List<ReportModel> parents = sourceReportModel.getAllParentsInReversedOrder();
Assert.assertTrue(parents.size() == 2);
Assert.assertTrue(parents.get(0).getReportName().equals("Report Index"));
Assert.assertTrue(parents.get(0).getReportFilename().contains("report_index"));
}
}
}