package org.jboss.windup.tests.application; import java.io.File; import java.nio.file.Path; import javax.inject.Inject; import javax.inject.Singleton; 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.ast.java.data.TypeReferenceLocation; import org.jboss.windup.config.AbstractRuleProvider; import org.jboss.windup.config.GraphRewrite; import org.jboss.windup.config.loader.RuleLoaderContext; import org.jboss.windup.config.metadata.MetadataBuilder; import org.jboss.windup.config.operation.iteration.AbstractIterationOperation; import org.jboss.windup.graph.GraphContext; import org.jboss.windup.graph.model.resource.FileModel; import org.jboss.windup.reporting.model.ReportModel; import org.jboss.windup.reporting.service.ReportService; import org.jboss.windup.rules.apps.java.condition.JavaClass; import org.jboss.windup.rules.apps.java.model.AbstractJavaSourceModel; import org.jboss.windup.rules.apps.java.model.JavaClassModel; import org.jboss.windup.rules.apps.java.model.PhantomJavaClassModel; import org.jboss.windup.rules.apps.java.scan.ast.JavaTypeReferenceModel; import org.jboss.windup.rules.apps.javaee.model.JspSourceFileModel; import org.jboss.windup.testutil.html.TestJavaApplicationOverviewUtil; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.ocpsoft.rewrite.config.Configuration; import org.ocpsoft.rewrite.config.ConfigurationBuilder; import org.ocpsoft.rewrite.context.EvaluationContext; @RunWith(Arquillian.class) public class WindupArchitectureJspTest extends WindupArchitectureTest { @Deployment @AddonDependencies({ @AddonDependency(name = "org.jboss.windup.graph:windup-graph"), @AddonDependency(name = "org.jboss.windup.reporting:windup-reporting"), @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.tests:test-util"), @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() .addAsResource(new File("src/test/xml/XmlExample.windup.xml")) .addClass(WindupArchitectureTest.class); } @Inject private JspRulesProvider provider; @Test public void testRunWindupJsp() throws Exception { final String path = "../test-files/jsptest"; try (GraphContext context = createGraphContext()) { super.runTest(context, path, false); Assert.assertEquals(1, provider.taglibsFound); Assert.assertEquals(2, provider.enumerationRuleHitCount); validateReports(context); validateClassModels(context); } } /** * Validates JavaClassModel classes belonging to .jsp files */ private void validateClassModels(GraphContext context) { Iterable<JspSourceFileModel> jspFiles = context.service(JspSourceFileModel.class).findAll(); int countJspFiles = 0; for (JspSourceFileModel jspFile : jspFiles) { countJspFiles++; int countClasses = 0; for (JavaClassModel classModel : jspFile.getJavaClasses()) { countClasses++; Assert.assertTrue(classModel.getClassName().endsWith(".jsp")); Assert.assertEquals(jspFile.getFileName(), classModel.getClassName()); Assert.assertEquals(jspFile.getFileName(), classModel.getQualifiedName()); Assert.assertEquals("", classModel.getPackageName()); Assert.assertNull(classModel.getDecompiledSource()); Assert.assertNull(classModel.getClassFile()); JavaClassModel parentClass = classModel.getExtends(); Assert.assertEquals("javax.servlet.http.HttpServlet", parentClass.getQualifiedName()); Assert.assertTrue(parentClass instanceof PhantomJavaClassModel); AbstractJavaSourceModel sourceModel = classModel.getOriginalSource(); Assert.assertNotNull(sourceModel); Assert.assertTrue(sourceModel instanceof JspSourceFileModel); } Assert.assertEquals(1, countClasses); } Assert.assertEquals(4, countJspFiles); } /** * Validate that the report pages were generated correctly */ private void validateReports(GraphContext context) { ReportService reportService = new ReportService(context); ReportModel reportModel = super.getMainApplicationReport(context); Path appReportPath = reportService.getReportDirectory().resolve(reportModel.getReportFilename()); TestJavaApplicationOverviewUtil util = new TestJavaApplicationOverviewUtil(); util.loadPage(appReportPath); util.checkFilePathAndIssues("jsptest", "src/example-with-taglib.jsp", "Other Taglib Import"); } @Singleton public static class JspRulesProvider extends AbstractRuleProvider { private int taglibsFound = 0; private int enumerationRuleHitCount = 0; public JspRulesProvider() { super(MetadataBuilder.forProvider(JspRulesProvider.class) .setHaltOnException(true)); } @Override public Configuration getConfiguration(RuleLoaderContext ruleLoaderContext) { return ConfigurationBuilder.begin() .addRule() .when(JavaClass.references("http://www.example.com/custlib").at(TypeReferenceLocation.TAGLIB_IMPORT)) .perform( new AbstractIterationOperation<JavaTypeReferenceModel>() { @Override public void perform(GraphRewrite event, EvaluationContext context, JavaTypeReferenceModel payload) { FileModel source = payload.getFile(); if (!(source instanceof JspSourceFileModel)) Assert.fail("File was not a jsp file!"); taglibsFound++; } }) .addRule() .when(JavaClass.references("java.util.Enumeration").at(TypeReferenceLocation.IMPORT)) .perform(new AbstractIterationOperation<JavaTypeReferenceModel>() { @Override public void perform(GraphRewrite event, EvaluationContext context, JavaTypeReferenceModel payload) { FileModel source = payload.getFile(); if (!(source instanceof JspSourceFileModel)) Assert.fail("File was not a jsp file!"); enumerationRuleHitCount++; } }); } } }