From 5cb1e6dd1cc0fb6f92c58a41e2650d73358e8dc0 Mon Sep 17 00:00:00 2001 From: vive Date: Mon, 11 Jul 2016 15:59:01 +0530 Subject: [PATCH] Fixed to support ESB 5.0.0-BETA --- README.md | 4 +- pom.xml | 4 +- .../listJobCodeAssignments.xml | 2 +- .../tsheets-jobCodes/listJobCodes.xml | 2 +- .../tsheets-timeSheets/listTimeSheets.xml | 2 +- .../resources/tsheets-users/listUsers.xml | 2 +- src/test/INTEGRATION-TEST.txt | 10 +-- .../TSheetsConnectorIntegrationTest.java | 70 +++++++++++++------ .../tsheets/esb_listTimeSheets_mandatory.json | 4 +- .../tsheets/esb_listTimeSheets_optional.json | 4 +- .../ESB/connector/config/tsheets.properties | 2 +- 11 files changed, 65 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index 7bc6e70..9710ac7 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ The TSheets connector allows you to access the TSheets REST API through the WSO2 mvn clean install ### How You Can Contribute -You can create a third party connector and publish in WSO2 Connector Store. +You can create a third party connector and publish in WSO2 Store. -https://docs.wso2.com/display/ESBCONNECTORS/Creating+a+Third+Party+Connector+and+Publishing+in+WSO2+Connector+Store +https://docs.wso2.com/display/ESBCONNECTORS/Creating+a+Third+Party+Connector+and+Publishing+in+WSO2+Store diff --git a/pom.xml b/pom.xml index 09bcc3a..773bea8 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ tsheets 4.2.0 - 4.9.0 + 5.0.0-BETA 4.4.1 2.1.5320 2.1.3-wso2v11 @@ -317,4 +317,4 @@ http://maven.wso2.org/nexus/content/repositories/snapshots/ - \ No newline at end of file + diff --git a/src/main/resources/tsheets-jobCodeAssignments/listJobCodeAssignments.xml b/src/main/resources/tsheets-jobCodeAssignments/listJobCodeAssignments.xml index dcc7507..48029fb 100644 --- a/src/main/resources/tsheets-jobCodeAssignments/listJobCodeAssignments.xml +++ b/src/main/resources/tsheets-jobCodeAssignments/listJobCodeAssignments.xml @@ -82,7 +82,7 @@ } // Prefix the urlQuery with '?' and remove the trailing '&' if (urlQuery != "") { - urlQuery = '?' + urlQuery.substring(0, urlQuery.length-1); + urlQuery = '?' + urlQuery.toString().substring(0, urlQuery.toString().lastIndexOf("&")); mc.setProperty('uri.var.urlQuery', urlQuery); } ]]> diff --git a/src/main/resources/tsheets-jobCodes/listJobCodes.xml b/src/main/resources/tsheets-jobCodes/listJobCodes.xml index 7aed1e2..351a9ab 100644 --- a/src/main/resources/tsheets-jobCodes/listJobCodes.xml +++ b/src/main/resources/tsheets-jobCodes/listJobCodes.xml @@ -77,7 +77,7 @@ } // Prefix the urlQuery with '?' and remove the trailing '&' if (urlQuery != "") { - urlQuery = '?' + urlQuery.substring(0, urlQuery.length-1); + urlQuery = '?' + urlQuery.toString().substring(0, urlQuery.toString().lastIndexOf("&")); mc.setProperty('uri.var.urlQuery', urlQuery); } ]]> diff --git a/src/main/resources/tsheets-timeSheets/listTimeSheets.xml b/src/main/resources/tsheets-timeSheets/listTimeSheets.xml index db11939..69d58dd 100644 --- a/src/main/resources/tsheets-timeSheets/listTimeSheets.xml +++ b/src/main/resources/tsheets-timeSheets/listTimeSheets.xml @@ -109,7 +109,7 @@ } // Prefix the urlQuery with '?' and remove the trailing '&' if (urlQuery != "") { - urlQuery = '?' + urlQuery.substring(0, urlQuery.length-1); + urlQuery = '?' + urlQuery.toString().substring(0, urlQuery.toString().lastIndexOf("&")); mc.setProperty('uri.var.urlQuery', urlQuery); } ]]> diff --git a/src/main/resources/tsheets-users/listUsers.xml b/src/main/resources/tsheets-users/listUsers.xml index 545d8ce..71b2f43 100644 --- a/src/main/resources/tsheets-users/listUsers.xml +++ b/src/main/resources/tsheets-users/listUsers.xml @@ -85,7 +85,7 @@ } // Prefix the urlQuery with '?' and remove the trailing '&' if (urlQuery != "") { - urlQuery = '?' + urlQuery.substring(0, urlQuery.length-1); + urlQuery = '?' + urlQuery.toString().substring(0, urlQuery.toString().lastIndexOf("&")); mc.setProperty('uri.var.urlQuery', urlQuery); } ]]> diff --git a/src/test/INTEGRATION-TEST.txt b/src/test/INTEGRATION-TEST.txt index a0d67bd..944e08c 100644 --- a/src/test/INTEGRATION-TEST.txt +++ b/src/test/INTEGRATION-TEST.txt @@ -9,8 +9,8 @@ Pre-requisites: Tested Platform: - Microsoft WINDOWS V-7 - - UBUNTU 13.04, Mac OSx 10.9 - - WSO2 ESB 4.9.0 + - UBUNTU 13.04, Mac OSx 10.9, 14.04 + - WSO2 ESB 4.9.0, 5.0.0-BETA - Java 1.7 Note: @@ -20,7 +20,7 @@ Note: Steps to follow in setting integration test. - 1. Download ESB 4.9.0 and compress ESB as wso2esb-4.9.0.zip and copy that zip file in to location "{TSHEETS_HOME}/repository/". + 1. Download ESB 5.0.0-BETA, add "-XX:-UseSplitVerifier" under $JVM_MEM_OPTS into {ESB_HOME}/bin/wso2server.sh" and compress ESB as wso2esb- 5.0.0-BETA.zip and copy that zip file in to location "{TSHEETS_HOME}/repository/". 2. Follow the below steps to create a TSheets account. @@ -39,9 +39,9 @@ Steps to follow in setting integration test. 5. Update the TSheets properties file at location "{TSHEETS_HOME}/src/test/resources/artifacts/ESB/connector/config" as below. - i) apiUrl - Use the API URL as "https://rest.tsheets.com". + i) apiUrl - Use the API URL as "https://rest.tsheets.com". ii) accessToken - Place the accesstoken obtained in step 3[i]. - iii) jobCodeOneName - Name of a job code. + iii) jobCodeOneName - Name of a job code. iv) jobCodeTwoName - Name of a job code. v) timeSheetType - Type of the Timesheet. diff --git a/src/test/java/org/wso2/carbon/connector/integration/test/tsheets/TSheetsConnectorIntegrationTest.java b/src/test/java/org/wso2/carbon/connector/integration/test/tsheets/TSheetsConnectorIntegrationTest.java index a7b3cbb..71e3544 100644 --- a/src/test/java/org/wso2/carbon/connector/integration/test/tsheets/TSheetsConnectorIntegrationTest.java +++ b/src/test/java/org/wso2/carbon/connector/integration/test/tsheets/TSheetsConnectorIntegrationTest.java @@ -45,7 +45,7 @@ public class TSheetsConnectorIntegrationTest extends ConnectorIntegrationTestBas @BeforeClass(alwaysRun = true) public void setEnvironment() throws Exception { - init("tsheets-connector-1.0.1-SNAPSHOT"); + init("tsheets-connector-1.0.1"); esbRequestHeadersMap.put("Accept-Charset", "UTF-8"); esbRequestHeadersMap.put("Content-Type", "application/json"); @@ -55,19 +55,24 @@ public void setEnvironment() throws Exception { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); Date date = new Date(); - date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").parse(sdf.format(date)); + SimpleDateFormat sdf01 = new SimpleDateFormat("yyyy-MM-dd"); + date.setDate(date.getDate() - 1); String timeSheetTwoEnd = sdf.format(date) + "-07:00"; date.setMinutes(date.getMinutes() - 1); String timeSheetTwoStart = sdf.format(date) + "-07:00"; date.setDate(date.getDate() - 1); String timeSheetOneEnd = sdf.format(date) + "-07:00"; + String listTimeSheetOneEnd = sdf01.format(date); date.setMinutes(date.getMinutes() - 1); String timeSheetOneStart = sdf.format(date) + "-07:00"; + String listTimeSheetOneStart = sdf01.format(date); connectorProperties.setProperty("timeSheetOneStart", timeSheetOneStart); connectorProperties.setProperty("timeSheetOneEnd", timeSheetOneEnd); connectorProperties.setProperty("timeSheetTwoStart", timeSheetTwoStart); connectorProperties.setProperty("timeSheetTwoEnd", timeSheetTwoEnd); + connectorProperties.setProperty("listTimeSheetOneStart", listTimeSheetOneStart); + connectorProperties.setProperty("listTimeSheetOneEnd", listTimeSheetOneEnd); } /** @@ -231,7 +236,8 @@ public void testAddJobCodesWithNegativeCase() throws IOException, JSONException /** * Positive test case for listJobCodes method with mandatory parameters. */ - @Test(groups = {"wso2.esb"}, dependsOnMethods = {"testAddJobCodesWithMandatoryParameters"}, description = "tsheets {listJobCodes} integration test with mandatory parameters.") + @Test(groups = {"wso2.esb"}, dependsOnMethods = {"testAddJobCodesWithMandatoryParameters"}, + description = "tsheets {listJobCodes} integration test with mandatory parameters.") public void testListJobCodesWithMandatoryParameters() throws IOException, JSONException { esbRequestHeadersMap.put("Action", "urn:listJobCodes"); @@ -269,7 +275,8 @@ public void testListJobCodesWithMandatoryParameters() throws IOException, JSONEx /** * Positive test case for listJobCodes method with optional parameters. */ - @Test(groups = {"wso2.esb"}, dependsOnMethods = {"testAddJobCodesWithMandatoryParameters"}, description = "tsheets {listJobCodes} integration test with optional parameters.") + @Test(groups = {"wso2.esb"}, dependsOnMethods = {"testAddJobCodesWithMandatoryParameters"}, + description = "tsheets {listJobCodes} integration test with optional parameters.") public void testListJobCodesWithOptionalParameters() throws IOException, JSONException { esbRequestHeadersMap.put("Action", "urn:listJobCodes"); @@ -329,7 +336,8 @@ public void testListJobCodesWithNegativeCase() throws IOException, JSONException * Positive test case for addTimeSheets method with mandatory parameters. */ @Test(groups = {"wso2.esb"}, dependsOnMethods = {"testListUsersWithMandatoryParameters", - "testAddJobCodesWithMandatoryParameters"}, description = "tsheets {addTimeSheets} integration test with mandatory parameters.") + "testAddJobCodesWithMandatoryParameters"}, + description = "tsheets {addTimeSheets} integration test with mandatory parameters.") public void testAddTimeSheetsWithMandatoryParameters() throws IOException, JSONException { esbRequestHeadersMap.put("Action", "urn:addTimeSheets"); @@ -372,13 +380,15 @@ public void testAddTimeSheetsWithNegativeCase() throws IOException, JSONExceptio RestResponse esbRestResponse = sendJsonRestRequest(proxyUrl, "POST", esbRequestHeadersMap, "esb_addTimeSheets_negative.json"); - JSONObject esbResponseObject = esbRestResponse.getBody().getJSONObject("results").getJSONObject("timesheets").getJSONObject("1"); + JSONObject esbResponseObject = esbRestResponse.getBody().getJSONObject("results").getJSONObject("timesheets"). + getJSONObject("1"); String apiEndPoint = connectorProperties.getProperty("apiUrl") + "/api/v1/timesheets"; RestResponse apiRestResponse = sendJsonRestRequest(apiEndPoint, "POST", apiRequestHeadersMap, "api_addTimeSheets_negative.json"); - JSONObject apiResponseObject = apiRestResponse.getBody().getJSONObject("results").getJSONObject("timesheets").getJSONObject("1"); + JSONObject apiResponseObject = apiRestResponse.getBody().getJSONObject("results").getJSONObject("timesheets"). + getJSONObject("1"); Assert.assertEquals(apiRestResponse.getHttpStatusCode(), esbRestResponse.getHttpStatusCode()); Assert.assertEquals(apiResponseObject.getString("_status_code"), esbResponseObject.getString("_status_code")); Assert.assertEquals(apiResponseObject.getString("_status_message"), esbResponseObject.getString("_status_message")); @@ -387,10 +397,12 @@ public void testAddTimeSheetsWithNegativeCase() throws IOException, JSONExceptio /** * Positive test case for listTimeSheets method with mandatory parameters. */ - @Test(groups = {"wso2.esb"}, dependsOnMethods = {"testAddTimeSheetsWithMandatoryParameters"}, description = "tsheets {listTimeSheets} integration test with mandatory parameters.") + @Test(groups = {"wso2.esb"}, dependsOnMethods = {"testAddTimeSheetsWithMandatoryParameters"}, + description = "tsheets {listTimeSheets} integration test with mandatory parameters.") public void testListTimeSheetsWithMandatoryParameters() throws IOException, JSONException { esbRequestHeadersMap.put("Action", "urn:listTimeSheets"); + RestResponse esbRestResponse = sendJsonRestRequest(proxyUrl, "POST", esbRequestHeadersMap, "esb_listTimeSheets_mandatory.json"); @@ -398,8 +410,9 @@ public void testListTimeSheetsWithMandatoryParameters() throws IOException, JSON String apiEndPoint = connectorProperties.getProperty("apiUrl") + "/api/v1/timesheets?start_date=" - + connectorProperties.getProperty("timeSheetOneStart") + "&end_date=" - + connectorProperties.getProperty("timeSheetOneEnd"); + + connectorProperties.getProperty("listTimeSheetOneStart") + "&end_date=" + + connectorProperties.getProperty("listTimeSheetOneEnd"); + RestResponse apiRestResponse = sendJsonRestRequest(apiEndPoint, "GET", apiRequestHeadersMap); JSONObject apiTimeSheets = apiRestResponse.getBody().getJSONObject("results").getJSONObject("timesheets"); @@ -430,7 +443,8 @@ public void testListTimeSheetsWithMandatoryParameters() throws IOException, JSON * Positive test case for listTimeSheets method with optional parameters. */ @Test(groups = {"wso2.esb"}, dependsOnMethods = {"testListUsersWithMandatoryParameters", - "testAddTimeSheetsWithMandatoryParameters"}, description = "tsheets {listTimeSheets} integration test with optional parameters.") + "testAddTimeSheetsWithMandatoryParameters"}, + description = "tsheets {listTimeSheets} integration test with optional parameters.") public void testListTimeSheetsWithOptionalParameters() throws IOException, JSONException { esbRequestHeadersMap.put("Action", "urn:listTimeSheets"); @@ -441,8 +455,8 @@ public void testListTimeSheetsWithOptionalParameters() throws IOException, JSONE String apiEndPoint = connectorProperties.getProperty("apiUrl") + "/api/v1/timesheets?start_date=" - + connectorProperties.getProperty("timeSheetOneStart") + "&end_date=" - + connectorProperties.getProperty("timeSheetOneEnd") + "&user_ids=" + + connectorProperties.getProperty("listTimeSheetOneStart") + "&end_date=" + + connectorProperties.getProperty("listTimeSheetOneEnd") + "&user_ids=" + connectorProperties.getProperty("userId"); RestResponse apiRestResponse = sendJsonRestRequest(apiEndPoint, "GET", apiRequestHeadersMap); @@ -496,7 +510,8 @@ public void testListTimeSheetsWithNegativeCase() throws IOException, JSONExcepti * Positive test case for addJobCodeAssignments method with mandatory parameters. */ @Test(groups = {"wso2.esb"}, dependsOnMethods = {"testListUsersWithMandatoryParameters", - "testAddJobCodesWithMandatoryParameters"}, description = "tsheets {addJobCodeAssignments} integration test with mandatory parameters.") + "testAddJobCodesWithMandatoryParameters"}, + description = "tsheets {addJobCodeAssignments} integration test with mandatory parameters.") public void testAddJobCodeAssignmentsWithMandatoryParameters() throws IOException, JSONException { esbRequestHeadersMap.put("Action", "urn:addJobCodeAssignments"); @@ -509,7 +524,8 @@ public void testAddJobCodeAssignmentsWithMandatoryParameters() throws IOExceptio String jobCodeAssignmentUserId = esbJobCodeAssignment.getString("user_id"); String apiEndPoint = - connectorProperties.getProperty("apiUrl") + "/api/v1/jobcode_assignments?user_ids=" + jobCodeAssignmentUserId; + connectorProperties.getProperty("apiUrl") + "/api/v1/jobcode_assignments?user_ids=" + + jobCodeAssignmentUserId; RestResponse apiRestResponse = sendJsonRestRequest(apiEndPoint, "GET", apiRequestHeadersMap); JSONObject apiJobCodeAssignment = @@ -530,13 +546,15 @@ public void testAddJobCodeAssignmentsWithNegativeCase() throws IOException, JSON RestResponse esbRestResponse = sendJsonRestRequest(proxyUrl, "POST", esbRequestHeadersMap, "esb_addJobCodeAssignments_negative.json"); - JSONObject esbResponseObject = esbRestResponse.getBody().getJSONObject("results").getJSONObject("jobcode_assignments").getJSONObject("1"); + JSONObject esbResponseObject = esbRestResponse.getBody().getJSONObject("results"). + getJSONObject("jobcode_assignments").getJSONObject("1"); String apiEndPoint = connectorProperties.getProperty("apiUrl") + "/api/v1/jobcode_assignments"; RestResponse apiRestResponse = sendJsonRestRequest(apiEndPoint, "POST", apiRequestHeadersMap, "api_addJobCodeAssignments_negative.json"); - JSONObject apiResponseObject = apiRestResponse.getBody().getJSONObject("results").getJSONObject("jobcode_assignments").getJSONObject("1"); + JSONObject apiResponseObject = apiRestResponse.getBody().getJSONObject("results"). + getJSONObject("jobcode_assignments").getJSONObject("1"); Assert.assertEquals(apiRestResponse.getHttpStatusCode(), esbRestResponse.getHttpStatusCode()); Assert.assertEquals(apiResponseObject.getString("_status_code"), esbResponseObject.getString("_status_code")); @@ -547,20 +565,23 @@ public void testAddJobCodeAssignmentsWithNegativeCase() throws IOException, JSON /** * Positive test case for listJobCodeAssignments method with mandatory parameters. */ - @Test(groups = {"wso2.esb"}, dependsOnMethods = {"testAddJobCodeAssignmentsWithMandatoryParameters"}, description = "tsheets {listJobCodeAssignments} integration test with mandatory parameters.") + @Test(groups = {"wso2.esb"}, dependsOnMethods = {"testAddJobCodeAssignmentsWithMandatoryParameters"}, + description = "tsheets {listJobCodeAssignments} integration test with mandatory parameters.") public void testListJobCodeAssignmentsWithMandatoryParameters() throws IOException, JSONException { esbRequestHeadersMap.put("Action", "urn:listJobCodeAssignments"); RestResponse esbRestResponse = sendJsonRestRequest(proxyUrl, "POST", esbRequestHeadersMap, "esb_listJobCodeAssignments_mandatory.json"); - JSONObject esbJobAssignments = esbRestResponse.getBody().getJSONObject("results").getJSONObject("jobcode_assignments"); + JSONObject esbJobAssignments = esbRestResponse.getBody().getJSONObject("results"). + getJSONObject("jobcode_assignments"); String apiEndPoint = connectorProperties.getProperty("apiUrl") + "/api/v1/jobcode_assignments"; RestResponse apiRestResponse = sendJsonRestRequest(apiEndPoint, "GET", apiRequestHeadersMap); - JSONObject apiJobAssignments = apiRestResponse.getBody().getJSONObject("results").getJSONObject("jobcode_assignments"); + JSONObject apiJobAssignments = apiRestResponse.getBody().getJSONObject("results"). + getJSONObject("jobcode_assignments"); Iterator esbTimeSheetKeySet = esbJobAssignments.keys(); int count = 0; @@ -587,20 +608,23 @@ public void testListJobCodeAssignmentsWithMandatoryParameters() throws IOExcepti /** * Positive test case for listJobCodeAssignments method with optional parameters. */ - @Test(groups = {"wso2.esb"}, dependsOnMethods = {"testAddJobCodeAssignmentsWithMandatoryParameters"}, description = "tsheets {listJobCodeAssignments} integration test with optional parameters.") + @Test(groups = {"wso2.esb"}, dependsOnMethods = {"testAddJobCodeAssignmentsWithMandatoryParameters"}, + description = "tsheets {listJobCodeAssignments} integration test with optional parameters.") public void testListJobCodeAssignmentsWithOptionalParameters() throws IOException, JSONException { esbRequestHeadersMap.put("Action", "urn:listJobCodeAssignments"); RestResponse esbRestResponse = sendJsonRestRequest(proxyUrl, "POST", esbRequestHeadersMap, "esb_listJobCodeAssignments_optional.json"); - JSONObject esbJobAssignments = esbRestResponse.getBody().getJSONObject("results").getJSONObject("jobcode_assignments"); + JSONObject esbJobAssignments = esbRestResponse.getBody().getJSONObject("results"). + getJSONObject("jobcode_assignments"); String apiEndPoint = connectorProperties.getProperty("apiUrl") + "/api/v1/jobcode_assignments?page=2&per_page=1"; RestResponse apiRestResponse = sendJsonRestRequest(apiEndPoint, "GET", apiRequestHeadersMap); - JSONObject apiJobAssignments = apiRestResponse.getBody().getJSONObject("results").getJSONObject("jobcode_assignments"); + JSONObject apiJobAssignments = apiRestResponse.getBody().getJSONObject("results"). + getJSONObject("jobcode_assignments"); Iterator esbTimeSheetKeySet = esbJobAssignments.keys(); int count = 0; diff --git a/src/test/resources/artifacts/ESB/config/restRequests/tsheets/esb_listTimeSheets_mandatory.json b/src/test/resources/artifacts/ESB/config/restRequests/tsheets/esb_listTimeSheets_mandatory.json index 8128aef..e3bcfff 100644 --- a/src/test/resources/artifacts/ESB/config/restRequests/tsheets/esb_listTimeSheets_mandatory.json +++ b/src/test/resources/artifacts/ESB/config/restRequests/tsheets/esb_listTimeSheets_mandatory.json @@ -1,6 +1,6 @@ { "apiUrl": "%s(apiUrl)", "accessToken": "%s(accessToken)", - "timeSheetStartDate": "%s(timeSheetOneStart)", - "timeSheetEndDate": "%s(timeSheetOneEnd)" + "timeSheetStartDate": "%s(listTimeSheetOneStart)", + "timeSheetEndDate": "%s(listTimeSheetOneEnd)" } diff --git a/src/test/resources/artifacts/ESB/config/restRequests/tsheets/esb_listTimeSheets_optional.json b/src/test/resources/artifacts/ESB/config/restRequests/tsheets/esb_listTimeSheets_optional.json index b1c64ad..eb8d4f6 100644 --- a/src/test/resources/artifacts/ESB/config/restRequests/tsheets/esb_listTimeSheets_optional.json +++ b/src/test/resources/artifacts/ESB/config/restRequests/tsheets/esb_listTimeSheets_optional.json @@ -1,7 +1,7 @@ { "apiUrl": "%s(apiUrl)", "accessToken": "%s(accessToken)", - "timeSheetStartDate": "%s(timeSheetOneStart)", - "timeSheetEndDate": "%s(timeSheetOneEnd)", + "timeSheetStartDate": "%s(listTimeSheetOneStart)", + "timeSheetEndDate": "%s(listTimeSheetOneEnd)", "userIds": "%s(userId)" } diff --git a/src/test/resources/artifacts/ESB/connector/config/tsheets.properties b/src/test/resources/artifacts/ESB/connector/config/tsheets.properties index 6d82e4e..fc20192 100644 --- a/src/test/resources/artifacts/ESB/connector/config/tsheets.properties +++ b/src/test/resources/artifacts/ESB/connector/config/tsheets.properties @@ -2,7 +2,7 @@ proxyDirectoryRelativePath=/../src/test/resources/artifacts/ESB/config/proxies/t requestDirectoryRelativePath=/../src/test/resources/artifacts/ESB/config/restRequests/tsheets/ apiUrl=https://rest.tsheets.com -accessToken=S.1__730ab728db5db2f5a797363ce677ab3305f398da +accessToken=xxxxxxxxxxxxxxxxxxx #Job Codes jobCodeOneName=Job Code Name14