]> source.dussan.org Git - sonarqube.git/blob
64b0ece22536a7ff2596493005248f7d4b8c29d1
[sonarqube.git] /
1 /*
2  * Sonar, open source software quality management tool.
3  * Copyright (C) 2008-2011 SonarSource
4  * mailto:contact AT sonarsource DOT com
5  *
6  * Sonar is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 3 of the License, or (at your option) any later version.
10  *
11  * Sonar is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with Sonar; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02
19  */
20 package org.sonar.plugins.checkstyle;
21
22 import com.puppycrawl.tools.checkstyle.api.AuditEvent;
23 import com.puppycrawl.tools.checkstyle.api.AuditListener;
24 import org.apache.commons.lang.StringUtils;
25 import org.sonar.api.BatchExtension;
26 import org.sonar.api.batch.SensorContext;
27 import org.sonar.api.resources.JavaFile;
28 import org.sonar.api.resources.Project;
29 import org.sonar.api.resources.Resource;
30 import org.sonar.api.rules.Rule;
31 import org.sonar.api.rules.RuleFinder;
32 import org.sonar.api.rules.Violation;
33
34 /**
35  * @since 2.3
36  */
37 public class CheckstyleAuditListener implements AuditListener, BatchExtension {
38
39   private final SensorContext context;
40   private final Project project;
41   private final RuleFinder ruleFinder;
42   private Resource currentResource = null;
43
44   public CheckstyleAuditListener(SensorContext context, Project project, RuleFinder ruleFinder) {
45     this.context = context;
46     this.project = project;
47     this.ruleFinder = ruleFinder;
48   }
49
50   public void auditStarted(AuditEvent event) {
51
52   }
53
54   public void auditFinished(AuditEvent event) {
55
56   }
57
58   public void fileStarted(AuditEvent event) {
59
60   }
61
62   public void fileFinished(AuditEvent event) {
63     currentResource = null;
64   }
65
66   public void addError(AuditEvent event) {
67     String ruleKey = getRuleKey(event);
68     if (ruleKey != null) {
69       Rule rule = ruleFinder.findByKey(CheckstyleConstants.REPOSITORY_KEY, ruleKey);
70       if (rule != null) {
71         initResource(event);
72         Violation violation = Violation.create(rule, currentResource)
73             .setLineId(getLineId(event))
74             .setMessage(getMessage(event));
75         context.saveViolation(violation);
76       }
77     }
78   }
79
80   private void initResource(AuditEvent event) {
81     if (currentResource == null) {
82       String absoluteFilename = event.getFileName();
83       currentResource = JavaFile.fromAbsolutePath(absoluteFilename, project.getFileSystem().getSourceDirs(), false);
84     }
85   }
86
87   private String getRuleKey(AuditEvent event) {
88     String key = null;
89     try {
90       key = event.getModuleId();
91     } catch (Exception e) {
92       // checkstyle throws a NullPointer if the message is not set
93     }
94     if (StringUtils.isBlank(key)) {
95       try {
96         key = event.getSourceName();
97       } catch (Exception e) {
98         // checkstyle can throw a NullPointer if the message is not set
99       }
100     }
101     return key;
102   }
103
104   private String getMessage(AuditEvent event) {
105     try {
106       return event.getMessage();
107
108     } catch (Exception e) {
109       // checkstyle can throw a NullPointer if the message is not set
110       return null;
111     }
112   }
113
114   private int getLineId(AuditEvent event) {
115     try {
116       return event.getLine();
117
118     } catch (Exception e) {
119       // checkstyle can throw a NullPointer if the message is not set
120       return 0;
121     }
122   }
123
124   public void addException(AuditEvent event, Throwable throwable) {
125     // TODO waiting for sonar technical events ?
126   }
127
128   Resource getCurrentResource() {
129     return currentResource;
130   }
131 }