Skip to content

Commit efdd835

Browse files
committed
Added support for transitions in kotlin-jira-sdk-client
1 parent 2c7f3e6 commit efdd835

File tree

3 files changed

+38
-8
lines changed

3 files changed

+38
-8
lines changed

kotlin-jira-client/kotlin-jira-client-sdk/src/main/kotlin/com/linkedplanet/kotlinjiraclient/sdk/util/IssueJsonConverter.kt

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
* Licensed under the Apache License, Version 2.0 (the "License");
88
* you may not use this file except in compliance with the License.
99
* You may obtain a copy of the License at
10-
*
10+
*
1111
* http://www.apache.org/licenses/LICENSE-2.0
12-
*
12+
*
1313
* Unless required by applicable law or agreed to in writing, software
1414
* distributed under the License is distributed on an "AS IS" BASIS,
1515
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -29,11 +29,11 @@ import com.atlassian.jira.issue.fields.rest.json.beans.JiraBaseUrls
2929
import com.atlassian.jira.rest.v2.issue.IncludedFields
3030
import com.atlassian.jira.rest.v2.issue.IssueBean
3131
import com.atlassian.jira.rest.v2.issue.builder.BeanBuilderFactory
32-
import com.google.gson.GsonBuilder
33-
import com.google.gson.JsonObject
32+
import com.google.gson.*
3433
import com.linkedplanet.kotlinjiraclient.sdk.field.FieldAccessorImpl
3534
import org.slf4j.LoggerFactory
3635
import javax.ws.rs.core.UriBuilder
36+
import javax.xml.bind.annotation.XmlTransient
3737

3838
/**
3939
* Converts a Jira Issue to Json.
@@ -48,17 +48,18 @@ class IssueJsonConverter {
4848
private val beanBuilderFactory = ComponentAccessor.getOSGiComponentInstanceOfType(BeanBuilderFactory::class.java)
4949
private val jiraBaseUrls: JiraBaseUrls = ComponentAccessor.getComponent(JiraBaseUrls::class.java)
5050
private val uriBuilder: UriBuilder = UriBuilder.fromPath(jiraBaseUrls.restApi2BaseUrl())
51-
private val gson by lazy { GsonBuilder().create() }
51+
private val gson by lazy { setupGson() }
5252

5353

5454
@Throws(FieldException::class)
5555
fun createJsonIssue(issue: Issue): JsonObject {
56-
val expand: String? = null
56+
val expand = "names,transitions"
5757
val issueBean: IssueBean = beanBuilderFactory
5858
.newIssueBeanBuilder2(IncludedFields.includeNavigableByDefault(null), expand, uriBuilder)
5959
.build(issue)
6060
this.addOrderableFieldsToBean(issueBean, issue)
6161
this.addAvailableNavigableFieldsToBean(issueBean, issue)
62+
this.apply { }
6263

6364
return gson.toJsonTree(issueBean).asJsonObject
6465
}
@@ -92,4 +93,16 @@ class IssueJsonConverter {
9293
}
9394
}
9495

96+
private fun setupGson() =
97+
GsonBuilder()
98+
.setExclusionStrategies(object : ExclusionStrategy {
99+
override fun shouldSkipField(f: FieldAttributes?): Boolean {
100+
return f?.getAnnotation(XmlTransient::class.java) != null
101+
}
102+
103+
override fun shouldSkipClass(clazz: Class<*>?): Boolean {
104+
return false
105+
}
106+
})
107+
.create()
95108
}

kotlin-jira-client/kotlin-jira-client-test-base/src/main/kotlin/com/linkedplanet/kotlinjiraclient/JiraIssueOperatorTest.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,11 @@ interface JiraIssueOperatorTest<JiraFieldType> : BaseTestConfigProvider<JiraFiel
247247
createdIssue.zonedDateTime?.truncatedTo(ChronoUnit.MINUTES)?.withZoneSameInstant(ZoneOffset.UTC)
248248
)
249249

250+
val transitions = createdIssue.transitions
251+
assertTrue(transitions.isNotEmpty())
252+
assertTrue(transitions.singleOrNull { it.name == "Do it" }?.let { true } ?: false)
253+
assertTrue(transitions.singleOrNull { it.name == "To Do" }?.let { true } ?: false)
254+
250255
println("### END issues_07CreateIssue")
251256
}
252257

kotlin-jira-client/kotlin-jira-client-test-base/src/main/kotlin/com/linkedplanet/kotlinjiraclient/util/JiraIssueTestHelper.kt

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import com.linkedplanet.kotlinjiraclient.api.field.JIRA_DATE_TIME_FORMATTER
2727
import com.linkedplanet.kotlinjiraclient.api.field.JiraFieldFactory
2828
import com.linkedplanet.kotlinjiraclient.api.interfaces.JiraIssueOperator
2929
import com.linkedplanet.kotlinjiraclient.api.model.JiraStatus
30+
import com.linkedplanet.kotlinjiraclient.api.model.JiraTransition
3031
import com.linkedplanet.kotlinjiraclient.api.resolveConfig
3132
import java.time.ZonedDateTime
3233
import kotlinx.coroutines.runBlocking
@@ -73,7 +74,8 @@ data class Story(
7374
val insightObjectKey: String?,
7475
val insightObjectsKeys: List<String>?,
7576
val status: JiraStatus,
76-
val epicKey: String?
77+
val epicKey: String?,
78+
val transitions: List<JiraTransition>
7779
)
7880

7981
suspend fun issueParser(jsonObject: JsonObject, map: Map<String, String>): Either<JiraClientError, Story> =
@@ -111,6 +113,15 @@ suspend fun issueParser(jsonObject: JsonObject, map: Map<String, String>): Eithe
111113
statusObject.get("statusCategory").asJsonObject.get("key").asString
112114
)
113115

116+
val transitions =
117+
jsonObject.get("transitions").asJsonArray
118+
.map {
119+
val transition = it.asJsonObject
120+
val name = transition.get("name").asString
121+
val id = transition.get("id").asString
122+
JiraTransition(id, name)
123+
}
124+
114125
val epicKey: String? = fieldByName("Epic Link")?.asString
115126

116127
Story(
@@ -130,7 +141,8 @@ suspend fun issueParser(jsonObject: JsonObject, map: Map<String, String>): Eithe
130141
insightObjectKey,
131142
insightObjectsKeys,
132143
status,
133-
epicKey
144+
epicKey,
145+
transitions
134146
)
135147
}
136148

0 commit comments

Comments
 (0)