package org.jboss.windup.engine.predicates; import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; import org.jboss.forge.furnace.util.Predicate; import org.jboss.windup.config.AbstractRuleProvider; import org.jboss.windup.config.RuleProvider; /** * Executes only the given rule with all it's dependencies and pre-phases. * * @author <a href="mailto:mbriskar@gmail.com">Matej Briskar</a> * */ public class RuleProviderWithDependenciesPredicate implements Predicate<RuleProvider> { private static final Logger LOG = Logger.getLogger(RuleProviderWithDependenciesPredicate.class.getName()); private final List<RuleProvider> ruleProviders; @SafeVarargs public RuleProviderWithDependenciesPredicate(Class<? extends RuleProvider> provider, Class<? extends RuleProvider>... providers) throws InstantiationException, IllegalAccessException { /* * FIXME This assumes that the providers can be instantiated with the default constructor. It should really request an instance from Furnace. */ ruleProviders = new ArrayList<>(); ruleProviders.add(provider.newInstance()); for (Class<? extends RuleProvider> clazz : providers) { ruleProviders.add(clazz.newInstance()); } } @Override public boolean accept(RuleProvider provider) { if (!(provider instanceof AbstractRuleProvider)) return false; // FIXME This execution index API needs to be exposed publicly or handled via another pattern. int examinedProviderExecutionIndex = ((AbstractRuleProvider) provider).getExecutionIndex(); for (RuleProvider currentRuleProvider : this.ruleProviders) { // Is it before the examined one? int otherExecutionIndex = ((AbstractRuleProvider) currentRuleProvider).getExecutionIndex(); if (otherExecutionIndex <= examinedProviderExecutionIndex) { LOG.fine("Accepting provider '" + provider.getMetadata().getID() + "' because it's before: " + currentRuleProvider.getMetadata().getID()); return true; } List<Class<? extends RuleProvider>> executeAfter = currentRuleProvider.getMetadata().getExecuteAfter(); List<String> executeAfterIDs = currentRuleProvider.getMetadata().getExecuteAfterIDs(); if ((executeAfter.contains(provider.getClass())) || executeAfterIDs.contains(provider.getMetadata().getID())) { LOG.fine("Accepting provider: " + provider.getMetadata().getID()); return true; } for (Class<? extends RuleProvider> afterType : executeAfter) { if (afterType.isAssignableFrom(provider.getClass())) { LOG.fine("Accepting provider: " + provider.getMetadata().getID()); return true; } } if (currentRuleProvider.getClass().isAssignableFrom(provider.getClass())) { LOG.fine("Accepting provider: " + provider.getMetadata().getID()); return true; } } LOG.fine("Skipping provider: " + provider.getMetadata().getID()); return false; } }