diff --git a/data-prepper-plugins/saas-source-plugins/jira-source/src/main/java/org/opensearch/dataprepper/plugins/source/saas/jira/JiraConfigHelper.java b/data-prepper-plugins/saas-source-plugins/jira-source/src/main/java/org/opensearch/dataprepper/plugins/source/saas/jira/JiraConfigHelper.java index ca7b2b09ce..c95313e8fa 100644 --- a/data-prepper-plugins/saas-source-plugins/jira-source/src/main/java/org/opensearch/dataprepper/plugins/source/saas/jira/JiraConfigHelper.java +++ b/data-prepper-plugins/saas-source-plugins/jira-source/src/main/java/org/opensearch/dataprepper/plugins/source/saas/jira/JiraConfigHelper.java @@ -29,11 +29,9 @@ public class JiraConfigHelper { public static final String ISSUE_STATUS_FILTER = "status"; public static final String ISSUE_TYPE_FILTER = "issuetype"; - private final OAuth2RestHelper auth2RestHelper; private final JiraSourceConfig config; - public JiraConfigHelper(OAuth2RestHelper auth2RestHelper, JiraSourceConfig config) { - this.auth2RestHelper = auth2RestHelper; + public JiraConfigHelper(JiraSourceConfig config) { this.config = config; } @@ -164,16 +162,4 @@ public boolean validateConfig(JiraSourceConfig config) { } return true; } - - public String getAuthTypeBasedJiraUrl() { - //For OAuth based flow, we use a different Jira url - String authType = config.getAuthType(); - if(OAUTH2.equals(authType)){ - String cloudId = this.auth2RestHelper.getJiraAccountCloudId(config); - return OAuth2_URL + cloudId + "/" + REST_API_FETCH_ISSUE; - }else { - return config.getAccountUrl() + REST_API_FETCH_ISSUE + "/"; - } - } - } diff --git a/data-prepper-plugins/saas-source-plugins/jira-source/src/main/java/org/opensearch/dataprepper/plugins/source/saas/jira/JiraOauthConfig.java b/data-prepper-plugins/saas-source-plugins/jira-source/src/main/java/org/opensearch/dataprepper/plugins/source/saas/jira/JiraOauthConfig.java index 648257d2fe..9c60bd5600 100644 --- a/data-prepper-plugins/saas-source-plugins/jira-source/src/main/java/org/opensearch/dataprepper/plugins/source/saas/jira/JiraOauthConfig.java +++ b/data-prepper-plugins/saas-source-plugins/jira-source/src/main/java/org/opensearch/dataprepper/plugins/source/saas/jira/JiraOauthConfig.java @@ -1,69 +1,55 @@ package org.opensearch.dataprepper.plugins.source.saas.jira; +import lombok.Getter; +import lombok.Setter; import org.opensearch.dataprepper.plugins.source.saas.jira.utils.Constants; import org.slf4j.Logger; import org.springframework.util.StringUtils; +import javax.inject.Named; import java.util.HashMap; import java.util.Map; /** * The type Jira service. */ + +@Setter +@Getter public class JiraOauthConfig { - /** - * The Jira project cache. - */ - static Map jiraProjectCache = new HashMap<>(); - /** - * The Access token. - */ - static String accessToken = ""; - /** - * The Refresh token. - */ - static String refreshToken = ""; - /** - * The Client id. - */ - static String clientId = ""; - /** - * The Client secret. - */ - static String clientSecret = ""; + private static final Logger appLog = org.slf4j.LoggerFactory.getLogger(JiraOauthConfig.class); - /** - * Set OauthConfigValues initially. - */ - static synchronized void setOauthConfigValues(String jiraId, - String jiraCredential, String jiraAccessToken, - String jiraRefreshToken) { - appLog.info("Setting OAuth configuration values for Jira Connector."); - if (!jiraId.equals(clientId)) { - clientId = jiraId; - } - if (!jiraCredential.equals(clientSecret)) { - clientSecret = jiraCredential; - } - if (!jiraAccessToken.equals(accessToken)) { - accessToken = jiraAccessToken; - } - if (!jiraRefreshToken.equals(refreshToken)) { - refreshToken = jiraRefreshToken; - } + private String accessToken = ""; + private String refreshToken = ""; + private String clientId = ""; + private String clientSecret = ""; + + public JiraOauthConfig(String accessToken, String refreshToken, String clientId, String clientSecret) { + this.accessToken = accessToken; + this.refreshToken = refreshToken; + this.clientId = clientId; + this.clientSecret = clientSecret; + } + + public JiraOauthConfig(JiraOauthConfig oauthConfig){ + this.accessToken = oauthConfig.getAccessToken(); + this.refreshToken = oauthConfig.getRefreshToken(); + this.clientId = oauthConfig.getClientId(); + this.clientSecret = oauthConfig.getClientSecret(); } - /** + + /* *//** * Get changed Access and Refresh Token when old expired. - */ + *//* static synchronized void changeAccessAndRefreshToken(Object jiraConfiguration) { appLog.info("Setting access-refresh token for Jira Connector."); boolean configuaration = true; if (jiraConfiguration instanceof JiraConfigHelper) { - configuaration = JiraService.reTestConnection((JiraConfigHelper) jiraConfiguration); + configuaration = JiraService. .reTestConnection((JiraConfigHelper) jiraConfiguration); } if (!configuaration) { @@ -79,15 +65,15 @@ static synchronized void changeAccessAndRefreshToken(Object jiraConfiguration) { } } - /** + *//** * create AccessRefreshToken Pair. * * @param clientId the configuration * @return AccessRefreshToken - */ + *//* private static HashMap createAccessRefreshTokenPair( String clientId, String clientSecret, String refreshToken) { - /*appLog.info("Creating access-refresh token pair for Jira Connector."); + *//*appLog.info("Creating access-refresh token pair for Jira Connector."); OAuthClientRequest accessRequest = null; HashMap oauthValues = new HashMap<>(); try { @@ -120,7 +106,7 @@ private static HashMap createAccessRefreshTokenPair( throw new ContinuableBadRequestException(e.getMessage(), e); } } - return oauthValues;*/ + return oauthValues;*//* return null; - } + }*/ } diff --git a/data-prepper-plugins/saas-source-plugins/jira-source/src/main/java/org/opensearch/dataprepper/plugins/source/saas/jira/JiraService.java b/data-prepper-plugins/saas-source-plugins/jira-source/src/main/java/org/opensearch/dataprepper/plugins/source/saas/jira/JiraService.java index 5a76e67604..c941772604 100644 --- a/data-prepper-plugins/saas-source-plugins/jira-source/src/main/java/org/opensearch/dataprepper/plugins/source/saas/jira/JiraService.java +++ b/data-prepper-plugins/saas-source-plugins/jira-source/src/main/java/org/opensearch/dataprepper/plugins/source/saas/jira/JiraService.java @@ -7,25 +7,26 @@ import com.mashape.unirest.http.JsonNode; import com.mashape.unirest.http.Unirest; import com.mashape.unirest.http.exceptions.UnirestException; +import io.micrometer.core.annotation.Timed; +import io.micrometer.core.instrument.Counter; +import io.micrometer.core.instrument.Timer; import lombok.extern.slf4j.Slf4j; import org.apache.http.HttpHeaders; -import org.apache.http.HttpStatus; +import org.opensearch.dataprepper.metrics.PluginMetrics; import org.opensearch.dataprepper.plugins.source.saas.crawler.model.ItemInfo; import org.opensearch.dataprepper.plugins.source.saas.jira.exception.BadRequestException; -import org.opensearch.dataprepper.plugins.source.saas.jira.exception.UnAuthorizedException; import org.opensearch.dataprepper.plugins.source.saas.jira.models.IssueBean; import org.opensearch.dataprepper.plugins.source.saas.jira.models.SearchResults; +import org.opensearch.dataprepper.plugins.source.saas.jira.rest.OAuth2RestHelper; import org.opensearch.dataprepper.plugins.source.saas.jira.utils.AddressValidation; import org.opensearch.dataprepper.plugins.source.saas.jira.utils.Constants; import org.opensearch.dataprepper.plugins.source.saas.jira.utils.JiraContentType; +import org.springframework.retry.annotation.Backoff; +import org.springframework.retry.annotation.Retryable; import org.springframework.util.CollectionUtils; -import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.client.RestTemplate; import javax.inject.Named; -import java.io.ByteArrayInputStream; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; import java.time.Instant; import java.time.OffsetDateTime; import java.util.ArrayList; @@ -37,7 +38,6 @@ import java.util.Objects; import java.util.Queue; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; import java.util.regex.Matcher; @@ -53,7 +53,6 @@ import static org.opensearch.dataprepper.plugins.source.saas.jira.utils.Constants.CONTENT_TYPE; import static org.opensearch.dataprepper.plugins.source.saas.jira.utils.Constants.CREATED; import static org.opensearch.dataprepper.plugins.source.saas.jira.utils.Constants.DELIMITER; -import static org.opensearch.dataprepper.plugins.source.saas.jira.utils.Constants.EMPTY_STRING; import static org.opensearch.dataprepper.plugins.source.saas.jira.utils.Constants.ERR_MSG; import static org.opensearch.dataprepper.plugins.source.saas.jira.utils.Constants.EXPAND_FIELD; import static org.opensearch.dataprepper.plugins.source.saas.jira.utils.Constants.EXPAND_VALUE; @@ -73,6 +72,7 @@ import static org.opensearch.dataprepper.plugins.source.saas.jira.utils.Constants.PROJECT_IN; import static org.opensearch.dataprepper.plugins.source.saas.jira.utils.Constants.PROJECT_KEY; import static org.opensearch.dataprepper.plugins.source.saas.jira.utils.Constants.PROJECT_NAME; +import static org.opensearch.dataprepper.plugins.source.saas.jira.utils.Constants.REST_API_FETCH_ISSUE; import static org.opensearch.dataprepper.plugins.source.saas.jira.utils.Constants.REST_API_SEARCH; import static org.opensearch.dataprepper.plugins.source.saas.jira.utils.Constants.RETRY_ATTEMPT; import static org.opensearch.dataprepper.plugins.source.saas.jira.utils.Constants.START_AT; @@ -86,30 +86,41 @@ /** - * The type Jira service. + * Service class for interactive external Atlassian jira SaaS service and fetch required details using their rest apis. */ @Slf4j @Named public class JiraService { - private static final List waitTimeList = - Arrays.asList(1, 3, 5, 10, 20, 40, 60, 120, 240); - private final RestTemplate restTemplate; - private final JiraConfigHelper configHelper; + private JiraOauthConfig oauthConfig; + private OAuth2RestHelper oAuth2RestHelper; + + public static final String ISSUES_REQUESTED = "issuesRequested"; + public static final String REQUEST_PROCESS_DURATION = "requestProcessDuration"; + + private final Counter issuesRequestedCounter; + private final Timer requestProcessDuration; + private final PluginMetrics jiraPluginMetrics = PluginMetrics.fromNames("jiraService", "aws"); private final String url; - /** - * The Jira project cache. - */ + static Map jiraProjectCache = new ConcurrentHashMap<>(); - public JiraService(RestTemplate restTemplate, JiraConfigHelper configHelper) { + public JiraService(RestTemplate restTemplate, + JiraConfigHelper configHelper, + OAuth2RestHelper oAuth2RestHelper) { this.restTemplate = restTemplate; this.configHelper = configHelper; - this.url = configHelper.getAuthTypeBasedJiraUrl(); + this.oAuth2RestHelper = oAuth2RestHelper; + this.oauthConfig = oAuth2RestHelper.getJiraOauthConfig(); + + issuesRequestedCounter = jiraPluginMetrics.counter(ISSUES_REQUESTED); + requestProcessDuration = jiraPluginMetrics.timer(REQUEST_PROCESS_DURATION); + + this.url = oAuth2RestHelper.getAuthTypeBasedJiraUrl(); } /** @@ -265,14 +276,14 @@ public SearchResults getAllIssues(StringBuilder jql, int startAt, request = Unirest.get(REST_API_SEARCH) .header(ACCEPT, Application_JSON) .header(HttpHeaders.AUTHORIZATION, String - .format("%s %s", Constants.TOKEN_TYPE, JiraOauthConfig.accessToken)) + .format("%s %s", Constants.TOKEN_TYPE, this.oauthConfig.getAccessToken())) .queryString(MAX_RESULT, FIFTY) .queryString(START_AT, startAt) .queryString(JQL_FIELD, jql) .queryString(EXPAND_FIELD, EXPAND_VALUE); response = request.asJson(); if (response.getStatus() == TOKEN_EXPIRED) { - JiraOauthConfig.changeAccessAndRefreshToken(configuration); + oauthConfig = this.oAuth2RestHelper.tryRefreshingAccessToken(oauthConfig); retryCount++; } else if (response.getStatus() == SUCCESS_RESPONSE) { Gson gson = new GsonBuilder().create(); @@ -331,20 +342,6 @@ private StringBuilder createIssueFilterCriteria(JiraSourceConfig configuration, return jiraQl; } - /** - * Method to build message input stream. - * - * @param text input parameter. - * @return ByteArrayInputStream input stream - */ - public final InputStream buildTextInputStream(String text) { - if (text!=null && !text.isEmpty()) { - text = EMPTY_STRING; - } - byte[] bytes = text.getBytes(StandardCharsets.UTF_8); - return new ByteArrayInputStream(bytes); - } - /** * Gets issue. * @@ -352,76 +349,13 @@ public final InputStream buildTextInputStream(String text) { * @param configuration the configuration * @return the issue */ + @Retryable(value = RuntimeException.class, maxAttempts = 5, backoff = @Backoff(delay = 1000, multiplier = 2)) + @Timed(REQUEST_PROCESS_DURATION) public String getIssue(String issueKey, JiraSourceConfig configuration) { - log.info("Started to fetch issue information"); - Queue waitTimeQueue = new ConcurrentLinkedQueue<>(waitTimeList); - - while(true) { - String issueUrl = this.url + issueKey; - log.info("Issue Fetching api call request is : {}", issueUrl); - try { - return restTemplate.getForEntity(issueUrl, String.class).getBody(); - } catch (HttpClientErrorException ex) { - log.error("Failed to execute the rest call ",ex); - } - } - } - - - public String getCurrentUser(JiraSourceConfig config) { - String url = config.getAccountUrl() + "/rest/api/3/myself"; - return restTemplate.getForEntity(url, String.class).getBody(); - } - - /** - * Method to test if the connections are working or not. - * - * @param configuration the configuration - * @return the boolean - */ - public boolean handShakeWithService(JiraSourceConfig configuration) { - AddressValidation.validateInetAddress(AddressValidation - .getInetAddress(configuration.getAccountUrl())); - Queue waitTimeQueue = new ConcurrentLinkedQueue<>(waitTimeList); - boolean shouldContinue = Boolean.TRUE; - while (shouldContinue) { - try { - if (configuration.getAuthType().equals(OAUTH2)) { - JiraOauthConfig - .setOauthConfigValues(configuration.getJiraId(), - configuration.getJiraCredential(), - configuration.getAccessToken(), configuration.getRefreshToken()); - } - getCurrentUser(configuration); - shouldContinue = Boolean.FALSE; - } catch (HttpClientErrorException e) { - try { - if (e.getStatusCode().value() == HttpStatus.SC_FORBIDDEN - || e.getStatusCode().value() == HttpStatus.SC_UNAUTHORIZED){ - throw new UnAuthorizedException("Access token expired", e); - } - log.error("Error occurred while testing connection {}", e.getMessage()); - throw new BadRequestException(e.getMessage(), e); - } catch (Exception ex) { - log.error("An exception has occurred while testing" - + " connection {}", ex.getMessage()); - throw new BadRequestException(ex.getMessage(), ex); - } - } - } - return true; - } - - - /** - * Gets issue search api. - * - * @param configuration the configuration - * @return the issue search api - */ - public SearchResults getIssueSearchApi(JiraConfigHelper configuration, String jql) { - //TODO: Fill this method body - return null; + log.debug("Started to fetch issue information"); + issuesRequestedCounter.increment(); + String url = configuration.getAccountUrl() + REST_API_FETCH_ISSUE + "/" + issueKey; + return restTemplate.getForEntity(url, String.class).getBody(); } /** @@ -465,51 +399,4 @@ private ItemInfo createItemInfo(String key, Map metadata) { .build(); } - /** - * Re-Test connection boolean. - * - * @param configuration the configuration - * @return the boolean - */ - public static boolean reTestConnection(JiraConfigHelper configuration) { - Queue waitTimeQueue = new ConcurrentLinkedQueue<>(waitTimeList); - boolean shouldContinue = Boolean.TRUE; - while (shouldContinue) { - try { - //TODO: replace below line -// getMyselfApi(configuration).getCurrentUser(EMPTY_STRING); - shouldContinue = Boolean.FALSE; - } catch (RuntimeException ex) { - if (/*ex.status() == RATE_LIMIT &&*/ !CollectionUtils.isEmpty(waitTimeQueue)) { - log.error("Re-testing connection due to error: {}", ex.getMessage()); - String waitTime = String.valueOf(waitTimeQueue.remove()); - handleThrottling(waitTime, Boolean.TRUE); - } else { - log.error("An exception has occurred while " - + "re-testing connection {}", ex.getMessage()); - return false; - } - } - } - return true; - } - - /** - * Method to handle Slack API Throttling. - * - * @param waitTime input parameter. - * @param resumeCrawl input parameter. - */ - public static void handleThrottling(String waitTime, boolean resumeCrawl) { - int seconds = Integer.parseInt(waitTime); - long retryAfter = seconds * 1000L; - try { - Thread.sleep(retryAfter); - } catch (InterruptedException interruptedException) { - //TODO: Better exception handling required here - log.error("Thread interrupted while handling throttling"); - throw new RuntimeException(interruptedException); - } - } - } diff --git a/data-prepper-plugins/saas-source-plugins/jira-source/src/main/java/org/opensearch/dataprepper/plugins/source/saas/jira/JiraSource.java b/data-prepper-plugins/saas-source-plugins/jira-source/src/main/java/org/opensearch/dataprepper/plugins/source/saas/jira/JiraSource.java index 8cdaf48dbf..aeccebd41a 100644 --- a/data-prepper-plugins/saas-source-plugins/jira-source/src/main/java/org/opensearch/dataprepper/plugins/source/saas/jira/JiraSource.java +++ b/data-prepper-plugins/saas-source-plugins/jira-source/src/main/java/org/opensearch/dataprepper/plugins/source/saas/jira/JiraSource.java @@ -40,7 +40,7 @@ public JiraSource(final PluginMetrics pluginMetrics, log.info("Create Jira Source Connector"); //Handshake with the service - service.handShakeWithService(jiraSourceConfig); + //service.handShakeWithService(jiraSourceConfig); } } diff --git a/data-prepper-plugins/saas-source-plugins/jira-source/src/main/java/org/opensearch/dataprepper/plugins/source/saas/jira/JiraSourceConfig.java b/data-prepper-plugins/saas-source-plugins/jira-source/src/main/java/org/opensearch/dataprepper/plugins/source/saas/jira/JiraSourceConfig.java index 84bfd2063e..86e871a737 100644 --- a/data-prepper-plugins/saas-source-plugins/jira-source/src/main/java/org/opensearch/dataprepper/plugins/source/saas/jira/JiraSourceConfig.java +++ b/data-prepper-plugins/saas-source-plugins/jira-source/src/main/java/org/opensearch/dataprepper/plugins/source/saas/jira/JiraSourceConfig.java @@ -22,13 +22,13 @@ public class JiraSourceConfig implements SaasSourceConfig { /** - * This connector's account url + * Jira account url */ @JsonProperty("account_url") private String accountUrl; /** - * A map of connector credentials specific to this connector + * A map of connector credentials specific to this source */ @JsonProperty("connector_credentials") private Map connectorCredentials; @@ -106,25 +106,30 @@ public String getAuthType() { public String getAccessToken() { - if(!OAUTH2.equals(getAuthType())) { - throw new RuntimeException("Authentication Type is not OAuth2."); - } - String accessToken = this.getConnectorCredentials().get("access_token"); - if(accessToken == null || accessToken.isEmpty()) { - throw new RuntimeException("Access Token is required for OAuth2 AuthType"); - } - return accessToken; + return fetchGivenOAuthAttribute("access_token"); } public String getRefreshToken() { + return fetchGivenOAuthAttribute("refresh_token"); + } + + public String getClientId() { + return fetchGivenOAuthAttribute("client_id"); + } + + public String getClientSecret() { + return fetchGivenOAuthAttribute("client_secret"); + } + + private String fetchGivenOAuthAttribute(String givenAttribute) { if(!OAUTH2.equals(getAuthType())) { throw new RuntimeException("Authentication Type is not OAuth2."); } - String refreshToken = this.getConnectorCredentials().get("refresh_token"); - if(refreshToken == null || refreshToken.isEmpty()) { - throw new RuntimeException("Refresh Token is required for OAuth2 AuthType"); + String attributeValue = this.getConnectorCredentials().get(givenAttribute); + if(attributeValue == null || attributeValue.isEmpty()) { + throw new RuntimeException(String.format("%s Token is required for OAuth2 AuthType", givenAttribute)); } - return refreshToken; + return attributeValue; } } diff --git a/data-prepper-plugins/saas-source-plugins/jira-source/src/main/java/org/opensearch/dataprepper/plugins/source/saas/jira/rest/OAuth2RestHelper.java b/data-prepper-plugins/saas-source-plugins/jira-source/src/main/java/org/opensearch/dataprepper/plugins/source/saas/jira/rest/OAuth2RestHelper.java index 3577d9b9c3..f4505ac6f0 100644 --- a/data-prepper-plugins/saas-source-plugins/jira-source/src/main/java/org/opensearch/dataprepper/plugins/source/saas/jira/rest/OAuth2RestHelper.java +++ b/data-prepper-plugins/saas-source-plugins/jira-source/src/main/java/org/opensearch/dataprepper/plugins/source/saas/jira/rest/OAuth2RestHelper.java @@ -1,6 +1,7 @@ package org.opensearch.dataprepper.plugins.source.saas.jira.rest; import com.google.gson.JsonObject; +import org.opensearch.dataprepper.plugins.source.saas.jira.JiraOauthConfig; import org.opensearch.dataprepper.plugins.source.saas.jira.JiraSourceConfig; import org.opensearch.dataprepper.plugins.source.saas.jira.exception.UnAuthorizedException; import org.opensearch.dataprepper.plugins.source.saas.jira.utils.Constants; @@ -23,6 +24,9 @@ import static org.opensearch.dataprepper.plugins.source.saas.jira.utils.Constants.ACCESSIBLE_RESOURCES; import static org.opensearch.dataprepper.plugins.source.saas.jira.utils.Constants.AUTHORIZATION_ERROR_CODE; +import static org.opensearch.dataprepper.plugins.source.saas.jira.utils.Constants.OAUTH2; +import static org.opensearch.dataprepper.plugins.source.saas.jira.utils.Constants.OAuth2_URL; +import static org.opensearch.dataprepper.plugins.source.saas.jira.utils.Constants.REST_API_FETCH_ISSUE; import static org.opensearch.dataprepper.plugins.source.saas.jira.utils.Constants.RETRY_ATTEMPT; import static org.opensearch.dataprepper.plugins.source.saas.jira.utils.Constants.TOKEN_EXPIRED; @@ -30,8 +34,13 @@ public class OAuth2RestHelper { private static Logger log = LoggerFactory.getLogger(OAuth2RestHelper.class); private final RestTemplate restTemplate = new RestTemplate(); + private final JiraSourceConfig config; - public String getJiraAccountCloudId(JiraSourceConfig config) { + public OAuth2RestHelper(JiraSourceConfig config){ + this.config = config; + } + + private String getJiraAccountCloudId() { log.info("Getting Jira Account Cloud ID"); HttpHeaders headers = new HttpHeaders(); headers.setBearerAuth(config.getAccessToken()); @@ -47,7 +56,7 @@ public String getJiraAccountCloudId(JiraSourceConfig config) { return (String)response.get("id"); } catch (HttpClientErrorException e) { if(e.getStatusCode().value() == TOKEN_EXPIRED) { - tryRefreshingAccessToken(config); + tryRefreshingAccessToken(this.getJiraOauthConfig()); throw new UnAuthorizedException("Access token expired", e); } log.error("Error occurred while accessing resources: ", e); @@ -58,21 +67,22 @@ public String getJiraAccountCloudId(JiraSourceConfig config) { } - public String tryRefreshingAccessToken(JiraSourceConfig config) { + public JiraOauthConfig tryRefreshingAccessToken(JiraOauthConfig oauthConfig) { log.info("Trying to refresh the access token"); + JiraOauthConfig refreshedConfig = new JiraOauthConfig(oauthConfig); HttpHeaders headers = new HttpHeaders(); headers.setBearerAuth(config.getAccessToken()); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); HttpEntity entity = new HttpEntity<>(headers); - try { ResponseEntity exchangeResponse = this.restTemplate.exchange(ACCESSIBLE_RESOURCES, HttpMethod.GET, entity, Object.class); List listResponse = (ArrayList)exchangeResponse.getBody(); Map response = (Map) listResponse.get(0); - return (String)response.get("id"); + refreshedConfig.setAccessToken((String)response.get("id")); + return refreshedConfig; } catch (HttpClientErrorException e) { if(e.getStatusCode().value() == TOKEN_EXPIRED) { throw new UnAuthorizedException("Access token expired", e); @@ -133,4 +143,26 @@ private static HashMap createAccessRefreshTokenPair( return oauthValues; } + /** + * Method for getting Jira url based on auth type. + * @return String + */ + public String getAuthTypeBasedJiraUrl() { + //For OAuth based flow, we use a different Jira url + String authType = config.getAuthType(); + if(OAUTH2.equals(authType)){ + String cloudId = this.getJiraAccountCloudId(); + return OAuth2_URL + cloudId + "/" + REST_API_FETCH_ISSUE; + }else { + return config.getAccountUrl() + REST_API_FETCH_ISSUE + "/"; + } + } + + public JiraOauthConfig getJiraOauthConfig() { + return new JiraOauthConfig(config.getAccessToken(), + config.getRefreshToken(), + config.getClientId(), + config.getClientSecret()); + } + }