package org.jboss.windup.reporting.xml; import java.util.HashSet; import static org.joox.JOOX.$; import java.util.List; import java.util.Set; import org.apache.commons.lang3.StringUtils; import org.jboss.windup.config.exception.ConfigurationException; import org.jboss.windup.config.parser.ElementHandler; import org.jboss.windup.config.parser.NamespaceElementHandler; import org.jboss.windup.config.parser.ParserContext; import org.jboss.windup.config.parser.xml.RuleProviderHandler; import org.jboss.windup.reporting.config.Link; import org.jboss.windup.reporting.quickfix.Quickfix; import org.jboss.windup.reporting.config.classification.Classification; import org.jboss.windup.reporting.category.IssueCategory; import org.jboss.windup.reporting.category.IssueCategoryRegistry; import org.jboss.windup.util.exception.WindupException; import org.w3c.dom.Element; /** * Adds the provided {@link Classification} operation to the currently selected items. * * Expected format: * * <pre> * <classification; classification="classification text" description="description of classification" effort="8"> * <link href="http://www.foo.com/" description="Helpful text" /> * </classification> * </pre> * * @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a> * @author <a href="mailto:dynawest@gmail.com">Ondrej Zizka</a> */ @NamespaceElementHandler(elementName = "classification", namespace = RuleProviderHandler.WINDUP_RULE_NAMESPACE) public class ClassificationHandler implements ElementHandler<Classification> { @Override public Classification processElement(ParserContext handlerManager, Element element) throws ConfigurationException { String classificationStr = $(element).attr("title"); if (StringUtils.isBlank(classificationStr)) { throw new WindupException( "Error, 'classification' element must have a non-empty 'title' attribute (eg, 'Decompiled Source File')"); } String of = $(element).attr("of"); String effortStr = $(element).attr("effort"); String issueCategoryID = $(element).attr("category-id"); // Backwards compatibility with old rules if (StringUtils.isBlank(issueCategoryID)) issueCategoryID = $(element).attr("severity"); Set<String> tags = new HashSet<>(); Classification classification = (Classification) Classification.as(classificationStr); if (of != null) { classification.setVariableName(of); } if (StringUtils.isNotBlank(effortStr)) { try { int effort = Integer.parseInt(effortStr); classification.withEffort(effort); } catch (NumberFormatException e) { throw new WindupException("Could not parse effort level: " + effortStr + " as an integer!"); } } if (StringUtils.isNotBlank(issueCategoryID)) { IssueCategoryRegistry issueCategoryRegistry = IssueCategoryRegistry.instance(handlerManager.getRuleLoaderContext().getContext()); IssueCategory issueCategory = issueCategoryRegistry.getByID(issueCategoryID); classification.withIssueCategory(issueCategory); } String description = $(element).child("description").text(); if (StringUtils.isNotBlank(description)) { classification.withDescription(description); } List<Element> children = $(element).children("link").get(); for (Element child : children) { Link link = handlerManager.processElement(child); classification.with(link); } children = $(element).children("tag").get(); for (Element child : children) { tags.add(child.getTextContent()); } classification.withTags(tags); // Quickfix parsing children = $(element).children("quickfix").get(); for (Element child : children) { Quickfix quickfix = handlerManager.processElement(child); classification.withQuickfix(quickfix); } return classification; } }