package org.jboss.windup.config.parser;
import java.io.File;
import java.util.List;
import java.util.logging.Logger;
import javax.inject.Inject;
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.config.RuleProvider;
import org.jboss.windup.config.loader.RuleLoaderContext;
import org.jboss.windup.config.phase.DiscoveryPhase;
import org.jboss.windup.graph.GraphContextFactory;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.ocpsoft.rewrite.config.And;
import org.ocpsoft.rewrite.config.Condition;
import org.ocpsoft.rewrite.config.DefaultOperationBuilder;
import org.ocpsoft.rewrite.config.Not;
import org.ocpsoft.rewrite.config.Operation;
import org.ocpsoft.rewrite.config.Rule;
import org.ocpsoft.rewrite.config.RuleBuilder;
import org.ocpsoft.rewrite.config.True;
import org.ocpsoft.rewrite.param.Parameter;
import org.ocpsoft.rewrite.param.RegexConstraint;
@RunWith(Arquillian.class)
public class XMLRuleProviderLoaderTest
{
private static final Logger LOG = Logger.getLogger(XMLRuleProviderLoaderTest.class.getName());
@Deployment
@AddonDependencies({
@AddonDependency(name = "org.jboss.windup.config:windup-config"),
@AddonDependency(name = "org.jboss.windup.config:windup-config-xml"),
@AddonDependency(name = "org.jboss.windup.graph:windup-graph"),
@AddonDependency(name = "org.jboss.forge.furnace.container:cdi"),
})
public static AddonArchive getDeployment()
{
return ShrinkWrap.create(AddonArchive.class)
.addBeansXML()
.addAsResource(new File("src/test/resources/testxml/Test1.windup.xml"));
}
@Inject
private XMLRuleProviderLoader loader;
@Inject
private GraphContextFactory graphContextFactory;
@Test
public void testGetProviders() throws Exception
{
Assert.assertNotNull(loader);
RuleLoaderContext ruleLoaderContext = new RuleLoaderContext();
List<RuleProvider> providers = loader.getProviders(ruleLoaderContext);
Assert.assertNotNull(providers);
Assert.assertTrue(providers.size() == 1);
RuleProvider provider = providers.get(0);
String id = provider.getMetadata().getID();
Assert.assertEquals("testruleprovider", id);
Assert.assertEquals(DiscoveryPhase.class, provider.getMetadata().getPhase());
Assert.assertTrue(provider.getMetadata().getOrigin().matches("jar:file:.*/DEFAULT.*/Test1.windup.xml"));
List<Rule> rules = provider.getConfiguration(null).getRules();
Assert.assertEquals(4, rules.size());
RuleBuilder rule1 = (RuleBuilder) rules.get(0);
checkRule1(rule1);
RuleBuilder rule2 = (RuleBuilder) rules.get(1);
checkRule2(rule2);
RuleBuilder rule2_otherwise = (RuleBuilder) rules.get(2);
checkRule2_Otherwise(rule2_otherwise);
RuleBuilder rule3 = (RuleBuilder) rules.get(3);
checkRule3(rule3);
}
private void checkRule1(RuleBuilder rule)
{
// check the conditions
List<Condition> conditions = rule.getConditions();
Assert.assertEquals(1, conditions.size());
Condition condition = conditions.get(0);
Assert.assertTrue(condition instanceof And);
And and = (And) condition;
Assert.assertEquals(1, and.getConditions().size());
Assert.assertTrue(and.getConditions().get(0) instanceof True);
// check the operations
List<Operation> operations = rule.getOperations();
Assert.assertEquals(1, operations.size());
Assert.assertTrue(operations.get(0) instanceof DefaultOperationBuilder);
}
private void checkRule2(RuleBuilder rule) throws Exception
{
LOG.info("Rule: " + rule);
// check the conditions
List<Condition> conditions = rule.getConditions();
Assert.assertEquals(1, conditions.size());
Condition condition = conditions.get(0);
Assert.assertTrue(condition instanceof And);
And and = (And) condition;
Assert.assertEquals(1, and.getConditions().size());
Assert.assertTrue(and.getConditions().get(0) instanceof True);
// check the operations
List<Operation> operations = rule.getOperations();
Assert.assertEquals(1, operations.size());
Assert.assertTrue(operations.get(0) instanceof DefaultOperationBuilder);
DefaultOperationBuilder opBuilder = (DefaultOperationBuilder) operations.get(0);
String opBuilderStr = opBuilder.toString();
LOG.info("Op Builder is: " + opBuilderStr);
Assert.assertTrue(opBuilderStr.contains("over(?).when(new True"));
Assert.assertTrue(opBuilderStr.contains("perform(Perform.all(LOG[INFO, test {foo} iteration perform]))"));
Assert.assertTrue(opBuilderStr.contains("otherwise(Perform.all(LOG[INFO, test {foo} iteration otherwise]"));
Parameter<?> foo = rule.getParameterStore().get("foo");
Assert.assertEquals("foo", foo.getName());
Assert.assertEquals(new RegexConstraint("\\d+"), foo.getConstraints().get(0));
}
private void checkRule2_Otherwise(RuleBuilder rule) throws Exception
{
LOG.info("Rule: " + rule);
// check the conditions
List<Condition> conditions = rule.getConditions();
Assert.assertEquals(1, conditions.size());
Condition condition = conditions.get(0);
Assert.assertTrue(condition instanceof Not);
Condition andCondition = ((RuleBuilder) ((Not) condition).getConditions().get(0)).getConditions().get(0);
Assert.assertTrue(andCondition instanceof And);
And and = (And) andCondition;
Assert.assertEquals(1, and.getConditions().size());
Assert.assertTrue(and.getConditions().get(0) instanceof True);
// check the operations
List<Operation> operations = rule.getOperations();
Assert.assertEquals(1, operations.size());
Assert.assertTrue(operations.get(0) instanceof DefaultOperationBuilder);
DefaultOperationBuilder opBuilder = (DefaultOperationBuilder) operations.get(0);
String opBuilderStr = opBuilder.toString();
LOG.info("Op Builder is: " + opBuilderStr);
Assert.assertTrue(opBuilderStr.contains("LOG[INFO, test rule {foo} otherwise]"));
}
private void checkRule3(RuleBuilder rule)
{
// check the conditions
List<Condition> conditions = rule.getConditions();
Assert.assertEquals(1, conditions.size());
Condition condition = conditions.get(0);
Assert.assertTrue(condition instanceof And);
And and = (And) condition;
Assert.assertEquals(1, and.getConditions().size());
Assert.assertTrue(and.getConditions().get(0) instanceof True);
// check the operations
List<Operation> operations = rule.getOperations();
Assert.assertEquals(1, operations.size());
Assert.assertTrue(operations.get(0) instanceof DefaultOperationBuilder);
DefaultOperationBuilder opBuilder = (DefaultOperationBuilder) operations.get(0);
String opBuilderStr = opBuilder.toString();
Assert.assertTrue(opBuilderStr.contains("LOG[INFO, subsetperform"));
Assert.assertTrue(opBuilderStr.contains("and(RuleSubset.create"));
}
}