package org.jboss.windup.rules.apps.mavenize; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Collections; import java.util.logging.Logger; import javax.inject.Inject; import org.apache.commons.io.FileUtils; 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.shrinkwrap.api.spec.JavaArchive; import org.jboss.shrinkwrap.resolver.api.maven.Maven; import org.jboss.windup.engine.predicates.RuleProviderWithDependenciesPredicate; 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.rules.apps.java.archives.identify.CompositeArchiveIdentificationService; import org.jboss.windup.rules.apps.java.archives.identify.InMemoryArchiveIdentificationService; import org.jboss.windup.rules.apps.java.archives.model.IdentifiedArchiveModel; import org.jboss.windup.rules.apps.java.config.ScanPackagesOption; import org.jboss.windup.rules.apps.java.config.SourceModeOption; import org.jboss.windup.testutil.basics.WindupTestUtilMethods; import org.junit.Assert; import org.junit.Assume; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; /** * * @author Ondrej Zizka, ozizka at redhat.com */ @RunWith(Arquillian.class) public class MavenizeRuleProviderTest { private static final Logger LOG = Logger.getLogger(MavenizeRuleProviderTest.class.getName()); @Inject MavenizeRuleProvider provider; @Inject private WindupProcessor processor; @Inject private GraphContextFactory factory; @Inject private CompositeArchiveIdentificationService identifier; @Deployment @AddonDependencies({ @AddonDependency(name = "org.jboss.forge.furnace.container:cdi"), @AddonDependency(name = "org.jboss.windup.config:windup-config"), @AddonDependency(name = "org.jboss.windup.exec:windup-exec"), @AddonDependency(name = "org.jboss.windup.utils:windup-utils"), @AddonDependency(name = "org.jboss.windup.rules.apps:windup-rules-base"), @AddonDependency(name = "org.jboss.windup.rules.apps:windup-rules-java"), @AddonDependency(name = "org.jboss.windup.rules.apps:windup-rules-java-archives"), @AddonDependency(name = "org.jboss.windup.tests:test-util"), }) public static AddonArchive getDeployment() { // See https://github.com/shrinkwrap/resolver/blob/master/README.asciidoc JavaArchive[] archives = Maven.resolver().resolve("org.jboss.windup.maven:nexus-indexer-data:zip:5").withoutTransitivity() .as(JavaArchive.class); Assert.assertEquals("maven-indexer-data found", 1, archives.length); AddonArchive deployment = ShrinkWrap.create(AddonArchive.class) .addBeansXML(); for (JavaArchive archive : archives) deployment.merge(archive); return deployment; } private static void checkPomExistence(Path base, String subdirName, boolean shouldExist) { Path pomPath = base.resolve(subdirName).resolve("pom.xml"); if (shouldExist) Assert.assertTrue("Exists: " + pomPath, pomPath.toFile().exists()); else Assert.assertFalse("Not exists: " + pomPath, pomPath.toFile().exists()); } @Before public void addMavenCoordsData() { InMemoryArchiveIdentificationService inMemoryIdentifier = new InMemoryArchiveIdentificationService(); inMemoryIdentifier.addMapping("4bf32b10f459a4ecd4df234ae2ccb32b9d9ba9b7", "log4j:log4j:1.2.6"); inMemoryIdentifier.addMapping("b0236b252e86419eef20c31a44579d2aee2f0a69", "commons-lang:commons-lang:2.5"); identifier.addIdentifier(inMemoryIdentifier); } @Test public void testMavenizeRuleProvider() throws IOException, InstantiationException, IllegalAccessException { try (GraphContext graphContext = factory.create(WindupTestUtilMethods.getTempDirectoryForGraph())) { final String inputDir = "../../test-files/jee-example-app-1.0.0.ear"; // rules-java/api final Class<MavenizeRuleProvider> ruleToRunUpTo = MavenizeRuleProvider.class; final Path outputDir = executeWindupAgainstAppUntilRule(inputDir, graphContext, ruleToRunUpTo); Iterable<IdentifiedArchiveModel> identifiedArchives = graphContext.service(IdentifiedArchiveModel.class).findAll(); Assume.assumeTrue(identifiedArchives.iterator().hasNext()); // Were the pom.xml's created? final Path baseMavenDir = outputDir.resolve("mavenized/jee-example-app"); Path resultRootPomPath = baseMavenDir.resolve("pom.xml"); Assert.assertTrue("Exists: " + resultRootPomPath, resultRootPomPath.toFile().exists()); checkPomExistence(baseMavenDir, "jee-example-app-bom", true); checkPomExistence(baseMavenDir, "jee-example-services-jar", true); checkPomExistence(baseMavenDir, "jee-example-services", false); checkPomExistence(baseMavenDir, "log4j", false); checkPomExistence(baseMavenDir, "log4j-jar", false); checkPomExistence(baseMavenDir, "unparsable-jar", false); // TODO: Load the POM tree with Maven? // ProjectBuilder pb = new DefaultProjectBuilder(); // pb.build(new ArrayList<File>(){{add(outputDir.toFile());}}, true, new DefaultProjectBuildingRequest()); } } private Path executeWindupAgainstAppUntilRule(final String inputDir, final GraphContext grCtx, final Class<MavenizeRuleProvider> ruleToRunUpTo) throws IOException, IllegalAccessException, InstantiationException { Assume.assumeTrue("Exists: " + inputDir, new File(inputDir).exists()); final Path outputPath = Paths.get(FileUtils.getTempDirectory().toString(), "Windup-Mavenization-output"); FileUtils.deleteDirectory(outputPath.toFile()); Files.createDirectories(outputPath); grCtx.getGraph().getBaseGraph().commit(); // Configure Windup core final WindupConfiguration processorConfig = new WindupConfiguration(); processorConfig.setRuleProviderFilter(new RuleProviderWithDependenciesPredicate(ruleToRunUpTo)); processorConfig.setGraphContext(grCtx); processorConfig.addInputPath(Paths.get(inputDir)); processorConfig.setOutputDirectory(outputPath); processorConfig.setOptionValue(ScanPackagesOption.NAME, Collections.singletonList("")); processorConfig.setOptionValue(SourceModeOption.NAME, false); processorConfig.setOptionValue(MavenizeOption.NAME, true); processor.execute(processorConfig); return outputPath; } }