Skip to content

Commit

Permalink
Merge pull request #474 from jsight/WINDUP-508
Browse files Browse the repository at this point in the history
WINDUP-508: WindupRuleProvider should contain a location/origin field in...
  • Loading branch information
lincolnthree committed Feb 19, 2015
2 parents 2bd0d48 + a86c1bb commit 2069e67
Show file tree
Hide file tree
Showing 10 changed files with 232 additions and 35 deletions.
@@ -1,6 +1,5 @@
package org.jboss.windup.ext.groovy;

import org.jboss.windup.config.WindupRuleProvider;
import org.jboss.windup.graph.GraphContext;

/**
Expand All @@ -11,11 +10,6 @@
*/
public interface GroovyConfigContext
{
/**
* Add a {@link WindupRuleProvider}.
*/
void addRuleProvider(WindupRuleProvider provider);

/**
* Get the {@link GraphContext}
*/
Expand Down
Expand Up @@ -32,6 +32,7 @@
import org.jboss.forge.furnace.addons.AddonFilter;
import org.jboss.forge.furnace.services.Imported;
import org.jboss.windup.config.WindupRuleProvider;
import org.jboss.windup.config.builder.WindupRuleProviderBuilder;
import org.jboss.windup.config.loader.WindupRuleProviderLoader;
import org.jboss.windup.graph.GraphContext;
import org.jboss.windup.graph.model.WindupConfigurationModel;
Expand Down Expand Up @@ -61,30 +62,22 @@ public class GroovyWindupRuleProviderLoader implements WindupRuleProviderLoader
private FurnaceClasspathScanner scanner;
@Inject
private Furnace furnace;

@Inject
private Imported<GroovyConfigMethod> methods;

@Override
@SuppressWarnings("unchecked")
public List<WindupRuleProvider> getProviders(final GraphContext context)
{
final List<WindupRuleProvider> ruleProviders = new ArrayList<WindupRuleProvider>();
final List<WindupRuleProvider> results = new ArrayList<WindupRuleProvider>();

Binding binding = new Binding();
binding.setVariable("windupRuleProviderBuilders", ruleProviders);
binding.setVariable("supportFunctions", new HashMap<>());
binding.setVariable("graphContext", context);

GroovyConfigContext configContext = new GroovyConfigContext()
{

@Override
public void addRuleProvider(WindupRuleProvider provider)
{
ruleProviders.add(provider);
}

@Override
public GraphContext getGraphContext()
{
Expand All @@ -102,12 +95,13 @@ public GraphContext getGraphContext()
ClassLoader loader = getCompositeClassloader();
GroovyShell shell = new GroovyShell(loader, binding, config);

//import all the support functions defined in a separate groovy file
// import all the support functions defined in a separate groovy file
try (InputStream supportFuncsIS = getClass().getResourceAsStream(
"/org/jboss/windup/addon/groovy/WindupGroovySupportFunctions.groovy"))
{
InputStreamReader isr = new InputStreamReader(supportFuncsIS);
shell.evaluate(isr);

}
catch (Exception e)
{
Expand All @@ -125,19 +119,29 @@ public GraphContext getGraphContext()
{
try (Reader reader = new InputStreamReader(resource.openStream()))
{
List<WindupRuleProvider> ruleProviders = new ArrayList<>();
binding.setVariable("windupRuleProviderBuilders", ruleProviders);

binding.setVariable(CURRENT_WINDUP_SCRIPT, resource.toExternalForm());
shell.evaluate(reader);

List<WindupRuleProvider> providers = (List<WindupRuleProvider>) binding.getVariable("windupRuleProviderBuilders");
for (WindupRuleProvider provider : providers)
{
if (provider instanceof WindupRuleProviderBuilder)
{
((WindupRuleProviderBuilder) provider).setOrigin(resource.toExternalForm());
}
results.add(provider);
}
}
catch (Exception e)
{
throw new WindupException("Failed to evaluate configuration: ", e);
}
}

List<WindupRuleProvider> providers = (List<WindupRuleProvider>) binding
.getVariable("windupRuleProviderBuilders");

return providers;
return results;
}

private ClassLoader getCompositeClassloader()
Expand All @@ -149,15 +153,17 @@ private ClassLoader getCompositeClassloader()
public boolean accept(Addon addon)
{
Set<AddonDependency> dependencies = addon.getDependencies();
boolean found=false;
for(AddonDependency dependency : dependencies) {
// TODO this should only accept addons that depend on windup-config-groovy or whatever we call that
if (dependency.getDependency().getId().getName().contains("groovy")) {
boolean found = false;
for (AddonDependency dependency : dependencies)
{
// TODO this should only accept addons that depend on windup-config-groovy or whatever we call that
if (dependency.getDependency().getId().getName().contains("groovy"))
{
return true;
}
}
return false;

}
};

Expand Down
Expand Up @@ -89,19 +89,26 @@ public void testGroovyRuleProviderFactory() throws Exception
allProviders.addAll(loader.getProviders(context));
}

boolean foundScriptPath = false;
boolean foundRuleProviderOrigin = false;
boolean foundRuleOrigin = false;
for (WindupRuleProvider provider : allProviders)
{
String providerOrigin = provider.getOrigin();
if (providerOrigin.contains(EXAMPLE_GROOVY_FILE))
{
foundRuleProviderOrigin = true;
}

Context ruleContext = RuleBuilder.define();
provider.enhanceMetadata(ruleContext);
String origin = ((String) ruleContext.get(RuleMetadata.ORIGIN));
if (origin.contains(EXAMPLE_GROOVY_FILE))
String ruleOrigin = ((String) ruleContext.get(RuleMetadata.ORIGIN));
if (ruleOrigin.contains(EXAMPLE_GROOVY_FILE))
{
foundScriptPath = true;
break;
foundRuleOrigin = true;
}
}
Assert.assertTrue("Script path should have been set in Rule Metatada", foundScriptPath);
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);
context.getGraph().getBaseGraph().commit();
}
Expand Down
Expand Up @@ -28,6 +28,7 @@
import org.jboss.forge.furnace.Furnace;
import org.jboss.forge.furnace.addons.Addon;
import org.jboss.windup.config.WindupRuleProvider;
import org.jboss.windup.config.builder.WindupRuleProviderBuilder;
import org.jboss.windup.config.loader.WindupRuleProviderLoader;
import org.jboss.windup.graph.GraphContext;
import org.jboss.windup.graph.model.WindupConfigurationModel;
Expand Down Expand Up @@ -91,7 +92,9 @@ public List<WindupRuleProvider> getProviders(GraphContext context)
parser.setAddonContainingInputXML(addon);

parser.processElement(doc.getDocumentElement());
providers.addAll(parser.getRuleProviders());
List<WindupRuleProvider> parsedProviders = parser.getRuleProviders();
setOrigin(parsedProviders, resource);
providers.addAll(parsedProviders);
}
catch (Exception e)
{
Expand All @@ -116,7 +119,9 @@ public List<WindupRuleProvider> getProviders(GraphContext context)
parser.setXmlInputPath(Paths.get(userRulesPath));

parser.processElement(doc.getDocumentElement());
providers.addAll(parser.getRuleProviders());
List<WindupRuleProvider> parsedProviders = parser.getRuleProviders();
setOrigin(parsedProviders, resource);
providers.addAll(parsedProviders);
}
catch (Exception e)
{
Expand All @@ -129,6 +134,17 @@ public List<WindupRuleProvider> getProviders(GraphContext context)
return providers;
}

private void setOrigin(List<WindupRuleProvider> providers, URL resource)
{
for (WindupRuleProvider provider : providers)
{
if (provider instanceof WindupRuleProviderBuilder)
{
((WindupRuleProviderBuilder) provider).setOrigin(resource.toExternalForm());
}
}
}

private Map<Addon, List<URL>> getAddonWindupXmlFiles()
{
return scanner.scanForAddonMap(new FileExtensionFilter(XML_RULES_EXTENSION));
Expand Down
Expand Up @@ -77,6 +77,7 @@ public void testGetProviders() throws Exception
String id = provider.getID();
Assert.assertEquals("testruleprovider", id);
Assert.assertEquals(Discovery.class, provider.getPhase());
Assert.assertTrue(provider.getOrigin().matches("jar:file:.*/DEFAULT.*/Test1.windup.xml"));
List<Rule> rules = provider.getConfiguration(graphContext).getRules();
Assert.assertEquals(3, rules.size());

Expand Down
Expand Up @@ -36,6 +36,15 @@ public abstract class WindupRuleProvider implements ConfigurationProvider<GraphC

private int executionIndex;

/**
* Provides descriptive information indicating where this rule provider was located (eg, a path to a groovy file on disk, or an addon coordinate
* and class name).
*/
public String getOrigin()
{
return addon.getId().getName() + ":" + getClass().getCanonicalName();
}

/**
* Returns a unique identifier for this particular rule provider. The default is based on the addon and classname, but this can be overridden in
* subclasses to provide a more readable name.
Expand Down Expand Up @@ -165,6 +174,7 @@ public boolean equals(Object other)
return result;
}

@Override
public int hashCode()
{
return getID().hashCode();
Expand Down
Expand Up @@ -7,6 +7,7 @@

import javax.enterprise.inject.Vetoed;

import org.apache.commons.lang3.StringUtils;
import org.jboss.forge.furnace.util.Predicate;
import org.jboss.windup.config.WindupRuleProvider;
import org.jboss.windup.config.phase.RulePhase;
Expand All @@ -31,6 +32,7 @@ public final class WindupRuleProviderBuilder extends WindupRuleProvider implemen
WindupRuleProviderBuilderAddDependencies
{
private String id;
private String origin;
private Class<? extends RulePhase> rulePhase = WindupRuleProvider.DEFAULT_PHASE;

private List<String> executeAfterIDs = new ArrayList<>();
Expand Down Expand Up @@ -178,6 +180,17 @@ public List<String> getExecuteBeforeIDs()
return executeBeforeIDs;
}

@Override
public String getOrigin()
{
return StringUtils.isNotBlank(origin) ? origin : super.getOrigin();
}

public void setOrigin(String origin)
{
this.origin = origin;
}

@Override
public String toString()
{
Expand Down
5 changes: 5 additions & 0 deletions config/tests/pom.xml
Expand Up @@ -20,6 +20,11 @@
<artifactId>windup-config</artifactId>
<classifier>forge-addon</classifier>
</dependency>
<dependency>
<groupId>org.jboss.windup.config</groupId>
<artifactId>windup-config-impl</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jboss.windup.utils</groupId>
<artifactId>utils</artifactId>
Expand Down
Expand Up @@ -29,7 +29,7 @@
import org.ocpsoft.rewrite.event.Rewrite;

@RunWith(Arquillian.class)
public class WindupConfigurationLoaderTest
public class WindupRuleLoaderTest
{

@Deployment
Expand Down

0 comments on commit 2069e67

Please sign in to comment.