package org.jboss.windup.addon.groovy; 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.nio.file.Paths; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.inject.Inject; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.junit.Arquillian; import org.jboss.forge.arquillian.AddonDependency; import org.jboss.forge.arquillian.AddonDependencies; import org.jboss.forge.arquillian.archive.AddonArchive; import org.jboss.forge.furnace.Furnace; import org.jboss.forge.furnace.services.Imported; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.windup.config.AbstractRuleProvider; import org.jboss.windup.config.RuleProvider; import org.jboss.windup.config.loader.RuleLoaderContext; import org.jboss.windup.config.loader.RuleProviderLoader; import org.jboss.windup.config.metadata.RuleMetadataType; import org.jboss.windup.graph.GraphContextFactory; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.ocpsoft.rewrite.config.Rule; import org.ocpsoft.rewrite.config.RuleBuilder; import org.ocpsoft.rewrite.context.Context; @RunWith(Arquillian.class) /** * */ public class LoadGroovyRulesTest { // path to use for the groovy example file in the addon private static final String EXAMPLE_GROOVY_FILE = "/org/jboss/windup/addon/groovy/GroovyExampleRule.windup.groovy"; @Deployment @AddonDependencies({ @AddonDependency(name = "org.jboss.windup.config:windup-config-groovy"), @AddonDependency(name = "org.jboss.windup.graph:windup-graph"), @AddonDependency(name = "org.jboss.forge.furnace.container:cdi") }) public static AddonArchive getDeployment() { AddonArchive archive = ShrinkWrap .create(AddonArchive.class) .addBeansXML() .addAsResource(new File("src/test/resources/groovy/GroovyExampleRule.windup.groovy"), EXAMPLE_GROOVY_FILE); return archive; } @Inject private Furnace furnace; @Inject private GraphContextFactory factory; @Test public void testGroovyRuleProviderFactory() throws Exception { RuleLoaderContext ruleLoaderContext = new RuleLoaderContext(); Imported<RuleProviderLoader> loaders = furnace.getAddonRegistry().getServices( RuleProviderLoader.class); Assert.assertNotNull(loaders); List<RuleProvider> allProviders = new ArrayList<>(); for (RuleProviderLoader loader : loaders) { allProviders.addAll(loader.getProviders(ruleLoaderContext)); } boolean foundRuleProviderOrigin = false; boolean foundRuleOrigin = false; for (RuleProvider provider : allProviders) { String providerOrigin = provider.getMetadata().getOrigin(); if (providerOrigin.contains(EXAMPLE_GROOVY_FILE)) { foundRuleProviderOrigin = true; } Rule rule = RuleBuilder.define(); Context ruleContext = (Context) rule; AbstractRuleProvider.enhanceRuleMetadata(provider, rule); String ruleOrigin = ((String) ruleContext.get(RuleMetadataType.ORIGIN)); if (ruleOrigin.contains(EXAMPLE_GROOVY_FILE)) { foundRuleOrigin = true; } } Assert.assertTrue("Script path should have been set in Rule Metatada", foundRuleOrigin); Assert.assertTrue("Script path should have been set in Rule Provider Metatada", foundRuleProviderOrigin); Assert.assertTrue(allProviders.size() > 0); } @Test public void testGroovyUserDirectoryRuleProvider() throws Exception { // create a user path Path userRulesPath = Paths.get(FileUtils.getTempDirectory().toString(), "WindupGroovyPath"); try { FileUtils.deleteDirectory(userRulesPath.toFile()); Files.createDirectories(userRulesPath); Path exampleGroovyUserDirGroovyFile = userRulesPath.resolve("ExampleUserFile.windup.groovy"); // copy a groovy rule example to it try (InputStream is = getClass().getResourceAsStream(EXAMPLE_GROOVY_FILE); OutputStream os = new FileOutputStream(exampleGroovyUserDirGroovyFile.toFile())) { IOUtils.copy(is, os); } RuleLoaderContext ruleLoaderContext = new RuleLoaderContext(Collections.singleton(userRulesPath), null); Imported<RuleProviderLoader> loaders = furnace.getAddonRegistry().getServices( RuleProviderLoader.class); Assert.assertNotNull(loaders); List<RuleProvider> allProviders = new ArrayList<>(); for (RuleProviderLoader loader : loaders) { allProviders.addAll(loader.getProviders(ruleLoaderContext)); } boolean foundScriptPath = false; for (RuleProvider provider : allProviders) { Rule rule = RuleBuilder.define(); Context ruleContext = (Context) rule; AbstractRuleProvider.enhanceRuleMetadata(provider, rule); String origin = ((String) ruleContext.get(RuleMetadataType.ORIGIN)); if (origin.endsWith("ExampleUserFile.windup.groovy")) { // make sure we found the one from the user dir foundScriptPath = true; break; } } Assert.assertTrue("Script path should have been set in Rule Metatada", foundScriptPath); Assert.assertTrue(allProviders.size() > 0); } finally { FileUtils.deleteDirectory(userRulesPath.toFile()); } } }