001    /*
002     * Sonar, open source software quality management tool.
003     * Copyright (C) 2008-2011 SonarSource
004     * mailto:contact AT sonarsource DOT com
005     *
006     * Sonar is free software; you can redistribute it and/or
007     * modify it under the terms of the GNU Lesser General Public
008     * License as published by the Free Software Foundation; either
009     * version 3 of the License, or (at your option) any later version.
010     *
011     * Sonar is distributed in the hope that it will be useful,
012     * but WITHOUT ANY WARRANTY; without even the implied warranty of
013     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
014     * Lesser General Public License for more details.
015     *
016     * You should have received a copy of the GNU Lesser General Public
017     * License along with Sonar; if not, write to the Free Software
018     * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02
019     */
020    package org.sonar.api.profiles;
021    
022    import org.apache.commons.lang.StringEscapeUtils;
023    import org.apache.commons.lang.StringUtils;
024    import org.sonar.api.ServerComponent;
025    import org.sonar.api.rules.ActiveRule;
026    import org.sonar.api.rules.ActiveRuleParam;
027    import org.sonar.api.utils.SonarException;
028    
029    import java.io.IOException;
030    import java.io.Writer;
031    
032    /**
033     * @since 2.3
034     */
035    public final class XMLProfileSerializer implements ServerComponent {
036    
037      public void write(RulesProfile profile, Writer writer) {
038        try {
039          appendHeader(profile, writer);
040          appendRules(profile, writer);
041          appendAlerts(profile, writer);
042          appendFooter(writer);
043    
044        } catch (IOException e) {
045          throw new SonarException("Fail to export the profile " + profile, e);
046        }
047      }
048    
049      private void appendHeader(RulesProfile profile, Writer writer) throws IOException {
050        writer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
051            + "<!-- Generated by Sonar -->"
052            + "<profile><name>");
053        StringEscapeUtils.escapeXml(writer, profile.getName());
054        writer.append("</name><language>");
055        StringEscapeUtils.escapeXml(writer, profile.getLanguage());
056        writer.append("</language>");
057      }
058    
059      private void appendRules(RulesProfile profile, Writer writer) throws IOException {
060        if (!profile.getActiveRules().isEmpty()) {
061          writer.append("<rules>");
062          for (ActiveRule activeRule : profile.getActiveRules()) {
063            appendRule(activeRule, writer);
064          }
065          writer.append("</rules>");
066        }
067      }
068    
069      private void appendRule(ActiveRule activeRule, Writer writer) throws IOException {
070        writer.append("<rule><repositoryKey>");
071        writer.append(activeRule.getRepositoryKey());
072        writer.append("</repositoryKey><key>");
073        StringEscapeUtils.escapeXml(writer, activeRule.getRuleKey());
074        writer.append("</key>");
075        if (activeRule.getSeverity() != null) {
076          writer.append("<priority>");
077          writer.append(activeRule.getSeverity().name());
078          writer.append("</priority>");
079        }
080        appendRuleParameters(activeRule, writer);
081        writer.append("</rule>");
082      }
083    
084      private void appendRuleParameters(ActiveRule activeRule, Writer writer) throws IOException {
085        if (activeRule.getActiveRuleParams() != null && !activeRule.getActiveRuleParams().isEmpty()) {
086          writer.append("<parameters>");
087          for (ActiveRuleParam activeRuleParam : activeRule.getActiveRuleParams()) {
088            appendRuleParameter(writer, activeRuleParam);
089          }
090          writer.append("</parameters>");
091        }
092      }
093    
094      private void appendRuleParameter(Writer writer, ActiveRuleParam activeRuleParam) throws IOException {
095        if (StringUtils.isNotBlank(activeRuleParam.getValue())) {
096          writer.append("<parameter><key>");
097          StringEscapeUtils.escapeXml(writer, activeRuleParam.getKey());
098          writer.append("</key><value>");
099          StringEscapeUtils.escapeXml(writer, activeRuleParam.getValue());
100          writer.append("</value>");
101          writer.append("</parameter>");
102        }
103      }
104    
105      private void appendAlerts(RulesProfile profile, Writer writer) throws IOException {
106        if (!profile.getAlerts().isEmpty()) {
107          writer.append("<alerts>");
108          for (Alert alert : profile.getAlerts()) {
109            appendAlert(alert, writer);
110          }
111          writer.append("</alerts>");
112        }
113      }
114    
115      private void appendAlert(Alert alert, Writer writer) throws IOException {
116        writer.append("<alert><metric>");
117        StringEscapeUtils.escapeXml(writer, alert.getMetric().getKey());
118        writer.append("</metric><operator>");
119        StringEscapeUtils.escapeXml(writer, alert.getOperator());
120        writer.append("</operator><warning>");
121        StringEscapeUtils.escapeXml(writer, alert.getValueWarning());
122        writer.append("</warning><error>");
123        StringEscapeUtils.escapeXml(writer, alert.getValueError());
124        writer.append("</error></alert>");
125      }
126    
127      private void appendFooter(Writer writer) throws IOException {
128        writer.append("</profile>");
129      }
130    }