/* * Sonar PDF Report (Maven plugin) * Copyright (C) 2010 klicap - ingenieria del puzle * dev@sonar.codehaus.org * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 */ package org.sonar.report.pdf.entity; import java.io.IOException; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.net.URLEncoder; import org.apache.commons.httpclient.HttpException; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Node; import org.sonar.report.pdf.entity.exception.ReportException; import org.sonar.report.pdf.util.Logger; import org.sonar.report.pdf.util.SonarAccess; import org.sonar.report.pdf.util.UrlPath; public class Rule { // Rule key private String key; // Rule name private String name; // Rule description private String description; // Violations of this rule: <resource key, violation line> (with limit 100) private List<Violation> topViolatedResources; // Total vilations of this rule private float violationsNumber; // Total vilations of this rule private String violationsNumberFormatted; private static final String RULE_NAME = "rule_name"; private static final String RULE_KEY = "rule_key"; private static final String RULE_VIOLATIONS_NUMBER = "val"; private static final String RULE_VIOLATIONS_NUMBER_FORMATTED = "frmt_val"; private static final String RULE_VIOLATIONS = "/violations/violation"; private static final String RESOURCE_LINE = "line"; private static final String RESOURCE_KEY = "resource/key"; private static final String SOURCE = "/source/line/val"; /** * Initialize a rule given an XML Node that contains one rule * * @return */ public static Rule initFromNode(Node ruleNode) { Rule rule = new Rule(); rule.setKey(ruleNode.selectSingleNode(RULE_KEY).getText()); rule.setName(ruleNode.selectSingleNode(RULE_NAME).getText()); rule.setViolationsNumber(Float.valueOf(ruleNode.selectSingleNode(RULE_VIOLATIONS_NUMBER).getText())); rule.setViolationsNumberFormatted(ruleNode.selectSingleNode(RULE_VIOLATIONS_NUMBER_FORMATTED).getText()); return rule; } /** * This method provide the possibility of init a Rule without init all violated resources. * * @return * @throws DocumentException * @throws IOException * @throws HttpException */ public void loadViolatedResources(SonarAccess sonarAccess, String projectKey) throws ReportException, HttpException, IOException, DocumentException { String ruleKey = getKey(); if (ruleKey == null) { throw new ReportException("Rule not initialized. Forget call to initFromNode() previously?"); } else { ruleKey = URLEncoder.encode(ruleKey, "UTF8"); Logger.debug("Accessing Sonar: getting violated resurces by one given rule (" + getKey() + ")"); Document violatedResourcesDocument = sonarAccess.getUrlAsDocument(UrlPath.VIOLATIONS + projectKey + UrlPath.VIOLATED_RESOURCES_BY_RULE + ruleKey + UrlPath.XML_SOURCE); List<Node> violatedResources = violatedResourcesDocument.selectNodes(RULE_VIOLATIONS); topViolatedResources = new LinkedList<Violation>(); Iterator<Node> it = violatedResources.iterator(); while (it.hasNext()) { Node resource = it.next(); String resourceKey = resource.selectSingleNode(RESOURCE_KEY).getText(); String line = "N/A"; if (resource.selectSingleNode(RESOURCE_LINE) != null) { line = resource.selectSingleNode(RESOURCE_LINE).getText(); } topViolatedResources.add(new Violation(line, resourceKey, "")); } } } public String getName() { return name; } public String getDescription() { return description; } public List<Violation> getTopViolations() { return topViolatedResources; } public void setName(String name) { this.name = name; } public void setDescription(String description) { this.description = description; } public void setTopViolations(List<Violation> violations) { this.topViolatedResources = violations; } public String getKey() { return key; } public void setKey(String key) { this.key = key; } public float getViolationsNumber() { return violationsNumber; } public void setViolationsNumber(float violationsNumber) { this.violationsNumber = violationsNumber; } public String getViolationsNumberFormatted() { return violationsNumberFormatted; } public void setViolationsNumberFormatted(String violationsNumberFormatted) { this.violationsNumberFormatted = violationsNumberFormatted; } }