package org.jboss.windup.reporting; import java.util.Collection; import java.util.HashSet; import java.util.Set; import org.jboss.windup.reporting.model.ClassificationModel; import org.jboss.windup.reporting.model.InlineHintModel; import org.jboss.windup.reporting.model.ReportFileModel; /** * This contains utility methods for working with tags. * * @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a> */ public class TagUtil { /** * @see TagUtil#checkMatchingTags(Collection, Set, Set), only with strictExclude = true. */ public static boolean checkMatchingTags(Collection<String> tags, Set<String> includeTags, Set<String> excludeTags) { return TagUtil.checkMatchingTags(tags, includeTags, excludeTags, true); } /** * Returns true if * - includeTags is not empty and tag is in includeTags * - includeTags is empty and tag is not in excludeTags * @param tags Hint tags * @param includeTags Include tags * @param excludeTags Exclude tags * @return has tag match */ public static boolean strictCheckMatchingTags(Collection<String> tags, Set<String> includeTags, Set<String> excludeTags) { boolean includeTagsEnabled = !includeTags.isEmpty(); for (String tag : tags) { boolean isIncluded = includeTags.contains(tag); boolean isExcluded = excludeTags.contains(tag); if ((includeTagsEnabled && isIncluded) || (!includeTagsEnabled && !isExcluded)) { return true; } } return false; } /** * <p> * If any tag is in the exclude list and strictExclude is true, this will return false. * * If any tag is in the exclude list and strictExclude is false, then it will depend upon whether or not there is a tag in the includeTags list. * </p> * * <p> * If the includeTags list is empty or if any tag is in the includeTags list, return true. * </p> * <p> * Otherwise, return false. * </p> */ public static boolean checkMatchingTags(Collection<String> tags, Set<String> includeTags, Set<String> excludeTags, boolean strictExclude) { boolean foundIncludeMatch = false; if (includeTags.isEmpty()) return true; for (String tag : tags) { if (excludeTags.contains(tag)) // If strict, seeing an excluded tag means this set of tags didn't meet the criteria. if (strictExclude) return false; // If not strict, only ignore the excluded tags. else continue; if (includeTags.isEmpty() || includeTags.contains(tag)) foundIncludeMatch = true; } return foundIncludeMatch; } public static boolean hasHintsOrClassificationsWithRelevantTags(ReportFileModel reportFileModel, Set<String> includeTags, Set<String> excludeTags) { Set<String> allTags = gatherReportFileTags(reportFileModel); return TagUtil.checkMatchingTags(allTags, includeTags, excludeTags, false); } public static Set<String> gatherReportFileTags(ReportFileModel reportFileModel) { Set<String> allTags = new HashSet<>(); for (ClassificationModel classificationModel : reportFileModel.getClassificationModels()) { for (String tag : classificationModel.getTags()) allTags.add(tag); } for (InlineHintModel inlineHintModel : reportFileModel.getInlineHints()) { for (String tag : inlineHintModel.getTags()) allTags.add(tag); } return allTags; } }