package org.jboss.windup.config; import java.util.ArrayList; import java.util.List; import org.jboss.windup.config.operation.Iteration; import org.jboss.windup.config.operation.iteration.AbstractIterationOperation; import org.ocpsoft.rewrite.config.CompositeOperation; import org.ocpsoft.rewrite.config.Condition; import org.ocpsoft.rewrite.config.Operation; import org.ocpsoft.rewrite.spi.ConfigurationRuleBuilderInterceptor; public class SimpleIterationConfigurationRuleBuilderInterceptor implements ConfigurationRuleBuilderInterceptor { @Override public Operation perform(Operation operation) { return detectImplicitIteration(operation); } @Override public List<Operation> perform(List<Operation> list) { return detectImplicitIteration(list); } @Override public Operation otherwise(Operation operation) { return perform(operation); } @Override public List<Operation> otherwise(List<Operation> list) { return perform(list); } private List<Operation> detectImplicitIteration(List<Operation> list) { List<Operation> result = new ArrayList<>(); if (list != null) { boolean requiresIteration = false; for (Operation operation : list) { if (requiresIteration(operation)) { requiresIteration = true; break; } } if (requiresIteration) { result.add(Iteration.over().perform(list.toArray(new Operation[list.size()])).endIteration()); } else { result = list; } } return result; } private Operation detectImplicitIteration(Operation operation) { if (requiresIteration(operation)) { return Iteration.over().perform(operation).endIteration(); } return operation; } private boolean requiresIteration(Operation operation) { if (operation instanceof Iteration) { return false; } if (operation instanceof AbstractIterationOperation) return true; if (operation instanceof CompositeOperation) { List<Operation> operations = ((CompositeOperation) operation).getOperations(); for (Operation op : operations) { if (op instanceof AbstractIterationOperation) return true; else if (!(op instanceof Iteration) && requiresIteration(op)) return true; } } return false; } /* * Things we don't care about for this interceptor */ @Override public Condition when(Condition condition) { return condition; } @Override public List<Condition> when(List<Condition> list) { return list; } @Override public int withPriority(int priority) { return priority; } @Override public String withId(String id) { return id; } @Override public int priority() { return 0; } }