Skip to content

Commit

Permalink
SONARPLUGINS-1847 Link a review with a JIRA issue
Browse files Browse the repository at this point in the history
- Refactoring of the JIRA plugin
- Merge with the "jira-reviews" plugin
  • Loading branch information
bellingard committed May 25, 2012
1 parent 52a82d1 commit d3d92fc
Show file tree
Hide file tree
Showing 21 changed files with 845 additions and 77 deletions.
14 changes: 12 additions & 2 deletions pom.xml
Expand Up @@ -8,7 +8,7 @@
</parent>

<artifactId>sonar-jira-plugin</artifactId>
<version>0.4-SNAPSHOT</version>
<version>1.0-SNAPSHOT</version>
<packaging>sonar-plugin</packaging>

<name>Sonar JIRA Plugin</name>
Expand Down Expand Up @@ -40,6 +40,10 @@
<id>godin</id>
<name>Evgeny Mandrikov</name>
</developer>
<developer>
<id>fabemn</id>
<name>Fabrice Bellingard</name>
</developer>
</developers>

<scm>
Expand All @@ -59,7 +63,7 @@
<properties>
<sonar.pluginClass>org.sonar.plugins.jira.JiraPlugin</sonar.pluginClass>
<sonar.pluginName>Jira</sonar.pluginName>
<sonar.version>2.2</sonar.version>
<sonar.version>3.1-SNAPSHOT</sonar.version>

<!-- Exclude generated classes from Sonar analyzes -->
<sonar.exclusions>com/atlassian/**</sonar.exclusions>
Expand All @@ -72,6 +76,12 @@
<version>${sonar.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.codehaus.sonar</groupId>
<artifactId>sonar-core</artifactId>
<version>${sonar.version}</version>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>axis</groupId>
Expand Down
41 changes: 41 additions & 0 deletions src/main/java/org/sonar/plugins/jira/JiraConstants.java
@@ -0,0 +1,41 @@
/*
* Sonar JIRA Plugin
* Copyright (C) 2009 SonarSource
* 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.plugins.jira;

public final class JiraConstants {

public static final String REVIEW_DATA_PROPERTY_KEY = "jira-issue-key";

// ===================== PLUGIN PROPERTIES =====================

public final static String SERVER_URL_PROPERTY = "sonar.jira.url";

public final static String SOAP_BASE_URL_PROPERTY = "sonar.jira.soap.url";
public final static String SOAP_BASE_URL_DEF_VALUE = "/rpc/soap/jirasoapservice-v2";

public final static String USERNAME_PROPERTY = "sonar.jira.login.secured";

public final static String PASSWORD_PROPERTY = "sonar.jira.password.secured";

public final static String JIRA_PROJECT_KEY_PROPERTY = "sonar.jira.project.key";

public final static String FILTER_PROPERTY = "sonar.jira.url.param";

}
80 changes: 39 additions & 41 deletions src/main/java/org/sonar/plugins/jira/JiraPlugin.java
Expand Up @@ -24,52 +24,44 @@
import org.sonar.api.Plugin;
import org.sonar.api.Properties;
import org.sonar.api.Property;
import org.sonar.plugins.jira.metrics.JiraMetrics;
import org.sonar.plugins.jira.metrics.JiraSensor;
import org.sonar.plugins.jira.metrics.JiraWidget;
import org.sonar.plugins.jira.reviews.JiraIssueCreator;
import org.sonar.plugins.jira.reviews.LinkFunction;
import org.sonar.plugins.jira.reviews.WorkflowBuilder;

import java.util.ArrayList;
import java.util.List;


@Properties({
@Property(
key = JiraPlugin.SERVER_URL_PROPERTY,
defaultValue = "",
name = "Server URL",
description = "Example : http://jira.codehaus.org",
global = true,
project = true,
module = false
),
@Property(
key = JiraPlugin.USERNAME_PROPERTY,
defaultValue = "",
name = "Username",
global = true,
project = true,
module = false
),
@Property(
key = JiraPlugin.PASSWORD_PROPERTY,
defaultValue = "",
name = "Password",
global = true,
project = true,
module = false
),
@Property(
key = JiraPlugin.FILTER_PROPERTY,
defaultValue = "",
name = "Filter name",
description = "Case sensitive, example : SONAR-current-iteration",
global = false,
project = true,
module = true
)
@Property(
key = JiraConstants.SERVER_URL_PROPERTY,
defaultValue = "",
name = "Server URL",
description = "Example : http://jira.codehaus.org",
global = true,
project = true,
module = false
),
@Property(
key = JiraConstants.USERNAME_PROPERTY,
defaultValue = "",
name = "Username",
global = true,
project = true,
module = false
),
@Property(
key = JiraConstants.PASSWORD_PROPERTY,
defaultValue = "",
name = "Password",
global = true,
project = true,
module = false
)
})
public class JiraPlugin implements Plugin {
public final static String SERVER_URL_PROPERTY = "sonar.jira.url";
public final static String USERNAME_PROPERTY = "sonar.jira.login.secured";
public final static String PASSWORD_PROPERTY = "sonar.jira.password.secured";
public final static String FILTER_PROPERTY = "sonar.jira.url.param";

public String getKey() {
return "jira";
Expand All @@ -80,15 +72,21 @@ public String getName() {
}

public String getDescription() {
return "This plugin retrieves number of issues associated to a project from" +
" <a href='http://www.atlassian.com/software/jira/'>JIRA</a>.";
return "This plugin offers several features link to " +
" <a href='http://www.atlassian.com/software/jira/'>JIRA</a>." +
"Check the plugin homepage to know more about it.";
}

public List<Class<? extends Extension>> getExtensions() {
List<Class<? extends Extension>> list = new ArrayList<Class<? extends Extension>>();
// metrics part
list.add(JiraMetrics.class);
list.add(JiraSensor.class);
list.add(JiraWidget.class);
// reviews part
list.add(JiraIssueCreator.class);
list.add(LinkFunction.class);
list.add(WorkflowBuilder.class);
return list;
}
}
Expand Up @@ -18,7 +18,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
*/

package org.sonar.plugins.jira;
package org.sonar.plugins.jira.metrics;

import org.sonar.api.measures.Metric;
import org.sonar.api.measures.Metrics;
Expand Down
Expand Up @@ -18,7 +18,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
*/

package org.sonar.plugins.jira;
package org.sonar.plugins.jira.metrics;

import com.atlassian.jira.rpc.soap.client.JiraSoapService;
import com.atlassian.jira.rpc.soap.client.RemoteFilter;
Expand All @@ -28,19 +28,33 @@
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.sonar.api.Properties;
import org.sonar.api.Property;
import org.sonar.api.batch.Sensor;
import org.sonar.api.batch.SensorContext;
import org.sonar.api.measures.Measure;
import org.sonar.api.measures.PropertiesBuilder;
import org.sonar.api.resources.Project;
import org.sonar.api.utils.SonarException;
import org.sonar.plugins.jira.JiraConstants;
import org.sonar.plugins.jira.soap.JiraSoapSession;

import java.net.URL;
import java.rmi.RemoteException;
import java.util.HashMap;
import java.util.Map;

@Properties({
@Property(
key = JiraConstants.FILTER_PROPERTY,
defaultValue = "",
name = "Filter name",
description = "Case sensitive, example : SONAR-current-iteration",
global = false,
project = true,
module = true
)
})
public class JiraSensor implements Sensor {
private static final Logger LOG = LoggerFactory.getLogger(JiraSensor.class);

Expand Down Expand Up @@ -119,17 +133,17 @@ private void analyze(SensorContext context, JiraSoapService service, String auth

private void initParams(Project project) {
Configuration configuration = project.getConfiguration();
serverUrl = configuration.getString(JiraPlugin.SERVER_URL_PROPERTY);
username = configuration.getString(JiraPlugin.USERNAME_PROPERTY);
password = configuration.getString(JiraPlugin.PASSWORD_PROPERTY);
filterName = configuration.getString(JiraPlugin.FILTER_PROPERTY);
serverUrl = configuration.getString(JiraConstants.SERVER_URL_PROPERTY);
username = configuration.getString(JiraConstants.USERNAME_PROPERTY);
password = configuration.getString(JiraConstants.PASSWORD_PROPERTY);
filterName = configuration.getString(JiraConstants.FILTER_PROPERTY);
}

private boolean isMandatoryParametersNotEmpty() {
return StringUtils.isNotEmpty(serverUrl) &&
StringUtils.isNotEmpty(filterName) &&
StringUtils.isNotEmpty(username) &&
StringUtils.isNotEmpty(password);
StringUtils.isNotEmpty(filterName) &&
StringUtils.isNotEmpty(username) &&
StringUtils.isNotEmpty(password);
}

protected void saveMeasures(SensorContext context, String issueUrl, double totalPrioritiesCount, String priorityDistribution) {
Expand Down
Expand Up @@ -18,7 +18,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
*/

package org.sonar.plugins.jira;
package org.sonar.plugins.jira.metrics;

import org.sonar.api.web.AbstractRubyTemplate;
import org.sonar.api.web.RubyRailsWidget;
Expand All @@ -34,6 +34,6 @@ public String getTitle() {

@Override
protected String getTemplatePath() {
return "/org/sonar/plugins/jira/jiraWidget.erb";
return "/org/sonar/plugins/jira/metrics/jiraWidget.erb";
}
}
39 changes: 39 additions & 0 deletions src/main/java/org/sonar/plugins/jira/reviews/JiraConstants.java
@@ -0,0 +1,39 @@
/*
* Sonar JIRA Plugin
* Copyright (C) 2009 SonarSource
* 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.plugins.jira.reviews;

public final class JiraConstants {

public static final String REVIEW_DATA_PROPERTY_KEY = "jira-issue-key";

// ===================== PLUGIN PROPERTIES =====================

public final static String SERVER_URL_PROPERTY = "sonar.jira.url";

public final static String SOAP_BASE_URL_PROPERTY = "sonar.jira.soap.url";
public final static String SOAP_BASE_URL_DEF_VALUE = "/rpc/soap/jirasoapservice-v2";

public final static String USERNAME_PROPERTY = "sonar.jira.login.secured";

public final static String PASSWORD_PROPERTY = "sonar.jira.password.secured";

public final static String JIRA_PROJECT_KEY_PROPERTY = "sonar.jira.project.key";

}

0 comments on commit d3d92fc

Please sign in to comment.