From 224bf6c4205c752cde05edb9aa91e68ba1a4a5b5 Mon Sep 17 00:00:00 2001
From: Hardik Rathod
Date: Thu, 29 May 2025 23:47:53 +0200
Subject: [PATCH 01/22] Update for adding jira site config parameter
maxIssuesFromJqlSearch
---
.../java/hudson/plugins/jira/JiraSession.java | 19 +++----
.../plugins/jira/JiraSessionFactory.java | 2 +-
.../java/hudson/plugins/jira/JiraSite.java | 50 +++++++++++++++----
.../hudson/plugins/jira/JiraSite/config.jelly | 3 ++
.../JiraSite/help-maxIssuesFromJqlSearch.html | 3 ++
src/test/java/JiraTester.java | 8 +--
src/test/java/JiraTesterBearerAuth.java | 6 +--
.../plugins/jira/ChangingWorkflowTest.java | 2 +-
.../plugins/jira/DescriptorImplTest.java | 5 ++
.../JiraReplaceFixVersionByRegExTest.java | 4 +-
.../hudson/plugins/jira/JiraSiteTest.java | 4 +-
.../jira/MailResolverWithExtensionTest.java | 2 +-
.../plugins/jira/oldJiraProjectProperty.xml | 1 +
13 files changed, 76 insertions(+), 33 deletions(-)
create mode 100644 src/main/resources/hudson/plugins/jira/JiraSite/help-maxIssuesFromJqlSearch.html
diff --git a/src/main/java/hudson/plugins/jira/JiraSession.java b/src/main/java/hudson/plugins/jira/JiraSession.java
index 28367d803..302ae39e5 100644
--- a/src/main/java/hudson/plugins/jira/JiraSession.java
+++ b/src/main/java/hudson/plugins/jira/JiraSession.java
@@ -39,8 +39,6 @@
public class JiraSession {
private static final Logger LOGGER = Logger.getLogger(JiraSession.class.getName());
- public static final Integer MAX_ISSUES = 100;
-
public final JiraRestService service;
/**
@@ -50,9 +48,12 @@ public class JiraSession {
private final String jiraSiteName;
- /* package */ JiraSession(JiraSite site, JiraRestService jiraRestService) {
+ private final int maxIssuesFromJqlSearch;
+
+ /* package */ JiraSession(JiraSite site, JiraRestService jiraRestService, int maxIssuesFromJqlSearch) {
this.service = jiraRestService;
this.jiraSiteName = site.getName();
+ this.maxIssuesFromJqlSearch = maxIssuesFromJqlSearch;
}
/**
@@ -131,7 +132,7 @@ public Issue getIssue(String id) {
* @return issues matching the JQL query
*/
public List getIssuesFromJqlSearch(final String jqlSearch) throws TimeoutException {
- return service.getIssuesFromJqlSearch(jqlSearch, MAX_ISSUES);
+ return service.getIssuesFromJqlSearch(jqlSearch, maxIssuesFromJqlSearch);
}
/**
@@ -176,10 +177,10 @@ public List getIssuesWithFixVersion(String projectKey, String version, St
if (isNotEmpty(filter)) {
return service.getIssuesFromJqlSearch(
String.format("project = \"%s\" and fixVersion = \"%s\" and " + filter, projectKey, version),
- MAX_ISSUES);
+ maxIssuesFromJqlSearch);
}
return service.getIssuesFromJqlSearch(
- String.format("project = \"%s\" and fixVersion = \"%s\"", projectKey, version), MAX_ISSUES);
+ String.format("project = \"%s\" and fixVersion = \"%s\"", projectKey, version), maxIssuesFromJqlSearch);
}
/**
@@ -226,7 +227,7 @@ public void migrateIssuesToFixVersion(String projectKey, String version, String
}
LOGGER.fine("Fetching versions with JQL:" + query);
- List issues = service.getIssuesFromJqlSearch(query, MAX_ISSUES);
+ List issues = service.getIssuesFromJqlSearch(query, maxIssuesFromJqlSearch);
if (issues == null || issues.isEmpty()) {
return;
}
@@ -256,7 +257,7 @@ public void replaceFixVersion(String projectKey, String fromVersion, String toVe
}
LOGGER.fine("Fetching versions with JQL:" + query);
- List issues = service.getIssuesFromJqlSearch(query, MAX_ISSUES);
+ List issues = service.getIssuesFromJqlSearch(query, maxIssuesFromJqlSearch);
if (issues == null) {
return;
}
@@ -309,7 +310,7 @@ public void addFixVersion(String projectKey, String version, String query) throw
}
LOGGER.fine("Fetching issues with JQL:" + query);
- List issues = service.getIssuesFromJqlSearch(query, MAX_ISSUES);
+ List issues = service.getIssuesFromJqlSearch(query, maxIssuesFromJqlSearch);
if (issues == null || issues.isEmpty()) {
return;
}
diff --git a/src/main/java/hudson/plugins/jira/JiraSessionFactory.java b/src/main/java/hudson/plugins/jira/JiraSessionFactory.java
index e08fb7755..e3286ea03 100644
--- a/src/main/java/hudson/plugins/jira/JiraSessionFactory.java
+++ b/src/main/java/hudson/plugins/jira/JiraSessionFactory.java
@@ -55,6 +55,6 @@ public static JiraSession create(JiraSite jiraSite, URI uri, StandardUsernamePas
jiraSite.getReadTimeout());
}
- return new JiraSession(jiraSite, jiraRestService);
+ return new JiraSession(jiraSite, jiraRestService, jiraSite.getMaxIssuesFromJqlSearch());
}
}
diff --git a/src/main/java/hudson/plugins/jira/JiraSite.java b/src/main/java/hudson/plugins/jira/JiraSite.java
index f5f6db9d4..613911136 100644
--- a/src/main/java/hudson/plugins/jira/JiraSite.java
+++ b/src/main/java/hudson/plugins/jira/JiraSite.java
@@ -117,6 +117,8 @@ public class JiraSite extends AbstractDescribableImpl {
public static final int DEFAULT_THREAD_EXECUTOR_NUMBER = 10;
+ public static final int DEFAULT_MAX_ISSUES = 100;
+
/**
* URL of Jira for Jenkins access, like {@code http://jira.codehaus.org/}.
* Mandatory. Normalized to end with '/'
@@ -242,6 +244,11 @@ public class JiraSite extends AbstractDescribableImpl {
*/
private boolean appendChangeTimestamp;
+ /**
+ * To allow configurable value of max issues from jql search via jira site global configuration.
+ */
+ private int maxIssuesFromJqlSearch = DEFAULT_MAX_ISSUES;
+
private int ioThreadCount = Integer.getInteger(JiraSite.class.getName() + ".httpclient.options.ioThreadCount", 2);
/**
@@ -275,7 +282,8 @@ public JiraSite(
boolean updateJiraIssueForAllStatus,
@CheckForNull String groupVisibility,
@CheckForNull String roleVisibility,
- boolean useHTTPAuth) {
+ boolean useHTTPAuth,
+ int maxIssuesFromJqlSearch) {
this(
url,
alternativeUrl,
@@ -289,7 +297,8 @@ public JiraSite(
useHTTPAuth,
DEFAULT_TIMEOUT,
DEFAULT_READ_TIMEOUT,
- DEFAULT_THREAD_EXECUTOR_NUMBER);
+ DEFAULT_THREAD_EXECUTOR_NUMBER,
+ DEFAULT_MAX_ISSUES);
}
// Deprecate the previous constructor but leave it in place for Java-level compatibility.
@@ -347,7 +356,8 @@ public JiraSite(
useHTTPAuth,
DEFAULT_TIMEOUT,
DEFAULT_READ_TIMEOUT,
- DEFAULT_THREAD_EXECUTOR_NUMBER);
+ DEFAULT_THREAD_EXECUTOR_NUMBER,
+ DEFAULT_MAX_ISSUES);
if (credentials != null) {
// we verify the credential really exists otherwise we migrate it
StandardUsernamePasswordCredentials standardUsernamePasswordCredentials =
@@ -375,7 +385,8 @@ public JiraSite(
boolean useHTTPAuth,
int timeout,
int readTimeout,
- int threadExecutorNumber) {
+ int threadExecutorNumber,
+ int maxIssuesFromJqlSearch) {
if (url != null) {
url = toURL(url.toExternalForm());
}
@@ -398,6 +409,7 @@ public JiraSite(
setRoleVisibility(roleVisibility);
this.useHTTPAuth = useHTTPAuth;
this.jiraSession = null;
+ this.maxIssuesFromJqlSearch = maxIssuesFromJqlSearch;
}
@DataBoundConstructor
@@ -424,7 +436,8 @@ public JiraSite(
boolean useHTTPAuth,
int timeout,
int readTimeout,
- int threadExecutorNumber) {
+ int threadExecutorNumber,
+ int maxIssuesFromJqlSearch) {
this(
url,
alternativeUrl,
@@ -438,7 +451,8 @@ public JiraSite(
useHTTPAuth,
timeout,
readTimeout,
- threadExecutorNumber);
+ threadExecutorNumber,
+ maxIssuesFromJqlSearch);
}
// Deprecate the previous constructor but leave it in place for Java-level compatibility.
@@ -457,7 +471,8 @@ public JiraSite(
int timeout,
int readTimeout,
int threadExecutorNumber,
- boolean useBearerAuth) {
+ boolean useBearerAuth,
+ int maxIssuesFromJqlSearch) {
this(
url,
alternativeUrl,
@@ -471,7 +486,8 @@ public JiraSite(
useHTTPAuth,
timeout,
readTimeout,
- threadExecutorNumber);
+ threadExecutorNumber,
+ maxIssuesFromJqlSearch);
this.useBearerAuth = useBearerAuth;
}
@@ -646,6 +662,15 @@ public void setUpdateJiraIssueForAllStatus(boolean updateJiraIssueForAllStatus)
this.updateJiraIssueForAllStatus = updateJiraIssueForAllStatus;
}
+ @DataBoundSetter
+ public void setMaxIssuesFromJqlSearch(int maxIssuesFromJqlSearch) {
+ this.maxIssuesFromJqlSearch = maxIssuesFromJqlSearch;
+ }
+
+ public int getMaxIssuesFromJqlSearch() {
+ return maxIssuesFromJqlSearch;
+ }
+
@SuppressWarnings("unused")
protected Object readResolve() throws FormException {
JiraSite jiraSite;
@@ -677,7 +702,8 @@ protected Object readResolve() throws FormException {
useHTTPAuth,
timeout,
readTimeout,
- threadExecutorNumber);
+ threadExecutorNumber,
+ maxIssuesFromJqlSearch);
}
jiraSite.setAppendChangeTimestamp(appendChangeTimestamp);
jiraSite.setDisableChangelogAnnotations(disableChangelogAnnotations);
@@ -1350,6 +1376,7 @@ public FormValidation doValidate(
@QueryParameter int readTimeout,
@QueryParameter int threadExecutorNumber,
@QueryParameter boolean useBearerAuth,
+ @QueryParameter int maxIssuesFromJqlSearch,
@AncestorInPath Item item) {
if (item == null) {
@@ -1403,6 +1430,7 @@ public FormValidation doValidate(
site.setReadTimeout(readTimeout);
site.setThreadExecutorNumber(threadExecutorNumber);
site.setUseBearerAuth(useBearerAuth);
+ site.setMaxIssuesFromJqlSearch(maxIssuesFromJqlSearch);
try {
JiraSession session = site.getSession(item, true);
if (session == null) {
@@ -1451,6 +1479,7 @@ static class Builder {
private String groupVisibility;
private String roleVisibility;
private boolean useHTTPAuth;
+ private int maxIssuesFromJqlSearch;
public Builder withMainURL(URL mainURL) {
this.mainURL = mainURL;
@@ -1513,7 +1542,8 @@ public JiraSite build() {
updateJiraIssueForAllStatus,
groupVisibility,
roleVisibility,
- useHTTPAuth);
+ useHTTPAuth,
+ maxIssuesFromJqlSearch);
}
}
diff --git a/src/main/resources/hudson/plugins/jira/JiraSite/config.jelly b/src/main/resources/hudson/plugins/jira/JiraSite/config.jelly
index 7e939f4e4..c7a20defd 100644
--- a/src/main/resources/hudson/plugins/jira/JiraSite/config.jelly
+++ b/src/main/resources/hudson/plugins/jira/JiraSite/config.jelly
@@ -51,6 +51,9 @@
+
+
+
diff --git a/src/main/resources/hudson/plugins/jira/JiraSite/help-maxIssuesFromJqlSearch.html b/src/main/resources/hudson/plugins/jira/JiraSite/help-maxIssuesFromJqlSearch.html
new file mode 100644
index 000000000..28be7c127
--- /dev/null
+++ b/src/main/resources/hudson/plugins/jira/JiraSite/help-maxIssuesFromJqlSearch.html
@@ -0,0 +1,3 @@
+
+Specifies the maximum number of issues to load from the JQL search query. If this number exceeds the limit configured in Jira, only the maximum allowed by Jira will be retrieved.
+
diff --git a/src/test/java/JiraTester.java b/src/test/java/JiraTester.java
index 7afb65ea6..818d5ab0c 100644
--- a/src/test/java/JiraTester.java
+++ b/src/test/java/JiraTester.java
@@ -5,7 +5,6 @@
import com.atlassian.jira.rest.client.api.domain.Transition;
import com.atlassian.jira.rest.client.api.domain.User;
import hudson.plugins.jira.JiraRestService;
-import hudson.plugins.jira.JiraSession;
import hudson.plugins.jira.JiraSite;
import hudson.plugins.jira.JiraSite.ExtendedAsynchronousJiraRestClientFactory;
import hudson.plugins.jira.extension.ExtendedJiraRestClient;
@@ -57,7 +56,7 @@ public static void main(String[] args) throws Exception {
// restService.createIssue("TESTPROJECT", "This is a test issue created using Jira jenkins plugin. Please
// ignore it.", "TESTUSER", components1, "test issue from Jira jenkins plugin");
- final List searchResults = restService.getIssuesFromJqlSearch("project = \"TESTPROJECT\"", 3);
+ final List searchResults = restService.getIssuesFromJqlSearch("project = \"TESTPROJECT\"", JiraSite.DEFAULT_MAX_ISSUES);
for (Issue searchResult : searchResults) {
System.out.println("JQL search result: " + searchResult);
}
@@ -103,7 +102,8 @@ public static void main(String[] args) throws Exception {
private static void callUniq(final JiraRestService restService) throws Exception {
long start = System.currentTimeMillis();
List issues =
- restService.getIssuesFromJqlSearch("key in ('JENKINS-53320','JENKINS-51057')", JiraSession.MAX_ISSUES);
+ restService.getIssuesFromJqlSearch("key in ('JENKINS-53320','JENKINS-51057')",
+ JiraSite.DEFAULT_MAX_ISSUES);
long end = System.currentTimeMillis();
System.out.println("time uniq " + (end - start));
}
@@ -112,7 +112,7 @@ private static void callDuplicate(final JiraRestService restService) throws Exce
long start = System.currentTimeMillis();
List issues = restService.getIssuesFromJqlSearch(
"key in ('JENKINS-53320','JENKINS-53320','JENKINS-53320','JENKINS-53320','JENKINS-53320','JENKINS-51057','JENKINS-51057','JENKINS-51057','JENKINS-51057','JENKINS-51057')",
- JiraSession.MAX_ISSUES);
+ JiraSite.DEFAULT_MAX_ISSUES);
long end = System.currentTimeMillis();
System.out.println("time duplicate " + (end - start));
}
diff --git a/src/test/java/JiraTesterBearerAuth.java b/src/test/java/JiraTesterBearerAuth.java
index bf1f3bbf6..22e0ca481 100644
--- a/src/test/java/JiraTesterBearerAuth.java
+++ b/src/test/java/JiraTesterBearerAuth.java
@@ -59,7 +59,7 @@ public static void main(String[] args) throws Exception {
// restService.createIssue("TESTPROJECT", "This is a test issue created using Jira jenkins plugin. Please
// ignore it.", "TESTUSER", components1, "test issue from Jira jenkins plugin");
- final List searchResults = restService.getIssuesFromJqlSearch("project = \"TESTPROJECT\"", 3);
+ final List searchResults = restService.getIssuesFromJqlSearch("project = \"TESTPROJECT\"", JiraSite.DEFAULT_MAX_ISSUES);
for (Issue searchResult : searchResults) {
System.out.println("JQL search result: " + searchResult);
}
@@ -105,7 +105,7 @@ public static void main(String[] args) throws Exception {
private static void callUniq(final JiraRestService restService) throws Exception {
long start = System.currentTimeMillis();
List issues =
- restService.getIssuesFromJqlSearch("key in ('JENKINS-53320','JENKINS-51057')", JiraSession.MAX_ISSUES);
+ restService.getIssuesFromJqlSearch("key in ('JENKINS-53320','JENKINS-51057')", JiraSite.DEFAULT_MAX_ISSUES);
long end = System.currentTimeMillis();
System.out.println("time uniq " + (end - start));
}
@@ -114,7 +114,7 @@ private static void callDuplicate(final JiraRestService restService) throws Exce
long start = System.currentTimeMillis();
List issues = restService.getIssuesFromJqlSearch(
"key in ('JENKINS-53320','JENKINS-53320','JENKINS-53320','JENKINS-53320','JENKINS-53320','JENKINS-51057','JENKINS-51057','JENKINS-51057','JENKINS-51057','JENKINS-51057')",
- JiraSession.MAX_ISSUES);
+ JiraSite.DEFAULT_MAX_ISSUES);
long end = System.currentTimeMillis();
System.out.println("time duplicate " + (end - start));
}
diff --git a/src/test/java/hudson/plugins/jira/ChangingWorkflowTest.java b/src/test/java/hudson/plugins/jira/ChangingWorkflowTest.java
index f2c7354e0..a0ce2bab3 100644
--- a/src/test/java/hudson/plugins/jira/ChangingWorkflowTest.java
+++ b/src/test/java/hudson/plugins/jira/ChangingWorkflowTest.java
@@ -59,7 +59,7 @@ public class ChangingWorkflowTest {
@BeforeEach
void setupSpy() {
- spySession = spy(new JiraSession(site, restService));
+ spySession = spy(new JiraSession(site, restService, site.getMaxIssuesFromJqlSearch()));
}
@Test
diff --git a/src/test/java/hudson/plugins/jira/DescriptorImplTest.java b/src/test/java/hudson/plugins/jira/DescriptorImplTest.java
index ab800415e..253890dc0 100644
--- a/src/test/java/hudson/plugins/jira/DescriptorImplTest.java
+++ b/src/test/java/hudson/plugins/jira/DescriptorImplTest.java
@@ -138,6 +138,7 @@ void validateFormConnectionErrors(JenkinsRule r) throws Exception {
JiraSite.DEFAULT_READ_TIMEOUT,
JiraSite.DEFAULT_THREAD_EXECUTOR_NUMBER,
false,
+ 100,
project);
assertEquals(FormValidation.Kind.ERROR, validation.kind);
@@ -154,6 +155,7 @@ void validateFormConnectionErrors(JenkinsRule r) throws Exception {
JiraSite.DEFAULT_READ_TIMEOUT,
JiraSite.DEFAULT_THREAD_EXECUTOR_NUMBER,
false,
+ 100,
project);
assertEquals(Messages.JiraSite_timeoutMinimunValue("1"), validation.getLocalizedMessage());
assertEquals(FormValidation.Kind.ERROR, validation.kind);
@@ -170,6 +172,7 @@ void validateFormConnectionErrors(JenkinsRule r) throws Exception {
-1,
JiraSite.DEFAULT_THREAD_EXECUTOR_NUMBER,
false,
+ 100,
project);
assertEquals(Messages.JiraSite_readTimeoutMinimunValue("1"), validation.getMessage());
@@ -187,6 +190,7 @@ void validateFormConnectionErrors(JenkinsRule r) throws Exception {
JiraSite.DEFAULT_READ_TIMEOUT,
-1,
false,
+ 100,
project);
assertEquals(Messages.JiraSite_threadExecutorMinimunSize("1"), validation.getMessage());
assertEquals(FormValidation.Kind.ERROR, validation.kind);
@@ -213,6 +217,7 @@ void validateFormConnectionOK(JenkinsRule r) throws Exception {
JiraSite.DEFAULT_READ_TIMEOUT,
JiraSite.DEFAULT_THREAD_EXECUTOR_NUMBER,
false,
+ 100,
project);
verify(builder).build();
diff --git a/src/test/java/hudson/plugins/jira/JiraReplaceFixVersionByRegExTest.java b/src/test/java/hudson/plugins/jira/JiraReplaceFixVersionByRegExTest.java
index bef598000..dc015b5e9 100644
--- a/src/test/java/hudson/plugins/jira/JiraReplaceFixVersionByRegExTest.java
+++ b/src/test/java/hudson/plugins/jira/JiraReplaceFixVersionByRegExTest.java
@@ -41,7 +41,7 @@ class JiraReplaceFixVersionByRegExTest {
@BeforeEach
void prepareMocks() throws IOException, InterruptedException {
- jiraSession = spy(new JiraSession(site, service));
+ jiraSession = spy(new JiraSession(site, service, site.getMaxIssuesFromJqlSearch()));
}
@Test
@@ -54,7 +54,7 @@ void replaceWithFixVersionByRegex() throws URISyntaxException, TimeoutException
ArrayList issues = new ArrayList<>();
issues.add(getIssue("abcXXXXefg", 1L));
issues.add(getIssue("dgcXXXXefg", 2L));
- when(service.getIssuesFromJqlSearch(QUERY, JiraSession.MAX_ISSUES)).thenReturn(issues);
+ when(service.getIssuesFromJqlSearch(QUERY, JiraSite.DEFAULT_MAX_ISSUES)).thenReturn(issues);
jiraSession.replaceFixVersion(PROJECT_KEY, "/abc.*efg/", TO_VERSION, QUERY);
diff --git a/src/test/java/hudson/plugins/jira/JiraSiteTest.java b/src/test/java/hudson/plugins/jira/JiraSiteTest.java
index 65c3272d8..2ccf28c52 100644
--- a/src/test/java/hudson/plugins/jira/JiraSiteTest.java
+++ b/src/test/java/hudson/plugins/jira/JiraSiteTest.java
@@ -158,7 +158,7 @@ void deserializeNormal(JenkinsRule j) throws IOException, FormException {
new UsernamePasswordCredentialsImpl(CredentialsScope.SYSTEM, null, null, ANY_USER, ANY_PASSWORD);
CredentialsProvider.lookupStores(j.jenkins).iterator().next().addDomain(domain, c);
- JiraSite site = new JiraSite(exampleOrg, null, c.getId(), false, false, null, false, null, null, true);
+ JiraSite site = new JiraSite(exampleOrg, null, c.getId(), false, false, null, false, null, null, true, 100);
site.setUseBearerAuth(true);
XStream2 xStream2 = new XStream2();
@@ -176,7 +176,7 @@ void deserializeNormal(JenkinsRule j) throws IOException, FormException {
@WithoutJenkins
@Test
void deserializeWithoutCredentials() {
- JiraSite site = new JiraSite(exampleOrg, null, (String) null, false, false, null, false, null, null, true);
+ JiraSite site = new JiraSite(exampleOrg, null, (String) null, false, false, null, false, null, null, true, 100);
XStream2 xStream2 = new XStream2();
String xml = xStream2.toXML(site);
diff --git a/src/test/java/hudson/plugins/jira/MailResolverWithExtensionTest.java b/src/test/java/hudson/plugins/jira/MailResolverWithExtensionTest.java
index 2c0fba17f..0716023a0 100644
--- a/src/test/java/hudson/plugins/jira/MailResolverWithExtensionTest.java
+++ b/src/test/java/hudson/plugins/jira/MailResolverWithExtensionTest.java
@@ -62,7 +62,7 @@ class MailResolverWithExtensionTest {
@BeforeEach
void createMocks() throws Exception {
- session = new JiraSession(site, service);
+ session = new JiraSession(site, service, site.getMaxIssuesFromJqlSearch());
Mockito.when(site.getSession(any())).thenReturn(session);
Map avatars = new HashMap<>();
diff --git a/src/test/resources/hudson/plugins/jira/oldJiraProjectProperty.xml b/src/test/resources/hudson/plugins/jira/oldJiraProjectProperty.xml
index b9ba6371a..b3c34f2ea 100644
--- a/src/test/resources/hudson/plugins/jira/oldJiraProjectProperty.xml
+++ b/src/test/resources/hudson/plugins/jira/oldJiraProjectProperty.xml
@@ -12,6 +12,7 @@
10
false
+ 100
From d3b34b93794f3de3a985feffa194dabd5570ce31 Mon Sep 17 00:00:00 2001
From: Hardik Rathod
Date: Thu, 29 May 2025 23:50:14 +0200
Subject: [PATCH 02/22] Update for replacing hard coded value in
DescriptorImplTest with Default max value parameter
---
.../java/hudson/plugins/jira/DescriptorImplTest.java | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/src/test/java/hudson/plugins/jira/DescriptorImplTest.java b/src/test/java/hudson/plugins/jira/DescriptorImplTest.java
index 253890dc0..225bd9320 100644
--- a/src/test/java/hudson/plugins/jira/DescriptorImplTest.java
+++ b/src/test/java/hudson/plugins/jira/DescriptorImplTest.java
@@ -138,7 +138,7 @@ void validateFormConnectionErrors(JenkinsRule r) throws Exception {
JiraSite.DEFAULT_READ_TIMEOUT,
JiraSite.DEFAULT_THREAD_EXECUTOR_NUMBER,
false,
- 100,
+ JiraSite.DEFAULT_MAX_ISSUES,
project);
assertEquals(FormValidation.Kind.ERROR, validation.kind);
@@ -155,7 +155,7 @@ void validateFormConnectionErrors(JenkinsRule r) throws Exception {
JiraSite.DEFAULT_READ_TIMEOUT,
JiraSite.DEFAULT_THREAD_EXECUTOR_NUMBER,
false,
- 100,
+ JiraSite.DEFAULT_MAX_ISSUES,
project);
assertEquals(Messages.JiraSite_timeoutMinimunValue("1"), validation.getLocalizedMessage());
assertEquals(FormValidation.Kind.ERROR, validation.kind);
@@ -172,7 +172,7 @@ void validateFormConnectionErrors(JenkinsRule r) throws Exception {
-1,
JiraSite.DEFAULT_THREAD_EXECUTOR_NUMBER,
false,
- 100,
+ JiraSite.DEFAULT_MAX_ISSUES,
project);
assertEquals(Messages.JiraSite_readTimeoutMinimunValue("1"), validation.getMessage());
@@ -190,7 +190,7 @@ void validateFormConnectionErrors(JenkinsRule r) throws Exception {
JiraSite.DEFAULT_READ_TIMEOUT,
-1,
false,
- 100,
+ JiraSite.DEFAULT_MAX_ISSUES,
project);
assertEquals(Messages.JiraSite_threadExecutorMinimunSize("1"), validation.getMessage());
assertEquals(FormValidation.Kind.ERROR, validation.kind);
@@ -217,7 +217,7 @@ void validateFormConnectionOK(JenkinsRule r) throws Exception {
JiraSite.DEFAULT_READ_TIMEOUT,
JiraSite.DEFAULT_THREAD_EXECUTOR_NUMBER,
false,
- 100,
+ JiraSite.DEFAULT_MAX_ISSUES,
project);
verify(builder).build();
From 56ba76d69fb27c09b3800d79f1b0e7100a0788e3 Mon Sep 17 00:00:00 2001
From: Hardik Rathod
Date: Fri, 30 May 2025 00:06:43 +0200
Subject: [PATCH 03/22] Fix testcase replaceWithFixVersionByRegex
---
.../hudson/plugins/jira/JiraReplaceFixVersionByRegExTest.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/test/java/hudson/plugins/jira/JiraReplaceFixVersionByRegExTest.java b/src/test/java/hudson/plugins/jira/JiraReplaceFixVersionByRegExTest.java
index dc015b5e9..3f7fdeecd 100644
--- a/src/test/java/hudson/plugins/jira/JiraReplaceFixVersionByRegExTest.java
+++ b/src/test/java/hudson/plugins/jira/JiraReplaceFixVersionByRegExTest.java
@@ -54,7 +54,7 @@ void replaceWithFixVersionByRegex() throws URISyntaxException, TimeoutException
ArrayList issues = new ArrayList<>();
issues.add(getIssue("abcXXXXefg", 1L));
issues.add(getIssue("dgcXXXXefg", 2L));
- when(service.getIssuesFromJqlSearch(QUERY, JiraSite.DEFAULT_MAX_ISSUES)).thenReturn(issues);
+ when(service.getIssuesFromJqlSearch(QUERY, site.getMaxIssuesFromJqlSearch())).thenReturn(issues);
jiraSession.replaceFixVersion(PROJECT_KEY, "/abc.*efg/", TO_VERSION, QUERY);
From 4066698038fe2e3d2c80a59baa38700d9e4949b1 Mon Sep 17 00:00:00 2001
From: Hardik Rathod
Date: Fri, 30 May 2025 00:13:51 +0200
Subject: [PATCH 04/22] Update for fixing format violations
---
src/test/java/JiraTester.java | 8 ++++----
src/test/java/JiraTesterBearerAuth.java | 8 ++++----
.../plugins/jira/JiraReplaceFixVersionByRegExTest.java | 3 ++-
3 files changed, 10 insertions(+), 9 deletions(-)
diff --git a/src/test/java/JiraTester.java b/src/test/java/JiraTester.java
index 818d5ab0c..0bfba8d5d 100644
--- a/src/test/java/JiraTester.java
+++ b/src/test/java/JiraTester.java
@@ -56,7 +56,8 @@ public static void main(String[] args) throws Exception {
// restService.createIssue("TESTPROJECT", "This is a test issue created using Jira jenkins plugin. Please
// ignore it.", "TESTUSER", components1, "test issue from Jira jenkins plugin");
- final List searchResults = restService.getIssuesFromJqlSearch("project = \"TESTPROJECT\"", JiraSite.DEFAULT_MAX_ISSUES);
+ final List searchResults =
+ restService.getIssuesFromJqlSearch("project = \"TESTPROJECT\"", JiraSite.DEFAULT_MAX_ISSUES);
for (Issue searchResult : searchResults) {
System.out.println("JQL search result: " + searchResult);
}
@@ -101,9 +102,8 @@ public static void main(String[] args) throws Exception {
private static void callUniq(final JiraRestService restService) throws Exception {
long start = System.currentTimeMillis();
- List issues =
- restService.getIssuesFromJqlSearch("key in ('JENKINS-53320','JENKINS-51057')",
- JiraSite.DEFAULT_MAX_ISSUES);
+ List issues = restService.getIssuesFromJqlSearch(
+ "key in ('JENKINS-53320','JENKINS-51057')", JiraSite.DEFAULT_MAX_ISSUES);
long end = System.currentTimeMillis();
System.out.println("time uniq " + (end - start));
}
diff --git a/src/test/java/JiraTesterBearerAuth.java b/src/test/java/JiraTesterBearerAuth.java
index 22e0ca481..ad09f9bd6 100644
--- a/src/test/java/JiraTesterBearerAuth.java
+++ b/src/test/java/JiraTesterBearerAuth.java
@@ -5,7 +5,6 @@
import com.atlassian.jira.rest.client.api.domain.Transition;
import com.atlassian.jira.rest.client.api.domain.User;
import hudson.plugins.jira.JiraRestService;
-import hudson.plugins.jira.JiraSession;
import hudson.plugins.jira.JiraSite;
import hudson.plugins.jira.JiraSite.ExtendedAsynchronousJiraRestClientFactory;
import hudson.plugins.jira.auth.BearerHttpAuthenticationHandler;
@@ -59,7 +58,8 @@ public static void main(String[] args) throws Exception {
// restService.createIssue("TESTPROJECT", "This is a test issue created using Jira jenkins plugin. Please
// ignore it.", "TESTUSER", components1, "test issue from Jira jenkins plugin");
- final List searchResults = restService.getIssuesFromJqlSearch("project = \"TESTPROJECT\"", JiraSite.DEFAULT_MAX_ISSUES);
+ final List searchResults =
+ restService.getIssuesFromJqlSearch("project = \"TESTPROJECT\"", JiraSite.DEFAULT_MAX_ISSUES);
for (Issue searchResult : searchResults) {
System.out.println("JQL search result: " + searchResult);
}
@@ -104,8 +104,8 @@ public static void main(String[] args) throws Exception {
private static void callUniq(final JiraRestService restService) throws Exception {
long start = System.currentTimeMillis();
- List issues =
- restService.getIssuesFromJqlSearch("key in ('JENKINS-53320','JENKINS-51057')", JiraSite.DEFAULT_MAX_ISSUES);
+ List issues = restService.getIssuesFromJqlSearch(
+ "key in ('JENKINS-53320','JENKINS-51057')", JiraSite.DEFAULT_MAX_ISSUES);
long end = System.currentTimeMillis();
System.out.println("time uniq " + (end - start));
}
diff --git a/src/test/java/hudson/plugins/jira/JiraReplaceFixVersionByRegExTest.java b/src/test/java/hudson/plugins/jira/JiraReplaceFixVersionByRegExTest.java
index 3f7fdeecd..4af37fbae 100644
--- a/src/test/java/hudson/plugins/jira/JiraReplaceFixVersionByRegExTest.java
+++ b/src/test/java/hudson/plugins/jira/JiraReplaceFixVersionByRegExTest.java
@@ -54,7 +54,8 @@ void replaceWithFixVersionByRegex() throws URISyntaxException, TimeoutException
ArrayList issues = new ArrayList<>();
issues.add(getIssue("abcXXXXefg", 1L));
issues.add(getIssue("dgcXXXXefg", 2L));
- when(service.getIssuesFromJqlSearch(QUERY, site.getMaxIssuesFromJqlSearch())).thenReturn(issues);
+ when(service.getIssuesFromJqlSearch(QUERY, site.getMaxIssuesFromJqlSearch()))
+ .thenReturn(issues);
jiraSession.replaceFixVersion(PROJECT_KEY, "/abc.*efg/", TO_VERSION, QUERY);
From df344f175f9e4c913c351003753e9154a944f0ae Mon Sep 17 00:00:00 2001
From: Hardik Rathod
Date: Fri, 30 May 2025 12:56:28 +0200
Subject: [PATCH 05/22] - Update for adding maximum allowed value check -
Removing constructor param from JiraSession - Add and fix test cases
---
.../java/hudson/plugins/jira/JiraSession.java | 4 +-
.../plugins/jira/JiraSessionFactory.java | 2 +-
.../java/hudson/plugins/jira/JiraSite.java | 101 +++++++++++-------
.../hudson/plugins/jira/JiraSite/config.jelly | 4 +-
.../hudson/plugins/jira/Messages.properties | 1 +
src/test/java/JiraTester.java | 6 +-
src/test/java/JiraTesterBearerAuth.java | 6 +-
.../plugins/jira/ChangingWorkflowTest.java | 2 +-
.../plugins/jira/DescriptorImplTest.java | 37 ++++++-
.../JiraReplaceFixVersionByRegExTest.java | 2 +-
.../hudson/plugins/jira/JiraSiteTest.java | 4 +-
.../jira/MailResolverWithExtensionTest.java | 2 +-
12 files changed, 109 insertions(+), 62 deletions(-)
diff --git a/src/main/java/hudson/plugins/jira/JiraSession.java b/src/main/java/hudson/plugins/jira/JiraSession.java
index 302ae39e5..a0b94f473 100644
--- a/src/main/java/hudson/plugins/jira/JiraSession.java
+++ b/src/main/java/hudson/plugins/jira/JiraSession.java
@@ -50,10 +50,10 @@ public class JiraSession {
private final int maxIssuesFromJqlSearch;
- /* package */ JiraSession(JiraSite site, JiraRestService jiraRestService, int maxIssuesFromJqlSearch) {
+ /* package */ JiraSession(JiraSite site, JiraRestService jiraRestService) {
this.service = jiraRestService;
this.jiraSiteName = site.getName();
- this.maxIssuesFromJqlSearch = maxIssuesFromJqlSearch;
+ this.maxIssuesFromJqlSearch = site.getMaxIssuesFromJqlSearch();
}
/**
diff --git a/src/main/java/hudson/plugins/jira/JiraSessionFactory.java b/src/main/java/hudson/plugins/jira/JiraSessionFactory.java
index e3286ea03..e08fb7755 100644
--- a/src/main/java/hudson/plugins/jira/JiraSessionFactory.java
+++ b/src/main/java/hudson/plugins/jira/JiraSessionFactory.java
@@ -55,6 +55,6 @@ public static JiraSession create(JiraSite jiraSite, URI uri, StandardUsernamePas
jiraSite.getReadTimeout());
}
- return new JiraSession(jiraSite, jiraRestService, jiraSite.getMaxIssuesFromJqlSearch());
+ return new JiraSession(jiraSite, jiraRestService);
}
}
diff --git a/src/main/java/hudson/plugins/jira/JiraSite.java b/src/main/java/hudson/plugins/jira/JiraSite.java
index 613911136..a8a258050 100644
--- a/src/main/java/hudson/plugins/jira/JiraSite.java
+++ b/src/main/java/hudson/plugins/jira/JiraSite.java
@@ -47,6 +47,7 @@
import hudson.util.ListBoxModel;
import hudson.util.Secret;
import jakarta.servlet.ServletException;
+
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
@@ -77,6 +78,7 @@
import java.util.logging.Logger;
import java.util.regex.Pattern;
import javax.annotation.PreDestroy;
+
import jenkins.model.Jenkins;
import org.kohsuke.stapler.AncestorInPath;
import org.kohsuke.stapler.DataBoundConstructor;
@@ -92,6 +94,7 @@
* needed to access this Jira.
*
* When adding new fields do not miss to look at readResolve method!!
+ *
* @author Kohsuke Kawaguchi
*/
public class JiraSite extends AbstractDescribableImpl {
@@ -117,7 +120,7 @@ public class JiraSite extends AbstractDescribableImpl {
public static final int DEFAULT_THREAD_EXECUTOR_NUMBER = 10;
- public static final int DEFAULT_MAX_ISSUES = 100;
+ public static final int MAX_ALLOWED_ISSUES_FROM_JQL = 5000;
/**
* URL of Jira for Jenkins access, like {@code http://jira.codehaus.org/}.
@@ -152,6 +155,7 @@ public class JiraSite extends AbstractDescribableImpl {
/**
* User name needed to login. Optional.
+ *
* @deprecated use credentialsId
*/
@Deprecated
@@ -159,6 +163,7 @@ public class JiraSite extends AbstractDescribableImpl {
/**
* Password needed to login. Optional.
+ *
* @deprecated use credentialsId
*/
@Deprecated
@@ -223,12 +228,14 @@ public class JiraSite extends AbstractDescribableImpl {
/**
* response timeout for jira rest call
+ *
* @since 3.0.3
*/
private int readTimeout = DEFAULT_READ_TIMEOUT;
/**
* thread pool number
+ *
* @since 3.0.3
*/
private int threadExecutorNumber = DEFAULT_THREAD_EXECUTOR_NUMBER;
@@ -240,14 +247,13 @@ public class JiraSite extends AbstractDescribableImpl {
/**
* To add scm entry change date and time in jira comments.
- *
*/
private boolean appendChangeTimestamp;
/**
* To allow configurable value of max issues from jql search via jira site global configuration.
*/
- private int maxIssuesFromJqlSearch = DEFAULT_MAX_ISSUES;
+ private int maxIssuesFromJqlSearch;
private int ioThreadCount = Integer.getInteger(JiraSite.class.getName() + ".httpclient.options.ioThreadCount", 2);
@@ -282,8 +288,7 @@ public JiraSite(
boolean updateJiraIssueForAllStatus,
@CheckForNull String groupVisibility,
@CheckForNull String roleVisibility,
- boolean useHTTPAuth,
- int maxIssuesFromJqlSearch) {
+ boolean useHTTPAuth) {
this(
url,
alternativeUrl,
@@ -297,8 +302,7 @@ public JiraSite(
useHTTPAuth,
DEFAULT_TIMEOUT,
DEFAULT_READ_TIMEOUT,
- DEFAULT_THREAD_EXECUTOR_NUMBER,
- DEFAULT_MAX_ISSUES);
+ DEFAULT_THREAD_EXECUTOR_NUMBER);
}
// Deprecate the previous constructor but leave it in place for Java-level compatibility.
@@ -356,8 +360,7 @@ public JiraSite(
useHTTPAuth,
DEFAULT_TIMEOUT,
DEFAULT_READ_TIMEOUT,
- DEFAULT_THREAD_EXECUTOR_NUMBER,
- DEFAULT_MAX_ISSUES);
+ DEFAULT_THREAD_EXECUTOR_NUMBER);
if (credentials != null) {
// we verify the credential really exists otherwise we migrate it
StandardUsernamePasswordCredentials standardUsernamePasswordCredentials =
@@ -385,8 +388,7 @@ public JiraSite(
boolean useHTTPAuth,
int timeout,
int readTimeout,
- int threadExecutorNumber,
- int maxIssuesFromJqlSearch) {
+ int threadExecutorNumber) {
if (url != null) {
url = toURL(url.toExternalForm());
}
@@ -409,7 +411,6 @@ public JiraSite(
setRoleVisibility(roleVisibility);
this.useHTTPAuth = useHTTPAuth;
this.jiraSession = null;
- this.maxIssuesFromJqlSearch = maxIssuesFromJqlSearch;
}
@DataBoundConstructor
@@ -436,8 +437,7 @@ public JiraSite(
boolean useHTTPAuth,
int timeout,
int readTimeout,
- int threadExecutorNumber,
- int maxIssuesFromJqlSearch) {
+ int threadExecutorNumber) {
this(
url,
alternativeUrl,
@@ -451,8 +451,7 @@ public JiraSite(
useHTTPAuth,
timeout,
readTimeout,
- threadExecutorNumber,
- maxIssuesFromJqlSearch);
+ threadExecutorNumber);
}
// Deprecate the previous constructor but leave it in place for Java-level compatibility.
@@ -471,8 +470,7 @@ public JiraSite(
int timeout,
int readTimeout,
int threadExecutorNumber,
- boolean useBearerAuth,
- int maxIssuesFromJqlSearch) {
+ boolean useBearerAuth) {
this(
url,
alternativeUrl,
@@ -486,8 +484,7 @@ public JiraSite(
useHTTPAuth,
timeout,
readTimeout,
- threadExecutorNumber,
- maxIssuesFromJqlSearch);
+ threadExecutorNumber);
this.useBearerAuth = useBearerAuth;
}
@@ -518,6 +515,7 @@ public boolean getDisableChangelogAnnotations() {
/**
* Sets connect timeout (in seconds).
* If not specified, a default timeout will be used.
+ *
* @param timeoutSec Timeout in seconds
*/
@DataBoundSetter
@@ -532,6 +530,7 @@ public int getTimeout() {
/**
* Sets read timeout (in seconds).
* If not specified, a default timeout will be used.
+ *
* @param readTimeout Timeout in seconds
*/
@DataBoundSetter
@@ -702,14 +701,13 @@ protected Object readResolve() throws FormException {
useHTTPAuth,
timeout,
readTimeout,
- threadExecutorNumber,
- maxIssuesFromJqlSearch);
+ threadExecutorNumber);
}
jiraSite.setAppendChangeTimestamp(appendChangeTimestamp);
jiraSite.setDisableChangelogAnnotations(disableChangelogAnnotations);
jiraSite.setDateTimePattern(dateTimePattern);
jiraSite.setUseBearerAuth(useBearerAuth);
-
+ jiraSite.setMaxIssuesFromJqlSearch(maxIssuesFromJqlSearch);
return jiraSite;
}
@@ -786,7 +784,8 @@ Lock getProjectUpdateLock() {
/**
* This method only supports credential matching by credentialsId.
* Older methods are not and will not be supported as the credentials should have been migrated already.
- * @param item can be null if top level
+ *
+ * @param item can be null if top level
* @param uiValidation if true and credentials not found at item level will not go up
*/
private StandardUsernamePasswordCredentials resolveCredentials(Item item, boolean uiValidation) {
@@ -917,10 +916,12 @@ public Object getThreadLocalContext() {
}
@Override
- public void setThreadLocalContext(Object context) {}
+ public void setThreadLocalContext(Object context) {
+ }
@Override
- public void clearThreadLocalContext() {}
+ public void clearThreadLocalContext() {
+ }
});
final HttpClient httpClient = defaultHttpClientFactory.create(options);
@@ -948,16 +949,20 @@ public void destroy() throws Exception {
private static class NoOpEventPublisher implements EventPublisher {
@Override
- public void publish(Object o) {}
+ public void publish(Object o) {
+ }
@Override
- public void register(Object o) {}
+ public void register(Object o) {
+ }
@Override
- public void unregister(Object o) {}
+ public void unregister(Object o) {
+ }
@Override
- public void unregisterAll() {}
+ public void unregisterAll() {
+ }
}
@SuppressWarnings("deprecation")
@@ -1158,9 +1163,10 @@ public boolean existsIssue(String id) {
/**
* Returns all versions for the given project key.
- * @deprecated use {@link JiraSession#getVersions(String)}
+ *
* @param projectKey Project Key
* @return A set of JiraVersions
+ * @deprecated use {@link JiraSession#getVersions(String)}
*/
@Deprecated
public Set getVersions(String projectKey) {
@@ -1174,7 +1180,7 @@ public Set getVersions(String projectKey) {
/**
* Generates release notes for a given version.
*
- * @param projectKey the project key
+ * @param projectKey the project key
* @param versionName the version
* @param filter Additional JQL Filter. Example: status in (Resolved,Closed)
* @return release notes
@@ -1260,9 +1266,9 @@ public void migrateIssuesToFixVersion(String projectKey, String versionName, Str
/**
* Adds new fix version to issues matching the jql.
*
- * @param projectKey the project key
+ * @param projectKey the project key
* @param versionName the version
- * @param query the query
+ * @param query the query
* @throws TimeoutException if too long
*/
public void addFixVersionToIssue(String projectKey, String versionName, String query) throws TimeoutException {
@@ -1277,10 +1283,10 @@ public void addFixVersionToIssue(String projectKey, String versionName, String q
* Progresses all issues matching the JQL search, using the given workflow action. Optionally
* adds a comment to the issue(s) at the same time.
*
- * @param jqlSearch the query
+ * @param jqlSearch the query
* @param workflowActionName the workflowActionName
- * @param comment the comment
- * @param console the console
+ * @param comment the comment
+ * @param console the console
* @throws TimeoutException TimeoutException if too long
*/
public boolean progressMatchingIssues(
@@ -1406,6 +1412,11 @@ public FormValidation doValidate(
return FormValidation.error(String.format("Malformed alternative URL (%s)", alternativeUrl), e);
}
+ if (maxIssuesFromJqlSearch > 5000) {
+ return FormValidation.error(String.format("Maximum number of allowed issues from jql search are %s",
+ MAX_ALLOWED_ISSUES_FROM_JQL));
+ }
+
credentialsId = Util.fixEmpty(credentialsId);
JiraSite site = getBuilder()
.withMainURL(mainURL)
@@ -1463,6 +1474,16 @@ public FormValidation doCheckCredentialsId(
return CredentialsHelper.doCheckFillCredentialsId(item, value, url);
}
+ @SuppressWarnings("unused") // used by stapler
+ public FormValidation doCheckMaxIssuesFromJqlSearch(@QueryParameter int maxIssuesFromJqlSearch) {
+ if (maxIssuesFromJqlSearch > MAX_ALLOWED_ISSUES_FROM_JQL) {
+ return FormValidation.error(String.format("Maximum number of allowed issues from jql search are %s",
+ MAX_ALLOWED_ISSUES_FROM_JQL));
+ } else {
+ return FormValidation.ok();
+ }
+ }
+
Builder getBuilder() {
return new Builder();
}
@@ -1479,7 +1500,6 @@ static class Builder {
private String groupVisibility;
private String roleVisibility;
private boolean useHTTPAuth;
- private int maxIssuesFromJqlSearch;
public Builder withMainURL(URL mainURL) {
this.mainURL = mainURL;
@@ -1542,8 +1562,7 @@ public JiraSite build() {
updateJiraIssueForAllStatus,
groupVisibility,
roleVisibility,
- useHTTPAuth,
- maxIssuesFromJqlSearch);
+ useHTTPAuth);
}
}
@@ -1551,7 +1570,6 @@ public JiraSite build() {
// yes this class hierarchy can be a real big mess...
/**
- *
* @param item the Jenkins {@link Item} can be a {@link Job} or {@link Folder}
* @return the parent as {@link ItemGroup} which can be {@link Jenkins} or {@link Folder}
*/
@@ -1597,6 +1615,7 @@ public static List getSitesFromFolders(ItemGroup itemGroup) {
/**
* Gets the effective {@link JiraSite} associated with the given project
* and creates automatically jiraSession for each jiraSite found
+ *
* @return null if no such was found.
*/
@Nullable
diff --git a/src/main/resources/hudson/plugins/jira/JiraSite/config.jelly b/src/main/resources/hudson/plugins/jira/JiraSite/config.jelly
index c7a20defd..0b94effd4 100644
--- a/src/main/resources/hudson/plugins/jira/JiraSite/config.jelly
+++ b/src/main/resources/hudson/plugins/jira/JiraSite/config.jelly
@@ -52,11 +52,11 @@
-
+
+ method="validate" with="url,credentialsId,groupVisibility,roleVisibility,useHTTPAuth,alternativeUrl,timeout,readTimeout,threadExecutorNumber,useBearerAuth,maxIssuesFromJqlSearch" />
diff --git a/src/main/resources/hudson/plugins/jira/Messages.properties b/src/main/resources/hudson/plugins/jira/Messages.properties
index 4b71b021c..6be48b489 100644
--- a/src/main/resources/hudson/plugins/jira/Messages.properties
+++ b/src/main/resources/hudson/plugins/jira/Messages.properties
@@ -47,3 +47,4 @@ ErrorCommentingIssues=[Jira] Could not comment on some issues: {0}
JiraSite.threadExecutorMinimunSize = Thread Executor Size must be at least {0} (higher values are recommended)
JiraSite.timeoutMinimunValue = Connection timeout must be at least {0}
JiraSite.readTimeoutMinimunValue = Read timeout must be at least {0}
+JiraSite.maxIssuesFromJqlMaximumNumber = Maximum number of allowed issues from jql search are {0}
diff --git a/src/test/java/JiraTester.java b/src/test/java/JiraTester.java
index 0bfba8d5d..731f6693a 100644
--- a/src/test/java/JiraTester.java
+++ b/src/test/java/JiraTester.java
@@ -57,7 +57,7 @@ public static void main(String[] args) throws Exception {
// ignore it.", "TESTUSER", components1, "test issue from Jira jenkins plugin");
final List
searchResults =
- restService.getIssuesFromJqlSearch("project = \"TESTPROJECT\"", JiraSite.DEFAULT_MAX_ISSUES);
+ restService.getIssuesFromJqlSearch("project = \"TESTPROJECT\"", 100);
for (Issue searchResult : searchResults) {
System.out.println("JQL search result: " + searchResult);
}
@@ -103,7 +103,7 @@ public static void main(String[] args) throws Exception {
private static void callUniq(final JiraRestService restService) throws Exception {
long start = System.currentTimeMillis();
List issues = restService.getIssuesFromJqlSearch(
- "key in ('JENKINS-53320','JENKINS-51057')", JiraSite.DEFAULT_MAX_ISSUES);
+ "key in ('JENKINS-53320','JENKINS-51057')", 100);
long end = System.currentTimeMillis();
System.out.println("time uniq " + (end - start));
}
@@ -112,7 +112,7 @@ private static void callDuplicate(final JiraRestService restService) throws Exce
long start = System.currentTimeMillis();
List issues = restService.getIssuesFromJqlSearch(
"key in ('JENKINS-53320','JENKINS-53320','JENKINS-53320','JENKINS-53320','JENKINS-53320','JENKINS-51057','JENKINS-51057','JENKINS-51057','JENKINS-51057','JENKINS-51057')",
- JiraSite.DEFAULT_MAX_ISSUES);
+ 100);
long end = System.currentTimeMillis();
System.out.println("time duplicate " + (end - start));
}
diff --git a/src/test/java/JiraTesterBearerAuth.java b/src/test/java/JiraTesterBearerAuth.java
index ad09f9bd6..0c9f3017f 100644
--- a/src/test/java/JiraTesterBearerAuth.java
+++ b/src/test/java/JiraTesterBearerAuth.java
@@ -59,7 +59,7 @@ public static void main(String[] args) throws Exception {
// ignore it.", "TESTUSER", components1, "test issue from Jira jenkins plugin");
final List searchResults =
- restService.getIssuesFromJqlSearch("project = \"TESTPROJECT\"", JiraSite.DEFAULT_MAX_ISSUES);
+ restService.getIssuesFromJqlSearch("project = \"TESTPROJECT\"", 100);
for (Issue searchResult : searchResults) {
System.out.println("JQL search result: " + searchResult);
}
@@ -105,7 +105,7 @@ public static void main(String[] args) throws Exception {
private static void callUniq(final JiraRestService restService) throws Exception {
long start = System.currentTimeMillis();
List issues = restService.getIssuesFromJqlSearch(
- "key in ('JENKINS-53320','JENKINS-51057')", JiraSite.DEFAULT_MAX_ISSUES);
+ "key in ('JENKINS-53320','JENKINS-51057')", 100);
long end = System.currentTimeMillis();
System.out.println("time uniq " + (end - start));
}
@@ -114,7 +114,7 @@ private static void callDuplicate(final JiraRestService restService) throws Exce
long start = System.currentTimeMillis();
List issues = restService.getIssuesFromJqlSearch(
"key in ('JENKINS-53320','JENKINS-53320','JENKINS-53320','JENKINS-53320','JENKINS-53320','JENKINS-51057','JENKINS-51057','JENKINS-51057','JENKINS-51057','JENKINS-51057')",
- JiraSite.DEFAULT_MAX_ISSUES);
+ 100);
long end = System.currentTimeMillis();
System.out.println("time duplicate " + (end - start));
}
diff --git a/src/test/java/hudson/plugins/jira/ChangingWorkflowTest.java b/src/test/java/hudson/plugins/jira/ChangingWorkflowTest.java
index a0ce2bab3..f2c7354e0 100644
--- a/src/test/java/hudson/plugins/jira/ChangingWorkflowTest.java
+++ b/src/test/java/hudson/plugins/jira/ChangingWorkflowTest.java
@@ -59,7 +59,7 @@ public class ChangingWorkflowTest {
@BeforeEach
void setupSpy() {
- spySession = spy(new JiraSession(site, restService, site.getMaxIssuesFromJqlSearch()));
+ spySession = spy(new JiraSession(site, restService));
}
@Test
diff --git a/src/test/java/hudson/plugins/jira/DescriptorImplTest.java b/src/test/java/hudson/plugins/jira/DescriptorImplTest.java
index 225bd9320..5221e9376 100644
--- a/src/test/java/hudson/plugins/jira/DescriptorImplTest.java
+++ b/src/test/java/hudson/plugins/jira/DescriptorImplTest.java
@@ -138,7 +138,7 @@ void validateFormConnectionErrors(JenkinsRule r) throws Exception {
JiraSite.DEFAULT_READ_TIMEOUT,
JiraSite.DEFAULT_THREAD_EXECUTOR_NUMBER,
false,
- JiraSite.DEFAULT_MAX_ISSUES,
+ 100,
project);
assertEquals(FormValidation.Kind.ERROR, validation.kind);
@@ -155,7 +155,7 @@ void validateFormConnectionErrors(JenkinsRule r) throws Exception {
JiraSite.DEFAULT_READ_TIMEOUT,
JiraSite.DEFAULT_THREAD_EXECUTOR_NUMBER,
false,
- JiraSite.DEFAULT_MAX_ISSUES,
+ 100,
project);
assertEquals(Messages.JiraSite_timeoutMinimunValue("1"), validation.getLocalizedMessage());
assertEquals(FormValidation.Kind.ERROR, validation.kind);
@@ -172,7 +172,7 @@ void validateFormConnectionErrors(JenkinsRule r) throws Exception {
-1,
JiraSite.DEFAULT_THREAD_EXECUTOR_NUMBER,
false,
- JiraSite.DEFAULT_MAX_ISSUES,
+ 100,
project);
assertEquals(Messages.JiraSite_readTimeoutMinimunValue("1"), validation.getMessage());
@@ -190,7 +190,7 @@ void validateFormConnectionErrors(JenkinsRule r) throws Exception {
JiraSite.DEFAULT_READ_TIMEOUT,
-1,
false,
- JiraSite.DEFAULT_MAX_ISSUES,
+ 100,
project);
assertEquals(Messages.JiraSite_threadExecutorMinimunSize("1"), validation.getMessage());
assertEquals(FormValidation.Kind.ERROR, validation.kind);
@@ -217,11 +217,38 @@ void validateFormConnectionOK(JenkinsRule r) throws Exception {
JiraSite.DEFAULT_READ_TIMEOUT,
JiraSite.DEFAULT_THREAD_EXECUTOR_NUMBER,
false,
- JiraSite.DEFAULT_MAX_ISSUES,
+ 100,
project);
verify(builder).build();
verify(site).getSession(project, true);
assertEquals(FormValidation.Kind.OK, validation.kind);
}
+
+ @Test
+ void validateMaxIssueFromJqlSearchError(JenkinsRule r) throws Exception {
+ builder.withMainURL(new URL("http://test.com"));
+
+ when(descriptor.getBuilder()).thenReturn(builder);
+ when(builder.build()).thenReturn(site);
+ when(site.getSession(project, true)).thenReturn(session);
+ when(session.getMyPermissions()).thenReturn(mock(Permissions.class));
+
+ FormValidation validation = descriptor.doValidate(
+ "http://localhost:8080",
+ null,
+ null,
+ null,
+ false,
+ null,
+ JiraSite.DEFAULT_TIMEOUT,
+ JiraSite.DEFAULT_READ_TIMEOUT,
+ JiraSite.DEFAULT_THREAD_EXECUTOR_NUMBER,
+ false,
+ 5001,
+ project);
+
+ assertEquals(Messages.JiraSite_maxIssuesFromJqlMaximumNumber("5000"), validation.getMessage());
+ assertEquals(FormValidation.Kind.ERROR, validation.kind);
+ }
}
diff --git a/src/test/java/hudson/plugins/jira/JiraReplaceFixVersionByRegExTest.java b/src/test/java/hudson/plugins/jira/JiraReplaceFixVersionByRegExTest.java
index 4af37fbae..6572ad870 100644
--- a/src/test/java/hudson/plugins/jira/JiraReplaceFixVersionByRegExTest.java
+++ b/src/test/java/hudson/plugins/jira/JiraReplaceFixVersionByRegExTest.java
@@ -41,7 +41,7 @@ class JiraReplaceFixVersionByRegExTest {
@BeforeEach
void prepareMocks() throws IOException, InterruptedException {
- jiraSession = spy(new JiraSession(site, service, site.getMaxIssuesFromJqlSearch()));
+ jiraSession = spy(new JiraSession(site, service));
}
@Test
diff --git a/src/test/java/hudson/plugins/jira/JiraSiteTest.java b/src/test/java/hudson/plugins/jira/JiraSiteTest.java
index 2ccf28c52..65c3272d8 100644
--- a/src/test/java/hudson/plugins/jira/JiraSiteTest.java
+++ b/src/test/java/hudson/plugins/jira/JiraSiteTest.java
@@ -158,7 +158,7 @@ void deserializeNormal(JenkinsRule j) throws IOException, FormException {
new UsernamePasswordCredentialsImpl(CredentialsScope.SYSTEM, null, null, ANY_USER, ANY_PASSWORD);
CredentialsProvider.lookupStores(j.jenkins).iterator().next().addDomain(domain, c);
- JiraSite site = new JiraSite(exampleOrg, null, c.getId(), false, false, null, false, null, null, true, 100);
+ JiraSite site = new JiraSite(exampleOrg, null, c.getId(), false, false, null, false, null, null, true);
site.setUseBearerAuth(true);
XStream2 xStream2 = new XStream2();
@@ -176,7 +176,7 @@ void deserializeNormal(JenkinsRule j) throws IOException, FormException {
@WithoutJenkins
@Test
void deserializeWithoutCredentials() {
- JiraSite site = new JiraSite(exampleOrg, null, (String) null, false, false, null, false, null, null, true, 100);
+ JiraSite site = new JiraSite(exampleOrg, null, (String) null, false, false, null, false, null, null, true);
XStream2 xStream2 = new XStream2();
String xml = xStream2.toXML(site);
diff --git a/src/test/java/hudson/plugins/jira/MailResolverWithExtensionTest.java b/src/test/java/hudson/plugins/jira/MailResolverWithExtensionTest.java
index 0716023a0..2c0fba17f 100644
--- a/src/test/java/hudson/plugins/jira/MailResolverWithExtensionTest.java
+++ b/src/test/java/hudson/plugins/jira/MailResolverWithExtensionTest.java
@@ -62,7 +62,7 @@ class MailResolverWithExtensionTest {
@BeforeEach
void createMocks() throws Exception {
- session = new JiraSession(site, service, site.getMaxIssuesFromJqlSearch());
+ session = new JiraSession(site, service);
Mockito.when(site.getSession(any())).thenReturn(session);
Map avatars = new HashMap<>();
From f33069300c24fd504af08f1f0ba2f4f18211d016 Mon Sep 17 00:00:00 2001
From: Hardik Rathod
Date: Fri, 30 May 2025 13:04:08 +0200
Subject: [PATCH 06/22] Use validation message from messages
---
src/main/java/hudson/plugins/jira/JiraSite.java | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
diff --git a/src/main/java/hudson/plugins/jira/JiraSite.java b/src/main/java/hudson/plugins/jira/JiraSite.java
index a8a258050..eeeb6d40b 100644
--- a/src/main/java/hudson/plugins/jira/JiraSite.java
+++ b/src/main/java/hudson/plugins/jira/JiraSite.java
@@ -1412,11 +1412,6 @@ public FormValidation doValidate(
return FormValidation.error(String.format("Malformed alternative URL (%s)", alternativeUrl), e);
}
- if (maxIssuesFromJqlSearch > 5000) {
- return FormValidation.error(String.format("Maximum number of allowed issues from jql search are %s",
- MAX_ALLOWED_ISSUES_FROM_JQL));
- }
-
credentialsId = Util.fixEmpty(credentialsId);
JiraSite site = getBuilder()
.withMainURL(mainURL)
@@ -1436,6 +1431,9 @@ public FormValidation doValidate(
if (readTimeout < 0) {
return FormValidation.error(Messages.JiraSite_readTimeoutMinimunValue("1"));
}
+ if (maxIssuesFromJqlSearch > 5000) {
+ return FormValidation.error(Messages.JiraSite_maxIssuesFromJqlMaximumNumber(MAX_ALLOWED_ISSUES_FROM_JQL));
+ }
site.setTimeout(timeout);
site.setReadTimeout(readTimeout);
From 56e650e0b8b0acc70c5b715f4f083e71ee54c132 Mon Sep 17 00:00:00 2001
From: Hardik Rathod
Date: Fri, 30 May 2025 13:08:10 +0200
Subject: [PATCH 07/22] Remove check method for form field validation
---
src/main/java/hudson/plugins/jira/JiraSite.java | 10 ----------
1 file changed, 10 deletions(-)
diff --git a/src/main/java/hudson/plugins/jira/JiraSite.java b/src/main/java/hudson/plugins/jira/JiraSite.java
index eeeb6d40b..9414d12f3 100644
--- a/src/main/java/hudson/plugins/jira/JiraSite.java
+++ b/src/main/java/hudson/plugins/jira/JiraSite.java
@@ -1472,16 +1472,6 @@ public FormValidation doCheckCredentialsId(
return CredentialsHelper.doCheckFillCredentialsId(item, value, url);
}
- @SuppressWarnings("unused") // used by stapler
- public FormValidation doCheckMaxIssuesFromJqlSearch(@QueryParameter int maxIssuesFromJqlSearch) {
- if (maxIssuesFromJqlSearch > MAX_ALLOWED_ISSUES_FROM_JQL) {
- return FormValidation.error(String.format("Maximum number of allowed issues from jql search are %s",
- MAX_ALLOWED_ISSUES_FROM_JQL));
- } else {
- return FormValidation.ok();
- }
- }
-
Builder getBuilder() {
return new Builder();
}
From 9c15e78fc4b9d49e547296193ea64c5f10f6576d Mon Sep 17 00:00:00 2001
From: Hardik Rathod
Date: Fri, 30 May 2025 13:20:40 +0200
Subject: [PATCH 08/22] Apply spotless fix
---
.../java/hudson/plugins/jira/JiraSite.java | 23 +++++++------------
src/test/java/JiraTester.java | 6 ++---
src/test/java/JiraTesterBearerAuth.java | 6 ++---
3 files changed, 12 insertions(+), 23 deletions(-)
diff --git a/src/main/java/hudson/plugins/jira/JiraSite.java b/src/main/java/hudson/plugins/jira/JiraSite.java
index 9414d12f3..0164051e4 100644
--- a/src/main/java/hudson/plugins/jira/JiraSite.java
+++ b/src/main/java/hudson/plugins/jira/JiraSite.java
@@ -47,7 +47,6 @@
import hudson.util.ListBoxModel;
import hudson.util.Secret;
import jakarta.servlet.ServletException;
-
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
@@ -78,7 +77,6 @@
import java.util.logging.Logger;
import java.util.regex.Pattern;
import javax.annotation.PreDestroy;
-
import jenkins.model.Jenkins;
import org.kohsuke.stapler.AncestorInPath;
import org.kohsuke.stapler.DataBoundConstructor;
@@ -916,12 +914,10 @@ public Object getThreadLocalContext() {
}
@Override
- public void setThreadLocalContext(Object context) {
- }
+ public void setThreadLocalContext(Object context) {}
@Override
- public void clearThreadLocalContext() {
- }
+ public void clearThreadLocalContext() {}
});
final HttpClient httpClient = defaultHttpClientFactory.create(options);
@@ -949,20 +945,16 @@ public void destroy() throws Exception {
private static class NoOpEventPublisher implements EventPublisher {
@Override
- public void publish(Object o) {
- }
+ public void publish(Object o) {}
@Override
- public void register(Object o) {
- }
+ public void register(Object o) {}
@Override
- public void unregister(Object o) {
- }
+ public void unregister(Object o) {}
@Override
- public void unregisterAll() {
- }
+ public void unregisterAll() {}
}
@SuppressWarnings("deprecation")
@@ -1432,7 +1424,8 @@ public FormValidation doValidate(
return FormValidation.error(Messages.JiraSite_readTimeoutMinimunValue("1"));
}
if (maxIssuesFromJqlSearch > 5000) {
- return FormValidation.error(Messages.JiraSite_maxIssuesFromJqlMaximumNumber(MAX_ALLOWED_ISSUES_FROM_JQL));
+ return FormValidation.error(
+ Messages.JiraSite_maxIssuesFromJqlMaximumNumber(MAX_ALLOWED_ISSUES_FROM_JQL));
}
site.setTimeout(timeout);
diff --git a/src/test/java/JiraTester.java b/src/test/java/JiraTester.java
index 731f6693a..c93904281 100644
--- a/src/test/java/JiraTester.java
+++ b/src/test/java/JiraTester.java
@@ -56,8 +56,7 @@ public static void main(String[] args) throws Exception {
// restService.createIssue("TESTPROJECT", "This is a test issue created using Jira jenkins plugin. Please
// ignore it.", "TESTUSER", components1, "test issue from Jira jenkins plugin");
- final List searchResults =
- restService.getIssuesFromJqlSearch("project = \"TESTPROJECT\"", 100);
+ final List searchResults = restService.getIssuesFromJqlSearch("project = \"TESTPROJECT\"", 100);
for (Issue searchResult : searchResults) {
System.out.println("JQL search result: " + searchResult);
}
@@ -102,8 +101,7 @@ public static void main(String[] args) throws Exception {
private static void callUniq(final JiraRestService restService) throws Exception {
long start = System.currentTimeMillis();
- List issues = restService.getIssuesFromJqlSearch(
- "key in ('JENKINS-53320','JENKINS-51057')", 100);
+ List issues = restService.getIssuesFromJqlSearch("key in ('JENKINS-53320','JENKINS-51057')", 100);
long end = System.currentTimeMillis();
System.out.println("time uniq " + (end - start));
}
diff --git a/src/test/java/JiraTesterBearerAuth.java b/src/test/java/JiraTesterBearerAuth.java
index 0c9f3017f..646fc3176 100644
--- a/src/test/java/JiraTesterBearerAuth.java
+++ b/src/test/java/JiraTesterBearerAuth.java
@@ -58,8 +58,7 @@ public static void main(String[] args) throws Exception {
// restService.createIssue("TESTPROJECT", "This is a test issue created using Jira jenkins plugin. Please
// ignore it.", "TESTUSER", components1, "test issue from Jira jenkins plugin");
- final List searchResults =
- restService.getIssuesFromJqlSearch("project = \"TESTPROJECT\"", 100);
+ final List searchResults = restService.getIssuesFromJqlSearch("project = \"TESTPROJECT\"", 100);
for (Issue searchResult : searchResults) {
System.out.println("JQL search result: " + searchResult);
}
@@ -104,8 +103,7 @@ public static void main(String[] args) throws Exception {
private static void callUniq(final JiraRestService restService) throws Exception {
long start = System.currentTimeMillis();
- List issues = restService.getIssuesFromJqlSearch(
- "key in ('JENKINS-53320','JENKINS-51057')", 100);
+ List issues = restService.getIssuesFromJqlSearch("key in ('JENKINS-53320','JENKINS-51057')", 100);
long end = System.currentTimeMillis();
System.out.println("time uniq " + (end - start));
}
From 72685e34d8305d45f7132b04e2a44da0397a7704 Mon Sep 17 00:00:00 2001
From: Hardik Rathod
Date: Fri, 30 May 2025 13:23:40 +0200
Subject: [PATCH 09/22] Fix test case
---
src/test/java/hudson/plugins/jira/DescriptorImplTest.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/test/java/hudson/plugins/jira/DescriptorImplTest.java b/src/test/java/hudson/plugins/jira/DescriptorImplTest.java
index 5221e9376..3ed29b89a 100644
--- a/src/test/java/hudson/plugins/jira/DescriptorImplTest.java
+++ b/src/test/java/hudson/plugins/jira/DescriptorImplTest.java
@@ -248,7 +248,7 @@ void validateMaxIssueFromJqlSearchError(JenkinsRule r) throws Exception {
5001,
project);
- assertEquals(Messages.JiraSite_maxIssuesFromJqlMaximumNumber("5000"), validation.getMessage());
+ assertEquals(Messages.JiraSite_maxIssuesFromJqlMaximumNumber("5,000"), validation.getMessage());
assertEquals(FormValidation.Kind.ERROR, validation.kind);
}
}
From ea54995ca99471d236edfcd4099dd28f9f1684f1 Mon Sep 17 00:00:00 2001
From: Hardik Rathod
Date: Fri, 30 May 2025 13:41:20 +0200
Subject: [PATCH 10/22] Fix test case and a validation message grammar
---
src/main/resources/hudson/plugins/jira/Messages.properties | 2 +-
src/test/java/JiraTester.java | 5 +++--
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/src/main/resources/hudson/plugins/jira/Messages.properties b/src/main/resources/hudson/plugins/jira/Messages.properties
index 6be48b489..0680df9d0 100644
--- a/src/main/resources/hudson/plugins/jira/Messages.properties
+++ b/src/main/resources/hudson/plugins/jira/Messages.properties
@@ -47,4 +47,4 @@ ErrorCommentingIssues=[Jira] Could not comment on some issues: {0}
JiraSite.threadExecutorMinimunSize = Thread Executor Size must be at least {0} (higher values are recommended)
JiraSite.timeoutMinimunValue = Connection timeout must be at least {0}
JiraSite.readTimeoutMinimunValue = Read timeout must be at least {0}
-JiraSite.maxIssuesFromJqlMaximumNumber = Maximum number of allowed issues from jql search are {0}
+JiraSite.maxIssuesFromJqlMaximumNumber = Maximum number of allowed issues from jql search is {0}
diff --git a/src/test/java/JiraTester.java b/src/test/java/JiraTester.java
index c93904281..60f4875f1 100644
--- a/src/test/java/JiraTester.java
+++ b/src/test/java/JiraTester.java
@@ -101,7 +101,8 @@ public static void main(String[] args) throws Exception {
private static void callUniq(final JiraRestService restService) throws Exception {
long start = System.currentTimeMillis();
- List issues = restService.getIssuesFromJqlSearch("key in ('JENKINS-53320','JENKINS-51057')", 100);
+ List issues = restService.getIssuesFromJqlSearch(
+ "key in ('JENKINS-53320','JENKINS-51057')", JiraSite.MAX_ALLOWED_ISSUES_FROM_JQL);
long end = System.currentTimeMillis();
System.out.println("time uniq " + (end - start));
}
@@ -110,7 +111,7 @@ private static void callDuplicate(final JiraRestService restService) throws Exce
long start = System.currentTimeMillis();
List issues = restService.getIssuesFromJqlSearch(
"key in ('JENKINS-53320','JENKINS-53320','JENKINS-53320','JENKINS-53320','JENKINS-53320','JENKINS-51057','JENKINS-51057','JENKINS-51057','JENKINS-51057','JENKINS-51057')",
- 100);
+ JiraSite.MAX_ALLOWED_ISSUES_FROM_JQL);
long end = System.currentTimeMillis();
System.out.println("time duplicate " + (end - start));
}
From a83a8355a2fadba58bd17f6877cd3b632ea9d345 Mon Sep 17 00:00:00 2001
From: Hardik Rathod
Date: Fri, 30 May 2025 13:52:09 +0200
Subject: [PATCH 11/22] Fix test case because old config will not have
maxIssuesFromJqlSearch
---
.../resources/hudson/plugins/jira/oldJiraProjectProperty.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/test/resources/hudson/plugins/jira/oldJiraProjectProperty.xml b/src/test/resources/hudson/plugins/jira/oldJiraProjectProperty.xml
index b3c34f2ea..ca875e27e 100644
--- a/src/test/resources/hudson/plugins/jira/oldJiraProjectProperty.xml
+++ b/src/test/resources/hudson/plugins/jira/oldJiraProjectProperty.xml
@@ -12,7 +12,7 @@
10
false
- 100
+ 0
From 0ed4a861a6785cde7c40aa4e1a38e6b24290108c Mon Sep 17 00:00:00 2001
From: Hardik Rathod
Date: Fri, 30 May 2025 14:19:37 +0200
Subject: [PATCH 12/22] Remove parameter maxIssuesFromJqlSearch from doValidate
and related places
---
.../java/hudson/plugins/jira/JiraSite.java | 6 ----
.../hudson/plugins/jira/JiraSite/config.jelly | 4 +--
.../plugins/jira/DescriptorImplTest.java | 32 -------------------
3 files changed, 2 insertions(+), 40 deletions(-)
diff --git a/src/main/java/hudson/plugins/jira/JiraSite.java b/src/main/java/hudson/plugins/jira/JiraSite.java
index 0164051e4..1ece85897 100644
--- a/src/main/java/hudson/plugins/jira/JiraSite.java
+++ b/src/main/java/hudson/plugins/jira/JiraSite.java
@@ -1374,7 +1374,6 @@ public FormValidation doValidate(
@QueryParameter int readTimeout,
@QueryParameter int threadExecutorNumber,
@QueryParameter boolean useBearerAuth,
- @QueryParameter int maxIssuesFromJqlSearch,
@AncestorInPath Item item) {
if (item == null) {
@@ -1423,16 +1422,11 @@ public FormValidation doValidate(
if (readTimeout < 0) {
return FormValidation.error(Messages.JiraSite_readTimeoutMinimunValue("1"));
}
- if (maxIssuesFromJqlSearch > 5000) {
- return FormValidation.error(
- Messages.JiraSite_maxIssuesFromJqlMaximumNumber(MAX_ALLOWED_ISSUES_FROM_JQL));
- }
site.setTimeout(timeout);
site.setReadTimeout(readTimeout);
site.setThreadExecutorNumber(threadExecutorNumber);
site.setUseBearerAuth(useBearerAuth);
- site.setMaxIssuesFromJqlSearch(maxIssuesFromJqlSearch);
try {
JiraSession session = site.getSession(item, true);
if (session == null) {
diff --git a/src/main/resources/hudson/plugins/jira/JiraSite/config.jelly b/src/main/resources/hudson/plugins/jira/JiraSite/config.jelly
index 0b94effd4..0ddb10fa8 100644
--- a/src/main/resources/hudson/plugins/jira/JiraSite/config.jelly
+++ b/src/main/resources/hudson/plugins/jira/JiraSite/config.jelly
@@ -52,11 +52,11 @@
-
+
+ method="validate" with="url,credentialsId,groupVisibility,roleVisibility,useHTTPAuth,alternativeUrl,timeout,readTimeout,threadExecutorNumber,useBearerAuth" />
diff --git a/src/test/java/hudson/plugins/jira/DescriptorImplTest.java b/src/test/java/hudson/plugins/jira/DescriptorImplTest.java
index 3ed29b89a..ab800415e 100644
--- a/src/test/java/hudson/plugins/jira/DescriptorImplTest.java
+++ b/src/test/java/hudson/plugins/jira/DescriptorImplTest.java
@@ -138,7 +138,6 @@ void validateFormConnectionErrors(JenkinsRule r) throws Exception {
JiraSite.DEFAULT_READ_TIMEOUT,
JiraSite.DEFAULT_THREAD_EXECUTOR_NUMBER,
false,
- 100,
project);
assertEquals(FormValidation.Kind.ERROR, validation.kind);
@@ -155,7 +154,6 @@ void validateFormConnectionErrors(JenkinsRule r) throws Exception {
JiraSite.DEFAULT_READ_TIMEOUT,
JiraSite.DEFAULT_THREAD_EXECUTOR_NUMBER,
false,
- 100,
project);
assertEquals(Messages.JiraSite_timeoutMinimunValue("1"), validation.getLocalizedMessage());
assertEquals(FormValidation.Kind.ERROR, validation.kind);
@@ -172,7 +170,6 @@ void validateFormConnectionErrors(JenkinsRule r) throws Exception {
-1,
JiraSite.DEFAULT_THREAD_EXECUTOR_NUMBER,
false,
- 100,
project);
assertEquals(Messages.JiraSite_readTimeoutMinimunValue("1"), validation.getMessage());
@@ -190,7 +187,6 @@ void validateFormConnectionErrors(JenkinsRule r) throws Exception {
JiraSite.DEFAULT_READ_TIMEOUT,
-1,
false,
- 100,
project);
assertEquals(Messages.JiraSite_threadExecutorMinimunSize("1"), validation.getMessage());
assertEquals(FormValidation.Kind.ERROR, validation.kind);
@@ -217,38 +213,10 @@ void validateFormConnectionOK(JenkinsRule r) throws Exception {
JiraSite.DEFAULT_READ_TIMEOUT,
JiraSite.DEFAULT_THREAD_EXECUTOR_NUMBER,
false,
- 100,
project);
verify(builder).build();
verify(site).getSession(project, true);
assertEquals(FormValidation.Kind.OK, validation.kind);
}
-
- @Test
- void validateMaxIssueFromJqlSearchError(JenkinsRule r) throws Exception {
- builder.withMainURL(new URL("http://test.com"));
-
- when(descriptor.getBuilder()).thenReturn(builder);
- when(builder.build()).thenReturn(site);
- when(site.getSession(project, true)).thenReturn(session);
- when(session.getMyPermissions()).thenReturn(mock(Permissions.class));
-
- FormValidation validation = descriptor.doValidate(
- "http://localhost:8080",
- null,
- null,
- null,
- false,
- null,
- JiraSite.DEFAULT_TIMEOUT,
- JiraSite.DEFAULT_READ_TIMEOUT,
- JiraSite.DEFAULT_THREAD_EXECUTOR_NUMBER,
- false,
- 5001,
- project);
-
- assertEquals(Messages.JiraSite_maxIssuesFromJqlMaximumNumber("5,000"), validation.getMessage());
- assertEquals(FormValidation.Kind.ERROR, validation.kind);
- }
}
From b97bac5cf315ac380b87eafc842cee925987f589 Mon Sep 17 00:00:00 2001
From: Hardik Rathod
Date: Fri, 30 May 2025 14:24:11 +0200
Subject: [PATCH 13/22] Implement maximum param value check in setter method
---
src/main/java/hudson/plugins/jira/JiraSite.java | 6 +++++-
src/main/resources/hudson/plugins/jira/Messages.properties | 1 -
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/src/main/java/hudson/plugins/jira/JiraSite.java b/src/main/java/hudson/plugins/jira/JiraSite.java
index 1ece85897..c67c94176 100644
--- a/src/main/java/hudson/plugins/jira/JiraSite.java
+++ b/src/main/java/hudson/plugins/jira/JiraSite.java
@@ -661,7 +661,11 @@ public void setUpdateJiraIssueForAllStatus(boolean updateJiraIssueForAllStatus)
@DataBoundSetter
public void setMaxIssuesFromJqlSearch(int maxIssuesFromJqlSearch) {
- this.maxIssuesFromJqlSearch = maxIssuesFromJqlSearch;
+ if (maxIssuesFromJqlSearch > 5000) {
+ this.maxIssuesFromJqlSearch = MAX_ALLOWED_ISSUES_FROM_JQL;
+ } else {
+ this.maxIssuesFromJqlSearch = maxIssuesFromJqlSearch;
+ }
}
public int getMaxIssuesFromJqlSearch() {
diff --git a/src/main/resources/hudson/plugins/jira/Messages.properties b/src/main/resources/hudson/plugins/jira/Messages.properties
index 0680df9d0..4b71b021c 100644
--- a/src/main/resources/hudson/plugins/jira/Messages.properties
+++ b/src/main/resources/hudson/plugins/jira/Messages.properties
@@ -47,4 +47,3 @@ ErrorCommentingIssues=[Jira] Could not comment on some issues: {0}
JiraSite.threadExecutorMinimunSize = Thread Executor Size must be at least {0} (higher values are recommended)
JiraSite.timeoutMinimunValue = Connection timeout must be at least {0}
JiraSite.readTimeoutMinimunValue = Read timeout must be at least {0}
-JiraSite.maxIssuesFromJqlMaximumNumber = Maximum number of allowed issues from jql search is {0}
From 6ebfa72c15f22d5f2432b1e55784939c751388e0 Mon Sep 17 00:00:00 2001
From: Hardik Rathod
Date: Fri, 30 May 2025 14:47:21 +0200
Subject: [PATCH 14/22] Use variable for comparison of max allowed value
---
src/main/java/hudson/plugins/jira/JiraSite.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/main/java/hudson/plugins/jira/JiraSite.java b/src/main/java/hudson/plugins/jira/JiraSite.java
index c67c94176..f30b1c87b 100644
--- a/src/main/java/hudson/plugins/jira/JiraSite.java
+++ b/src/main/java/hudson/plugins/jira/JiraSite.java
@@ -661,7 +661,7 @@ public void setUpdateJiraIssueForAllStatus(boolean updateJiraIssueForAllStatus)
@DataBoundSetter
public void setMaxIssuesFromJqlSearch(int maxIssuesFromJqlSearch) {
- if (maxIssuesFromJqlSearch > 5000) {
+ if (maxIssuesFromJqlSearch > MAX_ALLOWED_ISSUES_FROM_JQL) {
this.maxIssuesFromJqlSearch = MAX_ALLOWED_ISSUES_FROM_JQL;
} else {
this.maxIssuesFromJqlSearch = maxIssuesFromJqlSearch;
From e9bd57be918e1efe92c15dd53d17b8f26a3cb62d Mon Sep 17 00:00:00 2001
From: Hardik Rathod
Date: Fri, 30 May 2025 14:48:58 +0200
Subject: [PATCH 15/22] Use ternary operator in setter method
---
src/main/java/hudson/plugins/jira/JiraSite.java | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
diff --git a/src/main/java/hudson/plugins/jira/JiraSite.java b/src/main/java/hudson/plugins/jira/JiraSite.java
index f30b1c87b..a20d338fc 100644
--- a/src/main/java/hudson/plugins/jira/JiraSite.java
+++ b/src/main/java/hudson/plugins/jira/JiraSite.java
@@ -661,11 +661,9 @@ public void setUpdateJiraIssueForAllStatus(boolean updateJiraIssueForAllStatus)
@DataBoundSetter
public void setMaxIssuesFromJqlSearch(int maxIssuesFromJqlSearch) {
- if (maxIssuesFromJqlSearch > MAX_ALLOWED_ISSUES_FROM_JQL) {
- this.maxIssuesFromJqlSearch = MAX_ALLOWED_ISSUES_FROM_JQL;
- } else {
- this.maxIssuesFromJqlSearch = maxIssuesFromJqlSearch;
- }
+ this.maxIssuesFromJqlSearch = maxIssuesFromJqlSearch > MAX_ALLOWED_ISSUES_FROM_JQL
+ ? MAX_ALLOWED_ISSUES_FROM_JQL
+ : maxIssuesFromJqlSearch;
}
public int getMaxIssuesFromJqlSearch() {
From 3a64256c1f867a61b7ab1c8fa1a629a4bb2414f3 Mon Sep 17 00:00:00 2001
From: Hardik Rathod
Date: Fri, 30 May 2025 16:12:57 +0200
Subject: [PATCH 16/22] Remove parameter from old jira configuration
---
.../resources/hudson/plugins/jira/oldJiraProjectProperty.xml | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/test/resources/hudson/plugins/jira/oldJiraProjectProperty.xml b/src/test/resources/hudson/plugins/jira/oldJiraProjectProperty.xml
index ca875e27e..b9ba6371a 100644
--- a/src/test/resources/hudson/plugins/jira/oldJiraProjectProperty.xml
+++ b/src/test/resources/hudson/plugins/jira/oldJiraProjectProperty.xml
@@ -12,7 +12,6 @@
10
false
- 0
From 61cef1e4fe6925e3c6fdc3a1d77bf22f7cfbf35e Mon Sep 17 00:00:00 2001
From: Hardik Rathod
Date: Fri, 30 May 2025 16:46:15 +0200
Subject: [PATCH 17/22] Resolve conflicts
---
.../hudson/plugins/jira/JiraReplaceFixVersionByRegExTest.java | 0
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 src/test/java/hudson/plugins/jira/JiraReplaceFixVersionByRegExTest.java
diff --git a/src/test/java/hudson/plugins/jira/JiraReplaceFixVersionByRegExTest.java b/src/test/java/hudson/plugins/jira/JiraReplaceFixVersionByRegExTest.java
deleted file mode 100644
index e69de29bb..000000000
From 9a07f9412702c8e1609d3175d18622b5593822d1 Mon Sep 17 00:00:00 2001
From: Hardik Rathod
Date: Fri, 30 May 2025 16:50:44 +0200
Subject: [PATCH 18/22] Fix jira session tests
---
src/test/java/hudson/plugins/jira/JiraSessionTest.java | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/src/test/java/hudson/plugins/jira/JiraSessionTest.java b/src/test/java/hudson/plugins/jira/JiraSessionTest.java
index 367f923a3..ca76c798b 100644
--- a/src/test/java/hudson/plugins/jira/JiraSessionTest.java
+++ b/src/test/java/hudson/plugins/jira/JiraSessionTest.java
@@ -60,7 +60,7 @@ void replaceWithFixVersionByRegex() throws URISyntaxException, TimeoutException
ArrayList issues = new ArrayList<>();
issues.add(getIssue(Arrays.asList("v1.0"), 1L));
issues.add(getIssue(Arrays.asList("v1.0", "v2.0", "v2.0.0"), 2L));
- when(service.getIssuesFromJqlSearch(QUERY, JiraSession.MAX_ISSUES)).thenReturn(issues);
+ when(service.getIssuesFromJqlSearch(QUERY, JiraSite.MAX_ALLOWED_ISSUES_FROM_JQL)).thenReturn(issues);
jiraSession.replaceFixVersion(PROJECT_KEY, "/v1.*/", newVersion.getName(), QUERY);
@@ -99,7 +99,7 @@ void replaceFixVersion() throws URISyntaxException, TimeoutException {
issues.add(getIssue(Arrays.asList("v1.0"), 1L));
issues.add(getIssue(Arrays.asList("v1.0", "v1.0.0", "v2.0.0"), 2L));
issues.add(getIssue(null, 3L));
- when(service.getIssuesFromJqlSearch(QUERY, JiraSession.MAX_ISSUES)).thenReturn(issues);
+ when(service.getIssuesFromJqlSearch(QUERY, JiraSite.MAX_ALLOWED_ISSUES_FROM_JQL)).thenReturn(issues);
jiraSession.replaceFixVersion(PROJECT_KEY, "v1.0", newVersion.getName(), QUERY);
@@ -183,7 +183,7 @@ void shouldAddVersionToAllIssues() throws Exception {
List issues = new ArrayList<>();
issues.add(getIssue(Arrays.asList("v1.0"), 1L));
issues.add(getIssue(Arrays.asList("v2.0", "v3.0"), 2L));
- when(service.getIssuesFromJqlSearch(QUERY, JiraSession.MAX_ISSUES)).thenReturn(issues);
+ when(service.getIssuesFromJqlSearch(QUERY, JiraSite.MAX_ALLOWED_ISSUES_FROM_JQL)).thenReturn(issues);
jiraSession.addFixVersion(PROJECT_KEY, newVersion.getName(), QUERY);
@@ -213,7 +213,7 @@ void shouldAddVersionWhenNoFixVersions() throws Exception {
when(jiraSession.getVersions(PROJECT_KEY)).thenReturn(myVersions);
List issues = List.of(getIssue(null, 3L));
- when(service.getIssuesFromJqlSearch(QUERY, JiraSession.MAX_ISSUES)).thenReturn(issues);
+ when(service.getIssuesFromJqlSearch(QUERY, JiraSite.MAX_ALLOWED_ISSUES_FROM_JQL)).thenReturn(issues);
jiraSession.addFixVersion(PROJECT_KEY, newVersion.getName(), QUERY);
@@ -233,7 +233,7 @@ void shouldNotCallUpdateIfNoIssues() throws Exception {
List myVersions = List.of(newVersion);
when(jiraSession.getVersions(PROJECT_KEY)).thenReturn(myVersions);
- when(service.getIssuesFromJqlSearch(QUERY, JiraSession.MAX_ISSUES)).thenReturn(new ArrayList<>());
+ when(service.getIssuesFromJqlSearch(QUERY, JiraSite.MAX_ALLOWED_ISSUES_FROM_JQL)).thenReturn(new ArrayList<>());
jiraSession.addFixVersion(PROJECT_KEY, newVersion.getName(), QUERY);
From bade3ada8b3a503fecda6f3e9a22b54093c4879f Mon Sep 17 00:00:00 2001
From: Hardik Rathod
Date: Fri, 30 May 2025 17:08:40 +0200
Subject: [PATCH 19/22] Fix test cases because of stubbing problem
---
.../java/hudson/plugins/jira/JiraRestService.java | 2 +-
.../hudson/plugins/jira/JiraRestServiceTest.java | 4 +++-
.../java/hudson/plugins/jira/JiraSessionTest.java | 15 ++++++++++-----
.../jira/auth/JiraRestServiceBearerAuthTest.java | 4 +++-
4 files changed, 17 insertions(+), 8 deletions(-)
diff --git a/src/main/java/hudson/plugins/jira/JiraRestService.java b/src/main/java/hudson/plugins/jira/JiraRestService.java
index 13b811bfe..862157726 100644
--- a/src/main/java/hudson/plugins/jira/JiraRestService.java
+++ b/src/main/java/hudson/plugins/jira/JiraRestService.java
@@ -227,7 +227,7 @@ public List getProjectsKeys() {
return keys;
}
- public List getIssuesFromJqlSearch(String jqlSearch, Integer maxResults) throws TimeoutException {
+ public List getIssuesFromJqlSearch(String jqlSearch, int maxResults) throws TimeoutException {
try {
Set neededFields =
new HashSet<>(Arrays.asList("summary", "issuetype", "created", "updated", "project", "status"));
diff --git a/src/test/java/hudson/plugins/jira/JiraRestServiceTest.java b/src/test/java/hudson/plugins/jira/JiraRestServiceTest.java
index 6cd1aa45c..3145ca30a 100644
--- a/src/test/java/hudson/plugins/jira/JiraRestServiceTest.java
+++ b/src/test/java/hudson/plugins/jira/JiraRestServiceTest.java
@@ -58,6 +58,8 @@ void getIssuesFromJqlSearchTimeout() throws InterruptedException, ExecutionExcep
JiraRestService service =
spy(new JiraRestService(JIRA_URI, client, USERNAME, PASSWORD, JiraSite.DEFAULT_TIMEOUT));
doThrow(new TimeoutException()).when(promise).get(Mockito.anyLong(), Mockito.any());
- assertThrows(TimeoutException.class, () -> service.getIssuesFromJqlSearch("*", null));
+ assertThrows(
+ TimeoutException.class,
+ () -> service.getIssuesFromJqlSearch("*", JiraSite.MAX_ALLOWED_ISSUES_FROM_JQL));
}
}
diff --git a/src/test/java/hudson/plugins/jira/JiraSessionTest.java b/src/test/java/hudson/plugins/jira/JiraSessionTest.java
index ca76c798b..ced6b03fb 100644
--- a/src/test/java/hudson/plugins/jira/JiraSessionTest.java
+++ b/src/test/java/hudson/plugins/jira/JiraSessionTest.java
@@ -60,7 +60,8 @@ void replaceWithFixVersionByRegex() throws URISyntaxException, TimeoutException
ArrayList issues = new ArrayList<>();
issues.add(getIssue(Arrays.asList("v1.0"), 1L));
issues.add(getIssue(Arrays.asList("v1.0", "v2.0", "v2.0.0"), 2L));
- when(service.getIssuesFromJqlSearch(QUERY, JiraSite.MAX_ALLOWED_ISSUES_FROM_JQL)).thenReturn(issues);
+ when(service.getIssuesFromJqlSearch(QUERY, 0))
+ .thenReturn(issues);
jiraSession.replaceFixVersion(PROJECT_KEY, "/v1.*/", newVersion.getName(), QUERY);
@@ -99,7 +100,8 @@ void replaceFixVersion() throws URISyntaxException, TimeoutException {
issues.add(getIssue(Arrays.asList("v1.0"), 1L));
issues.add(getIssue(Arrays.asList("v1.0", "v1.0.0", "v2.0.0"), 2L));
issues.add(getIssue(null, 3L));
- when(service.getIssuesFromJqlSearch(QUERY, JiraSite.MAX_ALLOWED_ISSUES_FROM_JQL)).thenReturn(issues);
+ when(service.getIssuesFromJqlSearch(QUERY, 0))
+ .thenReturn(issues);
jiraSession.replaceFixVersion(PROJECT_KEY, "v1.0", newVersion.getName(), QUERY);
@@ -183,7 +185,8 @@ void shouldAddVersionToAllIssues() throws Exception {
List issues = new ArrayList<>();
issues.add(getIssue(Arrays.asList("v1.0"), 1L));
issues.add(getIssue(Arrays.asList("v2.0", "v3.0"), 2L));
- when(service.getIssuesFromJqlSearch(QUERY, JiraSite.MAX_ALLOWED_ISSUES_FROM_JQL)).thenReturn(issues);
+ when(service.getIssuesFromJqlSearch(QUERY, 0))
+ .thenReturn(issues);
jiraSession.addFixVersion(PROJECT_KEY, newVersion.getName(), QUERY);
@@ -213,7 +216,8 @@ void shouldAddVersionWhenNoFixVersions() throws Exception {
when(jiraSession.getVersions(PROJECT_KEY)).thenReturn(myVersions);
List issues = List.of(getIssue(null, 3L));
- when(service.getIssuesFromJqlSearch(QUERY, JiraSite.MAX_ALLOWED_ISSUES_FROM_JQL)).thenReturn(issues);
+ when(service.getIssuesFromJqlSearch(QUERY, 0))
+ .thenReturn(issues);
jiraSession.addFixVersion(PROJECT_KEY, newVersion.getName(), QUERY);
@@ -233,7 +237,8 @@ void shouldNotCallUpdateIfNoIssues() throws Exception {
List myVersions = List.of(newVersion);
when(jiraSession.getVersions(PROJECT_KEY)).thenReturn(myVersions);
- when(service.getIssuesFromJqlSearch(QUERY, JiraSite.MAX_ALLOWED_ISSUES_FROM_JQL)).thenReturn(new ArrayList<>());
+ when(service.getIssuesFromJqlSearch(QUERY, 0))
+ .thenReturn(new ArrayList<>());
jiraSession.addFixVersion(PROJECT_KEY, newVersion.getName(), QUERY);
diff --git a/src/test/java/hudson/plugins/jira/auth/JiraRestServiceBearerAuthTest.java b/src/test/java/hudson/plugins/jira/auth/JiraRestServiceBearerAuthTest.java
index 4b8bbf3f3..8fc14b613 100644
--- a/src/test/java/hudson/plugins/jira/auth/JiraRestServiceBearerAuthTest.java
+++ b/src/test/java/hudson/plugins/jira/auth/JiraRestServiceBearerAuthTest.java
@@ -58,6 +58,8 @@ void baseApiPath() {
void getIssuesFromJqlSearchTimeout() throws ExecutionException, InterruptedException, TimeoutException {
JiraRestService service = spy(new JiraRestService(JIRA_URI, client, TOKEN, JiraSite.DEFAULT_TIMEOUT));
doThrow(new TimeoutException()).when(promise).get(Mockito.anyLong(), Mockito.any());
- assertThrows(TimeoutException.class, () -> service.getIssuesFromJqlSearch("*", null));
+ assertThrows(
+ TimeoutException.class,
+ () -> service.getIssuesFromJqlSearch("*", JiraSite.MAX_ALLOWED_ISSUES_FROM_JQL));
}
}
From 85750d80c5647902d2b02b035875b91181413e73 Mon Sep 17 00:00:00 2001
From: Hardik Rathod
Date: Fri, 30 May 2025 17:13:53 +0200
Subject: [PATCH 20/22] Fix indentation
---
.../java/hudson/plugins/jira/JiraSessionTest.java | 15 +++++----------
1 file changed, 5 insertions(+), 10 deletions(-)
diff --git a/src/test/java/hudson/plugins/jira/JiraSessionTest.java b/src/test/java/hudson/plugins/jira/JiraSessionTest.java
index ced6b03fb..0b1004e91 100644
--- a/src/test/java/hudson/plugins/jira/JiraSessionTest.java
+++ b/src/test/java/hudson/plugins/jira/JiraSessionTest.java
@@ -60,8 +60,7 @@ void replaceWithFixVersionByRegex() throws URISyntaxException, TimeoutException
ArrayList issues = new ArrayList<>();
issues.add(getIssue(Arrays.asList("v1.0"), 1L));
issues.add(getIssue(Arrays.asList("v1.0", "v2.0", "v2.0.0"), 2L));
- when(service.getIssuesFromJqlSearch(QUERY, 0))
- .thenReturn(issues);
+ when(service.getIssuesFromJqlSearch(QUERY, 0)).thenReturn(issues);
jiraSession.replaceFixVersion(PROJECT_KEY, "/v1.*/", newVersion.getName(), QUERY);
@@ -100,8 +99,7 @@ void replaceFixVersion() throws URISyntaxException, TimeoutException {
issues.add(getIssue(Arrays.asList("v1.0"), 1L));
issues.add(getIssue(Arrays.asList("v1.0", "v1.0.0", "v2.0.0"), 2L));
issues.add(getIssue(null, 3L));
- when(service.getIssuesFromJqlSearch(QUERY, 0))
- .thenReturn(issues);
+ when(service.getIssuesFromJqlSearch(QUERY, 0)).thenReturn(issues);
jiraSession.replaceFixVersion(PROJECT_KEY, "v1.0", newVersion.getName(), QUERY);
@@ -185,8 +183,7 @@ void shouldAddVersionToAllIssues() throws Exception {
List issues = new ArrayList<>();
issues.add(getIssue(Arrays.asList("v1.0"), 1L));
issues.add(getIssue(Arrays.asList("v2.0", "v3.0"), 2L));
- when(service.getIssuesFromJqlSearch(QUERY, 0))
- .thenReturn(issues);
+ when(service.getIssuesFromJqlSearch(QUERY, 0)).thenReturn(issues);
jiraSession.addFixVersion(PROJECT_KEY, newVersion.getName(), QUERY);
@@ -216,8 +213,7 @@ void shouldAddVersionWhenNoFixVersions() throws Exception {
when(jiraSession.getVersions(PROJECT_KEY)).thenReturn(myVersions);
List issues = List.of(getIssue(null, 3L));
- when(service.getIssuesFromJqlSearch(QUERY, 0))
- .thenReturn(issues);
+ when(service.getIssuesFromJqlSearch(QUERY, 0)).thenReturn(issues);
jiraSession.addFixVersion(PROJECT_KEY, newVersion.getName(), QUERY);
@@ -237,8 +233,7 @@ void shouldNotCallUpdateIfNoIssues() throws Exception {
List myVersions = List.of(newVersion);
when(jiraSession.getVersions(PROJECT_KEY)).thenReturn(myVersions);
- when(service.getIssuesFromJqlSearch(QUERY, 0))
- .thenReturn(new ArrayList<>());
+ when(service.getIssuesFromJqlSearch(QUERY, 0)).thenReturn(new ArrayList<>());
jiraSession.addFixVersion(PROJECT_KEY, newVersion.getName(), QUERY);
From 7df98e13ac0868ec04a4660a30a861ea37463cd3 Mon Sep 17 00:00:00 2001
From: Hardik Rathod
Date: Fri, 30 May 2025 17:30:09 +0200
Subject: [PATCH 21/22] Use Integer instead of int
---
src/main/java/hudson/plugins/jira/JiraRestService.java | 2 +-
src/main/java/hudson/plugins/jira/JiraSession.java | 2 +-
src/main/java/hudson/plugins/jira/JiraSite.java | 2 +-
src/test/java/hudson/plugins/jira/JiraRestServiceTest.java | 4 +---
.../plugins/jira/auth/JiraRestServiceBearerAuthTest.java | 4 +---
5 files changed, 5 insertions(+), 9 deletions(-)
diff --git a/src/main/java/hudson/plugins/jira/JiraRestService.java b/src/main/java/hudson/plugins/jira/JiraRestService.java
index 862157726..13b811bfe 100644
--- a/src/main/java/hudson/plugins/jira/JiraRestService.java
+++ b/src/main/java/hudson/plugins/jira/JiraRestService.java
@@ -227,7 +227,7 @@ public List getProjectsKeys() {
return keys;
}
- public List getIssuesFromJqlSearch(String jqlSearch, int maxResults) throws TimeoutException {
+ public List getIssuesFromJqlSearch(String jqlSearch, Integer maxResults) throws TimeoutException {
try {
Set neededFields =
new HashSet<>(Arrays.asList("summary", "issuetype", "created", "updated", "project", "status"));
diff --git a/src/main/java/hudson/plugins/jira/JiraSession.java b/src/main/java/hudson/plugins/jira/JiraSession.java
index 5a74e392e..580a173e5 100644
--- a/src/main/java/hudson/plugins/jira/JiraSession.java
+++ b/src/main/java/hudson/plugins/jira/JiraSession.java
@@ -49,7 +49,7 @@ public class JiraSession {
private final String jiraSiteName;
- private final int maxIssuesFromJqlSearch;
+ private final Integer maxIssuesFromJqlSearch;
/* package */ JiraSession(JiraSite site, JiraRestService jiraRestService) {
this.service = jiraRestService;
diff --git a/src/main/java/hudson/plugins/jira/JiraSite.java b/src/main/java/hudson/plugins/jira/JiraSite.java
index a20d338fc..3671f8880 100644
--- a/src/main/java/hudson/plugins/jira/JiraSite.java
+++ b/src/main/java/hudson/plugins/jira/JiraSite.java
@@ -118,7 +118,7 @@ public class JiraSite extends AbstractDescribableImpl {
public static final int DEFAULT_THREAD_EXECUTOR_NUMBER = 10;
- public static final int MAX_ALLOWED_ISSUES_FROM_JQL = 5000;
+ public static final Integer MAX_ALLOWED_ISSUES_FROM_JQL = 5000;
/**
* URL of Jira for Jenkins access, like {@code http://jira.codehaus.org/}.
diff --git a/src/test/java/hudson/plugins/jira/JiraRestServiceTest.java b/src/test/java/hudson/plugins/jira/JiraRestServiceTest.java
index 3145ca30a..6cd1aa45c 100644
--- a/src/test/java/hudson/plugins/jira/JiraRestServiceTest.java
+++ b/src/test/java/hudson/plugins/jira/JiraRestServiceTest.java
@@ -58,8 +58,6 @@ void getIssuesFromJqlSearchTimeout() throws InterruptedException, ExecutionExcep
JiraRestService service =
spy(new JiraRestService(JIRA_URI, client, USERNAME, PASSWORD, JiraSite.DEFAULT_TIMEOUT));
doThrow(new TimeoutException()).when(promise).get(Mockito.anyLong(), Mockito.any());
- assertThrows(
- TimeoutException.class,
- () -> service.getIssuesFromJqlSearch("*", JiraSite.MAX_ALLOWED_ISSUES_FROM_JQL));
+ assertThrows(TimeoutException.class, () -> service.getIssuesFromJqlSearch("*", null));
}
}
diff --git a/src/test/java/hudson/plugins/jira/auth/JiraRestServiceBearerAuthTest.java b/src/test/java/hudson/plugins/jira/auth/JiraRestServiceBearerAuthTest.java
index 8fc14b613..4b8bbf3f3 100644
--- a/src/test/java/hudson/plugins/jira/auth/JiraRestServiceBearerAuthTest.java
+++ b/src/test/java/hudson/plugins/jira/auth/JiraRestServiceBearerAuthTest.java
@@ -58,8 +58,6 @@ void baseApiPath() {
void getIssuesFromJqlSearchTimeout() throws ExecutionException, InterruptedException, TimeoutException {
JiraRestService service = spy(new JiraRestService(JIRA_URI, client, TOKEN, JiraSite.DEFAULT_TIMEOUT));
doThrow(new TimeoutException()).when(promise).get(Mockito.anyLong(), Mockito.any());
- assertThrows(
- TimeoutException.class,
- () -> service.getIssuesFromJqlSearch("*", JiraSite.MAX_ALLOWED_ISSUES_FROM_JQL));
+ assertThrows(TimeoutException.class, () -> service.getIssuesFromJqlSearch("*", null));
}
}
From d6823c4b98c89a7fce52c281ed8c8a1d8d9e5132 Mon Sep 17 00:00:00 2001
From: Hardik Rathod
Date: Fri, 30 May 2025 20:14:51 +0200
Subject: [PATCH 22/22] Fix default value not being used when migrating from
old config
---
src/main/java/hudson/plugins/jira/JiraSite.java | 10 ++++++++--
.../hudson/plugins/jira/JiraSite/config.jelly | 2 +-
src/test/java/hudson/plugins/jira/JiraSiteTest.java | 8 ++++++++
3 files changed, 17 insertions(+), 3 deletions(-)
diff --git a/src/main/java/hudson/plugins/jira/JiraSite.java b/src/main/java/hudson/plugins/jira/JiraSite.java
index 3671f8880..9ac4077a3 100644
--- a/src/main/java/hudson/plugins/jira/JiraSite.java
+++ b/src/main/java/hudson/plugins/jira/JiraSite.java
@@ -118,6 +118,8 @@ public class JiraSite extends AbstractDescribableImpl {
public static final int DEFAULT_THREAD_EXECUTOR_NUMBER = 10;
+ public static final Integer DEFAULT_ISSUES_FROM_JQL = 100;
+
public static final Integer MAX_ALLOWED_ISSUES_FROM_JQL = 5000;
/**
@@ -251,7 +253,7 @@ public class JiraSite extends AbstractDescribableImpl {
/**
* To allow configurable value of max issues from jql search via jira site global configuration.
*/
- private int maxIssuesFromJqlSearch;
+ private int maxIssuesFromJqlSearch = DEFAULT_ISSUES_FROM_JQL;
private int ioThreadCount = Integer.getInteger(JiraSite.class.getName() + ".httpclient.options.ioThreadCount", 2);
@@ -707,7 +709,11 @@ protected Object readResolve() throws FormException {
jiraSite.setDisableChangelogAnnotations(disableChangelogAnnotations);
jiraSite.setDateTimePattern(dateTimePattern);
jiraSite.setUseBearerAuth(useBearerAuth);
- jiraSite.setMaxIssuesFromJqlSearch(maxIssuesFromJqlSearch);
+ if (this.maxIssuesFromJqlSearch <= 0) {
+ jiraSite.setMaxIssuesFromJqlSearch(DEFAULT_ISSUES_FROM_JQL);
+ } else {
+ jiraSite.setMaxIssuesFromJqlSearch(maxIssuesFromJqlSearch);
+ }
return jiraSite;
}
diff --git a/src/main/resources/hudson/plugins/jira/JiraSite/config.jelly b/src/main/resources/hudson/plugins/jira/JiraSite/config.jelly
index 0ddb10fa8..175369c91 100644
--- a/src/main/resources/hudson/plugins/jira/JiraSite/config.jelly
+++ b/src/main/resources/hudson/plugins/jira/JiraSite/config.jelly
@@ -52,7 +52,7 @@
-
+