From 47be1fd00b8ce13f04d27e2d8d11f1255837836d Mon Sep 17 00:00:00 2001 From: Palash Ray Date: Mon, 4 May 2015 13:30:18 -0400 Subject: [PATCH 1/5] changes to get report scheduling working --- .../client/apiadapters/jobs/JobsService.java | 53 ++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/jaspersoft/jasperserver/jaxrs/client/apiadapters/jobs/JobsService.java b/src/main/java/com/jaspersoft/jasperserver/jaxrs/client/apiadapters/jobs/JobsService.java index dad714ea..956d0774 100644 --- a/src/main/java/com/jaspersoft/jasperserver/jaxrs/client/apiadapters/jobs/JobsService.java +++ b/src/main/java/com/jaspersoft/jasperserver/jaxrs/client/apiadapters/jobs/JobsService.java @@ -21,10 +21,21 @@ package com.jaspersoft.jasperserver.jaxrs.client.apiadapters.jobs; +import java.io.IOException; + +import org.codehaus.jackson.JsonNode; +import org.codehaus.jackson.map.ObjectMapper; + import com.jaspersoft.jasperserver.jaxrs.client.apiadapters.AbstractAdapter; import com.jaspersoft.jasperserver.jaxrs.client.apiadapters.jobs.calendar.CalendarType; import com.jaspersoft.jasperserver.jaxrs.client.apiadapters.jobs.calendar.SingleCalendarOperationsAdapter; -import com.jaspersoft.jasperserver.jaxrs.client.core.*; +import com.jaspersoft.jasperserver.jaxrs.client.core.Callback; +import com.jaspersoft.jasperserver.jaxrs.client.core.JRSVersion; +import com.jaspersoft.jasperserver.jaxrs.client.core.JerseyRequest; +import com.jaspersoft.jasperserver.jaxrs.client.core.MimeTypeUtil; +import com.jaspersoft.jasperserver.jaxrs.client.core.RequestExecution; +import com.jaspersoft.jasperserver.jaxrs.client.core.SessionStorage; +import com.jaspersoft.jasperserver.jaxrs.client.core.ThreadPoolUtil; import com.jaspersoft.jasperserver.jaxrs.client.core.operationresult.OperationResult; import com.jaspersoft.jasperserver.jaxrs.client.dto.jobs.Job; import com.jaspersoft.jasperserver.jaxrs.client.dto.jobs.jaxb.wrappers.CalendarNameListWrapper; @@ -113,4 +124,44 @@ public SingleCalendarOperationsAdapter calendar(String calendarName) { } return new SingleCalendarOperationsAdapter(sessionStorage, calendarName); } + + //START: palash: changes to get report scheduling working + public long scheduleReportWithHack(Job report) { + JerseyRequest request = buildRequest(sessionStorage, String.class, new String[]{"/jobs"}, new JobValidationErrorHandler()); + request.setContentType("application/job+json"); + request.setAccept("application/job+json"); + + String inputJson = getJsonString(); + + System.err.println("inputJson:\n" + inputJson); + + OperationResult result = request.put(inputJson); + String jsonResult = result.getEntity(); + + System.err.println("Result:\n" + jsonResult); + + JsonNode jsonNode; + try { + jsonNode = new ObjectMapper().readTree(jsonResult); + } catch (IOException e) { + throw new RuntimeException(e); + } + + return jsonNode.findValue("id").asLong(); + } + + private String getJsonString() { + String jsonString = "{\"username\":\"act_issapp_dev|dev\",\"label\":\"New Job for ISS Report\",\"description\":\"New Job for the report template: /reports/shared_registry_dynamic\"," + + "\"trigger\":{\"simpleTrigger\":{\"id\":112942,\"version\":0,\"startType\":1,\"misfireInstruction\":0,\"occurrenceCount\":4,\"recurrenceInterval\":1,\"recurrenceIntervalUnit\":\"DAY\"}}," + + "\"source\":{\"reportUnitURI\":\"/reports/shared_registry_dynamic\",\"parameters\":{\"parameterValues\":{\"CSV_EXPORT_PATH\":[\"cccc\"],\"SHOW_SORT_TITLE\":[\"false\"]," + + "\"HIGHLIGHT_NEW_INVESTORS\":[\"false\"],\"EXCLUDE_INVESTORS\":[\"false\"],\"AFTER_CASH_ONLY_REDEMPTIONS\":[\"false\"],\"CHANGE_VALUE_TO_BASE_CURRENCY\":[\"false\"]," + + "\"SHOW_INVESTOR_TOTALS\":[\"false\"],\"BALANCE_DATE\":[\"2015-01-31\"],\"FUND_ID\":[\"5449\"],\"SHOW_AFTER_TRANSACTIONS\":[\"false\"],\"REPORT_STATEMENT_ID\":[\"150000\"],\"LOT_LEVEL_DETAILS\":[\"false\"]," + + "\"SHOW_SORT_CATEGORY_SUMMARY\":[\"false\"],\"SORT_ORDER\":[\"HID\"]}}},\"baseOutputFilename\":\"portiss_report" + System.currentTimeMillis() + + "\",\"repositoryDestination\":{\"id\":112943,\"version\":-1,\"folderURI\":\"/scheduled_reports\",\"sequentialFilenames\":false,\"overwriteFiles\":false,\"saveToRepository\":true," + + "\"usingDefaultReportOutputFolderURI\":false,\"outputFTPInfo\":{\"userName\":\"anonymous\",\"type\":\"ftps\",\"port\":990,\"pbsz\":0,\"implicit\":true}},\"outputFormats\":{\"outputFormat\":[\"XLSX\",\"PDF\"]}}"; + return jsonString; + } + + //END: palash: changes to get report scheduling working + } From b10a641b29ce6daaf591df05076375419cfd8d29 Mon Sep 17 00:00:00 2001 From: Palash Ray Date: Mon, 4 May 2015 14:05:51 -0400 Subject: [PATCH 2/5] changes to get report scheduling working: getting rid of redundant text from json string --- .../jaxrs/client/apiadapters/jobs/JobsService.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/jaspersoft/jasperserver/jaxrs/client/apiadapters/jobs/JobsService.java b/src/main/java/com/jaspersoft/jasperserver/jaxrs/client/apiadapters/jobs/JobsService.java index 956d0774..ae97a12b 100644 --- a/src/main/java/com/jaspersoft/jasperserver/jaxrs/client/apiadapters/jobs/JobsService.java +++ b/src/main/java/com/jaspersoft/jasperserver/jaxrs/client/apiadapters/jobs/JobsService.java @@ -151,14 +151,14 @@ public long scheduleReportWithHack(Job report) { } private String getJsonString() { - String jsonString = "{\"username\":\"act_issapp_dev|dev\",\"label\":\"New Job for ISS Report\",\"description\":\"New Job for the report template: /reports/shared_registry_dynamic\"," - + "\"trigger\":{\"simpleTrigger\":{\"id\":112942,\"version\":0,\"startType\":1,\"misfireInstruction\":0,\"occurrenceCount\":4,\"recurrenceInterval\":1,\"recurrenceIntervalUnit\":\"DAY\"}}," + String jsonString = "{\"label\":\"New Job for ISS Report\",\"description\":\"New Job for the report template: /reports/shared_registry_dynamic\"," + + "\"trigger\":{\"simpleTrigger\":{\"startType\":1,\"misfireInstruction\":0,\"occurrenceCount\":4,\"recurrenceInterval\":1,\"recurrenceIntervalUnit\":\"DAY\"}}," + "\"source\":{\"reportUnitURI\":\"/reports/shared_registry_dynamic\",\"parameters\":{\"parameterValues\":{\"CSV_EXPORT_PATH\":[\"cccc\"],\"SHOW_SORT_TITLE\":[\"false\"]," + "\"HIGHLIGHT_NEW_INVESTORS\":[\"false\"],\"EXCLUDE_INVESTORS\":[\"false\"],\"AFTER_CASH_ONLY_REDEMPTIONS\":[\"false\"],\"CHANGE_VALUE_TO_BASE_CURRENCY\":[\"false\"]," + "\"SHOW_INVESTOR_TOTALS\":[\"false\"],\"BALANCE_DATE\":[\"2015-01-31\"],\"FUND_ID\":[\"5449\"],\"SHOW_AFTER_TRANSACTIONS\":[\"false\"],\"REPORT_STATEMENT_ID\":[\"150000\"],\"LOT_LEVEL_DETAILS\":[\"false\"]," + "\"SHOW_SORT_CATEGORY_SUMMARY\":[\"false\"],\"SORT_ORDER\":[\"HID\"]}}},\"baseOutputFilename\":\"portiss_report" + System.currentTimeMillis() - + "\",\"repositoryDestination\":{\"id\":112943,\"version\":-1,\"folderURI\":\"/scheduled_reports\",\"sequentialFilenames\":false,\"overwriteFiles\":false,\"saveToRepository\":true," - + "\"usingDefaultReportOutputFolderURI\":false,\"outputFTPInfo\":{\"userName\":\"anonymous\",\"type\":\"ftps\",\"port\":990,\"pbsz\":0,\"implicit\":true}},\"outputFormats\":{\"outputFormat\":[\"XLSX\",\"PDF\"]}}"; + + "\",\"repositoryDestination\":{\"folderURI\":\"/scheduled_reports\",\"sequentialFilenames\":false,\"overwriteFiles\":true,\"saveToRepository\":true," + + "\"usingDefaultReportOutputFolderURI\":false},\"outputFormats\":{\"outputFormat\":[\"XLSX\",\"PDF\"]}}"; return jsonString; } From de0b784d8bf5f97d6f7f822a2dde1d43f4353e0d Mon Sep 17 00:00:00 2001 From: Palash Ray Date: Mon, 4 May 2015 16:07:03 -0400 Subject: [PATCH 3/5] changes to get report scheduling working: maing the json string dynamic --- .../client/apiadapters/jobs/JobsService.java | 10 ++- .../apiadapters/jobs/JobsServiceTest.java | 85 ++++++++++++++++--- 2 files changed, 78 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/jaspersoft/jasperserver/jaxrs/client/apiadapters/jobs/JobsService.java b/src/main/java/com/jaspersoft/jasperserver/jaxrs/client/apiadapters/jobs/JobsService.java index ae97a12b..4ec84524 100644 --- a/src/main/java/com/jaspersoft/jasperserver/jaxrs/client/apiadapters/jobs/JobsService.java +++ b/src/main/java/com/jaspersoft/jasperserver/jaxrs/client/apiadapters/jobs/JobsService.java @@ -26,6 +26,7 @@ import org.codehaus.jackson.JsonNode; import org.codehaus.jackson.map.ObjectMapper; +import com.google.common.annotations.VisibleForTesting; import com.jaspersoft.jasperserver.jaxrs.client.apiadapters.AbstractAdapter; import com.jaspersoft.jasperserver.jaxrs.client.apiadapters.jobs.calendar.CalendarType; import com.jaspersoft.jasperserver.jaxrs.client.apiadapters.jobs.calendar.SingleCalendarOperationsAdapter; @@ -131,7 +132,7 @@ public long scheduleReportWithHack(Job report) { request.setContentType("application/job+json"); request.setAccept("application/job+json"); - String inputJson = getJsonString(); + String inputJson = getJobAsJsonString(report); System.err.println("inputJson:\n" + inputJson); @@ -150,8 +151,9 @@ public long scheduleReportWithHack(Job report) { return jsonNode.findValue("id").asLong(); } - private String getJsonString() { - String jsonString = "{\"label\":\"New Job for ISS Report\",\"description\":\"New Job for the report template: /reports/shared_registry_dynamic\"," + @VisibleForTesting + String getJobAsJsonString(Job report) { + String jsonStringTemplate = "{\"label\":\"%s\",\"description\":\"%s\"," + "\"trigger\":{\"simpleTrigger\":{\"startType\":1,\"misfireInstruction\":0,\"occurrenceCount\":4,\"recurrenceInterval\":1,\"recurrenceIntervalUnit\":\"DAY\"}}," + "\"source\":{\"reportUnitURI\":\"/reports/shared_registry_dynamic\",\"parameters\":{\"parameterValues\":{\"CSV_EXPORT_PATH\":[\"cccc\"],\"SHOW_SORT_TITLE\":[\"false\"]," + "\"HIGHLIGHT_NEW_INVESTORS\":[\"false\"],\"EXCLUDE_INVESTORS\":[\"false\"],\"AFTER_CASH_ONLY_REDEMPTIONS\":[\"false\"],\"CHANGE_VALUE_TO_BASE_CURRENCY\":[\"false\"]," @@ -159,6 +161,8 @@ private String getJsonString() { + "\"SHOW_SORT_CATEGORY_SUMMARY\":[\"false\"],\"SORT_ORDER\":[\"HID\"]}}},\"baseOutputFilename\":\"portiss_report" + System.currentTimeMillis() + "\",\"repositoryDestination\":{\"folderURI\":\"/scheduled_reports\",\"sequentialFilenames\":false,\"overwriteFiles\":true,\"saveToRepository\":true," + "\"usingDefaultReportOutputFolderURI\":false},\"outputFormats\":{\"outputFormat\":[\"XLSX\",\"PDF\"]}}"; + + String jsonString = String.format(jsonStringTemplate, report.getLabel(), report.getDescription()); return jsonString; } diff --git a/src/test/java/com/jaspersoft/jasperserver/jaxrs/client/apiadapters/jobs/JobsServiceTest.java b/src/test/java/com/jaspersoft/jasperserver/jaxrs/client/apiadapters/jobs/JobsServiceTest.java index fc086e3a..5b1387fe 100644 --- a/src/test/java/com/jaspersoft/jasperserver/jaxrs/client/apiadapters/jobs/JobsServiceTest.java +++ b/src/test/java/com/jaspersoft/jasperserver/jaxrs/client/apiadapters/jobs/JobsServiceTest.java @@ -1,5 +1,21 @@ package com.jaspersoft.jasperserver.jaxrs.client.apiadapters.jobs; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; + +import org.mockito.Mock; +import org.mockito.Mockito; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.testng.PowerMockTestCase; +import org.testng.Assert; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + import com.jaspersoft.jasperserver.jaxrs.client.apiadapters.jobs.calendar.CalendarType; import com.jaspersoft.jasperserver.jaxrs.client.apiadapters.jobs.calendar.SingleCalendarOperationsAdapter; import com.jaspersoft.jasperserver.jaxrs.client.core.Callback; @@ -10,19 +26,13 @@ import com.jaspersoft.jasperserver.jaxrs.client.core.RestClientConfiguration; import com.jaspersoft.jasperserver.jaxrs.client.core.SessionStorage; import com.jaspersoft.jasperserver.jaxrs.client.core.operationresult.OperationResult; +import com.jaspersoft.jasperserver.jaxrs.client.dto.jobs.IntervalUnitType; import com.jaspersoft.jasperserver.jaxrs.client.dto.jobs.Job; +import com.jaspersoft.jasperserver.jaxrs.client.dto.jobs.JobSource; +import com.jaspersoft.jasperserver.jaxrs.client.dto.jobs.OutputFormat; +import com.jaspersoft.jasperserver.jaxrs.client.dto.jobs.RepositoryDestination; +import com.jaspersoft.jasperserver.jaxrs.client.dto.jobs.SimpleTrigger; import com.jaspersoft.jasperserver.jaxrs.client.dto.jobs.jaxb.wrappers.CalendarNameListWrapper; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.testng.PowerMockTestCase; -import org.testng.Assert; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import java.util.concurrent.atomic.AtomicInteger; import static com.jaspersoft.jasperserver.jaxrs.client.core.JerseyRequest.buildRequest; import static org.mockito.Matchers.any; @@ -233,7 +243,6 @@ public void should_return_proper_op_result_object_when_param_is_not_null() { verify(wrapperRequestMock, times(1)).addParam("calendarType", CalendarType.daily.toString().toLowerCase()); } - @Test(testName = "calendars_with_param") public void should_return_proper_op_result_object_when_param_is_null() { @@ -257,7 +266,6 @@ public void should_return_proper_op_result_object_when_param_is_null() { verify(wrapperRequestMock, never()).addParam("calendarType", CalendarType.daily.toString().toLowerCase()); } - @Test(testName = "calendar") public void should_return_an_calendar_adapter() throws Exception { @@ -426,9 +434,58 @@ public Void execute(OperationResult data) { Mockito.verify(configurationMock).getJrsVersion(); } + @Test(testName = "getJobAsJsonString") + public void testGetJobAsJsonString() { + //given + String expected = "{\"label\":\"AAAAAAAAAAAAAAA\",\"description\":\"BBBBBBBBBBBBBBBBBBBBBB\"," + + "\"trigger\":{\"simpleTrigger\":{\"startType\":1,\"misfireInstruction\":0,\"occurrenceCount\":4,\"recurrenceInterval\":1,\"recurrenceIntervalUnit\":\"DAY\"}}," + + "\"source\":{\"reportUnitURI\":\"CCCCCCCCCCCCCCCCCCCC\",\"parameters\":{\"parameterValues\":{\"param_1\":[\"cccc\"],\"param_2\":[\"false\"]," + + "\"param_3\":[\"false\"],\"param_4\":[\"false\"]}}},\"baseOutputFilename\":\"DDDDDDDDDDDDDDDDDDDDD\"," + + "\"repositoryDestination\":{\"folderURI\":\"EEEEEEEEEEEEEEEEE\",\"sequentialFilenames\":false,\"overwriteFiles\":true,\"saveToRepository\":true," + + "\"usingDefaultReportOutputFolderURI\":false},\"outputFormats\":{\"outputFormat\":[\"XLSX\",\"PDF\"]}}"; + + Job job = new Job(); + job.setLabel("AAAAAAAAAAAAAAA"); + job.setDescription("BBBBBBBBBBBBBBBBBBBBBB"); + JobSource jobSource = new JobSource(); + jobSource.setReportUnitURI("CCCCCCCCCCCCCCCCCCCC"); + + Map parameters = new HashMap(); + parameters.put("param_1", "value_1"); + parameters.put("param_2", "value_2"); + parameters.put("param_3", "value_3"); + parameters.put("param_4", "value_4"); + + jobSource.setParameters(parameters); + job.setSource(jobSource); + Set outputFormats = new HashSet(); + outputFormats.add(OutputFormat.PDF); + outputFormats.add(OutputFormat.XLSX); + job.setOutputFormats(outputFormats); + RepositoryDestination repositoryDestination = new RepositoryDestination(); + repositoryDestination.setSaveToRepository(true); + repositoryDestination.setFolderURI("DDDDDDDDDDDDDDDDDDDDD"); + job.setRepositoryDestination(repositoryDestination); + SimpleTrigger trigger = new SimpleTrigger(); + trigger.setStartType(SimpleTrigger.START_TYPE_NOW); + trigger.setOccurrenceCount(4); + trigger.setRecurrenceInterval(1); + trigger.setRecurrenceIntervalUnit(IntervalUnitType.DAY); + job.setTrigger(trigger); + job.setBaseOutputFilename("EEEEEEEEEEEEEEEEE"); + + JobsService testClass = new JobsService(sessionStorageMock); + + //when + String result = testClass.getJobAsJsonString(job); + + //then + Assert.assertEquals(result, expected); + } + @AfterMethod public void after() { reset(sessionStorageMock, expectedAdapterMock, expectedJobOperationsAdapter, - jobRequestMock, expectedJobOperationResultMock, reportMock, configurationMock); + jobRequestMock, expectedJobOperationResultMock, reportMock, configurationMock); } } \ No newline at end of file From 3f30927571f6d389d5838f21a0082d5588e17044 Mon Sep 17 00:00:00 2001 From: Palash Ray Date: Mon, 4 May 2015 16:41:56 -0400 Subject: [PATCH 4/5] changes to get report scheduling working: making the json string dynamic --- .../client/apiadapters/jobs/JobsService.java | 69 ++++++++++++++++--- .../apiadapters/jobs/JobsServiceTest.java | 30 ++++---- 2 files changed, 75 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/jaspersoft/jasperserver/jaxrs/client/apiadapters/jobs/JobsService.java b/src/main/java/com/jaspersoft/jasperserver/jaxrs/client/apiadapters/jobs/JobsService.java index 4ec84524..b689fa72 100644 --- a/src/main/java/com/jaspersoft/jasperserver/jaxrs/client/apiadapters/jobs/JobsService.java +++ b/src/main/java/com/jaspersoft/jasperserver/jaxrs/client/apiadapters/jobs/JobsService.java @@ -22,6 +22,9 @@ package com.jaspersoft.jasperserver.jaxrs.client.apiadapters.jobs; import java.io.IOException; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; import org.codehaus.jackson.JsonNode; import org.codehaus.jackson.map.ObjectMapper; @@ -39,6 +42,9 @@ import com.jaspersoft.jasperserver.jaxrs.client.core.ThreadPoolUtil; import com.jaspersoft.jasperserver.jaxrs.client.core.operationresult.OperationResult; import com.jaspersoft.jasperserver.jaxrs.client.dto.jobs.Job; +import com.jaspersoft.jasperserver.jaxrs.client.dto.jobs.JobSource; +import com.jaspersoft.jasperserver.jaxrs.client.dto.jobs.OutputFormat; +import com.jaspersoft.jasperserver.jaxrs.client.dto.jobs.SimpleTrigger; import com.jaspersoft.jasperserver.jaxrs.client.dto.jobs.jaxb.wrappers.CalendarNameListWrapper; import static com.jaspersoft.jasperserver.jaxrs.client.core.JerseyRequest.buildRequest; @@ -152,20 +158,63 @@ public long scheduleReportWithHack(Job report) { } @VisibleForTesting - String getJobAsJsonString(Job report) { + String getJobAsJsonString(Job job) { + String jsonStringTemplate = "{\"label\":\"%s\",\"description\":\"%s\"," - + "\"trigger\":{\"simpleTrigger\":{\"startType\":1,\"misfireInstruction\":0,\"occurrenceCount\":4,\"recurrenceInterval\":1,\"recurrenceIntervalUnit\":\"DAY\"}}," - + "\"source\":{\"reportUnitURI\":\"/reports/shared_registry_dynamic\",\"parameters\":{\"parameterValues\":{\"CSV_EXPORT_PATH\":[\"cccc\"],\"SHOW_SORT_TITLE\":[\"false\"]," - + "\"HIGHLIGHT_NEW_INVESTORS\":[\"false\"],\"EXCLUDE_INVESTORS\":[\"false\"],\"AFTER_CASH_ONLY_REDEMPTIONS\":[\"false\"],\"CHANGE_VALUE_TO_BASE_CURRENCY\":[\"false\"]," - + "\"SHOW_INVESTOR_TOTALS\":[\"false\"],\"BALANCE_DATE\":[\"2015-01-31\"],\"FUND_ID\":[\"5449\"],\"SHOW_AFTER_TRANSACTIONS\":[\"false\"],\"REPORT_STATEMENT_ID\":[\"150000\"],\"LOT_LEVEL_DETAILS\":[\"false\"]," - + "\"SHOW_SORT_CATEGORY_SUMMARY\":[\"false\"],\"SORT_ORDER\":[\"HID\"]}}},\"baseOutputFilename\":\"portiss_report" + System.currentTimeMillis() - + "\",\"repositoryDestination\":{\"folderURI\":\"/scheduled_reports\",\"sequentialFilenames\":false,\"overwriteFiles\":true,\"saveToRepository\":true," - + "\"usingDefaultReportOutputFolderURI\":false},\"outputFormats\":{\"outputFormat\":[\"XLSX\",\"PDF\"]}}"; - - String jsonString = String.format(jsonStringTemplate, report.getLabel(), report.getDescription()); + + "\"trigger\":{\"simpleTrigger\":{\"startType\":%d,\"misfireInstruction\":%d,\"occurrenceCount\":%d,\"recurrenceInterval\":%d,\"recurrenceIntervalUnit\":\"%s\"}}," + + "\"source\":{\"reportUnitURI\":\"%s\",\"parameters\":{\"parameterValues\":%s}},\"baseOutputFilename\":\"%s\"," + + "\"repositoryDestination\":{\"folderURI\":\"%s\",\"sequentialFilenames\":false,\"overwriteFiles\":true,\"saveToRepository\":true," + + "\"usingDefaultReportOutputFolderURI\":false},\"outputFormats\":{\"outputFormat\":%s}}"; + + SimpleTrigger simpleTrigger = (SimpleTrigger) job.getTrigger(); + JobSource jobSource = job.getSource(); + + String jsonString = String.format(jsonStringTemplate, job.getLabel(), job.getDescription(), + simpleTrigger.getStartType(), simpleTrigger.getMisfireInstruction(), simpleTrigger.getOccurrenceCount(), + simpleTrigger.getRecurrenceInterval(), simpleTrigger.getRecurrenceIntervalUnit().name(), + jobSource.getReportUnitURI(), getReportParamsAsJsonString(jobSource.getParameters()), job.getBaseOutputFilename(), + job.getRepositoryDestination().getFolderURI(), + getOutputFormatsAsJsonString(job.getOutputFormats())); return jsonString; } + private String getReportParamsAsJsonString(Map reportParams) { + StringBuilder sb = new StringBuilder(100); + sb.append("{"); + + for (Entry paramKeyValue : reportParams.entrySet()) { + //key + sb.append('"').append(paramKeyValue.getKey()).append('"'); + sb.append(":"); + //value + sb.append("[\"").append(paramKeyValue.getValue()).append("\"]"); + sb.append(","); + } + + //remove the xtra , + sb.setLength(sb.length() - 1); + + sb.append("}"); + return sb.toString(); + } + + private String getOutputFormatsAsJsonString(Set outputFormats) { + StringBuilder sb = new StringBuilder(60); + + sb.append("["); + + for (OutputFormat outputFormat : outputFormats) { + sb.append('"').append(outputFormat.name()).append('"').append(","); + } + + //remove the xtra , + sb.setLength(sb.length() - 1); + + sb.append("]"); + + return sb.toString(); + } + //END: palash: changes to get report scheduling working } diff --git a/src/test/java/com/jaspersoft/jasperserver/jaxrs/client/apiadapters/jobs/JobsServiceTest.java b/src/test/java/com/jaspersoft/jasperserver/jaxrs/client/apiadapters/jobs/JobsServiceTest.java index 5b1387fe..ad98b061 100644 --- a/src/test/java/com/jaspersoft/jasperserver/jaxrs/client/apiadapters/jobs/JobsServiceTest.java +++ b/src/test/java/com/jaspersoft/jasperserver/jaxrs/client/apiadapters/jobs/JobsServiceTest.java @@ -1,7 +1,7 @@ package com.jaspersoft.jasperserver.jaxrs.client.apiadapters.jobs; -import java.util.HashMap; -import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; @@ -438,11 +438,11 @@ public Void execute(OperationResult data) { public void testGetJobAsJsonString() { //given String expected = "{\"label\":\"AAAAAAAAAAAAAAA\",\"description\":\"BBBBBBBBBBBBBBBBBBBBBB\"," - + "\"trigger\":{\"simpleTrigger\":{\"startType\":1,\"misfireInstruction\":0,\"occurrenceCount\":4,\"recurrenceInterval\":1,\"recurrenceIntervalUnit\":\"DAY\"}}," - + "\"source\":{\"reportUnitURI\":\"CCCCCCCCCCCCCCCCCCCC\",\"parameters\":{\"parameterValues\":{\"param_1\":[\"cccc\"],\"param_2\":[\"false\"]," - + "\"param_3\":[\"false\"],\"param_4\":[\"false\"]}}},\"baseOutputFilename\":\"DDDDDDDDDDDDDDDDDDDDD\"," + + "\"trigger\":{\"simpleTrigger\":{\"startType\":1,\"misfireInstruction\":6,\"occurrenceCount\":5,\"recurrenceInterval\":10,\"recurrenceIntervalUnit\":\"WEEK\"}}," + + "\"source\":{\"reportUnitURI\":\"CCCCCCCCCCCCCCCCCCCC\",\"parameters\":{\"parameterValues\":{\"param_1\":[\"value_1\"],\"param_2\":[\"value_2\"]," + + "\"param_3\":[\"value_3\"],\"param_4\":[\"value_4\"]}}},\"baseOutputFilename\":\"DDDDDDDDDDDDDDDDDDDDD\"," + "\"repositoryDestination\":{\"folderURI\":\"EEEEEEEEEEEEEEEEE\",\"sequentialFilenames\":false,\"overwriteFiles\":true,\"saveToRepository\":true," - + "\"usingDefaultReportOutputFolderURI\":false},\"outputFormats\":{\"outputFormat\":[\"XLSX\",\"PDF\"]}}"; + + "\"usingDefaultReportOutputFolderURI\":false},\"outputFormats\":{\"outputFormat\":[\"XLSX\",\"PDF\",\"CSV\"]}}"; Job job = new Job(); job.setLabel("AAAAAAAAAAAAAAA"); @@ -450,7 +450,7 @@ public void testGetJobAsJsonString() { JobSource jobSource = new JobSource(); jobSource.setReportUnitURI("CCCCCCCCCCCCCCCCCCCC"); - Map parameters = new HashMap(); + Map parameters = new LinkedHashMap(); parameters.put("param_1", "value_1"); parameters.put("param_2", "value_2"); parameters.put("param_3", "value_3"); @@ -458,21 +458,23 @@ public void testGetJobAsJsonString() { jobSource.setParameters(parameters); job.setSource(jobSource); - Set outputFormats = new HashSet(); - outputFormats.add(OutputFormat.PDF); + Set outputFormats = new LinkedHashSet(); outputFormats.add(OutputFormat.XLSX); + outputFormats.add(OutputFormat.PDF); + outputFormats.add(OutputFormat.CSV); job.setOutputFormats(outputFormats); RepositoryDestination repositoryDestination = new RepositoryDestination(); repositoryDestination.setSaveToRepository(true); - repositoryDestination.setFolderURI("DDDDDDDDDDDDDDDDDDDDD"); + repositoryDestination.setFolderURI("EEEEEEEEEEEEEEEEE"); job.setRepositoryDestination(repositoryDestination); SimpleTrigger trigger = new SimpleTrigger(); trigger.setStartType(SimpleTrigger.START_TYPE_NOW); - trigger.setOccurrenceCount(4); - trigger.setRecurrenceInterval(1); - trigger.setRecurrenceIntervalUnit(IntervalUnitType.DAY); + trigger.setMisfireInstruction(6); + trigger.setOccurrenceCount(5); + trigger.setRecurrenceInterval(10); + trigger.setRecurrenceIntervalUnit(IntervalUnitType.WEEK); job.setTrigger(trigger); - job.setBaseOutputFilename("EEEEEEEEEEEEEEEEE"); + job.setBaseOutputFilename("DDDDDDDDDDDDDDDDDDDDD"); JobsService testClass = new JobsService(sessionStorageMock); From b5ddcb4344d681580726c3e5bae873626a825687 Mon Sep 17 00:00:00 2001 From: Palash Ray Date: Thu, 18 Feb 2016 12:11:49 -0500 Subject: [PATCH 5/5] support saving reports to local file system --- .../client/apiadapters/jobs/JobsService.java | 451 +++++++++--------- 1 file changed, 231 insertions(+), 220 deletions(-) diff --git a/src/main/java/com/jaspersoft/jasperserver/jaxrs/client/apiadapters/jobs/JobsService.java b/src/main/java/com/jaspersoft/jasperserver/jaxrs/client/apiadapters/jobs/JobsService.java index b689fa72..0c70ddbf 100644 --- a/src/main/java/com/jaspersoft/jasperserver/jaxrs/client/apiadapters/jobs/JobsService.java +++ b/src/main/java/com/jaspersoft/jasperserver/jaxrs/client/apiadapters/jobs/JobsService.java @@ -1,220 +1,231 @@ -/* - * Copyright (C) 2005 - 2014 Jaspersoft Corporation. All rights reserved. - * http://www.jaspersoft.com. - * - * Unless you have purchased a commercial license agreement from Jaspersoft, - * the following license terms apply: - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program.  If not, see . - */ - -package com.jaspersoft.jasperserver.jaxrs.client.apiadapters.jobs; - -import java.io.IOException; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - -import org.codehaus.jackson.JsonNode; -import org.codehaus.jackson.map.ObjectMapper; - -import com.google.common.annotations.VisibleForTesting; -import com.jaspersoft.jasperserver.jaxrs.client.apiadapters.AbstractAdapter; -import com.jaspersoft.jasperserver.jaxrs.client.apiadapters.jobs.calendar.CalendarType; -import com.jaspersoft.jasperserver.jaxrs.client.apiadapters.jobs.calendar.SingleCalendarOperationsAdapter; -import com.jaspersoft.jasperserver.jaxrs.client.core.Callback; -import com.jaspersoft.jasperserver.jaxrs.client.core.JRSVersion; -import com.jaspersoft.jasperserver.jaxrs.client.core.JerseyRequest; -import com.jaspersoft.jasperserver.jaxrs.client.core.MimeTypeUtil; -import com.jaspersoft.jasperserver.jaxrs.client.core.RequestExecution; -import com.jaspersoft.jasperserver.jaxrs.client.core.SessionStorage; -import com.jaspersoft.jasperserver.jaxrs.client.core.ThreadPoolUtil; -import com.jaspersoft.jasperserver.jaxrs.client.core.operationresult.OperationResult; -import com.jaspersoft.jasperserver.jaxrs.client.dto.jobs.Job; -import com.jaspersoft.jasperserver.jaxrs.client.dto.jobs.JobSource; -import com.jaspersoft.jasperserver.jaxrs.client.dto.jobs.OutputFormat; -import com.jaspersoft.jasperserver.jaxrs.client.dto.jobs.SimpleTrigger; -import com.jaspersoft.jasperserver.jaxrs.client.dto.jobs.jaxb.wrappers.CalendarNameListWrapper; - -import static com.jaspersoft.jasperserver.jaxrs.client.core.JerseyRequest.buildRequest; - -public class JobsService extends AbstractAdapter { - - public JobsService(SessionStorage sessionStorage) { - super(sessionStorage); - } - - public BatchJobsOperationsAdapter jobs() { - return new BatchJobsOperationsAdapter(sessionStorage); - } - - public SingleJobOperationsAdapter job(long jobId) { - return new SingleJobOperationsAdapter(sessionStorage, String.valueOf(jobId)); - } - - public OperationResult scheduleReport(Job report) { - JerseyRequest request = buildRequest(sessionStorage, Job.class, new String[]{"/jobs"}, new JobValidationErrorHandler()); - if (sessionStorage.getConfiguration().getJrsVersion().compareTo(JRSVersion.v5_5_0) > 0) { - request.setContentType(MimeTypeUtil.toCorrectContentMime(sessionStorage.getConfiguration(), "application/job+{mime}")); - request.setAccept(MimeTypeUtil.toCorrectAcceptMime(sessionStorage.getConfiguration(), "application/job+{mime}")); - } else { - request.setContentType("application/job+json"); - request.setAccept("application/job+json"); - } - return request.put(report); - } - - public RequestExecution asyncScheduleReport(final Job report, final Callback, R> callback) { - final JerseyRequest request = buildRequest(sessionStorage, Job.class, new String[]{"/jobs"}, new JobValidationErrorHandler()); - if (sessionStorage.getConfiguration().getJrsVersion().compareTo(JRSVersion.v5_5_0) > 0) { - request.setContentType(MimeTypeUtil.toCorrectContentMime(sessionStorage.getConfiguration(), "application/job+{mime}")); - request.setAccept(MimeTypeUtil.toCorrectAcceptMime(sessionStorage.getConfiguration(), "application/job+{mime}")); - } else { - request.setContentType("application/job+json"); - request.setAccept("application/job+json"); - } - RequestExecution task = new RequestExecution(new Runnable() { - @Override - public void run() { - callback.execute(request.put(report)); - } - }); - ThreadPoolUtil.runAsynchronously(task); - return task; - } - - public OperationResult calendars() { - return calendars(null); - } - - public RequestExecution asyncCalendars(final Callback, R> callback) { - return asyncCalendars(null, callback); - } - - public OperationResult calendars(CalendarType type) { - JerseyRequest request = buildRequest(sessionStorage, CalendarNameListWrapper.class, new String[]{"/jobs", "/calendars"}); - if (type != null) { - request.addParam("calendarType", type.name().toLowerCase()); - } - return request.get(); - } - - public RequestExecution asyncCalendars(final CalendarType type, final Callback, R> callback) { - final JerseyRequest request = buildRequest(sessionStorage, CalendarNameListWrapper.class, new String[]{"/jobs", "/calendars"}); - if (type != null) { - request.addParam("calendarType", type.name().toLowerCase()); - } - RequestExecution task = new RequestExecution(new Runnable() { - @Override - public void run() { - callback.execute(request.get()); - } - }); - ThreadPoolUtil.runAsynchronously(task); - return task; - } - - public SingleCalendarOperationsAdapter calendar(String calendarName) { - if ("".equals(calendarName) || "/".equals(calendarName)) { - throw new IllegalArgumentException("'calendarName' mustn't be an empty string"); - } - return new SingleCalendarOperationsAdapter(sessionStorage, calendarName); - } - - //START: palash: changes to get report scheduling working - public long scheduleReportWithHack(Job report) { - JerseyRequest request = buildRequest(sessionStorage, String.class, new String[]{"/jobs"}, new JobValidationErrorHandler()); - request.setContentType("application/job+json"); - request.setAccept("application/job+json"); - - String inputJson = getJobAsJsonString(report); - - System.err.println("inputJson:\n" + inputJson); - - OperationResult result = request.put(inputJson); - String jsonResult = result.getEntity(); - - System.err.println("Result:\n" + jsonResult); - - JsonNode jsonNode; - try { - jsonNode = new ObjectMapper().readTree(jsonResult); - } catch (IOException e) { - throw new RuntimeException(e); - } - - return jsonNode.findValue("id").asLong(); - } - - @VisibleForTesting - String getJobAsJsonString(Job job) { - - String jsonStringTemplate = "{\"label\":\"%s\",\"description\":\"%s\"," - + "\"trigger\":{\"simpleTrigger\":{\"startType\":%d,\"misfireInstruction\":%d,\"occurrenceCount\":%d,\"recurrenceInterval\":%d,\"recurrenceIntervalUnit\":\"%s\"}}," - + "\"source\":{\"reportUnitURI\":\"%s\",\"parameters\":{\"parameterValues\":%s}},\"baseOutputFilename\":\"%s\"," - + "\"repositoryDestination\":{\"folderURI\":\"%s\",\"sequentialFilenames\":false,\"overwriteFiles\":true,\"saveToRepository\":true," - + "\"usingDefaultReportOutputFolderURI\":false},\"outputFormats\":{\"outputFormat\":%s}}"; - - SimpleTrigger simpleTrigger = (SimpleTrigger) job.getTrigger(); - JobSource jobSource = job.getSource(); - - String jsonString = String.format(jsonStringTemplate, job.getLabel(), job.getDescription(), - simpleTrigger.getStartType(), simpleTrigger.getMisfireInstruction(), simpleTrigger.getOccurrenceCount(), - simpleTrigger.getRecurrenceInterval(), simpleTrigger.getRecurrenceIntervalUnit().name(), - jobSource.getReportUnitURI(), getReportParamsAsJsonString(jobSource.getParameters()), job.getBaseOutputFilename(), - job.getRepositoryDestination().getFolderURI(), - getOutputFormatsAsJsonString(job.getOutputFormats())); - return jsonString; - } - - private String getReportParamsAsJsonString(Map reportParams) { - StringBuilder sb = new StringBuilder(100); - sb.append("{"); - - for (Entry paramKeyValue : reportParams.entrySet()) { - //key - sb.append('"').append(paramKeyValue.getKey()).append('"'); - sb.append(":"); - //value - sb.append("[\"").append(paramKeyValue.getValue()).append("\"]"); - sb.append(","); - } - - //remove the xtra , - sb.setLength(sb.length() - 1); - - sb.append("}"); - return sb.toString(); - } - - private String getOutputFormatsAsJsonString(Set outputFormats) { - StringBuilder sb = new StringBuilder(60); - - sb.append("["); - - for (OutputFormat outputFormat : outputFormats) { - sb.append('"').append(outputFormat.name()).append('"').append(","); - } - - //remove the xtra , - sb.setLength(sb.length() - 1); - - sb.append("]"); - - return sb.toString(); - } - - //END: palash: changes to get report scheduling working - -} +/* + * Copyright (C) 2005 - 2014 Jaspersoft Corporation. All rights reserved. + * http://www.jaspersoft.com. + * + * Unless you have purchased a commercial license agreement from Jaspersoft, + * the following license terms apply: + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program.  If not, see . + */ + +package com.jaspersoft.jasperserver.jaxrs.client.apiadapters.jobs; + +import java.io.IOException; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import org.codehaus.jackson.JsonNode; +import org.codehaus.jackson.map.ObjectMapper; + +import com.google.common.annotations.VisibleForTesting; +import com.jaspersoft.jasperserver.jaxrs.client.apiadapters.AbstractAdapter; +import com.jaspersoft.jasperserver.jaxrs.client.apiadapters.jobs.calendar.CalendarType; +import com.jaspersoft.jasperserver.jaxrs.client.apiadapters.jobs.calendar.SingleCalendarOperationsAdapter; +import com.jaspersoft.jasperserver.jaxrs.client.core.Callback; +import com.jaspersoft.jasperserver.jaxrs.client.core.JRSVersion; +import com.jaspersoft.jasperserver.jaxrs.client.core.JerseyRequest; +import com.jaspersoft.jasperserver.jaxrs.client.core.MimeTypeUtil; +import com.jaspersoft.jasperserver.jaxrs.client.core.RequestExecution; +import com.jaspersoft.jasperserver.jaxrs.client.core.SessionStorage; +import com.jaspersoft.jasperserver.jaxrs.client.core.ThreadPoolUtil; +import com.jaspersoft.jasperserver.jaxrs.client.core.operationresult.OperationResult; +import com.jaspersoft.jasperserver.jaxrs.client.dto.jobs.Job; +import com.jaspersoft.jasperserver.jaxrs.client.dto.jobs.JobSource; +import com.jaspersoft.jasperserver.jaxrs.client.dto.jobs.OutputFormat; +import com.jaspersoft.jasperserver.jaxrs.client.dto.jobs.SimpleTrigger; +import com.jaspersoft.jasperserver.jaxrs.client.dto.jobs.jaxb.wrappers.CalendarNameListWrapper; + +import static com.jaspersoft.jasperserver.jaxrs.client.core.JerseyRequest.buildRequest; + +public class JobsService extends AbstractAdapter { + + public JobsService(SessionStorage sessionStorage) { + super(sessionStorage); + } + + public BatchJobsOperationsAdapter jobs() { + return new BatchJobsOperationsAdapter(sessionStorage); + } + + public SingleJobOperationsAdapter job(long jobId) { + return new SingleJobOperationsAdapter(sessionStorage, String.valueOf(jobId)); + } + + public OperationResult scheduleReport(Job report) { + JerseyRequest request = buildRequest(sessionStorage, Job.class, new String[]{"/jobs"}, new JobValidationErrorHandler()); + if (sessionStorage.getConfiguration().getJrsVersion().compareTo(JRSVersion.v5_5_0) > 0) { + request.setContentType(MimeTypeUtil.toCorrectContentMime(sessionStorage.getConfiguration(), "application/job+{mime}")); + request.setAccept(MimeTypeUtil.toCorrectAcceptMime(sessionStorage.getConfiguration(), "application/job+{mime}")); + } else { + request.setContentType("application/job+json"); + request.setAccept("application/job+json"); + } + return request.put(report); + } + + public RequestExecution asyncScheduleReport(final Job report, final Callback, R> callback) { + final JerseyRequest request = buildRequest(sessionStorage, Job.class, new String[]{"/jobs"}, new JobValidationErrorHandler()); + if (sessionStorage.getConfiguration().getJrsVersion().compareTo(JRSVersion.v5_5_0) > 0) { + request.setContentType(MimeTypeUtil.toCorrectContentMime(sessionStorage.getConfiguration(), "application/job+{mime}")); + request.setAccept(MimeTypeUtil.toCorrectAcceptMime(sessionStorage.getConfiguration(), "application/job+{mime}")); + } else { + request.setContentType("application/job+json"); + request.setAccept("application/job+json"); + } + RequestExecution task = new RequestExecution(new Runnable() { + @Override + public void run() { + callback.execute(request.put(report)); + } + }); + ThreadPoolUtil.runAsynchronously(task); + return task; + } + + public OperationResult calendars() { + return calendars(null); + } + + public RequestExecution asyncCalendars(final Callback, R> callback) { + return asyncCalendars(null, callback); + } + + public OperationResult calendars(CalendarType type) { + JerseyRequest request = buildRequest(sessionStorage, CalendarNameListWrapper.class, new String[]{"/jobs", "/calendars"}); + if (type != null) { + request.addParam("calendarType", type.name().toLowerCase()); + } + return request.get(); + } + + public RequestExecution asyncCalendars(final CalendarType type, final Callback, R> callback) { + final JerseyRequest request = buildRequest(sessionStorage, CalendarNameListWrapper.class, new String[]{"/jobs", "/calendars"}); + if (type != null) { + request.addParam("calendarType", type.name().toLowerCase()); + } + RequestExecution task = new RequestExecution(new Runnable() { + @Override + public void run() { + callback.execute(request.get()); + } + }); + ThreadPoolUtil.runAsynchronously(task); + return task; + } + + public SingleCalendarOperationsAdapter calendar(String calendarName) { + if ("".equals(calendarName) || "/".equals(calendarName)) { + throw new IllegalArgumentException("'calendarName' mustn't be an empty string"); + } + return new SingleCalendarOperationsAdapter(sessionStorage, calendarName); + } + + //START: palash: changes to get report scheduling working + public long scheduleReportWithHack(Job report) { + JerseyRequest request = buildRequest(sessionStorage, String.class, new String[]{"/jobs"}, new JobValidationErrorHandler()); + request.setContentType("application/job+json"); + request.setAccept("application/job+json"); + + String inputJson = getJobAsJsonString(report); + + System.err.println("inputJson:\n" + inputJson); + + OperationResult result = request.put(inputJson); + String jsonResult = result.getEntity(); + + System.err.println("Result:\n" + jsonResult); + + JsonNode jsonNode; + try { + jsonNode = new ObjectMapper().readTree(jsonResult); + } catch (IOException e) { + throw new RuntimeException(e); + } + + return jsonNode.findValue("id").asLong(); + } + + @VisibleForTesting + String getJobAsJsonString(Job job) { + + String jsonStringTemplate = "{\"label\":\"%s\",\"description\":\"%s\"," + + "\"trigger\":{\"simpleTrigger\":{\"startType\":%d,\"misfireInstruction\":%d,\"occurrenceCount\":%d%s}}," + + "\"source\":{\"reportUnitURI\":\"%s\",\"parameters\":{\"parameterValues\":%s}},\"baseOutputFilename\":\"%s\"," + + "\"repositoryDestination\":{\"folderURI\":\"%s\",\"outputLocalFolder\":\"%s\",\"sequentialFilenames\":false,\"overwriteFiles\":true,\"saveToRepository\":%s," + + "\"usingDefaultReportOutputFolderURI\":false},\"outputFormats\":{\"outputFormat\":%s}}"; + + + JobSource jobSource = job.getSource(); + SimpleTrigger simpleTrigger = (SimpleTrigger) job.getTrigger(); + + String recurrenceDetails; + + if (simpleTrigger.getOccurrenceCount() > 1){ + recurrenceDetails = ",\"recurrenceInterval\":"+simpleTrigger.getRecurrenceInterval() + + ",\"recurrenceIntervalUnit\":\""+simpleTrigger.getRecurrenceIntervalUnit().name() + + "\""; + } else { + recurrenceDetails=""; + } + + String jsonString = String.format(jsonStringTemplate, job.getLabel(), job.getDescription(), simpleTrigger.getStartType(), + simpleTrigger.getMisfireInstruction(), simpleTrigger.getOccurrenceCount(),recurrenceDetails, + jobSource.getReportUnitURI(), getReportParamsAsJsonString(jobSource.getParameters()), job.getBaseOutputFilename(), job.getRepositoryDestination().getFolderURI(), + job.getRepositoryDestination().getOutputLocalFolder(),job.getRepositoryDestination().isSaveToRepository(), getOutputFormatsAsJsonString(job.getOutputFormats())); + + + return jsonString; + } + + private String getReportParamsAsJsonString(Map reportParams) { + StringBuilder sb = new StringBuilder(100); + sb.append("{"); + + for (Entry paramKeyValue : reportParams.entrySet()) { + //key + sb.append('"').append(paramKeyValue.getKey()).append('"'); + sb.append(":"); + //value + sb.append("[\"").append(paramKeyValue.getValue()).append("\"]"); + sb.append(","); + } + + //remove the xtra , + sb.setLength(sb.length() - 1); + + sb.append("}"); + return sb.toString(); + } + + private String getOutputFormatsAsJsonString(Set outputFormats) { + StringBuilder sb = new StringBuilder(60); + + sb.append("["); + + for (OutputFormat outputFormat : outputFormats) { + sb.append('"').append(outputFormat.name()).append('"').append(","); + } + + //remove the xtra , + sb.setLength(sb.length() - 1); + + sb.append("]"); + + return sb.toString(); + } + + //END: palash: changes to get report scheduling working + +} \ No newline at end of file