package org.jboss.windup.exec.rulefilters; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Set; import org.jboss.forge.furnace.util.Predicate; import org.jboss.forge.furnace.versions.VersionRange; import org.jboss.windup.config.RuleProvider; import org.jboss.windup.config.metadata.TechnologyReference; /** * Provides filtering of the {@link RuleProvider}s by source and target. * * @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a> */ public class SourceAndTargetPredicate implements Predicate<RuleProvider> { private final Map<String, VersionRange> sources; private final Map<String, VersionRange> targets; /** * Creates a new instance with the given set of source and target filters. */ public SourceAndTargetPredicate(Collection<String> sources, Collection<String> targets) { this.sources = initSet(sources); this.targets = initSet(targets); } @Override public boolean accept(RuleProvider type) { Set<TechnologyReference> providerSources = type.getMetadata().getSourceTechnologies(); Set<TechnologyReference> providerTargets = type.getMetadata().getTargetTechnologies(); return (techMatches(sources, providerSources) && techMatches(targets, providerTargets)); } private boolean techMatches(Map<String, VersionRange> techs, Set<TechnologyReference> technologyReferences) { if (techs.isEmpty() || technologyReferences.isEmpty()) { return true; } for (TechnologyReference technologyReference : technologyReferences) { if (techs.containsKey(technologyReference.getId())) { VersionRange expectedRange = techs.get(technologyReference.getId()); return technologyReference.versionRangesOverlap(expectedRange); } } return false; } private Map<String, VersionRange> initSet(Collection<String> values) { if (values == null) { return Collections.emptyMap(); } Map<String, VersionRange> result = new HashMap<>(); for (String value : values) { TechnologyReference reference = TechnologyReference.parseFromIDAndVersion(value); result.put(reference.getId(), reference.getVersionRange()); result.put(value, null); } return result; } @Override public String toString() { return "SourceAndTargetPredicate{" + "sources=" + sources + ", targets=" + targets + '}'; } }