package org.jboss.windup.tests.application;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.RandomStringUtils;
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.reporting.model.ApplicationReportModel;
import org.jboss.windup.reporting.model.ReportModel;
import org.jboss.windup.reporting.service.ApplicationReportService;
import org.jboss.windup.reporting.service.ReportService;
import org.jboss.windup.rules.apps.java.model.PropertiesModel;
import org.jboss.windup.rules.apps.java.reporting.rules.CreateCompatibleFileReportRuleProvider;
import org.jboss.windup.rules.apps.javaee.model.EnvironmentReferenceModel;
import org.jboss.windup.rules.apps.javaee.model.WebXmlModel;
import org.jboss.windup.rules.apps.javaee.rules.CreateEJBReportRuleProvider;
import org.jboss.windup.rules.apps.javaee.rules.CreateJPAReportRuleProvider;
import org.jboss.windup.rules.apps.javaee.rules.CreateSpringBeanReportRuleProvider;
import org.jboss.windup.rules.apps.javaee.service.WebXmlService;
import org.jboss.windup.rules.apps.xml.service.XsltTransformationService;
import org.jboss.windup.tests.application.rules.TestServletAnnotationRuleProvider;
import org.jboss.windup.testutil.html.TestCompatibleReportUtil;
import org.jboss.windup.testutil.html.TestEJBReportUtil;
import org.jboss.windup.testutil.html.TestEJBReportUtil.EJBType;
import org.jboss.windup.testutil.html.TestJPAReportUtil;
import org.jboss.windup.testutil.html.TestJavaApplicationOverviewUtil;
import org.jboss.windup.testutil.html.TestMigrationIssuesReportUtil;
import org.jboss.windup.testutil.html.TestSpringBeanReportUtil;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(Arquillian.class)
public class WindupArchitectureSourceModeTest extends WindupArchitectureTest
{
private static final String EXAMPLE_USERSCRIPT_INPUT = "/exampleuserscript.xml";
private static final String EXAMPLE_USERSCRIPT_OUTPUT = "exampleuserscript_output.windup.xml";
private static final String XSLT_OUTPUT_NAME = "exampleconversion_userdir.xslt";
@Deployment
@AddonDependencies({
@AddonDependency(name = "org.jboss.windup.config:windup-config-xml"),
@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)
.addClass(TestServletAnnotationRuleProvider.class)
.addAsResource(new File("src/test/groovy/GroovyExampleRule.windup.groovy"))
.addAsResource(new File("src/test/xml/XmlExample.windup.xml"))
.addAsResource(new File("src/test/xml/exampleuserscript.xml"), EXAMPLE_USERSCRIPT_INPUT)
.addAsResource(new File("src/test/xml/exampleconversion.xsl"));
}
@Test
public void testRunWindupSourceMode() throws Exception
{
Path userPath = FileUtils.getTempDirectory().toPath().resolve("Windup")
.resolve("windupuserscriptsdir_" + RandomStringUtils.randomAlphanumeric(6));
try
{
Files.createDirectories(userPath);
try (InputStream is = getClass().getResourceAsStream(EXAMPLE_USERSCRIPT_INPUT);
OutputStream os = new FileOutputStream(userPath.resolve(EXAMPLE_USERSCRIPT_OUTPUT).toFile()))
{
IOUtils.copy(is, os);
}
try (InputStream is = getClass().getResourceAsStream("/exampleconversion.xsl");
OutputStream os = new FileOutputStream(userPath.resolve(XSLT_OUTPUT_NAME).toFile()))
{
IOUtils.copy(is, os);
}
try (GraphContext context = createGraphContext())
{
// The test-files folder in the project root dir.
List<String> includeList = Collections.emptyList();
List<String> excludeList = Collections.emptyList();
super.runTest(context, "../test-files/src_example", userPath.toFile(), true, includeList, excludeList);
validateWebXmlReferences(context);
validatePropertiesModels(context);
validateReports(context);
validateCompatibleReport(context);
}
}
finally
{
FileUtils.deleteDirectory(userPath.toFile());
}
}
/**
* Validate that a web.xml file was found, and that the metadata was extracted correctly
*/
private void validateWebXmlReferences(GraphContext context)
{
WebXmlService webXmlService = new WebXmlService(context);
Iterator<WebXmlModel> models = webXmlService.findAll().iterator();
// There should be at least one file
Assert.assertTrue(models.hasNext());
WebXmlModel model = models.next();
// and only one file
Assert.assertFalse(models.hasNext());
Assert.assertEquals("Sample Display Name", model.getDisplayName());
int numberFound = 0;
for (EnvironmentReferenceModel envRefModel : model.getEnvironmentReferences())
{
Assert.assertEquals("jdbc/myJdbc", envRefModel.getName());
Assert.assertEquals("javax.sql.DataSource", envRefModel.getReferenceType());
numberFound++;
}
// there is only one env-ref
Assert.assertEquals(1, numberFound);
}
/**
* Validate that the expected Properties Models were found
*/
private void validatePropertiesModels(GraphContext context) throws Exception
{
GraphService<PropertiesModel> service = new GraphService<>(context, PropertiesModel.class);
int numberFound = 0;
for (PropertiesModel model : service.findAll())
{
numberFound++;
Properties props = model.getProperties();
Assert.assertEquals("value1", props.getProperty("example1"));
Assert.assertEquals("anothervalue", props.getProperty("anotherproperty"));
Assert.assertEquals("1234", props.getProperty("timetaken"));
}
Assert.assertEquals(1, numberFound);
}
private void validateSpringBeanReport(GraphContext context)
{
ReportService reportService = new ReportService(context);
ReportModel reportModel = reportService.getUniqueByProperty(
ReportModel.TEMPLATE_PATH,
CreateSpringBeanReportRuleProvider.TEMPLATE_SPRING_REPORT);
TestSpringBeanReportUtil util = new TestSpringBeanReportUtil();
Path reportPath = reportService.getReportDirectory().resolve(reportModel.getReportFilename());
util.loadPage(reportPath);
Assert.assertTrue(util.checkSpringBeanInReport("mysamplebean", "org.example.MyExampleBean"));
}
private void validateEJBReport(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, "MyNameForMessageDrivenBean",
"org.windup.examples.ejb.messagedriven.MessageDrivenBean",
"jms/MyQueue"));
Assert.assertTrue(util.checkBeanInReport(EJBType.STATELESS, "MyNameForSimpleStatelessEJB", "",
"org.windup.examples.ejb.simplestateless.SimpleStatelessEJB"));
Assert.assertTrue(util.checkBeanInReport(EJBType.STATEFUL, "MyNameForSimpleStatefulEJB", "",
"org.windup.examples.ejb.simplestateful.SimpleStatefulEJB"));
}
private void validateCompatibleReport(GraphContext context)
{
ReportService reportService = new ReportService(context);
ReportModel reportModel = reportService.getUniqueByProperty(
ReportModel.TEMPLATE_PATH,
CreateCompatibleFileReportRuleProvider.TEMPLATE_APPLICATION_REPORT);
TestCompatibleReportUtil util = new TestCompatibleReportUtil();
Path reportPath = reportService.getReportDirectory().resolve(reportModel.getReportFilename());
util.loadPage(reportPath);
Assert.assertTrue(util
.checkFileInReport("src/main/resources/springexample/spring-sample-file.xml", ""));
Assert.assertTrue(util
.checkFileInReport(
"org/windup/examples/ejb/entitybean/SecondEntity.java", ""));
Assert.assertTrue("An application has duplicate entries for a single file.",util.checkTableWithoutDuplicates());
}
private void validateJPAReport(GraphContext context)
{
TestJPAReportUtil util = new TestJPAReportUtil();
ReportService reportService = new ReportService(context);
ReportModel reportModel = reportService.getUniqueByProperty(
ReportModel.TEMPLATE_PATH,
CreateJPAReportRuleProvider.TEMPLATE_JPA_REPORT);
Path reportPath = reportService.getReportDirectory().resolve(reportModel.getReportFilename());
util.loadPage(reportPath);
Assert.assertTrue(util.checkEntityInReport("SimpleEntity", "org.windup.examples.ejb.entitybean.SimpleEntity",
"SimpleEntityTable"));
Assert.assertTrue(util.checkEntityInReport("SimpleEntityNoTableName",
"org.windup.examples.ejb.entitybean.SimpleEntityNoTableName", "SimpleEntityNoTableName"));
}
private void validateMigrationIssuesReport(GraphContext context)
{
TestMigrationIssuesReportUtil util = new TestMigrationIssuesReportUtil();
ApplicationReportService reportService = new ApplicationReportService(context);
Iterable<ApplicationReportModel> reportModels = reportService.findAllByProperty(
ReportModel.TEMPLATE_PATH,
"/reports/templates/migration-issues.ftl");
ApplicationReportModel reportModel = null;
for (ApplicationReportModel possibleModel : reportModels)
{
if (possibleModel.getProjectModel() != null)
{
reportModel = possibleModel;
break;
}
}
if (reportModel == null)
throw new RuntimeException("Failed to find migration issues report!");
Path reportPath = new ReportService(context).getReportDirectory().resolve(reportModel.getReportFilename());
util.loadPage(reportPath);
Assert.assertTrue(util.checkIssue("Classification ActivationConfigProperty", 2, 8, "Unknown effort", 16));
Assert.assertTrue(util.checkIssue("Title for Hint from XML", 1, 0, "Info", 0));
Assert.assertTrue(util.checkIssue("Web Servlet", 1, 0, "Info", 0));
}
/**
* Validate that the report pages were generated correctly
*/
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("src_example", "src/main/resources/test.properties", "Properties");
util.checkFilePathAndTag("src_example", "src/main/resources/WEB-INF/web.xml", "Web XML 3.0");
util.checkFilePathAndTag("src_example", "src/main/resources/WEB-INF/web.xml", "TestTag2"); // WINDUP-679
util.checkFilePathAndIssues("src_example", "org.windup.examples.servlet.SampleServlet",
"References annotation 'javax.servlet.annotation.WebServlet'");
util.checkFilePathAndIssues("src_example", "src/main/resources/WEB-INF/web.xml", "Container");
util.checkFilePathAndIssues("src_example", "src/main/resources/WEB-INF/web.xml", "Title for Hint from XML");
util.checkFilePathAndIssues("src_example", "src/main/resources/WEB-INF/web.xml", "title from user script");
util.checkFilePathAndIssues("src_example", "org.windup.examples.servlet.SampleServlet",
"javax.servlet.http.HttpServletRequest usage");
XsltTransformationService xsltService = new XsltTransformationService(context);
Assert.assertTrue(Files.isRegularFile(xsltService.getTransformedXSLTPath().resolve(
"web-xml-converted-example.xml")));
Assert.assertTrue(Files.isRegularFile(xsltService.getTransformedXSLTPath().resolve(
"web-xmluserscript-converted-example.xml")));
validateSpringBeanReport(context);
validateEJBReport(context);
validateJPAReport(context);
validateMigrationIssuesReport(context);
}
}