From ebd118941e86d52657846f9b1183f9bc29fb2def Mon Sep 17 00:00:00 2001 From: Jakub Banasiewicz Date: Thu, 8 Sep 2016 14:57:12 +0200 Subject: [PATCH 001/202] MOTECH-2908 Added Encounter UUID as post-action field --- .../openmrs/tasks/OpenMRSActionProxyService.java | 5 +++-- .../motechproject/openmrs/tasks/builder/ActionBuilder.java | 4 ++++ .../motechproject/openmrs/tasks/constants/DisplayNames.java | 1 + .../openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java | 4 ++-- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSActionProxyService.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSActionProxyService.java index 065575763..07dbd6106 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSActionProxyService.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSActionProxyService.java @@ -1,6 +1,7 @@ package org.motechproject.openmrs.tasks; import org.joda.time.DateTime; +import org.motechproject.openmrs.domain.Encounter; import org.motechproject.openmrs.domain.Patient; import java.util.Map; @@ -28,8 +29,8 @@ public interface OpenMRSActionProxyService { * @param providerUuid the provider uuid * @param observations the map of observations where concept name is a key and value from the observation is a value */ - void createEncounter(String configName, DateTime encounterDatetime, String encounterType, String locationName, - String patientUuid, String providerUuid, Map observations); + Encounter createEncounter(String configName, DateTime encounterDatetime, String encounterType, String locationName, + String patientUuid, String providerUuid, Map observations); /** * Creates a patient with the given params. The required fields are : {@code givenName}, {@code familyName}, diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/builder/ActionBuilder.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/builder/ActionBuilder.java index 350d86ce0..0fcddb93f 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/builder/ActionBuilder.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/builder/ActionBuilder.java @@ -72,6 +72,7 @@ private void buildActionsForVersionGreaterThan19(Config config, String configNam private ActionEventRequest buildCreateEncounterAction(String configName) { SortedSet actionParameters = new TreeSet<>(); + SortedSet postActionParameters = new TreeSet<>(); int order = 0; String serviceMethod = "createEncounter"; @@ -84,12 +85,15 @@ private ActionEventRequest buildCreateEncounterAction(String configName) { actionParameters.add(prepareParameter(Keys.PROVIDER_UUID, DisplayNames.PROVIDER_UUID, true, order++)); actionParameters.add(prepareParameter(Keys.OBSERVATION, DisplayNames.OBSERVATION, MAP, false, order)); + postActionParameters.add(prepareParameter(Keys.UUID, DisplayNames.ENCOUNTER_UUID, false, 0)); + return new ActionEventRequestBuilder() .setDisplayName(getDisplayName(CREATE_ENCOUNTER, configName)) .setServiceInterface(OPENMRS_ACTION_PROXY_SERVICE) .setServiceMethod(serviceMethod) .setSubject(getSubject(serviceMethod, configName)) .setActionParameters(actionParameters) + .setPostActionParameters(postActionParameters) .createActionEventRequest(); } diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/constants/DisplayNames.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/constants/DisplayNames.java index fcc32acdc..d98d0b248 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/constants/DisplayNames.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/constants/DisplayNames.java @@ -14,6 +14,7 @@ public final class DisplayNames { public static final String PATIENT_UUID = "openMRS.patient.uuid"; public static final String PROVIDER_UUID = "openMRS.provider.uuid"; public static final String OBSERVATION = "openMRS.encounter.observation"; + public static final String ENCOUNTER_UUID = "openMRS.encounter.uuid"; //Patient action public static final String PERSON_UUID = "openMRS.person.uuid"; diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java index 8693a3f1e..372f5a359 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java @@ -62,7 +62,7 @@ public class OpenMRSActionProxyServiceImpl implements OpenMRSActionProxyService private EventRelay eventRelay; @Override - public void createEncounter(String configName, DateTime encounterDatetime, String encounterType, + public Encounter createEncounter(String configName, DateTime encounterDatetime, String encounterType, String locationName, String patientUuid, String providerUuid, Map observations) { Location location = getLocationByName(configName, locationName); @@ -75,7 +75,7 @@ public void createEncounter(String configName, DateTime encounterDatetime, Strin EncounterType type = new EncounterType(encounterType); Encounter encounter = new Encounter(location, type, encounterDatetime.toDate(), patient, Collections.singletonList(provider.getPerson()), observationList); - encounterService.createEncounter(configName, encounter); + return encounterService.createEncounter(configName, encounter); } @Override From 388e1857a8506482b3141bfdf18e330713514ab3 Mon Sep 17 00:00:00 2001 From: Jakub Banasiewicz Date: Fri, 9 Sep 2016 13:03:27 +0200 Subject: [PATCH 002/202] MOTECH-2908 Encounter UUID as post-action field --- .../openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java b/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java index 56315aebd..b8e4a1480 100644 --- a/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java +++ b/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java @@ -46,6 +46,7 @@ import java.util.Map; import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertTrue; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; @@ -124,6 +125,7 @@ public void shouldCreateEncounterWithGivenParameters() { doReturn(patient).when(patientService).getPatientByUuid(eq(CONFIG_NAME), eq(patient.getUuid())); doReturn(provider).when(providerService).getProviderByUuid(eq(CONFIG_NAME), eq(provider.getUuid())); + doReturn(encounter).when(encounterService).createEncounter(eq(CONFIG_NAME), eq(encounter)); doReturn(Collections.singletonList(location)) .when(locationService).getLocations(eq(CONFIG_NAME), eq(location.getName())); @@ -134,6 +136,9 @@ public void shouldCreateEncounterWithGivenParameters() { verify(encounterService).createEncounter(eq(CONFIG_NAME), encounterCaptor.capture()); assertEquals(encounter, encounterCaptor.getValue()); + assertEquals(encounter, openMRSActionProxyService.createEncounter(CONFIG_NAME, new DateTime(encounter.getEncounterDatetime()), + encounter.getEncounterType().getName(), location.getName(), patient.getUuid(), provider.getUuid(), + observations)); } @Test From d0ad3bb50a141917d11d1682d433787d2866b78b Mon Sep 17 00:00:00 2001 From: Jakub Banasiewicz Date: Fri, 9 Sep 2016 13:10:02 +0200 Subject: [PATCH 003/202] MOTECH-2809 Added Encounter UUID as post-action field --- .../openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java b/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java index b8e4a1480..dcf7b649e 100644 --- a/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java +++ b/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java @@ -46,7 +46,6 @@ import java.util.Map; import static junit.framework.Assert.assertEquals; -import static junit.framework.Assert.assertTrue; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; From a0dfeef85706c82727e8b30589c1e3ea1a607faa Mon Sep 17 00:00:00 2001 From: Jakub Banasiewicz Date: Fri, 9 Sep 2016 13:30:39 +0200 Subject: [PATCH 004/202] MOTECH-2908 Added Encounter UUID as post-action field --- .../openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java b/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java index dcf7b649e..326b1fecd 100644 --- a/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java +++ b/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java @@ -128,16 +128,13 @@ public void shouldCreateEncounterWithGivenParameters() { doReturn(Collections.singletonList(location)) .when(locationService).getLocations(eq(CONFIG_NAME), eq(location.getName())); - openMRSActionProxyService.createEncounter(CONFIG_NAME, new DateTime(encounter.getEncounterDatetime()), + Encounter encounterCreated = openMRSActionProxyService.createEncounter(CONFIG_NAME, new DateTime(encounter.getEncounterDatetime()), encounter.getEncounterType().getName(), location.getName(), patient.getUuid(), provider.getUuid(), observations); verify(encounterService).createEncounter(eq(CONFIG_NAME), encounterCaptor.capture()); - assertEquals(encounter, encounterCaptor.getValue()); - assertEquals(encounter, openMRSActionProxyService.createEncounter(CONFIG_NAME, new DateTime(encounter.getEncounterDatetime()), - encounter.getEncounterType().getName(), location.getName(), patient.getUuid(), provider.getUuid(), - observations)); + assertEquals(encounter, encounterCreated); } @Test From 0af398055fe8fefaf24c25a0b7a20048b0b12605 Mon Sep 17 00:00:00 2001 From: Jakub Banasiewicz Date: Fri, 9 Sep 2016 13:34:46 +0200 Subject: [PATCH 005/202] MOTECH-2908 Added Encounter UUID as post-action field --- .../openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java b/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java index 326b1fecd..84e5364ed 100644 --- a/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java +++ b/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java @@ -131,9 +131,7 @@ public void shouldCreateEncounterWithGivenParameters() { Encounter encounterCreated = openMRSActionProxyService.createEncounter(CONFIG_NAME, new DateTime(encounter.getEncounterDatetime()), encounter.getEncounterType().getName(), location.getName(), patient.getUuid(), provider.getUuid(), observations); - - verify(encounterService).createEncounter(eq(CONFIG_NAME), encounterCaptor.capture()); - + assertEquals(encounter, encounterCreated); } From 2b0d5cff8863254addd48a57cad97299f5a07433 Mon Sep 17 00:00:00 2001 From: Michal Date: Wed, 14 Sep 2016 14:44:34 +0200 Subject: [PATCH 006/202] MOTECH-2858: Atom Client to support paginated feeds Added new methods and test for paginating feeds --- .../atomclient/domain/FeedRecord.java | 7 +++++ .../service/AtomClientConfigService.java | 2 ++ .../impl/AtomClientConfigServiceImpl.java | 13 +++++++++ .../it/AtomClientServiceBundleIT.java | 28 ++++++++++++++++++- 4 files changed, 49 insertions(+), 1 deletion(-) diff --git a/atom-client/src/main/java/org/motechproject/atomclient/domain/FeedRecord.java b/atom-client/src/main/java/org/motechproject/atomclient/domain/FeedRecord.java index caa889dca..bdfa051a0 100644 --- a/atom-client/src/main/java/org/motechproject/atomclient/domain/FeedRecord.java +++ b/atom-client/src/main/java/org/motechproject/atomclient/domain/FeedRecord.java @@ -42,4 +42,11 @@ public String getUrl() { public String getData() { return data; } + + public Integer getPage(String data) { + int beginIndex = data.indexOf("via"); + beginIndex = data.indexOf("patient", beginIndex) + 8; + int endIndex = data.indexOf('/', beginIndex); + return Integer.parseInt(data.substring(beginIndex, endIndex - 2 )); + } } diff --git a/atom-client/src/main/java/org/motechproject/atomclient/service/AtomClientConfigService.java b/atom-client/src/main/java/org/motechproject/atomclient/service/AtomClientConfigService.java index 9c824f638..e7c6868d8 100644 --- a/atom-client/src/main/java/org/motechproject/atomclient/service/AtomClientConfigService.java +++ b/atom-client/src/main/java/org/motechproject/atomclient/service/AtomClientConfigService.java @@ -52,4 +52,6 @@ public interface AtomClientConfigService { * @return a regex or an empty string */ String getRegexForFeedUrl(String url); + + void readNewFeeds (int currentPage, int recentPage, String feedUrl); } diff --git a/atom-client/src/main/java/org/motechproject/atomclient/service/impl/AtomClientConfigServiceImpl.java b/atom-client/src/main/java/org/motechproject/atomclient/service/impl/AtomClientConfigServiceImpl.java index 11b572626..ba114b5f1 100644 --- a/atom-client/src/main/java/org/motechproject/atomclient/service/impl/AtomClientConfigServiceImpl.java +++ b/atom-client/src/main/java/org/motechproject/atomclient/service/impl/AtomClientConfigServiceImpl.java @@ -22,6 +22,8 @@ import java.io.IOException; import java.io.InputStream; import java.text.ParseException; +import java.util.Arrays; +import java.util.HashSet; @Service("atomClientConfigService") @@ -134,4 +136,15 @@ public String getRegexForFeedUrl(String url) { } return ""; } + + public void readNewFeeds (int currentPage, int recentPage, String feedUrl) { + int j = 0; + FeedConfig[] newFeeds = new FeedConfig[recentPage - currentPage + 1]; + String url = feedUrl.substring(0, feedUrl.lastIndexOf('/') + 1); + for (int i = currentPage; i <= recentPage; i++) { + newFeeds[j] = new FeedConfig(url + Integer.toString(i), "/([0-9a-f-]*)\\?"); + j++; + } + this.setFeedConfigs(new FeedConfigs(new HashSet<>(Arrays.asList(newFeeds)))); + } } diff --git a/atom-client/src/test/java/org/motechproject/atomclient/it/AtomClientServiceBundleIT.java b/atom-client/src/test/java/org/motechproject/atomclient/it/AtomClientServiceBundleIT.java index 20471e0da..28da603ff 100644 --- a/atom-client/src/test/java/org/motechproject/atomclient/it/AtomClientServiceBundleIT.java +++ b/atom-client/src/test/java/org/motechproject/atomclient/it/AtomClientServiceBundleIT.java @@ -172,4 +172,30 @@ public void verifySuccessiveFetches() { String data3 = feedRecord.getData(); assertThat(data3, is(not(data2))); } -} + + @Test + public void verifyPagination() { + + assertEquals(feedRecordDataService.count(), 0); + + String feedUrl = "https://emrdemo.bahmni.org/openmrs/ws/atomfeed/patient/19"; + configService.setFeedConfigs(new FeedConfigs(new HashSet<>(Arrays.asList(new FeedConfig(feedUrl, "/([0-9a-f-]*)\\?"))))); + atomClientService.fetch(); + + FeedRecord feedRecord = feedRecordDataService.findByURL(feedUrl); + assertNotNull(feedRecord); + String data1 = feedRecord.getData(); + int currentPage = feedRecord.getPage(data1); + + feedUrl = "https://emrdemo.bahmni.org/openmrs/ws/atomfeed/patient/recent"; + configService.setFeedConfigs(new FeedConfigs(new HashSet<>(Arrays.asList(new FeedConfig(feedUrl, "/([0-9a-f-]*)\\?"))))); + atomClientService.fetch(); + + feedRecord = feedRecordDataService.findByURL(feedUrl); + assertNotNull(feedRecord); + String data2 = feedRecord.getData(); + int recentPage = feedRecord.getPage(data2); + configService.readNewFeeds(currentPage,recentPage,feedUrl); + atomClientService.fetch(); + } +} \ No newline at end of file From 083b4612e661ba4ee9fb31cb755e199ad4b5b105 Mon Sep 17 00:00:00 2001 From: tomaszzawadzki Date: Wed, 14 Sep 2016 16:20:07 +0200 Subject: [PATCH 007/202] Added support for CommCare's Report Data endpoint --- .../client/CommCareAPIHttpClient.java | 15 ++++ .../domain/report/ReportDataColumn.java | 45 ++++++++++++ .../report/ReportDataContainerJson.java | 60 ++++++++++++++++ .../domain/report/ReportDataInfo.java | 50 ++++++++++++++ .../service/CommcareReportDataService.java | 27 ++++++++ .../impl/CommcareReportDataServiceImpl.java | 69 +++++++++++++++++++ 6 files changed, 266 insertions(+) create mode 100644 commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataColumn.java create mode 100644 commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataContainerJson.java create mode 100644 commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataInfo.java create mode 100644 commcare/src/main/java/org/motechproject/commcare/service/CommcareReportDataService.java create mode 100644 commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportDataServiceImpl.java diff --git a/commcare/src/main/java/org/motechproject/commcare/client/CommCareAPIHttpClient.java b/commcare/src/main/java/org/motechproject/commcare/client/CommCareAPIHttpClient.java index 1f11959cf..7a523d1cb 100644 --- a/commcare/src/main/java/org/motechproject/commcare/client/CommCareAPIHttpClient.java +++ b/commcare/src/main/java/org/motechproject/commcare/client/CommCareAPIHttpClient.java @@ -150,6 +150,16 @@ public String formListRequest(AccountConfig accountConfig, FormListRequest formL return this.getRequest(accountConfig, commcareFormListUrl(accountConfig, formListRequest), null); } + /** + * Executes a HTTP get request to the report data API endpoint. + * + * @param accountConfig the account configuration to use + * @return the response as a String (JSON expected) + */ + public String singleReportDataRequest(AccountConfig accountConfig, String reportId){ + return this.getRequest(accountConfig, commcareReportDataUrl(accountConfig, reportId), null); + } + /** * Retrieves a list of the cases from the CommCare server. The given {@code caseRequest} will be used for fetching * data from the server. @@ -524,6 +534,11 @@ String commcareCaseUrl(AccountConfig accountConfig, String caseId) { accountConfig.getDomain(), API_VERSION, caseId); } + String commcareReportDataUrl(AccountConfig accountConfig, String reportId){ + return String.format("%s/%s/api/v%s/configurablereportdata/%s/?format=json", + getCommcareBaseUrl(accountConfig.getBaseUrl()), accountConfig.getDomain(), API_VERSION, reportId); + } + String commcareStockTransactionsUrl(AccountConfig accountConfig) { return String.format("%s/%s/api/v%s/stock_transaction/?format=json", getCommcareBaseUrl(accountConfig.getBaseUrl()), accountConfig.getDomain(), API_VERSION); diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataColumn.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataColumn.java new file mode 100644 index 000000000..57227e927 --- /dev/null +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataColumn.java @@ -0,0 +1,45 @@ +package org.motechproject.commcare.domain.report; + +import com.google.gson.annotations.SerializedName; + +/* +* + * Represents column part in single report. +*/ + + +public class ReportDataColumn { + + @SerializedName("header") + private String header; + + @SerializedName("slug") + private String slug; + + @SerializedName("expand_column_value") + private String expandColumnValue; + + public String getHeader(){ + return header; + } + + public String getSlug(){ + return slug; + } + + public String getExpandColumnValue(){ + return expandColumnValue; + } + + public void setHeader(String header){ + this.header = header; + } + + public void setSlug(String slug){ + this.slug = slug; + } + + public void setExpandColumnValue(String expandColumnValue){ + this.expandColumnValue = expandColumnValue; + } +} diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataContainerJson.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataContainerJson.java new file mode 100644 index 000000000..bbaae3748 --- /dev/null +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataContainerJson.java @@ -0,0 +1,60 @@ +package org.motechproject.commcare.domain.report; + +import com.google.gson.annotations.SerializedName; + +import java.util.List; +import java.util.Map; + +/* +* + * Represents a single CommCareHQ report data. It's a part of the CommCareHQ model. +*/ + + +public class ReportDataContainerJson { + + @SerializedName("columns") + private List columns; + + @SerializedName("data") + private List> data; + + @SerializedName("next_page") + private String nextPage; + + @SerializedName("total_records") + private Integer totalRecords; + + public List getColumns(){ + return columns; + } + + public List> getData(){ + return data; + } + + public String getNextPage(){ + return nextPage; + } + + public Integer getTotalRecords(){ + return totalRecords; + } + + public void setColumns(List reportDataColumns){ + this.columns = reportDataColumns; + } + + public void setData(List> reportDataList){ + this.data = reportDataList; + } + + public void setNextPage(String nextPage){ + this.nextPage = nextPage; + } + + public void setTotalRecords(Integer totalRecords){ + this.totalRecords = totalRecords; + } + +} diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataInfo.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataInfo.java new file mode 100644 index 000000000..d887cc6b5 --- /dev/null +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataInfo.java @@ -0,0 +1,50 @@ +package org.motechproject.commcare.domain.report; + + +import java.util.List; +import java.util.Map; + +/** + * Represents a single CommCareHQ report data. It's a part of the MOTECH model. + */ + +public class ReportDataInfo { + + private List columns; + private List> data; + private String nextPage; + private Integer totalRecords; + + public List getColumns(){ + return columns; + } + + public void setColumns(List columns) { + this.columns = columns; + } + + public List> getData(){ + return data; + } + + public void setData(List> data) { + this.data = data; + } + + public String getNextPage(){ + return nextPage; + } + + public void setNextPage(String nextPage) { + this.nextPage = nextPage; + } + + public Integer getTotalRecords(){ + return totalRecords; + } + + public void setTotalRecords(Integer totalRecords) { + this.totalRecords = totalRecords; + } + +} diff --git a/commcare/src/main/java/org/motechproject/commcare/service/CommcareReportDataService.java b/commcare/src/main/java/org/motechproject/commcare/service/CommcareReportDataService.java new file mode 100644 index 000000000..b462e4737 --- /dev/null +++ b/commcare/src/main/java/org/motechproject/commcare/service/CommcareReportDataService.java @@ -0,0 +1,27 @@ +package org.motechproject.commcare.service; + +import org.motechproject.commcare.domain.report.ReportDataInfo; + + +/** + * This service is responsible for Interacting with CommCareHQ's programmatic Report Data APIs and uploading JSON data + * from single report. + */ + +public interface CommcareReportDataService { + + /** + * Query CommCareHQ for a report by its report id. + * + * @param reportId the id of the report on CommCareHQ + * @param configName the name of the configuration used for connecting to CommcareHQ, null means default configuration + * @return the ReportDataInfo object representing the state of the report data or null if that report does not exist. + */ + ReportDataInfo getReportByReportId(String reportId, String configName); + + /** + * Same as {@link #getReportByReportId(String, String) getReportByReportId} but uses default Commcare configuration. + */ + ReportDataInfo getReportByReportId(String reportId); + +} diff --git a/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportDataServiceImpl.java b/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportDataServiceImpl.java new file mode 100644 index 000000000..ded0dce57 --- /dev/null +++ b/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportDataServiceImpl.java @@ -0,0 +1,69 @@ +package org.motechproject.commcare.service.impl; + +import com.google.gson.reflect.TypeToken; +import org.motechproject.commcare.client.CommCareAPIHttpClient; +import org.motechproject.commcare.domain.report.ReportDataContainerJson; +import org.motechproject.commcare.domain.report.ReportDataInfo; +import org.motechproject.commcare.service.CommcareConfigService; +import org.motechproject.commcare.service.CommcareReportDataService; +import org.motechproject.commons.api.json.MotechJsonReader; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.lang.reflect.Type; + + +@Service +public class CommcareReportDataServiceImpl implements CommcareReportDataService { + + private CommCareAPIHttpClient commcareHttpClient; + private CommcareConfigService configService; + private MotechJsonReader motechJsonReader; + + @Autowired + public CommcareReportDataServiceImpl(CommCareAPIHttpClient commcareHttpClient, CommcareConfigService configService){ + this.commcareHttpClient = commcareHttpClient; + this.configService = configService; + this.motechJsonReader = new MotechJsonReader(); + } + + @Override + public ReportDataInfo getReportByReportId(String reportId, String configName) { + String response = commcareHttpClient.singleReportDataRequest(configService.getByName(configName).getAccountConfig(), + reportId); + + ReportDataContainerJson reportResponse = parseSingleReportFromResponse(response); + + return generateReportFromReportResponse(reportResponse); + } + + @Override + public ReportDataInfo getReportByReportId(String reportId) { + return getReportByReportId(reportId, null); + } + + private ReportDataContainerJson parseSingleReportFromResponse(String response) { + Type reportResponseType = new TypeToken() { } .getType(); + return (ReportDataContainerJson) motechJsonReader.readFromString(response, reportResponseType); + } + + private ReportDataInfo generateReportFromReportResponse(ReportDataContainerJson reportResponse) { + return populateReportDataInfo(reportResponse); + } + + private ReportDataInfo populateReportDataInfo(ReportDataContainerJson reportResponse) { + if(reportResponse == null){ + return null; + } + + ReportDataInfo reportDataInfo = new ReportDataInfo(); + + reportDataInfo.setColumns(reportResponse.getColumns()); + reportDataInfo.setData(reportResponse.getData()); + reportDataInfo.setNextPage(reportResponse.getNextPage()); + reportDataInfo.setTotalRecords(reportResponse.getTotalRecords()); + + return reportDataInfo; + } + +} From df822caa81f86dce175c1ce91984dab765cf0787 Mon Sep 17 00:00:00 2001 From: mkruszynski Date: Thu, 15 Sep 2016 09:55:15 +0200 Subject: [PATCH 008/202] MOTECH-2922: Travis post-push trigger --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index bb594944c..435f21404 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,6 +27,6 @@ cache: notifications: email: recipients: - - travis-test-maniek@googlegroups.com + - motech-dev@googlegroups.com on_success: never on_failure: always \ No newline at end of file From bad217da93fa2654b18f24216af04f5c2fd6a770 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Ja=C5=BCd=C5=BCewski?= Date: Fri, 16 Sep 2016 15:30:36 +0200 Subject: [PATCH 009/202] MOTECH-2916 Removed trailing slash from server URI --- .../main/java/org/motechproject/dhis2/service/Settings.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/dhis2/src/main/java/org/motechproject/dhis2/service/Settings.java b/dhis2/src/main/java/org/motechproject/dhis2/service/Settings.java index 3e8e0b968..b86a0dbee 100644 --- a/dhis2/src/main/java/org/motechproject/dhis2/service/Settings.java +++ b/dhis2/src/main/java/org/motechproject/dhis2/service/Settings.java @@ -14,7 +14,11 @@ public class Settings { public Settings() { } public Settings(String serverURI, String username, String password) { - this.serverURI = serverURI; + if (serverURI.endsWith("/")) { + this.serverURI = serverURI.substring(0, serverURI.length() - 1); + } else { + this.serverURI = serverURI; + } this.username = username; this.password = password; } From ead1d31069cf97c63489f1c09fc8626466fe7336 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Artur=20Fija=C5=82?= Date: Mon, 19 Sep 2016 10:02:36 +0200 Subject: [PATCH 010/202] Revert "MOTECH-2861: Temporarily turned off few ITs from mTraining module" This reverts commit af55d1105b4c3e59fa53fd66ae09748c31bce4e8. --- .../mtraining/service/it/MTrainingIntegrationTests.java | 2 +- .../mtraining/service/it/MTrainingServiceBundleIT.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mtraining/src/test/java/org/motechproject/mtraining/service/it/MTrainingIntegrationTests.java b/mtraining/src/test/java/org/motechproject/mtraining/service/it/MTrainingIntegrationTests.java index d3cc3dc62..a81e7e882 100644 --- a/mtraining/src/test/java/org/motechproject/mtraining/service/it/MTrainingIntegrationTests.java +++ b/mtraining/src/test/java/org/motechproject/mtraining/service/it/MTrainingIntegrationTests.java @@ -7,7 +7,7 @@ * Parent IT class to run all the individual service ITs */ @RunWith(Suite.class) -@Suite.SuiteClasses({MTrainingServiceBundleIT.class, //CourseStructureServiceBundleIT.class, +@Suite.SuiteClasses({MTrainingServiceBundleIT.class, CourseStructureServiceBundleIT.class, BookmarkServiceBundleIT.class, ActivityServiceBundleIT.class}) public class MTrainingIntegrationTests { } diff --git a/mtraining/src/test/java/org/motechproject/mtraining/service/it/MTrainingServiceBundleIT.java b/mtraining/src/test/java/org/motechproject/mtraining/service/it/MTrainingServiceBundleIT.java index aa2ef01ff..dc27337fe 100644 --- a/mtraining/src/test/java/org/motechproject/mtraining/service/it/MTrainingServiceBundleIT.java +++ b/mtraining/src/test/java/org/motechproject/mtraining/service/it/MTrainingServiceBundleIT.java @@ -227,7 +227,7 @@ public void testCourseUpdateStatus() throws Exception { Course updated = mTrainingService.updateCourse(firstCourse); assertEquals(CourseUnitState.Inactive, updated.getState()); } - /* + @Test public void testCourseUpdateAddChapter() throws Exception { Course firstCourse = mTrainingService.createCourse(generateFullCourse("testCourseUpdateAddChapter")); @@ -239,7 +239,7 @@ public void testCourseUpdateAddChapter() throws Exception { Course updated = mTrainingService.updateCourse(firstCourse); assertEquals(3, updated.getChapters().size()); } - */ + @Test public void testChapterCreation() throws Exception { Chapter newChapter = generateFullCourse("testChapterCreation").getChapters().get(0); From 808bbbc8787ff3ee7260d6ae597e97745aa1e078 Mon Sep 17 00:00:00 2001 From: piopawel Date: Mon, 19 Sep 2016 13:35:46 +0200 Subject: [PATCH 011/202] MOTECH-2885 Observation Data Source under development --- .../openmrs/resource/ObservationResource.java | 10 ++++ .../impl/ObservationResourceImpl.java | 6 +++ .../resource/impl/PersonResourceImpl.java | 2 +- .../service/OpenMRSObservationService.java | 11 ++++ .../impl/OpenMRSObservationServiceImpl.java | 17 +++++++ .../tasks/OpenMRSTaskDataProvider.java | 34 +++++++++++-- .../openmrs/tasks/OpenMRSTasksConstants.java | 3 ++ .../velocity.templates/task-data-provider.vm | 51 +++++++++++++++++++ .../webapp/messages/messages.properties | 6 +++ .../OpenMRSTaskDataProviderBuilderTest.java | 4 +- .../tasks/OpenMRSTaskDataProviderTest.java | 6 ++- 11 files changed, 141 insertions(+), 9 deletions(-) diff --git a/openmrs/src/main/java/org/motechproject/openmrs/resource/ObservationResource.java b/openmrs/src/main/java/org/motechproject/openmrs/resource/ObservationResource.java index 6a584578b..70f30cc97 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/resource/ObservationResource.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/resource/ObservationResource.java @@ -38,6 +38,16 @@ public interface ObservationResource { */ Observation getObservationById(Config config, String uuid); + /** + * Gets the latest observation with the given patientUUID and conceptUUID. The given {@code config} will be used while performing this action. + * + * @param config the configuration to be used while performing this action + * @param patientUUID the UUID of the patient + * @param conceptUUID the UUID of the concept + * @return the latest observation with the given patientUUID and conceptUUID + */ + Observation getObservationByPatientUUIDAndConceptUUID(Config config, String patientUUID, String conceptUUID); + /** * Creates the given observation on the OpenMRS server. The given {@code config} will be used while performing this * action. diff --git a/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/ObservationResourceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/ObservationResourceImpl.java index 6ba9812eb..8c5b743c1 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/ObservationResourceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/ObservationResourceImpl.java @@ -44,6 +44,12 @@ public Observation getObservationById(Config config, String uuid) { return (Observation) JsonUtils.readJson(responseJson, Observation.class); } + @Override + public Observation getObservationByPatientUUIDAndConceptUUID(Config config, String patientUUID, String conceptUUID) { + String responseJson = getJson(config, "/obs?patient={patientUUID}&concept={conceptUUID}&limit=1", patientUUID, conceptUUID); + return (Observation) JsonUtils.readJson(responseJson, Observation.class); + } + @Override public Observation createObservation(Config config, Observation observation) { String requestJson = buildGson().toJson(observation); diff --git a/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/PersonResourceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/PersonResourceImpl.java index 95a4ca59b..8ba909f47 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/PersonResourceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/PersonResourceImpl.java @@ -55,7 +55,7 @@ public AttributeTypeListResult queryPersonAttributeTypeByName(Config config, Str } @Override - public AttributeListResult queryPersonAttributeByPersonUuid (Config config, String uuid) { + public AttributeListResult queryPersonAttributeByPersonUuid(Config config, String uuid) { String responseJson = getJson(config, "/person/{uuid}/attribute", uuid); return (AttributeListResult) JsonUtils.readJsonWithAdapters(responseJson, AttributeListResult.class, createAttributeAdapter()); } diff --git a/openmrs/src/main/java/org/motechproject/openmrs/service/OpenMRSObservationService.java b/openmrs/src/main/java/org/motechproject/openmrs/service/OpenMRSObservationService.java index 5f85a2d2f..dbd70a6c2 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/service/OpenMRSObservationService.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/service/OpenMRSObservationService.java @@ -53,6 +53,17 @@ public interface OpenMRSObservationService { */ Observation getObservationByUuid(String configName, String uuid); + /** + * Returns the observation with given {@code uuid}. Configuration with the given {@code configName} will be used + * while performing this action. + * + * @param configName the name of the configuration + * @param patientUUID the UUID of the patient + * @param conceptUUID the UUID of the concept + * @return the latest observation with the given patientUUID and conceptUUID, null if the observation doesn't exist + */ + Observation getObservationByPatientUUIDAndConceptUUID(String configName, String patientUUID, String conceptUUID); + /** * Creates the given {@code observation} on the OpenMRS server. Configuration with the given {@code configName} will * be used while performing this action. diff --git a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSObservationServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSObservationServiceImpl.java index bc201ac0a..a0cf0a787 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSObservationServiceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSObservationServiceImpl.java @@ -35,6 +35,7 @@ public class OpenMRSObservationServiceImpl implements OpenMRSObservationService private final OpenMRSConfigService configService; private final ObservationResource obsResource; + private final ConceptResource conceptResource; private final EventRelay eventRelay; @@ -95,6 +96,22 @@ public Observation getObservationByUuid(String configName, String uuid) { } } + @Override + public Observation getObservationByPatientUUIDAndConceptUUID(String configName, String patientUUID, String conceptUUID) { + Validate.notEmpty(patientUUID, "Patient uuid cannot be empty"); + Validate.notEmpty(conceptUUID, "Concept uuid cannot be empty"); + Observation observation = null; + + try { + Config config = configService.getConfigByName(configName); + observation = obsResource.getObservationByPatientUUIDAndConceptUUID(config, patientUUID, conceptUUID); + return obsResource.getObservationById(config, observation.getUuid()); + } catch (HttpClientErrorException e) { + LOGGER.error("Error while fetching observation with Patient uuid: " + patientUUID + " and Concept uuid: " + conceptUUID); + return null; + } + } + @Override public Observation createObservation(String configName, Observation observation) { Validate.notEmpty(observation.getPerson().getUuid(), "Patient uuid cannot be empty"); diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java index fd2f1f414..9d0757e85 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java @@ -13,8 +13,10 @@ import org.motechproject.openmrs.domain.ProgramEnrollmentListResult; import org.motechproject.openmrs.domain.Provider; import org.motechproject.openmrs.domain.Relationship; +import org.motechproject.openmrs.domain.Observation; import org.motechproject.openmrs.service.OpenMRSEncounterService; import org.motechproject.openmrs.service.OpenMRSGeneratedIdentifierService; +import org.motechproject.openmrs.service.OpenMRSObservationService; import org.motechproject.openmrs.service.OpenMRSPatientService; import org.motechproject.openmrs.service.OpenMRSProgramEnrollmentService; import org.motechproject.openmrs.service.OpenMRSProviderService; @@ -37,13 +39,16 @@ import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.BAHMNI_PROGRAM_ENROLLMENT; import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.BY_MOTECH_ID; import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.BY_MOTECH_ID_AND_PROGRAM_NAME; +import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.BY_PATIENT_UUID_AND_CONCEPT_UUID; import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.BY_UUID; import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.BY_UUID_AMD_PROGRAM_NAME; +import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.CONCEPT_UUID; import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.ENCOUNTER; import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.IDENTIFIER; import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.IDENTIFIER_SOURCE_NAME; import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.MOTECH_ID; import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.NAME; +import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.OBSERVATION; import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.PACKAGE_ROOT; import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.PATIENT; import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.PATIENT_MOTECH_ID; @@ -54,7 +59,7 @@ import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.PROVIDER; import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.RELATIONSHIP; import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.RELATIONSHIP_TYPE_UUID; -import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.UUID; +import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.UUID;; /** * This is the OpenMRS task data provider that is registered with the task module as a data source. @@ -64,9 +69,10 @@ public class OpenMRSTaskDataProvider extends AbstractDataProvider { private static final Logger LOGGER = LoggerFactory.getLogger(OpenMRSTaskDataProvider.class); private static final List> SUPPORTED_CLASSES = Arrays.asList(Patient.class, Provider.class, Encounter.class, - Relationship.class, ProgramEnrollment.class, GeneratedIdentifier.class); + Relationship.class, ProgramEnrollment.class, GeneratedIdentifier.class, Observation.class); private OpenMRSEncounterService encounterService; + private OpenMRSObservationService observationService; private OpenMRSPatientService patientService; private OpenMRSProviderService providerService; private OpenMRSTaskDataProviderBuilder dataProviderBuilder; @@ -78,10 +84,11 @@ public class OpenMRSTaskDataProvider extends AbstractDataProvider { @Autowired public OpenMRSTaskDataProvider(OpenMRSTaskDataProviderBuilder taskDataProviderBuilder, OpenMRSEncounterService encounterService, - OpenMRSPatientService patientService, OpenMRSProviderService providerService, + OpenMRSObservationService observationService, OpenMRSPatientService patientService, OpenMRSProviderService providerService, OpenMRSRelationshipService relationshipService, OpenMRSProgramEnrollmentService programEnrollmentService, OpenMRSGeneratedIdentifierService generatedIdentifierService, BundleContext bundleContext) { this.encounterService = encounterService; + this.observationService = observationService; this.patientService = patientService; this.providerService = providerService; this.dataProviderBuilder = taskDataProviderBuilder; @@ -154,6 +161,8 @@ public Object lookup(String type, String lookupName, Map lookupF case PROGRAM_ENROLLMENT: obj = getProgramEnrollments(lookupName, lookupFields, configName, isBahmniProgramEnrollment); break; case IDENTIFIER: obj = getIdentifier(lookupFields, configName); + break; + case OBSERVATION: obj = getObservation(lookupName, lookupFields, configName); } } @@ -188,6 +197,21 @@ private Patient getPatient(String lookupName, Map lookupFields, return patient; } + private Observation getObservation(String lookupName, Map lookupFields, String configName) { + Observation observation = null; + switch(lookupName) { + case BY_PATIENT_UUID_AND_CONCEPT_UUID: + observation = observationService.getObservationByUuid(configName, lookupFields.get(UUID)); + /*observation = observationService.getObservationByPatientUUIDAndConceptUUID(configName, lookupFields.get(PATIENT_UUID), lookupFields.get(CONCEPT_UUID)); + observation = observationService.getObservationByUuid(configName, observation.getUuid());*/ + break; + default: LOGGER.error("Lookup with name {} doesn't exist for observation object", lookupName); + break; + } + + return observation; + } + private Provider getProvider(String lookupName, Map lookupFields, String configName) { Provider provider = null; @@ -302,7 +326,7 @@ private boolean isActiveProgram(String activeProgram) { private List filterByProgramName(List programEnrollments, String programName) { List result = new ArrayList<>(); - if(CollectionUtils.isNotEmpty(programEnrollments)) { + if (CollectionUtils.isNotEmpty(programEnrollments)) { for (ProgramEnrollment programEnrollment : programEnrollments) { if (programEnrollment.getProgram().getName().equals(programName)) { result.add(programEnrollment); @@ -316,7 +340,7 @@ private List filterByProgramName(List prog private List filterByActiveProgramOnly(List programEnrollments) { List result = new ArrayList<>(); - if(CollectionUtils.isNotEmpty(programEnrollments)) { + if (CollectionUtils.isNotEmpty(programEnrollments)) { for (ProgramEnrollment programEnrollment : programEnrollments) { if (programEnrollment.getDateCompleted() == null) { result.add(programEnrollment); diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTasksConstants.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTasksConstants.java index e1f635c5f..6baca3d83 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTasksConstants.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTasksConstants.java @@ -13,6 +13,7 @@ public final class OpenMRSTasksConstants { public static final String BY_PERSON_UUID = "openMRS.person"; public static final String BY_MOTECH_ID_AND_PROGRAM_NAME = "openMRS.lookup.motechIdAndProgramName"; public static final String BY_UUID_AMD_PROGRAM_NAME = "openMRS.lookup.uuidAndProgramName"; + public static final String BY_PATIENT_UUID_AND_CONCEPT_UUID = "openMRS.lookup.patientUuidAndConceptUuid"; // Lookup objects public static final String ENCOUNTER = "Encounter"; @@ -22,12 +23,14 @@ public final class OpenMRSTasksConstants { public static final String PROGRAM_ENROLLMENT = "ProgramEnrollment"; public static final String BAHMNI_PROGRAM_ENROLLMENT = "BahmniProgramEnrollment"; public static final String IDENTIFIER = "GeneratedIdentifier"; + public static final String OBSERVATION = "Observation"; // Field names public static final String MOTECH_ID = "openMRS.motechId"; public static final String UUID = "openMRS.uuid"; public static final String PATIENT_MOTECH_ID = "openMRS.patient.motechId"; public static final String PATIENT_UUID = "openMRS.patient.uuid"; + public static final String CONCEPT_UUID = "openMRS.concept.uuid"; public static final String PERSON_UUID = "openMRS.person.uuid"; public static final String RELATIONSHIP_TYPE_UUID = "openMRS.relationshipType.uuid"; public static final String PROGRAM_NAME = "openMRS.programName"; diff --git a/openmrs/src/main/resources/velocity.templates/task-data-provider.vm b/openmrs/src/main/resources/velocity.templates/task-data-provider.vm index 818a5f5c1..63b199a69 100644 --- a/openmrs/src/main/resources/velocity.templates/task-data-provider.vm +++ b/openmrs/src/main/resources/velocity.templates/task-data-provider.vm @@ -252,6 +252,57 @@ } ] }, + { + "displayName": "Observation [$config.getName()]", + "type": "Observation-$config.getName()", + "lookupFields": [ + { + "displayName": "openMRS.lookup.patientUuidAndConceptUuid", + "fields": [ + "openMRS.uuid", + "openMRS.observation.concept.uuid" + ] + } + ], + "fields": [ + { + "displayName": "openMRS.observation.uuid", + "fieldKey": "uuid" + }, + { + "displayName": "openMRS.observation.display", + "fieldKey": "display" + }, + { + "displayName": "openMRS.observation.concept.uuid", + "fieldKey": "concept.uuid" + }, + { + "displayName": "openMRS.person.uuid", + "fieldKey": "person.uuid" + }, + { + "displayName": "openMRS.observation.dateTime", + "fieldKey": "obsDateTime" + }, + { + "displayName": "openMRS.observation.group", + "fieldKey": "groupsMembers" + }, + { + "displayName": "openMRS.observation.groupMembers", + "fieldKey": "endDate" + }, + { + "displayName": "openMRS.encounter.uuid", + "fieldKey": "encounter.uuid" + }, + { + "displayName": "openMRS.observation.value", + "fieldKey": "value" + } + ] + }, { "displayName": "Relationship [$config.getName()]", "type": "Relationship-$config.getName()", diff --git a/openmrs/src/main/resources/webapp/messages/messages.properties b/openmrs/src/main/resources/webapp/messages/messages.properties index 52dfb5992..2018169dc 100644 --- a/openmrs/src/main/resources/webapp/messages/messages.properties +++ b/openmrs/src/main/resources/webapp/messages/messages.properties @@ -7,6 +7,7 @@ openMRS.lookup.uuid=UUID openMRS.lookup.motechIdAndProgramName=MOTECH ID and Program name openMRS.lookup.uuidAndProgramName=UUID and Program name openMRS.lookup.sourceName=Generator source name +openMRS.lookup.patientUuidAndConceptUuid=Patient UUID and Concept UUID #Actions openMRS.createEncounter=Create Encounter @@ -30,6 +31,7 @@ openMRS.patient=Patient openMRS.provider=Provider openMRS.relationship=Relationship openMRS.person=Person +openMRS.observation=Observation #Common field names openMRS.motechId=MotechId @@ -50,6 +52,10 @@ openMRS.location.display=Location display openMRS.location.uuid=Location UUID openMRS.location.name=Location name +#Observation +openMRS.observation.uuid=Observation UUID +openMRS.observation.concept.uuid=Concept UUID + #Patient openMRS.patient.display=Patient display openMRS.patient.uuid=Patient UUID diff --git a/openmrs/src/test/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProviderBuilderTest.java b/openmrs/src/test/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProviderBuilderTest.java index 736e92db1..4149cd48f 100644 --- a/openmrs/src/test/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProviderBuilderTest.java +++ b/openmrs/src/test/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProviderBuilderTest.java @@ -48,12 +48,12 @@ public void generatedProviderShouldReturnNullWhenConfigsListIsEmpty() { @Test public void generatedProviderShouldReturnJSONForOneConfiguration() throws IOException { - assertEquals(7, getGeneratedJSONObjectsCount(1)); + assertEquals(8, getGeneratedJSONObjectsCount(1)); } @Test public void generatedProviderShouldReturnJSONForTwoConfigurations() throws IOException { - assertEquals(14, getGeneratedJSONObjectsCount(2)); + assertEquals(16, getGeneratedJSONObjectsCount(2)); } private int getGeneratedJSONObjectsCount(int amountOfConfigs) throws IOException { diff --git a/openmrs/src/test/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProviderTest.java b/openmrs/src/test/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProviderTest.java index 80b8a0b82..3b0dc6891 100644 --- a/openmrs/src/test/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProviderTest.java +++ b/openmrs/src/test/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProviderTest.java @@ -22,6 +22,7 @@ import org.motechproject.openmrs.service.OpenMRSConfigService; import org.motechproject.openmrs.service.OpenMRSEncounterService; import org.motechproject.openmrs.service.OpenMRSGeneratedIdentifierService; +import org.motechproject.openmrs.service.OpenMRSObservationService; import org.motechproject.openmrs.service.OpenMRSPatientService; import org.motechproject.openmrs.service.OpenMRSProgramEnrollmentService; import org.motechproject.openmrs.service.OpenMRSProviderService; @@ -75,6 +76,9 @@ public class OpenMRSTaskDataProviderTest { @Mock private OpenMRSEncounterService encounterService; + @Mock + private OpenMRSObservationService observationService; + @Mock private OpenMRSPatientService patientService; @@ -107,7 +111,7 @@ public class OpenMRSTaskDataProviderTest { @Before public void setUp() { when(configService.getConfigs()).thenReturn(new Configs()); - taskDataProvider = new OpenMRSTaskDataProvider(taskDataProviderBuilder, encounterService, patientService, + taskDataProvider = new OpenMRSTaskDataProvider(taskDataProviderBuilder, encounterService, observationService, patientService, providerService, relationshipService, programEnrollmentService, identifierService, bundleContext); } From 922e673ec8ea95430975edd75c126749fc9cd116 Mon Sep 17 00:00:00 2001 From: Jakub Redlarski Date: Tue, 20 Sep 2016 16:27:20 +0200 Subject: [PATCH 012/202] MOTECH-2888: Added support for CommCare's Reports Metadata endpoint Added classes representing each Report with additional classes for Report's columns and filters Added CommcareReportService responsible for fetching the metadata and the list of available Reports for a specific CommCare configuration from the CommCareHQ's Report Metadata endpoint Added utility class for storing diferent Types for Columns and Filters Added test for the getReportsList method --- .../client/CommCareAPIHttpClient.java | 15 +++ .../commcare/domain/report/Column.java | 42 ++++++++ .../commcare/domain/report/Filter.java | 43 ++++++++ .../commcare/domain/report/ReportInfo.java | 46 +++++++++ .../commcare/domain/report/ReportJson.java | 66 +++++++++++++ .../commcare/domain/report/ReportsInfo.java | 35 +++++++ .../domain/report/ReportsResponseJson.java | 35 +++++++ .../domain/report/constants/Types.java | 32 ++++++ .../service/CommcareReportService.java | 23 +++++ .../impl/CommcareReportServiceImpl.java | 98 +++++++++++++++++++ .../impl/CommcareReportServiceImplTest.java | 57 +++++++++++ 11 files changed, 492 insertions(+) create mode 100644 commcare/src/main/java/org/motechproject/commcare/domain/report/Column.java create mode 100644 commcare/src/main/java/org/motechproject/commcare/domain/report/Filter.java create mode 100644 commcare/src/main/java/org/motechproject/commcare/domain/report/ReportInfo.java create mode 100644 commcare/src/main/java/org/motechproject/commcare/domain/report/ReportJson.java create mode 100644 commcare/src/main/java/org/motechproject/commcare/domain/report/ReportsInfo.java create mode 100644 commcare/src/main/java/org/motechproject/commcare/domain/report/ReportsResponseJson.java create mode 100644 commcare/src/main/java/org/motechproject/commcare/domain/report/constants/Types.java create mode 100644 commcare/src/main/java/org/motechproject/commcare/service/CommcareReportService.java create mode 100644 commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportServiceImpl.java create mode 100644 commcare/src/test/java/org/motechproject/commcare/service/impl/CommcareReportServiceImplTest.java diff --git a/commcare/src/main/java/org/motechproject/commcare/client/CommCareAPIHttpClient.java b/commcare/src/main/java/org/motechproject/commcare/client/CommCareAPIHttpClient.java index 1f11959cf..fbbc05bd5 100644 --- a/commcare/src/main/java/org/motechproject/commcare/client/CommCareAPIHttpClient.java +++ b/commcare/src/main/java/org/motechproject/commcare/client/CommCareAPIHttpClient.java @@ -150,6 +150,16 @@ public String formListRequest(AccountConfig accountConfig, FormListRequest formL return this.getRequest(accountConfig, commcareFormListUrl(accountConfig, formListRequest), null); } + /** + * Executes a HTTP get request to the reports list API endpoint. + * + * @param accountConfig the account configuration to use + * @return the response as a String (JSON expected) + */ + public String reportsListRequest(AccountConfig accountConfig) { + return this.getRequest(accountConfig, commcareReportsListUrl(accountConfig), null); + } + /** * Retrieves a list of the cases from the CommCare server. The given {@code caseRequest} will be used for fetching * data from the server. @@ -524,6 +534,11 @@ String commcareCaseUrl(AccountConfig accountConfig, String caseId) { accountConfig.getDomain(), API_VERSION, caseId); } + String commcareReportsListUrl(AccountConfig accountConfig) { + return String.format("%s/%s/api/v%s/simplereportconfiguration/?format=json", getCommcareBaseUrl(accountConfig.getBaseUrl()), + accountConfig.getDomain(), API_VERSION); + } + String commcareStockTransactionsUrl(AccountConfig accountConfig) { return String.format("%s/%s/api/v%s/stock_transaction/?format=json", getCommcareBaseUrl(accountConfig.getBaseUrl()), accountConfig.getDomain(), API_VERSION); diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/Column.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/Column.java new file mode 100644 index 000000000..17fa06108 --- /dev/null +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/Column.java @@ -0,0 +1,42 @@ +package org.motechproject.commcare.domain.report; + +import com.google.gson.annotations.SerializedName; + +/** + * Represents a single CommCareHQ {@link ReportInfo} column. + */ +public class Column { + + @SerializedName("column_id") + private String id; + + @SerializedName("display") + private String display; + + @SerializedName("type") + private String type; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getDisplay() { + return display; + } + + public void setDisplay(String display) { + this.display = display; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } +} \ No newline at end of file diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/Filter.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/Filter.java new file mode 100644 index 000000000..173b64453 --- /dev/null +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/Filter.java @@ -0,0 +1,43 @@ +package org.motechproject.commcare.domain.report; + +import com.google.gson.annotations.SerializedName; + +/** + * Represents a single CommCareHQ {@link ReportInfo} filter. + */ +public class Filter { + + @SerializedName("datatype") + private String datatype; + + @SerializedName("slug") + private String slug; + + @SerializedName("type") + private String type; + + public String getDatatype() { + return datatype; + } + + public void setDatatype(String datatype) { + this.datatype = datatype; + } + + public String getSlug() { + return slug; + } + + public void setSlug(String slug) { + this.slug = slug; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + +} \ No newline at end of file diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportInfo.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportInfo.java new file mode 100644 index 000000000..810ae99a3 --- /dev/null +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportInfo.java @@ -0,0 +1,46 @@ +package org.motechproject.commcare.domain.report; + +import java.util.List; + +/** + * Represents a single CommCareHQ report. It's a part of the MOTECH model. + */ +public class ReportInfo { + + private String id; + private String title; + private List columns; + private List filters; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public List getColumns() { + return columns; + } + + public void setColumns(List columns) { + this.columns = columns; + } + + public List getFilters() { + return filters; + } + + public void setFilters(List filters) { + this.filters = filters; + } +} \ No newline at end of file diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportJson.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportJson.java new file mode 100644 index 000000000..ae3a855e9 --- /dev/null +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportJson.java @@ -0,0 +1,66 @@ +package org.motechproject.commcare.domain.report; + +import com.google.gson.annotations.SerializedName; + +import java.util.List; + +/** + * Represents a single CommCareHQ report. It's a part of the CommCareHQ model. + */ +public class ReportJson { + + @SerializedName("title") + private String title; + + @SerializedName("id") + private String id; + + @SerializedName("resource") + private String resource; + + @SerializedName("columns") + private List columns; + + @SerializedName("filters") + private List filters; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getResource() { + return resource; + } + + public void setResource() { + this.resource = resource; + } + + public List getColumns() { + return columns; + } + + public void setColumns(List columns) { + this.columns = columns; + } + + public List getFilters() { + return filters; + } + + public void setFilters(List filters) { + this.filters = filters; + } +} \ No newline at end of file diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportsInfo.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportsInfo.java new file mode 100644 index 000000000..d6b064ad7 --- /dev/null +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportsInfo.java @@ -0,0 +1,35 @@ +package org.motechproject.commcare.domain.report; + +import org.motechproject.commcare.domain.CommcareMetadataInfo; + +import java.util.List; + +/** + * Wrapper class for storing list of instances of the {@link ReportInfo} class. It's a part of the MOTECH model. + */ +public class ReportsInfo { + + private List reportInfoList; + private CommcareMetadataInfo metadataInfo; + + public ReportsInfo(List reportsInfoList, CommcareMetadataInfo metadataInfo) { + this.reportInfoList = reportsInfoList; + this.metadataInfo = metadataInfo; + } + + public List getReportInfoList() { + return reportInfoList; + } + + public void setReportInfoList(List reportInfoList) { + this.reportInfoList = reportInfoList; + } + + public CommcareMetadataInfo getMetadataInfo() { + return metadataInfo; + } + + public void setMetadataInfo(CommcareMetadataInfo metadataInfo) { + this.metadataInfo = metadataInfo; + } +} \ No newline at end of file diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportsResponseJson.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportsResponseJson.java new file mode 100644 index 000000000..24a2fe939 --- /dev/null +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportsResponseJson.java @@ -0,0 +1,35 @@ +package org.motechproject.commcare.domain.report; + +import com.google.gson.annotations.SerializedName; +import org.motechproject.commcare.domain.CommcareMetadataJson; + +import java.util.List; + +/** + * Wrapper class for storing list of instances of the {@link ReportJson} class and their metadata. It's part of the + * CommCareHQ model. + */ +public class ReportsResponseJson { + + @SerializedName("meta") + private CommcareMetadataJson metadata; + + @SerializedName("objects") + private List reports; + + public CommcareMetadataJson getMetadata() { + return metadata; + } + + public void setMetadata(CommcareMetadataJson metadata) { + this.metadata = metadata; + } + + public List getReports() { + return reports; + } + + public void setReports(List reports) { + this.reports = reports; + } +} \ No newline at end of file diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/Types.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/Types.java new file mode 100644 index 000000000..0586eb5a2 --- /dev/null +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/Types.java @@ -0,0 +1,32 @@ +package org.motechproject.commcare.domain.report.constants; + +import org.motechproject.commcare.domain.report.Column; +import org.motechproject.commcare.domain.report.Filter; +import org.motechproject.commcare.domain.report.ReportInfo; + +/** + * Utility class for storing {@link ReportInfo} {@link Column} and {@link Filter} types. + */ +public final class Types { + + //Columns types + private static final String FIELD = "field"; + private static final String EXPANDED = "expanded"; + + //Filters datatypes + private static final String STRING = "string"; + private static final String INTEGER = "integer"; + private static final String DECIMAL = "decimal"; + + //Filters types + private static final String DATE = "date"; + private static final String CHOICE_LIST = "choice_list"; + private static final String DYNAMIC_CHOICE_LIST = "dynamic_choice_list"; + + /** + * Utility class, should not be initiated. + */ + private Types() { + } + +} \ No newline at end of file diff --git a/commcare/src/main/java/org/motechproject/commcare/service/CommcareReportService.java b/commcare/src/main/java/org/motechproject/commcare/service/CommcareReportService.java new file mode 100644 index 000000000..d5ec6a11a --- /dev/null +++ b/commcare/src/main/java/org/motechproject/commcare/service/CommcareReportService.java @@ -0,0 +1,23 @@ +package org.motechproject.commcare.service; + +import org.motechproject.commcare.domain.report.ReportsInfo; + +/** + * Responsible for interacting with CommCareHQ's Report Metadata and Data API. + */ +public interface CommcareReportService { + + /** + * Query CommCareHQ for all reports. + * + * @param configName the name of the configuration used for connecting to CommcareHQ, null means default configuration + * @return {@link ReportsInfo} object that contains reports metadata and the list of {@link ReportsInfo} objects representing reports + * found on the given CommcareHQ configuration + */ + ReportsInfo getReportsList(String configName); + + /** + * Same as {@link #getReportsList(String)} but uses default Commcare configuration. + */ + ReportsInfo getReportsList(); +} \ No newline at end of file diff --git a/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportServiceImpl.java b/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportServiceImpl.java new file mode 100644 index 000000000..841771b41 --- /dev/null +++ b/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportServiceImpl.java @@ -0,0 +1,98 @@ +package org.motechproject.commcare.service.impl; + +import com.google.common.reflect.TypeToken; +import org.motechproject.commcare.client.CommCareAPIHttpClient; +import org.motechproject.commcare.domain.CommcareMetadataInfo; +import org.motechproject.commcare.domain.CommcareMetadataJson; +import org.motechproject.commcare.domain.report.ReportInfo; +import org.motechproject.commcare.domain.report.ReportsInfo; +import org.motechproject.commcare.domain.report.ReportJson; +import org.motechproject.commcare.domain.report.ReportsResponseJson; +import org.motechproject.commcare.service.CommcareConfigService; +import org.motechproject.commcare.service.CommcareReportService; +import org.motechproject.commons.api.json.MotechJsonReader; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * A {@link CommcareReportService} that is responsible for interacting with CommCareHQ's Report Metadata and Data API. + */ +@Service +public class CommcareReportServiceImpl implements CommcareReportService { + + private CommCareAPIHttpClient commCareHttpClient; + private CommcareConfigService configService; + private MotechJsonReader motechJsonReader; + + @Autowired + public CommcareReportServiceImpl(CommCareAPIHttpClient commCareHttpClient, CommcareConfigService configService) { + this.commCareHttpClient = commCareHttpClient; + this.configService = configService; + this.motechJsonReader = new MotechJsonReader(); + } + + @Override + public ReportsInfo getReportsList(String configName) { + String response = commCareHttpClient.reportsListRequest(configService.getByName(configName).getAccountConfig()); + + ReportsResponseJson reportsResponseJson = parseReportsFromResponse(response); + + return new ReportsInfo(generateReportsFromReportsResponse(reportsResponseJson.getReports()), populateReportsMetadata(reportsResponseJson.getMetadata())); + } + + @Override + public ReportsInfo getReportsList() { + return getReportsList(null); + } + + private ReportsResponseJson parseReportsFromResponse(String response) { + Type reportsResponseType = new TypeToken() { } .getType(); + return (ReportsResponseJson) motechJsonReader.readFromString(response, reportsResponseType); + } + + private List generateReportsFromReportsResponse(List reportResponses) { + if (reportResponses == null) { + return Collections.emptyList(); + } + + List reportsInfoList = new ArrayList<>(); + + for (ReportJson reportResponse : reportResponses) { + reportsInfoList.add(populateReportInfo(reportResponse)); + } + + return reportsInfoList; + } + + private ReportInfo populateReportInfo(ReportJson reportResponse) { + if (reportResponse == null) { + return null; + } + + ReportInfo reportInfo = new ReportInfo(); + + reportInfo.setId(reportResponse.getId()); + reportInfo.setTitle(reportResponse.getTitle()); + reportInfo.setColumns(reportResponse.getColumns()); + reportInfo.setFilters(reportResponse.getFilters()); + + return reportInfo; + } + + private CommcareMetadataInfo populateReportsMetadata(CommcareMetadataJson metadataJson) { + CommcareMetadataInfo metadataInfo = new CommcareMetadataInfo(); + + metadataInfo.setLimit(metadataJson.getLimit()); + metadataInfo.setNextPageQueryString(metadataJson.getNextPageQueryString()); + metadataInfo.setOffset(metadataJson.getOffset()); + metadataInfo.setPreviousPageQueryString(metadataJson.getPreviousPageQueryString()); + metadataInfo.setTotalCount(metadataJson.getTotalCount()); + + return metadataInfo; + } +} \ No newline at end of file diff --git a/commcare/src/test/java/org/motechproject/commcare/service/impl/CommcareReportServiceImplTest.java b/commcare/src/test/java/org/motechproject/commcare/service/impl/CommcareReportServiceImplTest.java new file mode 100644 index 000000000..dd47ff01e --- /dev/null +++ b/commcare/src/test/java/org/motechproject/commcare/service/impl/CommcareReportServiceImplTest.java @@ -0,0 +1,57 @@ +package org.motechproject.commcare.service.impl; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; +import org.motechproject.commcare.client.CommCareAPIHttpClient; +import org.motechproject.commcare.config.Config; +import org.motechproject.commcare.domain.report.ReportsInfo; +import org.motechproject.commcare.service.CommcareConfigService; +import org.motechproject.commcare.util.ConfigsUtils; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.assertThat; +import static org.mockito.Mockito.when; +import static org.mockito.MockitoAnnotations.initMocks; + +public class CommcareReportServiceImplTest { + + private static final String REPORTS_LIST_RESPONSE = "{\"meta\":{\"total_count\":2},\"objects\":[{\"columns\":[{\"column_id\":\"name\",\"display\":\"Name\",\"type\":\"field\"},{\"column_id\":\"gender\",\"display\":\"Gender\",\"type\":\"expanded\"},{\"column_id\":\"address\",\"display\":\"Person Address\",\"type\":\"field\"}],\"filters\":[{\"datatype\":\"string\",\"slug\":\"closed\"},{\"datatype\":\"string\",\"slug\":\"owner_name\"}],\"title\":\"Test Report 1\",\"id\":\"9aab0eeb88555a7b3bc8676883e7379a\",\"resource_uri\":\"/a/domainOne/api/v0.5/simplereportconfiguration/9aab0eeb88555a7b3bc8676883e7379a/\"},{\"columns\":[{\"column_id\":\"district\",\"display\":\"District\",\"type\":\"field\"},{\"column_id\":\"number_of_children_visited\",\"display\":\"Num Children Visited\",\"type\":\"field\"},{\"column_id\":\"number_of_children_underweight\",\"display\":\"Underweight\",\"type\":\"field\"}],\"filters\":[{\"datatype\":\"string\",\"slug\":\"closed\"},{\"datatype\":\"string\",\"slug\":\"owner_name\"},{\"datatype\":\"integer\",\"slug\":\"child_age\"},{\"datatype\":\"date\",\"slug\":\"form_date\"}],\"title\":\"Test Report 2\",\"id\":\"9aab0eeb88555a7b4568676883e7379a\",\"resource_uri\":\"/a/domainOne/api/v0.5/simplereportconfiguration/9aab0eeb88555a7b4568676883e7379a/\"}]}"; + + private CommcareReportServiceImpl reportService; + + @Mock + private CommCareAPIHttpClient commcareHttpClient; + + @Mock + private CommcareConfigService configService; + + private Config config; + + @Before + public void setUp() { + initMocks(this); + + config = ConfigsUtils.prepareConfigOne(); + + when(configService.getByName(null)).thenReturn(config); + + reportService = new CommcareReportServiceImpl(commcareHttpClient, configService); + } + + @Test + public void shouldGetReports() { + when(commcareHttpClient.reportsListRequest(configService.getByName(null).getAccountConfig())).thenReturn(getResponseForReportsList()); + + ReportsInfo reportsInfo = reportService.getReportsList(); + + assertThat(reportsInfo.getMetadataInfo().getTotalCount(), equalTo(2)); + assertThat(reportsInfo.getReportInfoList().size(), equalTo(2)); + assertThat(reportsInfo.getReportInfoList().get(0).getColumns().size(), equalTo(3)); + assertThat(reportsInfo.getReportInfoList().get(0).getFilters().size(), equalTo(2)); + } + + private String getResponseForReportsList() { + return REPORTS_LIST_RESPONSE; + } +} \ No newline at end of file From 4269fde5536d19df4c0d98d292798cc941f74d81 Mon Sep 17 00:00:00 2001 From: mkruszynski Date: Wed, 21 Sep 2016 08:28:32 +0200 Subject: [PATCH 013/202] MOTECH-2885: Getting observation by patient and concept uuid --- .../openmrs/resource/ObservationResource.java | 2 +- .../impl/ObservationResourceImpl.java | 4 +-- .../impl/OpenMRSObservationServiceImpl.java | 13 ++++--- .../tasks/OpenMRSTaskDataProvider.java | 17 +++------- .../velocity.templates/task-data-provider.vm | 34 +++++++++++++++++-- .../webapp/messages/messages.properties | 7 ++-- 6 files changed, 51 insertions(+), 26 deletions(-) diff --git a/openmrs/src/main/java/org/motechproject/openmrs/resource/ObservationResource.java b/openmrs/src/main/java/org/motechproject/openmrs/resource/ObservationResource.java index 70f30cc97..8322346d7 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/resource/ObservationResource.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/resource/ObservationResource.java @@ -46,7 +46,7 @@ public interface ObservationResource { * @param conceptUUID the UUID of the concept * @return the latest observation with the given patientUUID and conceptUUID */ - Observation getObservationByPatientUUIDAndConceptUUID(Config config, String patientUUID, String conceptUUID); + ObservationListResult getObservationByPatientUUIDAndConceptUUID(Config config, String patientUUID, String conceptUUID); /** * Creates the given observation on the OpenMRS server. The given {@code config} will be used while performing this diff --git a/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/ObservationResourceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/ObservationResourceImpl.java index 8c5b743c1..a4178ccb3 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/ObservationResourceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/ObservationResourceImpl.java @@ -45,9 +45,9 @@ public Observation getObservationById(Config config, String uuid) { } @Override - public Observation getObservationByPatientUUIDAndConceptUUID(Config config, String patientUUID, String conceptUUID) { + public ObservationListResult getObservationByPatientUUIDAndConceptUUID(Config config, String patientUUID, String conceptUUID) { String responseJson = getJson(config, "/obs?patient={patientUUID}&concept={conceptUUID}&limit=1", patientUUID, conceptUUID); - return (Observation) JsonUtils.readJson(responseJson, Observation.class); + return (ObservationListResult) JsonUtils.readJson(responseJson, ObservationListResult.class); } @Override diff --git a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSObservationServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSObservationServiceImpl.java index a0cf0a787..46aa02f60 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSObservationServiceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSObservationServiceImpl.java @@ -1,5 +1,6 @@ package org.motechproject.openmrs.service.impl; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.Validate; import org.apache.log4j.Logger; import org.motechproject.event.MotechEvent; @@ -10,6 +11,7 @@ import org.motechproject.openmrs.domain.ObservationListResult; import org.motechproject.openmrs.domain.Patient; import org.motechproject.openmrs.exception.ObservationNotFoundException; +import org.motechproject.openmrs.exception.OpenMRSException; import org.motechproject.openmrs.helper.EventHelper; import org.motechproject.openmrs.resource.ConceptResource; import org.motechproject.openmrs.resource.ObservationResource; @@ -100,14 +102,17 @@ public Observation getObservationByUuid(String configName, String uuid) { public Observation getObservationByPatientUUIDAndConceptUUID(String configName, String patientUUID, String conceptUUID) { Validate.notEmpty(patientUUID, "Patient uuid cannot be empty"); Validate.notEmpty(conceptUUID, "Concept uuid cannot be empty"); - Observation observation = null; + ObservationListResult observations; try { Config config = configService.getConfigByName(configName); - observation = obsResource.getObservationByPatientUUIDAndConceptUUID(config, patientUUID, conceptUUID); - return obsResource.getObservationById(config, observation.getUuid()); + observations = obsResource.getObservationByPatientUUIDAndConceptUUID(config, patientUUID, conceptUUID); + if (CollectionUtils.isEmpty(observations.getResults())) { + throw new OpenMRSException("There is no observations for Patient uuid: " + patientUUID + " and Concept uuid: " + conceptUUID); + } + return obsResource.getObservationById(config, observations.getResults().get(0).getUuid()); } catch (HttpClientErrorException e) { - LOGGER.error("Error while fetching observation with Patient uuid: " + patientUUID + " and Concept uuid: " + conceptUUID); + LOGGER.error("Error while fetching observations with Patient uuid: " + patientUUID + " and Concept uuid: " + conceptUUID); return null; } } diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java index 9d0757e85..6af97f827 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java @@ -6,14 +6,7 @@ import org.motechproject.commons.api.DataProvider; import org.motechproject.event.MotechEvent; import org.motechproject.event.listener.annotations.MotechListener; -import org.motechproject.openmrs.domain.Encounter; -import org.motechproject.openmrs.domain.GeneratedIdentifier; -import org.motechproject.openmrs.domain.Patient; -import org.motechproject.openmrs.domain.ProgramEnrollment; -import org.motechproject.openmrs.domain.ProgramEnrollmentListResult; -import org.motechproject.openmrs.domain.Provider; -import org.motechproject.openmrs.domain.Relationship; -import org.motechproject.openmrs.domain.Observation; +import org.motechproject.openmrs.domain.*; import org.motechproject.openmrs.service.OpenMRSEncounterService; import org.motechproject.openmrs.service.OpenMRSGeneratedIdentifierService; import org.motechproject.openmrs.service.OpenMRSObservationService; @@ -59,7 +52,7 @@ import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.PROVIDER; import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.RELATIONSHIP; import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.RELATIONSHIP_TYPE_UUID; -import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.UUID;; +import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.UUID; /** * This is the OpenMRS task data provider that is registered with the task module as a data source. @@ -199,11 +192,11 @@ private Patient getPatient(String lookupName, Map lookupFields, private Observation getObservation(String lookupName, Map lookupFields, String configName) { Observation observation = null; + switch(lookupName) { case BY_PATIENT_UUID_AND_CONCEPT_UUID: - observation = observationService.getObservationByUuid(configName, lookupFields.get(UUID)); - /*observation = observationService.getObservationByPatientUUIDAndConceptUUID(configName, lookupFields.get(PATIENT_UUID), lookupFields.get(CONCEPT_UUID)); - observation = observationService.getObservationByUuid(configName, observation.getUuid());*/ + observation = observationService.getObservationByPatientUUIDAndConceptUUID(configName, + lookupFields.get(PATIENT_UUID), lookupFields.get(CONCEPT_UUID)); break; default: LOGGER.error("Lookup with name {} doesn't exist for observation object", lookupName); break; diff --git a/openmrs/src/main/resources/velocity.templates/task-data-provider.vm b/openmrs/src/main/resources/velocity.templates/task-data-provider.vm index 63b199a69..4ac0837f8 100644 --- a/openmrs/src/main/resources/velocity.templates/task-data-provider.vm +++ b/openmrs/src/main/resources/velocity.templates/task-data-provider.vm @@ -259,8 +259,8 @@ { "displayName": "openMRS.lookup.patientUuidAndConceptUuid", "fields": [ - "openMRS.uuid", - "openMRS.observation.concept.uuid" + "openMRS.patient.uuid", + "openMRS.concept.uuid" ] } ], @@ -274,7 +274,7 @@ "fieldKey": "display" }, { - "displayName": "openMRS.observation.concept.uuid", + "displayName": "openMRS.concept.uuid", "fieldKey": "concept.uuid" }, { @@ -300,6 +300,34 @@ { "displayName": "openMRS.observation.value", "fieldKey": "value" + }, + { + "displayName": "openMRS.observation.valueCodedName", + "fieldKey": "valueCodedName" + }, + { + "displayName": "", + "fieldKey": "" + }, + { + "displayName": "", + "fieldKey": "" + }, + { + "displayName": "", + "fieldKey": "" + }, + { + "displayName": "", + "fieldKey": "" + }, + { + "displayName": "", + "fieldKey": "" + }, + { + "displayName": "", + "fieldKey": "" } ] }, diff --git a/openmrs/src/main/resources/webapp/messages/messages.properties b/openmrs/src/main/resources/webapp/messages/messages.properties index 2018169dc..e61eb61f7 100644 --- a/openmrs/src/main/resources/webapp/messages/messages.properties +++ b/openmrs/src/main/resources/webapp/messages/messages.properties @@ -52,10 +52,6 @@ openMRS.location.display=Location display openMRS.location.uuid=Location UUID openMRS.location.name=Location name -#Observation -openMRS.observation.uuid=Observation UUID -openMRS.observation.concept.uuid=Concept UUID - #Patient openMRS.patient.display=Patient display openMRS.patient.uuid=Patient UUID @@ -63,6 +59,9 @@ openMRS.patient.motechId=Patient MOTECH ID openMRS.patient.identifiers=Patient identifiers openMRS.patient.personAttributes=Person attributes +#Concept +openMRS.concept.uuid=Concept UUID + #Person openMRS.person.age=Person age openMRS.person.birthDateEstimated=Person birthDateEstimated flag From 0bc5711b8e8c447103850b7e59057485a5cc537c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Ja=C5=BCd=C5=BCewski?= Date: Wed, 21 Sep 2016 11:27:30 +0200 Subject: [PATCH 014/202] Moved URI parser to SettingsService --- .../main/java/org/motechproject/dhis2/service/Settings.java | 6 +----- .../dhis2/service/impl/SettingsServiceImpl.java | 4 ++++ 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/dhis2/src/main/java/org/motechproject/dhis2/service/Settings.java b/dhis2/src/main/java/org/motechproject/dhis2/service/Settings.java index b86a0dbee..3e8e0b968 100644 --- a/dhis2/src/main/java/org/motechproject/dhis2/service/Settings.java +++ b/dhis2/src/main/java/org/motechproject/dhis2/service/Settings.java @@ -14,11 +14,7 @@ public class Settings { public Settings() { } public Settings(String serverURI, String username, String password) { - if (serverURI.endsWith("/")) { - this.serverURI = serverURI.substring(0, serverURI.length() - 1); - } else { - this.serverURI = serverURI; - } + this.serverURI = serverURI; this.username = username; this.password = password; } diff --git a/dhis2/src/main/java/org/motechproject/dhis2/service/impl/SettingsServiceImpl.java b/dhis2/src/main/java/org/motechproject/dhis2/service/impl/SettingsServiceImpl.java index 1b8d69f4d..519607557 100644 --- a/dhis2/src/main/java/org/motechproject/dhis2/service/impl/SettingsServiceImpl.java +++ b/dhis2/src/main/java/org/motechproject/dhis2/service/impl/SettingsServiceImpl.java @@ -60,6 +60,10 @@ private synchronized void loadSettings() { LOGGER.debug("Loading DHIS2 settings..."); Gson gson = new Gson(); settings = gson.fromJson(jsonText, Settings.class); + String URI = settings.getServerURI(); + if(settings.getServerURI().endsWith("/")) { + settings.setServerURI(URI.substring(0,URI.length()-1)); + } } catch (Exception e) { String message = "There was an error loading json from the DHIS2 settings."; LOGGER.debug(message); From f7921edff7ba6e89b5ba95355f6efb5b0f0333b4 Mon Sep 17 00:00:00 2001 From: mkruszynski Date: Wed, 21 Sep 2016 14:07:02 +0200 Subject: [PATCH 015/202] MOTECH-2885: Added observation data source --- .../openmrs/domain/Observation.java | 77 +++++++++++++++++-- .../impl/ObservationResourceImpl.java | 8 +- .../velocity.templates/task-data-provider.vm | 48 ++++++------ .../impl/ObservationResourceImplTest.java | 19 +++++ .../observation-query-response.json | 17 ++++ 5 files changed, 137 insertions(+), 32 deletions(-) create mode 100644 openmrs/src/test/resources/json/observation/observation-query-response.json diff --git a/openmrs/src/main/java/org/motechproject/openmrs/domain/Observation.java b/openmrs/src/main/java/org/motechproject/openmrs/domain/Observation.java index 1d45b122c..c3bf75729 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/domain/Observation.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/domain/Observation.java @@ -1,10 +1,6 @@ package org.motechproject.openmrs.domain; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonPrimitive; -import com.google.gson.JsonSerializationContext; -import com.google.gson.JsonSerializer; +import com.google.gson.*; import java.lang.reflect.Type; import java.text.SimpleDateFormat; @@ -26,6 +22,12 @@ public class Observation { private Date obsDatetime; private Person person; private List groupsMembers; + private Boolean voided; + private String valueModifier; + private String valueCodedName; + private String obsGroup; + private Location location; + private String orderUuid; public String getUuid() { return uuid; @@ -95,6 +97,54 @@ public void setGroupsMembers(List groupsMembers) { this.groupsMembers = groupsMembers; } + public Boolean getVoided () { + return voided; + } + + public void setVoided (Boolean voided) { + this.voided = voided; + } + + public String getValueModifier () { + return valueModifier; + } + + public void setValueModifier (String valueModifier) { + this.valueModifier = valueModifier; + } + + public String getValueCodedName () { + return valueCodedName; + } + + public void setValueCodedName (String valueCodedName) { + this.valueCodedName = valueCodedName; + } + + public String getObsGroup () { + return obsGroup; + } + + public void setObsGroup (String obsGroup) { + this.obsGroup = obsGroup; + } + + public Location getLocation () { + return location; + } + + public void setLocation (Location location) { + this.location = location; + } + + public String getOrderUuid () { + return orderUuid; + } + + public void setOrderUuid (String orderUuid) { + this.orderUuid = orderUuid; + } + @Override public int hashCode() { return Objects.hash(uuid, display, concept, encounter, value, obsDatetime, person, groupsMembers); @@ -192,4 +242,21 @@ public JsonElement serialize(ObservationValue src, Type typeOfSrc, JsonSerializa return new JsonPrimitive(src.getDisplay()); } } + + public static class ObservationValueDeserializer implements JsonDeserializer { + @Override + public ObservationValue deserialize (JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + ObservationValue observationValue = new ObservationValue(null); + + if (json.isJsonObject()) { + JsonObject jsonObject = json.getAsJsonObject(); + observationValue.setDisplay(jsonObject.get("display").getAsString()); + } else if (json.isJsonPrimitive()) { + JsonPrimitive jsonPrimitive = json.getAsJsonPrimitive(); + observationValue.setDisplay(jsonPrimitive.getAsString()); + } + + return observationValue; + } + } } diff --git a/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/ObservationResourceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/ObservationResourceImpl.java index a4178ccb3..aa623aa05 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/ObservationResourceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/ObservationResourceImpl.java @@ -15,6 +15,10 @@ import org.springframework.stereotype.Component; import org.springframework.web.client.RestOperations; +import java.lang.reflect.Type; +import java.util.HashMap; +import java.util.Map; + @Component public class ObservationResourceImpl extends BaseResource implements ObservationResource { @@ -40,8 +44,10 @@ public void voidObservation(Config config, String id, String reason) { @Override public Observation getObservationById(Config config, String uuid) { + Map adapter = new HashMap<>(); + adapter.put(Observation.ObservationValue.class, new Observation.ObservationValueDeserializer()); String responseJson = getJson(config, "/obs/{uuid}?v=full", uuid); - return (Observation) JsonUtils.readJson(responseJson, Observation.class); + return (Observation) JsonUtils.readJsonWithAdapters(responseJson, Observation.class, adapter); } @Override diff --git a/openmrs/src/main/resources/velocity.templates/task-data-provider.vm b/openmrs/src/main/resources/velocity.templates/task-data-provider.vm index 4ac0837f8..b11de8610 100644 --- a/openmrs/src/main/resources/velocity.templates/task-data-provider.vm +++ b/openmrs/src/main/resources/velocity.templates/task-data-provider.vm @@ -282,52 +282,48 @@ "fieldKey": "person.uuid" }, { - "displayName": "openMRS.observation.dateTime", - "fieldKey": "obsDateTime" + "displayName": "openMRS.observation.obsDatetime", + "fieldKey": "obsDatetime" }, { - "displayName": "openMRS.observation.group", - "fieldKey": "groupsMembers" + "displayName": "openMRS.observation.obsGroup", + "fieldKey": "obsGroup" }, { - "displayName": "openMRS.observation.groupMembers", - "fieldKey": "endDate" - }, - { - "displayName": "openMRS.encounter.uuid", - "fieldKey": "encounter.uuid" + "displayName": "openMRS.observation.valueCodedName", + "fieldKey": "valueCodedName" }, { - "displayName": "openMRS.observation.value", - "fieldKey": "value" + "displayName": "openMRS.observation.groupsMembers", + "fieldKey": "groupsMembers" }, { - "displayName": "openMRS.observation.valueCodedName", - "fieldKey": "valueCodedName" + "displayName": "openMRS.location.uuid", + "fieldKey": "location.uuid" }, { - "displayName": "", - "fieldKey": "" + "displayName": "openMRS.location.display", + "fieldKey": "location.display" }, { - "displayName": "", - "fieldKey": "" + "displayName": "openMRS.observation.orderUuid", + "fieldKey": "orderUuid" }, { - "displayName": "", - "fieldKey": "" + "displayName": "openMRS.encounter.uuid", + "fieldKey": "encounter.uuid" }, { - "displayName": "", - "fieldKey": "" + "displayName": "openMRS.observation.voided", + "fieldKey": "voided" }, { - "displayName": "", - "fieldKey": "" + "displayName": "openMRS.observation.value", + "fieldKey": "value.display" }, { - "displayName": "", - "fieldKey": "" + "displayName": "openMRS.observation.valueModifier", + "fieldKey": "valueModifier" } ] }, diff --git a/openmrs/src/test/java/org/motechproject/openmrs/resource/impl/ObservationResourceImplTest.java b/openmrs/src/test/java/org/motechproject/openmrs/resource/impl/ObservationResourceImplTest.java index eae040edb..f00d4209c 100644 --- a/openmrs/src/test/java/org/motechproject/openmrs/resource/impl/ObservationResourceImplTest.java +++ b/openmrs/src/test/java/org/motechproject/openmrs/resource/impl/ObservationResourceImplTest.java @@ -29,6 +29,7 @@ public class ObservationResourceImplTest extends AbstractResourceImplTest { private static final String OBSERVATION_LIST_RESPONSE_JSON = "json/observation/observation-list-response.json"; + private static final String OBSERVATION_QUERY_RESPONSE_JSON = "json/observation/observation-query-response.json"; @Mock private RestOperations restOperations; @@ -69,4 +70,22 @@ public void shouldQueryForObservationByPatientId() throws Exception { assertThat(requestCaptor.getValue().getBody(), nullValue()); } + @Test + public void shouldQueryForObservationByPatientIdAndConceptId() throws Exception { + String patientId = "OOO"; + String conceptId = "CCC"; + URI url = config.toInstancePathWithParams("/obs?patient={patientUUID}&concept={conceptUUID}&limit=1", patientId, conceptId); + + when(restOperations.exchange(eq(url), eq(HttpMethod.GET), any(HttpEntity.class), eq(String.class))) + .thenReturn(getResponseFromFile(OBSERVATION_QUERY_RESPONSE_JSON)); + + ObservationListResult result = observationResource.getObservationByPatientUUIDAndConceptUUID(config, patientId, conceptId); + + verify(restOperations).exchange(eq(url), eq(HttpMethod.GET), requestCaptor.capture(), eq(String.class)); + + assertThat(result, equalTo(readFromFile(OBSERVATION_QUERY_RESPONSE_JSON, ObservationListResult.class))); + assertThat(requestCaptor.getValue().getHeaders(), equalTo(getHeadersForGet(config))); + assertThat(requestCaptor.getValue().getBody(), nullValue()); + } + } diff --git a/openmrs/src/test/resources/json/observation/observation-query-response.json b/openmrs/src/test/resources/json/observation/observation-query-response.json new file mode 100644 index 000000000..2ca384307 --- /dev/null +++ b/openmrs/src/test/resources/json/observation/observation-query-response.json @@ -0,0 +1,17 @@ +{ + "results":[ + { + "uuid":"DDD", + "display":"Temperature (C): 37.0", + "concept":{ + "uuid":"9bdb3fb6-4d07-11e1-a4ea-00ff26c46bb6", + "display": "CCC" + }, + "value":{ + "display":"VVV" + }, + "obsDatetime":"1962-01-01T00:00:00.000+0000", + "groupMembers":null + } + ] +} From 670c1b551a7f6b3e7d3cc03c0b938385bfa6d786 Mon Sep 17 00:00:00 2001 From: Jakub Banasiewicz Date: Wed, 21 Sep 2016 14:18:19 +0200 Subject: [PATCH 016/202] Encounter UUID as post-action field - Integration Tests --- openmrs/logger.txt | 880 ++++++++++++++++++ .../it/MRSTasksIntegrationBundleIT.java | 72 ++ 2 files changed, 952 insertions(+) create mode 100644 openmrs/logger.txt diff --git a/openmrs/logger.txt b/openmrs/logger.txt new file mode 100644 index 000000000..e7d84dc02 --- /dev/null +++ b/openmrs/logger.txt @@ -0,0 +1,880 @@ +[INFO] Scanning for projects... +[INFO] +[INFO] ------------------------------------------------------------------------ +[INFO] Building OpenMRS 0.30-SNAPSHOT +[INFO] ------------------------------------------------------------------------ +[INFO] +[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ openmrs --- +[INFO] Deleting /home/nextuser/workspace/modules/openmrs/target +[INFO] +[INFO] --- maven-enforcer-plugin:1.4.1:enforce (enforce-dependency-convergence) @ openmrs --- +[INFO] +[INFO] --- properties-maven-plugin:1.0-alpha-2:read-project-properties (default) @ openmrs --- +[INFO] +[INFO] --- build-helper-maven-plugin:1.7:parse-version (default) @ openmrs --- +[INFO] +[INFO] --- maven-resources-plugin:2.5:resources (default) @ openmrs --- +[debug] execute contextualize +[INFO] Using 'UTF-8' encoding to copy filtered resources. +[INFO] Copying 0 resource +[INFO] Copying 12 resources +[INFO] +[INFO] --- maven-dependency-plugin:2.8:resolve (list-dependencies) @ openmrs --- +[INFO] +[INFO] --- maven-dependency-plugin:2.8:copy-dependencies (copy-osgi-dependencies) @ openmrs --- +[INFO] paranamer-2.6-sources.jar already exists in destination. +[INFO] kahadb-5.4.2.jar already exists in destination. +[INFO] org.apache.servicemix.bundles.spring-context-3.2.16.RELEASE_1.jar already exists in destination. +[INFO] org.apache.servicemix.bundles.paranamer-2.6_1.jar already exists in destination. +[INFO] org.apache.servicemix.specs.saaj-api-1.3-2.2.0.jar already exists in destination. +[INFO] aopalliance-1.0.jar already exists in destination. +[INFO] quartz-2.2.1.jar already exists in destination. +[INFO] datanucleus-core-4.0.1.jar already exists in destination. +[INFO] org.apache.felix.eventadmin-1.3.2.jar already exists in destination. +[INFO] motech-tasks-0.30-SNAPSHOT.jar already exists in destination. +[INFO] maven-scm-provider-svnexe-1.4.jar already exists in destination. +[INFO] org.apache.servicemix.bundles.saaj-impl-1.3.25_1.jar already exists in destination. +[INFO] motech-platform-dataservices-migration-0.30-SNAPSHOT.jar already exists in destination. +[INFO] javax.management.j2ee-api-1.1.1.jar already exists in destination. +[INFO] org.apache.servicemix.bundles.spring-expression-3.2.16.RELEASE_1.jar already exists in destination. +[INFO] datanucleus-rdbms-4.0.1.jar already exists in destination. +[INFO] datanucleus-java8-4.0.5.jar already exists in destination. +[INFO] org.apache.servicemix.bundles.spring-aop-3.2.16.RELEASE_1.jar already exists in destination. +[INFO] mimepull-1.9.jar already exists in destination. +[INFO] asm-commons-5.0.3.jar already exists in destination. +[INFO] commons-digester-2.1.jar already exists in destination. +[INFO] org.eclipse.gemini.blueprint.core-1.0.2.RELEASE.jar already exists in destination. +[INFO] motech-platform-commons-date-0.30-SNAPSHOT.jar already exists in destination. +[INFO] commons-logging-1.1.1.jar already exists in destination. +[INFO] commons-io-2.4.jar already exists in destination. +[INFO] commons-beanutils-1.9.2.jar already exists in destination. +[INFO] flyway-core-2.3.1.jar already exists in destination. +[INFO] spring-security-web-3.2.8.RELEASE.jar already exists in destination. +[INFO] motech-osgi-platform-0.30-SNAPSHOT.jar already exists in destination. +[INFO] time-api-0.6.3.jar already exists in destination. +[INFO] commons-fileupload-1.3.1.jar already exists in destination. +[INFO] super-csv-2.2.0.jar already exists in destination. +[INFO] com.springsource.javax.servlet-2.5.0.jar already exists in destination. +[INFO] org.apache.servicemix.bundles.jsch-0.1.51_1.jar already exists in destination. +[INFO] org.apache.bval.bundle-0.5.jar already exists in destination. +[INFO] org.apache.servicemix.bundles.spring-web-3.2.16.RELEASE_1.jar already exists in destination. +[INFO] org.apache.servicemix.bundles.c3p0-0.9.1.2_1.jar already exists in destination. +[INFO] joda-time-2.9.1.jar already exists in destination. +[INFO] regexp-1.3.jar already exists in destination. +[INFO] spring-security-core-3.2.8.RELEASE.jar already exists in destination. +[INFO] asm-5.0.3.jar already exists in destination. +[INFO] bval-core-0.5.jar already exists in destination. +[INFO] motech-platform-event-0.30-SNAPSHOT.jar already exists in destination. +[INFO] maven-scm-api-1.4.jar already exists in destination. +[INFO] spring-orm-3.2.16.RELEASE.jar already exists in destination. +[INFO] commons-lang-2.6.jar already exists in destination. +[INFO] activation-1.1.jar already exists in destination. +[INFO] commons-vfs2-2.0.jar already exists in destination. +[INFO] com.springsource.org.apache.commons.httpclient-3.1.0.jar already exists in destination. +[INFO] motech-platform-dataservices-0.30-SNAPSHOT.jar already exists in destination. +[INFO] commons-codec-1.10.jar already exists in destination. +[INFO] javassist-3.18.1-GA.jar already exists in destination. +[INFO] motech-platform-config-core-0.30-SNAPSHOT.jar already exists in destination. +[INFO] org.apache.servicemix.bundles.velocity-1.6.4_4.jar already exists in destination. +[INFO] org.apache.servicemix.bundles.spring-core-3.2.16.RELEASE_1.jar already exists in destination. +[INFO] org.apache.servicemix.bundles.spring-context-support-3.2.16.RELEASE_1.jar already exists in destination. +[INFO] org.apache.servicemix.bundles.spring-security-config-3.2.8.RELEASE_1.jar already exists in destination. +[INFO] jta-1.1.jar already exists in destination. +[INFO] org.apache.servicemix.specs.activation-api-1.1-2.4.0.jar already exists in destination. +[INFO] ow2-ejb-3.1-spec-1.0.13.jar already exists in destination. +[INFO] stax-api-1.0-2.jar already exists in destination. +[INFO] javax.xml.rpc-api-1.1.1.jar already exists in destination. +[INFO] guava-18.0.jar already exists in destination. +[INFO] org.motechproject.spring-orm-3.2.16.RELEASE_1-r033.jar already exists in destination. +[INFO] org.eclipse.gemini.blueprint.io-1.0.2.RELEASE.jar already exists in destination. +[INFO] org.apache.servicemix.bundles.howl-1.0.1-1_3.jar already exists in destination. +[INFO] org.apache.servicemix.bundles.spring-webmvc-3.2.16.RELEASE_1.jar already exists in destination. +[INFO] motech-platform-commons-api-0.30-SNAPSHOT.jar already exists in destination. +[INFO] motech-platform-osgi-extender-fragment-0.30-SNAPSHOT.jar already exists in destination. +[INFO] jdo-api-3.0.1.jar already exists in destination. +[INFO] oro-2.0.8.jar already exists in destination. +[INFO] slf4j-api-1.7.7.jar already exists in destination. +[INFO] org.osgi.compendium-5.0.0.jar already exists in destination. +[INFO] org.motechproject.reflections-0.9.9-r033.jar already exists in destination. +[INFO] com.springsource.javax.transaction-1.1.0.jar already exists in destination. +[INFO] org.apache.servicemix.bundles.spring-beans-3.2.16.RELEASE_1.jar already exists in destination. +[INFO] postgresql-9.1-901.jdbc4.jar already exists in destination. +[INFO] datanucleus-api-jdo-4.0.1.jar already exists in destination. +[INFO] annotations-2.0.1.jar already exists in destination. +[INFO] org.motechproject.org.codehaus.jackson-1.9.7-r033.jar already exists in destination. +[INFO] com.springsource.javax.jms-1.1.0.jar already exists in destination. +[INFO] mysql-connector-java-5.1.32.jar already exists in destination. +[INFO] log4j-1.2.17.jar already exists in destination. +[INFO] org.motechproject.com.google.code.gson-1.7.1-r033.jar already exists in destination. +[INFO] maven-scm-provider-svn-commons-1.4.jar already exists in destination. +[INFO] org.apache.servicemix.bundles.aopalliance-1.0_6.jar already exists in destination. +[INFO] spring-integration-core-2.1.0.RELEASE.jar already exists in destination. +[INFO] itextpdf-5.5.6.jar already exists in destination. +[INFO] motech-platform-osgi-web-util-0.30-SNAPSHOT.jar already exists in destination. +[INFO] datanucleus-jodatime-4.0.6.jar already exists in destination. +[INFO] org.apache.servicemix.bundles.spring-tx-3.2.16.RELEASE_1.jar already exists in destination. +[INFO] org.motechproject.javax.time-0.6.3-r033.jar already exists in destination. +[INFO] org.eclipse.gemini.blueprint.extender-1.0.2.RELEASE.jar already exists in destination. +[INFO] org.apache.servicemix.bundles.aspectj-1.8.5_1.jar already exists in destination. +[INFO] org.apache.servicemix.bundles.hamcrest-1.3_1.jar already exists in destination. +[INFO] commons-net-3.2.jar already exists in destination. +[INFO] bval-jsr303-0.5.jar already exists in destination. +[INFO] jcl-over-slf4j-1.7.7.jar already exists in destination. +[INFO] org.apache.servicemix.bundles.spring-jdbc-3.2.16.RELEASE_1.jar already exists in destination. +[INFO] org.motechproject.org.apache.activemq-5.4.2-r033.jar already exists in destination. +[INFO] motech-platform-commons-sql-0.30-SNAPSHOT.jar already exists in destination. +[INFO] commons-lang3-3.1.jar already exists in destination. +[INFO] org.apache.servicemix.bundles.spring-jms-3.2.16.RELEASE_1.jar already exists in destination. +[INFO] paranamer-2.6.jar already exists in destination. +[INFO] commons-configuration-1.10.jar already exists in destination. +[INFO] org.apache.servicemix.bundles.dom4j-1.6.1_5.jar already exists in destination. +[INFO] org.motechproject.org.postgresql-9.1-901.jdbc4-r033.jar already exists in destination. +[INFO] stax-ex-1.7.4.jar already exists in destination. +[INFO] motech-platform-server-config-0.30-SNAPSHOT.jar already exists in destination. +[INFO] commons-beanutils-core-1.8.3.jar already exists in destination. +[INFO] org.motechproject.com.googlecode.lambdaj-2.3.3-r033.jar already exists in destination. +[INFO] objenesis-2.1.jar already exists in destination. +[INFO] jackrabbit-webdav-2.9.1.jar already exists in destination. +[INFO] commons-validator-1.4.1.jar already exists in destination. +[INFO] asm-tree-5.0.3.jar already exists in destination. +[INFO] org.apache.servicemix.bundles.cglib-2.2.2_1.jar already exists in destination. +[INFO] spring-integration-jms-2.1.0.RELEASE.jar already exists in destination. +[INFO] commons-collections-3.2.2.jar already exists in destination. +[INFO] slf4j-log4j12-1.7.7.jar already exists in destination. +[INFO] com.springsource.javax.validation-1.0.0.GA.jar already exists in destination. +[INFO] org.eclipse.osgi.services-3.3.0.v20110513.jar already exists in destination. +[INFO] reflections-0.9.9.jar already exists in destination. +[INFO] commons-httpclient-3.1.jar already exists in destination. +[INFO] +[INFO] --- maven-resources-plugin:2.5:resources (default-resources) @ openmrs --- +[debug] execute contextualize +[INFO] Using 'UTF-8' encoding to copy filtered resources. +[INFO] Copying 0 resource +[INFO] Copying 12 resources +[INFO] +[INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ openmrs --- +[INFO] Compiling 121 source files to /home/nextuser/workspace/modules/openmrs/target/classes +[INFO] +[INFO] >>> maven-pmd-plugin:3.5:check (default) @ openmrs >>> +[INFO] +[INFO] --- maven-pmd-plugin:3.5:pmd (pmd) @ openmrs --- +[INFO] +[INFO] <<< maven-pmd-plugin:3.5:check (default) @ openmrs <<< +[INFO] +[INFO] --- maven-pmd-plugin:3.5:check (default) @ openmrs --- +[INFO] +[INFO] +[INFO] >>> maven-pmd-plugin:3.5:cpd-check (default) @ openmrs >>> +[INFO] +[INFO] --- maven-pmd-plugin:3.5:cpd (cpd) @ openmrs --- +[INFO] +[INFO] <<< maven-pmd-plugin:3.5:cpd-check (default) @ openmrs <<< +[INFO] +[INFO] --- maven-pmd-plugin:3.5:cpd-check (default) @ openmrs --- +[INFO] +[INFO] +[INFO] --- maven-checkstyle-plugin:2.10:check (default) @ openmrs --- +[INFO] Starting audit... +/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSConfigServiceImpl.java:170:77: '-' is not preceded with whitespace. +/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSConfigServiceImpl.java:170:78: '-' is not followed by whitespace. +/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTasksNotifier.java:0: File does not end with a newline. +/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java:82:20: warning: More than 7 parameters (found 28). +/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java:117:17: warning: More than 7 parameters (found 26). +/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java:163:41: warning: '(' is preceded with whitespace. +/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java:304:20: warning: More than 7 parameters (found 24). +/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java:80:12: warning: More than 7 parameters (found 8). +/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java:145:13: warning: switch without "default" clause. +/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java:221:49: warning: Avoid nested blocks. +/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java:229:44: warning: Avoid nested blocks. +/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java:237:22: warning: Avoid nested blocks. +/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java:262:13: warning: switch without "default" clause. +/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java:263:53: warning: Avoid nested blocks. +/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java:268:48: warning: Avoid nested blocks. +/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java:305:11: 'if' is not followed by whitespace. +/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java:319:11: 'if' is not followed by whitespace. +/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSActionProxyService.java:70:13: warning: More than 7 parameters (found 28). +/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSActionProxyService.java:120:10: warning: More than 7 parameters (found 26). +/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSActionProxyService.java:153:34: warning: '(' is preceded with whitespace. +/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/domain/AttributeTypeListResult.java:0: File does not end with a newline. +/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/domain/Person.java:127:16: warning: More than 7 parameters (found 15). +/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/domain/Attribute.java:166:113: Redundant throws: 'JsonParseException' is unchecked exception. +/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/domain/RoleListResult.java:0: File does not end with a newline. +/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/domain/AttributeListResult.java:13:39: warning: '(' is preceded with whitespace. +/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/domain/AttributeListResult.java:17:28: warning: '(' is preceded with whitespace. +/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/PersonResourceImpl.java:58:65: warning: '(' is preceded with whitespace. +Audit done. + +[INFO] +[INFO] --- maven-resources-plugin:2.5:testResources (default-testResources) @ openmrs --- +[debug] execute contextualize +[INFO] Using 'UTF-8' encoding to copy filtered resources. +[INFO] Copying 54 resources +[INFO] +[INFO] --- maven-compiler-plugin:2.5.1:testCompile (default-testCompile) @ openmrs --- +[INFO] Compiling 37 source files to /home/nextuser/workspace/modules/openmrs/target/test-classes +[INFO] +[INFO] --- maven-surefire-plugin:2.17:test (default-test) @ openmrs --- +[INFO] Surefire report directory: /home/nextuser/workspace/modules/openmrs/target/surefire-reports +[INFO] Using configured provider org.apache.maven.surefire.junitcore.JUnitCoreProvider +[INFO] parallel='none', perCoreThreadCount=true, threadCount=0, useUnlimitedThreads=false, threadCountSuites=0, threadCountClasses=0, threadCountMethods=0, parallelOptimized=true + +------------------------------------------------------- + T E S T S +------------------------------------------------------- +Java HotSpot(TM) 64-Bit Server VM warning: ignoring option UseSplitVerifier; support was removed in 8.0 +Running org.motechproject.openmrs.service.impl.OpenMRSConfigServiceImplTest +Tests run: 14, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.428 sec - in org.motechproject.openmrs.service.impl.OpenMRSConfigServiceImplTest +Running org.motechproject.openmrs.config.ConfigsTest +Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.008 sec - in org.motechproject.openmrs.config.ConfigsTest +Running org.motechproject.openmrs.tasks.OpenMRSTaskDataProviderBuilderTest +Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.124 sec - in org.motechproject.openmrs.tasks.OpenMRSTaskDataProviderBuilderTest +Running org.motechproject.openmrs.tasks.builder.OpenMRSTriggerBuilderTest +Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.002 sec - in org.motechproject.openmrs.tasks.builder.OpenMRSTriggerBuilderTest +Running org.motechproject.openmrs.tasks.builder.DisplayNameHelperTest +Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.056 sec - in org.motechproject.openmrs.tasks.builder.DisplayNameHelperTest +Running org.motechproject.openmrs.tasks.impl.OpenMRSActionProxyServiceTest +2016-09-21 13:40:03,691 main WARN [org.motechproject.openmrs.tasks.impl.OpenMRSActionProxyServiceImpl] There is no location with name testLocationNameForNotExistingLocation +Tests run: 10, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.213 sec - in org.motechproject.openmrs.tasks.impl.OpenMRSActionProxyServiceTest +Running org.motechproject.openmrs.tasks.OpenMRSTaskDataProviderTest +2016-09-21 13:40:03,774 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider +2016-09-21 13:40:03,782 main WARN [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Active Program Only field should be 'true' or 'false', actually is "%s". +2016-09-21 13:40:03,783 main WARN [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Multiple program enrollment found with the patient UUID "495b10c4-56bd-11df-a35e-0027136865c4" and program name "program". +2016-09-21 13:40:03,791 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider +2016-09-21 13:40:03,801 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider +2016-09-21 13:40:03,803 main WARN [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Active Program Only field should be 'true' or 'false', actually is "%s". +2016-09-21 13:40:03,803 main WARN [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Multiple program enrollment found with the patient MOTECH Id "3" and program name "program". +2016-09-21 13:40:03,815 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider +2016-09-21 13:40:03,817 main WARN [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Active Program Only field should be 'true' or 'false', actually is "%s". +2016-09-21 13:40:03,825 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider +2016-09-21 13:40:03,831 main WARN [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Active Program Only field should be 'true' or 'false', actually is "%s". +2016-09-21 13:40:03,843 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider +2016-09-21 13:40:03,858 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider +2016-09-21 13:40:03,860 main WARN [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Multiple program enrollment found with the patient MOTECH Id "3" and program name "program". +2016-09-21 13:40:03,871 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider +2016-09-21 13:40:03,880 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider +2016-09-21 13:40:03,889 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider +2016-09-21 13:40:03,890 main WARN [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Multiple program enrollment found with the patient UUID "495b10c4-56bd-11df-a35e-0027136865c4" and program name "program". +2016-09-21 13:40:03,898 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider +2016-09-21 13:40:03,905 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider +2016-09-21 13:40:03,907 main ERROR [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Class testClass not found by provider openMRS +java.lang.ClassNotFoundException: org.motechproject.openmrs.domain.testClass + at java.net.URLClassLoader.findClass(URLClassLoader.java:381) + at java.lang.ClassLoader.loadClass(ClassLoader.java:424) + at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) + at java.lang.ClassLoader.loadClass(ClassLoader.java:357) + at org.motechproject.commons.api.AbstractDataProvider.getClassForType(AbstractDataProvider.java:56) + at org.motechproject.commons.api.AbstractDataProvider.supports(AbstractDataProvider.java:46) + at org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider.lookup(OpenMRSTaskDataProvider.java:144) + at org.motechproject.openmrs.tasks.OpenMRSTaskDataProviderTest.shouldReturnNullWhenClassIsNotSupported(OpenMRSTaskDataProviderTest.java:119) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:498) + at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) + at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) + at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) + at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) + at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) + at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) + at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:69) + at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:48) + at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) + at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) + at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) + at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) + at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) + at org.junit.runners.ParentRunner.run(ParentRunner.java:292) + at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl.run(JUnit45AndHigherRunnerImpl.java:37) + at org.mockito.runners.MockitoJUnitRunner.run(MockitoJUnitRunner.java:62) + at org.junit.runners.Suite.runChild(Suite.java:128) + at org.junit.runners.Suite.runChild(Suite.java:24) + at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) + at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) + at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) + at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) + at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) + at org.junit.runners.ParentRunner.run(ParentRunner.java:292) + at org.junit.runner.JUnitCore.run(JUnitCore.java:157) + at org.junit.runner.JUnitCore.run(JUnitCore.java:136) + at org.apache.maven.surefire.junitcore.JUnitCoreWrapper.createRequestAndRun(JUnitCoreWrapper.java:113) + at org.apache.maven.surefire.junitcore.JUnitCoreWrapper.executeEager(JUnitCoreWrapper.java:85) + at org.apache.maven.surefire.junitcore.JUnitCoreWrapper.execute(JUnitCoreWrapper.java:54) + at org.apache.maven.surefire.junitcore.JUnitCoreProvider.invoke(JUnitCoreProvider.java:134) + at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200) + at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153) + at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103) +2016-09-21 13:40:03,915 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider +2016-09-21 13:40:03,915 main ERROR [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Lookup with name wrongLookupName doesn't exist for encounter object +2016-09-21 13:40:03,921 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider +2016-09-21 13:40:03,928 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider +2016-09-21 13:40:03,935 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider +2016-09-21 13:40:03,941 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider +2016-09-21 13:40:03,942 main ERROR [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Lookup with name wrongLookupName doesn't exist for patient object +2016-09-21 13:40:03,946 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider +2016-09-21 13:40:03,952 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider +2016-09-21 13:40:03,958 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider +2016-09-21 13:40:03,969 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider +2016-09-21 13:40:03,975 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider +2016-09-21 13:40:03,981 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider +2016-09-21 13:40:03,986 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider +2016-09-21 13:40:03,987 main ERROR [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Lookup with name wrongLookupName doesn't exist for provider object +2016-09-21 13:40:03,992 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider +2016-09-21 13:40:04,000 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider +2016-09-21 13:40:04,006 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider +2016-09-21 13:40:04,012 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider +2016-09-21 13:40:04,020 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider +2016-09-21 13:40:04,020 main ERROR [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Lookup with name wrongLookupName doesn't exist for patient object +2016-09-21 13:40:04,021 main WARN [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Active Program Only field should be 'true' or 'false', actually is "%s". +Tests run: 29, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.255 sec - in org.motechproject.openmrs.tasks.OpenMRSTaskDataProviderTest +Running org.motechproject.openmrs.validation.ConfigValidatorTest +Tests run: 13, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.019 sec - in org.motechproject.openmrs.validation.ConfigValidatorTest +Running org.motechproject.openmrs.domain.PasswordTest +Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.005 sec - in org.motechproject.openmrs.domain.PasswordTest +Running org.motechproject.openmrs.resource.impl.CohortResourceImplTest +2016-09-21 13:40:04,204 main INFO [org.motechproject.openmrs.resource.impl.CohortResourceImpl] Querying Cohort Query endpoint returned report with 3 members +2016-09-21 13:40:04,223 main INFO [org.motechproject.openmrs.resource.impl.CohortResourceImpl] Querying Cohort Query endpoint returned report with 3 members +Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.17 sec - in org.motechproject.openmrs.resource.impl.CohortResourceImplTest +Running org.motechproject.openmrs.resource.impl.GeneratedIdentifierResourceImplTest +Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.011 sec - in org.motechproject.openmrs.resource.impl.GeneratedIdentifierResourceImplTest +Running org.motechproject.openmrs.resource.impl.PatientResourceImplTest +Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.104 sec - in org.motechproject.openmrs.resource.impl.PatientResourceImplTest +Running org.motechproject.openmrs.resource.impl.RelationshipResourceImplTest +Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.006 sec - in org.motechproject.openmrs.resource.impl.RelationshipResourceImplTest +Running org.motechproject.openmrs.resource.impl.LocationResourceImplTest +Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.028 sec - in org.motechproject.openmrs.resource.impl.LocationResourceImplTest +Running org.motechproject.openmrs.resource.impl.ConceptResourceImplTest +Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.028 sec - in org.motechproject.openmrs.resource.impl.ConceptResourceImplTest +Running org.motechproject.openmrs.resource.impl.PersonResourceImplTest +Tests run: 10, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.068 sec - in org.motechproject.openmrs.resource.impl.PersonResourceImplTest +Running org.motechproject.openmrs.resource.impl.EncounterResourceImplTest +2016-09-21 13:40:04,521 main ERROR [org.motechproject.openmrs.util.JsonUtils] Failed to parse date: Unparseable date: "2012-06-03T00:00:00.000Z" +2016-09-21 13:40:04,522 main ERROR [org.motechproject.openmrs.util.JsonUtils] Failed to parse date: Unparseable date: "2012-06-03T00:00:00.000Z" +2016-09-21 13:40:04,525 main ERROR [org.motechproject.openmrs.util.JsonUtils] Failed to parse date: Unparseable date: "2012-06-03T00:00:00.000Z" +2016-09-21 13:40:04,526 main ERROR [org.motechproject.openmrs.util.JsonUtils] Failed to parse date: Unparseable date: "2012-06-03T00:00:00.000Z" +2016-09-21 13:40:04,532 main ERROR [org.motechproject.openmrs.util.JsonUtils] Failed to parse date: Unparseable date: "2012-06-03T00:00:00.000Z" +2016-09-21 13:40:04,533 main ERROR [org.motechproject.openmrs.util.JsonUtils] Failed to parse date: Unparseable date: "2012-06-03T00:00:00.000Z" +2016-09-21 13:40:04,535 main ERROR [org.motechproject.openmrs.util.JsonUtils] Failed to parse date: Unparseable date: "2012-06-03T00:00:00.000Z" +2016-09-21 13:40:04,536 main ERROR [org.motechproject.openmrs.util.JsonUtils] Failed to parse date: Unparseable date: "2012-06-03T00:00:00.000Z" +Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.055 sec - in org.motechproject.openmrs.resource.impl.EncounterResourceImplTest +Running org.motechproject.openmrs.resource.impl.ProgramEnrollmentResourceImplTest +Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.049 sec - in org.motechproject.openmrs.resource.impl.ProgramEnrollmentResourceImplTest +Running org.motechproject.openmrs.resource.impl.ObservationResourceImplTest +Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.006 sec - in org.motechproject.openmrs.resource.impl.ObservationResourceImplTest +Running org.motechproject.openmrs.resource.impl.UserResourceImplTest +Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.032 sec - in org.motechproject.openmrs.resource.impl.UserResourceImplTest + +Results : + +Tests run: 126, Failures: 0, Errors: 0, Skipped: 0 + +[INFO] +[INFO] --- maven-bundle-plugin:2.5.3:bundle (default-bundle) @ openmrs --- +[WARNING] Bundle org.motechproject:openmrs:bundle:0.30-SNAPSHOT : Export org.motechproject.openmrs.service, has 1, private references [org.motechproject.openmrs.config], +[WARNING] Bundle org.motechproject:openmrs:bundle:0.30-SNAPSHOT : Export org.motechproject.openmrs.tasks, has 1, private references [org.motechproject.openmrs.tasks.builder], +[INFO] +[INFO] --- maven-resources-plugin:2.5:copy-resources (copy-bundles) @ openmrs --- +[debug] execute contextualize +[INFO] Using 'UTF-8' encoding to copy filtered resources. +[INFO] Copying 1 resource +[INFO] +[INFO] --- maven-resources-plugin:2.5:copy-resources (copy-test-config-files) @ openmrs --- +[debug] execute contextualize +[INFO] Using 'UTF-8' encoding to copy filtered resources. +[INFO] Copying 1 resource +[INFO] Copying 1 resource +[INFO] Copying 1 resource +[INFO] +[INFO] --- maven-resources-plugin:2.5:copy-resources (copy-test-openmrs-config-file) @ openmrs --- +[debug] execute contextualize +[INFO] Using 'UTF-8' encoding to copy filtered resources. +[INFO] Copying 1 resource +[INFO] +[INFO] --- sql-maven-plugin:1.5:execute (drop-db) @ openmrs --- +[INFO] Executing commands +[INFO] 2 of 2 SQL statements executed successfully +[INFO] +[INFO] --- sql-maven-plugin:1.5:execute (create-db) @ openmrs --- +[INFO] Executing commands +[INFO] 2 of 2 SQL statements executed successfully +[INFO] +[INFO] --- maven-failsafe-plugin:2.17:integration-test (integration-test) @ openmrs --- +[INFO] Failsafe report directory: /home/nextuser/workspace/modules/openmrs/target/failsafe-reports + +------------------------------------------------------- + T E S T S +------------------------------------------------------- +Running org.motechproject.openmrs.it.version1_12.MRSIntegrationTests +[INFO] Started jetty 6.1.x at port(s) HTTP:8181 +[INFO] Initializing Spring FrameworkServlet 'servlet_1' +[INFO] Initialized servlet for org.motechproject.motech-platform-osgi-web-util [104] +[INFO] Initializing Spring FrameworkServlet 'servlet_3' +[INFO] Initialized servlet for org.motechproject.motech-platform-dataservices [62] +2016-09-21 13:41:33,269 EclipseGeminiBlueprintExtenderThread-17 INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] OpenMRS data provider registered +[INFO] Initializing Spring FrameworkServlet 'servlet_4' +[INFO] Initialized servlet for org.motechproject.openmrs [13] +2016-09-21 13:41:34,362 EclipseGeminiBlueprintExtenderThread-18 INFO [org.motechproject.openmrs.tasks.OpenMRSTasksNotifier] Tasks module became available, registering channel +2016-09-21 13:41:34,373 EclipseGeminiBlueprintExtenderThread-18 TRACE [org.motechproject.openmrs.tasks.TasksChannelServiceInstance] Registering channel with the following request: Channel{actionTaskEvents=[ActionEventRequest{name='null', actionParameters=[ActionParameterRequest{order=0, key='configName', value='TestOpenMRSServer', displayName='openMRS.configuration.name', type='UNICODE', required=true, hidden=true, options=null}, ActionParameterRequest{order=1, key='encounterDatetime', value='null', displayName='openMRS.encounter.date', type='DATE', required=true, hidden=false, options=null}, ActionParameterRequest{order=2, key='encounterType', value='null', displayName='openMRS.encounter.type', type='UNICODE', required=true, hidden=false, options=null}, ActionParameterRequest{order=3, key='locationName', value='null', displayName='openMRS.location.name', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=4, key='patientUuid', value='null', displayName='openMRS.patient.uuid', type='UNICODE', required=true, hidden=false, options=null}, ActionParameterRequest{order=5, key='providerUuid', value='null', displayName='openMRS.provider.uuid', type='UNICODE', required=true, hidden=false, options=null}, ActionParameterRequest{order=6, key='observation', value='null', displayName='openMRS.encounter.observation', type='MAP', required=false, hidden=false, options=null}], postActionParameters=[ActionParameterRequest{order=0, key='uuid', value='null', displayName='openMRS.encounter.uuid', type='UNICODE', required=false, hidden=false, options=null}], serviceInterface='org.motechproject.openmrs.tasks.OpenMRSActionProxyService', serviceMethod='createEncounter', serviceMethodCallManner='NAMED_PARAMETERS'}, ActionEventRequest{name='null', actionParameters=[ActionParameterRequest{order=0, key='configName', value='TestOpenMRSServer', displayName='openMRS.configuration.name', type='UNICODE', required=false, hidden=true, options=null}, ActionParameterRequest{order=1, key='givenName', value='null', displayName='openMRS.person.givenName', type='UNICODE', required=true, hidden=false, options=null}, ActionParameterRequest{order=2, key='middleName', value='null', displayName='openMRS.person.middleName', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=3, key='familyName', value='null', displayName='openMRS.person.familyName', type='UNICODE', required=true, hidden=false, options=null}, ActionParameterRequest{order=4, key='address1', value='null', displayName='openMRS.address.address1', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=5, key='address2', value='null', displayName='openMRS.address.address2', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=6, key='address3', value='null', displayName='openMRS.address.address3', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=7, key='address4', value='null', displayName='openMRS.address.address4', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=8, key='address5', value='null', displayName='openMRS.address.address5', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=9, key='address6', value='null', displayName='openMRS.address.address6', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=10, key='cityVillage', value='null', displayName='openMRS.address.cityVillage', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=11, key='stateProvince', value='null', displayName='openMRS.address.stateProvince', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=12, key='country', value='null', displayName='openMRS.address.country', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=13, key='postalCode', value='null', displayName='openMRS.address.postalCode', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=14, key='countyDistrict', value='null', displayName='openMRS.address.countyDistrict', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=15, key='latitude', value='null', displayName='openMRS.address.latitude', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=16, key='longitude', value='null', displayName='openMRS.address.longitude', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=17, key='startDate', value='null', displayName='openMRS.address.startDate', type='DATE', required=false, hidden=false, options=null}, ActionParameterRequest{order=18, key='endDate', value='null', displayName='openMRS.address.endDate', type='DATE', required=false, hidden=false, options=null}, ActionParameterRequest{order=19, key='birthDate', value='null', displayName='openMRS.person.birthDate', type='DATE', required=false, hidden=false, options=null}, ActionParameterRequest{order=20, key='birthDateEstimated', value='null', displayName='openMRS.person.birthDateEstimated', type='BOOLEAN', required=false, hidden=false, options=null}, ActionParameterRequest{order=21, key='gender', value='null', displayName='openMRS.person.gender', type='UNICODE', required=true, hidden=false, options=null}, ActionParameterRequest{order=22, key='dead', value='null', displayName='openMRS.person.dead', type='BOOLEAN', required=false, hidden=false, options=null}, ActionParameterRequest{order=23, key='causeOfDeathUUID', value='null', displayName='openMRS.person.causeOfDeath.uuid', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=24, key='motechId', value='null', displayName='openMRS.motechId', type='UNICODE', required=true, hidden=false, options=null}, ActionParameterRequest{order=25, key='locationForMotechId', value='null', displayName='openMRS.location.name', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=26, key='identifiers', value='null', displayName='openMRS.patient.identifiers', type='MAP', required=false, hidden=false, options=null}, ActionParameterRequest{order=27, key='person.personAttributes', value='null', displayName='openMRS.patient.personAttributes', type='MAP', required=false, hidden=false, options=null}], postActionParameters=[ActionParameterRequest{order=0, key='uuid', value='null', displayName='openMRS.patient.uuid', type='UNICODE', required=false, hidden=false, options=null}], serviceInterface='org.motechproject.openmrs.tasks.OpenMRSActionProxyService', serviceMethod='createPatient', serviceMethodCallManner='NAMED_PARAMETERS'}, ActionEventRequest{name='null', actionParameters=[ActionParameterRequest{order=0, key='configName', value='TestOpenMRSServer', displayName='openMRS.configuration.name', type='UNICODE', required=false, hidden=true, options=null}, ActionParameterRequest{order=1, key='person.uuid', value='null', displayName='openMRS.person.uuid', type='UNICODE', required=true, hidden=false, options=null}, ActionParameterRequest{order=2, key='givenName', value='null', displayName='openMRS.person.givenName', type='UNICODE', required=true, hidden=false, options=null}, ActionParameterRequest{order=3, key='middleName', value='null', displayName='openMRS.person.middleName', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=4, key='familyName', value='null', displayName='openMRS.person.familyName', type='UNICODE', required=true, hidden=false, options=null}, ActionParameterRequest{order=5, key='address1', value='null', displayName='openMRS.address.address1', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=6, key='address2', value='null', displayName='openMRS.address.address2', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=7, key='address3', value='null', displayName='openMRS.address.address3', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=8, key='address4', value='null', displayName='openMRS.address.address4', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=9, key='address5', value='null', displayName='openMRS.address.address5', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=10, key='address6', value='null', displayName='openMRS.address.address6', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=11, key='cityVillage', value='null', displayName='openMRS.address.cityVillage', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=12, key='stateProvince', value='null', displayName='openMRS.address.stateProvince', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=13, key='country', value='null', displayName='openMRS.address.country', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=14, key='postalCode', value='null', displayName='openMRS.address.postalCode', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=15, key='countyDistrict', value='null', displayName='openMRS.address.countyDistrict', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=16, key='latitude', value='null', displayName='openMRS.address.latitude', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=17, key='longitude', value='null', displayName='openMRS.address.longitude', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=18, key='startDate', value='null', displayName='openMRS.address.startDate', type='DATE', required=false, hidden=false, options=null}, ActionParameterRequest{order=19, key='endDate', value='null', displayName='openMRS.address.endDate', type='DATE', required=false, hidden=false, options=null}, ActionParameterRequest{order=20, key='birthDate', value='null', displayName='openMRS.person.birthDate', type='DATE', required=false, hidden=false, options=null}, ActionParameterRequest{order=21, key='birthDateEstimated', value='null', displayName='openMRS.person.birthDateEstimated', type='BOOLEAN', required=false, hidden=false, options=null}, ActionParameterRequest{order=22, key='gender', value='null', displayName='openMRS.person.gender', type='UNICODE', required=true, hidden=false, options=null}, ActionParameterRequest{order=23, key='dead', value='null', displayName='openMRS.person.dead', type='BOOLEAN', required=false, hidden=false, options=null}, ActionParameterRequest{order=24, key='causeOfDeathUUID', value='null', displayName='openMRS.person.causeOfDeath.uuid', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=25, key='person.personAttributes', value='null', displayName='openMRS.patient.personAttributes', type='MAP', required=false, hidden=false, options=null}], postActionParameters=[], serviceInterface='org.motechproject.openmrs.tasks.OpenMRSActionProxyService', serviceMethod='updatePerson', serviceMethodCallManner='NAMED_PARAMETERS'}, ActionEventRequest{name='null', actionParameters=[ActionParameterRequest{order=0, key='configName', value='TestOpenMRSServer', displayName='openMRS.configuration.name', type='UNICODE', required=false, hidden=true, options=null}, ActionParameterRequest{order=1, key='person.uuid', value='null', displayName='openMRS.person.uuid', type='UNICODE', required=true, hidden=false, options=null}, ActionParameterRequest{order=2, key='identifiers', value='null', displayName='openMRS.patient.identifiers', type='MAP', required=true, hidden=false, options=null}], postActionParameters=[], serviceInterface='org.motechproject.openmrs.tasks.OpenMRSActionProxyService', serviceMethod='updatePatientIdentifiers', serviceMethodCallManner='NAMED_PARAMETERS'}, ActionEventRequest{name='null', actionParameters=[ActionParameterRequest{order=0, key='configName', value='TestOpenMRSServer', displayName='openMRS.configuration.name', type='UNICODE', required=false, hidden=true, options=null}, ActionParameterRequest{order=1, key='cohortQueryUuid', value='null', displayName='openMRS.cohortQuery.uuid', type='UNICODE', required=true, hidden=false, options=null}, ActionParameterRequest{order=2, key='cohortQueryParameters', value='null', displayName='openMRS.cohortQuery.parameters', type='MAP', required=false, hidden=false, options=null}], postActionParameters=[], serviceInterface='org.motechproject.openmrs.tasks.OpenMRSActionProxyService', serviceMethod='getCohortQueryReport', serviceMethodCallManner='NAMED_PARAMETERS'}, ActionEventRequest{name='null', actionParameters=[ActionParameterRequest{order=0, key='configName', value='TestOpenMRSServer', displayName='openMRS.configuration.name', type='UNICODE', required=false, hidden=true, options=null}, ActionParameterRequest{order=1, key='patientUuid', value='null', displayName='openMRS.patient.uuid', type='UNICODE', required=true, hidden=false, options=null}, ActionParameterRequest{order=2, key='program.uuid', value='null', displayName='openMRS.program.uuid', type='UNICODE', required=true, hidden=false, options=null}, ActionParameterRequest{order=3, key='dateEnrolled', value='null', displayName='openMRS.programEnrollment.dateEnrolled', type='DATE', required=true, hidden=false, options=null}, ActionParameterRequest{order=4, key='dateCompleted', value='null', displayName='openMRS.programEnrollment.dateCompleted', type='DATE', required=false, hidden=false, options=null}, ActionParameterRequest{order=5, key='locationName', value='null', displayName='openMRS.location.name', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=6, key='programEnrollmentAttributes', value='null', displayName='openMRS.programEnrollment.attributes', type='MAP', required=false, hidden=false, options=null}], postActionParameters=[], serviceInterface='org.motechproject.openmrs.tasks.OpenMRSActionProxyService', serviceMethod='createProgramEnrollment', serviceMethodCallManner='NAMED_PARAMETERS'}, ActionEventRequest{name='null', actionParameters=[ActionParameterRequest{order=0, key='configName', value='TestOpenMRSServer', displayName='openMRS.configuration.name', type='UNICODE', required=false, hidden=true, options=null}, ActionParameterRequest{order=1, key='programEnrollmentUuid', value='null', displayName='openMRS.programEnrollment.uuid', type='UNICODE', required=true, hidden=false, options=null}, ActionParameterRequest{order=2, key='dateCompleted', value='null', displayName='openMRS.programEnrollment.dateCompleted', type='DATE', required=false, hidden=false, options=null}, ActionParameterRequest{order=3, key='stateUuid', value='null', displayName='openMRS.program.state.uuid', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=4, key='startDate', value='null', displayName='openMRS.program.state.startDate', type='DATE', required=false, hidden=false, options=null}, ActionParameterRequest{order=5, key='programEnrollmentAttributes', value='null', displayName='openMRS.programEnrollment.attributes', type='MAP', required=false, hidden=false, options=null}], postActionParameters=[], serviceInterface='org.motechproject.openmrs.tasks.OpenMRSActionProxyService', serviceMethod='updateProgramEnrollment', serviceMethodCallManner='NAMED_PARAMETERS'}, ActionEventRequest{name='null', actionParameters=[ActionParameterRequest{order=0, key='configName', value='TestOpenMRSServer', displayName='openMRS.configuration.name', type='UNICODE', required=false, hidden=true, options=null}, ActionParameterRequest{order=1, key='programEnrollmentUuid', value='null', displayName='openMRS.programEnrollment.uuid', type='UNICODE', required=true, hidden=false, options=null}, ActionParameterRequest{order=2, key='dateCompleted', value='null', displayName='openMRS.programEnrollment.dateCompleted', type='DATE', required=false, hidden=false, options=null}, ActionParameterRequest{order=3, key='stateUuid', value='null', displayName='openMRS.program.state.uuid', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=4, key='startDate', value='null', displayName='openMRS.program.state.startDate', type='DATE', required=false, hidden=false, options=null}], postActionParameters=[], serviceInterface='org.motechproject.openmrs.tasks.OpenMRSActionProxyService', serviceMethod='changeStateOfProgramEnrollment', serviceMethodCallManner='NAMED_PARAMETERS'}], triggerTaskEvents=[TriggerEvent{eventParameters=[EventParameter{eventKey='patientUuid'} org.motechproject.tasks.contract.EventParameterRequest@1f55487f, EventParameter{eventKey='patientDisplay'} org.motechproject.tasks.contract.EventParameterRequest@ae41461c, EventParameter{eventKey='cohortQueryUuid'} org.motechproject.tasks.contract.EventParameterRequest@f524b44d]}], description='Channel originating from the OpenMRS module', moduleName='org.motechproject.openmrs', moduleVersion='0.30.0.SNAPSHOT', displayName='openMRS'} +[INFO] Initializing Spring FrameworkServlet 'servlet_6' +[INFO] Initialized servlet for org.motechproject.motech-tasks [22] +2016-09-21 13:43:34,650 main INFO [org.motechproject.openmrs.it.MRSTasksIntegrationBundleIT] Setting up security context with permissions: [manageTasks, manageOpenMRS] +2016-09-21 13:43:34,658 main INFO [org.motechproject.openmrs.it.MRSTasksIntegrationBundleIT] Looking for org.motechproject.openmrs +2016-09-21 13:43:46,827 main INFO [org.motechproject.openmrs.it.MRSTasksIntegrationBundleIT] There are 2 channels in total +2016-09-21 13:43:48,243 main INFO [org.motechproject.openmrs.it.MRSTasksIntegrationBundleIT] Looking for org.motechproject.motech-platform-dataservices-entities +2016-09-21 13:44:00,003 main INFO [org.motechproject.openmrs.it.MRSTasksIntegrationBundleIT] There are 2 channels in total +2016-09-21 13:44:14,859 main INFO [org.motechproject.openmrs.it.MRSTasksIntegrationBundleIT] testOpenMRSTasksIntegration starts waiting for task to execute +2016-09-21 13:44:14,875 main INFO [org.motechproject.openmrs.it.MRSTasksIntegrationBundleIT] co sie tu ku.wa dzieje!? [WARNING, SUCCESS, ERROR]no nie wierze [] +2016-09-21 13:44:16,880 main INFO [org.motechproject.openmrs.it.MRSTasksIntegrationBundleIT] co sie tu ku.wa dzieje!? [WARNING, SUCCESS, ERROR]no nie wierze [] +2016-09-21 13:44:18,903 main INFO [org.motechproject.openmrs.it.MRSTasksIntegrationBundleIT] co sie tu ku.wa dzieje!? [WARNING, SUCCESS, ERROR]no nie wierze [TaskActivity{message='task.success.ok', task=1, field='[]', date=2016-09-21T13:44:14.937+02:00, activityType=SUCCESS, stackTrace=null}] +2016-09-21 13:44:18,904 main INFO [org.motechproject.openmrs.it.MRSTasksIntegrationBundleIT] Task executed after 2 retries, what took about 4 seconds +2016-09-21 13:44:19,068 main INFO [org.motechproject.openmrs.it.MRSTasksIntegrationBundleIT] co tu sie dzieje: org.motechproject.openmrs.domain.Encounter@2c44a088 +[INFO] Destroying Spring FrameworkServlet 'servlet_6' +[INFO] Destroying Spring FrameworkServlet 'servlet_4' +2016-09-21 13:44:25,090 Gemini Blueprint context shutdown thread INFO [org.motechproject.openmrs.tasks.OpenMRSTasksNotifier] Module is being disabled, unregistering Tasks channel +[INFO] Destroying Spring FrameworkServlet 'servlet_3' +[INFO] Destroying Spring FrameworkServlet 'servlet_1' +Tests run: 11, Failures: 0, Errors: 10, Skipped: 0, Time elapsed: 250.458 sec <<< FAILURE! - in org.motechproject.openmrs.it.version1_12.MRSIntegrationTests +initializationError(org.motechproject.openmrs.it.version1_12.MRSTaskIntegrationBundle1_12IT) Time elapsed: 0.009 sec <<< ERROR! +java.lang.Exception: No runnable methods + at org.junit.runners.BlockJUnit4ClassRunner.validateInstanceMethods(BlockJUnit4ClassRunner.java:157) + at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:102) + at org.junit.runners.ParentRunner.validate(ParentRunner.java:336) + at org.junit.runners.ParentRunner.(ParentRunner.java:74) + at org.junit.runners.BlockJUnit4ClassRunner.(BlockJUnit4ClassRunner.java:56) + at org.ops4j.pax.exam.junit.impl.ProbeRunner.(ProbeRunner.java:73) + at org.ops4j.pax.exam.junit.PaxExam.createDelegate(PaxExam.java:82) + at org.ops4j.pax.exam.junit.PaxExam.(PaxExam.java:73) + at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) + at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.lang.reflect.Constructor.newInstance(Constructor.java:423) + at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:31) + at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) + at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) + at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) + at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) + at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:98) + at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:84) + at org.junit.runners.Suite.(Suite.java:101) + at org.junit.runners.Suite.(Suite.java:67) + at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) + at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.lang.reflect.Constructor.newInstance(Constructor.java:423) + at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:35) + at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) + at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) + at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) + at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) + at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24) + at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:262) + at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153) + at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124) + at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200) + at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153) + at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103) + +initializationError(org.motechproject.openmrs.it.MRSConceptServiceIT) Time elapsed: 0 sec <<< ERROR! +java.lang.Exception: No runnable methods + at org.junit.runners.BlockJUnit4ClassRunner.validateInstanceMethods(BlockJUnit4ClassRunner.java:157) + at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:102) + at org.junit.runners.ParentRunner.validate(ParentRunner.java:336) + at org.junit.runners.ParentRunner.(ParentRunner.java:74) + at org.junit.runners.BlockJUnit4ClassRunner.(BlockJUnit4ClassRunner.java:56) + at org.ops4j.pax.exam.junit.impl.ProbeRunner.(ProbeRunner.java:73) + at org.ops4j.pax.exam.junit.PaxExam.createDelegate(PaxExam.java:82) + at org.ops4j.pax.exam.junit.PaxExam.(PaxExam.java:73) + at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) + at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.lang.reflect.Constructor.newInstance(Constructor.java:423) + at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:31) + at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) + at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) + at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) + at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) + at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:98) + at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:84) + at org.junit.runners.Suite.(Suite.java:101) + at org.junit.runners.Suite.(Suite.java:67) + at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) + at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.lang.reflect.Constructor.newInstance(Constructor.java:423) + at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:35) + at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) + at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) + at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) + at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) + at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24) + at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:262) + at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153) + at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124) + at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200) + at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153) + at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103) + +initializationError(org.motechproject.openmrs.it.MRSEncounterServiceIT) Time elapsed: 0.001 sec <<< ERROR! +java.lang.Exception: No runnable methods + at org.junit.runners.BlockJUnit4ClassRunner.validateInstanceMethods(BlockJUnit4ClassRunner.java:157) + at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:102) + at org.junit.runners.ParentRunner.validate(ParentRunner.java:336) + at org.junit.runners.ParentRunner.(ParentRunner.java:74) + at org.junit.runners.BlockJUnit4ClassRunner.(BlockJUnit4ClassRunner.java:56) + at org.ops4j.pax.exam.junit.impl.ProbeRunner.(ProbeRunner.java:73) + at org.ops4j.pax.exam.junit.PaxExam.createDelegate(PaxExam.java:82) + at org.ops4j.pax.exam.junit.PaxExam.(PaxExam.java:73) + at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) + at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.lang.reflect.Constructor.newInstance(Constructor.java:423) + at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:31) + at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) + at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) + at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) + at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) + at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:98) + at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:84) + at org.junit.runners.Suite.(Suite.java:101) + at org.junit.runners.Suite.(Suite.java:67) + at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) + at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.lang.reflect.Constructor.newInstance(Constructor.java:423) + at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:35) + at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) + at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) + at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) + at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) + at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24) + at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:262) + at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153) + at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124) + at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200) + at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153) + at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103) + +initializationError(org.motechproject.openmrs.it.MRSLocationServiceIT) Time elapsed: 0.001 sec <<< ERROR! +java.lang.Exception: No runnable methods + at org.junit.runners.BlockJUnit4ClassRunner.validateInstanceMethods(BlockJUnit4ClassRunner.java:157) + at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:102) + at org.junit.runners.ParentRunner.validate(ParentRunner.java:336) + at org.junit.runners.ParentRunner.(ParentRunner.java:74) + at org.junit.runners.BlockJUnit4ClassRunner.(BlockJUnit4ClassRunner.java:56) + at org.ops4j.pax.exam.junit.impl.ProbeRunner.(ProbeRunner.java:73) + at org.ops4j.pax.exam.junit.PaxExam.createDelegate(PaxExam.java:82) + at org.ops4j.pax.exam.junit.PaxExam.(PaxExam.java:73) + at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) + at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.lang.reflect.Constructor.newInstance(Constructor.java:423) + at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:31) + at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) + at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) + at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) + at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) + at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:98) + at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:84) + at org.junit.runners.Suite.(Suite.java:101) + at org.junit.runners.Suite.(Suite.java:67) + at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) + at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.lang.reflect.Constructor.newInstance(Constructor.java:423) + at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:35) + at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) + at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) + at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) + at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) + at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24) + at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:262) + at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153) + at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124) + at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200) + at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153) + at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103) + +initializationError(org.motechproject.openmrs.it.MRSObservationServiceIT) Time elapsed: 0 sec <<< ERROR! +java.lang.Exception: No runnable methods + at org.junit.runners.BlockJUnit4ClassRunner.validateInstanceMethods(BlockJUnit4ClassRunner.java:157) + at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:102) + at org.junit.runners.ParentRunner.validate(ParentRunner.java:336) + at org.junit.runners.ParentRunner.(ParentRunner.java:74) + at org.junit.runners.BlockJUnit4ClassRunner.(BlockJUnit4ClassRunner.java:56) + at org.ops4j.pax.exam.junit.impl.ProbeRunner.(ProbeRunner.java:73) + at org.ops4j.pax.exam.junit.PaxExam.createDelegate(PaxExam.java:82) + at org.ops4j.pax.exam.junit.PaxExam.(PaxExam.java:73) + at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) + at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.lang.reflect.Constructor.newInstance(Constructor.java:423) + at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:31) + at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) + at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) + at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) + at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) + at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:98) + at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:84) + at org.junit.runners.Suite.(Suite.java:101) + at org.junit.runners.Suite.(Suite.java:67) + at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) + at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.lang.reflect.Constructor.newInstance(Constructor.java:423) + at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:35) + at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) + at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) + at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) + at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) + at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24) + at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:262) + at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153) + at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124) + at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200) + at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153) + at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103) + +initializationError(org.motechproject.openmrs.it.MRSPatientServiceIT) Time elapsed: 0 sec <<< ERROR! +java.lang.Exception: No runnable methods + at org.junit.runners.BlockJUnit4ClassRunner.validateInstanceMethods(BlockJUnit4ClassRunner.java:157) + at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:102) + at org.junit.runners.ParentRunner.validate(ParentRunner.java:336) + at org.junit.runners.ParentRunner.(ParentRunner.java:74) + at org.junit.runners.BlockJUnit4ClassRunner.(BlockJUnit4ClassRunner.java:56) + at org.ops4j.pax.exam.junit.impl.ProbeRunner.(ProbeRunner.java:73) + at org.ops4j.pax.exam.junit.PaxExam.createDelegate(PaxExam.java:82) + at org.ops4j.pax.exam.junit.PaxExam.(PaxExam.java:73) + at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) + at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.lang.reflect.Constructor.newInstance(Constructor.java:423) + at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:31) + at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) + at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) + at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) + at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) + at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:98) + at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:84) + at org.junit.runners.Suite.(Suite.java:101) + at org.junit.runners.Suite.(Suite.java:67) + at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) + at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.lang.reflect.Constructor.newInstance(Constructor.java:423) + at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:35) + at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) + at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) + at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) + at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) + at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24) + at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:262) + at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153) + at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124) + at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200) + at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153) + at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103) + +initializationError(org.motechproject.openmrs.it.MRSPersonServiceIT) Time elapsed: 0.001 sec <<< ERROR! +java.lang.Exception: No runnable methods + at org.junit.runners.BlockJUnit4ClassRunner.validateInstanceMethods(BlockJUnit4ClassRunner.java:157) + at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:102) + at org.junit.runners.ParentRunner.validate(ParentRunner.java:336) + at org.junit.runners.ParentRunner.(ParentRunner.java:74) + at org.junit.runners.BlockJUnit4ClassRunner.(BlockJUnit4ClassRunner.java:56) + at org.ops4j.pax.exam.junit.impl.ProbeRunner.(ProbeRunner.java:73) + at org.ops4j.pax.exam.junit.PaxExam.createDelegate(PaxExam.java:82) + at org.ops4j.pax.exam.junit.PaxExam.(PaxExam.java:73) + at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) + at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.lang.reflect.Constructor.newInstance(Constructor.java:423) + at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:31) + at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) + at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) + at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) + at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) + at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:98) + at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:84) + at org.junit.runners.Suite.(Suite.java:101) + at org.junit.runners.Suite.(Suite.java:67) + at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) + at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.lang.reflect.Constructor.newInstance(Constructor.java:423) + at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:35) + at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) + at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) + at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) + at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) + at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24) + at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:262) + at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153) + at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124) + at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200) + at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153) + at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103) + +initializationError(org.motechproject.openmrs.it.MRSProviderServiceIT) Time elapsed: 0.001 sec <<< ERROR! +java.lang.Exception: No runnable methods + at org.junit.runners.BlockJUnit4ClassRunner.validateInstanceMethods(BlockJUnit4ClassRunner.java:157) + at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:102) + at org.junit.runners.ParentRunner.validate(ParentRunner.java:336) + at org.junit.runners.ParentRunner.(ParentRunner.java:74) + at org.junit.runners.BlockJUnit4ClassRunner.(BlockJUnit4ClassRunner.java:56) + at org.ops4j.pax.exam.junit.impl.ProbeRunner.(ProbeRunner.java:73) + at org.ops4j.pax.exam.junit.PaxExam.createDelegate(PaxExam.java:82) + at org.ops4j.pax.exam.junit.PaxExam.(PaxExam.java:73) + at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) + at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.lang.reflect.Constructor.newInstance(Constructor.java:423) + at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:31) + at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) + at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) + at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) + at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) + at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:98) + at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:84) + at org.junit.runners.Suite.(Suite.java:101) + at org.junit.runners.Suite.(Suite.java:67) + at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) + at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.lang.reflect.Constructor.newInstance(Constructor.java:423) + at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:35) + at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) + at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) + at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) + at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) + at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24) + at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:262) + at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153) + at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124) + at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200) + at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153) + at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103) + +initializationError(org.motechproject.openmrs.it.MRSUserServiceIT) Time elapsed: 0.001 sec <<< ERROR! +java.lang.Exception: No runnable methods + at org.junit.runners.BlockJUnit4ClassRunner.validateInstanceMethods(BlockJUnit4ClassRunner.java:157) + at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:102) + at org.junit.runners.ParentRunner.validate(ParentRunner.java:336) + at org.junit.runners.ParentRunner.(ParentRunner.java:74) + at org.junit.runners.BlockJUnit4ClassRunner.(BlockJUnit4ClassRunner.java:56) + at org.ops4j.pax.exam.junit.impl.ProbeRunner.(ProbeRunner.java:73) + at org.ops4j.pax.exam.junit.PaxExam.createDelegate(PaxExam.java:82) + at org.ops4j.pax.exam.junit.PaxExam.(PaxExam.java:73) + at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) + at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.lang.reflect.Constructor.newInstance(Constructor.java:423) + at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:31) + at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) + at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) + at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) + at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) + at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:98) + at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:84) + at org.junit.runners.Suite.(Suite.java:101) + at org.junit.runners.Suite.(Suite.java:67) + at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) + at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.lang.reflect.Constructor.newInstance(Constructor.java:423) + at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:35) + at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) + at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) + at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) + at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) + at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24) + at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:262) + at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153) + at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124) + at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200) + at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153) + at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103) + +initializationError(org.motechproject.openmrs.it.version1_12.MRSProgramEnrollmentIT) Time elapsed: 0.001 sec <<< ERROR! +java.lang.Exception: No runnable methods + at org.junit.runners.BlockJUnit4ClassRunner.validateInstanceMethods(BlockJUnit4ClassRunner.java:157) + at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:102) + at org.junit.runners.ParentRunner.validate(ParentRunner.java:336) + at org.junit.runners.ParentRunner.(ParentRunner.java:74) + at org.junit.runners.BlockJUnit4ClassRunner.(BlockJUnit4ClassRunner.java:56) + at org.ops4j.pax.exam.junit.impl.ProbeRunner.(ProbeRunner.java:73) + at org.ops4j.pax.exam.junit.PaxExam.createDelegate(PaxExam.java:82) + at org.ops4j.pax.exam.junit.PaxExam.(PaxExam.java:73) + at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) + at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.lang.reflect.Constructor.newInstance(Constructor.java:423) + at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:31) + at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) + at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) + at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) + at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) + at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:98) + at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:84) + at org.junit.runners.Suite.(Suite.java:101) + at org.junit.runners.Suite.(Suite.java:67) + at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) + at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.lang.reflect.Constructor.newInstance(Constructor.java:423) + at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:35) + at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) + at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) + at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) + at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) + at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24) + at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:262) + at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153) + at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124) + at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200) + at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153) + at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103) + + +Results : + +Tests in error: + MRSTaskIntegrationBundle1_12IT.initializationError » No runnable methods + MRSConceptServiceIT.initializationError » No runnable methods + MRSEncounterServiceIT.initializationError » No runnable methods + MRSLocationServiceIT.initializationError » No runnable methods + MRSObservationServiceIT.initializationError » No runnable methods + MRSPatientServiceIT.initializationError » No runnable methods + MRSPersonServiceIT.initializationError » No runnable methods + MRSProviderServiceIT.initializationError » No runnable methods + MRSUserServiceIT.initializationError » No runnable methods + MRSProgramEnrollmentIT.initializationError » No runnable methods + +Tests run: 11, Failures: 0, Errors: 10, Skipped: 0 + +[INFO] +[INFO] --- maven-clean-plugin:2.5:clean (clean-test-config-files) @ openmrs --- +[INFO] Deleting /home/nextuser/.motech/config (includes = [org.motechproject.openmrs/raw/openmrs-configs.json, bootstrap.properties, motech-settings.properties, datanucleus.properties], excludes = []) +[INFO] +[INFO] --- maven-enforcer-plugin:1.4.1:enforce (enforce-no-package-cycles) @ openmrs --- +[INFO] Adding directory /home/nextuser/workspace/modules/openmrs/target/classes for package cycles search. +[INFO] Adding directory /home/nextuser/workspace/modules/openmrs/target/test-classes for package cycles search. +[INFO] +[INFO] --- maven-failsafe-plugin:2.17:verify (verify) @ openmrs --- +[INFO] Failsafe report directory: /home/nextuser/workspace/modules/openmrs/target/failsafe-reports +[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent! +[INFO] ------------------------------------------------------------------------ +[INFO] BUILD FAILURE +[INFO] ------------------------------------------------------------------------ +[INFO] Total time: 4:39.198s +[INFO] Finished at: Wed Sep 21 13:44:27 CEST 2016 +[INFO] Final Memory: 50M/268M +[INFO] ------------------------------------------------------------------------ +[ERROR] Failed to execute goal org.apache.maven.plugins:maven-failsafe-plugin:2.17:verify (verify) on project openmrs: There are test failures. +[ERROR] +[ERROR] Please refer to /home/nextuser/workspace/modules/openmrs/target/failsafe-reports for the individual test results. +[ERROR] -> [Help 1] +[ERROR] +[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. +[ERROR] Re-run Maven using the -X switch to enable full debug logging. +[ERROR] +[ERROR] For more information about the errors and possible solutions, please read the following articles: +[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException diff --git a/openmrs/src/test/java/org/motechproject/openmrs/it/MRSTasksIntegrationBundleIT.java b/openmrs/src/test/java/org/motechproject/openmrs/it/MRSTasksIntegrationBundleIT.java index 5013589d8..00fc05c61 100644 --- a/openmrs/src/test/java/org/motechproject/openmrs/it/MRSTasksIntegrationBundleIT.java +++ b/openmrs/src/test/java/org/motechproject/openmrs/it/MRSTasksIntegrationBundleIT.java @@ -220,6 +220,26 @@ public void testOpenMRSProviderDataSourceAndCreateEncounterAction() throws Inter checkIfProviderWasCreatedProperly(); } + @Test + public void testCreateEncounterPostActionParameter() throws InterruptedException { + Task task = prepareCreateEncounterPostActionParameterTask(); + + getTriggerHandler().registerHandlerFor(task.getTrigger().getEffectiveListenerSubject()); + + activateTrigger(); + + // Give Tasks some time to process + assertTrue(waitForTaskExecution(task.getId())); + + Encounter encounter = encounterService.getLatestEncounterByPatientMotechId(DEFAULT_CONFIG_NAME, "654", createdEncounterType.getName()); + String firstEncounterUuid = encounter.getUuid(); + + Patient patient = patientService.getPatientByMotechId(DEFAULT_CONFIG_NAME, "Jacob Lee"); + Person.Address address = patient.getPerson().getPreferredAddress(); + + assertEquals(firstEncounterUuid, address.getAddress1()); + } + @Test public void testCreatePatientPostActionParameter() throws InterruptedException { Task task = prepareCreatePatientPostActionParameterTask(); @@ -352,6 +372,24 @@ private void createEncounterTestData() throws ParseException, ConceptNameAlready createdEncounter = encounterService.createEncounter(DEFAULT_CONFIG_NAME, encounter); } + private Task prepareCreateEncounterPostActionParameterTask(){ + TaskTriggerInformation triggerInformation = new TaskTriggerInformation("CREATE SettingsRecord", "data-services", MDS_CHANNEL_NAME, + VERSION, TRIGGER_SUBJECT, TRIGGER_SUBJECT); + + SortedSet taskConfigStepSortedSet = new TreeSet<>(); + TaskConfig taskConfig = new TaskConfig(); + taskConfig.addAll(taskConfigStepSortedSet); + + ArrayList taskActions = new ArrayList(); + taskActions.add(prepareCreateEncounterActionInformation()); + taskActions.add(prepareCreatePatientForEncounterActionInformation("{{pa.0.uuid}}", "Jacob Lee")); + + Task task = new Task("OpenMRSEncounterPostActionParameterTestTask", triggerInformation, taskActions, taskConfig, true, true); + getTaskService().save(task); + + return task; + } + private Task prepareCreatePatientPostActionParameterTask(){ TaskTriggerInformation triggerInformation = new TaskTriggerInformation("CREATE SettingsRecord", "data-services", MDS_CHANNEL_NAME, VERSION, TRIGGER_SUBJECT, TRIGGER_SUBJECT); @@ -388,6 +426,40 @@ private TaskActionInformation prepareCreatePatientActionInformation(String adres return actionInformation; } + private TaskActionInformation prepareCreatePatientForEncounterActionInformation(String adress1, String motechId){ + TaskActionInformation actionInformation = new TaskActionInformation("Create Patient [" + DEFAULT_CONFIG_NAME + "]", OPENMRS_CHANNEL_NAME, + OPENMRS_CHANNEL_NAME, VERSION, TEST_INTERFACE, "createPatient"); + actionInformation.setSubject(String.format("createPatient.%s", DEFAULT_CONFIG_NAME)); + + Map values = new HashMap<>(); + values.put(Keys.ADDRESS_1, adress1); + values.put(Keys.FAMILY_NAME, "Bond"); + values.put(Keys.GENDER, "M"); + values.put(Keys.GIVEN_NAME, "James"); + values.put(Keys.MOTECH_ID, motechId); + values.put(Keys.CONFIG_NAME, DEFAULT_CONFIG_NAME); + actionInformation.setValues(values); + + return actionInformation; + } + + private TaskActionInformation prepareCreateEncounterActionInformation(){ + TaskActionInformation actionInformation = new TaskActionInformation("Create Encounter [" + DEFAULT_CONFIG_NAME + "]", OPENMRS_CHANNEL_NAME, + OPENMRS_CHANNEL_NAME, VERSION, TEST_INTERFACE, "createEncounter"); + actionInformation.setSubject(String.format("createEncounter.%s", DEFAULT_CONFIG_NAME)); + + Map values = new HashMap<>(); + values.put(Keys.PROVIDER_UUID, createdProvider.getUuid()); + values.put(Keys.PATIENT_UUID, createdPatient.getUuid()); + values.put(Keys.ENCOUNTER_TYPE, createdEncounterType.getName()); + values.put(Keys.ENCOUNTER_DATE, new DateTime("2015-01-16T00:00:00Z").toString()); + values.put(Keys.LOCATION_NAME, DEFAULT_LOCATION_NAME); + values.put(Keys.CONFIG_NAME, DEFAULT_CONFIG_NAME); + actionInformation.setValues(values); + + return actionInformation; + } + private Patient preparePatient() { Person person = new Person(); From 263c49e082e86331868ed5a47e99953f2280b876 Mon Sep 17 00:00:00 2001 From: Jakub Banasiewicz Date: Wed, 21 Sep 2016 14:37:45 +0200 Subject: [PATCH 017/202] Deleted logger.txt --- openmrs/logger.txt | 880 --------------------------------------------- 1 file changed, 880 deletions(-) delete mode 100644 openmrs/logger.txt diff --git a/openmrs/logger.txt b/openmrs/logger.txt deleted file mode 100644 index e7d84dc02..000000000 --- a/openmrs/logger.txt +++ /dev/null @@ -1,880 +0,0 @@ -[INFO] Scanning for projects... -[INFO] -[INFO] ------------------------------------------------------------------------ -[INFO] Building OpenMRS 0.30-SNAPSHOT -[INFO] ------------------------------------------------------------------------ -[INFO] -[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ openmrs --- -[INFO] Deleting /home/nextuser/workspace/modules/openmrs/target -[INFO] -[INFO] --- maven-enforcer-plugin:1.4.1:enforce (enforce-dependency-convergence) @ openmrs --- -[INFO] -[INFO] --- properties-maven-plugin:1.0-alpha-2:read-project-properties (default) @ openmrs --- -[INFO] -[INFO] --- build-helper-maven-plugin:1.7:parse-version (default) @ openmrs --- -[INFO] -[INFO] --- maven-resources-plugin:2.5:resources (default) @ openmrs --- -[debug] execute contextualize -[INFO] Using 'UTF-8' encoding to copy filtered resources. -[INFO] Copying 0 resource -[INFO] Copying 12 resources -[INFO] -[INFO] --- maven-dependency-plugin:2.8:resolve (list-dependencies) @ openmrs --- -[INFO] -[INFO] --- maven-dependency-plugin:2.8:copy-dependencies (copy-osgi-dependencies) @ openmrs --- -[INFO] paranamer-2.6-sources.jar already exists in destination. -[INFO] kahadb-5.4.2.jar already exists in destination. -[INFO] org.apache.servicemix.bundles.spring-context-3.2.16.RELEASE_1.jar already exists in destination. -[INFO] org.apache.servicemix.bundles.paranamer-2.6_1.jar already exists in destination. -[INFO] org.apache.servicemix.specs.saaj-api-1.3-2.2.0.jar already exists in destination. -[INFO] aopalliance-1.0.jar already exists in destination. -[INFO] quartz-2.2.1.jar already exists in destination. -[INFO] datanucleus-core-4.0.1.jar already exists in destination. -[INFO] org.apache.felix.eventadmin-1.3.2.jar already exists in destination. -[INFO] motech-tasks-0.30-SNAPSHOT.jar already exists in destination. -[INFO] maven-scm-provider-svnexe-1.4.jar already exists in destination. -[INFO] org.apache.servicemix.bundles.saaj-impl-1.3.25_1.jar already exists in destination. -[INFO] motech-platform-dataservices-migration-0.30-SNAPSHOT.jar already exists in destination. -[INFO] javax.management.j2ee-api-1.1.1.jar already exists in destination. -[INFO] org.apache.servicemix.bundles.spring-expression-3.2.16.RELEASE_1.jar already exists in destination. -[INFO] datanucleus-rdbms-4.0.1.jar already exists in destination. -[INFO] datanucleus-java8-4.0.5.jar already exists in destination. -[INFO] org.apache.servicemix.bundles.spring-aop-3.2.16.RELEASE_1.jar already exists in destination. -[INFO] mimepull-1.9.jar already exists in destination. -[INFO] asm-commons-5.0.3.jar already exists in destination. -[INFO] commons-digester-2.1.jar already exists in destination. -[INFO] org.eclipse.gemini.blueprint.core-1.0.2.RELEASE.jar already exists in destination. -[INFO] motech-platform-commons-date-0.30-SNAPSHOT.jar already exists in destination. -[INFO] commons-logging-1.1.1.jar already exists in destination. -[INFO] commons-io-2.4.jar already exists in destination. -[INFO] commons-beanutils-1.9.2.jar already exists in destination. -[INFO] flyway-core-2.3.1.jar already exists in destination. -[INFO] spring-security-web-3.2.8.RELEASE.jar already exists in destination. -[INFO] motech-osgi-platform-0.30-SNAPSHOT.jar already exists in destination. -[INFO] time-api-0.6.3.jar already exists in destination. -[INFO] commons-fileupload-1.3.1.jar already exists in destination. -[INFO] super-csv-2.2.0.jar already exists in destination. -[INFO] com.springsource.javax.servlet-2.5.0.jar already exists in destination. -[INFO] org.apache.servicemix.bundles.jsch-0.1.51_1.jar already exists in destination. -[INFO] org.apache.bval.bundle-0.5.jar already exists in destination. -[INFO] org.apache.servicemix.bundles.spring-web-3.2.16.RELEASE_1.jar already exists in destination. -[INFO] org.apache.servicemix.bundles.c3p0-0.9.1.2_1.jar already exists in destination. -[INFO] joda-time-2.9.1.jar already exists in destination. -[INFO] regexp-1.3.jar already exists in destination. -[INFO] spring-security-core-3.2.8.RELEASE.jar already exists in destination. -[INFO] asm-5.0.3.jar already exists in destination. -[INFO] bval-core-0.5.jar already exists in destination. -[INFO] motech-platform-event-0.30-SNAPSHOT.jar already exists in destination. -[INFO] maven-scm-api-1.4.jar already exists in destination. -[INFO] spring-orm-3.2.16.RELEASE.jar already exists in destination. -[INFO] commons-lang-2.6.jar already exists in destination. -[INFO] activation-1.1.jar already exists in destination. -[INFO] commons-vfs2-2.0.jar already exists in destination. -[INFO] com.springsource.org.apache.commons.httpclient-3.1.0.jar already exists in destination. -[INFO] motech-platform-dataservices-0.30-SNAPSHOT.jar already exists in destination. -[INFO] commons-codec-1.10.jar already exists in destination. -[INFO] javassist-3.18.1-GA.jar already exists in destination. -[INFO] motech-platform-config-core-0.30-SNAPSHOT.jar already exists in destination. -[INFO] org.apache.servicemix.bundles.velocity-1.6.4_4.jar already exists in destination. -[INFO] org.apache.servicemix.bundles.spring-core-3.2.16.RELEASE_1.jar already exists in destination. -[INFO] org.apache.servicemix.bundles.spring-context-support-3.2.16.RELEASE_1.jar already exists in destination. -[INFO] org.apache.servicemix.bundles.spring-security-config-3.2.8.RELEASE_1.jar already exists in destination. -[INFO] jta-1.1.jar already exists in destination. -[INFO] org.apache.servicemix.specs.activation-api-1.1-2.4.0.jar already exists in destination. -[INFO] ow2-ejb-3.1-spec-1.0.13.jar already exists in destination. -[INFO] stax-api-1.0-2.jar already exists in destination. -[INFO] javax.xml.rpc-api-1.1.1.jar already exists in destination. -[INFO] guava-18.0.jar already exists in destination. -[INFO] org.motechproject.spring-orm-3.2.16.RELEASE_1-r033.jar already exists in destination. -[INFO] org.eclipse.gemini.blueprint.io-1.0.2.RELEASE.jar already exists in destination. -[INFO] org.apache.servicemix.bundles.howl-1.0.1-1_3.jar already exists in destination. -[INFO] org.apache.servicemix.bundles.spring-webmvc-3.2.16.RELEASE_1.jar already exists in destination. -[INFO] motech-platform-commons-api-0.30-SNAPSHOT.jar already exists in destination. -[INFO] motech-platform-osgi-extender-fragment-0.30-SNAPSHOT.jar already exists in destination. -[INFO] jdo-api-3.0.1.jar already exists in destination. -[INFO] oro-2.0.8.jar already exists in destination. -[INFO] slf4j-api-1.7.7.jar already exists in destination. -[INFO] org.osgi.compendium-5.0.0.jar already exists in destination. -[INFO] org.motechproject.reflections-0.9.9-r033.jar already exists in destination. -[INFO] com.springsource.javax.transaction-1.1.0.jar already exists in destination. -[INFO] org.apache.servicemix.bundles.spring-beans-3.2.16.RELEASE_1.jar already exists in destination. -[INFO] postgresql-9.1-901.jdbc4.jar already exists in destination. -[INFO] datanucleus-api-jdo-4.0.1.jar already exists in destination. -[INFO] annotations-2.0.1.jar already exists in destination. -[INFO] org.motechproject.org.codehaus.jackson-1.9.7-r033.jar already exists in destination. -[INFO] com.springsource.javax.jms-1.1.0.jar already exists in destination. -[INFO] mysql-connector-java-5.1.32.jar already exists in destination. -[INFO] log4j-1.2.17.jar already exists in destination. -[INFO] org.motechproject.com.google.code.gson-1.7.1-r033.jar already exists in destination. -[INFO] maven-scm-provider-svn-commons-1.4.jar already exists in destination. -[INFO] org.apache.servicemix.bundles.aopalliance-1.0_6.jar already exists in destination. -[INFO] spring-integration-core-2.1.0.RELEASE.jar already exists in destination. -[INFO] itextpdf-5.5.6.jar already exists in destination. -[INFO] motech-platform-osgi-web-util-0.30-SNAPSHOT.jar already exists in destination. -[INFO] datanucleus-jodatime-4.0.6.jar already exists in destination. -[INFO] org.apache.servicemix.bundles.spring-tx-3.2.16.RELEASE_1.jar already exists in destination. -[INFO] org.motechproject.javax.time-0.6.3-r033.jar already exists in destination. -[INFO] org.eclipse.gemini.blueprint.extender-1.0.2.RELEASE.jar already exists in destination. -[INFO] org.apache.servicemix.bundles.aspectj-1.8.5_1.jar already exists in destination. -[INFO] org.apache.servicemix.bundles.hamcrest-1.3_1.jar already exists in destination. -[INFO] commons-net-3.2.jar already exists in destination. -[INFO] bval-jsr303-0.5.jar already exists in destination. -[INFO] jcl-over-slf4j-1.7.7.jar already exists in destination. -[INFO] org.apache.servicemix.bundles.spring-jdbc-3.2.16.RELEASE_1.jar already exists in destination. -[INFO] org.motechproject.org.apache.activemq-5.4.2-r033.jar already exists in destination. -[INFO] motech-platform-commons-sql-0.30-SNAPSHOT.jar already exists in destination. -[INFO] commons-lang3-3.1.jar already exists in destination. -[INFO] org.apache.servicemix.bundles.spring-jms-3.2.16.RELEASE_1.jar already exists in destination. -[INFO] paranamer-2.6.jar already exists in destination. -[INFO] commons-configuration-1.10.jar already exists in destination. -[INFO] org.apache.servicemix.bundles.dom4j-1.6.1_5.jar already exists in destination. -[INFO] org.motechproject.org.postgresql-9.1-901.jdbc4-r033.jar already exists in destination. -[INFO] stax-ex-1.7.4.jar already exists in destination. -[INFO] motech-platform-server-config-0.30-SNAPSHOT.jar already exists in destination. -[INFO] commons-beanutils-core-1.8.3.jar already exists in destination. -[INFO] org.motechproject.com.googlecode.lambdaj-2.3.3-r033.jar already exists in destination. -[INFO] objenesis-2.1.jar already exists in destination. -[INFO] jackrabbit-webdav-2.9.1.jar already exists in destination. -[INFO] commons-validator-1.4.1.jar already exists in destination. -[INFO] asm-tree-5.0.3.jar already exists in destination. -[INFO] org.apache.servicemix.bundles.cglib-2.2.2_1.jar already exists in destination. -[INFO] spring-integration-jms-2.1.0.RELEASE.jar already exists in destination. -[INFO] commons-collections-3.2.2.jar already exists in destination. -[INFO] slf4j-log4j12-1.7.7.jar already exists in destination. -[INFO] com.springsource.javax.validation-1.0.0.GA.jar already exists in destination. -[INFO] org.eclipse.osgi.services-3.3.0.v20110513.jar already exists in destination. -[INFO] reflections-0.9.9.jar already exists in destination. -[INFO] commons-httpclient-3.1.jar already exists in destination. -[INFO] -[INFO] --- maven-resources-plugin:2.5:resources (default-resources) @ openmrs --- -[debug] execute contextualize -[INFO] Using 'UTF-8' encoding to copy filtered resources. -[INFO] Copying 0 resource -[INFO] Copying 12 resources -[INFO] -[INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ openmrs --- -[INFO] Compiling 121 source files to /home/nextuser/workspace/modules/openmrs/target/classes -[INFO] -[INFO] >>> maven-pmd-plugin:3.5:check (default) @ openmrs >>> -[INFO] -[INFO] --- maven-pmd-plugin:3.5:pmd (pmd) @ openmrs --- -[INFO] -[INFO] <<< maven-pmd-plugin:3.5:check (default) @ openmrs <<< -[INFO] -[INFO] --- maven-pmd-plugin:3.5:check (default) @ openmrs --- -[INFO] -[INFO] -[INFO] >>> maven-pmd-plugin:3.5:cpd-check (default) @ openmrs >>> -[INFO] -[INFO] --- maven-pmd-plugin:3.5:cpd (cpd) @ openmrs --- -[INFO] -[INFO] <<< maven-pmd-plugin:3.5:cpd-check (default) @ openmrs <<< -[INFO] -[INFO] --- maven-pmd-plugin:3.5:cpd-check (default) @ openmrs --- -[INFO] -[INFO] -[INFO] --- maven-checkstyle-plugin:2.10:check (default) @ openmrs --- -[INFO] Starting audit... -/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSConfigServiceImpl.java:170:77: '-' is not preceded with whitespace. -/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSConfigServiceImpl.java:170:78: '-' is not followed by whitespace. -/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTasksNotifier.java:0: File does not end with a newline. -/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java:82:20: warning: More than 7 parameters (found 28). -/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java:117:17: warning: More than 7 parameters (found 26). -/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java:163:41: warning: '(' is preceded with whitespace. -/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java:304:20: warning: More than 7 parameters (found 24). -/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java:80:12: warning: More than 7 parameters (found 8). -/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java:145:13: warning: switch without "default" clause. -/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java:221:49: warning: Avoid nested blocks. -/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java:229:44: warning: Avoid nested blocks. -/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java:237:22: warning: Avoid nested blocks. -/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java:262:13: warning: switch without "default" clause. -/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java:263:53: warning: Avoid nested blocks. -/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java:268:48: warning: Avoid nested blocks. -/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java:305:11: 'if' is not followed by whitespace. -/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java:319:11: 'if' is not followed by whitespace. -/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSActionProxyService.java:70:13: warning: More than 7 parameters (found 28). -/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSActionProxyService.java:120:10: warning: More than 7 parameters (found 26). -/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSActionProxyService.java:153:34: warning: '(' is preceded with whitespace. -/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/domain/AttributeTypeListResult.java:0: File does not end with a newline. -/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/domain/Person.java:127:16: warning: More than 7 parameters (found 15). -/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/domain/Attribute.java:166:113: Redundant throws: 'JsonParseException' is unchecked exception. -/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/domain/RoleListResult.java:0: File does not end with a newline. -/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/domain/AttributeListResult.java:13:39: warning: '(' is preceded with whitespace. -/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/domain/AttributeListResult.java:17:28: warning: '(' is preceded with whitespace. -/home/nextuser/workspace/modules/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/PersonResourceImpl.java:58:65: warning: '(' is preceded with whitespace. -Audit done. - -[INFO] -[INFO] --- maven-resources-plugin:2.5:testResources (default-testResources) @ openmrs --- -[debug] execute contextualize -[INFO] Using 'UTF-8' encoding to copy filtered resources. -[INFO] Copying 54 resources -[INFO] -[INFO] --- maven-compiler-plugin:2.5.1:testCompile (default-testCompile) @ openmrs --- -[INFO] Compiling 37 source files to /home/nextuser/workspace/modules/openmrs/target/test-classes -[INFO] -[INFO] --- maven-surefire-plugin:2.17:test (default-test) @ openmrs --- -[INFO] Surefire report directory: /home/nextuser/workspace/modules/openmrs/target/surefire-reports -[INFO] Using configured provider org.apache.maven.surefire.junitcore.JUnitCoreProvider -[INFO] parallel='none', perCoreThreadCount=true, threadCount=0, useUnlimitedThreads=false, threadCountSuites=0, threadCountClasses=0, threadCountMethods=0, parallelOptimized=true - -------------------------------------------------------- - T E S T S -------------------------------------------------------- -Java HotSpot(TM) 64-Bit Server VM warning: ignoring option UseSplitVerifier; support was removed in 8.0 -Running org.motechproject.openmrs.service.impl.OpenMRSConfigServiceImplTest -Tests run: 14, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.428 sec - in org.motechproject.openmrs.service.impl.OpenMRSConfigServiceImplTest -Running org.motechproject.openmrs.config.ConfigsTest -Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.008 sec - in org.motechproject.openmrs.config.ConfigsTest -Running org.motechproject.openmrs.tasks.OpenMRSTaskDataProviderBuilderTest -Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.124 sec - in org.motechproject.openmrs.tasks.OpenMRSTaskDataProviderBuilderTest -Running org.motechproject.openmrs.tasks.builder.OpenMRSTriggerBuilderTest -Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.002 sec - in org.motechproject.openmrs.tasks.builder.OpenMRSTriggerBuilderTest -Running org.motechproject.openmrs.tasks.builder.DisplayNameHelperTest -Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.056 sec - in org.motechproject.openmrs.tasks.builder.DisplayNameHelperTest -Running org.motechproject.openmrs.tasks.impl.OpenMRSActionProxyServiceTest -2016-09-21 13:40:03,691 main WARN [org.motechproject.openmrs.tasks.impl.OpenMRSActionProxyServiceImpl] There is no location with name testLocationNameForNotExistingLocation -Tests run: 10, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.213 sec - in org.motechproject.openmrs.tasks.impl.OpenMRSActionProxyServiceTest -Running org.motechproject.openmrs.tasks.OpenMRSTaskDataProviderTest -2016-09-21 13:40:03,774 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider -2016-09-21 13:40:03,782 main WARN [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Active Program Only field should be 'true' or 'false', actually is "%s". -2016-09-21 13:40:03,783 main WARN [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Multiple program enrollment found with the patient UUID "495b10c4-56bd-11df-a35e-0027136865c4" and program name "program". -2016-09-21 13:40:03,791 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider -2016-09-21 13:40:03,801 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider -2016-09-21 13:40:03,803 main WARN [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Active Program Only field should be 'true' or 'false', actually is "%s". -2016-09-21 13:40:03,803 main WARN [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Multiple program enrollment found with the patient MOTECH Id "3" and program name "program". -2016-09-21 13:40:03,815 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider -2016-09-21 13:40:03,817 main WARN [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Active Program Only field should be 'true' or 'false', actually is "%s". -2016-09-21 13:40:03,825 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider -2016-09-21 13:40:03,831 main WARN [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Active Program Only field should be 'true' or 'false', actually is "%s". -2016-09-21 13:40:03,843 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider -2016-09-21 13:40:03,858 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider -2016-09-21 13:40:03,860 main WARN [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Multiple program enrollment found with the patient MOTECH Id "3" and program name "program". -2016-09-21 13:40:03,871 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider -2016-09-21 13:40:03,880 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider -2016-09-21 13:40:03,889 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider -2016-09-21 13:40:03,890 main WARN [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Multiple program enrollment found with the patient UUID "495b10c4-56bd-11df-a35e-0027136865c4" and program name "program". -2016-09-21 13:40:03,898 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider -2016-09-21 13:40:03,905 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider -2016-09-21 13:40:03,907 main ERROR [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Class testClass not found by provider openMRS -java.lang.ClassNotFoundException: org.motechproject.openmrs.domain.testClass - at java.net.URLClassLoader.findClass(URLClassLoader.java:381) - at java.lang.ClassLoader.loadClass(ClassLoader.java:424) - at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) - at java.lang.ClassLoader.loadClass(ClassLoader.java:357) - at org.motechproject.commons.api.AbstractDataProvider.getClassForType(AbstractDataProvider.java:56) - at org.motechproject.commons.api.AbstractDataProvider.supports(AbstractDataProvider.java:46) - at org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider.lookup(OpenMRSTaskDataProvider.java:144) - at org.motechproject.openmrs.tasks.OpenMRSTaskDataProviderTest.shouldReturnNullWhenClassIsNotSupported(OpenMRSTaskDataProviderTest.java:119) - at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) - at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) - at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) - at java.lang.reflect.Method.invoke(Method.java:498) - at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) - at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) - at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) - at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) - at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) - at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) - at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:69) - at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:48) - at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) - at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) - at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) - at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) - at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) - at org.junit.runners.ParentRunner.run(ParentRunner.java:292) - at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl.run(JUnit45AndHigherRunnerImpl.java:37) - at org.mockito.runners.MockitoJUnitRunner.run(MockitoJUnitRunner.java:62) - at org.junit.runners.Suite.runChild(Suite.java:128) - at org.junit.runners.Suite.runChild(Suite.java:24) - at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) - at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) - at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) - at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) - at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) - at org.junit.runners.ParentRunner.run(ParentRunner.java:292) - at org.junit.runner.JUnitCore.run(JUnitCore.java:157) - at org.junit.runner.JUnitCore.run(JUnitCore.java:136) - at org.apache.maven.surefire.junitcore.JUnitCoreWrapper.createRequestAndRun(JUnitCoreWrapper.java:113) - at org.apache.maven.surefire.junitcore.JUnitCoreWrapper.executeEager(JUnitCoreWrapper.java:85) - at org.apache.maven.surefire.junitcore.JUnitCoreWrapper.execute(JUnitCoreWrapper.java:54) - at org.apache.maven.surefire.junitcore.JUnitCoreProvider.invoke(JUnitCoreProvider.java:134) - at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200) - at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153) - at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103) -2016-09-21 13:40:03,915 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider -2016-09-21 13:40:03,915 main ERROR [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Lookup with name wrongLookupName doesn't exist for encounter object -2016-09-21 13:40:03,921 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider -2016-09-21 13:40:03,928 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider -2016-09-21 13:40:03,935 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider -2016-09-21 13:40:03,941 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider -2016-09-21 13:40:03,942 main ERROR [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Lookup with name wrongLookupName doesn't exist for patient object -2016-09-21 13:40:03,946 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider -2016-09-21 13:40:03,952 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider -2016-09-21 13:40:03,958 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider -2016-09-21 13:40:03,969 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider -2016-09-21 13:40:03,975 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider -2016-09-21 13:40:03,981 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider -2016-09-21 13:40:03,986 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider -2016-09-21 13:40:03,987 main ERROR [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Lookup with name wrongLookupName doesn't exist for provider object -2016-09-21 13:40:03,992 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider -2016-09-21 13:40:04,000 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider -2016-09-21 13:40:04,006 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider -2016-09-21 13:40:04,012 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider -2016-09-21 13:40:04,020 main INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Omitting registration of empty OpenMRS data provider -2016-09-21 13:40:04,020 main ERROR [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Lookup with name wrongLookupName doesn't exist for patient object -2016-09-21 13:40:04,021 main WARN [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] Active Program Only field should be 'true' or 'false', actually is "%s". -Tests run: 29, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.255 sec - in org.motechproject.openmrs.tasks.OpenMRSTaskDataProviderTest -Running org.motechproject.openmrs.validation.ConfigValidatorTest -Tests run: 13, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.019 sec - in org.motechproject.openmrs.validation.ConfigValidatorTest -Running org.motechproject.openmrs.domain.PasswordTest -Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.005 sec - in org.motechproject.openmrs.domain.PasswordTest -Running org.motechproject.openmrs.resource.impl.CohortResourceImplTest -2016-09-21 13:40:04,204 main INFO [org.motechproject.openmrs.resource.impl.CohortResourceImpl] Querying Cohort Query endpoint returned report with 3 members -2016-09-21 13:40:04,223 main INFO [org.motechproject.openmrs.resource.impl.CohortResourceImpl] Querying Cohort Query endpoint returned report with 3 members -Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.17 sec - in org.motechproject.openmrs.resource.impl.CohortResourceImplTest -Running org.motechproject.openmrs.resource.impl.GeneratedIdentifierResourceImplTest -Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.011 sec - in org.motechproject.openmrs.resource.impl.GeneratedIdentifierResourceImplTest -Running org.motechproject.openmrs.resource.impl.PatientResourceImplTest -Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.104 sec - in org.motechproject.openmrs.resource.impl.PatientResourceImplTest -Running org.motechproject.openmrs.resource.impl.RelationshipResourceImplTest -Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.006 sec - in org.motechproject.openmrs.resource.impl.RelationshipResourceImplTest -Running org.motechproject.openmrs.resource.impl.LocationResourceImplTest -Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.028 sec - in org.motechproject.openmrs.resource.impl.LocationResourceImplTest -Running org.motechproject.openmrs.resource.impl.ConceptResourceImplTest -Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.028 sec - in org.motechproject.openmrs.resource.impl.ConceptResourceImplTest -Running org.motechproject.openmrs.resource.impl.PersonResourceImplTest -Tests run: 10, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.068 sec - in org.motechproject.openmrs.resource.impl.PersonResourceImplTest -Running org.motechproject.openmrs.resource.impl.EncounterResourceImplTest -2016-09-21 13:40:04,521 main ERROR [org.motechproject.openmrs.util.JsonUtils] Failed to parse date: Unparseable date: "2012-06-03T00:00:00.000Z" -2016-09-21 13:40:04,522 main ERROR [org.motechproject.openmrs.util.JsonUtils] Failed to parse date: Unparseable date: "2012-06-03T00:00:00.000Z" -2016-09-21 13:40:04,525 main ERROR [org.motechproject.openmrs.util.JsonUtils] Failed to parse date: Unparseable date: "2012-06-03T00:00:00.000Z" -2016-09-21 13:40:04,526 main ERROR [org.motechproject.openmrs.util.JsonUtils] Failed to parse date: Unparseable date: "2012-06-03T00:00:00.000Z" -2016-09-21 13:40:04,532 main ERROR [org.motechproject.openmrs.util.JsonUtils] Failed to parse date: Unparseable date: "2012-06-03T00:00:00.000Z" -2016-09-21 13:40:04,533 main ERROR [org.motechproject.openmrs.util.JsonUtils] Failed to parse date: Unparseable date: "2012-06-03T00:00:00.000Z" -2016-09-21 13:40:04,535 main ERROR [org.motechproject.openmrs.util.JsonUtils] Failed to parse date: Unparseable date: "2012-06-03T00:00:00.000Z" -2016-09-21 13:40:04,536 main ERROR [org.motechproject.openmrs.util.JsonUtils] Failed to parse date: Unparseable date: "2012-06-03T00:00:00.000Z" -Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.055 sec - in org.motechproject.openmrs.resource.impl.EncounterResourceImplTest -Running org.motechproject.openmrs.resource.impl.ProgramEnrollmentResourceImplTest -Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.049 sec - in org.motechproject.openmrs.resource.impl.ProgramEnrollmentResourceImplTest -Running org.motechproject.openmrs.resource.impl.ObservationResourceImplTest -Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.006 sec - in org.motechproject.openmrs.resource.impl.ObservationResourceImplTest -Running org.motechproject.openmrs.resource.impl.UserResourceImplTest -Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.032 sec - in org.motechproject.openmrs.resource.impl.UserResourceImplTest - -Results : - -Tests run: 126, Failures: 0, Errors: 0, Skipped: 0 - -[INFO] -[INFO] --- maven-bundle-plugin:2.5.3:bundle (default-bundle) @ openmrs --- -[WARNING] Bundle org.motechproject:openmrs:bundle:0.30-SNAPSHOT : Export org.motechproject.openmrs.service, has 1, private references [org.motechproject.openmrs.config], -[WARNING] Bundle org.motechproject:openmrs:bundle:0.30-SNAPSHOT : Export org.motechproject.openmrs.tasks, has 1, private references [org.motechproject.openmrs.tasks.builder], -[INFO] -[INFO] --- maven-resources-plugin:2.5:copy-resources (copy-bundles) @ openmrs --- -[debug] execute contextualize -[INFO] Using 'UTF-8' encoding to copy filtered resources. -[INFO] Copying 1 resource -[INFO] -[INFO] --- maven-resources-plugin:2.5:copy-resources (copy-test-config-files) @ openmrs --- -[debug] execute contextualize -[INFO] Using 'UTF-8' encoding to copy filtered resources. -[INFO] Copying 1 resource -[INFO] Copying 1 resource -[INFO] Copying 1 resource -[INFO] -[INFO] --- maven-resources-plugin:2.5:copy-resources (copy-test-openmrs-config-file) @ openmrs --- -[debug] execute contextualize -[INFO] Using 'UTF-8' encoding to copy filtered resources. -[INFO] Copying 1 resource -[INFO] -[INFO] --- sql-maven-plugin:1.5:execute (drop-db) @ openmrs --- -[INFO] Executing commands -[INFO] 2 of 2 SQL statements executed successfully -[INFO] -[INFO] --- sql-maven-plugin:1.5:execute (create-db) @ openmrs --- -[INFO] Executing commands -[INFO] 2 of 2 SQL statements executed successfully -[INFO] -[INFO] --- maven-failsafe-plugin:2.17:integration-test (integration-test) @ openmrs --- -[INFO] Failsafe report directory: /home/nextuser/workspace/modules/openmrs/target/failsafe-reports - -------------------------------------------------------- - T E S T S -------------------------------------------------------- -Running org.motechproject.openmrs.it.version1_12.MRSIntegrationTests -[INFO] Started jetty 6.1.x at port(s) HTTP:8181 -[INFO] Initializing Spring FrameworkServlet 'servlet_1' -[INFO] Initialized servlet for org.motechproject.motech-platform-osgi-web-util [104] -[INFO] Initializing Spring FrameworkServlet 'servlet_3' -[INFO] Initialized servlet for org.motechproject.motech-platform-dataservices [62] -2016-09-21 13:41:33,269 EclipseGeminiBlueprintExtenderThread-17 INFO [org.motechproject.openmrs.tasks.OpenMRSTaskDataProvider] OpenMRS data provider registered -[INFO] Initializing Spring FrameworkServlet 'servlet_4' -[INFO] Initialized servlet for org.motechproject.openmrs [13] -2016-09-21 13:41:34,362 EclipseGeminiBlueprintExtenderThread-18 INFO [org.motechproject.openmrs.tasks.OpenMRSTasksNotifier] Tasks module became available, registering channel -2016-09-21 13:41:34,373 EclipseGeminiBlueprintExtenderThread-18 TRACE [org.motechproject.openmrs.tasks.TasksChannelServiceInstance] Registering channel with the following request: Channel{actionTaskEvents=[ActionEventRequest{name='null', actionParameters=[ActionParameterRequest{order=0, key='configName', value='TestOpenMRSServer', displayName='openMRS.configuration.name', type='UNICODE', required=true, hidden=true, options=null}, ActionParameterRequest{order=1, key='encounterDatetime', value='null', displayName='openMRS.encounter.date', type='DATE', required=true, hidden=false, options=null}, ActionParameterRequest{order=2, key='encounterType', value='null', displayName='openMRS.encounter.type', type='UNICODE', required=true, hidden=false, options=null}, ActionParameterRequest{order=3, key='locationName', value='null', displayName='openMRS.location.name', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=4, key='patientUuid', value='null', displayName='openMRS.patient.uuid', type='UNICODE', required=true, hidden=false, options=null}, ActionParameterRequest{order=5, key='providerUuid', value='null', displayName='openMRS.provider.uuid', type='UNICODE', required=true, hidden=false, options=null}, ActionParameterRequest{order=6, key='observation', value='null', displayName='openMRS.encounter.observation', type='MAP', required=false, hidden=false, options=null}], postActionParameters=[ActionParameterRequest{order=0, key='uuid', value='null', displayName='openMRS.encounter.uuid', type='UNICODE', required=false, hidden=false, options=null}], serviceInterface='org.motechproject.openmrs.tasks.OpenMRSActionProxyService', serviceMethod='createEncounter', serviceMethodCallManner='NAMED_PARAMETERS'}, ActionEventRequest{name='null', actionParameters=[ActionParameterRequest{order=0, key='configName', value='TestOpenMRSServer', displayName='openMRS.configuration.name', type='UNICODE', required=false, hidden=true, options=null}, ActionParameterRequest{order=1, key='givenName', value='null', displayName='openMRS.person.givenName', type='UNICODE', required=true, hidden=false, options=null}, ActionParameterRequest{order=2, key='middleName', value='null', displayName='openMRS.person.middleName', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=3, key='familyName', value='null', displayName='openMRS.person.familyName', type='UNICODE', required=true, hidden=false, options=null}, ActionParameterRequest{order=4, key='address1', value='null', displayName='openMRS.address.address1', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=5, key='address2', value='null', displayName='openMRS.address.address2', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=6, key='address3', value='null', displayName='openMRS.address.address3', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=7, key='address4', value='null', displayName='openMRS.address.address4', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=8, key='address5', value='null', displayName='openMRS.address.address5', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=9, key='address6', value='null', displayName='openMRS.address.address6', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=10, key='cityVillage', value='null', displayName='openMRS.address.cityVillage', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=11, key='stateProvince', value='null', displayName='openMRS.address.stateProvince', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=12, key='country', value='null', displayName='openMRS.address.country', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=13, key='postalCode', value='null', displayName='openMRS.address.postalCode', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=14, key='countyDistrict', value='null', displayName='openMRS.address.countyDistrict', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=15, key='latitude', value='null', displayName='openMRS.address.latitude', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=16, key='longitude', value='null', displayName='openMRS.address.longitude', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=17, key='startDate', value='null', displayName='openMRS.address.startDate', type='DATE', required=false, hidden=false, options=null}, ActionParameterRequest{order=18, key='endDate', value='null', displayName='openMRS.address.endDate', type='DATE', required=false, hidden=false, options=null}, ActionParameterRequest{order=19, key='birthDate', value='null', displayName='openMRS.person.birthDate', type='DATE', required=false, hidden=false, options=null}, ActionParameterRequest{order=20, key='birthDateEstimated', value='null', displayName='openMRS.person.birthDateEstimated', type='BOOLEAN', required=false, hidden=false, options=null}, ActionParameterRequest{order=21, key='gender', value='null', displayName='openMRS.person.gender', type='UNICODE', required=true, hidden=false, options=null}, ActionParameterRequest{order=22, key='dead', value='null', displayName='openMRS.person.dead', type='BOOLEAN', required=false, hidden=false, options=null}, ActionParameterRequest{order=23, key='causeOfDeathUUID', value='null', displayName='openMRS.person.causeOfDeath.uuid', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=24, key='motechId', value='null', displayName='openMRS.motechId', type='UNICODE', required=true, hidden=false, options=null}, ActionParameterRequest{order=25, key='locationForMotechId', value='null', displayName='openMRS.location.name', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=26, key='identifiers', value='null', displayName='openMRS.patient.identifiers', type='MAP', required=false, hidden=false, options=null}, ActionParameterRequest{order=27, key='person.personAttributes', value='null', displayName='openMRS.patient.personAttributes', type='MAP', required=false, hidden=false, options=null}], postActionParameters=[ActionParameterRequest{order=0, key='uuid', value='null', displayName='openMRS.patient.uuid', type='UNICODE', required=false, hidden=false, options=null}], serviceInterface='org.motechproject.openmrs.tasks.OpenMRSActionProxyService', serviceMethod='createPatient', serviceMethodCallManner='NAMED_PARAMETERS'}, ActionEventRequest{name='null', actionParameters=[ActionParameterRequest{order=0, key='configName', value='TestOpenMRSServer', displayName='openMRS.configuration.name', type='UNICODE', required=false, hidden=true, options=null}, ActionParameterRequest{order=1, key='person.uuid', value='null', displayName='openMRS.person.uuid', type='UNICODE', required=true, hidden=false, options=null}, ActionParameterRequest{order=2, key='givenName', value='null', displayName='openMRS.person.givenName', type='UNICODE', required=true, hidden=false, options=null}, ActionParameterRequest{order=3, key='middleName', value='null', displayName='openMRS.person.middleName', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=4, key='familyName', value='null', displayName='openMRS.person.familyName', type='UNICODE', required=true, hidden=false, options=null}, ActionParameterRequest{order=5, key='address1', value='null', displayName='openMRS.address.address1', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=6, key='address2', value='null', displayName='openMRS.address.address2', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=7, key='address3', value='null', displayName='openMRS.address.address3', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=8, key='address4', value='null', displayName='openMRS.address.address4', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=9, key='address5', value='null', displayName='openMRS.address.address5', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=10, key='address6', value='null', displayName='openMRS.address.address6', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=11, key='cityVillage', value='null', displayName='openMRS.address.cityVillage', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=12, key='stateProvince', value='null', displayName='openMRS.address.stateProvince', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=13, key='country', value='null', displayName='openMRS.address.country', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=14, key='postalCode', value='null', displayName='openMRS.address.postalCode', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=15, key='countyDistrict', value='null', displayName='openMRS.address.countyDistrict', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=16, key='latitude', value='null', displayName='openMRS.address.latitude', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=17, key='longitude', value='null', displayName='openMRS.address.longitude', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=18, key='startDate', value='null', displayName='openMRS.address.startDate', type='DATE', required=false, hidden=false, options=null}, ActionParameterRequest{order=19, key='endDate', value='null', displayName='openMRS.address.endDate', type='DATE', required=false, hidden=false, options=null}, ActionParameterRequest{order=20, key='birthDate', value='null', displayName='openMRS.person.birthDate', type='DATE', required=false, hidden=false, options=null}, ActionParameterRequest{order=21, key='birthDateEstimated', value='null', displayName='openMRS.person.birthDateEstimated', type='BOOLEAN', required=false, hidden=false, options=null}, ActionParameterRequest{order=22, key='gender', value='null', displayName='openMRS.person.gender', type='UNICODE', required=true, hidden=false, options=null}, ActionParameterRequest{order=23, key='dead', value='null', displayName='openMRS.person.dead', type='BOOLEAN', required=false, hidden=false, options=null}, ActionParameterRequest{order=24, key='causeOfDeathUUID', value='null', displayName='openMRS.person.causeOfDeath.uuid', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=25, key='person.personAttributes', value='null', displayName='openMRS.patient.personAttributes', type='MAP', required=false, hidden=false, options=null}], postActionParameters=[], serviceInterface='org.motechproject.openmrs.tasks.OpenMRSActionProxyService', serviceMethod='updatePerson', serviceMethodCallManner='NAMED_PARAMETERS'}, ActionEventRequest{name='null', actionParameters=[ActionParameterRequest{order=0, key='configName', value='TestOpenMRSServer', displayName='openMRS.configuration.name', type='UNICODE', required=false, hidden=true, options=null}, ActionParameterRequest{order=1, key='person.uuid', value='null', displayName='openMRS.person.uuid', type='UNICODE', required=true, hidden=false, options=null}, ActionParameterRequest{order=2, key='identifiers', value='null', displayName='openMRS.patient.identifiers', type='MAP', required=true, hidden=false, options=null}], postActionParameters=[], serviceInterface='org.motechproject.openmrs.tasks.OpenMRSActionProxyService', serviceMethod='updatePatientIdentifiers', serviceMethodCallManner='NAMED_PARAMETERS'}, ActionEventRequest{name='null', actionParameters=[ActionParameterRequest{order=0, key='configName', value='TestOpenMRSServer', displayName='openMRS.configuration.name', type='UNICODE', required=false, hidden=true, options=null}, ActionParameterRequest{order=1, key='cohortQueryUuid', value='null', displayName='openMRS.cohortQuery.uuid', type='UNICODE', required=true, hidden=false, options=null}, ActionParameterRequest{order=2, key='cohortQueryParameters', value='null', displayName='openMRS.cohortQuery.parameters', type='MAP', required=false, hidden=false, options=null}], postActionParameters=[], serviceInterface='org.motechproject.openmrs.tasks.OpenMRSActionProxyService', serviceMethod='getCohortQueryReport', serviceMethodCallManner='NAMED_PARAMETERS'}, ActionEventRequest{name='null', actionParameters=[ActionParameterRequest{order=0, key='configName', value='TestOpenMRSServer', displayName='openMRS.configuration.name', type='UNICODE', required=false, hidden=true, options=null}, ActionParameterRequest{order=1, key='patientUuid', value='null', displayName='openMRS.patient.uuid', type='UNICODE', required=true, hidden=false, options=null}, ActionParameterRequest{order=2, key='program.uuid', value='null', displayName='openMRS.program.uuid', type='UNICODE', required=true, hidden=false, options=null}, ActionParameterRequest{order=3, key='dateEnrolled', value='null', displayName='openMRS.programEnrollment.dateEnrolled', type='DATE', required=true, hidden=false, options=null}, ActionParameterRequest{order=4, key='dateCompleted', value='null', displayName='openMRS.programEnrollment.dateCompleted', type='DATE', required=false, hidden=false, options=null}, ActionParameterRequest{order=5, key='locationName', value='null', displayName='openMRS.location.name', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=6, key='programEnrollmentAttributes', value='null', displayName='openMRS.programEnrollment.attributes', type='MAP', required=false, hidden=false, options=null}], postActionParameters=[], serviceInterface='org.motechproject.openmrs.tasks.OpenMRSActionProxyService', serviceMethod='createProgramEnrollment', serviceMethodCallManner='NAMED_PARAMETERS'}, ActionEventRequest{name='null', actionParameters=[ActionParameterRequest{order=0, key='configName', value='TestOpenMRSServer', displayName='openMRS.configuration.name', type='UNICODE', required=false, hidden=true, options=null}, ActionParameterRequest{order=1, key='programEnrollmentUuid', value='null', displayName='openMRS.programEnrollment.uuid', type='UNICODE', required=true, hidden=false, options=null}, ActionParameterRequest{order=2, key='dateCompleted', value='null', displayName='openMRS.programEnrollment.dateCompleted', type='DATE', required=false, hidden=false, options=null}, ActionParameterRequest{order=3, key='stateUuid', value='null', displayName='openMRS.program.state.uuid', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=4, key='startDate', value='null', displayName='openMRS.program.state.startDate', type='DATE', required=false, hidden=false, options=null}, ActionParameterRequest{order=5, key='programEnrollmentAttributes', value='null', displayName='openMRS.programEnrollment.attributes', type='MAP', required=false, hidden=false, options=null}], postActionParameters=[], serviceInterface='org.motechproject.openmrs.tasks.OpenMRSActionProxyService', serviceMethod='updateProgramEnrollment', serviceMethodCallManner='NAMED_PARAMETERS'}, ActionEventRequest{name='null', actionParameters=[ActionParameterRequest{order=0, key='configName', value='TestOpenMRSServer', displayName='openMRS.configuration.name', type='UNICODE', required=false, hidden=true, options=null}, ActionParameterRequest{order=1, key='programEnrollmentUuid', value='null', displayName='openMRS.programEnrollment.uuid', type='UNICODE', required=true, hidden=false, options=null}, ActionParameterRequest{order=2, key='dateCompleted', value='null', displayName='openMRS.programEnrollment.dateCompleted', type='DATE', required=false, hidden=false, options=null}, ActionParameterRequest{order=3, key='stateUuid', value='null', displayName='openMRS.program.state.uuid', type='UNICODE', required=false, hidden=false, options=null}, ActionParameterRequest{order=4, key='startDate', value='null', displayName='openMRS.program.state.startDate', type='DATE', required=false, hidden=false, options=null}], postActionParameters=[], serviceInterface='org.motechproject.openmrs.tasks.OpenMRSActionProxyService', serviceMethod='changeStateOfProgramEnrollment', serviceMethodCallManner='NAMED_PARAMETERS'}], triggerTaskEvents=[TriggerEvent{eventParameters=[EventParameter{eventKey='patientUuid'} org.motechproject.tasks.contract.EventParameterRequest@1f55487f, EventParameter{eventKey='patientDisplay'} org.motechproject.tasks.contract.EventParameterRequest@ae41461c, EventParameter{eventKey='cohortQueryUuid'} org.motechproject.tasks.contract.EventParameterRequest@f524b44d]}], description='Channel originating from the OpenMRS module', moduleName='org.motechproject.openmrs', moduleVersion='0.30.0.SNAPSHOT', displayName='openMRS'} -[INFO] Initializing Spring FrameworkServlet 'servlet_6' -[INFO] Initialized servlet for org.motechproject.motech-tasks [22] -2016-09-21 13:43:34,650 main INFO [org.motechproject.openmrs.it.MRSTasksIntegrationBundleIT] Setting up security context with permissions: [manageTasks, manageOpenMRS] -2016-09-21 13:43:34,658 main INFO [org.motechproject.openmrs.it.MRSTasksIntegrationBundleIT] Looking for org.motechproject.openmrs -2016-09-21 13:43:46,827 main INFO [org.motechproject.openmrs.it.MRSTasksIntegrationBundleIT] There are 2 channels in total -2016-09-21 13:43:48,243 main INFO [org.motechproject.openmrs.it.MRSTasksIntegrationBundleIT] Looking for org.motechproject.motech-platform-dataservices-entities -2016-09-21 13:44:00,003 main INFO [org.motechproject.openmrs.it.MRSTasksIntegrationBundleIT] There are 2 channels in total -2016-09-21 13:44:14,859 main INFO [org.motechproject.openmrs.it.MRSTasksIntegrationBundleIT] testOpenMRSTasksIntegration starts waiting for task to execute -2016-09-21 13:44:14,875 main INFO [org.motechproject.openmrs.it.MRSTasksIntegrationBundleIT] co sie tu ku.wa dzieje!? [WARNING, SUCCESS, ERROR]no nie wierze [] -2016-09-21 13:44:16,880 main INFO [org.motechproject.openmrs.it.MRSTasksIntegrationBundleIT] co sie tu ku.wa dzieje!? [WARNING, SUCCESS, ERROR]no nie wierze [] -2016-09-21 13:44:18,903 main INFO [org.motechproject.openmrs.it.MRSTasksIntegrationBundleIT] co sie tu ku.wa dzieje!? [WARNING, SUCCESS, ERROR]no nie wierze [TaskActivity{message='task.success.ok', task=1, field='[]', date=2016-09-21T13:44:14.937+02:00, activityType=SUCCESS, stackTrace=null}] -2016-09-21 13:44:18,904 main INFO [org.motechproject.openmrs.it.MRSTasksIntegrationBundleIT] Task executed after 2 retries, what took about 4 seconds -2016-09-21 13:44:19,068 main INFO [org.motechproject.openmrs.it.MRSTasksIntegrationBundleIT] co tu sie dzieje: org.motechproject.openmrs.domain.Encounter@2c44a088 -[INFO] Destroying Spring FrameworkServlet 'servlet_6' -[INFO] Destroying Spring FrameworkServlet 'servlet_4' -2016-09-21 13:44:25,090 Gemini Blueprint context shutdown thread INFO [org.motechproject.openmrs.tasks.OpenMRSTasksNotifier] Module is being disabled, unregistering Tasks channel -[INFO] Destroying Spring FrameworkServlet 'servlet_3' -[INFO] Destroying Spring FrameworkServlet 'servlet_1' -Tests run: 11, Failures: 0, Errors: 10, Skipped: 0, Time elapsed: 250.458 sec <<< FAILURE! - in org.motechproject.openmrs.it.version1_12.MRSIntegrationTests -initializationError(org.motechproject.openmrs.it.version1_12.MRSTaskIntegrationBundle1_12IT) Time elapsed: 0.009 sec <<< ERROR! -java.lang.Exception: No runnable methods - at org.junit.runners.BlockJUnit4ClassRunner.validateInstanceMethods(BlockJUnit4ClassRunner.java:157) - at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:102) - at org.junit.runners.ParentRunner.validate(ParentRunner.java:336) - at org.junit.runners.ParentRunner.(ParentRunner.java:74) - at org.junit.runners.BlockJUnit4ClassRunner.(BlockJUnit4ClassRunner.java:56) - at org.ops4j.pax.exam.junit.impl.ProbeRunner.(ProbeRunner.java:73) - at org.ops4j.pax.exam.junit.PaxExam.createDelegate(PaxExam.java:82) - at org.ops4j.pax.exam.junit.PaxExam.(PaxExam.java:73) - at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) - at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) - at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) - at java.lang.reflect.Constructor.newInstance(Constructor.java:423) - at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:31) - at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) - at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) - at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) - at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) - at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:98) - at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:84) - at org.junit.runners.Suite.(Suite.java:101) - at org.junit.runners.Suite.(Suite.java:67) - at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) - at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) - at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) - at java.lang.reflect.Constructor.newInstance(Constructor.java:423) - at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:35) - at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) - at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) - at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) - at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) - at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24) - at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:262) - at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153) - at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124) - at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200) - at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153) - at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103) - -initializationError(org.motechproject.openmrs.it.MRSConceptServiceIT) Time elapsed: 0 sec <<< ERROR! -java.lang.Exception: No runnable methods - at org.junit.runners.BlockJUnit4ClassRunner.validateInstanceMethods(BlockJUnit4ClassRunner.java:157) - at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:102) - at org.junit.runners.ParentRunner.validate(ParentRunner.java:336) - at org.junit.runners.ParentRunner.(ParentRunner.java:74) - at org.junit.runners.BlockJUnit4ClassRunner.(BlockJUnit4ClassRunner.java:56) - at org.ops4j.pax.exam.junit.impl.ProbeRunner.(ProbeRunner.java:73) - at org.ops4j.pax.exam.junit.PaxExam.createDelegate(PaxExam.java:82) - at org.ops4j.pax.exam.junit.PaxExam.(PaxExam.java:73) - at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) - at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) - at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) - at java.lang.reflect.Constructor.newInstance(Constructor.java:423) - at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:31) - at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) - at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) - at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) - at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) - at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:98) - at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:84) - at org.junit.runners.Suite.(Suite.java:101) - at org.junit.runners.Suite.(Suite.java:67) - at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) - at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) - at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) - at java.lang.reflect.Constructor.newInstance(Constructor.java:423) - at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:35) - at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) - at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) - at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) - at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) - at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24) - at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:262) - at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153) - at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124) - at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200) - at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153) - at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103) - -initializationError(org.motechproject.openmrs.it.MRSEncounterServiceIT) Time elapsed: 0.001 sec <<< ERROR! -java.lang.Exception: No runnable methods - at org.junit.runners.BlockJUnit4ClassRunner.validateInstanceMethods(BlockJUnit4ClassRunner.java:157) - at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:102) - at org.junit.runners.ParentRunner.validate(ParentRunner.java:336) - at org.junit.runners.ParentRunner.(ParentRunner.java:74) - at org.junit.runners.BlockJUnit4ClassRunner.(BlockJUnit4ClassRunner.java:56) - at org.ops4j.pax.exam.junit.impl.ProbeRunner.(ProbeRunner.java:73) - at org.ops4j.pax.exam.junit.PaxExam.createDelegate(PaxExam.java:82) - at org.ops4j.pax.exam.junit.PaxExam.(PaxExam.java:73) - at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) - at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) - at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) - at java.lang.reflect.Constructor.newInstance(Constructor.java:423) - at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:31) - at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) - at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) - at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) - at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) - at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:98) - at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:84) - at org.junit.runners.Suite.(Suite.java:101) - at org.junit.runners.Suite.(Suite.java:67) - at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) - at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) - at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) - at java.lang.reflect.Constructor.newInstance(Constructor.java:423) - at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:35) - at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) - at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) - at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) - at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) - at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24) - at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:262) - at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153) - at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124) - at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200) - at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153) - at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103) - -initializationError(org.motechproject.openmrs.it.MRSLocationServiceIT) Time elapsed: 0.001 sec <<< ERROR! -java.lang.Exception: No runnable methods - at org.junit.runners.BlockJUnit4ClassRunner.validateInstanceMethods(BlockJUnit4ClassRunner.java:157) - at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:102) - at org.junit.runners.ParentRunner.validate(ParentRunner.java:336) - at org.junit.runners.ParentRunner.(ParentRunner.java:74) - at org.junit.runners.BlockJUnit4ClassRunner.(BlockJUnit4ClassRunner.java:56) - at org.ops4j.pax.exam.junit.impl.ProbeRunner.(ProbeRunner.java:73) - at org.ops4j.pax.exam.junit.PaxExam.createDelegate(PaxExam.java:82) - at org.ops4j.pax.exam.junit.PaxExam.(PaxExam.java:73) - at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) - at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) - at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) - at java.lang.reflect.Constructor.newInstance(Constructor.java:423) - at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:31) - at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) - at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) - at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) - at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) - at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:98) - at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:84) - at org.junit.runners.Suite.(Suite.java:101) - at org.junit.runners.Suite.(Suite.java:67) - at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) - at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) - at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) - at java.lang.reflect.Constructor.newInstance(Constructor.java:423) - at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:35) - at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) - at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) - at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) - at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) - at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24) - at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:262) - at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153) - at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124) - at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200) - at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153) - at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103) - -initializationError(org.motechproject.openmrs.it.MRSObservationServiceIT) Time elapsed: 0 sec <<< ERROR! -java.lang.Exception: No runnable methods - at org.junit.runners.BlockJUnit4ClassRunner.validateInstanceMethods(BlockJUnit4ClassRunner.java:157) - at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:102) - at org.junit.runners.ParentRunner.validate(ParentRunner.java:336) - at org.junit.runners.ParentRunner.(ParentRunner.java:74) - at org.junit.runners.BlockJUnit4ClassRunner.(BlockJUnit4ClassRunner.java:56) - at org.ops4j.pax.exam.junit.impl.ProbeRunner.(ProbeRunner.java:73) - at org.ops4j.pax.exam.junit.PaxExam.createDelegate(PaxExam.java:82) - at org.ops4j.pax.exam.junit.PaxExam.(PaxExam.java:73) - at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) - at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) - at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) - at java.lang.reflect.Constructor.newInstance(Constructor.java:423) - at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:31) - at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) - at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) - at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) - at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) - at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:98) - at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:84) - at org.junit.runners.Suite.(Suite.java:101) - at org.junit.runners.Suite.(Suite.java:67) - at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) - at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) - at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) - at java.lang.reflect.Constructor.newInstance(Constructor.java:423) - at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:35) - at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) - at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) - at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) - at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) - at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24) - at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:262) - at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153) - at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124) - at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200) - at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153) - at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103) - -initializationError(org.motechproject.openmrs.it.MRSPatientServiceIT) Time elapsed: 0 sec <<< ERROR! -java.lang.Exception: No runnable methods - at org.junit.runners.BlockJUnit4ClassRunner.validateInstanceMethods(BlockJUnit4ClassRunner.java:157) - at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:102) - at org.junit.runners.ParentRunner.validate(ParentRunner.java:336) - at org.junit.runners.ParentRunner.(ParentRunner.java:74) - at org.junit.runners.BlockJUnit4ClassRunner.(BlockJUnit4ClassRunner.java:56) - at org.ops4j.pax.exam.junit.impl.ProbeRunner.(ProbeRunner.java:73) - at org.ops4j.pax.exam.junit.PaxExam.createDelegate(PaxExam.java:82) - at org.ops4j.pax.exam.junit.PaxExam.(PaxExam.java:73) - at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) - at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) - at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) - at java.lang.reflect.Constructor.newInstance(Constructor.java:423) - at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:31) - at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) - at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) - at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) - at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) - at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:98) - at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:84) - at org.junit.runners.Suite.(Suite.java:101) - at org.junit.runners.Suite.(Suite.java:67) - at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) - at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) - at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) - at java.lang.reflect.Constructor.newInstance(Constructor.java:423) - at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:35) - at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) - at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) - at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) - at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) - at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24) - at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:262) - at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153) - at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124) - at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200) - at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153) - at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103) - -initializationError(org.motechproject.openmrs.it.MRSPersonServiceIT) Time elapsed: 0.001 sec <<< ERROR! -java.lang.Exception: No runnable methods - at org.junit.runners.BlockJUnit4ClassRunner.validateInstanceMethods(BlockJUnit4ClassRunner.java:157) - at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:102) - at org.junit.runners.ParentRunner.validate(ParentRunner.java:336) - at org.junit.runners.ParentRunner.(ParentRunner.java:74) - at org.junit.runners.BlockJUnit4ClassRunner.(BlockJUnit4ClassRunner.java:56) - at org.ops4j.pax.exam.junit.impl.ProbeRunner.(ProbeRunner.java:73) - at org.ops4j.pax.exam.junit.PaxExam.createDelegate(PaxExam.java:82) - at org.ops4j.pax.exam.junit.PaxExam.(PaxExam.java:73) - at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) - at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) - at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) - at java.lang.reflect.Constructor.newInstance(Constructor.java:423) - at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:31) - at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) - at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) - at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) - at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) - at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:98) - at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:84) - at org.junit.runners.Suite.(Suite.java:101) - at org.junit.runners.Suite.(Suite.java:67) - at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) - at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) - at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) - at java.lang.reflect.Constructor.newInstance(Constructor.java:423) - at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:35) - at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) - at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) - at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) - at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) - at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24) - at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:262) - at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153) - at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124) - at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200) - at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153) - at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103) - -initializationError(org.motechproject.openmrs.it.MRSProviderServiceIT) Time elapsed: 0.001 sec <<< ERROR! -java.lang.Exception: No runnable methods - at org.junit.runners.BlockJUnit4ClassRunner.validateInstanceMethods(BlockJUnit4ClassRunner.java:157) - at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:102) - at org.junit.runners.ParentRunner.validate(ParentRunner.java:336) - at org.junit.runners.ParentRunner.(ParentRunner.java:74) - at org.junit.runners.BlockJUnit4ClassRunner.(BlockJUnit4ClassRunner.java:56) - at org.ops4j.pax.exam.junit.impl.ProbeRunner.(ProbeRunner.java:73) - at org.ops4j.pax.exam.junit.PaxExam.createDelegate(PaxExam.java:82) - at org.ops4j.pax.exam.junit.PaxExam.(PaxExam.java:73) - at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) - at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) - at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) - at java.lang.reflect.Constructor.newInstance(Constructor.java:423) - at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:31) - at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) - at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) - at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) - at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) - at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:98) - at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:84) - at org.junit.runners.Suite.(Suite.java:101) - at org.junit.runners.Suite.(Suite.java:67) - at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) - at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) - at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) - at java.lang.reflect.Constructor.newInstance(Constructor.java:423) - at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:35) - at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) - at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) - at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) - at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) - at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24) - at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:262) - at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153) - at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124) - at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200) - at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153) - at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103) - -initializationError(org.motechproject.openmrs.it.MRSUserServiceIT) Time elapsed: 0.001 sec <<< ERROR! -java.lang.Exception: No runnable methods - at org.junit.runners.BlockJUnit4ClassRunner.validateInstanceMethods(BlockJUnit4ClassRunner.java:157) - at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:102) - at org.junit.runners.ParentRunner.validate(ParentRunner.java:336) - at org.junit.runners.ParentRunner.(ParentRunner.java:74) - at org.junit.runners.BlockJUnit4ClassRunner.(BlockJUnit4ClassRunner.java:56) - at org.ops4j.pax.exam.junit.impl.ProbeRunner.(ProbeRunner.java:73) - at org.ops4j.pax.exam.junit.PaxExam.createDelegate(PaxExam.java:82) - at org.ops4j.pax.exam.junit.PaxExam.(PaxExam.java:73) - at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) - at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) - at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) - at java.lang.reflect.Constructor.newInstance(Constructor.java:423) - at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:31) - at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) - at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) - at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) - at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) - at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:98) - at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:84) - at org.junit.runners.Suite.(Suite.java:101) - at org.junit.runners.Suite.(Suite.java:67) - at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) - at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) - at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) - at java.lang.reflect.Constructor.newInstance(Constructor.java:423) - at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:35) - at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) - at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) - at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) - at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) - at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24) - at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:262) - at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153) - at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124) - at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200) - at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153) - at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103) - -initializationError(org.motechproject.openmrs.it.version1_12.MRSProgramEnrollmentIT) Time elapsed: 0.001 sec <<< ERROR! -java.lang.Exception: No runnable methods - at org.junit.runners.BlockJUnit4ClassRunner.validateInstanceMethods(BlockJUnit4ClassRunner.java:157) - at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:102) - at org.junit.runners.ParentRunner.validate(ParentRunner.java:336) - at org.junit.runners.ParentRunner.(ParentRunner.java:74) - at org.junit.runners.BlockJUnit4ClassRunner.(BlockJUnit4ClassRunner.java:56) - at org.ops4j.pax.exam.junit.impl.ProbeRunner.(ProbeRunner.java:73) - at org.ops4j.pax.exam.junit.PaxExam.createDelegate(PaxExam.java:82) - at org.ops4j.pax.exam.junit.PaxExam.(PaxExam.java:73) - at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) - at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) - at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) - at java.lang.reflect.Constructor.newInstance(Constructor.java:423) - at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:31) - at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) - at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) - at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) - at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) - at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:98) - at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:84) - at org.junit.runners.Suite.(Suite.java:101) - at org.junit.runners.Suite.(Suite.java:67) - at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) - at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) - at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) - at java.lang.reflect.Constructor.newInstance(Constructor.java:423) - at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:35) - at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) - at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) - at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) - at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) - at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24) - at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:262) - at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153) - at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124) - at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200) - at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153) - at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103) - - -Results : - -Tests in error: - MRSTaskIntegrationBundle1_12IT.initializationError » No runnable methods - MRSConceptServiceIT.initializationError » No runnable methods - MRSEncounterServiceIT.initializationError » No runnable methods - MRSLocationServiceIT.initializationError » No runnable methods - MRSObservationServiceIT.initializationError » No runnable methods - MRSPatientServiceIT.initializationError » No runnable methods - MRSPersonServiceIT.initializationError » No runnable methods - MRSProviderServiceIT.initializationError » No runnable methods - MRSUserServiceIT.initializationError » No runnable methods - MRSProgramEnrollmentIT.initializationError » No runnable methods - -Tests run: 11, Failures: 0, Errors: 10, Skipped: 0 - -[INFO] -[INFO] --- maven-clean-plugin:2.5:clean (clean-test-config-files) @ openmrs --- -[INFO] Deleting /home/nextuser/.motech/config (includes = [org.motechproject.openmrs/raw/openmrs-configs.json, bootstrap.properties, motech-settings.properties, datanucleus.properties], excludes = []) -[INFO] -[INFO] --- maven-enforcer-plugin:1.4.1:enforce (enforce-no-package-cycles) @ openmrs --- -[INFO] Adding directory /home/nextuser/workspace/modules/openmrs/target/classes for package cycles search. -[INFO] Adding directory /home/nextuser/workspace/modules/openmrs/target/test-classes for package cycles search. -[INFO] -[INFO] --- maven-failsafe-plugin:2.17:verify (verify) @ openmrs --- -[INFO] Failsafe report directory: /home/nextuser/workspace/modules/openmrs/target/failsafe-reports -[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent! -[INFO] ------------------------------------------------------------------------ -[INFO] BUILD FAILURE -[INFO] ------------------------------------------------------------------------ -[INFO] Total time: 4:39.198s -[INFO] Finished at: Wed Sep 21 13:44:27 CEST 2016 -[INFO] Final Memory: 50M/268M -[INFO] ------------------------------------------------------------------------ -[ERROR] Failed to execute goal org.apache.maven.plugins:maven-failsafe-plugin:2.17:verify (verify) on project openmrs: There are test failures. -[ERROR] -[ERROR] Please refer to /home/nextuser/workspace/modules/openmrs/target/failsafe-reports for the individual test results. -[ERROR] -> [Help 1] -[ERROR] -[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. -[ERROR] Re-run Maven using the -X switch to enable full debug logging. -[ERROR] -[ERROR] For more information about the errors and possible solutions, please read the following articles: -[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException From 420d79dd25b8872aa7cd8f595faf06242dfe2845 Mon Sep 17 00:00:00 2001 From: Michal Date: Wed, 21 Sep 2016 14:40:27 +0200 Subject: [PATCH 018/202] MOTECH-2920: Used Concept UUID for Submitting Observations Now to add new Observation it is required to set Concept Uuid as a key. --- .../impl/OpenMRSEncounterServiceImpl.java | 39 +------------------ .../tasks/OpenMRSActionProxyService.java | 2 +- .../impl/OpenMRSActionProxyServiceImpl.java | 13 +++---- .../impl/OpenMRSActionProxyServiceTest.java | 8 ++-- 4 files changed, 12 insertions(+), 50 deletions(-) diff --git a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSEncounterServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSEncounterServiceImpl.java index 8e59ed3ed..c499e9f0d 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSEncounterServiceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSEncounterServiceImpl.java @@ -1,6 +1,5 @@ package org.motechproject.openmrs.service.impl; -import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; import org.motechproject.event.MotechEvent; @@ -8,12 +7,10 @@ import org.motechproject.openmrs.config.Config; import org.motechproject.openmrs.domain.Encounter; import org.motechproject.openmrs.domain.EncounterType; -import org.motechproject.openmrs.domain.Observation; import org.motechproject.openmrs.domain.Patient; import org.motechproject.openmrs.helper.EventHelper; import org.motechproject.openmrs.resource.EncounterResource; import org.motechproject.openmrs.service.EventKeys; -import org.motechproject.openmrs.service.OpenMRSConceptService; import org.motechproject.openmrs.service.OpenMRSConfigService; import org.motechproject.openmrs.service.OpenMRSEncounterService; import org.motechproject.openmrs.service.OpenMRSPatientService; @@ -32,7 +29,6 @@ public class OpenMRSEncounterServiceImpl implements OpenMRSEncounterService { private static final Logger LOGGER = LoggerFactory.getLogger(OpenMRSEncounterServiceImpl.class); - private final OpenMRSConceptService conceptService; private final OpenMRSPatientService patientService; private final OpenMRSConfigService configService; @@ -43,11 +39,9 @@ public class OpenMRSEncounterServiceImpl implements OpenMRSEncounterService { @Autowired public OpenMRSEncounterServiceImpl(EncounterResource encounterResource, OpenMRSPatientService patientAdapter, - OpenMRSConceptService conceptAdapter, EventRelay eventRelay, - OpenMRSConfigService configService) { + EventRelay eventRelay, OpenMRSConfigService configService) { this.encounterResource = encounterResource; this.patientService = patientAdapter; - this.conceptService = conceptAdapter; this.configService = configService; this.eventRelay = eventRelay; } @@ -59,13 +53,7 @@ public Encounter createEncounter(String configName, Encounter encounter) { Encounter createdEncounter; Config config = configService.getConfigByName(configName); - // OpenMRS expects the observations to reference a concept uuid rather - // than just a concept name. Attempt to map all concept names to concept - // uuid's for each of the observations - List updatedObs = resolveConceptUuidForConceptNames(config, encounter.getObs()); - try { - encounter.setObs(updatedObs); createdEncounter = encounterResource.createEncounter(config, encounter); eventRelay.sendEventMessage(new MotechEvent(EventKeys.CREATED_NEW_ENCOUNTER_SUBJECT, EventHelper.encounterParameters(createdEncounter))); @@ -176,31 +164,6 @@ private void validateEncounter(Encounter encounter) { Validate.notNull(encounter.getEncounterType(), "Encounter type cannot be null"); } - private List resolveConceptUuidForConceptNames(Config config, List originalObservations) { - List updatedObs = new ArrayList<>(); - if (originalObservations != null) { - for (Observation observation : originalObservations) { - if (observationValueIsNotEmpty(observation)) { - String conceptUuid = conceptService.resolveConceptUuidFromConceptName(config.getName(), observation.getConcept().getName().getName()); - if (CollectionUtils.isNotEmpty(observation.getGroupsMembers())) { - resolveConceptUuidForConceptNames(config, observation.getGroupsMembers()); - } - observation.getConcept().setUuid(conceptUuid); - updatedObs.add(observation); - } else { - LOGGER.warn("Observation value is null or empty for concept: " + observation.getConcept().getName() - + " and will not be created"); - } - } - } - - return updatedObs; - } - - private boolean observationValueIsNotEmpty(Observation observation) { - return observation.getValue() != null && StringUtils.isNotEmpty(observation.getValue().getDisplay()); - } - private List getAllEncountersByPatientMotechId(Config config, String motechId) { Validate.notEmpty(motechId, "MOTECH Id cannot be empty"); diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSActionProxyService.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSActionProxyService.java index 1f604f155..e531c93f5 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSActionProxyService.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSActionProxyService.java @@ -29,7 +29,7 @@ public interface OpenMRSActionProxyService { * @param patientUuid the patient uuid * @param providerUuid the provider uuid * @param visitUuid the visit uuid - * @param observations the map of observations where concept name is a key and value from the observation is a value + * @param observations the map of observations where concept Uuid is a key and value from the observation is a value */ Encounter createEncounter(String configName, DateTime encounterDatetime, String encounterType, String locationName, String patientUuid, String providerUuid, String visitUuid, diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java index 8b12b4ad2..d2298d125 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java @@ -8,7 +8,6 @@ import org.motechproject.openmrs.domain.Attribute; import org.motechproject.openmrs.domain.CohortQueryReport; import org.motechproject.openmrs.domain.Concept; -import org.motechproject.openmrs.domain.ConceptName; import org.motechproject.openmrs.domain.Encounter; import org.motechproject.openmrs.domain.EncounterType; import org.motechproject.openmrs.domain.Identifier; @@ -281,15 +280,15 @@ private List convertIdentifierMapToList(Map identifi private List convertObservationMapToList(Map observations, DateTime obsDatetime) { List observationList = new ArrayList<>(); - for (String observationConceptName : observations.keySet()) { - if (valueIsNotEmpty(observations, observationConceptName)) { + for (String observationConceptUuid : observations.keySet()) { + if (valueIsNotEmpty(observations, observationConceptUuid)) { Observation observation = new Observation(); - ConceptName conceptName = new ConceptName(observationConceptName); - Concept concept = new Concept(conceptName); + Concept concept = new Concept(); + concept.setUuid(observationConceptUuid); observation.setConcept(concept); - String observationMapValue = observations.get(observationConceptName); + String observationMapValue = observations.get(observationConceptUuid); Observation.ObservationValue observationValue = new Observation.ObservationValue(observationMapValue); observation.setValue(observationValue); @@ -297,7 +296,7 @@ private List convertObservationMapToList(Map observ observationList.add(observation); } else { - LOGGER.warn("Observation value is null or empty for concept: " + observationConceptName + LOGGER.warn("Observation value is null or empty for concept with Uuid: " + observationConceptUuid + " and will not be created"); } } diff --git a/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java b/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java index ba560b98b..c10df95e4 100644 --- a/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java +++ b/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java @@ -125,7 +125,7 @@ public void shouldCreateEncounterWithGivenParameters() { DateTime encounterDatetime = new DateTime("2000-08-16T07:22:05Z"); Map observations = new HashMap<>(); - observations.put("testConceptName", "testObservationValueName"); + observations.put("18ff53df-744a-4a3f-8f25-dac6de5b7131", "testObservationValueName"); List obsList = createObservationList(); @@ -166,7 +166,7 @@ public void shouldCreateEncounterWithGivenParametersWithoutObsWithEmptyValue() { DateTime encounterDatetime = new DateTime("2000-08-16T07:22:05Z"); Map observations = new HashMap<>(); - observations.put("testConceptName",""); + observations.put("18ff53df-744a-4a3f-8f25-dac6de5b7131",""); List obsList = new ArrayList<>(); @@ -602,8 +602,8 @@ private Concept createTestConcept(String testConceptName) { private List createObservationList() { Observation observation = new Observation(); - ConceptName conceptName = new ConceptName("testConceptName"); - Concept concept = new Concept(conceptName); + Concept concept = new Concept(); + concept.setUuid("18ff53df-744a-4a3f-8f25-dac6de5b7131"); observation.setConcept(concept); observation.setValue(new Observation.ObservationValue("testObservationValueName")); From ddec523006132bf56656b20ebd74227105961859 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Artur=20Fija=C5=82?= Date: Wed, 21 Sep 2016 14:53:44 +0200 Subject: [PATCH 019/202] MOTECH-2940: Added Form ID field to Create Encounter Action. --- .../openmrs/domain/Encounter.java | 21 ++++++++++++++++--- .../openmrs/helper/EventHelper.java | 1 + .../openmrs/service/EventKeys.java | 1 + .../tasks/OpenMRSActionProxyService.java | 7 ++++--- .../openmrs/tasks/builder/ActionBuilder.java | 3 ++- .../openmrs/tasks/constants/DisplayNames.java | 1 + .../openmrs/tasks/constants/Keys.java | 1 + .../impl/OpenMRSActionProxyServiceImpl.java | 4 ++-- .../webapp/messages/messages.properties | 1 + .../impl/OpenMRSActionProxyServiceTest.java | 4 ++-- 10 files changed, 33 insertions(+), 11 deletions(-) diff --git a/openmrs/src/main/java/org/motechproject/openmrs/domain/Encounter.java b/openmrs/src/main/java/org/motechproject/openmrs/domain/Encounter.java index 8b16782ee..7c25d37fb 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/domain/Encounter.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/domain/Encounter.java @@ -31,6 +31,7 @@ public class Encounter { private Visit visit; private List obs; private List encounterProviders; + private String formId; /** * Default constructor. @@ -50,6 +51,11 @@ public Encounter(Location location, EncounterType encounterType, Date encounterD public Encounter(Location location, EncounterType encounterType, Date encounterDatetime, Patient patient, Visit visit, List encounterProviders, List obs) { + this(location, encounterType, encounterDatetime, patient, visit, encounterProviders, obs, null); + } + + public Encounter(Location location, EncounterType encounterType, Date encounterDatetime, Patient patient, + Visit visit, List encounterProviders, List obs, String formId) { this.location = location; this.encounterType = encounterType; this.encounterDatetime = encounterDatetime; @@ -57,6 +63,7 @@ public Encounter(Location location, EncounterType encounterType, Date encounterD this.visit = visit; this.encounterProviders = encounterProviders; this.obs = obs; + this.formId = formId; } public String getUuid() { @@ -127,13 +134,17 @@ public List getObs() { return obs; } + public String getFormId() { return formId; } + + public void setFormId(String formId) { this.formId = formId; } + public void setObs(List obs) { this.obs = obs; } @Override public int hashCode() { - return Objects.hash(uuid, display, location, encounterType, encounterDatetime, patient, visit, obs, encounterProviders); + return Objects.hash(uuid, display, location, encounterType, encounterDatetime, patient, visit, obs, encounterProviders, formId); } @Override //NO CHECKSTYLE Cyclomatic Complexity @@ -153,7 +164,8 @@ public boolean equals(Object o) { Objects.equals(patient, encounter.patient) && Objects.equals(visit, encounter.visit) && Objects.equals(obs, encounter.obs) && - Objects.equals(encounterProviders, encounter.encounterProviders); + Objects.equals(encounterProviders, encounter.encounterProviders) && + Objects.equals(formId, encounter.formId); } /** @@ -161,7 +173,7 @@ public boolean equals(Object o) { */ public static class EncounterSerializer implements JsonSerializer { - @Override + @Override //NO CHECKSTYLE Cyclomatic Complexity public JsonElement serialize(Encounter src, Type typeOfSrc, JsonSerializationContext context) { JsonObject encounter = new JsonObject(); @@ -190,6 +202,9 @@ public JsonElement serialize(Encounter src, Type typeOfSrc, JsonSerializationCon if (src.visit != null) { encounter.addProperty("visit", src.getVisit().getUuid()); } + if (src.formId != null) { + encounter.addProperty("form", src.getFormId()); + } if (src.obs != null) { final JsonElement jsonObs = context.serialize(src.getObs()); encounter.add("obs", jsonObs); diff --git a/openmrs/src/main/java/org/motechproject/openmrs/helper/EventHelper.java b/openmrs/src/main/java/org/motechproject/openmrs/helper/EventHelper.java index bebb5719c..b1cfcf684 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/helper/EventHelper.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/helper/EventHelper.java @@ -104,6 +104,7 @@ public static Map encounterParameters(Encounter encounter) { encounterParameters.put(EventKeys.ENCOUNTER_DATE, encounter.getEncounterDatetime()); encounterParameters.put(EventKeys.ENCOUNTER_TYPE, encounter.getEncounterType().getUuid()); encounterParameters.put(EventKeys.VISIT_ID, encounter.getVisit().getUuid()); + encounterParameters.put(EventKeys.FORM_ID, encounter.getFormId()); return encounterParameters; } diff --git a/openmrs/src/main/java/org/motechproject/openmrs/service/EventKeys.java b/openmrs/src/main/java/org/motechproject/openmrs/service/EventKeys.java index ee75b7f9f..f04e9d30f 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/service/EventKeys.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/service/EventKeys.java @@ -45,6 +45,7 @@ public final class EventKeys { public static final String USER_ID = "UserId"; public static final String PROGRAM_ID = "ProgramId"; public static final String PROGRAM_ENROLLMENT_ID = "ProgramEnrollmentId"; + public static final String FORM_ID = "FormId"; public static final String BASE_SUBJECT = "org.motechproject.mrs.api."; diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSActionProxyService.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSActionProxyService.java index 1f604f155..92c41f69c 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSActionProxyService.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSActionProxyService.java @@ -19,8 +19,8 @@ public interface OpenMRSActionProxyService { /** * Creates an encounter with the given {@code encounterDate}, {@code encounterType}, {@code locationName}, - * {@code patientUuid} and {@code providerUuid}. The locationName is the only not required field. Configuration with - * the given {@code configName} will be used while performing this action. + * {@code patientUuid},{@code providerUuid} and {@code formId}. The locationName and formId are the only not required fields. + * Configuration with the given {@code configName} will be used while performing this action. * * @param configName the name of the configuration * @param encounterDatetime the date of encounter @@ -30,10 +30,11 @@ public interface OpenMRSActionProxyService { * @param providerUuid the provider uuid * @param visitUuid the visit uuid * @param observations the map of observations where concept name is a key and value from the observation is a value + * @param observations the form uuid */ Encounter createEncounter(String configName, DateTime encounterDatetime, String encounterType, String locationName, String patientUuid, String providerUuid, String visitUuid, - Map observations); + Map observations, String formId); /** * Creates a patient with the given params. The required fields are : {@code givenName}, {@code familyName}, diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/builder/ActionBuilder.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/builder/ActionBuilder.java index 58135c5c5..65b28a9e4 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/builder/ActionBuilder.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/builder/ActionBuilder.java @@ -86,7 +86,8 @@ private ActionEventRequest buildCreateEncounterAction(String configName) { actionParameters.add(prepareParameter(Keys.PATIENT_UUID, DisplayNames.PATIENT_UUID, true, order++)); actionParameters.add(prepareParameter(Keys.PROVIDER_UUID, DisplayNames.PROVIDER_UUID, true, order++)); actionParameters.add(prepareParameter(Keys.VISIT_UUID, DisplayNames.VISIT_UUID, false, order++)); - actionParameters.add(prepareParameter(Keys.OBSERVATION, DisplayNames.OBSERVATION, MAP, false, order)); + actionParameters.add(prepareParameter(Keys.OBSERVATION, DisplayNames.OBSERVATION, MAP, false, order++)); + actionParameters.add(prepareParameter(Keys.FORM, DisplayNames.FORM, false, order)); postActionParameters.add(prepareParameter(Keys.UUID, DisplayNames.ENCOUNTER_UUID, false, 0)); diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/constants/DisplayNames.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/constants/DisplayNames.java index 7273582a3..b9fadf261 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/constants/DisplayNames.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/constants/DisplayNames.java @@ -15,6 +15,7 @@ public final class DisplayNames { public static final String PROVIDER_UUID = "openMRS.provider.uuid"; public static final String OBSERVATION = "openMRS.encounter.observation"; public static final String ENCOUNTER_UUID = "openMRS.encounter.uuid"; + public static final String FORM = "openMRS.encounter.form"; //Patient action public static final String PERSON_UUID = "openMRS.person.uuid"; diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/constants/Keys.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/constants/Keys.java index 1ad42ff69..9f85d5965 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/constants/Keys.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/constants/Keys.java @@ -14,6 +14,7 @@ public final class Keys { public static final String PATIENT_UUID = "patientUuid"; public static final String PROVIDER_UUID = "providerUuid"; public static final String OBSERVATION = "observation"; + public static final String FORM = "form"; //Patient action public static final String PERSON_UUID = "person.uuid"; diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java index 8b12b4ad2..38b132a49 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java @@ -68,7 +68,7 @@ public class OpenMRSActionProxyServiceImpl implements OpenMRSActionProxyService @Override public Encounter createEncounter(String configName, DateTime encounterDatetime, String encounterType, String locationName, String patientUuid, String providerUuid, String visitUuid, - Map observations) { + Map observations, String formId) { Location location = getLocationByName(configName, locationName); Patient patient = patientService.getPatientByUuid(configName, patientUuid); Provider provider = providerService.getProviderByUuid(configName, providerUuid); @@ -82,7 +82,7 @@ public Encounter createEncounter(String configName, DateTime encounterDatetime, EncounterType type = new EncounterType(encounterType); - Encounter encounter = new Encounter(location, type, encounterDatetime.toDate(), patient, visit, Collections.singletonList(provider.getPerson()), observationList); + Encounter encounter = new Encounter(location, type, encounterDatetime.toDate(), patient, visit, Collections.singletonList(provider.getPerson()), observationList, formId); return encounterService.createEncounter(configName, encounter); } diff --git a/openmrs/src/main/resources/webapp/messages/messages.properties b/openmrs/src/main/resources/webapp/messages/messages.properties index 52dfb5992..ba6691dc0 100644 --- a/openmrs/src/main/resources/webapp/messages/messages.properties +++ b/openmrs/src/main/resources/webapp/messages/messages.properties @@ -44,6 +44,7 @@ openMRS.encounter.display=Encounter display openMRS.encounter.uuid=Encounter UUID openMRS.encounter.type=Encounter type openMRS.encounter.observation=Observation +openMRS.encounter.form=Form UUID #Location openMRS.location.display=Location display diff --git a/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java b/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java index ba560b98b..33da5fa3d 100644 --- a/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java +++ b/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java @@ -141,7 +141,7 @@ public void shouldCreateEncounterWithGivenParameters() { Encounter encounterCreated = openMRSActionProxyService.createEncounter(CONFIG_NAME, new DateTime(encounter.getEncounterDatetime()), encounter.getEncounterType().getName(), location.getName(), patient.getUuid(), provider.getUuid(), - visit.getUuid(), observations); + visit.getUuid(), observations, null); assertEquals(encounter, encounterCreated); } @@ -182,7 +182,7 @@ public void shouldCreateEncounterWithGivenParametersWithoutObsWithEmptyValue() { Encounter encounterCreated = openMRSActionProxyService.createEncounter(CONFIG_NAME, new DateTime(encounter.getEncounterDatetime()), encounter.getEncounterType().getName(), location.getName(), patient.getUuid(), provider.getUuid(), - visit.getUuid(), observations); + visit.getUuid(), observations, null); assertEquals(encounter, encounterCreated); } From 299835b2b5b81e3cf8cb204f540ee777703b3ee7 Mon Sep 17 00:00:00 2001 From: mkruszynski Date: Wed, 21 Sep 2016 15:22:09 +0200 Subject: [PATCH 020/202] MOTECH-2885: Added support for order --- .../openmrs/domain/Observation.java | 29 +++++++++----- .../motechproject/openmrs/domain/Order.java | 40 +++++++++++++++++++ .../tasks/OpenMRSTaskDataProvider.java | 9 ++++- .../velocity.templates/task-data-provider.vm | 2 +- 4 files changed, 69 insertions(+), 11 deletions(-) create mode 100644 openmrs/src/main/java/org/motechproject/openmrs/domain/Order.java diff --git a/openmrs/src/main/java/org/motechproject/openmrs/domain/Observation.java b/openmrs/src/main/java/org/motechproject/openmrs/domain/Observation.java index c3bf75729..d3ebffd38 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/domain/Observation.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/domain/Observation.java @@ -1,6 +1,13 @@ package org.motechproject.openmrs.domain; -import com.google.gson.*; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import com.google.gson.JsonPrimitive; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; import java.lang.reflect.Type; import java.text.SimpleDateFormat; @@ -27,7 +34,7 @@ public class Observation { private String valueCodedName; private String obsGroup; private Location location; - private String orderUuid; + private Order order; public String getUuid() { return uuid; @@ -137,20 +144,21 @@ public void setLocation (Location location) { this.location = location; } - public String getOrderUuid () { - return orderUuid; + public Order getOrder () { + return order; } - public void setOrderUuid (String orderUuid) { - this.orderUuid = orderUuid; + public void setOrder (Order order) { + this.order = order; } @Override public int hashCode() { - return Objects.hash(uuid, display, concept, encounter, value, obsDatetime, person, groupsMembers); + return Objects.hash(uuid, display, concept, encounter, value, obsDatetime, person, groupsMembers, voided, + valueModifier, valueCodedName, obsGroup, location, order); } - @Override + @Override //NO CHECKSTYLE CyclomaticComplexity public boolean equals(Object o) { if (this == o) { return true; @@ -165,7 +173,10 @@ public boolean equals(Object o) { return Objects.equals(uuid, other.uuid) && Objects.equals(display, other.display) && Objects.equals(concept, other.concept) && Objects.equals(encounter, other.encounter) && Objects.equals(value, other.value) && Objects.equals(obsDatetime, other.obsDatetime) - && Objects.equals(person, other.person) && Objects.equals(groupsMembers, other.groupsMembers); + && Objects.equals(person, other.person) && Objects.equals(groupsMembers, other.groupsMembers) + && Objects.equals(voided, other.voided) && Objects.equals(valueModifier, other.valueModifier) + && Objects.equals(valueCodedName, other.valueCodedName) && Objects.equals(obsGroup, other.obsGroup) + && Objects.equals(location, other.location) && Objects.equals(order, other.order); } /** diff --git a/openmrs/src/main/java/org/motechproject/openmrs/domain/Order.java b/openmrs/src/main/java/org/motechproject/openmrs/domain/Order.java new file mode 100644 index 000000000..7b1b4b307 --- /dev/null +++ b/openmrs/src/main/java/org/motechproject/openmrs/domain/Order.java @@ -0,0 +1,40 @@ +package org.motechproject.openmrs.domain; + +import java.util.Objects; + +/** + * Represents a single order. An order represents the instructions for patient in which order and how long + * should one take a medications. + */ +public class Order { + + private String uuid; + + public String getUuid () { + return uuid; + } + + public void setUuid (String uuid) { + this.uuid = uuid; + } + + @Override + public int hashCode() { + return Objects.hash(uuid); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (!(o instanceof Order)) { + return false; + } + + Order other = (Order) o; + + return Objects.equals(uuid, other.uuid); + } +} diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java index 6af97f827..a17d19137 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java @@ -6,7 +6,14 @@ import org.motechproject.commons.api.DataProvider; import org.motechproject.event.MotechEvent; import org.motechproject.event.listener.annotations.MotechListener; -import org.motechproject.openmrs.domain.*; +import org.motechproject.openmrs.domain.Encounter; +import org.motechproject.openmrs.domain.GeneratedIdentifier; +import org.motechproject.openmrs.domain.Observation; +import org.motechproject.openmrs.domain.Patient; +import org.motechproject.openmrs.domain.ProgramEnrollment; +import org.motechproject.openmrs.domain.ProgramEnrollmentListResult; +import org.motechproject.openmrs.domain.Provider; +import org.motechproject.openmrs.domain.Relationship; import org.motechproject.openmrs.service.OpenMRSEncounterService; import org.motechproject.openmrs.service.OpenMRSGeneratedIdentifierService; import org.motechproject.openmrs.service.OpenMRSObservationService; diff --git a/openmrs/src/main/resources/velocity.templates/task-data-provider.vm b/openmrs/src/main/resources/velocity.templates/task-data-provider.vm index b11de8610..5bd26dd38 100644 --- a/openmrs/src/main/resources/velocity.templates/task-data-provider.vm +++ b/openmrs/src/main/resources/velocity.templates/task-data-provider.vm @@ -307,7 +307,7 @@ }, { "displayName": "openMRS.observation.orderUuid", - "fieldKey": "orderUuid" + "fieldKey": "order.uuid" }, { "displayName": "openMRS.encounter.uuid", From 0232e815d02d7e2e56b23c0175e1221e5ec37e1f Mon Sep 17 00:00:00 2001 From: Jakub Banasiewicz Date: Wed, 21 Sep 2016 16:16:00 +0200 Subject: [PATCH 021/202] Encounter UUID as post-action field - Integration Tests --- .../it/MRSTasksIntegrationBundleIT.java | 52 ++++++++----------- 1 file changed, 22 insertions(+), 30 deletions(-) diff --git a/openmrs/src/test/java/org/motechproject/openmrs/it/MRSTasksIntegrationBundleIT.java b/openmrs/src/test/java/org/motechproject/openmrs/it/MRSTasksIntegrationBundleIT.java index ea3f3009d..c99ac332a 100644 --- a/openmrs/src/test/java/org/motechproject/openmrs/it/MRSTasksIntegrationBundleIT.java +++ b/openmrs/src/test/java/org/motechproject/openmrs/it/MRSTasksIntegrationBundleIT.java @@ -245,7 +245,7 @@ public void testCreateEncounterPostActionParameter() throws InterruptedException // Give Tasks some time to process assertTrue(waitForTaskExecution(task.getId())); - Encounter encounter = encounterService.getLatestEncounterByPatientMotechId(DEFAULT_CONFIG_NAME, "654", createdEncounterType.getName()); + Encounter encounter = encounterService.getLatestEncounterByPatientMotechId(DEFAULT_CONFIG_NAME, createdPatient.getMotechId(), createdEncounterType.getName()); String firstEncounterUuid = encounter.getUuid(); Patient patient = patientService.getPatientByMotechId(DEFAULT_CONFIG_NAME, "Jacob Lee"); @@ -392,15 +392,11 @@ private Task prepareCreateEncounterPostActionParameterTask() { TaskTriggerInformation triggerInformation = new TaskTriggerInformation("CREATE SettingsRecord", "data-services", MDS_CHANNEL_NAME, VERSION, TRIGGER_SUBJECT, TRIGGER_SUBJECT); - SortedSet taskConfigStepSortedSet = new TreeSet<>(); - TaskConfig taskConfig = new TaskConfig(); - taskConfig.addAll(taskConfigStepSortedSet); - ArrayList taskActions = new ArrayList(); taskActions.add(prepareCreateEncounterActionInformation()); - taskActions.add(prepareCreatePatientForEncounterActionInformation("{{pa.0.uuid}}", "Jacob Lee")); + taskActions.add(prepareCreatePatientActionInformation("{{pa.0.uuid}}", "Jacob Lee", true)); - Task task = new Task("OpenMRSEncounterPostActionParameterTestTask", triggerInformation, taskActions, taskConfig, true, true); + Task task = new Task("OpenMRSEncounterPostActionParameterTestTask", triggerInformation, taskActions, new TaskConfig(), true, true); getTaskService().save(task); return task; @@ -416,8 +412,8 @@ private Task prepareCreatePatientPostActionParameterTask(){ taskConfig.addAll(taskConfigStepSortedSet); ArrayList taskActions = new ArrayList(); - taskActions.add(prepareCreatePatientActionInformation("Wallstreet 15/2", "John Smith")); - taskActions.add(prepareCreatePatientActionInformation("{{pa.0.uuid}}", "Jacob Lee")); + taskActions.add(prepareCreatePatientActionInformation("Wallstreet 15/2", "John Smith", false)); + taskActions.add(prepareCreatePatientActionInformation("{{pa.0.uuid}}", "Jacob Lee", false)); Task task = new Task("OpenMRSPatientPostActionParameterTestTask", triggerInformation, taskActions, taskConfig, true, true); getTaskService().save(task); @@ -425,33 +421,28 @@ private Task prepareCreatePatientPostActionParameterTask(){ return task; } - private TaskActionInformation prepareCreatePatientActionInformation(String adress1, String motechId) { + private TaskActionInformation prepareCreatePatientActionInformation(String address1, String motechId, Boolean forEncounter) { TaskActionInformation actionInformation = new TaskActionInformation("Create Patient [" + DEFAULT_CONFIG_NAME + "]", OPENMRS_CHANNEL_NAME, OPENMRS_CHANNEL_NAME, VERSION, TEST_INTERFACE, "createPatient"); actionInformation.setSubject(String.format("createPatient.%s", DEFAULT_CONFIG_NAME)); Map values = new HashMap<>(); - values.put(Keys.ADDRESS_1, adress1); - values.put(Keys.FAMILY_NAME, "{{ad.openMRS.Patient-" + DEFAULT_CONFIG_NAME + "#0.person.display}}"); - values.put(Keys.GENDER, "{{ad.openMRS.Patient-" + DEFAULT_CONFIG_NAME + "#0.person.gender}}"); - values.put(Keys.GIVEN_NAME, "{{ad.openMRS.Patient-" + DEFAULT_CONFIG_NAME + "#0.person.display}}"); - values.put(Keys.MOTECH_ID, motechId); - values.put(Keys.CONFIG_NAME, DEFAULT_CONFIG_NAME); - actionInformation.setValues(values); - return actionInformation; - } - - private TaskActionInformation prepareCreatePatientForEncounterActionInformation(String adress1, String motechId){ - TaskActionInformation actionInformation = new TaskActionInformation("Create Patient [" + DEFAULT_CONFIG_NAME + "]", OPENMRS_CHANNEL_NAME, - OPENMRS_CHANNEL_NAME, VERSION, TEST_INTERFACE, "createPatient"); - actionInformation.setSubject(String.format("createPatient.%s", DEFAULT_CONFIG_NAME)); - - Map values = new HashMap<>(); - values.put(Keys.ADDRESS_1, adress1); - values.put(Keys.FAMILY_NAME, "Bond"); - values.put(Keys.GENDER, "M"); - values.put(Keys.GIVEN_NAME, "James"); + String familyName, gender, givenName; + if (forEncounter == false) { + familyName = "{{ad.openMRS.Patient-" + DEFAULT_CONFIG_NAME + "#0.person.display}}"; + gender = "{{ad.openMRS.Patient-" + DEFAULT_CONFIG_NAME + "#0.person.gender}}"; + givenName = "{{ad.openMRS.Patient-" + DEFAULT_CONFIG_NAME + "#0.person.display}}"; + } + else { + familyName = "Bond"; + gender = "M"; + givenName = "James"; + } + values.put(Keys.ADDRESS_1, address1); + values.put(Keys.FAMILY_NAME, familyName); + values.put(Keys.GENDER, gender); + values.put(Keys.GIVEN_NAME, givenName); values.put(Keys.MOTECH_ID, motechId); values.put(Keys.CONFIG_NAME, DEFAULT_CONFIG_NAME); actionInformation.setValues(values); @@ -470,6 +461,7 @@ private TaskActionInformation prepareCreateEncounterActionInformation(){ values.put(Keys.ENCOUNTER_TYPE, createdEncounterType.getName()); values.put(Keys.ENCOUNTER_DATE, new DateTime("2015-01-16T00:00:00Z").toString()); values.put(Keys.LOCATION_NAME, DEFAULT_LOCATION_NAME); + values.put(Keys.VISIT_UUID, prepareVisit().getUuid()); values.put(Keys.CONFIG_NAME, DEFAULT_CONFIG_NAME); actionInformation.setValues(values); From 4e44153f35f25e223cab55a7c1fd213ee98eacb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Ja=C5=BCd=C5=BCewski?= Date: Wed, 21 Sep 2016 16:39:26 +0200 Subject: [PATCH 022/202] Added a test verifying removal of the trailing slash --- .../service/impl/SettingsServiceImpl.java | 6 +- .../service/impl/SettingsServiceImplTest.java | 59 +++++++++++++++++++ .../resources/json/settings/settings.json | 5 ++ 3 files changed, 67 insertions(+), 3 deletions(-) create mode 100644 dhis2/src/test/java/org/motechproject/dhis2/service/impl/SettingsServiceImplTest.java create mode 100644 dhis2/src/test/resources/json/settings/settings.json diff --git a/dhis2/src/main/java/org/motechproject/dhis2/service/impl/SettingsServiceImpl.java b/dhis2/src/main/java/org/motechproject/dhis2/service/impl/SettingsServiceImpl.java index 519607557..c80e5e1fb 100644 --- a/dhis2/src/main/java/org/motechproject/dhis2/service/impl/SettingsServiceImpl.java +++ b/dhis2/src/main/java/org/motechproject/dhis2/service/impl/SettingsServiceImpl.java @@ -60,9 +60,9 @@ private synchronized void loadSettings() { LOGGER.debug("Loading DHIS2 settings..."); Gson gson = new Gson(); settings = gson.fromJson(jsonText, Settings.class); - String URI = settings.getServerURI(); - if(settings.getServerURI().endsWith("/")) { - settings.setServerURI(URI.substring(0,URI.length()-1)); + String uri = settings.getServerURI(); + if (uri.endsWith("/")) { + settings.setServerURI(uri.substring(0, uri.length() - 1)); } } catch (Exception e) { String message = "There was an error loading json from the DHIS2 settings."; diff --git a/dhis2/src/test/java/org/motechproject/dhis2/service/impl/SettingsServiceImplTest.java b/dhis2/src/test/java/org/motechproject/dhis2/service/impl/SettingsServiceImplTest.java new file mode 100644 index 000000000..f5ed8564f --- /dev/null +++ b/dhis2/src/test/java/org/motechproject/dhis2/service/impl/SettingsServiceImplTest.java @@ -0,0 +1,59 @@ +package org.motechproject.dhis2.service.impl; + +import com.google.gson.JsonIOException; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; +import org.motechproject.config.SettingsFacade; +import org.motechproject.dhis2.service.Settings; +import org.motechproject.event.listener.EventRelay; + +import java.io.IOException; +import java.io.InputStream; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.assertThat; +import static org.mockito.Mockito.when; +import static org.mockito.MockitoAnnotations.initMocks; + +public class SettingsServiceImplTest { + + private static final String SETTINGS_FILE_NAME = "dhis2-settings.json"; + private static final String SETTINGS_JSON = "json/settings/settings.json"; + + private Settings settings; + + @Mock + private EventRelay eventRelay; + + @Mock + private SettingsFacade settingsFacade; + + private SettingsServiceImpl settingsService; + + @Before + public void setUp() { + initMocks(this); + settings = new Settings("localhost:8080/dhis/", "admin", "district"); + try (InputStream is = getClass().getClassLoader().getResourceAsStream(SETTINGS_JSON)) { + when(settingsFacade.getRawConfig(SETTINGS_FILE_NAME)).thenReturn(is); + settingsService = new SettingsServiceImpl(settingsFacade, eventRelay); + } catch (IOException e) { + String message = "There was an error loading json from the DHIS2 settings."; + throw new JsonIOException(message, e); + } + } + + @Test + public void shouldParseURI() { + try (InputStream is = getClass().getClassLoader().getResourceAsStream(SETTINGS_JSON)) { + when(settingsFacade.getRawConfig(SETTINGS_FILE_NAME)).thenReturn(is); + settingsService.updateSettings(settings); + String expected = "localhost:8080/dhis"; + assertThat(settingsService.getSettings().getServerURI(), equalTo(expected)); + } catch (IOException e) { + String message = "There was an error loading json from the DHIS2 settings."; + throw new JsonIOException(message, e); + } + } +} diff --git a/dhis2/src/test/resources/json/settings/settings.json b/dhis2/src/test/resources/json/settings/settings.json new file mode 100644 index 000000000..3de56db68 --- /dev/null +++ b/dhis2/src/test/resources/json/settings/settings.json @@ -0,0 +1,5 @@ +{ + "serverURI":"localhost:8080/dhis/", + "username":"admin", + "password":"district" +} \ No newline at end of file From 258f1fd9bb8769b81d4e0bf39823e3a31f41aee4 Mon Sep 17 00:00:00 2001 From: tomaszzawadzki Date: Wed, 21 Sep 2016 16:40:01 +0200 Subject: [PATCH 023/202] Fixes after review --- .../commcare/domain/report/ReportDataColumn.java | 9 +++------ .../domain/report/ReportDataContainerJson.java | 7 ++----- .../commcare/domain/report/ReportDataInfo.java | 1 - ...rtDataService.java => CommcareReportService.java} | 7 +++---- ...rviceImpl.java => CommcareReportServiceImpl.java} | 12 ++++++++---- 5 files changed, 16 insertions(+), 20 deletions(-) rename commcare/src/main/java/org/motechproject/commcare/service/{CommcareReportDataService.java => CommcareReportService.java} (80%) rename commcare/src/main/java/org/motechproject/commcare/service/impl/{CommcareReportDataServiceImpl.java => CommcareReportServiceImpl.java} (84%) diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataColumn.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataColumn.java index 57227e927..ce8977a72 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataColumn.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataColumn.java @@ -2,12 +2,9 @@ import com.google.gson.annotations.SerializedName; -/* -* - * Represents column part in single report. -*/ - - +/** + * Represents a single column report data. + */ public class ReportDataColumn { @SerializedName("header") diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataContainerJson.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataContainerJson.java index bbaae3748..d993d1225 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataContainerJson.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataContainerJson.java @@ -5,12 +5,9 @@ import java.util.List; import java.util.Map; -/* -* +/** * Represents a single CommCareHQ report data. It's a part of the CommCareHQ model. -*/ - - + */ public class ReportDataContainerJson { @SerializedName("columns") diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataInfo.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataInfo.java index d887cc6b5..b92fab522 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataInfo.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataInfo.java @@ -7,7 +7,6 @@ /** * Represents a single CommCareHQ report data. It's a part of the MOTECH model. */ - public class ReportDataInfo { private List columns; diff --git a/commcare/src/main/java/org/motechproject/commcare/service/CommcareReportDataService.java b/commcare/src/main/java/org/motechproject/commcare/service/CommcareReportService.java similarity index 80% rename from commcare/src/main/java/org/motechproject/commcare/service/CommcareReportDataService.java rename to commcare/src/main/java/org/motechproject/commcare/service/CommcareReportService.java index b462e4737..477b818ad 100644 --- a/commcare/src/main/java/org/motechproject/commcare/service/CommcareReportDataService.java +++ b/commcare/src/main/java/org/motechproject/commcare/service/CommcareReportService.java @@ -4,11 +4,10 @@ /** - * This service is responsible for Interacting with CommCareHQ's programmatic Report Data APIs and uploading JSON data - * from single report. + * Responsible for interacting with CommCareHQ's Report Data APIs and uploading JSON data + * from a single report. */ - -public interface CommcareReportDataService { +public interface CommcareReportService { /** * Query CommCareHQ for a report by its report id. diff --git a/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportDataServiceImpl.java b/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportServiceImpl.java similarity index 84% rename from commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportDataServiceImpl.java rename to commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportServiceImpl.java index ded0dce57..b035d373d 100644 --- a/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportDataServiceImpl.java +++ b/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportServiceImpl.java @@ -5,23 +5,27 @@ import org.motechproject.commcare.domain.report.ReportDataContainerJson; import org.motechproject.commcare.domain.report.ReportDataInfo; import org.motechproject.commcare.service.CommcareConfigService; -import org.motechproject.commcare.service.CommcareReportDataService; +import org.motechproject.commcare.service.CommcareReportService; import org.motechproject.commons.api.json.MotechJsonReader; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.lang.reflect.Type; - +/** + * Implementation of the {@link CommcareReportService} + * Responsible for interacting with CommCareHQ's Report Data APIs and uploading JSON data + * from a single report. + */ @Service -public class CommcareReportDataServiceImpl implements CommcareReportDataService { +public class CommcareReportServiceImpl implements CommcareReportService { private CommCareAPIHttpClient commcareHttpClient; private CommcareConfigService configService; private MotechJsonReader motechJsonReader; @Autowired - public CommcareReportDataServiceImpl(CommCareAPIHttpClient commcareHttpClient, CommcareConfigService configService){ + public CommcareReportServiceImpl(CommCareAPIHttpClient commcareHttpClient, CommcareConfigService configService){ this.commcareHttpClient = commcareHttpClient; this.configService = configService; this.motechJsonReader = new MotechJsonReader(); From 9a2969efb9a7f056eda19dd79fe7ba9e98f5da1d Mon Sep 17 00:00:00 2001 From: Jakub Banasiewicz Date: Thu, 22 Sep 2016 08:44:46 +0200 Subject: [PATCH 024/202] Encounter UUID as post-action field - Integration Tests --- .../openmrs/it/MRSTasksIntegrationBundleIT.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/openmrs/src/test/java/org/motechproject/openmrs/it/MRSTasksIntegrationBundleIT.java b/openmrs/src/test/java/org/motechproject/openmrs/it/MRSTasksIntegrationBundleIT.java index c99ac332a..3820f8271 100644 --- a/openmrs/src/test/java/org/motechproject/openmrs/it/MRSTasksIntegrationBundleIT.java +++ b/openmrs/src/test/java/org/motechproject/openmrs/it/MRSTasksIntegrationBundleIT.java @@ -394,7 +394,7 @@ private Task prepareCreateEncounterPostActionParameterTask() { ArrayList taskActions = new ArrayList(); taskActions.add(prepareCreateEncounterActionInformation()); - taskActions.add(prepareCreatePatientActionInformation("{{pa.0.uuid}}", "Jacob Lee", true)); + taskActions.add(prepareCreatePatientActionInformation("{{pa.0.uuid}}", "Jacob Lee", false)); Task task = new Task("OpenMRSEncounterPostActionParameterTestTask", triggerInformation, taskActions, new TaskConfig(), true, true); getTaskService().save(task); @@ -412,8 +412,8 @@ private Task prepareCreatePatientPostActionParameterTask(){ taskConfig.addAll(taskConfigStepSortedSet); ArrayList taskActions = new ArrayList(); - taskActions.add(prepareCreatePatientActionInformation("Wallstreet 15/2", "John Smith", false)); - taskActions.add(prepareCreatePatientActionInformation("{{pa.0.uuid}}", "Jacob Lee", false)); + taskActions.add(prepareCreatePatientActionInformation("Wallstreet 15/2", "John Smith", true)); + taskActions.add(prepareCreatePatientActionInformation("{{pa.0.uuid}}", "Jacob Lee", true)); Task task = new Task("OpenMRSPatientPostActionParameterTestTask", triggerInformation, taskActions, taskConfig, true, true); getTaskService().save(task); @@ -421,20 +421,21 @@ private Task prepareCreatePatientPostActionParameterTask(){ return task; } - private TaskActionInformation prepareCreatePatientActionInformation(String address1, String motechId, Boolean forEncounter) { + private TaskActionInformation prepareCreatePatientActionInformation(String address1, String motechId, boolean withPatientDataSourceBubbles) { TaskActionInformation actionInformation = new TaskActionInformation("Create Patient [" + DEFAULT_CONFIG_NAME + "]", OPENMRS_CHANNEL_NAME, OPENMRS_CHANNEL_NAME, VERSION, TEST_INTERFACE, "createPatient"); actionInformation.setSubject(String.format("createPatient.%s", DEFAULT_CONFIG_NAME)); Map values = new HashMap<>(); - String familyName, gender, givenName; - if (forEncounter == false) { + String familyName; + String gender; + String givenName; + if (withPatientDataSourceBubbles) { familyName = "{{ad.openMRS.Patient-" + DEFAULT_CONFIG_NAME + "#0.person.display}}"; gender = "{{ad.openMRS.Patient-" + DEFAULT_CONFIG_NAME + "#0.person.gender}}"; givenName = "{{ad.openMRS.Patient-" + DEFAULT_CONFIG_NAME + "#0.person.display}}"; - } - else { + } else { familyName = "Bond"; gender = "M"; givenName = "James"; From 5738e3201ceeda684698187e397d852e6e3356c1 Mon Sep 17 00:00:00 2001 From: mkruszynski Date: Thu, 22 Sep 2016 09:03:39 +0200 Subject: [PATCH 025/202] MOTECH-2922: Changed post-push build flow --- run_build.sh | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/run_build.sh b/run_build.sh index a688b0468..f486ba585 100644 --- a/run_build.sh +++ b/run_build.sh @@ -7,5 +7,12 @@ if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then mvn clean install -PIT -U fi elif [ "$TRAVIS_BRANCH" = "master" ] && [ "$DB" = "mysql" ]; then + + mvn clean install -PIT -U + + if [ "$?" -ne 0 ]; then + exit 1 + fi + mvn clean deploy --settings deploy-settings.xml -Dmaven.test.skip=true -U fi \ No newline at end of file From a0adbe2284929dca42115886431eb899e8ce10c5 Mon Sep 17 00:00:00 2001 From: Jakub Redlarski Date: Thu, 22 Sep 2016 10:04:48 +0200 Subject: [PATCH 026/202] Removed the util class containing types and renamed files Removed the util class for types, which would be replaced with a set of enums. Renamed files to follow the same pattern as there is Data and Metadata endpoint. --- .../client/CommCareAPIHttpClient.java | 6 +-- ...{Column.java => ReportMetadataColumn.java} | 4 +- ...{Filter.java => ReportMetadataFilter.java} | 4 +- ...eportInfo.java => ReportMetadataInfo.java} | 14 +++--- ...eportJson.java => ReportMetadataJson.java} | 14 +++--- .../commcare/domain/report/ReportsInfo.java | 35 -------------- .../domain/report/ReportsMetadataInfo.java | 35 ++++++++++++++ ....java => ReportsMetadataResponseJson.java} | 10 ++-- .../domain/report/constants/Types.java | 32 ------------- .../service/CommcareReportService.java | 8 ++-- .../impl/CommcareReportServiceImpl.java | 46 +++++++++---------- .../impl/CommcareReportServiceImplTest.java | 14 +++--- 12 files changed, 95 insertions(+), 127 deletions(-) rename commcare/src/main/java/org/motechproject/commcare/domain/report/{Column.java => ReportMetadataColumn.java} (86%) rename commcare/src/main/java/org/motechproject/commcare/domain/report/{Filter.java => ReportMetadataFilter.java} (86%) rename commcare/src/main/java/org/motechproject/commcare/domain/report/{ReportInfo.java => ReportMetadataInfo.java} (62%) rename commcare/src/main/java/org/motechproject/commcare/domain/report/{ReportJson.java => ReportMetadataJson.java} (72%) delete mode 100644 commcare/src/main/java/org/motechproject/commcare/domain/report/ReportsInfo.java create mode 100644 commcare/src/main/java/org/motechproject/commcare/domain/report/ReportsMetadataInfo.java rename commcare/src/main/java/org/motechproject/commcare/domain/report/{ReportsResponseJson.java => ReportsMetadataResponseJson.java} (70%) delete mode 100644 commcare/src/main/java/org/motechproject/commcare/domain/report/constants/Types.java diff --git a/commcare/src/main/java/org/motechproject/commcare/client/CommCareAPIHttpClient.java b/commcare/src/main/java/org/motechproject/commcare/client/CommCareAPIHttpClient.java index fbbc05bd5..20137e1ca 100644 --- a/commcare/src/main/java/org/motechproject/commcare/client/CommCareAPIHttpClient.java +++ b/commcare/src/main/java/org/motechproject/commcare/client/CommCareAPIHttpClient.java @@ -156,8 +156,8 @@ public String formListRequest(AccountConfig accountConfig, FormListRequest formL * @param accountConfig the account configuration to use * @return the response as a String (JSON expected) */ - public String reportsListRequest(AccountConfig accountConfig) { - return this.getRequest(accountConfig, commcareReportsListUrl(accountConfig), null); + public String reportsListMetadataRequest(AccountConfig accountConfig) { + return this.getRequest(accountConfig, commcareReportsMetadataUrl(accountConfig), null); } /** @@ -534,7 +534,7 @@ String commcareCaseUrl(AccountConfig accountConfig, String caseId) { accountConfig.getDomain(), API_VERSION, caseId); } - String commcareReportsListUrl(AccountConfig accountConfig) { + String commcareReportsMetadataUrl(AccountConfig accountConfig) { return String.format("%s/%s/api/v%s/simplereportconfiguration/?format=json", getCommcareBaseUrl(accountConfig.getBaseUrl()), accountConfig.getDomain(), API_VERSION); } diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/Column.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataColumn.java similarity index 86% rename from commcare/src/main/java/org/motechproject/commcare/domain/report/Column.java rename to commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataColumn.java index 17fa06108..95bc26d4c 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/report/Column.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataColumn.java @@ -3,9 +3,9 @@ import com.google.gson.annotations.SerializedName; /** - * Represents a single CommCareHQ {@link ReportInfo} column. + * Represents a single CommCareHQ {@link ReportMetadataInfo} column. */ -public class Column { +public class ReportMetadataColumn { @SerializedName("column_id") private String id; diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/Filter.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataFilter.java similarity index 86% rename from commcare/src/main/java/org/motechproject/commcare/domain/report/Filter.java rename to commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataFilter.java index 173b64453..db51d4a87 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/report/Filter.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataFilter.java @@ -3,9 +3,9 @@ import com.google.gson.annotations.SerializedName; /** - * Represents a single CommCareHQ {@link ReportInfo} filter. + * Represents a single CommCareHQ {@link ReportMetadataInfo} filter. */ -public class Filter { +public class ReportMetadataFilter { @SerializedName("datatype") private String datatype; diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportInfo.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataInfo.java similarity index 62% rename from commcare/src/main/java/org/motechproject/commcare/domain/report/ReportInfo.java rename to commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataInfo.java index 810ae99a3..68fa4af26 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportInfo.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataInfo.java @@ -5,12 +5,12 @@ /** * Represents a single CommCareHQ report. It's a part of the MOTECH model. */ -public class ReportInfo { +public class ReportMetadataInfo { private String id; private String title; - private List columns; - private List filters; + private List columns; + private List filters; public String getId() { return id; @@ -28,19 +28,19 @@ public void setTitle(String title) { this.title = title; } - public List getColumns() { + public List getColumns() { return columns; } - public void setColumns(List columns) { + public void setColumns(List columns) { this.columns = columns; } - public List getFilters() { + public List getFilters() { return filters; } - public void setFilters(List filters) { + public void setFilters(List filters) { this.filters = filters; } } \ No newline at end of file diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportJson.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataJson.java similarity index 72% rename from commcare/src/main/java/org/motechproject/commcare/domain/report/ReportJson.java rename to commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataJson.java index ae3a855e9..bb37e53fc 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportJson.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataJson.java @@ -7,7 +7,7 @@ /** * Represents a single CommCareHQ report. It's a part of the CommCareHQ model. */ -public class ReportJson { +public class ReportMetadataJson { @SerializedName("title") private String title; @@ -19,10 +19,10 @@ public class ReportJson { private String resource; @SerializedName("columns") - private List columns; + private List columns; @SerializedName("filters") - private List filters; + private List filters; public String getId() { return id; @@ -48,19 +48,19 @@ public void setResource() { this.resource = resource; } - public List getColumns() { + public List getColumns() { return columns; } - public void setColumns(List columns) { + public void setColumns(List columns) { this.columns = columns; } - public List getFilters() { + public List getFilters() { return filters; } - public void setFilters(List filters) { + public void setFilters(List filters) { this.filters = filters; } } \ No newline at end of file diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportsInfo.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportsInfo.java deleted file mode 100644 index d6b064ad7..000000000 --- a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportsInfo.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.motechproject.commcare.domain.report; - -import org.motechproject.commcare.domain.CommcareMetadataInfo; - -import java.util.List; - -/** - * Wrapper class for storing list of instances of the {@link ReportInfo} class. It's a part of the MOTECH model. - */ -public class ReportsInfo { - - private List reportInfoList; - private CommcareMetadataInfo metadataInfo; - - public ReportsInfo(List reportsInfoList, CommcareMetadataInfo metadataInfo) { - this.reportInfoList = reportsInfoList; - this.metadataInfo = metadataInfo; - } - - public List getReportInfoList() { - return reportInfoList; - } - - public void setReportInfoList(List reportInfoList) { - this.reportInfoList = reportInfoList; - } - - public CommcareMetadataInfo getMetadataInfo() { - return metadataInfo; - } - - public void setMetadataInfo(CommcareMetadataInfo metadataInfo) { - this.metadataInfo = metadataInfo; - } -} \ No newline at end of file diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportsMetadataInfo.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportsMetadataInfo.java new file mode 100644 index 000000000..4720b52b8 --- /dev/null +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportsMetadataInfo.java @@ -0,0 +1,35 @@ +package org.motechproject.commcare.domain.report; + +import org.motechproject.commcare.domain.CommcareMetadataInfo; + +import java.util.List; + +/** + * Wrapper class for storing list of instances of the {@link ReportMetadataInfo} class. It's a part of the MOTECH model. + */ +public class ReportsMetadataInfo { + + private List reportMetadataInfoList; + private CommcareMetadataInfo metadataInfo; + + public ReportsMetadataInfo(List reportsInfoList, CommcareMetadataInfo metadataInfo) { + this.reportMetadataInfoList = reportsInfoList; + this.metadataInfo = metadataInfo; + } + + public List getReportMetadataInfoList() { + return reportMetadataInfoList; + } + + public void setReportMetadataInfoList(List reportMetadataInfoList) { + this.reportMetadataInfoList = reportMetadataInfoList; + } + + public CommcareMetadataInfo getMetadataInfo() { + return metadataInfo; + } + + public void setMetadataInfo(CommcareMetadataInfo metadataInfo) { + this.metadataInfo = metadataInfo; + } +} \ No newline at end of file diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportsResponseJson.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportsMetadataResponseJson.java similarity index 70% rename from commcare/src/main/java/org/motechproject/commcare/domain/report/ReportsResponseJson.java rename to commcare/src/main/java/org/motechproject/commcare/domain/report/ReportsMetadataResponseJson.java index 24a2fe939..eb8b96693 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportsResponseJson.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportsMetadataResponseJson.java @@ -6,16 +6,16 @@ import java.util.List; /** - * Wrapper class for storing list of instances of the {@link ReportJson} class and their metadata. It's part of the + * Wrapper class for storing list of instances of the {@link ReportMetadataJson} class and their metadata. It's part of the * CommCareHQ model. */ -public class ReportsResponseJson { +public class ReportsMetadataResponseJson { @SerializedName("meta") private CommcareMetadataJson metadata; @SerializedName("objects") - private List reports; + private List reports; public CommcareMetadataJson getMetadata() { return metadata; @@ -25,11 +25,11 @@ public void setMetadata(CommcareMetadataJson metadata) { this.metadata = metadata; } - public List getReports() { + public List getReports() { return reports; } - public void setReports(List reports) { + public void setReports(List reports) { this.reports = reports; } } \ No newline at end of file diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/Types.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/Types.java deleted file mode 100644 index 0586eb5a2..000000000 --- a/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/Types.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.motechproject.commcare.domain.report.constants; - -import org.motechproject.commcare.domain.report.Column; -import org.motechproject.commcare.domain.report.Filter; -import org.motechproject.commcare.domain.report.ReportInfo; - -/** - * Utility class for storing {@link ReportInfo} {@link Column} and {@link Filter} types. - */ -public final class Types { - - //Columns types - private static final String FIELD = "field"; - private static final String EXPANDED = "expanded"; - - //Filters datatypes - private static final String STRING = "string"; - private static final String INTEGER = "integer"; - private static final String DECIMAL = "decimal"; - - //Filters types - private static final String DATE = "date"; - private static final String CHOICE_LIST = "choice_list"; - private static final String DYNAMIC_CHOICE_LIST = "dynamic_choice_list"; - - /** - * Utility class, should not be initiated. - */ - private Types() { - } - -} \ No newline at end of file diff --git a/commcare/src/main/java/org/motechproject/commcare/service/CommcareReportService.java b/commcare/src/main/java/org/motechproject/commcare/service/CommcareReportService.java index d5ec6a11a..a2d1a602e 100644 --- a/commcare/src/main/java/org/motechproject/commcare/service/CommcareReportService.java +++ b/commcare/src/main/java/org/motechproject/commcare/service/CommcareReportService.java @@ -1,6 +1,6 @@ package org.motechproject.commcare.service; -import org.motechproject.commcare.domain.report.ReportsInfo; +import org.motechproject.commcare.domain.report.ReportsMetadataInfo; /** * Responsible for interacting with CommCareHQ's Report Metadata and Data API. @@ -11,13 +11,13 @@ public interface CommcareReportService { * Query CommCareHQ for all reports. * * @param configName the name of the configuration used for connecting to CommcareHQ, null means default configuration - * @return {@link ReportsInfo} object that contains reports metadata and the list of {@link ReportsInfo} objects representing reports + * @return {@link ReportsMetadataInfo} object that contains reports metadata and the list of {@link ReportsMetadataInfo} objects representing reports * found on the given CommcareHQ configuration */ - ReportsInfo getReportsList(String configName); + ReportsMetadataInfo getReportsList(String configName); /** * Same as {@link #getReportsList(String)} but uses default Commcare configuration. */ - ReportsInfo getReportsList(); + ReportsMetadataInfo getReportsList(); } \ No newline at end of file diff --git a/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportServiceImpl.java b/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportServiceImpl.java index 841771b41..134006a97 100644 --- a/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportServiceImpl.java +++ b/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportServiceImpl.java @@ -4,10 +4,10 @@ import org.motechproject.commcare.client.CommCareAPIHttpClient; import org.motechproject.commcare.domain.CommcareMetadataInfo; import org.motechproject.commcare.domain.CommcareMetadataJson; -import org.motechproject.commcare.domain.report.ReportInfo; -import org.motechproject.commcare.domain.report.ReportsInfo; -import org.motechproject.commcare.domain.report.ReportJson; -import org.motechproject.commcare.domain.report.ReportsResponseJson; +import org.motechproject.commcare.domain.report.ReportMetadataInfo; +import org.motechproject.commcare.domain.report.ReportsMetadataInfo; +import org.motechproject.commcare.domain.report.ReportMetadataJson; +import org.motechproject.commcare.domain.report.ReportsMetadataResponseJson; import org.motechproject.commcare.service.CommcareConfigService; import org.motechproject.commcare.service.CommcareReportService; import org.motechproject.commons.api.json.MotechJsonReader; @@ -37,51 +37,51 @@ public CommcareReportServiceImpl(CommCareAPIHttpClient commCareHttpClient, Commc } @Override - public ReportsInfo getReportsList(String configName) { - String response = commCareHttpClient.reportsListRequest(configService.getByName(configName).getAccountConfig()); + public ReportsMetadataInfo getReportsList(String configName) { + String response = commCareHttpClient.reportsListMetadataRequest(configService.getByName(configName).getAccountConfig()); - ReportsResponseJson reportsResponseJson = parseReportsFromResponse(response); + ReportsMetadataResponseJson reportsMetadataResponseJson = parseReportsFromResponse(response); - return new ReportsInfo(generateReportsFromReportsResponse(reportsResponseJson.getReports()), populateReportsMetadata(reportsResponseJson.getMetadata())); + return new ReportsMetadataInfo(generateReportsFromReportsResponse(reportsMetadataResponseJson.getReports()), populateReportsMetadata(reportsMetadataResponseJson.getMetadata())); } @Override - public ReportsInfo getReportsList() { + public ReportsMetadataInfo getReportsList() { return getReportsList(null); } - private ReportsResponseJson parseReportsFromResponse(String response) { - Type reportsResponseType = new TypeToken() { } .getType(); - return (ReportsResponseJson) motechJsonReader.readFromString(response, reportsResponseType); + private ReportsMetadataResponseJson parseReportsFromResponse(String response) { + Type reportsResponseType = new TypeToken() { } .getType(); + return (ReportsMetadataResponseJson) motechJsonReader.readFromString(response, reportsResponseType); } - private List generateReportsFromReportsResponse(List reportResponses) { + private List generateReportsFromReportsResponse(List reportResponses) { if (reportResponses == null) { return Collections.emptyList(); } - List reportsInfoList = new ArrayList<>(); + List reportsInfoList = new ArrayList<>(); - for (ReportJson reportResponse : reportResponses) { - reportsInfoList.add(populateReportInfo(reportResponse)); + for (ReportMetadataJson reportResponse : reportResponses) { + reportsInfoList.add(populateReportMetadataInfo(reportResponse)); } return reportsInfoList; } - private ReportInfo populateReportInfo(ReportJson reportResponse) { + private ReportMetadataInfo populateReportMetadataInfo(ReportMetadataJson reportResponse) { if (reportResponse == null) { return null; } - ReportInfo reportInfo = new ReportInfo(); + ReportMetadataInfo reportMetadataInfo = new ReportMetadataInfo(); - reportInfo.setId(reportResponse.getId()); - reportInfo.setTitle(reportResponse.getTitle()); - reportInfo.setColumns(reportResponse.getColumns()); - reportInfo.setFilters(reportResponse.getFilters()); + reportMetadataInfo.setId(reportResponse.getId()); + reportMetadataInfo.setTitle(reportResponse.getTitle()); + reportMetadataInfo.setColumns(reportResponse.getColumns()); + reportMetadataInfo.setFilters(reportResponse.getFilters()); - return reportInfo; + return reportMetadataInfo; } private CommcareMetadataInfo populateReportsMetadata(CommcareMetadataJson metadataJson) { diff --git a/commcare/src/test/java/org/motechproject/commcare/service/impl/CommcareReportServiceImplTest.java b/commcare/src/test/java/org/motechproject/commcare/service/impl/CommcareReportServiceImplTest.java index dd47ff01e..932b8f9ea 100644 --- a/commcare/src/test/java/org/motechproject/commcare/service/impl/CommcareReportServiceImplTest.java +++ b/commcare/src/test/java/org/motechproject/commcare/service/impl/CommcareReportServiceImplTest.java @@ -5,7 +5,7 @@ import org.mockito.Mock; import org.motechproject.commcare.client.CommCareAPIHttpClient; import org.motechproject.commcare.config.Config; -import org.motechproject.commcare.domain.report.ReportsInfo; +import org.motechproject.commcare.domain.report.ReportsMetadataInfo; import org.motechproject.commcare.service.CommcareConfigService; import org.motechproject.commcare.util.ConfigsUtils; @@ -41,14 +41,14 @@ public void setUp() { @Test public void shouldGetReports() { - when(commcareHttpClient.reportsListRequest(configService.getByName(null).getAccountConfig())).thenReturn(getResponseForReportsList()); + when(commcareHttpClient.reportsListMetadataRequest(configService.getByName(null).getAccountConfig())).thenReturn(getResponseForReportsList()); - ReportsInfo reportsInfo = reportService.getReportsList(); + ReportsMetadataInfo reportsMetadataInfo = reportService.getReportsList(); - assertThat(reportsInfo.getMetadataInfo().getTotalCount(), equalTo(2)); - assertThat(reportsInfo.getReportInfoList().size(), equalTo(2)); - assertThat(reportsInfo.getReportInfoList().get(0).getColumns().size(), equalTo(3)); - assertThat(reportsInfo.getReportInfoList().get(0).getFilters().size(), equalTo(2)); + assertThat(reportsMetadataInfo.getMetadataInfo().getTotalCount(), equalTo(2)); + assertThat(reportsMetadataInfo.getReportMetadataInfoList().size(), equalTo(2)); + assertThat(reportsMetadataInfo.getReportMetadataInfoList().get(0).getColumns().size(), equalTo(3)); + assertThat(reportsMetadataInfo.getReportMetadataInfoList().get(0).getFilters().size(), equalTo(2)); } private String getResponseForReportsList() { From 9850e6de72241d4ec9f403fa2e58108133168633 Mon Sep 17 00:00:00 2001 From: Michal Date: Thu, 22 Sep 2016 11:14:22 +0200 Subject: [PATCH 027/202] MOTECH-2939: Fixed blank/null values in Observation of the same type Now if value is blank/null Observation is not created. --- .../impl/OpenMRSActionProxyServiceImpl.java | 18 ++++++++++-------- .../impl/OpenMRSActionProxyServiceTest.java | 2 +- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java index 5a206dee5..d3ec919c2 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java @@ -285,18 +285,20 @@ private List convertObservationMapToList(Map observ if (valueIsNotEmpty(observations, observationConceptName)) { String[] observationValues = observations.get(observationConceptName).replace(", ", ",").split(","); for (String value : observationValues) { - Observation observation = new Observation(); + if (value != null && !value.isEmpty()) { + Observation observation = new Observation(); - ConceptName conceptName = new ConceptName(observationConceptName); - Concept concept = new Concept(conceptName); - observation.setConcept(concept); + ConceptName conceptName = new ConceptName(observationConceptName); + Concept concept = new Concept(conceptName); + observation.setConcept(concept); - Observation.ObservationValue observationValue = new Observation.ObservationValue(value); - observation.setValue(observationValue); + Observation.ObservationValue observationValue = new Observation.ObservationValue(value); + observation.setValue(observationValue); - observation.setObsDatetime(obsDatetime.toDate()); + observation.setObsDatetime(obsDatetime.toDate()); - observationList.add(observation); + observationList.add(observation); + } } } else { LOGGER.warn("Observation value is null or empty for concept: " + observationConceptName diff --git a/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java b/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java index afac681e1..fa0491b06 100644 --- a/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java +++ b/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java @@ -207,7 +207,7 @@ public void shouldCreateEncounterWithGivenParametersWithObsWithManyValues() { DateTime encounterDatetime = new DateTime("2000-08-16T07:22:05Z"); Map observations = new HashMap<>(); - observations.put("testConceptName","testObservationValueName0, testObservationValueName1"); + observations.put("testConceptName","testObservationValueName0, ,testObservationValueName1"); List obsList = createObservationList(2); From 74f7b7738990dd172223a1bb5b8ceeb3e1c9e204 Mon Sep 17 00:00:00 2001 From: Michal Date: Thu, 22 Sep 2016 13:10:00 +0200 Subject: [PATCH 028/202] MOTECH-2939: Fixed after review --- .../openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java b/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java index fa0491b06..07109b15b 100644 --- a/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java +++ b/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java @@ -207,6 +207,7 @@ public void shouldCreateEncounterWithGivenParametersWithObsWithManyValues() { DateTime encounterDatetime = new DateTime("2000-08-16T07:22:05Z"); Map observations = new HashMap<>(); + /* Empty value in observations should not be included */ observations.put("testConceptName","testObservationValueName0, ,testObservationValueName1"); List obsList = createObservationList(2); From b2d3bfca1fa8c6b702b7901654afc63504a63204 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Albecki?= Date: Thu, 22 Sep 2016 13:12:22 +0200 Subject: [PATCH 029/202] MOTECH-2907: hotfix visit optional in EventHelper --- .../java/org/motechproject/openmrs/helper/EventHelper.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/openmrs/src/main/java/org/motechproject/openmrs/helper/EventHelper.java b/openmrs/src/main/java/org/motechproject/openmrs/helper/EventHelper.java index bebb5719c..ccc5d3ac7 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/helper/EventHelper.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/helper/EventHelper.java @@ -101,9 +101,11 @@ public static Map encounterParameters(Encounter encounter) { } else { encounterParameters.put(EventKeys.LOCATION_ID, null); } + if (encounter.getVisit() != null) { + encounterParameters.put(EventKeys.VISIT_ID, encounter.getVisit().getUuid()); + } encounterParameters.put(EventKeys.ENCOUNTER_DATE, encounter.getEncounterDatetime()); encounterParameters.put(EventKeys.ENCOUNTER_TYPE, encounter.getEncounterType().getUuid()); - encounterParameters.put(EventKeys.VISIT_ID, encounter.getVisit().getUuid()); return encounterParameters; } From a206182a0758582aadd9964b7b70c923443ee5c6 Mon Sep 17 00:00:00 2001 From: Michal Date: Thu, 22 Sep 2016 13:14:21 +0200 Subject: [PATCH 030/202] MOTECH-2939: Fixed after review --- .../openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java index d3ec919c2..3e44d291e 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java @@ -285,7 +285,7 @@ private List convertObservationMapToList(Map observ if (valueIsNotEmpty(observations, observationConceptName)) { String[] observationValues = observations.get(observationConceptName).replace(", ", ",").split(","); for (String value : observationValues) { - if (value != null && !value.isEmpty()) { + if (StringUtils.isNotEmpty(value)) { Observation observation = new Observation(); ConceptName conceptName = new ConceptName(observationConceptName); From e8b28df962f7a21b364d3c51f3a7e9560b0b4333 Mon Sep 17 00:00:00 2001 From: Natalia Kowalik Date: Thu, 22 Sep 2016 14:24:35 +0200 Subject: [PATCH 031/202] MOTECH-2915: Failing task when create encounter gets 400 error from OpenMRS --- .../impl/OpenMRSEncounterServiceImpl.java | 4 +- .../impl/OpenMRSEncounterServiceImplTest.java | 82 +++++++++++++++++++ 2 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 openmrs/src/test/java/org/motechproject/openmrs/service/impl/OpenMRSEncounterServiceImplTest.java diff --git a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSEncounterServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSEncounterServiceImpl.java index 8e59ed3ed..57eb63a8c 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSEncounterServiceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSEncounterServiceImpl.java @@ -10,6 +10,7 @@ import org.motechproject.openmrs.domain.EncounterType; import org.motechproject.openmrs.domain.Observation; import org.motechproject.openmrs.domain.Patient; +import org.motechproject.openmrs.exception.OpenMRSException; import org.motechproject.openmrs.helper.EventHelper; import org.motechproject.openmrs.resource.EncounterResource; import org.motechproject.openmrs.service.EventKeys; @@ -70,8 +71,7 @@ public Encounter createEncounter(String configName, Encounter encounter) { eventRelay.sendEventMessage(new MotechEvent(EventKeys.CREATED_NEW_ENCOUNTER_SUBJECT, EventHelper.encounterParameters(createdEncounter))); } catch (HttpClientErrorException e) { - LOGGER.error("Could not create encounter: " + e.getMessage()); - return null; + throw new OpenMRSException("Could not create encounter with patient uuid: " + encounter.getPatient().getUuid(), e); } return createdEncounter; diff --git a/openmrs/src/test/java/org/motechproject/openmrs/service/impl/OpenMRSEncounterServiceImplTest.java b/openmrs/src/test/java/org/motechproject/openmrs/service/impl/OpenMRSEncounterServiceImplTest.java new file mode 100644 index 000000000..a69a550be --- /dev/null +++ b/openmrs/src/test/java/org/motechproject/openmrs/service/impl/OpenMRSEncounterServiceImplTest.java @@ -0,0 +1,82 @@ +package org.motechproject.openmrs.service.impl; + +import org.joda.time.DateTime; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; +import org.motechproject.event.listener.EventRelay; +import org.motechproject.openmrs.config.Config; +import org.motechproject.openmrs.domain.*; +import org.motechproject.openmrs.exception.OpenMRSException; +import org.motechproject.openmrs.resource.EncounterResource; +import org.motechproject.openmrs.service.OpenMRSConceptService; +import org.motechproject.openmrs.service.OpenMRSConfigService; +import org.motechproject.openmrs.service.OpenMRSPatientService; +import org.springframework.http.HttpStatus; +import org.springframework.web.client.HttpClientErrorException; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import static org.mockito.Mockito.when; + +@RunWith(MockitoJUnitRunner.class) +public class OpenMRSEncounterServiceImplTest { + + private static final String CONFIG_NAME = "Configuration name"; + + @Mock + private OpenMRSPatientService patientService; + + @Mock + private OpenMRSConceptService conceptService; + + @Mock + private OpenMRSConfigService configService; + + @Mock + private EncounterResource encounterResource; + + @Mock + private EventRelay eventRelay; + + @Mock + private Config config; + + @InjectMocks + private OpenMRSEncounterServiceImpl encounterServiceImpl = new OpenMRSEncounterServiceImpl(encounterResource, patientService, conceptService, eventRelay, configService); + + + @Test(expected = OpenMRSException.class) + public void shouldThrowOpenMRSExceptionIfEncounterIsNotCreated() throws Exception { + Location location = new Location(); + location.setName("testLocation"); + + Patient patient = new Patient(); + patient.setUuid("10"); + + Provider provider = new Provider(); + provider.setUuid("20"); + + Person person = new Person(); + person.setUuid("30"); + provider.setPerson(person); + + Visit visit = new Visit(); + visit.setUuid("40"); + + DateTime encounterDatetime = new DateTime("2000-08-16T07:22:05Z"); + + List obsList = new ArrayList<>(); + + Encounter encounter = new Encounter(location, new EncounterType("testEncounterType"), encounterDatetime.toDate(), patient, visit, Collections.singletonList(provider.getPerson()), obsList); + + when(configService.getConfigByName(CONFIG_NAME)).thenReturn(config); + when(encounterResource.createEncounter(config,encounter)).thenThrow(new HttpClientErrorException(HttpStatus.BAD_REQUEST)); + + encounterServiceImpl.createEncounter(CONFIG_NAME, encounter); + } +} From 0882a1412249de8f281ba9b21cdb8d5453afc5fc Mon Sep 17 00:00:00 2001 From: Michal Date: Wed, 21 Sep 2016 14:40:27 +0200 Subject: [PATCH 032/202] MOTECH-2920: Used Concept UUID for Submitting Observations Now to add new Observation it is required to set Concept Uuid as a key. --- .../impl/OpenMRSEncounterServiceImpl.java | 39 +------------------ .../tasks/OpenMRSActionProxyService.java | 2 +- .../impl/OpenMRSActionProxyServiceImpl.java | 16 ++++---- .../impl/OpenMRSActionProxyServiceTest.java | 8 ++-- 4 files changed, 14 insertions(+), 51 deletions(-) diff --git a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSEncounterServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSEncounterServiceImpl.java index 8e59ed3ed..c499e9f0d 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSEncounterServiceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSEncounterServiceImpl.java @@ -1,6 +1,5 @@ package org.motechproject.openmrs.service.impl; -import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; import org.motechproject.event.MotechEvent; @@ -8,12 +7,10 @@ import org.motechproject.openmrs.config.Config; import org.motechproject.openmrs.domain.Encounter; import org.motechproject.openmrs.domain.EncounterType; -import org.motechproject.openmrs.domain.Observation; import org.motechproject.openmrs.domain.Patient; import org.motechproject.openmrs.helper.EventHelper; import org.motechproject.openmrs.resource.EncounterResource; import org.motechproject.openmrs.service.EventKeys; -import org.motechproject.openmrs.service.OpenMRSConceptService; import org.motechproject.openmrs.service.OpenMRSConfigService; import org.motechproject.openmrs.service.OpenMRSEncounterService; import org.motechproject.openmrs.service.OpenMRSPatientService; @@ -32,7 +29,6 @@ public class OpenMRSEncounterServiceImpl implements OpenMRSEncounterService { private static final Logger LOGGER = LoggerFactory.getLogger(OpenMRSEncounterServiceImpl.class); - private final OpenMRSConceptService conceptService; private final OpenMRSPatientService patientService; private final OpenMRSConfigService configService; @@ -43,11 +39,9 @@ public class OpenMRSEncounterServiceImpl implements OpenMRSEncounterService { @Autowired public OpenMRSEncounterServiceImpl(EncounterResource encounterResource, OpenMRSPatientService patientAdapter, - OpenMRSConceptService conceptAdapter, EventRelay eventRelay, - OpenMRSConfigService configService) { + EventRelay eventRelay, OpenMRSConfigService configService) { this.encounterResource = encounterResource; this.patientService = patientAdapter; - this.conceptService = conceptAdapter; this.configService = configService; this.eventRelay = eventRelay; } @@ -59,13 +53,7 @@ public Encounter createEncounter(String configName, Encounter encounter) { Encounter createdEncounter; Config config = configService.getConfigByName(configName); - // OpenMRS expects the observations to reference a concept uuid rather - // than just a concept name. Attempt to map all concept names to concept - // uuid's for each of the observations - List updatedObs = resolveConceptUuidForConceptNames(config, encounter.getObs()); - try { - encounter.setObs(updatedObs); createdEncounter = encounterResource.createEncounter(config, encounter); eventRelay.sendEventMessage(new MotechEvent(EventKeys.CREATED_NEW_ENCOUNTER_SUBJECT, EventHelper.encounterParameters(createdEncounter))); @@ -176,31 +164,6 @@ private void validateEncounter(Encounter encounter) { Validate.notNull(encounter.getEncounterType(), "Encounter type cannot be null"); } - private List resolveConceptUuidForConceptNames(Config config, List originalObservations) { - List updatedObs = new ArrayList<>(); - if (originalObservations != null) { - for (Observation observation : originalObservations) { - if (observationValueIsNotEmpty(observation)) { - String conceptUuid = conceptService.resolveConceptUuidFromConceptName(config.getName(), observation.getConcept().getName().getName()); - if (CollectionUtils.isNotEmpty(observation.getGroupsMembers())) { - resolveConceptUuidForConceptNames(config, observation.getGroupsMembers()); - } - observation.getConcept().setUuid(conceptUuid); - updatedObs.add(observation); - } else { - LOGGER.warn("Observation value is null or empty for concept: " + observation.getConcept().getName() - + " and will not be created"); - } - } - } - - return updatedObs; - } - - private boolean observationValueIsNotEmpty(Observation observation) { - return observation.getValue() != null && StringUtils.isNotEmpty(observation.getValue().getDisplay()); - } - private List getAllEncountersByPatientMotechId(Config config, String motechId) { Validate.notEmpty(motechId, "MOTECH Id cannot be empty"); diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSActionProxyService.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSActionProxyService.java index 1f604f155..e531c93f5 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSActionProxyService.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSActionProxyService.java @@ -29,7 +29,7 @@ public interface OpenMRSActionProxyService { * @param patientUuid the patient uuid * @param providerUuid the provider uuid * @param visitUuid the visit uuid - * @param observations the map of observations where concept name is a key and value from the observation is a value + * @param observations the map of observations where concept Uuid is a key and value from the observation is a value */ Encounter createEncounter(String configName, DateTime encounterDatetime, String encounterType, String locationName, String patientUuid, String providerUuid, String visitUuid, diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java index 3e44d291e..98c3ef98b 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java @@ -8,7 +8,6 @@ import org.motechproject.openmrs.domain.Attribute; import org.motechproject.openmrs.domain.CohortQueryReport; import org.motechproject.openmrs.domain.Concept; -import org.motechproject.openmrs.domain.ConceptName; import org.motechproject.openmrs.domain.Encounter; import org.motechproject.openmrs.domain.EncounterType; import org.motechproject.openmrs.domain.Identifier; @@ -281,18 +280,19 @@ private List convertIdentifierMapToList(Map identifi private List convertObservationMapToList(Map observations, DateTime obsDatetime) { List observationList = new ArrayList<>(); - for (String observationConceptName : observations.keySet()) { - if (valueIsNotEmpty(observations, observationConceptName)) { - String[] observationValues = observations.get(observationConceptName).replace(", ", ",").split(","); + for (String observationConceptUuid : observations.keySet()) { + if (valueIsNotEmpty(observations, observationConceptUuid)) { + String[] observationValues = observations.get(observationConceptUuid).replace(", ", ",").split(","); for (String value : observationValues) { if (StringUtils.isNotEmpty(value)) { Observation observation = new Observation(); - ConceptName conceptName = new ConceptName(observationConceptName); - Concept concept = new Concept(conceptName); + Concept concept = new Concept(); + concept.setUuid(observationConceptUuid); observation.setConcept(concept); - Observation.ObservationValue observationValue = new Observation.ObservationValue(value); + String observationMapValue = observations.get(observationConceptUuid); + Observation.ObservationValue observationValue = new Observation.ObservationValue(observationMapValue); observation.setValue(observationValue); observation.setObsDatetime(obsDatetime.toDate()); @@ -301,7 +301,7 @@ private List convertObservationMapToList(Map observ } } } else { - LOGGER.warn("Observation value is null or empty for concept: " + observationConceptName + LOGGER.warn("Observation value is null or empty for concept with Uuid: " + observationConceptUuid + " and will not be created"); } } diff --git a/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java b/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java index 07109b15b..72578b8fb 100644 --- a/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java +++ b/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java @@ -125,7 +125,7 @@ public void shouldCreateEncounterWithGivenParameters() { DateTime encounterDatetime = new DateTime("2000-08-16T07:22:05Z"); Map observations = new HashMap<>(); - observations.put("testConceptName","testObservationValueName0"); + observations.put("18ff53df-744a-4a3f-8f25-dac6de5b7131", "testObservationValueName0"); List obsList = createObservationList(1); @@ -166,7 +166,7 @@ public void shouldCreateEncounterWithGivenParametersWithoutObsWithEmptyValue() { DateTime encounterDatetime = new DateTime("2000-08-16T07:22:05Z"); Map observations = new HashMap<>(); - observations.put("testConceptName",""); + observations.put("18ff53df-744a-4a3f-8f25-dac6de5b7131",""); List obsList = new ArrayList<>(); @@ -646,8 +646,8 @@ private List createObservationList(int observationsNumber) { List observationList = new ArrayList<>(); for (int i = 0; i < observationsNumber; i++) { - ConceptName conceptName = new ConceptName("testConceptName"); - Concept concept = new Concept(conceptName); + Concept concept = new Concept(); + concept.setUuid("18ff53df-744a-4a3f-8f25-dac6de5b7131"); Observation observation = new Observation(); observation.setConcept(concept); From fd0368845369ef9d8a0170369a88651691c0f1df Mon Sep 17 00:00:00 2001 From: Natalia Kowalik Date: Thu, 22 Sep 2016 14:46:22 +0200 Subject: [PATCH 033/202] Added verify to unit test --- .../service/impl/OpenMRSEncounterServiceImplTest.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/openmrs/src/test/java/org/motechproject/openmrs/service/impl/OpenMRSEncounterServiceImplTest.java b/openmrs/src/test/java/org/motechproject/openmrs/service/impl/OpenMRSEncounterServiceImplTest.java index a69a550be..00bbaaf0c 100644 --- a/openmrs/src/test/java/org/motechproject/openmrs/service/impl/OpenMRSEncounterServiceImplTest.java +++ b/openmrs/src/test/java/org/motechproject/openmrs/service/impl/OpenMRSEncounterServiceImplTest.java @@ -22,6 +22,7 @@ import java.util.List; import static org.mockito.Mockito.when; +import static org.mockito.Mockito.verify; @RunWith(MockitoJUnitRunner.class) public class OpenMRSEncounterServiceImplTest { @@ -77,6 +78,10 @@ public void shouldThrowOpenMRSExceptionIfEncounterIsNotCreated() throws Exceptio when(configService.getConfigByName(CONFIG_NAME)).thenReturn(config); when(encounterResource.createEncounter(config,encounter)).thenThrow(new HttpClientErrorException(HttpStatus.BAD_REQUEST)); - encounterServiceImpl.createEncounter(CONFIG_NAME, encounter); + try { + encounterServiceImpl.createEncounter(CONFIG_NAME, encounter); + } finally { + verify(encounterResource).createEncounter(config, encounter); + } } } From 18cc231d3001228e7ac01d2d716fd702989407c7 Mon Sep 17 00:00:00 2001 From: Michal Date: Thu, 22 Sep 2016 15:23:19 +0200 Subject: [PATCH 034/202] MOTECH-2920: Fixed after merge --- .../openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java | 3 +-- .../openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java index 98c3ef98b..09fd151b2 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java @@ -291,8 +291,7 @@ private List convertObservationMapToList(Map observ concept.setUuid(observationConceptUuid); observation.setConcept(concept); - String observationMapValue = observations.get(observationConceptUuid); - Observation.ObservationValue observationValue = new Observation.ObservationValue(observationMapValue); + Observation.ObservationValue observationValue = new Observation.ObservationValue(value); observation.setValue(observationValue); observation.setObsDatetime(obsDatetime.toDate()); diff --git a/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java b/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java index 72578b8fb..a2449ced6 100644 --- a/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java +++ b/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java @@ -208,7 +208,7 @@ public void shouldCreateEncounterWithGivenParametersWithObsWithManyValues() { DateTime encounterDatetime = new DateTime("2000-08-16T07:22:05Z"); Map observations = new HashMap<>(); /* Empty value in observations should not be included */ - observations.put("testConceptName","testObservationValueName0, ,testObservationValueName1"); + observations.put("18ff53df-744a-4a3f-8f25-dac6de5b7131","testObservationValueName0, ,testObservationValueName1"); List obsList = createObservationList(2); From b2eaf3cedf1cee659148c41d604a5fc76acc98ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Ja=C5=BCd=C5=BCewski?= Date: Thu, 22 Sep 2016 15:56:53 +0200 Subject: [PATCH 035/202] Added statement protecting against empty settings json --- .../motechproject/dhis2/service/impl/SettingsServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dhis2/src/main/java/org/motechproject/dhis2/service/impl/SettingsServiceImpl.java b/dhis2/src/main/java/org/motechproject/dhis2/service/impl/SettingsServiceImpl.java index c80e5e1fb..1da83ade2 100644 --- a/dhis2/src/main/java/org/motechproject/dhis2/service/impl/SettingsServiceImpl.java +++ b/dhis2/src/main/java/org/motechproject/dhis2/service/impl/SettingsServiceImpl.java @@ -61,7 +61,7 @@ private synchronized void loadSettings() { Gson gson = new Gson(); settings = gson.fromJson(jsonText, Settings.class); String uri = settings.getServerURI(); - if (uri.endsWith("/")) { + if (uri != null && uri.endsWith("/")) { settings.setServerURI(uri.substring(0, uri.length() - 1)); } } catch (Exception e) { From 1783e283ad2e7b7bb8c3b54d1f702b376fe554b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Ja=C5=BCd=C5=BCewski?= Date: Thu, 22 Sep 2016 17:54:02 +0200 Subject: [PATCH 036/202] MOTECH-2918 Added DHIS2 status response to DEBUG log and throwing DhisWebException when response is ERROR. --- .../rest/service/impl/DhisWebServiceImpl.java | 28 ++++++------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/dhis2/src/main/java/org/motechproject/dhis2/rest/service/impl/DhisWebServiceImpl.java b/dhis2/src/main/java/org/motechproject/dhis2/rest/service/impl/DhisWebServiceImpl.java index 09bcf6c66..9368a6d23 100644 --- a/dhis2/src/main/java/org/motechproject/dhis2/rest/service/impl/DhisWebServiceImpl.java +++ b/dhis2/src/main/java/org/motechproject/dhis2/rest/service/impl/DhisWebServiceImpl.java @@ -23,25 +23,7 @@ import org.codehaus.jackson.type.JavaType; import org.motechproject.admin.service.StatusMessageService; import org.motechproject.dhis2.event.EventSubjects; -import org.motechproject.dhis2.rest.domain.BaseDto; -import org.motechproject.dhis2.rest.domain.DataElementDto; -import org.motechproject.dhis2.rest.domain.DataSetDto; -import org.motechproject.dhis2.rest.domain.DataValueSetDto; -import org.motechproject.dhis2.rest.domain.DhisDataValueStatusResponse; -import org.motechproject.dhis2.rest.domain.DhisEventDto; -import org.motechproject.dhis2.rest.domain.DhisServerInfo; -import org.motechproject.dhis2.rest.domain.DhisStatusResponse; -import org.motechproject.dhis2.rest.domain.EnrollmentDto; -import org.motechproject.dhis2.rest.domain.OrganisationUnitDto; -import org.motechproject.dhis2.rest.domain.PagedResourceDto; -import org.motechproject.dhis2.rest.domain.ProgramDto; -import org.motechproject.dhis2.rest.domain.ProgramStageDataElementDto; -import org.motechproject.dhis2.rest.domain.ProgramStageDto; -import org.motechproject.dhis2.rest.domain.ProgramTrackedEntityAttributeDto; -import org.motechproject.dhis2.rest.domain.ServerVersion; -import org.motechproject.dhis2.rest.domain.TrackedEntityAttributeDto; -import org.motechproject.dhis2.rest.domain.TrackedEntityDto; -import org.motechproject.dhis2.rest.domain.TrackedEntityInstanceDto; +import org.motechproject.dhis2.rest.domain.*; import org.motechproject.dhis2.rest.service.DhisWebException; import org.motechproject.dhis2.rest.service.DhisWebService; import org.motechproject.dhis2.service.Settings; @@ -420,6 +402,14 @@ private DhisStatusResponse createEntity(Settings settings, String uri, String js closeResponse(response); } + LOGGER.debug(String.format("DHIS2 status response: %s", status.getStatus().toString())); + + if (status.getStatus() == DhisStatus.ERROR) { + String msg = String.format("Error in DHIS2 status response: %s", status.getStatus().toString()); + statusMessageService.warn(msg, MODULE_NAME); + throw new DhisWebException(msg); + } + return status; } From 05ec9bc3b7f4b2e101eb17aa6921ff7bd7a6ea86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Ja=C5=BCd=C5=BCewski?= Date: Thu, 22 Sep 2016 18:02:23 +0200 Subject: [PATCH 037/202] Fixed imports --- .../rest/service/impl/DhisWebServiceImpl.java | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/dhis2/src/main/java/org/motechproject/dhis2/rest/service/impl/DhisWebServiceImpl.java b/dhis2/src/main/java/org/motechproject/dhis2/rest/service/impl/DhisWebServiceImpl.java index 9368a6d23..a9a952b23 100644 --- a/dhis2/src/main/java/org/motechproject/dhis2/rest/service/impl/DhisWebServiceImpl.java +++ b/dhis2/src/main/java/org/motechproject/dhis2/rest/service/impl/DhisWebServiceImpl.java @@ -23,7 +23,26 @@ import org.codehaus.jackson.type.JavaType; import org.motechproject.admin.service.StatusMessageService; import org.motechproject.dhis2.event.EventSubjects; -import org.motechproject.dhis2.rest.domain.*; +import org.motechproject.dhis2.rest.domain.BaseDto; +import org.motechproject.dhis2.rest.domain.DataElementDto; +import org.motechproject.dhis2.rest.domain.DataSetDto; +import org.motechproject.dhis2.rest.domain.DataValueSetDto; +import org.motechproject.dhis2.rest.domain.DhisDataValueStatusResponse; +import org.motechproject.dhis2.rest.domain.DhisEventDto; +import org.motechproject.dhis2.rest.domain.DhisServerInfo; +import org.motechproject.dhis2.rest.domain.DhisStatus; +import org.motechproject.dhis2.rest.domain.DhisStatusResponse; +import org.motechproject.dhis2.rest.domain.EnrollmentDto; +import org.motechproject.dhis2.rest.domain.OrganisationUnitDto; +import org.motechproject.dhis2.rest.domain.PagedResourceDto; +import org.motechproject.dhis2.rest.domain.ProgramDto; +import org.motechproject.dhis2.rest.domain.ProgramStageDataElementDto; +import org.motechproject.dhis2.rest.domain.ProgramStageDto; +import org.motechproject.dhis2.rest.domain.ProgramTrackedEntityAttributeDto; +import org.motechproject.dhis2.rest.domain.ServerVersion; +import org.motechproject.dhis2.rest.domain.TrackedEntityAttributeDto; +import org.motechproject.dhis2.rest.domain.TrackedEntityDto; +import org.motechproject.dhis2.rest.domain.TrackedEntityInstanceDto; import org.motechproject.dhis2.rest.service.DhisWebException; import org.motechproject.dhis2.rest.service.DhisWebService; import org.motechproject.dhis2.service.Settings; From 30f2b163d9af7827bfdc30c85cbff02039213405 Mon Sep 17 00:00:00 2001 From: Jakub Banasiewicz Date: Fri, 23 Sep 2016 09:09:17 +0200 Subject: [PATCH 038/202] Tests fixed. --- .../motechproject/openmrs/it/MRSTasksIntegrationBundleIT.java | 1 - 1 file changed, 1 deletion(-) diff --git a/openmrs/src/test/java/org/motechproject/openmrs/it/MRSTasksIntegrationBundleIT.java b/openmrs/src/test/java/org/motechproject/openmrs/it/MRSTasksIntegrationBundleIT.java index 3820f8271..181be04de 100644 --- a/openmrs/src/test/java/org/motechproject/openmrs/it/MRSTasksIntegrationBundleIT.java +++ b/openmrs/src/test/java/org/motechproject/openmrs/it/MRSTasksIntegrationBundleIT.java @@ -462,7 +462,6 @@ private TaskActionInformation prepareCreateEncounterActionInformation(){ values.put(Keys.ENCOUNTER_TYPE, createdEncounterType.getName()); values.put(Keys.ENCOUNTER_DATE, new DateTime("2015-01-16T00:00:00Z").toString()); values.put(Keys.LOCATION_NAME, DEFAULT_LOCATION_NAME); - values.put(Keys.VISIT_UUID, prepareVisit().getUuid()); values.put(Keys.CONFIG_NAME, DEFAULT_CONFIG_NAME); actionInformation.setValues(values); From 703f4d15be8d0ec07107f418c5f8906135766ec3 Mon Sep 17 00:00:00 2001 From: Jakub Banasiewicz Date: Fri, 23 Sep 2016 11:12:43 +0200 Subject: [PATCH 039/202] Tests Fixed. --- .../motechproject/openmrs/it/MRSTasksIntegrationBundleIT.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmrs/src/test/java/org/motechproject/openmrs/it/MRSTasksIntegrationBundleIT.java b/openmrs/src/test/java/org/motechproject/openmrs/it/MRSTasksIntegrationBundleIT.java index 181be04de..a599be41b 100644 --- a/openmrs/src/test/java/org/motechproject/openmrs/it/MRSTasksIntegrationBundleIT.java +++ b/openmrs/src/test/java/org/motechproject/openmrs/it/MRSTasksIntegrationBundleIT.java @@ -245,7 +245,7 @@ public void testCreateEncounterPostActionParameter() throws InterruptedException // Give Tasks some time to process assertTrue(waitForTaskExecution(task.getId())); - Encounter encounter = encounterService.getLatestEncounterByPatientMotechId(DEFAULT_CONFIG_NAME, createdPatient.getMotechId(), createdEncounterType.getName()); + Encounter encounter = encounterService.getLatestEncounterByPatientMotechId(DEFAULT_CONFIG_NAME, MOTECH_ID, createdEncounterType.getName()); String firstEncounterUuid = encounter.getUuid(); Patient patient = patientService.getPatientByMotechId(DEFAULT_CONFIG_NAME, "Jacob Lee"); From ae3f3fa4e0e3ca9800bf8f7ab760bf5bc128130f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Albecki?= Date: Wed, 21 Sep 2016 10:48:51 +0200 Subject: [PATCH 040/202] MOTECH-2903: New task Action: Create Observation in OpenMRS --- .../openmrs/domain/Observation.java | 17 ++++- .../tasks/OpenMRSActionProxyService.java | 19 +++++- .../openmrs/tasks/builder/ActionBuilder.java | 27 +++++++- .../openmrs/tasks/constants/DisplayNames.java | 9 ++- .../openmrs/tasks/constants/Keys.java | 10 ++- .../impl/OpenMRSActionProxyServiceImpl.java | 66 +++++++++++++++++++ .../webapp/messages/messages.properties | 6 ++ 7 files changed, 144 insertions(+), 10 deletions(-) diff --git a/openmrs/src/main/java/org/motechproject/openmrs/domain/Observation.java b/openmrs/src/main/java/org/motechproject/openmrs/domain/Observation.java index 1d45b122c..15b197d08 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/domain/Observation.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/domain/Observation.java @@ -27,6 +27,8 @@ public class Observation { private Person person; private List groupsMembers; + private String comment; + public String getUuid() { return uuid; } @@ -95,12 +97,20 @@ public void setGroupsMembers(List groupsMembers) { this.groupsMembers = groupsMembers; } + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + @Override public int hashCode() { - return Objects.hash(uuid, display, concept, encounter, value, obsDatetime, person, groupsMembers); + return Objects.hash(uuid, display, concept, encounter, value, obsDatetime, person, groupsMembers, comment); } - @Override + @Override //NO CHECKSTYLE Cyclomatic Complexity public boolean equals(Object o) { if (this == o) { return true; @@ -115,7 +125,8 @@ public boolean equals(Object o) { return Objects.equals(uuid, other.uuid) && Objects.equals(display, other.display) && Objects.equals(concept, other.concept) && Objects.equals(encounter, other.encounter) && Objects.equals(value, other.value) && Objects.equals(obsDatetime, other.obsDatetime) - && Objects.equals(person, other.person) && Objects.equals(groupsMembers, other.groupsMembers); + && Objects.equals(person, other.person) && Objects.equals(groupsMembers, other.groupsMembers) + && Objects.equals(comment, other.comment); } /** diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSActionProxyService.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSActionProxyService.java index 1f604f155..29fe195e8 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSActionProxyService.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSActionProxyService.java @@ -32,8 +32,8 @@ public interface OpenMRSActionProxyService { * @param observations the map of observations where concept name is a key and value from the observation is a value */ Encounter createEncounter(String configName, DateTime encounterDatetime, String encounterType, - String locationName, String patientUuid, String providerUuid, String visitUuid, - Map observations); + String locationName, String patientUuid, String providerUuid, String visitUuid, + Map observations); /** * Creates a patient with the given params. The required fields are : {@code givenName}, {@code familyName}, @@ -88,6 +88,21 @@ Patient createPatient(String configName, String givenName, String middleName, St */ void updatePatientIdentifiers(String configName, String patientUuid, Map identifiers); + /** + * Creates an observation from given {@code observationJSON}. The observationJSON is the only required field. Other + * params are optional and will overwrite any matching key of {@code observationJSON}. Configuration with + * the given {@code configName} will be used while performing this action. + * + * @param configName the name of the configuration + * @param observationJSON the observation in JSON + * @param encounterUuid the encounter uuid + * @param conceptUuid the concept uuid + * @param obsDatetime the observation datetime + * @param comment the comment + */ + void createObservationJSON(String configName, String observationJSON, String encounterUuid, String conceptUuid, + DateTime obsDatetime, String comment); + /** * Creates a visit with the given {@code patientUuid}, {@code visitStartDatetime}, * {@code visitEndDatetime}, {@code visitType} and {@code locationName}. The locationName and visitType are the only not required field. Configuration with diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/builder/ActionBuilder.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/builder/ActionBuilder.java index 58135c5c5..d6af2f326 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/builder/ActionBuilder.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/builder/ActionBuilder.java @@ -18,6 +18,7 @@ import static org.motechproject.tasks.domain.enums.ParameterType.BOOLEAN; import static org.motechproject.tasks.domain.enums.ParameterType.DATE; import static org.motechproject.tasks.domain.enums.ParameterType.MAP; +import static org.motechproject.tasks.domain.enums.ParameterType.TEXTAREA; /** * Responsible for building actions for the Tasks channel. @@ -26,8 +27,9 @@ public class ActionBuilder { private static final String CREATE_ENCOUNTER = "Create Encounter"; private static final String CREATE_PATIENT = "Create Patient"; private static final String UPDATE_PATIENT_IDENTIFIERS = "Update Patient Identifiers"; - private static final String CREATE_VISIT = "Create Visit"; private static final String UPDATE_PERSON = "Update Person"; + private static final String CREATE_OBSERVATION_JSON = "Create Observation JSON"; + private static final String CREATE_VISIT = "Create Visit"; private static final String CREATE_PROGRAM_ENROLLMENT = "Create Program Enrollment"; private static final String UPDATE_PROGRAM_ENROLLMENT = "Update Program Enrollment"; private static final String CHANGE_PROGRAM_ENROLLMENT_STATE = "Change Program Enrollment State"; @@ -53,6 +55,7 @@ public List buildActions() { actions.add(buildCreateEncounterAction(configName)); actions.add(buildCreatePatientAction(configName)); actions.add(buildUpdatePatientAction(configName)); + actions.add(buildCreateObservationJSON(configName)); actions.add(buildCreateVisitAction(configName)); actions.add(buildUpdatePatientIdentifiersAction(configName)); actions.add(buildGetCohortQueryReport(configName)); @@ -147,6 +150,28 @@ private ActionEventRequest buildUpdatePatientAction(String configName) { .createActionEventRequest(); } + private ActionEventRequest buildCreateObservationJSON(String configName) { + SortedSet actionParameters = new TreeSet<>(); + int order = 0; + String serviceMethod = "createObservationJSON"; + + actionParameters.add(prepareParameter(Keys.CONFIG_NAME, DisplayNames.CONFIG_NAME, configName, true, true, + order++)); + actionParameters.add(prepareParameter(Keys.OBSERVATION_JSON, DisplayNames.OBSERVATION_JSON, TEXTAREA, true, order++)); + actionParameters.add(prepareParameter(Keys.ENCOUNTER_UUID, DisplayNames.ENCOUNTER_UUID, false, order++)); + actionParameters.add(prepareParameter(Keys.CONCEPT_UUID, DisplayNames.CONCEPT_UUID, false, order++)); + actionParameters.add(prepareParameter(Keys.OBSERVATION_DATETIME, DisplayNames.OBSERVATION_DATETIME, DATE, false, order++)); + actionParameters.add(prepareParameter(Keys.COMMENT, DisplayNames.COMMENT, false, order)); + + return new ActionEventRequestBuilder() + .setDisplayName(getDisplayName(CREATE_OBSERVATION_JSON, configName)) + .setServiceInterface(OPENMRS_ACTION_PROXY_SERVICE) + .setServiceMethod(serviceMethod) + .setSubject(getSubject(serviceMethod, configName)) + .setActionParameters(actionParameters) + .createActionEventRequest(); + } + private ActionEventRequest buildCreateVisitAction(String configName) { SortedSet actionParameters = new TreeSet<>(); SortedSet postActionParameters = new TreeSet<>(); diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/constants/DisplayNames.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/constants/DisplayNames.java index 7273582a3..bb87781a1 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/constants/DisplayNames.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/constants/DisplayNames.java @@ -46,21 +46,26 @@ public final class DisplayNames { public static final String IDENTIFIERS = "openMRS.patient.identifiers"; public static final String PERSON_ATTRIBUTES = "openMRS.patient.personAttributes"; + //Observation json + public static final String OBSERVATION_JSON = "openMRS.observationJSON"; + public static final String CONCEPT_UUID = "openMRS.concept.uuid"; + public static final String OBSERVATION_DATETIME = "openMRS.obsDatetime"; + public static final String COMMENT = "openMRS.comment"; + //Visit action public static final String VISIT_UUID = "openMRS.visit.uuid"; public static final String VISIT_START_DATETIME = "openMRS.visit.startDatetime"; public static final String VISIT_STOP_DATETIME = "openMRS.visit.stopDatetime"; public static final String VISIT_TYPE_UUID = "openMRS.visit.type.uuid"; - //Program Enrollment action public static final String PROGRAM_UUID = "openMRS.program.uuid"; public static final String PROGRAM_ENROLLMENT_UUID = "openMRS.programEnrollment.uuid"; public static final String DATE_ENROLLED = "openMRS.programEnrollment.dateEnrolled"; + public static final String DATE_COMPLETED = "openMRS.programEnrollment.dateCompleted"; public static final String STATE_UUID = "openMRS.program.state.uuid"; public static final String STATE_START_DATE = "openMRS.program.state.startDate"; public static final String PROGRAM_ENROLLMENT_ATTRIBUTES = "openMRS.programEnrollment.attributes"; - //CohortQuery Report action public static final String COHORT_QUERY_UUID = "openMRS.cohortQuery.uuid"; public static final String COHORT_QUERY_PARAMETERS = "openMRS.cohortQuery.parameters"; diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/constants/Keys.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/constants/Keys.java index 1ad42ff69..a1f335234 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/constants/Keys.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/constants/Keys.java @@ -46,21 +46,27 @@ public final class Keys { public static final String UUID = "uuid"; public static final String PERSON_ATTRIBUTES = "person.personAttributes"; + //Observation action + public static final String OBSERVATION_JSON = "observationJSON"; + public static final String ENCOUNTER_UUID = "encounterUuid"; + public static final String CONCEPT_UUID = "conceptUuid"; + public static final String OBSERVATION_DATETIME = "obsDatetime"; + public static final String COMMENT = "comment"; + //Visit action public static final String VISIT_START_DATETIME = "startDatetime"; public static final String VISIT_STOP_DATETIME = "stopDatetime"; public static final String VISIT_TYPE_UUID = "visitTypeUuid"; public static final String VISIT_UUID = "visitUuid"; - public static final String VISIT_TYPE = "visitType"; //Program Enrollment action public static final String PROGRAM_UUID = "program.uuid"; + public static final String PROGRAM_ENROLLMENT_UUID = "programEnrollmentUuid"; public static final String DATE_ENROLLED = "dateEnrolled"; public static final String DATE_COMPLETED = "dateCompleted"; public static final String STATE_UUID = "stateUuid"; public static final String STATE_START_DATE = "startDate"; - public static final String PROGRAM_ENROLLMENT_ATTRIBUTES = "programEnrollmentAttributes"; //CohortQuery Report action public static final String COHORT_QUERY_UUID = "cohortQueryUuid"; diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java index 3e44d291e..2cac9a6a2 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java @@ -27,6 +27,7 @@ import org.motechproject.openmrs.service.OpenMRSConceptService; import org.motechproject.openmrs.service.OpenMRSEncounterService; import org.motechproject.openmrs.service.OpenMRSLocationService; +import org.motechproject.openmrs.service.OpenMRSObservationService; import org.motechproject.openmrs.service.OpenMRSPatientService; import org.motechproject.openmrs.service.OpenMRSPersonService; import org.motechproject.openmrs.service.OpenMRSProgramEnrollmentService; @@ -34,6 +35,7 @@ import org.motechproject.openmrs.service.OpenMRSVisitService; import org.motechproject.openmrs.tasks.OpenMRSActionProxyService; import org.motechproject.openmrs.tasks.constants.EventSubjects; +import org.motechproject.openmrs.util.JsonUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -41,6 +43,7 @@ import java.util.ArrayList; import java.util.Collections; +import java.util.Date; import java.util.List; import java.util.Map; import java.util.Objects; @@ -57,6 +60,7 @@ public class OpenMRSActionProxyServiceImpl implements OpenMRSActionProxyService private OpenMRSEncounterService encounterService; private OpenMRSLocationService locationService; private OpenMRSPatientService patientService; + private OpenMRSObservationService observationService; private OpenMRSVisitService visitService; private OpenMRSProviderService providerService; private OpenMRSProgramEnrollmentService programEnrollmentService; @@ -140,6 +144,54 @@ public void updatePerson(String configName, String personUuid, String givenName, personService.updatePerson(configName, person); } + @Override //NO CHECKSTYLE Cyclomatic Complexity + public void createObservationJSON(String configName, String observationJSON, String encounterUuid, String conceptUuid, + DateTime obsDatetime, String comment) { + Observation observation = new Observation(); + ObservationFromJSON observationFromJSON = (ObservationFromJSON) JsonUtils.readJson(observationJSON, ObservationFromJSON.class); + + if (observationFromJSON.groupsMembers != null) { + List groupsMembers = new ArrayList<>(); + for (String obsUuid : observationFromJSON.groupsMembers) { + groupsMembers.add(observationService.getObservationByUuid(configName, obsUuid)); + } + if (!groupsMembers.isEmpty()) { + observation.setGroupsMembers(groupsMembers); + } + } + + if (StringUtils.isNotEmpty(observationFromJSON.person)) { + observation.setPerson(personService.getPersonByUuid(configName, observationFromJSON.person)); + } + if (StringUtils.isNotEmpty(observationFromJSON.concept)) { + observation.setConcept(conceptService.getConceptByUuid(configName, observationFromJSON.concept)); + } + if (StringUtils.isNotEmpty(observationFromJSON.value)) { + observation.setValue(new Observation.ObservationValue(observationFromJSON.value)); + } + if (StringUtils.isNotEmpty(observationFromJSON.encounter)) { + observation.setEncounter(encounterService.getEncounterByUuid(configName, observationFromJSON.encounter)); + } + if (observationFromJSON.obsDatetime != null) { + observation.setObsDatetime(observationFromJSON.obsDatetime); + } + + if (StringUtils.isNotEmpty(encounterUuid)) { + observation.setEncounter(encounterService.getEncounterByUuid(configName, encounterUuid)); + } + if (StringUtils.isNotEmpty(conceptUuid)) { + observation.setConcept(conceptService.getConceptByUuid(configName, conceptUuid)); + } + if (obsDatetime != null) { + observation.setObsDatetime(obsDatetime.toDate()); + } + if (comment != null) { + observation.setComment(comment); + } + + observationService.createObservation(configName, observation); + } + @Override public Visit createVisit(String configName, String patientUuid, DateTime startDatetime, DateTime stopDatetime, String visitTypeUuid, String locationName) { @@ -414,4 +466,18 @@ public void setEventRelay(EventRelay eventRelay) { public void setVisitService(OpenMRSVisitService visitService) { this.visitService = visitService; } + + @Autowired + public void setObservationService(OpenMRSObservationService observationService) { + this.observationService = observationService; + } + + private class ObservationFromJSON { + private String person; + private Date obsDatetime; + private String concept; + private String encounter; + private String value; + private List groupsMembers; + } } diff --git a/openmrs/src/main/resources/webapp/messages/messages.properties b/openmrs/src/main/resources/webapp/messages/messages.properties index 52dfb5992..be047a13b 100644 --- a/openmrs/src/main/resources/webapp/messages/messages.properties +++ b/openmrs/src/main/resources/webapp/messages/messages.properties @@ -92,6 +92,12 @@ openMRS.address.startDate=Start Date openMRS.address.endDate=End Date openMRS.address.fullAddress=Full Address +#Observation +openMRS.observationJSON=Observation JSON +openMRS.concept.uuid=Concept UUID +openMRS.obsDatetime=Observation Datetime +openMRS.comment=Comment + #Visit openMRS.visit.uuid=Visit UUID openMRS.visit.startDatetime=Start datetime From c0b9981f98034698219fe4a244a52e404c4db5e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Albecki?= Date: Wed, 21 Sep 2016 18:42:40 +0200 Subject: [PATCH 041/202] MOTECH-2903: refactor code and write unit tests --- openmrs/pom.xml | 6 ++ .../openmrs/domain/Observation.java | 23 ++++- .../openmrs/resource/ObservationResource.java | 10 ++ .../impl/ObservationResourceImpl.java | 17 ++++ .../service/OpenMRSObservationService.java | 10 ++ .../impl/OpenMRSObservationServiceImpl.java | 13 +++ .../tasks/OpenMRSActionProxyService.java | 8 +- .../impl/OpenMRSActionProxyServiceImpl.java | 66 +++---------- .../it/MRSTasksIntegrationBundleIT.java | 2 +- .../MRSTaskIntegrationBundle1_12IT.java | 2 +- .../impl/ObservationResourceImplTest.java | 51 +++++++++- .../impl/OpenMRSActionProxyServiceTest.java | 97 ++++++++++++++++++- .../observation/observation-response.json | 12 +++ .../json/observation/prepare-observation.json | 6 ++ 14 files changed, 263 insertions(+), 60 deletions(-) create mode 100644 openmrs/src/test/resources/json/observation/observation-response.json create mode 100644 openmrs/src/test/resources/json/observation/prepare-observation.json diff --git a/openmrs/pom.xml b/openmrs/pom.xml index d55f2cf91..6b098fc12 100644 --- a/openmrs/pom.xml +++ b/openmrs/pom.xml @@ -39,6 +39,12 @@ com.google.code.gson org.motechproject.com.google.code.gson + + + org.json + json + 20140107 + org.apache.commons com.springsource.org.apache.commons.httpclient diff --git a/openmrs/src/main/java/org/motechproject/openmrs/domain/Observation.java b/openmrs/src/main/java/org/motechproject/openmrs/domain/Observation.java index 15b197d08..f009af11c 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/domain/Observation.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/domain/Observation.java @@ -1,10 +1,14 @@ package org.motechproject.openmrs.domain; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; import com.google.gson.JsonPrimitive; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; +import org.motechproject.openmrs.util.JsonUtils; import java.lang.reflect.Type; import java.text.SimpleDateFormat; @@ -17,6 +21,7 @@ * a moment in time. */ public class Observation { + private static final String DISPLAY_KEY = "display"; private String uuid; private String display; @@ -197,10 +202,26 @@ public boolean equals(Object o) { * Implementation of the {@link JsonSerializer} interface for the * {@link Observation.ObservationValue} class. */ - public static class ObservationValueSerializer implements JsonSerializer { + public static class ObservationValueSerializer implements JsonSerializer, JsonDeserializer { + @Override public JsonElement serialize(ObservationValue src, Type typeOfSrc, JsonSerializationContext context) { return new JsonPrimitive(src.getDisplay()); } + + @Override + public ObservationValue deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + + if (json.isJsonObject()) { + return (ObservationValue) JsonUtils.readJson(json.toString(), ObservationValue.class); + } else { + Double valueDouble = json.getAsDouble(); + JsonObject valueObject = new JsonObject(); + valueObject.addProperty(DISPLAY_KEY, valueDouble); + + return (ObservationValue) JsonUtils.readJson(valueObject.toString(), ObservationValue.class); + } + } + } } diff --git a/openmrs/src/main/java/org/motechproject/openmrs/resource/ObservationResource.java b/openmrs/src/main/java/org/motechproject/openmrs/resource/ObservationResource.java index 6a584578b..efc5e0749 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/resource/ObservationResource.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/resource/ObservationResource.java @@ -48,6 +48,16 @@ public interface ObservationResource { */ Observation createObservation(Config config, Observation observation); + /** + * Creates the given observation on the OpenMRS server. The given {@code config} will be used while performing this + * action. + * + * @param config the configuration to be used while performing this action + * @param observationJson the observation json to be created + * @return the saved observation + */ + Observation createObservationFromJson(Config config, String observationJson); + /** * Deletes the observation with the given UUID. The given {@code config} will be used while performing this action. * diff --git a/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/ObservationResourceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/ObservationResourceImpl.java index 6ba9812eb..2fdca09f7 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/ObservationResourceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/ObservationResourceImpl.java @@ -15,6 +15,10 @@ import org.springframework.stereotype.Component; import org.springframework.web.client.RestOperations; +import java.lang.reflect.Type; +import java.util.HashMap; +import java.util.Map; + @Component public class ObservationResourceImpl extends BaseResource implements ObservationResource { @@ -51,6 +55,12 @@ public Observation createObservation(Config config, Observation observation) { return (Observation) JsonUtils.readJson(responseJson, Observation.class); } + @Override + public Observation createObservationFromJson(Config config, String observationJson) { + String responseJson = postForJson(config, observationJson, "/obs"); + return (Observation) JsonUtils.readJsonWithAdapters(responseJson, Observation.class, createValueAdapter()); + } + @Override public void deleteObservation(Config config, String uuid) { delete(config, "/obs/{uuid}?purge", uuid); @@ -63,4 +73,11 @@ private Gson buildGson() { .registerTypeAdapter(Person.class, new Person.PersonSerializer()) .setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ").create(); } + + private Map createValueAdapter() { + Map valueAdapter = new HashMap<>(); + valueAdapter.put(Observation.ObservationValue.class, new Observation.ObservationValueSerializer()); + + return valueAdapter; + } } diff --git a/openmrs/src/main/java/org/motechproject/openmrs/service/OpenMRSObservationService.java b/openmrs/src/main/java/org/motechproject/openmrs/service/OpenMRSObservationService.java index 5f85a2d2f..bcc0d0c4a 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/service/OpenMRSObservationService.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/service/OpenMRSObservationService.java @@ -63,6 +63,16 @@ public interface OpenMRSObservationService { */ Observation createObservation(String configName, Observation observation); + /** + * Creates the given {@code observation} on the OpenMRS server. Configuration with the given {@code configName} will + * be used while performing this action. + * + * @param configName the name of the configuration + * @param observationJson the observation json to be created + * @return the created observation + */ + Observation createObservationFromJson(String configName, String observationJson); + /** * Deletes the observation with the given {@code uuid} from the OpenMRS server. If the observation with the given * {@code uuid} doesn't exist an error will be logged. Configuration with the given {@code configName} will be used diff --git a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSObservationServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSObservationServiceImpl.java index bc201ac0a..dee924a8a 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSObservationServiceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSObservationServiceImpl.java @@ -117,7 +117,20 @@ public Observation createObservation(String configName, Observation observation) Observation created = obsResource.createObservation(config, observation); eventRelay.sendEventMessage(new MotechEvent(EventKeys.CREATED_NEW_OBSERVATION_SUBJECT, EventHelper.observationParameters(created))); return created; + } catch (HttpClientErrorException e) { + LOGGER.error("Error while creating observation!"); + return null; + } + } + @Override + public Observation createObservationFromJson(String configName, String observationJson) { + try { + Config config = configService.getConfigByName(configName); + + Observation created = obsResource.createObservationFromJson(config, observationJson); + eventRelay.sendEventMessage(new MotechEvent(EventKeys.CREATED_NEW_OBSERVATION_SUBJECT, EventHelper.observationParameters(created))); + return created; } catch (HttpClientErrorException e) { LOGGER.error("Error while creating observation!"); return null; diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSActionProxyService.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSActionProxyService.java index 29fe195e8..538a3e0e7 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSActionProxyService.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSActionProxyService.java @@ -2,6 +2,7 @@ import org.joda.time.DateTime; import org.motechproject.openmrs.domain.Encounter; +import org.motechproject.openmrs.domain.Observation; import org.motechproject.openmrs.domain.Patient; import org.motechproject.openmrs.domain.Visit; @@ -92,16 +93,15 @@ Patient createPatient(String configName, String givenName, String middleName, St * Creates an observation from given {@code observationJSON}. The observationJSON is the only required field. Other * params are optional and will overwrite any matching key of {@code observationJSON}. Configuration with * the given {@code configName} will be used while performing this action. - * - * @param configName the name of the configuration + * @param configName the name of the configuration * @param observationJSON the observation in JSON * @param encounterUuid the encounter uuid * @param conceptUuid the concept uuid * @param obsDatetime the observation datetime * @param comment the comment */ - void createObservationJSON(String configName, String observationJSON, String encounterUuid, String conceptUuid, - DateTime obsDatetime, String comment); + Observation createObservationJSON(String configName, String observationJSON, String encounterUuid, String conceptUuid, + DateTime obsDatetime, String comment); /** * Creates a visit with the given {@code patientUuid}, {@code visitStartDatetime}, diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java index 2cac9a6a2..81961aafd 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java @@ -3,6 +3,9 @@ import org.apache.commons.collections.MapUtils; import org.apache.commons.lang.StringUtils; import org.joda.time.DateTime; +import org.joda.time.format.DateTimeFormat; +import org.joda.time.format.DateTimeFormatter; +import org.json.JSONObject; import org.motechproject.event.MotechEvent; import org.motechproject.event.listener.EventRelay; import org.motechproject.openmrs.domain.Attribute; @@ -35,7 +38,6 @@ import org.motechproject.openmrs.service.OpenMRSVisitService; import org.motechproject.openmrs.tasks.OpenMRSActionProxyService; import org.motechproject.openmrs.tasks.constants.EventSubjects; -import org.motechproject.openmrs.util.JsonUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -43,7 +45,6 @@ import java.util.ArrayList; import java.util.Collections; -import java.util.Date; import java.util.List; import java.util.Map; import java.util.Objects; @@ -71,8 +72,8 @@ public class OpenMRSActionProxyServiceImpl implements OpenMRSActionProxyService @Override public Encounter createEncounter(String configName, DateTime encounterDatetime, String encounterType, - String locationName, String patientUuid, String providerUuid, String visitUuid, - Map observations) { + String locationName, String patientUuid, String providerUuid, String visitUuid, + Map observations) { Location location = getLocationByName(configName, locationName); Patient patient = patientService.getPatientByUuid(configName, patientUuid); Provider provider = providerService.getProviderByUuid(configName, providerUuid); @@ -144,52 +145,26 @@ public void updatePerson(String configName, String personUuid, String givenName, personService.updatePerson(configName, person); } - @Override //NO CHECKSTYLE Cyclomatic Complexity - public void createObservationJSON(String configName, String observationJSON, String encounterUuid, String conceptUuid, - DateTime obsDatetime, String comment) { - Observation observation = new Observation(); - ObservationFromJSON observationFromJSON = (ObservationFromJSON) JsonUtils.readJson(observationJSON, ObservationFromJSON.class); - - if (observationFromJSON.groupsMembers != null) { - List groupsMembers = new ArrayList<>(); - for (String obsUuid : observationFromJSON.groupsMembers) { - groupsMembers.add(observationService.getObservationByUuid(configName, obsUuid)); - } - if (!groupsMembers.isEmpty()) { - observation.setGroupsMembers(groupsMembers); - } - } - - if (StringUtils.isNotEmpty(observationFromJSON.person)) { - observation.setPerson(personService.getPersonByUuid(configName, observationFromJSON.person)); - } - if (StringUtils.isNotEmpty(observationFromJSON.concept)) { - observation.setConcept(conceptService.getConceptByUuid(configName, observationFromJSON.concept)); - } - if (StringUtils.isNotEmpty(observationFromJSON.value)) { - observation.setValue(new Observation.ObservationValue(observationFromJSON.value)); - } - if (StringUtils.isNotEmpty(observationFromJSON.encounter)) { - observation.setEncounter(encounterService.getEncounterByUuid(configName, observationFromJSON.encounter)); - } - if (observationFromJSON.obsDatetime != null) { - observation.setObsDatetime(observationFromJSON.obsDatetime); - } + @Override + public Observation createObservationJSON(String configName, String observationJSON, String encounterUuid, String conceptUuid, + DateTime obsDatetime, String comment) { + JSONObject obj = new JSONObject(observationJSON); if (StringUtils.isNotEmpty(encounterUuid)) { - observation.setEncounter(encounterService.getEncounterByUuid(configName, encounterUuid)); + obj.put("encounter", encounterUuid); } if (StringUtils.isNotEmpty(conceptUuid)) { - observation.setConcept(conceptService.getConceptByUuid(configName, conceptUuid)); + obj.put("concept", conceptUuid); } if (obsDatetime != null) { - observation.setObsDatetime(obsDatetime.toDate()); + DateTimeFormatter fullDateTimeFormatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + obj.put("obsDatetime", obsDatetime.toString(fullDateTimeFormatter)); } - if (comment != null) { - observation.setComment(comment); + if (StringUtils.isNotEmpty(comment)) { + obj.put("comment", comment); } - observationService.createObservation(configName, observation); + return observationService.createObservationFromJson(configName, obj.toString()); } @Override @@ -471,13 +446,4 @@ public void setVisitService(OpenMRSVisitService visitService) { public void setObservationService(OpenMRSObservationService observationService) { this.observationService = observationService; } - - private class ObservationFromJSON { - private String person; - private Date obsDatetime; - private String concept; - private String encounter; - private String value; - private List groupsMembers; - } } diff --git a/openmrs/src/test/java/org/motechproject/openmrs/it/MRSTasksIntegrationBundleIT.java b/openmrs/src/test/java/org/motechproject/openmrs/it/MRSTasksIntegrationBundleIT.java index 3820f8271..d35646135 100644 --- a/openmrs/src/test/java/org/motechproject/openmrs/it/MRSTasksIntegrationBundleIT.java +++ b/openmrs/src/test/java/org/motechproject/openmrs/it/MRSTasksIntegrationBundleIT.java @@ -30,12 +30,12 @@ import org.motechproject.openmrs.service.OpenMRSProviderService; import org.motechproject.openmrs.service.OpenMRSVisitService; import org.motechproject.openmrs.tasks.constants.Keys; +import org.motechproject.tasks.domain.enums.TaskActivityType; import org.motechproject.tasks.domain.mds.task.DataSource; import org.motechproject.tasks.domain.mds.task.Lookup; import org.motechproject.tasks.domain.mds.task.Task; import org.motechproject.tasks.domain.mds.task.TaskActionInformation; import org.motechproject.tasks.domain.mds.task.TaskActivity; -import org.motechproject.tasks.domain.enums.TaskActivityType; import org.motechproject.tasks.domain.mds.task.TaskConfig; import org.motechproject.tasks.domain.mds.task.TaskConfigStep; import org.motechproject.tasks.domain.mds.task.TaskTriggerInformation; diff --git a/openmrs/src/test/java/org/motechproject/openmrs/it/version1_12/MRSTaskIntegrationBundle1_12IT.java b/openmrs/src/test/java/org/motechproject/openmrs/it/version1_12/MRSTaskIntegrationBundle1_12IT.java index 20ae8f9de..676ef6f64 100644 --- a/openmrs/src/test/java/org/motechproject/openmrs/it/version1_12/MRSTaskIntegrationBundle1_12IT.java +++ b/openmrs/src/test/java/org/motechproject/openmrs/it/version1_12/MRSTaskIntegrationBundle1_12IT.java @@ -21,12 +21,12 @@ import org.motechproject.openmrs.service.OpenMRSPatientService; import org.motechproject.openmrs.service.OpenMRSProgramEnrollmentService; import org.motechproject.openmrs.tasks.constants.Keys; +import org.motechproject.tasks.domain.enums.TaskActivityType; import org.motechproject.tasks.domain.mds.task.DataSource; import org.motechproject.tasks.domain.mds.task.Lookup; import org.motechproject.tasks.domain.mds.task.Task; import org.motechproject.tasks.domain.mds.task.TaskActionInformation; import org.motechproject.tasks.domain.mds.task.TaskActivity; -import org.motechproject.tasks.domain.enums.TaskActivityType; import org.motechproject.tasks.domain.mds.task.TaskConfig; import org.motechproject.tasks.domain.mds.task.TaskConfigStep; import org.motechproject.tasks.domain.mds.task.TaskTriggerInformation; diff --git a/openmrs/src/test/java/org/motechproject/openmrs/resource/impl/ObservationResourceImplTest.java b/openmrs/src/test/java/org/motechproject/openmrs/resource/impl/ObservationResourceImplTest.java index eae040edb..65c2f93a6 100644 --- a/openmrs/src/test/java/org/motechproject/openmrs/resource/impl/ObservationResourceImplTest.java +++ b/openmrs/src/test/java/org/motechproject/openmrs/resource/impl/ObservationResourceImplTest.java @@ -1,7 +1,9 @@ package org.motechproject.openmrs.resource.impl; +import com.google.gson.JsonObject; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpState; +import org.joda.time.DateTime; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; @@ -9,13 +11,17 @@ import org.mockito.Mock; import org.motechproject.openmrs.config.Config; import org.motechproject.openmrs.config.ConfigDummyData; +import org.motechproject.openmrs.domain.Observation; import org.motechproject.openmrs.domain.ObservationListResult; import org.motechproject.openmrs.resource.ObservationResource; +import org.motechproject.openmrs.util.JsonUtils; import org.springframework.http.HttpEntity; import org.springframework.http.HttpMethod; import org.springframework.web.client.RestOperations; import java.net.URI; +import java.util.Date; +import java.util.List; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.nullValue; @@ -30,12 +36,14 @@ public class ObservationResourceImplTest extends AbstractResourceImplTest { private static final String OBSERVATION_LIST_RESPONSE_JSON = "json/observation/observation-list-response.json"; + private static final String OBSERVATION_RESPONSE_JSON = "json/observation/observation-response.json"; + private static final String PREPARE_OBSERVATION_JSON = "json/observation/prepare-observation.json"; + @Mock private RestOperations restOperations; @Mock private HttpClient httpClient; - @Captor private ArgumentCaptor> requestCaptor; @@ -69,4 +77,45 @@ public void shouldQueryForObservationByPatientId() throws Exception { assertThat(requestCaptor.getValue().getBody(), nullValue()); } + @Test + public void shouldCreateObservation() throws Exception { + String observationJson = prepareObservationJson(); + ObservationFromJSON observation = prepareObservation(); + + URI url = config.toInstancePath("/obs"); + + when(restOperations.exchange(eq(url), eq(HttpMethod.POST), any(HttpEntity.class), eq(String.class))) + .thenReturn(getResponseFromFile(OBSERVATION_RESPONSE_JSON)); + + Observation created = observationResource.createObservationFromJson(config, observationJson); + + verify(restOperations).exchange(eq(url), eq(HttpMethod.POST), requestCaptor.capture(), eq(String.class)); + + assertThat(created.getPerson().getUuid(), equalTo(observation.person)); + assertThat(created.getConcept().getUuid(), equalTo(observation.concept)); + assertThat(created.getObsDatetime(), equalTo(new DateTime(observation.obsDatetime).toDate())); + assertThat(Double.parseDouble(created.getValue().getDisplay()), equalTo(Double.parseDouble(observation.value))); + + assertThat(requestCaptor.getValue().getHeaders(), equalTo(getHeadersForPost(config))); + assertThat(JsonUtils.readJson(requestCaptor.getValue().getBody(), JsonObject.class), + equalTo(readFromFile(PREPARE_OBSERVATION_JSON, JsonObject.class))); + } + + private String prepareObservationJson() throws Exception { + return readJsonFromFile(PREPARE_OBSERVATION_JSON); + } + + private ObservationFromJSON prepareObservation() throws Exception { + return (ObservationFromJSON) readFromFile(PREPARE_OBSERVATION_JSON, ObservationFromJSON.class); + } + + private class ObservationFromJSON { + private String person; + private Date obsDatetime; + private String concept; + private String encounter; + private String value; + private List groupsMembers; + } + } diff --git a/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java b/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java index 07109b15b..c8929757b 100644 --- a/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java +++ b/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java @@ -1,6 +1,9 @@ package org.motechproject.openmrs.tasks.impl; import org.joda.time.DateTime; +import org.joda.time.format.DateTimeFormat; +import org.joda.time.format.DateTimeFormatter; +import org.json.JSONObject; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; @@ -33,6 +36,7 @@ import org.motechproject.openmrs.service.OpenMRSConceptService; import org.motechproject.openmrs.service.OpenMRSEncounterService; import org.motechproject.openmrs.service.OpenMRSLocationService; +import org.motechproject.openmrs.service.OpenMRSObservationService; import org.motechproject.openmrs.service.OpenMRSPatientService; import org.motechproject.openmrs.service.OpenMRSPersonService; import org.motechproject.openmrs.service.OpenMRSProgramEnrollmentService; @@ -59,6 +63,8 @@ public class OpenMRSActionProxyServiceTest { private static final String CONFIG_NAME = "Configuration name"; + private static final DateTimeFormatter fullDateTimeFormatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + @Mock private OpenMRSConceptService conceptService; @@ -75,6 +81,9 @@ public class OpenMRSActionProxyServiceTest { @Mock private OpenMRSPersonService personService; + @Mock + private OpenMRSObservationService observationService; + @Mock private OpenMRSVisitService visitService; @@ -96,6 +105,9 @@ public class OpenMRSActionProxyServiceTest { @Captor private ArgumentCaptor personCaptor; + @Captor + private ArgumentCaptor observationCaptor; + @Captor private ArgumentCaptor visitCaptor; @@ -125,7 +137,7 @@ public void shouldCreateEncounterWithGivenParameters() { DateTime encounterDatetime = new DateTime("2000-08-16T07:22:05Z"); Map observations = new HashMap<>(); - observations.put("testConceptName","testObservationValueName0"); + observations.put("testConceptName", "testObservationValueName0"); List obsList = createObservationList(1); @@ -166,7 +178,7 @@ public void shouldCreateEncounterWithGivenParametersWithoutObsWithEmptyValue() { DateTime encounterDatetime = new DateTime("2000-08-16T07:22:05Z"); Map observations = new HashMap<>(); - observations.put("testConceptName",""); + observations.put("testConceptName", ""); List obsList = new ArrayList<>(); @@ -207,6 +219,7 @@ public void shouldCreateEncounterWithGivenParametersWithObsWithManyValues() { DateTime encounterDatetime = new DateTime("2000-08-16T07:22:05Z"); Map observations = new HashMap<>(); + /* Empty value in observations should not be included */ observations.put("testConceptName","testObservationValueName0, ,testObservationValueName1"); @@ -395,6 +408,86 @@ public void shouldUpdatePatientIdentifiers() { assertEquals("CommCare CaseID", patientCaptorIdentifier.getIdentifierType().getName()); } + @Test + public void shouldCreateObservationWithGivenJsonParameter() { + JSONObject observationObject = new JSONObject(); + + String encounterUuid = "10"; + String conceptUuid = "20"; + String obsDatetime = "2016-07-29T18:29:50.000+0800"; + String comment = "testComment"; + + observationObject.put("encounter", encounterUuid); + observationObject.put("concept", conceptUuid); + observationObject.put("obsDatetime", obsDatetime); + observationObject.put("comment", comment); + String observationJSON = observationObject.toString(); + + Encounter encounter = new Encounter(); + encounter.setUuid(encounterUuid); + + Concept concept = new Concept(); + concept.setUuid(conceptUuid); + + Observation observation = new Observation(); + observation.setEncounter(encounter); + observation.setConcept(concept); + observation.setObsDatetime(new DateTime(obsDatetime).toDate()); + observation.setComment(comment); + + doReturn(observation).when(observationService).createObservationFromJson(eq(CONFIG_NAME), + eq(observationJSON)); + + Observation obsCreated = openMRSActionProxyService.createObservationJSON(CONFIG_NAME, observationJSON, null, null, null, null); + + assertEquals(observation, obsCreated); + } + + + @Test + public void shouldCreateObservationWithReplacedParameters() { + JSONObject observationObject = new JSONObject(); + + String encounterUuid = "10"; + String conceptUuid = "20"; + String obsDatetime = "2016-07-29T18:29:50.000+0800"; + String comment = "testComment"; + String value = "testValue"; + + String encounterUuidReplace = "100"; + String conceptUuidReplace = "200"; + String obsDatetimeReplace = "2010-07-29T18:29:50.000+0800"; + String commentReplace = "testComment2"; + + observationObject.put("encounter", encounterUuid); + observationObject.put("concept", conceptUuid); + observationObject.put("obsDatetime", obsDatetime); + observationObject.put("comment", comment); + observationObject.put("value", value); + String observationJSON = observationObject.toString(); + + observationObject = new JSONObject(); + observationObject.put("encounter", encounterUuidReplace); + observationObject.put("concept", conceptUuidReplace); + observationObject.put("obsDatetime", new DateTime(obsDatetimeReplace).toString(fullDateTimeFormatter)); + observationObject.put("comment", commentReplace); + observationObject.put("value", value); + String observationJSONReplace = observationObject.toString(); + + Encounter encounter = new Encounter(); + encounter.setUuid(encounterUuid); + + Concept concept = new Concept(); + concept.setUuid(conceptUuid); + + openMRSActionProxyService.createObservationJSON(CONFIG_NAME, observationJSON, + encounterUuidReplace, conceptUuidReplace, new DateTime(obsDatetimeReplace), commentReplace); + + verify(observationService).createObservationFromJson(eq(CONFIG_NAME), observationCaptor.capture()); + assertEquals(observationJSONReplace, observationCaptor.getValue()); + } + + @Test public void shouldCreateVisitWithRequiredGivenParameters() { Patient patient = new Patient(); diff --git a/openmrs/src/test/resources/json/observation/observation-response.json b/openmrs/src/test/resources/json/observation/observation-response.json new file mode 100644 index 000000000..58f86957b --- /dev/null +++ b/openmrs/src/test/resources/json/observation/observation-response.json @@ -0,0 +1,12 @@ +{ + "uuid": "01a4703c-f89f-4316-803b-dc9d08da5a0a", + "display": "TestConcept: 1", + "concept": { + "uuid": "b8be9fcf-91bc-41c5-ba8e-0434343990a2" + }, + "person": { + "uuid": "c10463d2-a811-4a4b-a3d9-76a932ba6e75" + }, + "obsDatetime": "2016-07-29T10:29:50.000+0000", + "value": 1.0 +} \ No newline at end of file diff --git a/openmrs/src/test/resources/json/observation/prepare-observation.json b/openmrs/src/test/resources/json/observation/prepare-observation.json new file mode 100644 index 000000000..6fefd190c --- /dev/null +++ b/openmrs/src/test/resources/json/observation/prepare-observation.json @@ -0,0 +1,6 @@ +{ + "person": "c10463d2-a811-4a4b-a3d9-76a932ba6e75", + "obsDatetime": "2016-07-29T18:29:50.000+0800", + "concept": "b8be9fcf-91bc-41c5-ba8e-0434343990a2", + "value": 1 +} \ No newline at end of file From bd309058c29add3cd22181de9f8daa6b40e1d5e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Albecki?= Date: Fri, 23 Sep 2016 13:13:06 +0200 Subject: [PATCH 042/202] MOTECH-2903: fixes after review --- openmrs/pom.xml | 12 +++---- .../openmrs/domain/Observation.java | 24 +++++++------ .../openmrs/resource/impl/BaseResource.java | 4 +-- .../impl/ObservationResourceImpl.java | 2 +- .../impl/OpenMRSObservationServiceImpl.java | 4 +-- .../openmrs/tasks/builder/ActionBuilder.java | 10 +++++- .../impl/OpenMRSActionProxyServiceImpl.java | 14 ++++---- .../impl/OpenMRSActionProxyServiceTest.java | 36 +++++++++---------- 8 files changed, 57 insertions(+), 49 deletions(-) diff --git a/openmrs/pom.xml b/openmrs/pom.xml index 6b098fc12..e5960f954 100644 --- a/openmrs/pom.xml +++ b/openmrs/pom.xml @@ -1,4 +1,5 @@ - + 4.0.0 modules @@ -39,12 +40,6 @@ com.google.code.gson org.motechproject.com.google.code.gson - - - org.json - json - 20140107 - org.apache.commons com.springsource.org.apache.commons.httpclient @@ -244,7 +239,8 @@ copy-resources - ${user.home}/.motech/config/org.motechproject.openmrs/raw + ${user.home}/.motech/config/org.motechproject.openmrs/raw + true diff --git a/openmrs/src/main/java/org/motechproject/openmrs/domain/Observation.java b/openmrs/src/main/java/org/motechproject/openmrs/domain/Observation.java index f009af11c..a93bc0154 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/domain/Observation.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/domain/Observation.java @@ -202,26 +202,28 @@ public boolean equals(Object o) { * Implementation of the {@link JsonSerializer} interface for the * {@link Observation.ObservationValue} class. */ - public static class ObservationValueSerializer implements JsonSerializer, JsonDeserializer { + public static class ObservationValueSerializer implements JsonSerializer { @Override public JsonElement serialize(ObservationValue src, Type typeOfSrc, JsonSerializationContext context) { return new JsonPrimitive(src.getDisplay()); } + } + + /** + * Implementation of the {@link JsonDeserializer} interface for the + * {@link Observation.ObservationValue} class. + */ + public static class ObservationValueDeSerializer implements JsonDeserializer { @Override public ObservationValue deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + String value = json.getAsString(); + JsonObject valueObject = new JsonObject(); + valueObject.addProperty(DISPLAY_KEY, value); - if (json.isJsonObject()) { - return (ObservationValue) JsonUtils.readJson(json.toString(), ObservationValue.class); - } else { - Double valueDouble = json.getAsDouble(); - JsonObject valueObject = new JsonObject(); - valueObject.addProperty(DISPLAY_KEY, valueDouble); - - return (ObservationValue) JsonUtils.readJson(valueObject.toString(), ObservationValue.class); - } + return (ObservationValue) JsonUtils.readJson(valueObject.toString(), ObservationValue.class); } - } + } diff --git a/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/BaseResource.java b/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/BaseResource.java index db6379fb7..e88f7bbc8 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/BaseResource.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/BaseResource.java @@ -3,14 +3,14 @@ import org.apache.commons.codec.binary.Base64; import org.apache.commons.httpclient.HttpClient; import org.motechproject.openmrs.config.Config; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestOperations; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.net.URI; import java.util.Arrays; diff --git a/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/ObservationResourceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/ObservationResourceImpl.java index 2fdca09f7..45d91f8f3 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/ObservationResourceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/ObservationResourceImpl.java @@ -76,7 +76,7 @@ private Gson buildGson() { private Map createValueAdapter() { Map valueAdapter = new HashMap<>(); - valueAdapter.put(Observation.ObservationValue.class, new Observation.ObservationValueSerializer()); + valueAdapter.put(Observation.ObservationValue.class, new Observation.ObservationValueDeSerializer()); return valueAdapter; } diff --git a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSObservationServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSObservationServiceImpl.java index dee924a8a..6b4e8538e 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSObservationServiceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSObservationServiceImpl.java @@ -10,6 +10,7 @@ import org.motechproject.openmrs.domain.ObservationListResult; import org.motechproject.openmrs.domain.Patient; import org.motechproject.openmrs.exception.ObservationNotFoundException; +import org.motechproject.openmrs.exception.OpenMRSException; import org.motechproject.openmrs.helper.EventHelper; import org.motechproject.openmrs.resource.ConceptResource; import org.motechproject.openmrs.resource.ObservationResource; @@ -132,8 +133,7 @@ public Observation createObservationFromJson(String configName, String observati eventRelay.sendEventMessage(new MotechEvent(EventKeys.CREATED_NEW_OBSERVATION_SUBJECT, EventHelper.observationParameters(created))); return created; } catch (HttpClientErrorException e) { - LOGGER.error("Error while creating observation!"); - return null; + throw new OpenMRSException("Error while creating observation. Response body: " + e.getResponseBodyAsString(), e); } } diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/builder/ActionBuilder.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/builder/ActionBuilder.java index d6af2f326..6d2a59f18 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/builder/ActionBuilder.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/builder/ActionBuilder.java @@ -157,7 +157,7 @@ private ActionEventRequest buildCreateObservationJSON(String configName) { actionParameters.add(prepareParameter(Keys.CONFIG_NAME, DisplayNames.CONFIG_NAME, configName, true, true, order++)); - actionParameters.add(prepareParameter(Keys.OBSERVATION_JSON, DisplayNames.OBSERVATION_JSON, TEXTAREA, true, order++)); + actionParameters.add(prepareParameter(Keys.OBSERVATION_JSON, DisplayNames.OBSERVATION_JSON, TEXTAREA, "{}", true, order++)); actionParameters.add(prepareParameter(Keys.ENCOUNTER_UUID, DisplayNames.ENCOUNTER_UUID, false, order++)); actionParameters.add(prepareParameter(Keys.CONCEPT_UUID, DisplayNames.CONCEPT_UUID, false, order++)); actionParameters.add(prepareParameter(Keys.OBSERVATION_DATETIME, DisplayNames.OBSERVATION_DATETIME, DATE, false, order++)); @@ -352,6 +352,14 @@ private ActionParameterRequest prepareParameter(String key, String displayName, .createActionParameterRequest(); } + private ActionParameterRequest prepareParameter(String key, String displayName, ParameterType type, String value, + boolean required, int order) { + return prepareParameterBuilder(key, displayName, required, order) + .setValue(value) + .setType(type.toString()) + .createActionParameterRequest(); + } + private ActionParameterRequest prepareParameter(String key, String displayName, String value, boolean required, boolean hidden, int order) { return prepareParameterBuilder(key, displayName, required, order) diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java index 81961aafd..8ba4d1a84 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java @@ -1,11 +1,12 @@ package org.motechproject.openmrs.tasks.impl; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; import org.apache.commons.collections.MapUtils; import org.apache.commons.lang.StringUtils; import org.joda.time.DateTime; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; -import org.json.JSONObject; import org.motechproject.event.MotechEvent; import org.motechproject.event.listener.EventRelay; import org.motechproject.openmrs.domain.Attribute; @@ -148,20 +149,21 @@ public void updatePerson(String configName, String personUuid, String givenName, @Override public Observation createObservationJSON(String configName, String observationJSON, String encounterUuid, String conceptUuid, DateTime obsDatetime, String comment) { - JSONObject obj = new JSONObject(observationJSON); + JsonParser parser = new JsonParser(); + JsonObject obj = parser.parse(observationJSON).getAsJsonObject(); if (StringUtils.isNotEmpty(encounterUuid)) { - obj.put("encounter", encounterUuid); + obj.addProperty("encounter", encounterUuid); } if (StringUtils.isNotEmpty(conceptUuid)) { - obj.put("concept", conceptUuid); + obj.addProperty("concept", conceptUuid); } if (obsDatetime != null) { DateTimeFormatter fullDateTimeFormatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); - obj.put("obsDatetime", obsDatetime.toString(fullDateTimeFormatter)); + obj.addProperty("obsDatetime", obsDatetime.toString(fullDateTimeFormatter)); } if (StringUtils.isNotEmpty(comment)) { - obj.put("comment", comment); + obj.addProperty("comment", comment); } return observationService.createObservationFromJson(configName, obj.toString()); diff --git a/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java b/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java index c8929757b..c1d530035 100644 --- a/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java +++ b/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java @@ -1,9 +1,9 @@ package org.motechproject.openmrs.tasks.impl; +import com.google.gson.JsonObject; import org.joda.time.DateTime; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; -import org.json.JSONObject; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; @@ -410,17 +410,17 @@ public void shouldUpdatePatientIdentifiers() { @Test public void shouldCreateObservationWithGivenJsonParameter() { - JSONObject observationObject = new JSONObject(); + JsonObject observationObject = new JsonObject(); String encounterUuid = "10"; String conceptUuid = "20"; String obsDatetime = "2016-07-29T18:29:50.000+0800"; String comment = "testComment"; - observationObject.put("encounter", encounterUuid); - observationObject.put("concept", conceptUuid); - observationObject.put("obsDatetime", obsDatetime); - observationObject.put("comment", comment); + observationObject.addProperty("encounter", encounterUuid); + observationObject.addProperty("concept", conceptUuid); + observationObject.addProperty("obsDatetime", obsDatetime); + observationObject.addProperty("comment", comment); String observationJSON = observationObject.toString(); Encounter encounter = new Encounter(); @@ -446,7 +446,7 @@ public void shouldCreateObservationWithGivenJsonParameter() { @Test public void shouldCreateObservationWithReplacedParameters() { - JSONObject observationObject = new JSONObject(); + JsonObject observationObject = new JsonObject(); String encounterUuid = "10"; String conceptUuid = "20"; @@ -459,19 +459,19 @@ public void shouldCreateObservationWithReplacedParameters() { String obsDatetimeReplace = "2010-07-29T18:29:50.000+0800"; String commentReplace = "testComment2"; - observationObject.put("encounter", encounterUuid); - observationObject.put("concept", conceptUuid); - observationObject.put("obsDatetime", obsDatetime); - observationObject.put("comment", comment); - observationObject.put("value", value); + observationObject.addProperty("encounter", encounterUuid); + observationObject.addProperty("concept", conceptUuid); + observationObject.addProperty("obsDatetime", obsDatetime); + observationObject.addProperty("comment", comment); + observationObject.addProperty("value", value); String observationJSON = observationObject.toString(); - observationObject = new JSONObject(); - observationObject.put("encounter", encounterUuidReplace); - observationObject.put("concept", conceptUuidReplace); - observationObject.put("obsDatetime", new DateTime(obsDatetimeReplace).toString(fullDateTimeFormatter)); - observationObject.put("comment", commentReplace); - observationObject.put("value", value); + observationObject = new JsonObject(); + observationObject.addProperty("encounter", encounterUuidReplace); + observationObject.addProperty("concept", conceptUuidReplace); + observationObject.addProperty("obsDatetime", new DateTime(obsDatetimeReplace).toString(fullDateTimeFormatter)); + observationObject.addProperty("comment", commentReplace); + observationObject.addProperty("value", value); String observationJSONReplace = observationObject.toString(); Encounter encounter = new Encounter(); From 26ee724bf12edc4c8ed3a7a70748c073e1d09acd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Artur=20Fija=C5=82?= Date: Fri, 23 Sep 2016 13:20:49 +0200 Subject: [PATCH 043/202] MOTECH-2940: Added Form class, service and resource --- .../openmrs/domain/Encounter.java | 18 +-- .../motechproject/openmrs/domain/Form.java | 103 ++++++++++++++++++ .../openmrs/helper/EventHelper.java | 2 +- .../openmrs/resource/FormResource.java | 20 ++++ .../resource/impl/FormResourceImpl.java | 26 +++++ .../openmrs/service/OpenMRSFormService.java | 16 +++ .../service/impl/OpenMRSFormServiceImpl.java | 39 +++++++ .../tasks/OpenMRSActionProxyService.java | 4 +- .../openmrs/tasks/builder/ActionBuilder.java | 4 +- .../impl/OpenMRSActionProxyServiceImpl.java | 13 ++- .../resources/META-INF/spring/blueprint.xml | 1 + .../impl/OpenMRSActionProxyServiceTest.java | 17 ++- 12 files changed, 244 insertions(+), 19 deletions(-) create mode 100644 openmrs/src/main/java/org/motechproject/openmrs/domain/Form.java create mode 100644 openmrs/src/main/java/org/motechproject/openmrs/resource/FormResource.java create mode 100644 openmrs/src/main/java/org/motechproject/openmrs/resource/impl/FormResourceImpl.java create mode 100644 openmrs/src/main/java/org/motechproject/openmrs/service/OpenMRSFormService.java create mode 100644 openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSFormServiceImpl.java diff --git a/openmrs/src/main/java/org/motechproject/openmrs/domain/Encounter.java b/openmrs/src/main/java/org/motechproject/openmrs/domain/Encounter.java index 7c25d37fb..d1e67de84 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/domain/Encounter.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/domain/Encounter.java @@ -31,7 +31,7 @@ public class Encounter { private Visit visit; private List obs; private List encounterProviders; - private String formId; + private Form form; /** * Default constructor. @@ -55,7 +55,7 @@ public Encounter(Location location, EncounterType encounterType, Date encounterD } public Encounter(Location location, EncounterType encounterType, Date encounterDatetime, Patient patient, - Visit visit, List encounterProviders, List obs, String formId) { + Visit visit, List encounterProviders, List obs, Form form) { this.location = location; this.encounterType = encounterType; this.encounterDatetime = encounterDatetime; @@ -63,7 +63,7 @@ public Encounter(Location location, EncounterType encounterType, Date encounterD this.visit = visit; this.encounterProviders = encounterProviders; this.obs = obs; - this.formId = formId; + this.form = form; } public String getUuid() { @@ -134,9 +134,9 @@ public List getObs() { return obs; } - public String getFormId() { return formId; } + public Form getForm() { return form; } - public void setFormId(String formId) { this.formId = formId; } + public void setForm(Form form) { this.form = form; } public void setObs(List obs) { this.obs = obs; @@ -144,7 +144,7 @@ public void setObs(List obs) { @Override public int hashCode() { - return Objects.hash(uuid, display, location, encounterType, encounterDatetime, patient, visit, obs, encounterProviders, formId); + return Objects.hash(uuid, display, location, encounterType, encounterDatetime, patient, visit, obs, encounterProviders, form); } @Override //NO CHECKSTYLE Cyclomatic Complexity @@ -165,7 +165,7 @@ public boolean equals(Object o) { Objects.equals(visit, encounter.visit) && Objects.equals(obs, encounter.obs) && Objects.equals(encounterProviders, encounter.encounterProviders) && - Objects.equals(formId, encounter.formId); + Objects.equals(form, encounter.form); } /** @@ -202,8 +202,8 @@ public JsonElement serialize(Encounter src, Type typeOfSrc, JsonSerializationCon if (src.visit != null) { encounter.addProperty("visit", src.getVisit().getUuid()); } - if (src.formId != null) { - encounter.addProperty("form", src.getFormId()); + if (src.form != null) { + encounter.addProperty("form", src.getForm().getUuid()); } if (src.obs != null) { final JsonElement jsonObs = context.serialize(src.getObs()); diff --git a/openmrs/src/main/java/org/motechproject/openmrs/domain/Form.java b/openmrs/src/main/java/org/motechproject/openmrs/domain/Form.java new file mode 100644 index 000000000..de747d0cb --- /dev/null +++ b/openmrs/src/main/java/org/motechproject/openmrs/domain/Form.java @@ -0,0 +1,103 @@ +package org.motechproject.openmrs.domain; + + +import java.util.Objects; + +/** + * Represents a single form. + */ +public class Form { + + private String uuid; + private String name; + private String description; + private String version; + private boolean published; + private boolean retired; + + public Form(){ + } + + public Form(String uuid, String name, String description, String version, boolean published, boolean retired) { + this.uuid = uuid; + this.name = name; + this.description = description; + this.version = version; + this.published = published; + this.retired = retired; + } + + public Form(String name, String version) { + this(null, name, null, version, false, false); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public boolean isRetired() { + return retired; + } + + public void setRetired(boolean retired) { + this.retired = retired; + } + + public boolean isPublished() { + return published; + } + + public void setPublished(boolean published) { + this.published = published; + } + + @Override + public int hashCode() { + return Objects.hash(uuid, name, description, version, published, retired); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Form form = (Form) o; + return Objects.equals(uuid, form.uuid) && + Objects.equals(name, form.name) && + Objects.equals(description, form.description) && + Objects.equals(version, form.version) && + Objects.equals(published, form.published) && + Objects.equals(retired, form.retired); + } +} diff --git a/openmrs/src/main/java/org/motechproject/openmrs/helper/EventHelper.java b/openmrs/src/main/java/org/motechproject/openmrs/helper/EventHelper.java index b1cfcf684..8aa21de5d 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/helper/EventHelper.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/helper/EventHelper.java @@ -104,7 +104,7 @@ public static Map encounterParameters(Encounter encounter) { encounterParameters.put(EventKeys.ENCOUNTER_DATE, encounter.getEncounterDatetime()); encounterParameters.put(EventKeys.ENCOUNTER_TYPE, encounter.getEncounterType().getUuid()); encounterParameters.put(EventKeys.VISIT_ID, encounter.getVisit().getUuid()); - encounterParameters.put(EventKeys.FORM_ID, encounter.getFormId()); + encounterParameters.put(EventKeys.FORM_ID, encounter.getForm().getUuid()); return encounterParameters; } diff --git a/openmrs/src/main/java/org/motechproject/openmrs/resource/FormResource.java b/openmrs/src/main/java/org/motechproject/openmrs/resource/FormResource.java new file mode 100644 index 000000000..edd63713c --- /dev/null +++ b/openmrs/src/main/java/org/motechproject/openmrs/resource/FormResource.java @@ -0,0 +1,20 @@ +package org.motechproject.openmrs.resource; + + +import org.motechproject.openmrs.config.Config; +import org.motechproject.openmrs.domain.Form; + +/** + * Interface for forms management. + */ +public interface FormResource { + + /** + * Gets the form by its UUID. The given {@code config} will be used while performing this action. + * + * @param config the name of the configuration + * @param uuid the UUID of the visit + * @return the form with the given UUID + */ + Form getFormById(Config config, String uuid); +} diff --git a/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/FormResourceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/FormResourceImpl.java new file mode 100644 index 000000000..85f4e4071 --- /dev/null +++ b/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/FormResourceImpl.java @@ -0,0 +1,26 @@ +package org.motechproject.openmrs.resource.impl; + +import org.apache.commons.httpclient.HttpClient; +import org.motechproject.openmrs.config.Config; +import org.motechproject.openmrs.domain.Form; +import org.motechproject.openmrs.resource.FormResource; +import org.motechproject.openmrs.util.JsonUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestOperations; + +@Component +public class FormResourceImpl extends BaseResource implements FormResource { + + @Autowired + public FormResourceImpl(RestOperations restOperations, HttpClient httpClient) { + super(restOperations, httpClient); + } + + @Override + public Form getFormById(Config config, String uuid) { + String responseJson = getJson(config, "/form/{uuid}", uuid); + return (Form) JsonUtils.readJson(responseJson, Form.class); + } + +} diff --git a/openmrs/src/main/java/org/motechproject/openmrs/service/OpenMRSFormService.java b/openmrs/src/main/java/org/motechproject/openmrs/service/OpenMRSFormService.java new file mode 100644 index 000000000..fb33c3b3a --- /dev/null +++ b/openmrs/src/main/java/org/motechproject/openmrs/service/OpenMRSFormService.java @@ -0,0 +1,16 @@ +package org.motechproject.openmrs.service; + +import org.motechproject.openmrs.domain.Form; + +public interface OpenMRSFormService { + + /** + * Returns the form with the given {@code uuid}. Configuration with the given {@code configName} will be used + * while performing this action. + * + * @param configName the name of the configuration + * @param uuid the UUID of the visit + * @return the form with the given UUID + */ + Form getFormByUuid(String configName, String uuid); +} diff --git a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSFormServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSFormServiceImpl.java new file mode 100644 index 000000000..459e9e124 --- /dev/null +++ b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSFormServiceImpl.java @@ -0,0 +1,39 @@ +package org.motechproject.openmrs.service.impl; + +import org.motechproject.openmrs.config.Config; +import org.motechproject.openmrs.domain.Form; +import org.motechproject.openmrs.resource.FormResource; +import org.motechproject.openmrs.service.OpenMRSConfigService; +import org.motechproject.openmrs.service.OpenMRSFormService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.client.HttpClientErrorException; + +@Service("formService") +public class OpenMRSFormServiceImpl implements OpenMRSFormService { + + private static final Logger LOGGER = LoggerFactory.getLogger(OpenMRSFormServiceImpl.class); + + @Autowired + private final OpenMRSConfigService configService; + private final FormResource formResource; + + @Autowired + public OpenMRSFormServiceImpl(OpenMRSConfigService configService, FormResource formResource) { + this.configService = configService; + this.formResource = formResource; + } + + @Override + public Form getFormByUuid(String configName, String uuid) { + try { + Config config = configService.getConfigByName(configName); + return formResource.getFormById(config, uuid); + } catch (HttpClientErrorException e) { + LOGGER.error("Error while fetching form with UUID: " + uuid); + return null; + } + } +} diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSActionProxyService.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSActionProxyService.java index 92c41f69c..bed0698a3 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSActionProxyService.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSActionProxyService.java @@ -29,12 +29,12 @@ public interface OpenMRSActionProxyService { * @param patientUuid the patient uuid * @param providerUuid the provider uuid * @param visitUuid the visit uuid + * @param formUuid the form uuid * @param observations the map of observations where concept name is a key and value from the observation is a value - * @param observations the form uuid */ Encounter createEncounter(String configName, DateTime encounterDatetime, String encounterType, String locationName, String patientUuid, String providerUuid, String visitUuid, - Map observations, String formId); + String formUuid, Map observations); /** * Creates a patient with the given params. The required fields are : {@code givenName}, {@code familyName}, diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/builder/ActionBuilder.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/builder/ActionBuilder.java index 65b28a9e4..686f9d081 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/builder/ActionBuilder.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/builder/ActionBuilder.java @@ -86,8 +86,8 @@ private ActionEventRequest buildCreateEncounterAction(String configName) { actionParameters.add(prepareParameter(Keys.PATIENT_UUID, DisplayNames.PATIENT_UUID, true, order++)); actionParameters.add(prepareParameter(Keys.PROVIDER_UUID, DisplayNames.PROVIDER_UUID, true, order++)); actionParameters.add(prepareParameter(Keys.VISIT_UUID, DisplayNames.VISIT_UUID, false, order++)); - actionParameters.add(prepareParameter(Keys.OBSERVATION, DisplayNames.OBSERVATION, MAP, false, order++)); - actionParameters.add(prepareParameter(Keys.FORM, DisplayNames.FORM, false, order)); + actionParameters.add(prepareParameter(Keys.FORM, DisplayNames.FORM, false, order++)); + actionParameters.add(prepareParameter(Keys.OBSERVATION, DisplayNames.OBSERVATION, MAP, false, order)); postActionParameters.add(prepareParameter(Keys.UUID, DisplayNames.ENCOUNTER_UUID, false, 0)); diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java index 08258d504..f80136666 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java @@ -11,6 +11,7 @@ import org.motechproject.openmrs.domain.ConceptName; import org.motechproject.openmrs.domain.Encounter; import org.motechproject.openmrs.domain.EncounterType; +import org.motechproject.openmrs.domain.Form; import org.motechproject.openmrs.domain.Identifier; import org.motechproject.openmrs.domain.IdentifierType; import org.motechproject.openmrs.domain.Location; @@ -26,6 +27,7 @@ import org.motechproject.openmrs.service.OpenMRSCohortService; import org.motechproject.openmrs.service.OpenMRSConceptService; import org.motechproject.openmrs.service.OpenMRSEncounterService; +import org.motechproject.openmrs.service.OpenMRSFormService; import org.motechproject.openmrs.service.OpenMRSLocationService; import org.motechproject.openmrs.service.OpenMRSPatientService; import org.motechproject.openmrs.service.OpenMRSPersonService; @@ -62,16 +64,18 @@ public class OpenMRSActionProxyServiceImpl implements OpenMRSActionProxyService private OpenMRSProgramEnrollmentService programEnrollmentService; private OpenMRSPersonService personService; private OpenMRSCohortService cohortService; + private OpenMRSFormService formService; private EventRelay eventRelay; @Override public Encounter createEncounter(String configName, DateTime encounterDatetime, String encounterType, String locationName, String patientUuid, String providerUuid, String visitUuid, - Map observations, String formId) { + String formUuid, Map observations) { Location location = getLocationByName(configName, locationName); Patient patient = patientService.getPatientByUuid(configName, patientUuid); Provider provider = providerService.getProviderByUuid(configName, providerUuid); + Form form = formService.getFormByUuid(configName, formUuid); Visit visit = null; if (StringUtils.isNotEmpty(visitUuid)) { visit = visitService.getVisitByUuid(configName, visitUuid); @@ -82,7 +86,7 @@ public Encounter createEncounter(String configName, DateTime encounterDatetime, EncounterType type = new EncounterType(encounterType); - Encounter encounter = new Encounter(location, type, encounterDatetime.toDate(), patient, visit, Collections.singletonList(provider.getPerson()), observationList, formId); + Encounter encounter = new Encounter(location, type, encounterDatetime.toDate(), patient, visit, Collections.singletonList(provider.getPerson()), observationList, form); return encounterService.createEncounter(configName, encounter); } @@ -412,4 +416,9 @@ public void setEventRelay(EventRelay eventRelay) { public void setVisitService(OpenMRSVisitService visitService) { this.visitService = visitService; } + + @Autowired + public void setFormService(OpenMRSFormService formService) { + this.formService = formService; + } } diff --git a/openmrs/src/main/resources/META-INF/spring/blueprint.xml b/openmrs/src/main/resources/META-INF/spring/blueprint.xml index 2f5f8c689..13bc3ff8d 100644 --- a/openmrs/src/main/resources/META-INF/spring/blueprint.xml +++ b/openmrs/src/main/resources/META-INF/spring/blueprint.xml @@ -38,6 +38,7 @@ + diff --git a/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java b/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java index 5fe26d4a8..71ce01093 100644 --- a/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java +++ b/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java @@ -18,6 +18,7 @@ import org.motechproject.openmrs.domain.ConceptName; import org.motechproject.openmrs.domain.Encounter; import org.motechproject.openmrs.domain.EncounterType; +import org.motechproject.openmrs.domain.Form; import org.motechproject.openmrs.domain.Identifier; import org.motechproject.openmrs.domain.IdentifierType; import org.motechproject.openmrs.domain.Location; @@ -32,6 +33,7 @@ import org.motechproject.openmrs.service.OpenMRSCohortService; import org.motechproject.openmrs.service.OpenMRSConceptService; import org.motechproject.openmrs.service.OpenMRSEncounterService; +import org.motechproject.openmrs.service.OpenMRSFormService; import org.motechproject.openmrs.service.OpenMRSLocationService; import org.motechproject.openmrs.service.OpenMRSPatientService; import org.motechproject.openmrs.service.OpenMRSPersonService; @@ -90,6 +92,9 @@ public class OpenMRSActionProxyServiceTest { @Mock private EventRelay eventRelay; + @Mock + private OpenMRSFormService formService; + @Captor private ArgumentCaptor patientCaptor; @@ -141,7 +146,7 @@ public void shouldCreateEncounterWithGivenParameters() { Encounter encounterCreated = openMRSActionProxyService.createEncounter(CONFIG_NAME, new DateTime(encounter.getEncounterDatetime()), encounter.getEncounterType().getName(), location.getName(), patient.getUuid(), provider.getUuid(), - visit.getUuid(), observations, null); + visit.getUuid(), null, observations); assertEquals(encounter, encounterCreated); } @@ -164,6 +169,9 @@ public void shouldCreateEncounterWithGivenParametersWithoutObsWithEmptyValue() { Visit visit = new Visit(); visit.setUuid("40"); + Form form = new Form(); + form.setUuid("50"); + DateTime encounterDatetime = new DateTime("2000-08-16T07:22:05Z"); Map observations = new HashMap<>(); observations.put("testConceptName",""); @@ -182,7 +190,7 @@ public void shouldCreateEncounterWithGivenParametersWithoutObsWithEmptyValue() { Encounter encounterCreated = openMRSActionProxyService.createEncounter(CONFIG_NAME, new DateTime(encounter.getEncounterDatetime()), encounter.getEncounterType().getName(), location.getName(), patient.getUuid(), provider.getUuid(), - visit.getUuid(), observations, null); + visit.getUuid(), form.getUuid(), observations); assertEquals(encounter, encounterCreated); } @@ -205,6 +213,9 @@ public void shouldCreateEncounterWithGivenParametersWithObsWithManyValues() { Visit visit = new Visit(); visit.setUuid("40"); + Form form = new Form(); + form.setUuid("50"); + DateTime encounterDatetime = new DateTime("2000-08-16T07:22:05Z"); Map observations = new HashMap<>(); observations.put("testConceptName","testObservationValueName0, testObservationValueName1"); @@ -223,7 +234,7 @@ public void shouldCreateEncounterWithGivenParametersWithObsWithManyValues() { Encounter encounterCreated = openMRSActionProxyService.createEncounter(CONFIG_NAME, new DateTime(encounter.getEncounterDatetime()), encounter.getEncounterType().getName(), location.getName(), patient.getUuid(), provider.getUuid(), - visit.getUuid(), observations); + visit.getUuid(), form.getUuid(), observations); assertEquals(encounter, encounterCreated); From b200f2c1f9ea073062983ab61b39a1e1c49ca625 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Artur=20Fija=C5=82?= Date: Fri, 23 Sep 2016 13:52:37 +0200 Subject: [PATCH 044/202] MOTECH-2940: Fixed error when creating encounter without form --- .../java/org/motechproject/openmrs/helper/EventHelper.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/openmrs/src/main/java/org/motechproject/openmrs/helper/EventHelper.java b/openmrs/src/main/java/org/motechproject/openmrs/helper/EventHelper.java index 7633cd969..85570e0a2 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/helper/EventHelper.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/helper/EventHelper.java @@ -104,9 +104,11 @@ public static Map encounterParameters(Encounter encounter) { if (encounter.getVisit() != null) { encounterParameters.put(EventKeys.VISIT_ID, encounter.getVisit().getUuid()); } + if (encounter.getForm() != null) { + encounterParameters.put(EventKeys.FORM_ID, encounter.getForm().getUuid()); + } encounterParameters.put(EventKeys.ENCOUNTER_DATE, encounter.getEncounterDatetime()); encounterParameters.put(EventKeys.ENCOUNTER_TYPE, encounter.getEncounterType().getUuid()); - encounterParameters.put(EventKeys.FORM_ID, encounter.getForm().getUuid()); return encounterParameters; } From 1e119e5a9ba7bad5a7ee1dbddc477d69c555ead9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Artur=20Fija=C5=82?= Date: Fri, 23 Sep 2016 13:59:55 +0200 Subject: [PATCH 045/202] MOTECH-2940: Corrections after review --- .../org/motechproject/openmrs/resource/FormResource.java | 2 +- .../openmrs/resource/impl/FormResourceImpl.java | 2 +- .../openmrs/service/impl/OpenMRSFormServiceImpl.java | 2 +- .../openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java | 5 ++++- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/openmrs/src/main/java/org/motechproject/openmrs/resource/FormResource.java b/openmrs/src/main/java/org/motechproject/openmrs/resource/FormResource.java index edd63713c..f73601530 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/resource/FormResource.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/resource/FormResource.java @@ -16,5 +16,5 @@ public interface FormResource { * @param uuid the UUID of the visit * @return the form with the given UUID */ - Form getFormById(Config config, String uuid); + Form getFormByUuid(Config config, String uuid); } diff --git a/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/FormResourceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/FormResourceImpl.java index 85f4e4071..b33d9dc42 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/FormResourceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/FormResourceImpl.java @@ -18,7 +18,7 @@ public FormResourceImpl(RestOperations restOperations, HttpClient httpClient) { } @Override - public Form getFormById(Config config, String uuid) { + public Form getFormByUuid(Config config, String uuid) { String responseJson = getJson(config, "/form/{uuid}", uuid); return (Form) JsonUtils.readJson(responseJson, Form.class); } diff --git a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSFormServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSFormServiceImpl.java index 459e9e124..08e80a11c 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSFormServiceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSFormServiceImpl.java @@ -30,7 +30,7 @@ public OpenMRSFormServiceImpl(OpenMRSConfigService configService, FormResource f public Form getFormByUuid(String configName, String uuid) { try { Config config = configService.getConfigByName(configName); - return formResource.getFormById(config, uuid); + return formResource.getFormByUuid(config, uuid); } catch (HttpClientErrorException e) { LOGGER.error("Error while fetching form with UUID: " + uuid); return null; diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java index a32db0413..1d49111a0 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java @@ -75,11 +75,14 @@ public Encounter createEncounter(String configName, DateTime encounterDatetime, Location location = getLocationByName(configName, locationName); Patient patient = patientService.getPatientByUuid(configName, patientUuid); Provider provider = providerService.getProviderByUuid(configName, providerUuid); - Form form = formService.getFormByUuid(configName, formUuid); Visit visit = null; + Form form = null; if (StringUtils.isNotEmpty(visitUuid)) { visit = visitService.getVisitByUuid(configName, visitUuid); } + if (StringUtils.isNotEmpty(formUuid)) { + form = formService.getFormByUuid(configName, formUuid); + } //While creating observations, the encounterDateTime is used as a obsDateTime. List observationList = MapUtils.isNotEmpty(observations) ? convertObservationMapToList(observations, encounterDatetime) : null; From e63556a5db46222494ac6ae3cfa4cdb44673b79f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Artur=20Fija=C5=82?= Date: Fri, 23 Sep 2016 14:37:33 +0200 Subject: [PATCH 046/202] MOTECH-2940: Fixed null form in test --- .../openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java b/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java index 90a4e6eaa..f26abcbbb 100644 --- a/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java +++ b/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java @@ -128,6 +128,9 @@ public void shouldCreateEncounterWithGivenParameters() { Visit visit = new Visit(); visit.setUuid("40"); + Form form = new Form(); + form.setUuid("50"); + DateTime encounterDatetime = new DateTime("2000-08-16T07:22:05Z"); Map observations = new HashMap<>(); observations.put("testConceptName","testObservationValueName0"); @@ -146,7 +149,7 @@ public void shouldCreateEncounterWithGivenParameters() { Encounter encounterCreated = openMRSActionProxyService.createEncounter(CONFIG_NAME, new DateTime(encounter.getEncounterDatetime()), encounter.getEncounterType().getName(), location.getName(), patient.getUuid(), provider.getUuid(), - visit.getUuid(), null, observations); + visit.getUuid(), form.getUuid(), observations); assertEquals(encounter, encounterCreated); } From 97820a2a369a0135a2461b1c59ac43cb9d33c7fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Artur=20Fija=C5=82?= Date: Mon, 26 Sep 2016 10:13:46 +0200 Subject: [PATCH 047/202] MOTECH-2940: Added unit test for Form class. --- .../resource/impl/FormResourceImplTest.java | 76 +++++++++++++++++++ .../resources/json/form/form-response.json | 33 ++++++++ 2 files changed, 109 insertions(+) create mode 100644 openmrs/src/test/java/org/motechproject/openmrs/resource/impl/FormResourceImplTest.java create mode 100644 openmrs/src/test/resources/json/form/form-response.json diff --git a/openmrs/src/test/java/org/motechproject/openmrs/resource/impl/FormResourceImplTest.java b/openmrs/src/test/java/org/motechproject/openmrs/resource/impl/FormResourceImplTest.java new file mode 100644 index 000000000..ba2dec28e --- /dev/null +++ b/openmrs/src/test/java/org/motechproject/openmrs/resource/impl/FormResourceImplTest.java @@ -0,0 +1,76 @@ +package org.motechproject.openmrs.resource.impl; + +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.HttpState; +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.Mock; +import org.motechproject.openmrs.config.Config; +import org.motechproject.openmrs.config.ConfigDummyData; +import org.motechproject.openmrs.domain.Form; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpMethod; +import org.springframework.web.client.RestOperations; + +import java.net.URI; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import static org.mockito.MockitoAnnotations.initMocks; + +/** + * Created by user on 26.09.16. + */ +public class FormResourceImplTest extends AbstractResourceImplTest { + + private static final String GET_FORM_RESPONSE_JSON = "json/form/form-response.json"; + + @Mock + private RestOperations restOperations; + + @Mock + private HttpClient httpClient; + + @Captor + private ArgumentCaptor> requestCaptor; + + private FormResourceImpl formResource; + + private Config config; + + @Before + public void setUp() { + initMocks(this); + when(httpClient.getState()).thenReturn(new HttpState()); + + formResource = new FormResourceImpl(restOperations, httpClient); + config = ConfigDummyData.prepareConfig("one"); + } + + @Test + public void shouldGetFormByUuid() throws Exception { + Form form = buildForm(); + URI url = config.toInstancePathWithParams("/form/{uuid}", form.getUuid()); + + when(restOperations.exchange(eq(url), eq(HttpMethod.GET), any(HttpEntity.class), eq(String.class))) + .thenReturn(getResponseFromFile(GET_FORM_RESPONSE_JSON)); + + Form created = formResource.getFormByUuid(config, form.getUuid()); + + verify(restOperations).exchange(eq(url), eq(HttpMethod.GET), requestCaptor.capture(), eq(String.class)); + + assertEquals(form, created); + assertEquals(getHeadersForGet(config), requestCaptor.getValue().getHeaders()); + } + + private Form buildForm() throws Exception { + return (Form) readFromFile(GET_FORM_RESPONSE_JSON, Form.class); + } + + +} diff --git a/openmrs/src/test/resources/json/form/form-response.json b/openmrs/src/test/resources/json/form/form-response.json new file mode 100644 index 000000000..33acc2515 --- /dev/null +++ b/openmrs/src/test/resources/json/form/form-response.json @@ -0,0 +1,33 @@ +{ + "uuid": "a85a55d4-c1f4-4631-b9a8-694cc0973112", + "display": "test", + "name": "test", + "description": null, + "encounterType": { + "uuid": "81da9590-3f10-11e4-adec-0800271c1b75", + "display": "ADMISSION", + "links": [ + { + "rel": "self", + "uri": "http://192.168.33.10/openmrs/ws/rest/v1/encountertype/81da9590-3f10-11e4-adec-0800271c1b75" + } + ] + }, + "version": "2", + "build": null, + "published": false, + "formFields": [], + "retired": false, + "resources": [], + "links": [ + { + "rel": "self", + "uri": "http://192.168.33.10/openmrs/ws/rest/v1/form/a85a55d4-c1f4-4631-b9a8-694cc0973112" + }, + { + "rel": "full", + "uri": "http://192.168.33.10/openmrs/ws/rest/v1/form/a85a55d4-c1f4-4631-b9a8-694cc0973112?v=full" + } + ], + "resourceVersion": "1.9" +} \ No newline at end of file From 819c527078f4a06c2759486aaa734963da41c9c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Ja=C5=BCd=C5=BCewski?= Date: Mon, 26 Sep 2016 12:07:18 +0200 Subject: [PATCH 048/202] Added more information to DEBUG log --- .../rest/service/impl/DhisWebServiceImpl.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/dhis2/src/main/java/org/motechproject/dhis2/rest/service/impl/DhisWebServiceImpl.java b/dhis2/src/main/java/org/motechproject/dhis2/rest/service/impl/DhisWebServiceImpl.java index a9a952b23..1bd954907 100644 --- a/dhis2/src/main/java/org/motechproject/dhis2/rest/service/impl/DhisWebServiceImpl.java +++ b/dhis2/src/main/java/org/motechproject/dhis2/rest/service/impl/DhisWebServiceImpl.java @@ -1,5 +1,6 @@ package org.motechproject.dhis2.rest.service.impl; +import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import org.apache.http.Header; import org.apache.http.HttpStatus; @@ -412,7 +413,14 @@ private DhisStatusResponse createEntity(Settings settings, String uri, String js DhisStatusResponse status; try (InputStream content = getContentForResponse(response)) { - status = new ObjectMapper().readValue(content, DhisStatusResponse.class); + String contentString = IOUtils.toString(content); + status = new ObjectMapper().readValue(contentString, DhisStatusResponse.class); + if (status.getStatus() == DhisStatus.ERROR) { + LOGGER.debug(String.format("DHIS2 status response error details: %s", contentString)); + String msg = String.format("Error in DHIS2 status response."); + statusMessageService.warn(msg, MODULE_NAME); + throw new DhisWebException(msg); + } } catch (IOException e) { String msg = String.format("Error parsing response from uri: %s, exception: %s", uri, e.toString()); statusMessageService.warn(msg, MODULE_NAME); @@ -421,14 +429,6 @@ private DhisStatusResponse createEntity(Settings settings, String uri, String js closeResponse(response); } - LOGGER.debug(String.format("DHIS2 status response: %s", status.getStatus().toString())); - - if (status.getStatus() == DhisStatus.ERROR) { - String msg = String.format("Error in DHIS2 status response: %s", status.getStatus().toString()); - statusMessageService.warn(msg, MODULE_NAME); - throw new DhisWebException(msg); - } - return status; } From 00b94d2e1fdfb4bd301d529510a94000c163c579 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Artur=20Fija=C5=82?= Date: Mon, 26 Sep 2016 13:23:22 +0200 Subject: [PATCH 049/202] MOTECH-2940: Changes after review. --- .../openmrs/resource/impl/FormResourceImplTest.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/openmrs/src/test/java/org/motechproject/openmrs/resource/impl/FormResourceImplTest.java b/openmrs/src/test/java/org/motechproject/openmrs/resource/impl/FormResourceImplTest.java index ba2dec28e..84c44b6f9 100644 --- a/openmrs/src/test/java/org/motechproject/openmrs/resource/impl/FormResourceImplTest.java +++ b/openmrs/src/test/java/org/motechproject/openmrs/resource/impl/FormResourceImplTest.java @@ -23,12 +23,9 @@ import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; -/** - * Created by user on 26.09.16. - */ public class FormResourceImplTest extends AbstractResourceImplTest { - private static final String GET_FORM_RESPONSE_JSON = "json/form/form-response.json"; + private static final String FORM_RESPONSE_JSON = "json/form/form-response.json"; @Mock private RestOperations restOperations; @@ -58,7 +55,7 @@ public void shouldGetFormByUuid() throws Exception { URI url = config.toInstancePathWithParams("/form/{uuid}", form.getUuid()); when(restOperations.exchange(eq(url), eq(HttpMethod.GET), any(HttpEntity.class), eq(String.class))) - .thenReturn(getResponseFromFile(GET_FORM_RESPONSE_JSON)); + .thenReturn(getResponseFromFile(FORM_RESPONSE_JSON)); Form created = formResource.getFormByUuid(config, form.getUuid()); @@ -69,7 +66,7 @@ public void shouldGetFormByUuid() throws Exception { } private Form buildForm() throws Exception { - return (Form) readFromFile(GET_FORM_RESPONSE_JSON, Form.class); + return (Form) readFromFile(FORM_RESPONSE_JSON, Form.class); } From 50525d06a7fd96573ff01724a5d99fb94f38087c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Albecki?= Date: Mon, 26 Sep 2016 13:40:51 +0200 Subject: [PATCH 050/202] MOTECH: 2903: fixes after review --- openmrs/pom.xml | 3 +-- .../java/org/motechproject/openmrs/domain/Observation.java | 2 +- .../openmrs/resource/impl/ObservationResourceImpl.java | 2 +- .../motechproject/openmrs/tasks/builder/ActionBuilder.java | 7 ++++--- .../openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/openmrs/pom.xml b/openmrs/pom.xml index e5960f954..aecb7b573 100644 --- a/openmrs/pom.xml +++ b/openmrs/pom.xml @@ -239,8 +239,7 @@ copy-resources - ${user.home}/.motech/config/org.motechproject.openmrs/raw - + ${user.home}/.motech/config/org.motechproject.openmrs/raw true diff --git a/openmrs/src/main/java/org/motechproject/openmrs/domain/Observation.java b/openmrs/src/main/java/org/motechproject/openmrs/domain/Observation.java index a93bc0154..524bc42ff 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/domain/Observation.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/domain/Observation.java @@ -214,7 +214,7 @@ public JsonElement serialize(ObservationValue src, Type typeOfSrc, JsonSerializa * Implementation of the {@link JsonDeserializer} interface for the * {@link Observation.ObservationValue} class. */ - public static class ObservationValueDeSerializer implements JsonDeserializer { + public static class ObservationValueDeserializer implements JsonDeserializer { @Override public ObservationValue deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { diff --git a/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/ObservationResourceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/ObservationResourceImpl.java index 45d91f8f3..ca125c0c6 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/ObservationResourceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/ObservationResourceImpl.java @@ -76,7 +76,7 @@ private Gson buildGson() { private Map createValueAdapter() { Map valueAdapter = new HashMap<>(); - valueAdapter.put(Observation.ObservationValue.class, new Observation.ObservationValueDeSerializer()); + valueAdapter.put(Observation.ObservationValue.class, new Observation.ObservationValueDeserializer()); return valueAdapter; } diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/builder/ActionBuilder.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/builder/ActionBuilder.java index 8bbffca04..1c108f134 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/builder/ActionBuilder.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/builder/ActionBuilder.java @@ -155,10 +155,11 @@ private ActionEventRequest buildCreateObservationJSON(String configName) { SortedSet actionParameters = new TreeSet<>(); int order = 0; String serviceMethod = "createObservationJSON"; + String defaultValueForJsonField = "{}"; - actionParameters.add(prepareParameter(Keys.CONFIG_NAME, DisplayNames.CONFIG_NAME, configName, true, true, - order++)); - actionParameters.add(prepareParameter(Keys.OBSERVATION_JSON, DisplayNames.OBSERVATION_JSON, TEXTAREA, "{}", true, order++)); + actionParameters.add(prepareParameter(Keys.CONFIG_NAME, DisplayNames.CONFIG_NAME, configName, true, true, order++)); + actionParameters.add(prepareParameter(Keys.OBSERVATION_JSON, DisplayNames.OBSERVATION_JSON, TEXTAREA, + defaultValueForJsonField, true, order++)); actionParameters.add(prepareParameter(Keys.ENCOUNTER_UUID, DisplayNames.ENCOUNTER_UUID, false, order++)); actionParameters.add(prepareParameter(Keys.CONCEPT_UUID, DisplayNames.CONCEPT_UUID, false, order++)); actionParameters.add(prepareParameter(Keys.OBSERVATION_DATETIME, DisplayNames.OBSERVATION_DATETIME, DATE, false, order++)); diff --git a/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java b/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java index 31c9b9963..ccf6d87e5 100644 --- a/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java +++ b/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java @@ -189,7 +189,7 @@ public void shouldCreateEncounterWithGivenParametersWithoutObsWithEmptyValue() { DateTime encounterDatetime = new DateTime("2000-08-16T07:22:05Z"); Map observations = new HashMap<>(); - observations.put("18ff53df-744a-4a3f-8f25-dac6de5b7131",""); + observations.put("18ff53df-744a-4a3f-8f25-dac6de5b7131", ""); List obsList = new ArrayList<>(); From c9140200ffeb55e522637d66d138fc1f3e5d0dd5 Mon Sep 17 00:00:00 2001 From: Natalia Kowalik Date: Mon, 26 Sep 2016 13:41:04 +0200 Subject: [PATCH 051/202] Added more details in exception message --- .../openmrs/service/impl/OpenMRSEncounterServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSEncounterServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSEncounterServiceImpl.java index b2c39e511..47df57ae5 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSEncounterServiceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSEncounterServiceImpl.java @@ -59,7 +59,7 @@ public Encounter createEncounter(String configName, Encounter encounter) { eventRelay.sendEventMessage(new MotechEvent(EventKeys.CREATED_NEW_ENCOUNTER_SUBJECT, EventHelper.encounterParameters(createdEncounter))); } catch (HttpClientErrorException e) { - throw new OpenMRSException("Could not create encounter with patient uuid: " + encounter.getPatient().getUuid(), e); + throw new OpenMRSException("Could not create encounter with patient uuid: " + encounter.getPatient().getUuid() + " " + e.getMessage() + " " + e.getResponseBodyAsString(), e); } return createdEncounter; From 00ce45c5e30a826991e31d861e4e0ff9b84a5fbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Ja=C5=BCd=C5=BCewski?= Date: Mon, 26 Sep 2016 14:04:57 +0200 Subject: [PATCH 052/202] Added normalization of the server URI --- .../dhis2/service/impl/SettingsServiceImpl.java | 9 ++++++--- .../dhis2/service/impl/SettingsServiceImplTest.java | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/dhis2/src/main/java/org/motechproject/dhis2/service/impl/SettingsServiceImpl.java b/dhis2/src/main/java/org/motechproject/dhis2/service/impl/SettingsServiceImpl.java index 1da83ade2..47f2478f3 100644 --- a/dhis2/src/main/java/org/motechproject/dhis2/service/impl/SettingsServiceImpl.java +++ b/dhis2/src/main/java/org/motechproject/dhis2/service/impl/SettingsServiceImpl.java @@ -17,6 +17,7 @@ import org.springframework.stereotype.Service; import java.io.InputStream; +import java.net.URI; /** @@ -60,9 +61,11 @@ private synchronized void loadSettings() { LOGGER.debug("Loading DHIS2 settings..."); Gson gson = new Gson(); settings = gson.fromJson(jsonText, Settings.class); - String uri = settings.getServerURI(); - if (uri != null && uri.endsWith("/")) { - settings.setServerURI(uri.substring(0, uri.length() - 1)); + URI uri = new URI(settings.getServerURI()); + uri = uri.normalize(); + String uriString = uri.toString(); + if (uriString != null && uriString.endsWith("/")) { + settings.setServerURI(uriString.substring(0, uriString.length() - 1)); } } catch (Exception e) { String message = "There was an error loading json from the DHIS2 settings."; diff --git a/dhis2/src/test/java/org/motechproject/dhis2/service/impl/SettingsServiceImplTest.java b/dhis2/src/test/java/org/motechproject/dhis2/service/impl/SettingsServiceImplTest.java index f5ed8564f..9fe0b2e3f 100644 --- a/dhis2/src/test/java/org/motechproject/dhis2/service/impl/SettingsServiceImplTest.java +++ b/dhis2/src/test/java/org/motechproject/dhis2/service/impl/SettingsServiceImplTest.java @@ -45,7 +45,7 @@ public void setUp() { } @Test - public void shouldParseURI() { + public void shouldRemoveTrailingSlashes() { try (InputStream is = getClass().getClassLoader().getResourceAsStream(SETTINGS_JSON)) { when(settingsFacade.getRawConfig(SETTINGS_FILE_NAME)).thenReturn(is); settingsService.updateSettings(settings); From d7955c72caa8b05b5fc195de2c05bb9188c07b06 Mon Sep 17 00:00:00 2001 From: tomaszzawadzki Date: Mon, 26 Sep 2016 14:10:57 +0200 Subject: [PATCH 053/202] Added test --- .../impl/CommcareReportServiceImplTest.java | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 commcare/src/test/java/org/motechproject/commcare/service/impl/CommcareReportServiceImplTest.java diff --git a/commcare/src/test/java/org/motechproject/commcare/service/impl/CommcareReportServiceImplTest.java b/commcare/src/test/java/org/motechproject/commcare/service/impl/CommcareReportServiceImplTest.java new file mode 100644 index 000000000..cf429dbf3 --- /dev/null +++ b/commcare/src/test/java/org/motechproject/commcare/service/impl/CommcareReportServiceImplTest.java @@ -0,0 +1,57 @@ +package org.motechproject.commcare.service.impl; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; +import org.motechproject.commcare.client.CommCareAPIHttpClient; +import org.motechproject.commcare.config.Config; +import org.motechproject.commcare.domain.report.ReportDataInfo; +import org.motechproject.commcare.service.CommcareConfigService; +import org.motechproject.commcare.util.ConfigsUtils; + +import static org.junit.Assert.assertNotNull; +import static org.mockito.Mockito.when; +import static org.mockito.MockitoAnnotations.initMocks; + +/** + * Test class for {@link CommcareReportServiceImpl} + */ +public class CommcareReportServiceImplTest { + + private CommcareReportServiceImpl reportService; + + @Mock + private CommCareAPIHttpClient commcareHttpClient; + + @Mock + private CommcareConfigService configService; + + private Config config; + + @Before + public void setUp() { + initMocks(this); + + config = ConfigsUtils.prepareConfigOne(); + + when(configService.getByName(null)).thenReturn(config); + + reportService = new CommcareReportServiceImpl(commcareHttpClient, configService); + } + + @Test + public void testReportByReportId() { + String reportId = "testId"; + + when(commcareHttpClient.singleReportDataRequest(config.getAccountConfig(), reportId)).thenReturn(individualReport()); + + ReportDataInfo reportInstance = reportService.getReportByReportId(reportId); + + assertNotNull(reportInstance); + + } + + private String individualReport() { + return "{" + " \"columns\": [" + " {" + " \"header\": \"District\"," + " \"slug\": \"district\"" + " }," + " {" + " \"header\": \"Num Children Visited\"," + " \"slug\": \"number_of_children_visited\"" + " }," + " {" + " \"header\": \"Gender-male\"," + " \"expand_column_value\": \"male\"," + " \"slug\": \"gender-male\"" + " }," + " {" + " \"header\": \"Gender-female\"," + " \"expand_column_value\": \"female\"," + " \"slug\": \"gender-female\"" + " }" + " ]," + " \"data\": [" + " {" + " \"district\": \"Middlesex\"," + " \"number_of_children_visited\": 46," + " \"gender-male\": 10," + " \"gender-female\": 35" + " }," + " {" + " \"district\": \"Suffolk\"," + " \"number_of_children_visited\": 85," + " \"gender-male\": 81," + " \"gender-female\": 4" + " }" + " ]," + " \"next_page\": \"/a/motechproject/api/v0.5/configurablereportdata/9aab0eeb88555a7b4568676883e7379a/?offset=3&limit=3&state=vermont\"," + " \"total_records\": 30" + "}"; + } +} From 74c213dde5b2a9e979600493907fd3755477fcc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Ja=C5=BCd=C5=BCewski?= Date: Mon, 26 Sep 2016 15:21:31 +0200 Subject: [PATCH 054/202] Fixed null pinter issue for URI constructor --- .../dhis2/service/impl/SettingsServiceImpl.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/dhis2/src/main/java/org/motechproject/dhis2/service/impl/SettingsServiceImpl.java b/dhis2/src/main/java/org/motechproject/dhis2/service/impl/SettingsServiceImpl.java index 47f2478f3..4083daa92 100644 --- a/dhis2/src/main/java/org/motechproject/dhis2/service/impl/SettingsServiceImpl.java +++ b/dhis2/src/main/java/org/motechproject/dhis2/service/impl/SettingsServiceImpl.java @@ -61,11 +61,13 @@ private synchronized void loadSettings() { LOGGER.debug("Loading DHIS2 settings..."); Gson gson = new Gson(); settings = gson.fromJson(jsonText, Settings.class); - URI uri = new URI(settings.getServerURI()); - uri = uri.normalize(); - String uriString = uri.toString(); - if (uriString != null && uriString.endsWith("/")) { - settings.setServerURI(uriString.substring(0, uriString.length() - 1)); + if (settings.getServerURI() != null) { + URI uri = new URI(settings.getServerURI()); + uri = uri.normalize(); + String uriString = uri.toString(); + if (uriString.endsWith("/")) { + settings.setServerURI(uriString.substring(0, uriString.length() - 1)); + } } } catch (Exception e) { String message = "There was an error loading json from the DHIS2 settings."; From dc41fd7212ccd7db117a1f7c97d4752457cbc3cd Mon Sep 17 00:00:00 2001 From: mkruszynski Date: Mon, 26 Sep 2016 16:10:31 +0200 Subject: [PATCH 055/202] MOTECH-2885: changed empty results handling --- .../openmrs/service/impl/OpenMRSObservationServiceImpl.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSObservationServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSObservationServiceImpl.java index 46aa02f60..e50e15daa 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSObservationServiceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSObservationServiceImpl.java @@ -107,10 +107,10 @@ public Observation getObservationByPatientUUIDAndConceptUUID(String configName, try { Config config = configService.getConfigByName(configName); observations = obsResource.getObservationByPatientUUIDAndConceptUUID(config, patientUUID, conceptUUID); - if (CollectionUtils.isEmpty(observations.getResults())) { - throw new OpenMRSException("There is no observations for Patient uuid: " + patientUUID + " and Concept uuid: " + conceptUUID); + if (CollectionUtils.isNotEmpty(observations.getResults())) { + return obsResource.getObservationById(config, observations.getResults().get(0).getUuid()); } - return obsResource.getObservationById(config, observations.getResults().get(0).getUuid()); + return null; } catch (HttpClientErrorException e) { LOGGER.error("Error while fetching observations with Patient uuid: " + patientUUID + " and Concept uuid: " + conceptUUID); return null; From 1e6812fbe0f5a44126cb45ac79a268c0872ba993 Mon Sep 17 00:00:00 2001 From: Jakub Redlarski Date: Mon, 26 Sep 2016 17:12:49 +0200 Subject: [PATCH 056/202] MOTECH-2888: Added Colunm and Filter types Added ColumnType, FilterType and FilterDataType enums which contain all of the valid types for report columns and filters. --- .../domain/report/ReportMetadataColumn.java | 7 +-- .../domain/report/ReportMetadataFilter.java | 14 +++--- .../domain/report/constants/ColumnType.java | 42 ++++++++++++++++++ .../report/constants/FilterDataType.java | 43 ++++++++++++++++++ .../domain/report/constants/FilterType.java | 44 +++++++++++++++++++ .../impl/CommcareReportServiceImpl.java | 11 ++++- .../impl/CommcareReportServiceImplTest.java | 3 +- 7 files changed, 152 insertions(+), 12 deletions(-) create mode 100644 commcare/src/main/java/org/motechproject/commcare/domain/report/constants/ColumnType.java create mode 100644 commcare/src/main/java/org/motechproject/commcare/domain/report/constants/FilterDataType.java create mode 100644 commcare/src/main/java/org/motechproject/commcare/domain/report/constants/FilterType.java diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataColumn.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataColumn.java index 95bc26d4c..f7aa2e25b 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataColumn.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataColumn.java @@ -1,6 +1,7 @@ package org.motechproject.commcare.domain.report; import com.google.gson.annotations.SerializedName; +import org.motechproject.commcare.domain.report.constants.ColumnType; /** * Represents a single CommCareHQ {@link ReportMetadataInfo} column. @@ -14,7 +15,7 @@ public class ReportMetadataColumn { private String display; @SerializedName("type") - private String type; + private ColumnType type; public String getId() { return id; @@ -32,11 +33,11 @@ public void setDisplay(String display) { this.display = display; } - public String getType() { + public ColumnType getType() { return type; } - public void setType(String type) { + public void setType(ColumnType type) { this.type = type; } } \ No newline at end of file diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataFilter.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataFilter.java index db51d4a87..55f8f86b1 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataFilter.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataFilter.java @@ -1,6 +1,8 @@ package org.motechproject.commcare.domain.report; import com.google.gson.annotations.SerializedName; +import org.motechproject.commcare.domain.report.constants.FilterDataType; +import org.motechproject.commcare.domain.report.constants.FilterType; /** * Represents a single CommCareHQ {@link ReportMetadataInfo} filter. @@ -8,19 +10,19 @@ public class ReportMetadataFilter { @SerializedName("datatype") - private String datatype; + private FilterDataType datatype; @SerializedName("slug") private String slug; @SerializedName("type") - private String type; + private FilterType type; - public String getDatatype() { + public FilterDataType getDatatype() { return datatype; } - public void setDatatype(String datatype) { + public void setDatatype(FilterDataType datatype) { this.datatype = datatype; } @@ -32,11 +34,11 @@ public void setSlug(String slug) { this.slug = slug; } - public String getType() { + public FilterType getType() { return type; } - public void setType(String type) { + public void setType(FilterType type) { this.type = type; } diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/ColumnType.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/ColumnType.java new file mode 100644 index 000000000..48a98151a --- /dev/null +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/ColumnType.java @@ -0,0 +1,42 @@ +package org.motechproject.commcare.domain.report.constants; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonParseException; + +import java.lang.reflect.Type; + +public enum ColumnType { + FIELD("field"), + EXPANDED("expanded"); + + private final String type; + + ColumnType(String type) { + this.type = type; + } + + public String getType() { + return type; + } + + public static ColumnType getColumnTypeFromTypeValue(String typeValue) { + ColumnType[] columnTypes = ColumnType.values(); + for (ColumnType columnType : columnTypes) { + if (columnType.getType().equals(typeValue)) { + return columnType; + } + } + throw new IllegalArgumentException("Invalid column type value: " + typeValue); + } + + public static class ColumnTypeDeserializer implements JsonDeserializer { + + @Override + public ColumnType deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + String value = json.getAsString(); + return ColumnType.getColumnTypeFromTypeValue(value); + } + } +} diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/FilterDataType.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/FilterDataType.java new file mode 100644 index 000000000..f65a5b0da --- /dev/null +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/FilterDataType.java @@ -0,0 +1,43 @@ +package org.motechproject.commcare.domain.report.constants; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonParseException; + +import java.lang.reflect.Type; + +public enum FilterDataType { + STRING("string"), + INTEGER("integer"), + DECIMAL("decimal"); + + private final String datatype; + + FilterDataType(String datatype) { + this.datatype = datatype; + } + + public String getDataType() { + return datatype; + } + + public static FilterDataType getFilterDataTypeFromDataTypeValue(String dataTypeValue) { + FilterDataType[] filterDataTypes = FilterDataType.values(); + for (FilterDataType filterDataType : filterDataTypes) { + if (filterDataType.getDataType().equals(dataTypeValue)) { + return filterDataType; + } + } + throw new IllegalArgumentException("Invalid filter data type value: -- " + dataTypeValue); + } + + public static class FilterDataTypeDeserializer implements JsonDeserializer { + + @Override + public FilterDataType deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + String value = json.getAsString(); + return FilterDataType.getFilterDataTypeFromDataTypeValue(value); + } + } +} \ No newline at end of file diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/FilterType.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/FilterType.java new file mode 100644 index 000000000..2dae5c5f5 --- /dev/null +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/FilterType.java @@ -0,0 +1,44 @@ +package org.motechproject.commcare.domain.report.constants; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonParseException; + +import java.lang.reflect.Type; + +public enum FilterType { + NUMERIC("numeric"), + DATE("date"), + CHOICE_LIST("choice_list"), + DYNAMIC_CHOICE_LIST("dynamic_choice_list"); + + private final String type; + + FilterType(String type) { + this.type = type; + } + + public String getType() { + return type; + } + + public static FilterType getFilterTypeFromTypeValue(String typeValue) { + FilterType[] filterTypes = FilterType.values(); + for (FilterType filterType : filterTypes) { + if (filterType.getType().equals(typeValue)) { + return filterType; + } + } + throw new IllegalArgumentException("Invalid filter type value: " + typeValue); + } + + public static class FilterTypeDeserializer implements JsonDeserializer { + + @Override + public FilterType deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + String value = json.getAsString(); + return FilterType.getFilterTypeFromTypeValue(value); + } + } +} \ No newline at end of file diff --git a/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportServiceImpl.java b/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportServiceImpl.java index 134006a97..adcb4a4e8 100644 --- a/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportServiceImpl.java +++ b/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportServiceImpl.java @@ -8,6 +8,9 @@ import org.motechproject.commcare.domain.report.ReportsMetadataInfo; import org.motechproject.commcare.domain.report.ReportMetadataJson; import org.motechproject.commcare.domain.report.ReportsMetadataResponseJson; +import org.motechproject.commcare.domain.report.constants.ColumnType; +import org.motechproject.commcare.domain.report.constants.FilterDataType; +import org.motechproject.commcare.domain.report.constants.FilterType; import org.motechproject.commcare.service.CommcareConfigService; import org.motechproject.commcare.service.CommcareReportService; import org.motechproject.commons.api.json.MotechJsonReader; @@ -18,6 +21,8 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Map; +import java.util.HashMap; /** * A {@link CommcareReportService} that is responsible for interacting with CommCareHQ's Report Metadata and Data API. @@ -52,7 +57,11 @@ public ReportsMetadataInfo getReportsList() { private ReportsMetadataResponseJson parseReportsFromResponse(String response) { Type reportsResponseType = new TypeToken() { } .getType(); - return (ReportsMetadataResponseJson) motechJsonReader.readFromString(response, reportsResponseType); + Map adapters = new HashMap<>(); + adapters.put(ColumnType.class, new ColumnType.ColumnTypeDeserializer()); + adapters.put(FilterType.class, new FilterType.FilterTypeDeserializer()); + adapters.put(FilterDataType.class, new FilterDataType.FilterDataTypeDeserializer()); + return (ReportsMetadataResponseJson) motechJsonReader.readFromString(response, reportsResponseType, adapters); } private List generateReportsFromReportsResponse(List reportResponses) { diff --git a/commcare/src/test/java/org/motechproject/commcare/service/impl/CommcareReportServiceImplTest.java b/commcare/src/test/java/org/motechproject/commcare/service/impl/CommcareReportServiceImplTest.java index 932b8f9ea..46337dc95 100644 --- a/commcare/src/test/java/org/motechproject/commcare/service/impl/CommcareReportServiceImplTest.java +++ b/commcare/src/test/java/org/motechproject/commcare/service/impl/CommcareReportServiceImplTest.java @@ -16,8 +16,7 @@ public class CommcareReportServiceImplTest { - private static final String REPORTS_LIST_RESPONSE = "{\"meta\":{\"total_count\":2},\"objects\":[{\"columns\":[{\"column_id\":\"name\",\"display\":\"Name\",\"type\":\"field\"},{\"column_id\":\"gender\",\"display\":\"Gender\",\"type\":\"expanded\"},{\"column_id\":\"address\",\"display\":\"Person Address\",\"type\":\"field\"}],\"filters\":[{\"datatype\":\"string\",\"slug\":\"closed\"},{\"datatype\":\"string\",\"slug\":\"owner_name\"}],\"title\":\"Test Report 1\",\"id\":\"9aab0eeb88555a7b3bc8676883e7379a\",\"resource_uri\":\"/a/domainOne/api/v0.5/simplereportconfiguration/9aab0eeb88555a7b3bc8676883e7379a/\"},{\"columns\":[{\"column_id\":\"district\",\"display\":\"District\",\"type\":\"field\"},{\"column_id\":\"number_of_children_visited\",\"display\":\"Num Children Visited\",\"type\":\"field\"},{\"column_id\":\"number_of_children_underweight\",\"display\":\"Underweight\",\"type\":\"field\"}],\"filters\":[{\"datatype\":\"string\",\"slug\":\"closed\"},{\"datatype\":\"string\",\"slug\":\"owner_name\"},{\"datatype\":\"integer\",\"slug\":\"child_age\"},{\"datatype\":\"date\",\"slug\":\"form_date\"}],\"title\":\"Test Report 2\",\"id\":\"9aab0eeb88555a7b4568676883e7379a\",\"resource_uri\":\"/a/domainOne/api/v0.5/simplereportconfiguration/9aab0eeb88555a7b4568676883e7379a/\"}]}"; - + private static final String REPORTS_LIST_RESPONSE = "{\"meta\":{\"total_count\":2},\"objects\":[{\"columns\":[{\"column_id\":\"name\",\"display\":\"Name\",\"type\":\"field\"},{\"column_id\":\"gender\",\"display\":\"Gender\",\"type\":\"expanded\"},{\"column_id\":\"address\",\"display\":\"Person Address\",\"type\":\"field\"}],\"filters\":[{\"datatype\":\"string\",\"slug\":\"closed\",\"type\":\"choice_list\"},{\"datatype\":\"string\",\"slug\":\"owner_name\",\"type\":\"choice_list\"}],\"title\":\"Test Report 1\",\"id\":\"9aab0eeb88555a7b3bc8676883e7379a\",\"resource_uri\":\"/a/domainOne/api/v0.5/simplereportconfiguration/9aab0eeb88555a7b3bc8676883e7379a/\"},{\"columns\":[{\"column_id\":\"district\",\"display\":\"District\",\"type\":\"field\"},{\"column_id\":\"number_of_children_visited\",\"display\":\"Num Children Visited\",\"type\":\"field\"},{\"column_id\":\"number_of_children_underweight\",\"display\":\"Underweight\",\"type\":\"field\"}],\"filters\":[{\"datatype\":\"string\",\"slug\":\"closed\",\"type\":\"choice_list\"},{\"datatype\":\"string\",\"slug\":\"owner_name\",\"type\":\"choice_list\"},{\"datatype\":\"integer\",\"slug\":\"child_age\",\"type\":\"dynamic_choice_list\"},{\"datatype\":\"string\",\"slug\":\"form_date\",\"type\":\"date\"}],\"title\":\"Test Report 2\",\"id\":\"9aab0eeb88555a7b4568676883e7379a\",\"resource_uri\":\"/a/domainOne/api/v0.5/simplereportconfiguration/9aab0eeb88555a7b4568676883e7379a/\"}]}"; private CommcareReportServiceImpl reportService; @Mock From f5557025637d9a49abffcfe728e22bc0fbc8182f Mon Sep 17 00:00:00 2001 From: Natalia Kowalik Date: Mon, 26 Sep 2016 17:14:12 +0200 Subject: [PATCH 057/202] Fixed constructor parameters --- .../openmrs/service/impl/OpenMRSEncounterServiceImplTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmrs/src/test/java/org/motechproject/openmrs/service/impl/OpenMRSEncounterServiceImplTest.java b/openmrs/src/test/java/org/motechproject/openmrs/service/impl/OpenMRSEncounterServiceImplTest.java index 00bbaaf0c..089b6e5c3 100644 --- a/openmrs/src/test/java/org/motechproject/openmrs/service/impl/OpenMRSEncounterServiceImplTest.java +++ b/openmrs/src/test/java/org/motechproject/openmrs/service/impl/OpenMRSEncounterServiceImplTest.java @@ -48,7 +48,7 @@ public class OpenMRSEncounterServiceImplTest { private Config config; @InjectMocks - private OpenMRSEncounterServiceImpl encounterServiceImpl = new OpenMRSEncounterServiceImpl(encounterResource, patientService, conceptService, eventRelay, configService); + private OpenMRSEncounterServiceImpl encounterServiceImpl = new OpenMRSEncounterServiceImpl(encounterResource, patientService, eventRelay, configService); @Test(expected = OpenMRSException.class) From d85162b20f2713f96327c781eddd4b9f3a067c2b Mon Sep 17 00:00:00 2001 From: wstrzelczyk Date: Mon, 26 Sep 2016 18:27:47 +0200 Subject: [PATCH 058/202] MOTECH-2917 Show Multiple Lines in Tasks Value Text Fields --- .../dhis2/tasks/ChannelRequestBuilder.java | 2 + .../tasks/CreateInstanceActionBuilder.java | 10 ++--- .../dhis2/tasks/ProgramActionBuilder.java | 14 +++---- .../tasks/SendDataValueSetActionBuilder.java | 5 +++ .../dhis2/tasks/StageActionBuilder.java | 6 +-- .../openmrs/tasks/builder/ActionBuilder.java | 38 +++++++++---------- 6 files changed, 41 insertions(+), 34 deletions(-) diff --git a/dhis2/src/main/java/org/motechproject/dhis2/tasks/ChannelRequestBuilder.java b/dhis2/src/main/java/org/motechproject/dhis2/tasks/ChannelRequestBuilder.java index fc5dc08fa..62f726f52 100644 --- a/dhis2/src/main/java/org/motechproject/dhis2/tasks/ChannelRequestBuilder.java +++ b/dhis2/src/main/java/org/motechproject/dhis2/tasks/ChannelRequestBuilder.java @@ -18,6 +18,7 @@ import org.motechproject.tasks.contract.builder.ActionParameterRequestBuilder; import org.motechproject.tasks.contract.ChannelRequest; import org.osgi.framework.BundleContext; +import org.motechproject.tasks.domain.enums.ParameterType; import java.util.ArrayList; import java.util.List; @@ -113,6 +114,7 @@ private ActionEventRequest addSendDataValue() { builder = new ActionParameterRequestBuilder(); builder.setDisplayName(DisplayNames.VALUE) .setKey(EventParams.VALUE) + .setType(ParameterType.TEXTAREA.getValue()) .setRequired(true) .setOrder(order++); actionParameterRequests.add(builder.createActionParameterRequest()); diff --git a/dhis2/src/main/java/org/motechproject/dhis2/tasks/CreateInstanceActionBuilder.java b/dhis2/src/main/java/org/motechproject/dhis2/tasks/CreateInstanceActionBuilder.java index 573cc03ed..efbefe2ea 100644 --- a/dhis2/src/main/java/org/motechproject/dhis2/tasks/CreateInstanceActionBuilder.java +++ b/dhis2/src/main/java/org/motechproject/dhis2/tasks/CreateInstanceActionBuilder.java @@ -8,6 +8,7 @@ import org.motechproject.tasks.contract.builder.ActionEventRequestBuilder; import org.motechproject.tasks.contract.ActionParameterRequest; import org.motechproject.tasks.contract.builder.ActionParameterRequestBuilder; +import org.motechproject.tasks.domain.enums.ParameterType; import java.util.ArrayList; import java.util.List; @@ -19,7 +20,6 @@ */ public class CreateInstanceActionBuilder { - private static final String UNICODE = "UNICODE"; private static final int ATTRIBUTE_COUNT = 3; @@ -45,7 +45,7 @@ public List build(List attributes, L ActionParameterRequestBuilder actionParameterBuilder = new ActionParameterRequestBuilder() .setDisplayName(DisplayNames.EXTERNAL_ID) .setKey(EventParams.EXTERNAL_ID) - .setType(UNICODE) + .setType(ParameterType.UNICODE.getValue()) .setRequired(true) .setOrder(counter++); @@ -54,7 +54,7 @@ public List build(List attributes, L actionParameterBuilder = new ActionParameterRequestBuilder() .setDisplayName(entity.getName()) - .setType(UNICODE) + .setType(ParameterType.TEXTAREA.getValue()) .setHidden(true) .setKey(EventParams.ENTITY_TYPE) .setValue(entity.getUuid()) @@ -64,7 +64,7 @@ public List build(List attributes, L actionParameterBuilder = new ActionParameterRequestBuilder() .setDisplayName(DisplayNames.ORG_UNIT) - .setType(UNICODE) + .setType(ParameterType.TEXTAREA.getValue()) .setKey(EventParams.LOCATION) .setOrder(counter++) .setRequired(true); @@ -98,7 +98,7 @@ private SortedSet buildAttributeActionParameters(List build(List programs, ServerVersion vers ActionParameterRequestBuilder actionParameterBuilder = new ActionParameterRequestBuilder() .setDisplayName(DisplayNames.EXTERNAL_ID) .setKey(EventParams.EXTERNAL_ID) - .setType(UNICODE) + .setType(ParameterType.UNICODE.getValue()) .setRequired(true) .setOrder(counter++); @@ -59,7 +59,7 @@ public List build(List programs, ServerVersion vers .setDisplayName(DisplayNames.ENROLLMENT_DATE) .setKey(EventParams.DATE) .setOrder(counter++) - .setType(UNICODE); + .setType(ParameterType.DATE.getValue()); actionParameters.add(actionParameterBuilder.createActionParameterRequest()); actionParamsForCreateAndEnroll.add(actionParameterBuilder.createActionParameterRequest()); @@ -68,7 +68,7 @@ public List build(List programs, ServerVersion vers .setDisplayName(DisplayNames.PROGRAM_NAME) .setKey(EventParams.PROGRAM) .setValue(program.getUuid()) - .setType(UNICODE) + .setType(ParameterType.UNICODE.getValue()) .setOrder(counter++) .setHidden(true); @@ -77,7 +77,7 @@ public List build(List programs, ServerVersion vers actionParameterBuilder = new ActionParameterRequestBuilder() .setDisplayName(DisplayNames.ORG_UNIT) - .setType(UNICODE) + .setType(ParameterType.TEXTAREA.getValue()) .setKey(EventParams.LOCATION) .setOrder(counter++) .setRequired(true); @@ -104,7 +104,7 @@ public List build(List programs, ServerVersion vers /*Add corresponding create and enroll action*/ actionParameterBuilder = new ActionParameterRequestBuilder() .setDisplayName(program.getTrackedEntity().getName()) - .setType(UNICODE) + .setType(ParameterType.TEXTAREA.getValue()) .setHidden(true) .setKey(EventParams.ENTITY_TYPE) .setValue(program.getTrackedEntity().getUuid()) @@ -139,7 +139,7 @@ private List buildRequestForProgram(Program program) { actionParameterBuilder = new ActionParameterRequestBuilder() .setDisplayName(attribute.getName()) .setKey(attribute.getUuid()) - .setType(UNICODE) + .setType(ParameterType.TEXTAREA.getValue()) .setOrder(counter++); parameterRequests.add(actionParameterBuilder.createActionParameterRequest()); diff --git a/dhis2/src/main/java/org/motechproject/dhis2/tasks/SendDataValueSetActionBuilder.java b/dhis2/src/main/java/org/motechproject/dhis2/tasks/SendDataValueSetActionBuilder.java index 3036b91c1..7967bdebf 100644 --- a/dhis2/src/main/java/org/motechproject/dhis2/tasks/SendDataValueSetActionBuilder.java +++ b/dhis2/src/main/java/org/motechproject/dhis2/tasks/SendDataValueSetActionBuilder.java @@ -8,6 +8,7 @@ import org.motechproject.tasks.contract.builder.ActionEventRequestBuilder; import org.motechproject.tasks.contract.ActionParameterRequest; import org.motechproject.tasks.contract.builder.ActionParameterRequestBuilder; +import org.motechproject.tasks.domain.enums.ParameterType; import java.util.ArrayList; import java.util.List; @@ -54,6 +55,7 @@ private ActionEventRequest addSendDataValueSetAction(DataSet dataSet) { builder = new ActionParameterRequestBuilder(); builder.setDisplayName(DisplayNames.PERIOD) .setKey(EventParams.PERIOD) + .setType(ParameterType.PERIOD.getValue()) .setOrder(order++) .setRequired(true); actionParameterRequests.add(builder.createActionParameterRequest()); @@ -61,6 +63,7 @@ private ActionEventRequest addSendDataValueSetAction(DataSet dataSet) { builder = new ActionParameterRequestBuilder(); builder.setDisplayName(DisplayNames.ORG_UNIT) .setKey(EventParams.LOCATION) + .setType(ParameterType.TEXTAREA.getValue()) .setOrder(order++) .setRequired(true); actionParameterRequests.add(builder.createActionParameterRequest()); @@ -74,6 +77,7 @@ private ActionEventRequest addSendDataValueSetAction(DataSet dataSet) { builder = new ActionParameterRequestBuilder(); builder.setDisplayName(DisplayNames.COMMENT) .setKey(EventParams.COMMENT) + .setType(ParameterType.TEXTAREA.getValue()) .setOrder(order++); actionParameterRequests.add(builder.createActionParameterRequest()); @@ -87,6 +91,7 @@ private ActionEventRequest addSendDataValueSetAction(DataSet dataSet) { builder = new ActionParameterRequestBuilder(); builder.setDisplayName(dataElement.getName()) .setKey(dataElement.getUuid()) + .setType(ParameterType.TEXTAREA.getValue()) .setOrder(order++); actionParameterRequests.add(builder.createActionParameterRequest()); } diff --git a/dhis2/src/main/java/org/motechproject/dhis2/tasks/StageActionBuilder.java b/dhis2/src/main/java/org/motechproject/dhis2/tasks/StageActionBuilder.java index 33bbc433c..cd0e8e2ab 100644 --- a/dhis2/src/main/java/org/motechproject/dhis2/tasks/StageActionBuilder.java +++ b/dhis2/src/main/java/org/motechproject/dhis2/tasks/StageActionBuilder.java @@ -98,14 +98,14 @@ public List build(List stages) { .setDisplayName(DisplayNames.EVENT_DATE) .setOrder(counter++) .setKey(EventParams.DATE) - .setType(ParameterType.UNICODE.getValue()) + .setType(ParameterType.DATE.getValue()) .setRequired(true); actionParameters.add(actionParameterBuilder.createActionParameterRequest()); actionParameterBuilder = new ActionParameterRequestBuilder() .setDisplayName(DisplayNames.ORG_UNIT) - .setType(ParameterType.UNICODE.getValue()) + .setType(ParameterType.TEXTAREA.getValue()) .setKey(EventParams.LOCATION) .setOrder(counter++) .setRequired(true); @@ -149,7 +149,7 @@ private List buildRequestForStage(Stage stage) { ActionParameterRequestBuilder actionParameterBuilder = new ActionParameterRequestBuilder() .setDisplayName(element.getName()) .setKey(element.getUuid()) - .setType(ParameterType.UNICODE.getValue()) + .setType(ParameterType.TEXTAREA.getValue()) .setOrder(counter++); parameterRequests.add(actionParameterBuilder.createActionParameterRequest()); diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/builder/ActionBuilder.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/builder/ActionBuilder.java index 1c108f134..d4f55ff16 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/builder/ActionBuilder.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/builder/ActionBuilder.java @@ -85,7 +85,7 @@ private ActionEventRequest buildCreateEncounterAction(String configName) { order++)); actionParameters.add(prepareParameter(Keys.ENCOUNTER_DATE, DisplayNames.ENCOUNTER_DATE, DATE, true, order++)); actionParameters.add(prepareParameter(Keys.ENCOUNTER_TYPE, DisplayNames.ENCOUNTER_TYPE, true, order++)); - actionParameters.add(prepareParameter(Keys.LOCATION_NAME, DisplayNames.LOCATION_NAME, false, order++)); + actionParameters.add(prepareParameter(Keys.LOCATION_NAME, DisplayNames.LOCATION_NAME, TEXTAREA, false, order++)); actionParameters.add(prepareParameter(Keys.PATIENT_UUID, DisplayNames.PATIENT_UUID, true, order++)); actionParameters.add(prepareParameter(Keys.PROVIDER_UUID, DisplayNames.PROVIDER_UUID, true, order++)); actionParameters.add(prepareParameter(Keys.VISIT_UUID, DisplayNames.VISIT_UUID, false, order++)); @@ -163,7 +163,7 @@ private ActionEventRequest buildCreateObservationJSON(String configName) { actionParameters.add(prepareParameter(Keys.ENCOUNTER_UUID, DisplayNames.ENCOUNTER_UUID, false, order++)); actionParameters.add(prepareParameter(Keys.CONCEPT_UUID, DisplayNames.CONCEPT_UUID, false, order++)); actionParameters.add(prepareParameter(Keys.OBSERVATION_DATETIME, DisplayNames.OBSERVATION_DATETIME, DATE, false, order++)); - actionParameters.add(prepareParameter(Keys.COMMENT, DisplayNames.COMMENT, false, order)); + actionParameters.add(prepareParameter(Keys.COMMENT, DisplayNames.COMMENT, TEXTAREA, false, order)); return new ActionEventRequestBuilder() .setDisplayName(getDisplayName(CREATE_OBSERVATION_JSON, configName)) @@ -186,7 +186,7 @@ private ActionEventRequest buildCreateVisitAction(String configName) { actionParameters.add(prepareParameter(Keys.VISIT_START_DATETIME, DisplayNames.VISIT_START_DATETIME, DATE, true, order++)); actionParameters.add(prepareParameter(Keys.VISIT_STOP_DATETIME, DisplayNames.VISIT_STOP_DATETIME, DATE, true, order++)); actionParameters.add(prepareParameter(Keys.VISIT_TYPE_UUID, DisplayNames.VISIT_TYPE_UUID, true, order++)); - actionParameters.add(prepareParameter(Keys.LOCATION_NAME, DisplayNames.LOCATION_NAME, false, order)); + actionParameters.add(prepareParameter(Keys.LOCATION_NAME, DisplayNames.LOCATION_NAME, TEXTAREA, false, order)); postActionParameters.add(prepareParameter(Keys.UUID, DisplayNames.VISIT_UUID, false, 0)); @@ -313,22 +313,22 @@ private SortedSet prepareCommonParameters(int startOrder SortedSet parameters = new TreeSet<>(); int order = startOrder; - parameters.add(prepareParameter(Keys.GIVEN_NAME, DisplayNames.GIVEN_NAME, true, order++)); - parameters.add(prepareParameter(Keys.MIDDLE_NAME, DisplayNames.MIDDLE_NAME, false, order++)); - parameters.add(prepareParameter(Keys.FAMILY_NAME, DisplayNames.FAMILY_NAME, true, order++)); - parameters.add(prepareParameter(Keys.ADDRESS_1, DisplayNames.ADDRESS_1, false, order++)); - parameters.add(prepareParameter(Keys.ADDRESS_2, DisplayNames.ADDRESS_2, false, order++)); - parameters.add(prepareParameter(Keys.ADDRESS_3, DisplayNames.ADDRESS_3, false, order++)); - parameters.add(prepareParameter(Keys.ADDRESS_4, DisplayNames.ADDRESS_4, false, order++)); - parameters.add(prepareParameter(Keys.ADDRESS_5, DisplayNames.ADDRESS_5, false, order++)); - parameters.add(prepareParameter(Keys.ADDRESS_6, DisplayNames.ADDRESS_6, false, order++)); - parameters.add(prepareParameter(Keys.CITY_VILLAGE, DisplayNames.CITY_VILLAGE, false, order++)); - parameters.add(prepareParameter(Keys.STATE_PROVINCE, DisplayNames.STATE_PROVINCE, false, order++)); - parameters.add(prepareParameter(Keys.COUNTRY, DisplayNames.COUNTRY, false, order++)); - parameters.add(prepareParameter(Keys.POSTAL_CODE, DisplayNames.POSTAL_CODE, false, order++)); - parameters.add(prepareParameter(Keys.COUNTY_DISTRICT, DisplayNames.COUNTY_DISTRICT, false, order++)); - parameters.add(prepareParameter(Keys.LATITUDE, DisplayNames.LATITUDE, false, order++)); - parameters.add(prepareParameter(Keys.LONGITUDE, DisplayNames.LONGITUDE, false, order++)); + parameters.add(prepareParameter(Keys.GIVEN_NAME, DisplayNames.GIVEN_NAME, TEXTAREA, true, order++)); + parameters.add(prepareParameter(Keys.MIDDLE_NAME, DisplayNames.MIDDLE_NAME, TEXTAREA, false, order++)); + parameters.add(prepareParameter(Keys.FAMILY_NAME, DisplayNames.FAMILY_NAME, TEXTAREA, true, order++)); + parameters.add(prepareParameter(Keys.ADDRESS_1, DisplayNames.ADDRESS_1, TEXTAREA, false, order++)); + parameters.add(prepareParameter(Keys.ADDRESS_2, DisplayNames.ADDRESS_2, TEXTAREA, false, order++)); + parameters.add(prepareParameter(Keys.ADDRESS_3, DisplayNames.ADDRESS_3, TEXTAREA, false, order++)); + parameters.add(prepareParameter(Keys.ADDRESS_4, DisplayNames.ADDRESS_4, TEXTAREA, false, order++)); + parameters.add(prepareParameter(Keys.ADDRESS_5, DisplayNames.ADDRESS_5, TEXTAREA, false, order++)); + parameters.add(prepareParameter(Keys.ADDRESS_6, DisplayNames.ADDRESS_6, TEXTAREA, false, order++)); + parameters.add(prepareParameter(Keys.CITY_VILLAGE, DisplayNames.CITY_VILLAGE, TEXTAREA, false, order++)); + parameters.add(prepareParameter(Keys.STATE_PROVINCE, DisplayNames.STATE_PROVINCE, TEXTAREA, false, order++)); + parameters.add(prepareParameter(Keys.COUNTRY, DisplayNames.COUNTRY, TEXTAREA, false, order++)); + parameters.add(prepareParameter(Keys.POSTAL_CODE, DisplayNames.POSTAL_CODE, TEXTAREA, false, order++)); + parameters.add(prepareParameter(Keys.COUNTY_DISTRICT, DisplayNames.COUNTY_DISTRICT, TEXTAREA, false, order++)); + parameters.add(prepareParameter(Keys.LATITUDE, DisplayNames.LATITUDE, TEXTAREA, false, order++)); + parameters.add(prepareParameter(Keys.LONGITUDE, DisplayNames.LONGITUDE, TEXTAREA, false, order++)); parameters.add(prepareParameter(Keys.START_DATE, DisplayNames.START_DATE, DATE, false, order++)); parameters.add(prepareParameter(Keys.END_DATE, DisplayNames.END_DATE, DATE, false, order++)); parameters.add(prepareParameter(Keys.BIRTH_DATE, DisplayNames.BIRTH_DATE, DATE, false, order++)); From 4a5a74872a957da18b1c364b10e7ae409f7172cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Ja=C5=BCd=C5=BCewski?= Date: Tue, 27 Sep 2016 11:15:12 +0200 Subject: [PATCH 059/202] Moved URI parsing to method removeTrailingSlash --- .../service/impl/SettingsServiceImpl.java | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/dhis2/src/main/java/org/motechproject/dhis2/service/impl/SettingsServiceImpl.java b/dhis2/src/main/java/org/motechproject/dhis2/service/impl/SettingsServiceImpl.java index 4083daa92..db4b7fe67 100644 --- a/dhis2/src/main/java/org/motechproject/dhis2/service/impl/SettingsServiceImpl.java +++ b/dhis2/src/main/java/org/motechproject/dhis2/service/impl/SettingsServiceImpl.java @@ -18,6 +18,7 @@ import java.io.InputStream; import java.net.URI; +import java.net.URISyntaxException; /** @@ -62,12 +63,7 @@ private synchronized void loadSettings() { Gson gson = new Gson(); settings = gson.fromJson(jsonText, Settings.class); if (settings.getServerURI() != null) { - URI uri = new URI(settings.getServerURI()); - uri = uri.normalize(); - String uriString = uri.toString(); - if (uriString.endsWith("/")) { - settings.setServerURI(uriString.substring(0, uriString.length() - 1)); - } + removeTrailingSlash(); } } catch (Exception e) { String message = "There was an error loading json from the DHIS2 settings."; @@ -75,4 +71,19 @@ private synchronized void loadSettings() { throw new JsonIOException(message, e); } } + + private void removeTrailingSlash() { + try { + URI uri = new URI(settings.getServerURI()); + uri = uri.normalize(); + String uriString = uri.toString(); + if (uriString.endsWith("/")) { + settings.setServerURI(uriString.substring(0, uriString.length() - 1)); + } + } catch (URISyntaxException e) { + String message = "There was an error loading json from the DHIS2 settings."; + LOGGER.debug(message); + throw new JsonIOException(message, e); + } + } } From 3856e9165974ef2bd627509c78ca92f4e67f46f7 Mon Sep 17 00:00:00 2001 From: mkruszynski Date: Tue, 27 Sep 2016 12:34:19 +0200 Subject: [PATCH 060/202] Fixed deploy config file --- deploy-settings.xml | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/deploy-settings.xml b/deploy-settings.xml index fe07d1ba6..e016b222a 100644 --- a/deploy-settings.xml +++ b/deploy-settings.xml @@ -1,7 +1,9 @@ - - - motech.nexus - ${env.SONATYPE_USERNAME} - ${env.SONATYPE_PASSWORD} - - \ No newline at end of file + + + + motech.nexus + ${env.SONATYPE_USERNAME} + ${env.SONATYPE_PASSWORD} + + + \ No newline at end of file From 1ffdbdc6c709d9cac2517d77b7b3f36c87cdfe5f Mon Sep 17 00:00:00 2001 From: Natalia Kowalik Date: Tue, 27 Sep 2016 13:44:48 +0200 Subject: [PATCH 061/202] Changed exception message format --- .../openmrs/service/impl/OpenMRSEncounterServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSEncounterServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSEncounterServiceImpl.java index 47df57ae5..29c58b42d 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSEncounterServiceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSEncounterServiceImpl.java @@ -59,7 +59,7 @@ public Encounter createEncounter(String configName, Encounter encounter) { eventRelay.sendEventMessage(new MotechEvent(EventKeys.CREATED_NEW_ENCOUNTER_SUBJECT, EventHelper.encounterParameters(createdEncounter))); } catch (HttpClientErrorException e) { - throw new OpenMRSException("Could not create encounter with patient uuid: " + encounter.getPatient().getUuid() + " " + e.getMessage() + " " + e.getResponseBodyAsString(), e); + throw new OpenMRSException(String.format("Could not create encounter with patient uuid: %s. %s %s", encounter.getPatient().getUuid(), e.getMessage(), e.getResponseBodyAsString()), e); } return createdEncounter; From 83e9f606ef332e6719c868b2d4fc8c2897c0c238 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Ja=C5=BCd=C5=BCewski?= Date: Tue, 27 Sep 2016 15:11:44 +0200 Subject: [PATCH 062/202] Changed status error handling to match similar cases in DHIS2 module --- .../dhis2/rest/service/impl/DhisWebServiceImpl.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/dhis2/src/main/java/org/motechproject/dhis2/rest/service/impl/DhisWebServiceImpl.java b/dhis2/src/main/java/org/motechproject/dhis2/rest/service/impl/DhisWebServiceImpl.java index 1bd954907..529c9cbb9 100644 --- a/dhis2/src/main/java/org/motechproject/dhis2/rest/service/impl/DhisWebServiceImpl.java +++ b/dhis2/src/main/java/org/motechproject/dhis2/rest/service/impl/DhisWebServiceImpl.java @@ -416,8 +416,7 @@ private DhisStatusResponse createEntity(Settings settings, String uri, String js String contentString = IOUtils.toString(content); status = new ObjectMapper().readValue(contentString, DhisStatusResponse.class); if (status.getStatus() == DhisStatus.ERROR) { - LOGGER.debug(String.format("DHIS2 status response error details: %s", contentString)); - String msg = String.format("Error in DHIS2 status response."); + String msg = String.format("DHIS2 status response error details: %s", contentString); statusMessageService.warn(msg, MODULE_NAME); throw new DhisWebException(msg); } From dd1698eab2ceb734ceb717e2e377b1377a5cbb5c Mon Sep 17 00:00:00 2001 From: Jakub Redlarski Date: Tue, 27 Sep 2016 16:21:02 +0200 Subject: [PATCH 063/202] MOTECH-2888: Changes after review --- .../commcare/domain/CommcareMetadataInfo.java | 10 +++ .../domain/report/ReportMetadataInfo.java | 10 +++ .../domain/report/constants/ColumnType.java | 16 +--- .../report/constants/FilterDataType.java | 16 +--- .../domain/report/constants/FilterType.java | 16 +--- .../impl/CommcareReportServiceImpl.java | 38 +++------ .../impl/CommcareReportServiceImplTest.java | 37 +++++++- .../service/reportsListMetadataResponse.json | 85 +++++++++++++++++++ 8 files changed, 155 insertions(+), 73 deletions(-) create mode 100644 commcare/src/test/resources/json/service/reportsListMetadataResponse.json diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/CommcareMetadataInfo.java b/commcare/src/main/java/org/motechproject/commcare/domain/CommcareMetadataInfo.java index 0fe414045..6500c3385 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/CommcareMetadataInfo.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/CommcareMetadataInfo.java @@ -11,6 +11,16 @@ public class CommcareMetadataInfo { private String previousPageQueryString; private int totalCount; + public CommcareMetadataInfo() {} + + public CommcareMetadataInfo(int limit, String nextPageQueryString, int offset, String previousPageQueryString, int totalCount) { + this.limit = limit; + this.nextPageQueryString = nextPageQueryString; + this.offset = offset; + this.previousPageQueryString = previousPageQueryString; + this.totalCount = totalCount; + } + public String getPreviousPageQueryString() { return previousPageQueryString; } diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataInfo.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataInfo.java index 68fa4af26..84ac11b46 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataInfo.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataInfo.java @@ -12,6 +12,16 @@ public class ReportMetadataInfo { private List columns; private List filters; + public ReportMetadataInfo() {} + + public ReportMetadataInfo(String id, String title, List columns, List filters) { + this.id = id; + this.title = title; + this.columns = columns; + this.filters = filters; + } + + public String getId() { return id; } diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/ColumnType.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/ColumnType.java index 48a98151a..1e937bfe8 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/ColumnType.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/ColumnType.java @@ -17,26 +17,12 @@ public enum ColumnType { this.type = type; } - public String getType() { - return type; - } - - public static ColumnType getColumnTypeFromTypeValue(String typeValue) { - ColumnType[] columnTypes = ColumnType.values(); - for (ColumnType columnType : columnTypes) { - if (columnType.getType().equals(typeValue)) { - return columnType; - } - } - throw new IllegalArgumentException("Invalid column type value: " + typeValue); - } - public static class ColumnTypeDeserializer implements JsonDeserializer { @Override public ColumnType deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { String value = json.getAsString(); - return ColumnType.getColumnTypeFromTypeValue(value); + return ColumnType.valueOf(value.toUpperCase()); } } } diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/FilterDataType.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/FilterDataType.java index f65a5b0da..f57deaf4b 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/FilterDataType.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/FilterDataType.java @@ -18,26 +18,12 @@ public enum FilterDataType { this.datatype = datatype; } - public String getDataType() { - return datatype; - } - - public static FilterDataType getFilterDataTypeFromDataTypeValue(String dataTypeValue) { - FilterDataType[] filterDataTypes = FilterDataType.values(); - for (FilterDataType filterDataType : filterDataTypes) { - if (filterDataType.getDataType().equals(dataTypeValue)) { - return filterDataType; - } - } - throw new IllegalArgumentException("Invalid filter data type value: -- " + dataTypeValue); - } - public static class FilterDataTypeDeserializer implements JsonDeserializer { @Override public FilterDataType deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { String value = json.getAsString(); - return FilterDataType.getFilterDataTypeFromDataTypeValue(value); + return FilterDataType.valueOf(value.toUpperCase()); } } } \ No newline at end of file diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/FilterType.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/FilterType.java index 2dae5c5f5..c052add5b 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/FilterType.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/FilterType.java @@ -19,26 +19,12 @@ public enum FilterType { this.type = type; } - public String getType() { - return type; - } - - public static FilterType getFilterTypeFromTypeValue(String typeValue) { - FilterType[] filterTypes = FilterType.values(); - for (FilterType filterType : filterTypes) { - if (filterType.getType().equals(typeValue)) { - return filterType; - } - } - throw new IllegalArgumentException("Invalid filter type value: " + typeValue); - } - public static class FilterTypeDeserializer implements JsonDeserializer { @Override public FilterType deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { String value = json.getAsString(); - return FilterType.getFilterTypeFromTypeValue(value); + return FilterType.valueOf(value.toUpperCase()); } } } \ No newline at end of file diff --git a/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportServiceImpl.java b/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportServiceImpl.java index adcb4a4e8..b68ead79b 100644 --- a/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportServiceImpl.java +++ b/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportServiceImpl.java @@ -65,43 +65,33 @@ private ReportsMetadataResponseJson parseReportsFromResponse(String response) { } private List generateReportsFromReportsResponse(List reportResponses) { - if (reportResponses == null) { - return Collections.emptyList(); - } - - List reportsInfoList = new ArrayList<>(); + List reportsInfoList; - for (ReportMetadataJson reportResponse : reportResponses) { - reportsInfoList.add(populateReportMetadataInfo(reportResponse)); + if (reportResponses == null) { + reportsInfoList = Collections.emptyList(); + } else { + reportsInfoList = new ArrayList<>(); + for (ReportMetadataJson reportResponse : reportResponses) { + reportsInfoList.add(populateReportMetadataInfo(reportResponse)); + } } return reportsInfoList; } private ReportMetadataInfo populateReportMetadataInfo(ReportMetadataJson reportResponse) { + ReportMetadataInfo reportMetadataInfo; + if (reportResponse == null) { - return null; + reportMetadataInfo = null; + } else { + reportMetadataInfo = new ReportMetadataInfo(reportResponse.getId(), reportResponse.getTitle(), reportResponse.getColumns(), reportResponse.getFilters()); } - ReportMetadataInfo reportMetadataInfo = new ReportMetadataInfo(); - - reportMetadataInfo.setId(reportResponse.getId()); - reportMetadataInfo.setTitle(reportResponse.getTitle()); - reportMetadataInfo.setColumns(reportResponse.getColumns()); - reportMetadataInfo.setFilters(reportResponse.getFilters()); - return reportMetadataInfo; } private CommcareMetadataInfo populateReportsMetadata(CommcareMetadataJson metadataJson) { - CommcareMetadataInfo metadataInfo = new CommcareMetadataInfo(); - - metadataInfo.setLimit(metadataJson.getLimit()); - metadataInfo.setNextPageQueryString(metadataJson.getNextPageQueryString()); - metadataInfo.setOffset(metadataJson.getOffset()); - metadataInfo.setPreviousPageQueryString(metadataJson.getPreviousPageQueryString()); - metadataInfo.setTotalCount(metadataJson.getTotalCount()); - - return metadataInfo; + return new CommcareMetadataInfo(metadataJson.getLimit(), metadataJson.getNextPageQueryString(), metadataJson.getOffset(), metadataJson.getPreviousPageQueryString(), metadataJson.getTotalCount()); } } \ No newline at end of file diff --git a/commcare/src/test/java/org/motechproject/commcare/service/impl/CommcareReportServiceImplTest.java b/commcare/src/test/java/org/motechproject/commcare/service/impl/CommcareReportServiceImplTest.java index 46337dc95..8396d0c68 100644 --- a/commcare/src/test/java/org/motechproject/commcare/service/impl/CommcareReportServiceImplTest.java +++ b/commcare/src/test/java/org/motechproject/commcare/service/impl/CommcareReportServiceImplTest.java @@ -1,13 +1,23 @@ package org.motechproject.commcare.service.impl; +import org.apache.commons.io.FileUtils; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.motechproject.commcare.client.CommCareAPIHttpClient; import org.motechproject.commcare.config.Config; import org.motechproject.commcare.domain.report.ReportsMetadataInfo; +import org.motechproject.commcare.domain.report.constants.ColumnType; +import org.motechproject.commcare.domain.report.constants.FilterDataType; +import org.motechproject.commcare.domain.report.constants.FilterType; import org.motechproject.commcare.service.CommcareConfigService; import org.motechproject.commcare.util.ConfigsUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.io.IOException; +import java.net.URL; import static org.hamcrest.CoreMatchers.equalTo; import static org.junit.Assert.assertThat; @@ -16,7 +26,8 @@ public class CommcareReportServiceImplTest { - private static final String REPORTS_LIST_RESPONSE = "{\"meta\":{\"total_count\":2},\"objects\":[{\"columns\":[{\"column_id\":\"name\",\"display\":\"Name\",\"type\":\"field\"},{\"column_id\":\"gender\",\"display\":\"Gender\",\"type\":\"expanded\"},{\"column_id\":\"address\",\"display\":\"Person Address\",\"type\":\"field\"}],\"filters\":[{\"datatype\":\"string\",\"slug\":\"closed\",\"type\":\"choice_list\"},{\"datatype\":\"string\",\"slug\":\"owner_name\",\"type\":\"choice_list\"}],\"title\":\"Test Report 1\",\"id\":\"9aab0eeb88555a7b3bc8676883e7379a\",\"resource_uri\":\"/a/domainOne/api/v0.5/simplereportconfiguration/9aab0eeb88555a7b3bc8676883e7379a/\"},{\"columns\":[{\"column_id\":\"district\",\"display\":\"District\",\"type\":\"field\"},{\"column_id\":\"number_of_children_visited\",\"display\":\"Num Children Visited\",\"type\":\"field\"},{\"column_id\":\"number_of_children_underweight\",\"display\":\"Underweight\",\"type\":\"field\"}],\"filters\":[{\"datatype\":\"string\",\"slug\":\"closed\",\"type\":\"choice_list\"},{\"datatype\":\"string\",\"slug\":\"owner_name\",\"type\":\"choice_list\"},{\"datatype\":\"integer\",\"slug\":\"child_age\",\"type\":\"dynamic_choice_list\"},{\"datatype\":\"string\",\"slug\":\"form_date\",\"type\":\"date\"}],\"title\":\"Test Report 2\",\"id\":\"9aab0eeb88555a7b4568676883e7379a\",\"resource_uri\":\"/a/domainOne/api/v0.5/simplereportconfiguration/9aab0eeb88555a7b4568676883e7379a/\"}]}"; + private static final String REPORTS_LIST_METADATA_RESPONSE = "json/service/reportsListMetadataResponse.json"; + private static final Logger LOGGER = LoggerFactory.getLogger(CommcareCaseServiceImplTest.class); private CommcareReportServiceImpl reportService; @Mock @@ -40,7 +51,7 @@ public void setUp() { @Test public void shouldGetReports() { - when(commcareHttpClient.reportsListMetadataRequest(configService.getByName(null).getAccountConfig())).thenReturn(getResponseForReportsList()); + when(commcareHttpClient.reportsListMetadataRequest(configService.getByName(null).getAccountConfig())).thenReturn(getResponseForReportsListMetadata()); ReportsMetadataInfo reportsMetadataInfo = reportService.getReportsList(); @@ -48,9 +59,27 @@ public void shouldGetReports() { assertThat(reportsMetadataInfo.getReportMetadataInfoList().size(), equalTo(2)); assertThat(reportsMetadataInfo.getReportMetadataInfoList().get(0).getColumns().size(), equalTo(3)); assertThat(reportsMetadataInfo.getReportMetadataInfoList().get(0).getFilters().size(), equalTo(2)); + assertThat(reportsMetadataInfo.getReportMetadataInfoList().get(0).getId(), equalTo("9aab0eeb88555a7b3bc8676883e7379a")); + assertThat(reportsMetadataInfo.getReportMetadataInfoList().get(0).getTitle(), equalTo("Test Report 1")); + assertThat(reportsMetadataInfo.getReportMetadataInfoList().get(0).getColumns().get(0).getId(), equalTo("name")); + assertThat(reportsMetadataInfo.getReportMetadataInfoList().get(0).getColumns().get(0).getDisplay(), equalTo("Name")); + assertThat(reportsMetadataInfo.getReportMetadataInfoList().get(0).getColumns().get(0).getType(), equalTo(ColumnType.FIELD)); + assertThat(reportsMetadataInfo.getReportMetadataInfoList().get(0).getFilters().get(0).getType(), equalTo(FilterType.CHOICE_LIST)); + assertThat(reportsMetadataInfo.getReportMetadataInfoList().get(0).getFilters().get(0).getDatatype(), equalTo(FilterDataType.STRING)); + assertThat(reportsMetadataInfo.getReportMetadataInfoList().get(0).getFilters().get(0).getSlug(), equalTo("closed")); + } + + private String getResponseForReportsListMetadata() { + return getRawJson(REPORTS_LIST_METADATA_RESPONSE); } - private String getResponseForReportsList() { - return REPORTS_LIST_RESPONSE; + private String getRawJson(String path) { + try { + URL url = this.getClass().getClassLoader().getResource(path); + return FileUtils.readFileToString(new File(url.getFile())); + } catch (IOException e) { + LOGGER.error(e.getMessage(), e); + return null; + } } } \ No newline at end of file diff --git a/commcare/src/test/resources/json/service/reportsListMetadataResponse.json b/commcare/src/test/resources/json/service/reportsListMetadataResponse.json new file mode 100644 index 000000000..0042f4deb --- /dev/null +++ b/commcare/src/test/resources/json/service/reportsListMetadataResponse.json @@ -0,0 +1,85 @@ +{ + "meta": { + "total_count": 2 + }, + "objects": [ + { + "columns": [ + { + "column_id": "name", + "display": "Name", + "type": "field" + }, + { + "column_id": "gender", + "display": "Gender", + "type": "expanded" + }, + { + "column_id": "address", + "display": "Person Address", + "type": "field" + } + ], + "filters": [ + { + "datatype": "string", + "slug": "closed", + "type": "choice_list" + }, + { + "datatype": "string", + "slug": "owner_name", + "type": "choice_list" + } + ], + "title": "Test Report 1", + "id": "9aab0eeb88555a7b3bc8676883e7379a", + "resource_uri": "/a/domainOne/api/v0.5/simplereportconfiguration/9aab0eeb88555a7b3bc8676883e7379a/" + }, + { + "columns": [ + { + "column_id": "district", + "display": "District", + "type": "field" + }, + { + "column_id": "number_of_children_visited", + "display": "Num Children Visited", + "type": "field" + }, + { + "column_id": "number_of_children_underweight", + "display": "Underweight", + "type": "field" + } + ], + "filters": [ + { + "datatype": "string", + "slug": "closed", + "type": "choice_list" + }, + { + "datatype": "string", + "slug": "owner_name", + "type": "choice_list" + }, + { + "datatype": "integer", + "slug": "child_age", + "type": "dynamic_choice_list" + }, + { + "datatype": "string", + "slug": "form_date", + "type": "date" + } + ], + "title": "Test Report 2", + "id": "9aab0eeb88555a7b4568676883e7379a", + "resource_uri": "/a/domainOne/api/v0.5/simplereportconfiguration/9aab0eeb88555a7b4568676883e7379a/" + } + ] +} \ No newline at end of file From a8aab2845bb6bec950bd9e3a383956c152ac67d2 Mon Sep 17 00:00:00 2001 From: mkruszynski Date: Tue, 27 Sep 2016 17:39:57 +0200 Subject: [PATCH 064/202] MOTECH-2949: Fixed random tests fails --- run_build.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/run_build.sh b/run_build.sh index f486ba585..7b8b472e5 100644 --- a/run_build.sh +++ b/run_build.sh @@ -1,5 +1,6 @@ #!/usr/bin/env bash +rm -r ~/.m2/repository/org/motechproject/* if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then if [ "$DB" = "psql" ]; then mvn -Dmotech.sql.password=password -Dmotech.sql.user=postgres -Dmaven.test.failure.ignore=false -Dmotech.sql.driver=org.postgresql.Driver -Dmotech.sql.dbtype=psql -Dmotech.sql.url=jdbc:postgresql://localhost:5432/ clean install -PIT -U From 2668efcef40adb98c61ba6cb32a3965441480ff5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Ja=C5=BCd=C5=BCewski?= Date: Wed, 28 Sep 2016 10:54:29 +0200 Subject: [PATCH 065/202] Moved setter and exception handling to loadSettings --- .../dhis2/service/impl/SettingsServiceImpl.java | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/dhis2/src/main/java/org/motechproject/dhis2/service/impl/SettingsServiceImpl.java b/dhis2/src/main/java/org/motechproject/dhis2/service/impl/SettingsServiceImpl.java index db4b7fe67..4897c421c 100644 --- a/dhis2/src/main/java/org/motechproject/dhis2/service/impl/SettingsServiceImpl.java +++ b/dhis2/src/main/java/org/motechproject/dhis2/service/impl/SettingsServiceImpl.java @@ -63,7 +63,7 @@ private synchronized void loadSettings() { Gson gson = new Gson(); settings = gson.fromJson(jsonText, Settings.class); if (settings.getServerURI() != null) { - removeTrailingSlash(); + settings.setServerURI(removeTrailingSlash()); } } catch (Exception e) { String message = "There was an error loading json from the DHIS2 settings."; @@ -72,18 +72,13 @@ private synchronized void loadSettings() { } } - private void removeTrailingSlash() { - try { + private String removeTrailingSlash() throws URISyntaxException { URI uri = new URI(settings.getServerURI()); uri = uri.normalize(); String uriString = uri.toString(); if (uriString.endsWith("/")) { - settings.setServerURI(uriString.substring(0, uriString.length() - 1)); + uriString = uriString.substring(0, uriString.length() - 1); } - } catch (URISyntaxException e) { - String message = "There was an error loading json from the DHIS2 settings."; - LOGGER.debug(message); - throw new JsonIOException(message, e); - } + return uriString; } } From 592bef06808540b3761fccf24294ffce98e3ec5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Ja=C5=BCd=C5=BCewski?= Date: Wed, 28 Sep 2016 11:02:06 +0200 Subject: [PATCH 066/202] Removed needless service use --- .../dhis2/rest/service/impl/DhisWebServiceImpl.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/dhis2/src/main/java/org/motechproject/dhis2/rest/service/impl/DhisWebServiceImpl.java b/dhis2/src/main/java/org/motechproject/dhis2/rest/service/impl/DhisWebServiceImpl.java index 529c9cbb9..548e3ee3d 100644 --- a/dhis2/src/main/java/org/motechproject/dhis2/rest/service/impl/DhisWebServiceImpl.java +++ b/dhis2/src/main/java/org/motechproject/dhis2/rest/service/impl/DhisWebServiceImpl.java @@ -416,8 +416,7 @@ private DhisStatusResponse createEntity(Settings settings, String uri, String js String contentString = IOUtils.toString(content); status = new ObjectMapper().readValue(contentString, DhisStatusResponse.class); if (status.getStatus() == DhisStatus.ERROR) { - String msg = String.format("DHIS2 status response error details: %s", contentString); - statusMessageService.warn(msg, MODULE_NAME); + String msg = String.format("Error in DHIS2 status response, error details: %s", contentString); throw new DhisWebException(msg); } } catch (IOException e) { From ec38c36e9d4c7e5f15d6f921a696e9384e277eaf Mon Sep 17 00:00:00 2001 From: Jakub Redlarski Date: Wed, 28 Sep 2016 15:17:55 +0200 Subject: [PATCH 067/202] MOTECH-2888: Fixes after review #2 --- .../commcare/domain/CommcareMetadataInfo.java | 24 +++++++ .../domain/report/ReportMetadataColumn.java | 30 +++++++++ .../domain/report/ReportMetadataFilter.java | 30 +++++++++ .../domain/report/ReportMetadataInfo.java | 22 +++++++ .../domain/report/ReportsMetadataInfo.java | 28 ++++++++- .../impl/CommcareReportServiceImpl.java | 12 ++-- .../impl/CommcareReportServiceImplTest.java | 62 ++++++++++++++----- 7 files changed, 182 insertions(+), 26 deletions(-) diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/CommcareMetadataInfo.java b/commcare/src/main/java/org/motechproject/commcare/domain/CommcareMetadataInfo.java index 6500c3385..c62855956 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/CommcareMetadataInfo.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/CommcareMetadataInfo.java @@ -1,5 +1,7 @@ package org.motechproject.commcare.domain; +import java.util.Objects; + /** * Domain class representing case metadata, retrieved from CommCareHQ server. */ @@ -60,4 +62,26 @@ public void setNextPageQueryString(String nextPageQueryString) { public void setPreviousPageQueryString(String previousPageQueryString) { this.previousPageQueryString = previousPageQueryString; } + + @Override + public int hashCode() { + return Objects.hash(limit, nextPageQueryString, offset, previousPageQueryString, totalCount); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (!(o instanceof CommcareMetadataInfo)) { + return false; + } + + CommcareMetadataInfo other = (CommcareMetadataInfo) o; + + return Objects.equals(limit, other.limit) && Objects.equals(nextPageQueryString, other.nextPageQueryString) + && Objects.equals(offset, other.offset) && Objects.equals(previousPageQueryString, other.previousPageQueryString) + && Objects.equals(totalCount, other.totalCount); + } } diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataColumn.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataColumn.java index f7aa2e25b..06b587fb6 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataColumn.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataColumn.java @@ -3,6 +3,8 @@ import com.google.gson.annotations.SerializedName; import org.motechproject.commcare.domain.report.constants.ColumnType; +import java.util.Objects; + /** * Represents a single CommCareHQ {@link ReportMetadataInfo} column. */ @@ -17,6 +19,14 @@ public class ReportMetadataColumn { @SerializedName("type") private ColumnType type; + public ReportMetadataColumn() {} + + public ReportMetadataColumn(String id, String display, ColumnType type) { + this.id = id; + this.display = display; + this.type = type; + } + public String getId() { return id; } @@ -40,4 +50,24 @@ public ColumnType getType() { public void setType(ColumnType type) { this.type = type; } + + @Override + public int hashCode() { + return Objects.hash(id, display, type); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (!(o instanceof ReportMetadataColumn)) { + return false; + } + + ReportMetadataColumn other = (ReportMetadataColumn) o; + + return Objects.equals(id, other.id) && Objects.equals(display, other.display) && Objects.equals(type, other.type); + } } \ No newline at end of file diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataFilter.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataFilter.java index 55f8f86b1..706d4b220 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataFilter.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataFilter.java @@ -4,6 +4,8 @@ import org.motechproject.commcare.domain.report.constants.FilterDataType; import org.motechproject.commcare.domain.report.constants.FilterType; +import java.util.Objects; + /** * Represents a single CommCareHQ {@link ReportMetadataInfo} filter. */ @@ -18,6 +20,14 @@ public class ReportMetadataFilter { @SerializedName("type") private FilterType type; + public ReportMetadataFilter() {} + + public ReportMetadataFilter(FilterDataType datatype, String slug, FilterType type) { + this.datatype = datatype; + this.slug = slug; + this.type = type; + } + public FilterDataType getDatatype() { return datatype; } @@ -42,4 +52,24 @@ public void setType(FilterType type) { this.type = type; } + @Override + public int hashCode() { + return Objects.hash(datatype, slug, type); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (!(o instanceof ReportMetadataFilter)) { + return false; + } + + ReportMetadataFilter other = (ReportMetadataFilter) o; + + return Objects.equals(datatype, other.datatype) && Objects.equals(slug, other.slug) && Objects.equals(type, other.type); + } + } \ No newline at end of file diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataInfo.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataInfo.java index 84ac11b46..42d49da6d 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataInfo.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataInfo.java @@ -1,6 +1,7 @@ package org.motechproject.commcare.domain.report; import java.util.List; +import java.util.Objects; /** * Represents a single CommCareHQ report. It's a part of the MOTECH model. @@ -53,4 +54,25 @@ public List getFilters() { public void setFilters(List filters) { this.filters = filters; } + + @Override + public int hashCode() { + return Objects.hash(id, title, columns, filters); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (!(o instanceof ReportMetadataInfo)) { + return false; + } + + ReportMetadataInfo other = (ReportMetadataInfo) o; + + return Objects.equals(id, other.id) && Objects.equals(title, other.title) + && Objects.equals(columns, other.columns) && Objects.equals(filters, other.filters); + } } \ No newline at end of file diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportsMetadataInfo.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportsMetadataInfo.java index 4720b52b8..9bb885e6e 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportsMetadataInfo.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportsMetadataInfo.java @@ -3,6 +3,7 @@ import org.motechproject.commcare.domain.CommcareMetadataInfo; import java.util.List; +import java.util.Objects; /** * Wrapper class for storing list of instances of the {@link ReportMetadataInfo} class. It's a part of the MOTECH model. @@ -12,8 +13,10 @@ public class ReportsMetadataInfo { private List reportMetadataInfoList; private CommcareMetadataInfo metadataInfo; - public ReportsMetadataInfo(List reportsInfoList, CommcareMetadataInfo metadataInfo) { - this.reportMetadataInfoList = reportsInfoList; + public ReportsMetadataInfo() {} + + public ReportsMetadataInfo(List reportMetadataInfoList, CommcareMetadataInfo metadataInfo) { + this.reportMetadataInfoList = reportMetadataInfoList; this.metadataInfo = metadataInfo; } @@ -32,4 +35,25 @@ public CommcareMetadataInfo getMetadataInfo() { public void setMetadataInfo(CommcareMetadataInfo metadataInfo) { this.metadataInfo = metadataInfo; } + + @Override + public int hashCode() { + return Objects.hash(reportMetadataInfoList, metadataInfo); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (!(o instanceof ReportsMetadataInfo)) { + return false; + } + + ReportsMetadataInfo other = (ReportsMetadataInfo) o; + + return Objects.equals(reportMetadataInfoList, other.reportMetadataInfoList) + && Objects.equals(metadataInfo, other.metadataInfo); + } } \ No newline at end of file diff --git a/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportServiceImpl.java b/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportServiceImpl.java index b68ead79b..359a16321 100644 --- a/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportServiceImpl.java +++ b/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportServiceImpl.java @@ -65,11 +65,9 @@ private ReportsMetadataResponseJson parseReportsFromResponse(String response) { } private List generateReportsFromReportsResponse(List reportResponses) { - List reportsInfoList; + List reportsInfoList = Collections.emptyList(); - if (reportResponses == null) { - reportsInfoList = Collections.emptyList(); - } else { + if (reportResponses != null) { reportsInfoList = new ArrayList<>(); for (ReportMetadataJson reportResponse : reportResponses) { reportsInfoList.add(populateReportMetadataInfo(reportResponse)); @@ -80,11 +78,9 @@ private List generateReportsFromReportsResponse(List reportMetadataInfoList = new ArrayList<>(); + + List columns = new ArrayList<>(); + columns.add(new ReportMetadataColumn("name", "Name", ColumnType.FIELD)); + columns.add(new ReportMetadataColumn("gender", "Gender", ColumnType.EXPANDED)); + columns.add(new ReportMetadataColumn("address", "Person Address", ColumnType.FIELD)); + + List filters = new ArrayList<>(); + filters.add(new ReportMetadataFilter(FilterDataType.STRING, "closed", FilterType.CHOICE_LIST)); + filters.add(new ReportMetadataFilter(FilterDataType.STRING, "owner_name", FilterType.CHOICE_LIST)); + + reportMetadataInfoList.add(new ReportMetadataInfo("9aab0eeb88555a7b3bc8676883e7379a", "Test Report 1", columns, filters)); + + columns = new ArrayList<>(); + columns.add(new ReportMetadataColumn("district", "District", ColumnType.FIELD)); + columns.add(new ReportMetadataColumn("number_of_children_visited", "Num Children Visited", ColumnType.FIELD)); + columns.add(new ReportMetadataColumn("number_of_children_underweight", "Underweight", ColumnType.FIELD)); + + filters = new ArrayList<>(); + filters.add(new ReportMetadataFilter(FilterDataType.STRING, "closed", FilterType.CHOICE_LIST)); + filters.add(new ReportMetadataFilter(FilterDataType.STRING, "owner_name", FilterType.CHOICE_LIST)); + filters.add(new ReportMetadataFilter(FilterDataType.INTEGER, "child_age", FilterType.DYNAMIC_CHOICE_LIST)); + filters.add(new ReportMetadataFilter(FilterDataType.STRING, "form_date", FilterType.DATE)); + + reportMetadataInfoList.add(new ReportMetadataInfo("9aab0eeb88555a7b4568676883e7379a", "Test Report 2", columns, filters)); + + CommcareMetadataInfo metadataInfo = new CommcareMetadataInfo(0, null, 0, null, 2); + + return new ReportsMetadataInfo(reportMetadataInfoList, metadataInfo); + } } \ No newline at end of file From 32b59086080f5633016578b6f286174752a59d84 Mon Sep 17 00:00:00 2001 From: mkruszynski Date: Wed, 28 Sep 2016 15:26:07 +0200 Subject: [PATCH 068/202] MOTECH-2949: Increased ODK IT test try count --- .../test/java/org/motechproject/odk/it/FormControllerIT.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/odk/src/test/java/org/motechproject/odk/it/FormControllerIT.java b/odk/src/test/java/org/motechproject/odk/it/FormControllerIT.java index d68c26975..36bab502e 100644 --- a/odk/src/test/java/org/motechproject/odk/it/FormControllerIT.java +++ b/odk/src/test/java/org/motechproject/odk/it/FormControllerIT.java @@ -33,7 +33,7 @@ @ExamFactory(MotechNativeTestContainerFactory.class) public class FormControllerIT extends OdkBaseIT { - private static final int WAIT_COUNT = 30; + private static final int WAIT_COUNT = 50; private static final int EXPECTED_EVENTS_SUCCESS = 7; private static final int EXPECTED_EVENTS_FAIL = 1; private static final String TIMEOUT = "Timeout"; From 98e1818b0a5ecab99ceb4a17830b67421c49865d Mon Sep 17 00:00:00 2001 From: Jakub Redlarski Date: Wed, 28 Sep 2016 17:14:06 +0200 Subject: [PATCH 069/202] MOTECH-2889: Cleaned up files after merging with master Fixed order of methods in classes Fixed missing addnotations after merge with master Fixed checkstyle errors --- .../commcare/domain/CommcareMetadataInfo.java | 2 +- .../domain/report/ReportDataColumn.java | 12 +-- .../domain/report/ReportDataInfo.java | 9 +-- ...rJson.java => ReportDataResponseJson.java} | 18 ++--- .../domain/report/ReportMetadataColumn.java | 4 +- .../domain/report/ReportMetadataFilter.java | 4 +- .../domain/report/ReportMetadataInfo.java | 4 +- .../domain/report/ReportMetadataJson.java | 2 +- .../domain/report/ReportsMetadataInfo.java | 4 +- .../report/ReportsMetadataResponseJson.java | 2 +- .../domain/report/constants/ColumnType.java | 3 +- .../report/constants/FilterDataType.java | 5 +- .../domain/report/constants/FilterType.java | 5 +- .../service/CommcareReportService.java | 2 +- .../impl/CommcareReportServiceImpl.java | 81 ++++++++++--------- .../impl/CommcareReportServiceImplTest.java | 27 ++++--- .../json/service/reportDataResponse.json | 38 +++++++++ 17 files changed, 129 insertions(+), 93 deletions(-) rename commcare/src/main/java/org/motechproject/commcare/domain/report/{ReportDataContainerJson.java => ReportDataResponseJson.java} (74%) create mode 100644 commcare/src/test/resources/json/service/reportDataResponse.json diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/CommcareMetadataInfo.java b/commcare/src/main/java/org/motechproject/commcare/domain/CommcareMetadataInfo.java index c62855956..ec597c583 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/CommcareMetadataInfo.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/CommcareMetadataInfo.java @@ -13,7 +13,7 @@ public class CommcareMetadataInfo { private String previousPageQueryString; private int totalCount; - public CommcareMetadataInfo() {} + public CommcareMetadataInfo() { } public CommcareMetadataInfo(int limit, String nextPageQueryString, int offset, String previousPageQueryString, int totalCount) { this.limit = limit; diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataColumn.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataColumn.java index ce8977a72..06a6679c4 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataColumn.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataColumn.java @@ -16,27 +16,27 @@ public class ReportDataColumn { @SerializedName("expand_column_value") private String expandColumnValue; - public String getHeader(){ + public String getHeader() { return header; } - public String getSlug(){ + public String getSlug() { return slug; } - public String getExpandColumnValue(){ + public String getExpandColumnValue() { return expandColumnValue; } - public void setHeader(String header){ + public void setHeader(String header) { this.header = header; } - public void setSlug(String slug){ + public void setSlug(String slug) { this.slug = slug; } - public void setExpandColumnValue(String expandColumnValue){ + public void setExpandColumnValue(String expandColumnValue) { this.expandColumnValue = expandColumnValue; } } diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataInfo.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataInfo.java index b92fab522..41b46f350 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataInfo.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataInfo.java @@ -14,7 +14,7 @@ public class ReportDataInfo { private String nextPage; private Integer totalRecords; - public List getColumns(){ + public List getColumns() { return columns; } @@ -22,7 +22,7 @@ public void setColumns(List columns) { this.columns = columns; } - public List> getData(){ + public List> getData() { return data; } @@ -30,7 +30,7 @@ public void setData(List> data) { this.data = data; } - public String getNextPage(){ + public String getNextPage() { return nextPage; } @@ -38,12 +38,11 @@ public void setNextPage(String nextPage) { this.nextPage = nextPage; } - public Integer getTotalRecords(){ + public Integer getTotalRecords() { return totalRecords; } public void setTotalRecords(Integer totalRecords) { this.totalRecords = totalRecords; } - } diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataContainerJson.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataResponseJson.java similarity index 74% rename from commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataContainerJson.java rename to commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataResponseJson.java index d993d1225..9bc6e40c6 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataContainerJson.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataResponseJson.java @@ -8,7 +8,7 @@ /** * Represents a single CommCareHQ report data. It's a part of the CommCareHQ model. */ -public class ReportDataContainerJson { +public class ReportDataResponseJson { @SerializedName("columns") private List columns; @@ -22,35 +22,35 @@ public class ReportDataContainerJson { @SerializedName("total_records") private Integer totalRecords; - public List getColumns(){ + public List getColumns() { return columns; } - public List> getData(){ + public List> getData() { return data; } - public String getNextPage(){ + public String getNextPage() { return nextPage; } - public Integer getTotalRecords(){ + public Integer getTotalRecords() { return totalRecords; } - public void setColumns(List reportDataColumns){ + public void setColumns(List reportDataColumns) { this.columns = reportDataColumns; } - public void setData(List> reportDataList){ + public void setData(List> reportDataList) { this.data = reportDataList; } - public void setNextPage(String nextPage){ + public void setNextPage(String nextPage) { this.nextPage = nextPage; } - public void setTotalRecords(Integer totalRecords){ + public void setTotalRecords(Integer totalRecords) { this.totalRecords = totalRecords; } diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataColumn.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataColumn.java index 06b587fb6..00b8391e8 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataColumn.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataColumn.java @@ -19,7 +19,7 @@ public class ReportMetadataColumn { @SerializedName("type") private ColumnType type; - public ReportMetadataColumn() {} + public ReportMetadataColumn() { } public ReportMetadataColumn(String id, String display, ColumnType type) { this.id = id; @@ -70,4 +70,4 @@ public boolean equals(Object o) { return Objects.equals(id, other.id) && Objects.equals(display, other.display) && Objects.equals(type, other.type); } -} \ No newline at end of file +} diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataFilter.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataFilter.java index 706d4b220..eeb5c3b24 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataFilter.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataFilter.java @@ -20,7 +20,7 @@ public class ReportMetadataFilter { @SerializedName("type") private FilterType type; - public ReportMetadataFilter() {} + public ReportMetadataFilter() { } public ReportMetadataFilter(FilterDataType datatype, String slug, FilterType type) { this.datatype = datatype; @@ -72,4 +72,4 @@ public boolean equals(Object o) { return Objects.equals(datatype, other.datatype) && Objects.equals(slug, other.slug) && Objects.equals(type, other.type); } -} \ No newline at end of file +} diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataInfo.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataInfo.java index 42d49da6d..8ab2977b4 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataInfo.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataInfo.java @@ -13,7 +13,7 @@ public class ReportMetadataInfo { private List columns; private List filters; - public ReportMetadataInfo() {} + public ReportMetadataInfo() { } public ReportMetadataInfo(String id, String title, List columns, List filters) { this.id = id; @@ -75,4 +75,4 @@ public boolean equals(Object o) { return Objects.equals(id, other.id) && Objects.equals(title, other.title) && Objects.equals(columns, other.columns) && Objects.equals(filters, other.filters); } -} \ No newline at end of file +} diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataJson.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataJson.java index bb37e53fc..f1c67744e 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataJson.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataJson.java @@ -63,4 +63,4 @@ public List getFilters() { public void setFilters(List filters) { this.filters = filters; } -} \ No newline at end of file +} diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportsMetadataInfo.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportsMetadataInfo.java index 9bb885e6e..0c061d668 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportsMetadataInfo.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportsMetadataInfo.java @@ -13,7 +13,7 @@ public class ReportsMetadataInfo { private List reportMetadataInfoList; private CommcareMetadataInfo metadataInfo; - public ReportsMetadataInfo() {} + public ReportsMetadataInfo() { } public ReportsMetadataInfo(List reportMetadataInfoList, CommcareMetadataInfo metadataInfo) { this.reportMetadataInfoList = reportMetadataInfoList; @@ -56,4 +56,4 @@ public boolean equals(Object o) { return Objects.equals(reportMetadataInfoList, other.reportMetadataInfoList) && Objects.equals(metadataInfo, other.metadataInfo); } -} \ No newline at end of file +} diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportsMetadataResponseJson.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportsMetadataResponseJson.java index eb8b96693..e08352eec 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportsMetadataResponseJson.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportsMetadataResponseJson.java @@ -32,4 +32,4 @@ public List getReports() { public void setReports(List reports) { this.reports = reports; } -} \ No newline at end of file +} diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/ColumnType.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/ColumnType.java index 1e937bfe8..df99f15fc 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/ColumnType.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/ColumnType.java @@ -3,7 +3,6 @@ import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; -import com.google.gson.JsonParseException; import java.lang.reflect.Type; @@ -20,7 +19,7 @@ public enum ColumnType { public static class ColumnTypeDeserializer implements JsonDeserializer { @Override - public ColumnType deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + public ColumnType deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) { String value = json.getAsString(); return ColumnType.valueOf(value.toUpperCase()); } diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/FilterDataType.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/FilterDataType.java index f57deaf4b..bfad3dd02 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/FilterDataType.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/FilterDataType.java @@ -3,7 +3,6 @@ import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; -import com.google.gson.JsonParseException; import java.lang.reflect.Type; @@ -21,9 +20,9 @@ public enum FilterDataType { public static class FilterDataTypeDeserializer implements JsonDeserializer { @Override - public FilterDataType deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + public FilterDataType deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) { String value = json.getAsString(); return FilterDataType.valueOf(value.toUpperCase()); } } -} \ No newline at end of file +} diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/FilterType.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/FilterType.java index c052add5b..10baa7e7a 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/FilterType.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/FilterType.java @@ -3,7 +3,6 @@ import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; -import com.google.gson.JsonParseException; import java.lang.reflect.Type; @@ -22,9 +21,9 @@ public enum FilterType { public static class FilterTypeDeserializer implements JsonDeserializer { @Override - public FilterType deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + public FilterType deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) { String value = json.getAsString(); return FilterType.valueOf(value.toUpperCase()); } } -} \ No newline at end of file +} diff --git a/commcare/src/main/java/org/motechproject/commcare/service/CommcareReportService.java b/commcare/src/main/java/org/motechproject/commcare/service/CommcareReportService.java index 97586c74e..36273da52 100644 --- a/commcare/src/main/java/org/motechproject/commcare/service/CommcareReportService.java +++ b/commcare/src/main/java/org/motechproject/commcare/service/CommcareReportService.java @@ -21,7 +21,7 @@ public interface CommcareReportService { * Same as {@link #getReportsList(String)} but uses default Commcare configuration. */ ReportsMetadataInfo getReportsList(); -} + /** * Query CommCareHQ for a report by its report id. * diff --git a/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportServiceImpl.java b/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportServiceImpl.java index fadd83930..60422e561 100644 --- a/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportServiceImpl.java +++ b/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportServiceImpl.java @@ -5,6 +5,8 @@ import org.motechproject.commcare.domain.CommcareMetadataInfo; import org.motechproject.commcare.domain.CommcareMetadataJson; import org.motechproject.commcare.domain.report.ReportMetadataInfo; +import org.motechproject.commcare.domain.report.ReportDataInfo; +import org.motechproject.commcare.domain.report.ReportDataResponseJson; import org.motechproject.commcare.domain.report.ReportsMetadataInfo; import org.motechproject.commcare.domain.report.ReportMetadataJson; import org.motechproject.commcare.domain.report.ReportsMetadataResponseJson; @@ -42,57 +44,32 @@ public CommcareReportServiceImpl(CommCareAPIHttpClient commCareHttpClient, Commc } @Override - public ReportDataInfo getReportByReportId(String reportId, String configName) { - String response = commcareHttpClient.singleReportDataRequest(configService.getByName(configName).getAccountConfig(), - reportId); + public ReportsMetadataInfo getReportsList(String configName) { + String response = commCareHttpClient.reportsListMetadataRequest(configService.getByName(configName).getAccountConfig()); - ReportDataContainerJson reportResponse = parseSingleReportFromResponse(response); + ReportsMetadataResponseJson reportsMetadataResponseJson = parseReportsFromResponse(response); - return generateReportFromReportResponse(reportResponse); + return new ReportsMetadataInfo(generateReportsFromReportsResponse(reportsMetadataResponseJson.getReports()), populateReportsMetadata(reportsMetadataResponseJson.getMetadata())); } @Override - public ReportDataInfo getReportByReportId(String reportId) { - return getReportByReportId(reportId, null); - } - - private ReportDataContainerJson parseSingleReportFromResponse(String response) { - Type reportResponseType = new TypeToken() { } .getType(); - return (ReportDataContainerJson) motechJsonReader.readFromString(response, reportResponseType); - } - - private ReportDataInfo generateReportFromReportResponse(ReportDataContainerJson reportResponse) { - return populateReportDataInfo(reportResponse); - } - - private ReportDataInfo populateReportDataInfo(ReportDataContainerJson reportResponse) { - if(reportResponse == null){ - return null; - } - - ReportDataInfo reportDataInfo = new ReportDataInfo(); - - reportDataInfo.setColumns(reportResponse.getColumns()); - reportDataInfo.setData(reportResponse.getData()); - reportDataInfo.setNextPage(reportResponse.getNextPage()); - reportDataInfo.setTotalRecords(reportResponse.getTotalRecords()); - - return reportDataInfo; + public ReportsMetadataInfo getReportsList() { + return getReportsList(null); } -} - - public ReportsMetadataInfo getReportsList(String configName) { - String response = commCareHttpClient.reportsListMetadataRequest(configService.getByName(configName).getAccountConfig()); + @Override + public ReportDataInfo getReportByReportId(String reportId, String configName) { + String response = commCareHttpClient.singleReportDataRequest(configService.getByName(configName).getAccountConfig(), + reportId); - ReportsMetadataResponseJson reportsMetadataResponseJson = parseReportsFromResponse(response); + ReportDataResponseJson reportResponse = parseSingleReportFromResponse(response); - return new ReportsMetadataInfo(generateReportsFromReportsResponse(reportsMetadataResponseJson.getReports()), populateReportsMetadata(reportsMetadataResponseJson.getMetadata())); + return generateReportFromReportResponse(reportResponse); } @Override - public ReportsMetadataInfo getReportsList() { - return getReportsList(null); + public ReportDataInfo getReportByReportId(String reportId) { + return getReportByReportId(reportId, null); } private ReportsMetadataResponseJson parseReportsFromResponse(String response) { @@ -104,6 +81,15 @@ private ReportsMetadataResponseJson parseReportsFromResponse(String response) { return (ReportsMetadataResponseJson) motechJsonReader.readFromString(response, reportsResponseType, adapters); } + private ReportDataResponseJson parseSingleReportFromResponse(String response) { + Type reportResponseType = new TypeToken() { } .getType(); + return (ReportDataResponseJson) motechJsonReader.readFromString(response, reportResponseType); + } + + private ReportDataInfo generateReportFromReportResponse(ReportDataResponseJson reportResponse) { + return populateReportDataInfo(reportResponse); + } + private List generateReportsFromReportsResponse(List reportResponses) { List reportsInfoList = Collections.emptyList(); @@ -127,7 +113,22 @@ private ReportMetadataInfo populateReportMetadataInfo(ReportMetadataJson reportR return reportMetadataInfo; } + private ReportDataInfo populateReportDataInfo(ReportDataResponseJson reportResponse) { + if (reportResponse == null) { + return null; + } + + ReportDataInfo reportDataInfo = new ReportDataInfo(); + + reportDataInfo.setColumns(reportResponse.getColumns()); + reportDataInfo.setData(reportResponse.getData()); + reportDataInfo.setNextPage(reportResponse.getNextPage()); + reportDataInfo.setTotalRecords(reportResponse.getTotalRecords()); + + return reportDataInfo; + } + private CommcareMetadataInfo populateReportsMetadata(CommcareMetadataJson metadataJson) { return new CommcareMetadataInfo(metadataJson.getLimit(), metadataJson.getNextPageQueryString(), metadataJson.getOffset(), metadataJson.getPreviousPageQueryString(), metadataJson.getTotalCount()); } -} \ No newline at end of file +} diff --git a/commcare/src/test/java/org/motechproject/commcare/service/impl/CommcareReportServiceImplTest.java b/commcare/src/test/java/org/motechproject/commcare/service/impl/CommcareReportServiceImplTest.java index bf7101ea7..280f8a62d 100644 --- a/commcare/src/test/java/org/motechproject/commcare/service/impl/CommcareReportServiceImplTest.java +++ b/commcare/src/test/java/org/motechproject/commcare/service/impl/CommcareReportServiceImplTest.java @@ -11,12 +11,12 @@ import org.motechproject.commcare.domain.report.ReportMetadataFilter; import org.motechproject.commcare.domain.report.ReportMetadataInfo; import org.motechproject.commcare.domain.report.ReportsMetadataInfo; +import org.motechproject.commcare.domain.report.ReportDataInfo; import org.motechproject.commcare.domain.report.constants.ColumnType; import org.motechproject.commcare.domain.report.constants.FilterDataType; import org.motechproject.commcare.domain.report.constants.FilterType; import org.motechproject.commcare.service.CommcareConfigService; import org.motechproject.commcare.util.ConfigsUtils; -import org.motechproject.commons.api.json.MotechJsonReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -27,6 +27,7 @@ import java.util.List; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; @@ -34,7 +35,6 @@ public class CommcareReportServiceImplTest { private static final String REPORTS_LIST_METADATA_RESPONSE = "json/service/reportsListMetadataResponse.json"; private static final Logger LOGGER = LoggerFactory.getLogger(CommcareCaseServiceImplTest.class); - private static final MotechJsonReader READER = new MotechJsonReader(); private CommcareReportServiceImpl reportService; @Mock @@ -67,6 +67,18 @@ public void shouldGetReports() { assertEquals(reportsMetadataInfo, fetched); } + @Test + public void testReportByReportId() { + String reportId = "testId"; + + when(commcareHttpClient.singleReportDataRequest(config.getAccountConfig(), reportId)).thenReturn(individualReport()); + + ReportDataInfo reportInstance = reportService.getReportByReportId(reportId); + + assertNotNull(reportInstance); + + } + private String getResponseForReportsListMetadata() { return getRawJson(REPORTS_LIST_METADATA_RESPONSE); } @@ -112,17 +124,6 @@ private ReportsMetadataInfo prepareReportsMetadataInfo() { return new ReportsMetadataInfo(reportMetadataInfoList, metadataInfo); } -} - public void testReportByReportId() { - String reportId = "testId"; - - when(commcareHttpClient.singleReportDataRequest(config.getAccountConfig(), reportId)).thenReturn(individualReport()); - - ReportDataInfo reportInstance = reportService.getReportByReportId(reportId); - - assertNotNull(reportInstance); - - } private String individualReport() { return "{" + " \"columns\": [" + " {" + " \"header\": \"District\"," + " \"slug\": \"district\"" + " }," + " {" + " \"header\": \"Num Children Visited\"," + " \"slug\": \"number_of_children_visited\"" + " }," + " {" + " \"header\": \"Gender-male\"," + " \"expand_column_value\": \"male\"," + " \"slug\": \"gender-male\"" + " }," + " {" + " \"header\": \"Gender-female\"," + " \"expand_column_value\": \"female\"," + " \"slug\": \"gender-female\"" + " }" + " ]," + " \"data\": [" + " {" + " \"district\": \"Middlesex\"," + " \"number_of_children_visited\": 46," + " \"gender-male\": 10," + " \"gender-female\": 35" + " }," + " {" + " \"district\": \"Suffolk\"," + " \"number_of_children_visited\": 85," + " \"gender-male\": 81," + " \"gender-female\": 4" + " }" + " ]," + " \"next_page\": \"/a/motechproject/api/v0.5/configurablereportdata/9aab0eeb88555a7b4568676883e7379a/?offset=3&limit=3&state=vermont\"," + " \"total_records\": 30" + "}"; diff --git a/commcare/src/test/resources/json/service/reportDataResponse.json b/commcare/src/test/resources/json/service/reportDataResponse.json new file mode 100644 index 000000000..7c62b6553 --- /dev/null +++ b/commcare/src/test/resources/json/service/reportDataResponse.json @@ -0,0 +1,38 @@ +{ + "columns": [ + { + "header": "District", + "slug": "district" + }, + { + "header": "Num Children Visited", + "slug": "number_of_children_visited" + }, + { + "header": "Gender-male", + "expand_column_value": "male", + "slug": "gender-male" + }, + { + "header": "Gender-female", + "expand_column_value": "female", + "slug": "gender-female" + } + ], + "data": [ + { + "district": "Middlesex", + "number_of_children_visited": 46, + "gender-male": 10, + "gender-female": 35 + }, + { + "district": "Suffolk", + "number_of_children_visited": 85, + "gender-male": 81, + "gender-female": 4 + } + ], + "next_page": "/a/[PROJECT]/api/v0.5/configurablereportdata/9aab0eeb88555a7b4568676883e7379a/?offset=3&limit=3&state=vermont", + "total_records": 30 +} \ No newline at end of file From aa380c9bb7e5c5ea773375b110b7ab1b908fa8bc Mon Sep 17 00:00:00 2001 From: Jakub Redlarski Date: Thu, 29 Sep 2016 09:56:42 +0200 Subject: [PATCH 070/202] MOTECH-2889: Fixed tests Added equals and hashCode methods Added .json file that contains single report data response Fixed test which covers the support for the Report Data Endpoint --- .../domain/report/ReportDataColumn.java | 31 +++++++++++++ .../domain/report/ReportDataInfo.java | 33 ++++++++++++- .../impl/CommcareReportServiceImpl.java | 32 ++++++------- .../impl/CommcareReportServiceImplTest.java | 46 ++++++++++++++++--- .../json/service/reportDataResponse.json | 2 +- 5 files changed, 118 insertions(+), 26 deletions(-) diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataColumn.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataColumn.java index 06a6679c4..4a33541e6 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataColumn.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataColumn.java @@ -2,6 +2,8 @@ import com.google.gson.annotations.SerializedName; +import java.util.Objects; + /** * Represents a single column report data. */ @@ -16,6 +18,14 @@ public class ReportDataColumn { @SerializedName("expand_column_value") private String expandColumnValue; + public ReportDataColumn() { } + + public ReportDataColumn(String header, String slug, String expandColumnValue) { + this.header = header; + this.slug = slug; + this.expandColumnValue = expandColumnValue; + } + public String getHeader() { return header; } @@ -39,4 +49,25 @@ public void setSlug(String slug) { public void setExpandColumnValue(String expandColumnValue) { this.expandColumnValue = expandColumnValue; } + + @Override + public int hashCode() { + return Objects.hash(header, slug, expandColumnValue); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (!(o instanceof ReportDataColumn)) { + return false; + } + + ReportDataColumn other = (ReportDataColumn) o; + + return Objects.equals(header, other.header) && Objects.equals(slug, other.slug) + && Objects.equals(expandColumnValue, other.expandColumnValue); + } } diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataInfo.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataInfo.java index 41b46f350..b5cbee16d 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataInfo.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportDataInfo.java @@ -1,8 +1,8 @@ package org.motechproject.commcare.domain.report; - import java.util.List; import java.util.Map; +import java.util.Objects; /** * Represents a single CommCareHQ report data. It's a part of the MOTECH model. @@ -14,6 +14,15 @@ public class ReportDataInfo { private String nextPage; private Integer totalRecords; + public ReportDataInfo() { } + + public ReportDataInfo(List columns, List> data, String nextPage, Integer totalRecords) { + this.columns = columns; + this.data = data; + this.nextPage = nextPage; + this.totalRecords = totalRecords; + } + public List getColumns() { return columns; } @@ -45,4 +54,26 @@ public Integer getTotalRecords() { public void setTotalRecords(Integer totalRecords) { this.totalRecords = totalRecords; } + + @Override + public int hashCode() { + return Objects.hash(columns, data, nextPage, totalRecords); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (!(o instanceof ReportDataInfo)) { + return false; + } + + ReportDataInfo other = (ReportDataInfo) o; + + return Objects.equals(columns, other.columns) && Objects.equals(data, other.data) + && Objects.equals(nextPage, other.nextPage) && Objects.equals(totalRecords, other.totalRecords); + } + } diff --git a/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportServiceImpl.java b/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportServiceImpl.java index 60422e561..f94899325 100644 --- a/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportServiceImpl.java +++ b/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportServiceImpl.java @@ -32,20 +32,20 @@ @Service public class CommcareReportServiceImpl implements CommcareReportService { - private CommCareAPIHttpClient commCareHttpClient; + private CommCareAPIHttpClient commcareHttpClient; private CommcareConfigService configService; private MotechJsonReader motechJsonReader; @Autowired - public CommcareReportServiceImpl(CommCareAPIHttpClient commCareHttpClient, CommcareConfigService configService) { - this.commCareHttpClient = commCareHttpClient; + public CommcareReportServiceImpl(CommCareAPIHttpClient commcareHttpClient, CommcareConfigService configService) { + this.commcareHttpClient = commcareHttpClient; this.configService = configService; this.motechJsonReader = new MotechJsonReader(); } @Override public ReportsMetadataInfo getReportsList(String configName) { - String response = commCareHttpClient.reportsListMetadataRequest(configService.getByName(configName).getAccountConfig()); + String response = commcareHttpClient.reportsListMetadataRequest(configService.getByName(configName).getAccountConfig()); ReportsMetadataResponseJson reportsMetadataResponseJson = parseReportsFromResponse(response); @@ -59,7 +59,7 @@ public ReportsMetadataInfo getReportsList() { @Override public ReportDataInfo getReportByReportId(String reportId, String configName) { - String response = commCareHttpClient.singleReportDataRequest(configService.getByName(configName).getAccountConfig(), + String response = commcareHttpClient.singleReportDataRequest(configService.getByName(configName).getAccountConfig(), reportId); ReportDataResponseJson reportResponse = parseSingleReportFromResponse(response); @@ -107,28 +107,26 @@ private ReportMetadataInfo populateReportMetadataInfo(ReportMetadataJson reportR ReportMetadataInfo reportMetadataInfo = null; if (reportResponse != null) { - reportMetadataInfo = new ReportMetadataInfo(reportResponse.getId(), reportResponse.getTitle(), reportResponse.getColumns(), reportResponse.getFilters()); + reportMetadataInfo = new ReportMetadataInfo(reportResponse.getId(), reportResponse.getTitle(), + reportResponse.getColumns(), reportResponse.getFilters()); } return reportMetadataInfo; } private ReportDataInfo populateReportDataInfo(ReportDataResponseJson reportResponse) { - if (reportResponse == null) { - return null; - } - - ReportDataInfo reportDataInfo = new ReportDataInfo(); + ReportDataInfo reportDataInfo = null; - reportDataInfo.setColumns(reportResponse.getColumns()); - reportDataInfo.setData(reportResponse.getData()); - reportDataInfo.setNextPage(reportResponse.getNextPage()); - reportDataInfo.setTotalRecords(reportResponse.getTotalRecords()); + if (reportResponse != null) { + reportDataInfo = new ReportDataInfo(reportResponse.getColumns(), reportResponse.getData(), + reportResponse.getNextPage(), reportResponse.getTotalRecords()); + } - return reportDataInfo; + return reportDataInfo; } private CommcareMetadataInfo populateReportsMetadata(CommcareMetadataJson metadataJson) { - return new CommcareMetadataInfo(metadataJson.getLimit(), metadataJson.getNextPageQueryString(), metadataJson.getOffset(), metadataJson.getPreviousPageQueryString(), metadataJson.getTotalCount()); + return new CommcareMetadataInfo(metadataJson.getLimit(), metadataJson.getNextPageQueryString(), + metadataJson.getOffset(), metadataJson.getPreviousPageQueryString(), metadataJson.getTotalCount()); } } diff --git a/commcare/src/test/java/org/motechproject/commcare/service/impl/CommcareReportServiceImplTest.java b/commcare/src/test/java/org/motechproject/commcare/service/impl/CommcareReportServiceImplTest.java index 280f8a62d..15dddf84c 100644 --- a/commcare/src/test/java/org/motechproject/commcare/service/impl/CommcareReportServiceImplTest.java +++ b/commcare/src/test/java/org/motechproject/commcare/service/impl/CommcareReportServiceImplTest.java @@ -12,6 +12,7 @@ import org.motechproject.commcare.domain.report.ReportMetadataInfo; import org.motechproject.commcare.domain.report.ReportsMetadataInfo; import org.motechproject.commcare.domain.report.ReportDataInfo; +import org.motechproject.commcare.domain.report.ReportDataColumn; import org.motechproject.commcare.domain.report.constants.ColumnType; import org.motechproject.commcare.domain.report.constants.FilterDataType; import org.motechproject.commcare.domain.report.constants.FilterType; @@ -24,16 +25,22 @@ import java.io.IOException; import java.net.URL; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; +/** + * Test class for {@link CommcareReportServiceImpl} + */ public class CommcareReportServiceImplTest { private static final String REPORTS_LIST_METADATA_RESPONSE = "json/service/reportsListMetadataResponse.json"; + private static final String REPORT_DATA_RESPONSE = "json/service/reportDataResponse.json"; + private static final String REPORT_ID = "reportId"; private static final Logger LOGGER = LoggerFactory.getLogger(CommcareCaseServiceImplTest.class); private CommcareReportServiceImpl reportService; @@ -69,13 +76,13 @@ public void shouldGetReports() { @Test public void testReportByReportId() { - String reportId = "testId"; + ReportDataInfo reportDataInfo = prepareReportDataInfo(); - when(commcareHttpClient.singleReportDataRequest(config.getAccountConfig(), reportId)).thenReturn(individualReport()); + when(commcareHttpClient.singleReportDataRequest(config.getAccountConfig(), REPORT_ID)).thenReturn(getResponseForReportData()); - ReportDataInfo reportInstance = reportService.getReportByReportId(reportId); + ReportDataInfo fetched = reportService.getReportByReportId(REPORT_ID); - assertNotNull(reportInstance); + assertEquals(reportDataInfo, fetched); } @@ -83,6 +90,10 @@ private String getResponseForReportsListMetadata() { return getRawJson(REPORTS_LIST_METADATA_RESPONSE); } + private String getResponseForReportData() { + return getRawJson(REPORT_DATA_RESPONSE); + } + private String getRawJson(String path) { try { URL url = this.getClass().getClassLoader().getResource(path); @@ -125,7 +136,28 @@ private ReportsMetadataInfo prepareReportsMetadataInfo() { return new ReportsMetadataInfo(reportMetadataInfoList, metadataInfo); } - private String individualReport() { - return "{" + " \"columns\": [" + " {" + " \"header\": \"District\"," + " \"slug\": \"district\"" + " }," + " {" + " \"header\": \"Num Children Visited\"," + " \"slug\": \"number_of_children_visited\"" + " }," + " {" + " \"header\": \"Gender-male\"," + " \"expand_column_value\": \"male\"," + " \"slug\": \"gender-male\"" + " }," + " {" + " \"header\": \"Gender-female\"," + " \"expand_column_value\": \"female\"," + " \"slug\": \"gender-female\"" + " }" + " ]," + " \"data\": [" + " {" + " \"district\": \"Middlesex\"," + " \"number_of_children_visited\": 46," + " \"gender-male\": 10," + " \"gender-female\": 35" + " }," + " {" + " \"district\": \"Suffolk\"," + " \"number_of_children_visited\": 85," + " \"gender-male\": 81," + " \"gender-female\": 4" + " }" + " ]," + " \"next_page\": \"/a/motechproject/api/v0.5/configurablereportdata/9aab0eeb88555a7b4568676883e7379a/?offset=3&limit=3&state=vermont\"," + " \"total_records\": 30" + "}"; + private ReportDataInfo prepareReportDataInfo() { + List columns = new ArrayList<>(); + columns.add(new ReportDataColumn("District", "district", null)); + columns.add(new ReportDataColumn("Num Children Visited", "number_of_children_visited", null)); + columns.add(new ReportDataColumn("Gender-male", "gender-male", "male")); + columns.add(new ReportDataColumn("Gender-female", "gender-female", "female")); + + List> data = new ArrayList<>(); + Map singleData = new HashMap<>(); + singleData.put("district", "Middlesex"); + singleData.put("number_of_children_visited", "46"); + singleData.put("gender-male", "10"); + singleData.put("gender-female", "35"); + data.add(singleData); + + singleData = new HashMap<>(); + singleData.put("district", "Suffolk"); + singleData.put("number_of_children_visited", "85"); + singleData.put("gender-male", "81"); + singleData.put("gender-female", "4"); + data.add(singleData); + + return new ReportDataInfo(columns, data, "/a/domainOne/api/v0.5/configurablereportdata/9aab0eeb88555a7b4568676883e7379a/?offset=3&limit=3&state=vermont", 30); } } diff --git a/commcare/src/test/resources/json/service/reportDataResponse.json b/commcare/src/test/resources/json/service/reportDataResponse.json index 7c62b6553..9bf8a5b62 100644 --- a/commcare/src/test/resources/json/service/reportDataResponse.json +++ b/commcare/src/test/resources/json/service/reportDataResponse.json @@ -33,6 +33,6 @@ "gender-female": 4 } ], - "next_page": "/a/[PROJECT]/api/v0.5/configurablereportdata/9aab0eeb88555a7b4568676883e7379a/?offset=3&limit=3&state=vermont", + "next_page": "/a/domainOne/api/v0.5/configurablereportdata/9aab0eeb88555a7b4568676883e7379a/?offset=3&limit=3&state=vermont", "total_records": 30 } \ No newline at end of file From e26d9f8c60d3c7ca6e61ab237c00ab52006818a9 Mon Sep 17 00:00:00 2001 From: mkruszynski Date: Fri, 30 Sep 2016 08:33:25 +0200 Subject: [PATCH 071/202] MOTECH-2885: Fixes after review --- .../openmrs/service/impl/OpenMRSObservationServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSObservationServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSObservationServiceImpl.java index cb6ed5dca..7d75e81c6 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSObservationServiceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSObservationServiceImpl.java @@ -110,7 +110,7 @@ public Observation getObservationByPatientUUIDAndConceptUUID(String configName, if (CollectionUtils.isNotEmpty(observations.getResults())) { return obsResource.getObservationById(config, observations.getResults().get(0).getUuid()); } - return null; + return new Observation(); } catch (HttpClientErrorException e) { LOGGER.error("Error while fetching observations with Patient uuid: " + patientUUID + " and Concept uuid: " + conceptUUID); return null; From f7407a19fd1c961cf73facd79a27fec36fa51447 Mon Sep 17 00:00:00 2001 From: mkruszynski Date: Fri, 30 Sep 2016 10:03:23 +0200 Subject: [PATCH 072/202] MOTECH-2885: Conflicts resolved --- .../java/org/motechproject/openmrs/domain/Observation.java | 3 +-- .../openmrs/resource/impl/ObservationResourceImplTest.java | 5 ++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/openmrs/src/main/java/org/motechproject/openmrs/domain/Observation.java b/openmrs/src/main/java/org/motechproject/openmrs/domain/Observation.java index 6d712517c..080833b00 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/domain/Observation.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/domain/Observation.java @@ -8,7 +8,6 @@ import com.google.gson.JsonPrimitive; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; -import org.motechproject.openmrs.util.JsonUtils; import java.lang.reflect.Type; import java.text.SimpleDateFormat; @@ -278,7 +277,7 @@ public ObservationValue deserialize (JsonElement json, Type typeOfT, JsonDeseria if (json.isJsonObject()) { JsonObject jsonObject = json.getAsJsonObject(); - observationValue.setDisplay(jsonObject.get("display").getAsString()); + observationValue.setDisplay(jsonObject.get(DISPLAY_KEY).getAsString()); } else if (json.isJsonPrimitive()) { JsonPrimitive jsonPrimitive = json.getAsJsonPrimitive(); observationValue.setDisplay(jsonPrimitive.getAsString()); diff --git a/openmrs/src/test/java/org/motechproject/openmrs/resource/impl/ObservationResourceImplTest.java b/openmrs/src/test/java/org/motechproject/openmrs/resource/impl/ObservationResourceImplTest.java index 2c3af9da9..0ce123ce0 100644 --- a/openmrs/src/test/java/org/motechproject/openmrs/resource/impl/ObservationResourceImplTest.java +++ b/openmrs/src/test/java/org/motechproject/openmrs/resource/impl/ObservationResourceImplTest.java @@ -79,7 +79,6 @@ public void shouldQueryForObservationByPatientId() throws Exception { } @Test -<<<<<<< HEAD public void shouldQueryForObservationByPatientIdAndConceptId() throws Exception { String patientId = "OOO"; String conceptId = "CCC"; @@ -95,7 +94,8 @@ public void shouldQueryForObservationByPatientIdAndConceptId() throws Exception assertThat(result, equalTo(readFromFile(OBSERVATION_QUERY_RESPONSE_JSON, ObservationListResult.class))); assertThat(requestCaptor.getValue().getHeaders(), equalTo(getHeadersForGet(config))); assertThat(requestCaptor.getValue().getBody(), nullValue()); -======= + } + public void shouldCreateObservation() throws Exception { String observationJson = prepareObservationJson(); ObservationFromJSON observation = prepareObservation(); @@ -134,7 +134,6 @@ private class ObservationFromJSON { private String encounter; private String value; private List groupsMembers; ->>>>>>> upstream/master } } From 4e281045db9bd72f8f54a22ecefddf5af1dfca4f Mon Sep 17 00:00:00 2001 From: mkruszynski Date: Fri, 30 Sep 2016 10:27:56 +0200 Subject: [PATCH 073/202] MOTECH-2949: ODK test will have more time to pass --- .../test/java/org/motechproject/odk/it/FormControllerIT.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/odk/src/test/java/org/motechproject/odk/it/FormControllerIT.java b/odk/src/test/java/org/motechproject/odk/it/FormControllerIT.java index 36bab502e..b07fc5cf7 100644 --- a/odk/src/test/java/org/motechproject/odk/it/FormControllerIT.java +++ b/odk/src/test/java/org/motechproject/odk/it/FormControllerIT.java @@ -76,7 +76,7 @@ public void testNestedRepeats() throws Exception { if (count == WAIT_COUNT) { fail(TIMEOUT); } - Thread.sleep(2000); + Thread.sleep(4000); } List events = mockEventListener.getEvents(); From 18f4a7dc1108aad46b2688539dddda3c97a40af9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Artur=20Fija=C5=82?= Date: Fri, 30 Sep 2016 15:08:14 +0200 Subject: [PATCH 074/202] MOTECH-2861: Fixed integration tests for mTraining module. --- .../impl/CourseStructureServiceImpl.java | 2 +- .../it/CourseStructureServiceBundleIT.java | 91 +++++++++---------- .../service/it/MTrainingServiceBundleIT.java | 39 +++++--- .../service/CourseStructureServiceTest.java | 7 +- 4 files changed, 75 insertions(+), 64 deletions(-) diff --git a/mtraining/src/main/java/org/motechproject/mtraining/service/impl/CourseStructureServiceImpl.java b/mtraining/src/main/java/org/motechproject/mtraining/service/impl/CourseStructureServiceImpl.java index 2212d7038..9e685e556 100644 --- a/mtraining/src/main/java/org/motechproject/mtraining/service/impl/CourseStructureServiceImpl.java +++ b/mtraining/src/main/java/org/motechproject/mtraining/service/impl/CourseStructureServiceImpl.java @@ -189,7 +189,7 @@ private Quiz getQuiz(Long id, Map quizMap) { private void clearRelationships(List courses, Map courseMap, Map chapterMap, Map lessonMap, Map quizMap) { for (CourseUnitDto courseDto : courses) { - Course course = courseDataService.findCourseById(courseDto.getId()); + Course course = courseDataService.detachedCopy(courseDataService.findCourseById(courseDto.getId())); if (course == null) { throw new CourseUnitNotFoundException("Cannot find course with id: " + courseDto.getId()); diff --git a/mtraining/src/test/java/org/motechproject/mtraining/service/it/CourseStructureServiceBundleIT.java b/mtraining/src/test/java/org/motechproject/mtraining/service/it/CourseStructureServiceBundleIT.java index 8e3a332e9..1a32f138d 100644 --- a/mtraining/src/test/java/org/motechproject/mtraining/service/it/CourseStructureServiceBundleIT.java +++ b/mtraining/src/test/java/org/motechproject/mtraining/service/it/CourseStructureServiceBundleIT.java @@ -667,24 +667,23 @@ public void updateCourseStructureTest6() throws Exception { verifyUnused(asList(QUIZ_3, QUIZ_4, QUIZ_6, "quiz_7"), asList("lesson_10", LESSON_7, LESSON_8, LESSON_9), asList(CHAPTER_4, CHAPTER_5, CHAPTER_6)); } - - private void verifyUnused(List quizzes, List lessons, List chapters) { - // verify unused units - List unusedQuizzes = mTrainingService.getUnusedQuizzes(); - List unusedLessons = mTrainingService.getUnusedLessons(); - List unusedChapters = mTrainingService.getUnusedChapters(); - - List unusedUnits = extract(unusedQuizzes, on(Quiz.class).getName()); - Collections.sort(unusedUnits); - assertEquals(quizzes, unusedUnits); - - unusedUnits = extract(unusedLessons, on(Lesson.class).getName()); - Collections.sort(unusedUnits); - assertEquals(lessons, unusedUnits); - - unusedUnits = extract(unusedChapters, on(Chapter.class).getName()); - Collections.sort(unusedUnits); - assertEquals(chapters, unusedUnits); + private void verifyUnused(List quizzes, List lessons, List chapters){ + List allQuizzes = mTrainingService.getAllQuizzes(); + List allLessons = mTrainingService.getAllLessons(); + List allChapters = mTrainingService.getAllChapters(); + + for(Quiz quiz : allQuizzes){ + if(quizzes.contains(quiz.getName())) + assertNull(quiz.getChapter()); + } + for(Lesson lesson : allLessons){ + if(lessons.contains(lesson.getName())) + assertNull(lesson.getChapter()); + } + for(Chapter chapter : allChapters){ + if(chapters.contains(chapter.getName())) + assertNull(chapter.getCourse()); + } } private void verifyLessons(Chapter chapter, int size, List expectedLessons, List expectedStates) { @@ -710,9 +709,9 @@ private void setUpData() { Quiz q2 = new Quiz(QUIZ_2, CourseUnitState.Active, "content_2", "Description_2", props); Quiz q3 = new Quiz(QUIZ_3, CourseUnitState.Active, "content_3", "Description_3", props); - q1 = quizDataService.create(q1); - q2 = quizDataService.create(q2); - q3 = quizDataService.create(q3); + q1 = quizDataService.detachedCopy(quizDataService.create(q1)); + q2 = quizDataService.detachedCopy(quizDataService.create(q2)); + q3 = quizDataService.detachedCopy(quizDataService.create(q3)); idMap.put(q1.getName(), q1.getId()); idMap.put(q2.getName(), q2.getId()); @@ -724,11 +723,11 @@ private void setUpData() { Lesson l4 = new Lesson(LESSON_4, CourseUnitState.Active, "content_4", "Description_4", props); Lesson l5 = new Lesson(LESSON_5, CourseUnitState.Active, "content_5", "Description_5", props); - l1 = lessonDataService.create(l1); - l2 = lessonDataService.create(l2); - l3 = lessonDataService.create(l3); - l4 = lessonDataService.create(l4); - l5 = lessonDataService.create(l5); + l1 = lessonDataService.detachedCopy(lessonDataService.create(l1)); + l2 = lessonDataService.detachedCopy(lessonDataService.create(l2)); + l3 = lessonDataService.detachedCopy(lessonDataService.create(l3)); + l4 = lessonDataService.detachedCopy(lessonDataService.create(l4)); + l5 = lessonDataService.detachedCopy(lessonDataService.create(l5)); idMap.put(l1.getName(), l1.getId()); idMap.put(l2.getName(), l2.getId()); @@ -740,9 +739,9 @@ private void setUpData() { Chapter ch2 = new Chapter(CHAPTER_2, CourseUnitState.Active, "content_2", "Description_2", props); Chapter ch3 = new Chapter(CHAPTER_3, CourseUnitState.Active, "content_3", "Description_3", props); - ch1 = chapterDataService.create(ch1); - ch2 = chapterDataService.create(ch2); - ch3 = chapterDataService.create(ch3); + ch1 = chapterDataService.detachedCopy(chapterDataService.create(ch1)); + ch2 = chapterDataService.detachedCopy(chapterDataService.create(ch2)); + ch3 = chapterDataService.detachedCopy(chapterDataService.create(ch3)); idMap.put(ch1.getName(), ch1.getId()); idMap.put(ch2.getName(), ch2.getId()); @@ -765,15 +764,15 @@ private void setUpData() { ch1.setLessons(lessons1); ch2.setLessons(lessons2); ch3.setLessons(lessons3); - ch1 = chapterDataService.update(ch1); - ch2 = chapterDataService.update(ch2); - ch3 = chapterDataService.update(ch3); + ch1 = chapterDataService.detachedCopy(chapterDataService.update(ch1)); + ch2 = chapterDataService.detachedCopy(chapterDataService.update(ch2)); + ch3 = chapterDataService.detachedCopy(chapterDataService.update(ch3)); Course c1 = new Course(COURSE_1, CourseUnitState.Active, "content_1", "Description_1", props); Course c2 = new Course(COURSE_2, CourseUnitState.Active, "content_2", "Description_2", props); - c1 = courseDataService.create(c1); - c2 = courseDataService.create(c2); + c1 = courseDataService.detachedCopy(courseDataService.create(c1)); + c2 = courseDataService.detachedCopy(courseDataService.create(c2)); idMap.put(c1.getName(), c1.getId()); idMap.put(c2.getName(), c2.getId()); @@ -795,10 +794,10 @@ private void setUpData() { Lesson l7 = new Lesson(LESSON_7, CourseUnitState.Active, "content_7", "Description_7", props); Lesson l8 = new Lesson(LESSON_8, CourseUnitState.Active, "content_8", "Description_8", props); Lesson l9 = new Lesson(LESSON_9, CourseUnitState.Active, "content_9", "Description_9", props); - lessonDataService.create(l6); - lessonDataService.create(l7); - lessonDataService.create(l8); - lessonDataService.create(l9); + l6 = lessonDataService.detachedCopy(lessonDataService.create(l6)); + l7 = lessonDataService.detachedCopy(lessonDataService.create(l7)); + l8 = lessonDataService.detachedCopy(lessonDataService.create(l8)); + l9 = lessonDataService.detachedCopy(lessonDataService.create(l9)); idMap.put(l6.getName(), l6.getId()); idMap.put(l7.getName(), l7.getId()); @@ -808,9 +807,9 @@ private void setUpData() { Chapter ch4 = new Chapter(CHAPTER_4, CourseUnitState.Active, "content_4", "Description_4", props); Chapter ch5 = new Chapter(CHAPTER_5, CourseUnitState.Active, "content_5", "Description_5", props); Chapter ch6 = new Chapter(CHAPTER_6, CourseUnitState.Active, "content_6", "Description_6", props); - chapterDataService.create(ch4); - chapterDataService.create(ch5); - chapterDataService.create(ch6); + ch4 = chapterDataService.detachedCopy(chapterDataService.create(ch4)); + ch5 = chapterDataService.detachedCopy(chapterDataService.create(ch5)); + ch6 = chapterDataService.detachedCopy(chapterDataService.create(ch6)); idMap.put(ch4.getName(), ch4.getId()); idMap.put(ch5.getName(), ch5.getId()); @@ -819,9 +818,9 @@ private void setUpData() { Quiz q4 = new Quiz(QUIZ_4, CourseUnitState.Active, "content_4", "Description_4", props); Quiz q5 = new Quiz(QUIZ_5, CourseUnitState.Active, "content_5", "Description_5", props); Quiz q6 = new Quiz(QUIZ_6, CourseUnitState.Active, "content_6", "Description_6", props); - quizDataService.create(q4); - quizDataService.create(q5); - quizDataService.create(q6); + q4 = quizDataService.detachedCopy(quizDataService.create(q4)); + q5 = quizDataService.detachedCopy(quizDataService.create(q5)); + q6 = quizDataService.detachedCopy(quizDataService.create(q6)); idMap.put(q4.getName(), q4.getId()); idMap.put(q5.getName(), q5.getId()); @@ -829,8 +828,8 @@ private void setUpData() { Course c3 = new Course(COURSE_3, CourseUnitState.Active, "content_3", "Description_3", props); Course c4 = new Course(COURSE_4, CourseUnitState.Active, "content_4", "Description_4", props); - courseDataService.create(c3); - courseDataService.create(c4); + c3 = courseDataService.detachedCopy(courseDataService.create(c3)); + c4 = courseDataService.detachedCopy(courseDataService.create(c4)); idMap.put(c3.getName(), c3.getId()); idMap.put(c4.getName(), c4.getId()); diff --git a/mtraining/src/test/java/org/motechproject/mtraining/service/it/MTrainingServiceBundleIT.java b/mtraining/src/test/java/org/motechproject/mtraining/service/it/MTrainingServiceBundleIT.java index dc27337fe..7c7625de9 100644 --- a/mtraining/src/test/java/org/motechproject/mtraining/service/it/MTrainingServiceBundleIT.java +++ b/mtraining/src/test/java/org/motechproject/mtraining/service/it/MTrainingServiceBundleIT.java @@ -60,7 +60,6 @@ public class MTrainingServiceBundleIT extends BasePaxIT { @Inject private QuizDataService quizDataService; - @Before public void setup() { getLogger().info("setup"); @@ -207,15 +206,21 @@ public Course doInTransaction(TransactionStatus transactionStatus) { @Test public void testCourseChapterUpdate() throws Exception { - Course firstCourse = mTrainingService.createCourse(generateFullCourse("testSharedChapter")); + courseDataService.doInTransaction(new TransactionCallback() { + @Override + public Course doInTransaction(TransactionStatus transactionStatus) { + Course firstCourse = mTrainingService.createCourse(generateFullCourse("testSharedChapter")); - Chapter chapterToUpdate = firstCourse.getChapters().get(0); - chapterToUpdate.setState(CourseUnitState.Inactive); - Chapter updatedChapter = mTrainingService.updateChapter(chapterToUpdate); - firstCourse = mTrainingService.getCourseById(firstCourse.getId()); + Chapter chapterToUpdate = firstCourse.getChapters().get(0); + chapterToUpdate.setState(CourseUnitState.Inactive); + Chapter updatedChapter = mTrainingService.updateChapter(chapterToUpdate); + firstCourse = mTrainingService.getCourseById(firstCourse.getId()); - assertEquals(firstCourse.getChapters().get(0).getId(), updatedChapter.getId()); - assertEquals(firstCourse.getChapters().get(0).getState(), updatedChapter.getState()); + assertEquals(firstCourse.getChapters().get(0).getId(), updatedChapter.getId()); + assertEquals(firstCourse.getChapters().get(0).getState(), updatedChapter.getState()); + return firstCourse; + } + }); } @Test @@ -230,14 +235,20 @@ public void testCourseUpdateStatus() throws Exception { @Test public void testCourseUpdateAddChapter() throws Exception { - Course firstCourse = mTrainingService.createCourse(generateFullCourse("testCourseUpdateAddChapter")); - assertEquals(2, firstCourse.getChapters().size()); + courseDataService.doInTransaction(new TransactionCallback() { + @Override + public Course doInTransaction(TransactionStatus transactionStatus) { + Course firstCourse = courseDataService.detachedCopy(mTrainingService.createCourse(generateFullCourse("testCourseUpdateAddChapter"))); + assertEquals(2, firstCourse.getChapters().size()); - Chapter newChapter = new Chapter("newChapter", CourseUnitState.Active, "newChapterContent", null, null); - firstCourse.getChapters().add(newChapter); + Chapter newChapter = new Chapter("newChapter", CourseUnitState.Active, "newChapterContent", null, null); + firstCourse.getChapters().add(newChapter); - Course updated = mTrainingService.updateCourse(firstCourse); - assertEquals(3, updated.getChapters().size()); + Course updated = mTrainingService.updateCourse(firstCourse); + assertEquals(3, updated.getChapters().size()); + return updated; + } + }); } @Test diff --git a/mtraining/src/test/java/org/motechproject/mtraining/service/ut/service/CourseStructureServiceTest.java b/mtraining/src/test/java/org/motechproject/mtraining/service/ut/service/CourseStructureServiceTest.java index 3527f7284..35217fc88 100644 --- a/mtraining/src/test/java/org/motechproject/mtraining/service/ut/service/CourseStructureServiceTest.java +++ b/mtraining/src/test/java/org/motechproject/mtraining/service/ut/service/CourseStructureServiceTest.java @@ -84,8 +84,8 @@ public void shouldRemoveRelations() { chapter.setId(11l); Course course = new Course(Constants.COURSE, CourseUnitState.Active, Constants.COURSE, Constants.COURSE, null, asList(chapter)); course.setId(1l); - - when(courseDataService.findCourseById(1l)).thenReturn(course); + + when(courseDataService.detachedCopy(courseDataService.findCourseById(1l))).thenReturn(course); courseStructureService.updateCourseStructure(coursesToUpdate); @@ -132,11 +132,12 @@ public void shouldCreateCorrectStructure() { Course course = new Course(Constants.COURSE, CourseUnitState.Active, Constants.COURSE, Constants.COURSE, null, null); course.setId(1l); - when(courseDataService.findCourseById(1l)).thenReturn(course); + when(courseDataService.detachedCopy(courseDataService.findCourseById(1l))).thenReturn(course); when(chapterDataService.findChapterById(11l)).thenReturn(chapter); when(lessonDataService.findLessonById(13l)).thenReturn(lesson); when(quizDataService.findQuizById(15l)).thenReturn(quiz); + courseStructureService.updateCourseStructure(coursesToUpdate); verify(courseDataService).update(courseArgumentCaptor.capture()); From 7c42ed31ad76b135f9614333d51e56afee6cab8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Artur=20Fija=C5=82?= Date: Fri, 30 Sep 2016 15:16:22 +0200 Subject: [PATCH 075/202] MOTECH-2861: Style corresctions --- .../it/CourseStructureServiceBundleIT.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/mtraining/src/test/java/org/motechproject/mtraining/service/it/CourseStructureServiceBundleIT.java b/mtraining/src/test/java/org/motechproject/mtraining/service/it/CourseStructureServiceBundleIT.java index 1a32f138d..8fe8ea183 100644 --- a/mtraining/src/test/java/org/motechproject/mtraining/service/it/CourseStructureServiceBundleIT.java +++ b/mtraining/src/test/java/org/motechproject/mtraining/service/it/CourseStructureServiceBundleIT.java @@ -672,17 +672,20 @@ private void verifyUnused(List quizzes, List lessons, List allLessons = mTrainingService.getAllLessons(); List allChapters = mTrainingService.getAllChapters(); - for(Quiz quiz : allQuizzes){ - if(quizzes.contains(quiz.getName())) + for(Quiz quiz : allQuizzes) { + if(quizzes.contains(quiz.getName())) { assertNull(quiz.getChapter()); + } } - for(Lesson lesson : allLessons){ - if(lessons.contains(lesson.getName())) + for(Lesson lesson : allLessons) { + if(lessons.contains(lesson.getName())) { assertNull(lesson.getChapter()); + } } - for(Chapter chapter : allChapters){ - if(chapters.contains(chapter.getName())) + for(Chapter chapter : allChapters) { + if(chapters.contains(chapter.getName())) { assertNull(chapter.getCourse()); + } } } From 2f523cf6e43b9021ec772c192aca0812ea28f2a1 Mon Sep 17 00:00:00 2001 From: mkruszynski Date: Mon, 3 Oct 2016 13:52:33 +0200 Subject: [PATCH 076/202] MOTECH-2885: Added number of observations bubble --- .../openmrs/domain/Observation.java | 11 +++++++++++ .../service/OpenMRSObservationService.java | 3 ++- .../impl/OpenMRSObservationServiceImpl.java | 10 ++-------- .../openmrs/tasks/OpenMRSTaskDataProvider.java | 17 +++++++++++++---- .../velocity.templates/task-data-provider.vm | 4 ++++ 5 files changed, 32 insertions(+), 13 deletions(-) diff --git a/openmrs/src/main/java/org/motechproject/openmrs/domain/Observation.java b/openmrs/src/main/java/org/motechproject/openmrs/domain/Observation.java index 080833b00..7cd4e2cba 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/domain/Observation.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/domain/Observation.java @@ -38,6 +38,9 @@ public class Observation { private Order order; private String comment; + //Field used in Tasks filter + private String numberOfObservations; + public String getUuid() { return uuid; } @@ -162,6 +165,14 @@ public void setComment(String comment) { this.comment = comment; } + public String getNumberOfObservations () { + return numberOfObservations; + } + + public void setNumberOfObservations (String numberOfObservations) { + this.numberOfObservations = numberOfObservations; + } + @Override public int hashCode() { return Objects.hash(uuid, display, concept, encounter, value, obsDatetime, person, groupsMembers, voided, diff --git a/openmrs/src/main/java/org/motechproject/openmrs/service/OpenMRSObservationService.java b/openmrs/src/main/java/org/motechproject/openmrs/service/OpenMRSObservationService.java index d40e4c059..febc24a25 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/service/OpenMRSObservationService.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/service/OpenMRSObservationService.java @@ -1,6 +1,7 @@ package org.motechproject.openmrs.service; import org.motechproject.openmrs.domain.Observation; +import org.motechproject.openmrs.domain.ObservationListResult; import org.motechproject.openmrs.exception.ObservationNotFoundException; import java.util.List; @@ -62,7 +63,7 @@ public interface OpenMRSObservationService { * @param conceptUUID the UUID of the concept * @return the latest observation with the given patientUUID and conceptUUID, null if the observation doesn't exist */ - Observation getObservationByPatientUUIDAndConceptUUID(String configName, String patientUUID, String conceptUUID); + ObservationListResult getObservationByPatientUUIDAndConceptUUID(String configName, String patientUUID, String conceptUUID); /** * Creates the given {@code observation} on the OpenMRS server. Configuration with the given {@code configName} will diff --git a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSObservationServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSObservationServiceImpl.java index 7d75e81c6..f31c5ef11 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSObservationServiceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSObservationServiceImpl.java @@ -1,6 +1,5 @@ package org.motechproject.openmrs.service.impl; -import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.Validate; import org.apache.log4j.Logger; import org.motechproject.event.MotechEvent; @@ -99,18 +98,13 @@ public Observation getObservationByUuid(String configName, String uuid) { } @Override - public Observation getObservationByPatientUUIDAndConceptUUID(String configName, String patientUUID, String conceptUUID) { + public ObservationListResult getObservationByPatientUUIDAndConceptUUID(String configName, String patientUUID, String conceptUUID) { Validate.notEmpty(patientUUID, "Patient uuid cannot be empty"); Validate.notEmpty(conceptUUID, "Concept uuid cannot be empty"); - ObservationListResult observations; try { Config config = configService.getConfigByName(configName); - observations = obsResource.getObservationByPatientUUIDAndConceptUUID(config, patientUUID, conceptUUID); - if (CollectionUtils.isNotEmpty(observations.getResults())) { - return obsResource.getObservationById(config, observations.getResults().get(0).getUuid()); - } - return new Observation(); + return obsResource.getObservationByPatientUUIDAndConceptUUID(config, patientUUID, conceptUUID); } catch (HttpClientErrorException e) { LOGGER.error("Error while fetching observations with Patient uuid: " + patientUUID + " and Concept uuid: " + conceptUUID); return null; diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java index a17d19137..49de86406 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java @@ -9,6 +9,7 @@ import org.motechproject.openmrs.domain.Encounter; import org.motechproject.openmrs.domain.GeneratedIdentifier; import org.motechproject.openmrs.domain.Observation; +import org.motechproject.openmrs.domain.ObservationListResult; import org.motechproject.openmrs.domain.Patient; import org.motechproject.openmrs.domain.ProgramEnrollment; import org.motechproject.openmrs.domain.ProgramEnrollmentListResult; @@ -198,18 +199,26 @@ private Patient getPatient(String lookupName, Map lookupFields, } private Observation getObservation(String lookupName, Map lookupFields, String configName) { - Observation observation = null; + ObservationListResult observations; + Observation latestObservation = null; switch(lookupName) { case BY_PATIENT_UUID_AND_CONCEPT_UUID: - observation = observationService.getObservationByPatientUUIDAndConceptUUID(configName, + observations = observationService.getObservationByPatientUUIDAndConceptUUID(configName, lookupFields.get(PATIENT_UUID), lookupFields.get(CONCEPT_UUID)); + if (CollectionUtils.isNotEmpty(observations.getResults())) { + latestObservation = observationService.getObservationByUuid(configName, observations.getResults().get(0).getUuid()); + latestObservation.setNumberOfObservations("1"); + } break; default: LOGGER.error("Lookup with name {} doesn't exist for observation object", lookupName); break; } - - return observation; + if (latestObservation == null) { + latestObservation = new Observation(); + latestObservation.setNumberOfObservations("0"); + } + return latestObservation; } private Provider getProvider(String lookupName, Map lookupFields, String configName) { diff --git a/openmrs/src/main/resources/velocity.templates/task-data-provider.vm b/openmrs/src/main/resources/velocity.templates/task-data-provider.vm index 5bd26dd38..204da1741 100644 --- a/openmrs/src/main/resources/velocity.templates/task-data-provider.vm +++ b/openmrs/src/main/resources/velocity.templates/task-data-provider.vm @@ -324,6 +324,10 @@ { "displayName": "openMRS.observation.valueModifier", "fieldKey": "valueModifier" + }, + { + "displayName": "openMRS.observation.numberOfObservations", + "fieldKey": "numberOfObservations" } ] }, From 7a1070ede161f566f51aa278e4583b595897c5e5 Mon Sep 17 00:00:00 2001 From: Jakub Redlarski Date: Mon, 3 Oct 2016 14:10:35 +0200 Subject: [PATCH 077/202] MOTECH-2889: Fixes after review --- .../commcare/client/CommCareAPIHttpClient.java | 9 +++++---- .../commcare/service/CommcareReportService.java | 6 +++--- .../commcare/service/impl/CommcareReportServiceImpl.java | 6 +++--- .../service/impl/CommcareReportServiceImplTest.java | 7 ++----- 4 files changed, 13 insertions(+), 15 deletions(-) diff --git a/commcare/src/main/java/org/motechproject/commcare/client/CommCareAPIHttpClient.java b/commcare/src/main/java/org/motechproject/commcare/client/CommCareAPIHttpClient.java index 3f0110dfa..cf671def4 100644 --- a/commcare/src/main/java/org/motechproject/commcare/client/CommCareAPIHttpClient.java +++ b/commcare/src/main/java/org/motechproject/commcare/client/CommCareAPIHttpClient.java @@ -142,8 +142,8 @@ public String formRequest(AccountConfig accountConfig, String formId) { /** * Executes a HTTP get request to the form list API endpoint. * - * @param accountConfig the account configuration to use - * @param formListRequest the request that will be used for creating the HTTP request + * @param accountConfig the account configuration to use + * @param formListRequest the request that will be used for creating the HTTP request * @return the response as a String (JSON expected) */ public String formListRequest(AccountConfig accountConfig, FormListRequest formListRequest) { @@ -153,7 +153,8 @@ public String formListRequest(AccountConfig accountConfig, FormListRequest formL /** * Executes a HTTP get request to the report data API endpoint. * - * @param accountConfig the account configuration to use + * @param accountConfig the account configuration to use + * @param reportId the ID of the report * @return the response as a String (JSON expected) */ public String singleReportDataRequest(AccountConfig accountConfig, String reportId){ @@ -163,7 +164,7 @@ public String singleReportDataRequest(AccountConfig accountConfig, String report /** * Executes a HTTP get request to the reports list API endpoint. * - * @param accountConfig the account configuration to use + * @param accountConfig the account configuration to use * @return the response as a String (JSON expected) */ public String reportsListMetadataRequest(AccountConfig accountConfig) { diff --git a/commcare/src/main/java/org/motechproject/commcare/service/CommcareReportService.java b/commcare/src/main/java/org/motechproject/commcare/service/CommcareReportService.java index 36273da52..57aa9b2d2 100644 --- a/commcare/src/main/java/org/motechproject/commcare/service/CommcareReportService.java +++ b/commcare/src/main/java/org/motechproject/commcare/service/CommcareReportService.java @@ -29,11 +29,11 @@ public interface CommcareReportService { * @param configName the name of the configuration used for connecting to CommcareHQ, null means default configuration * @return the ReportDataInfo object representing the state of the report data or null if that report does not exist. */ - ReportDataInfo getReportByReportId(String reportId, String configName); + ReportDataInfo getReportById(String reportId, String configName); /** - * Same as {@link #getReportByReportId(String, String) getReportByReportId} but uses default Commcare configuration. + * Same as {@link #getReportById(String, String) getReportById} but uses default Commcare configuration. */ - ReportDataInfo getReportByReportId(String reportId); + ReportDataInfo getReportById(String reportId); } diff --git a/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportServiceImpl.java b/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportServiceImpl.java index f94899325..2ae1b5051 100644 --- a/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportServiceImpl.java +++ b/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportServiceImpl.java @@ -58,7 +58,7 @@ public ReportsMetadataInfo getReportsList() { } @Override - public ReportDataInfo getReportByReportId(String reportId, String configName) { + public ReportDataInfo getReportById(String reportId, String configName) { String response = commcareHttpClient.singleReportDataRequest(configService.getByName(configName).getAccountConfig(), reportId); @@ -68,8 +68,8 @@ public ReportDataInfo getReportByReportId(String reportId, String configName) { } @Override - public ReportDataInfo getReportByReportId(String reportId) { - return getReportByReportId(reportId, null); + public ReportDataInfo getReportById(String reportId) { + return getReportById(reportId, null); } private ReportsMetadataResponseJson parseReportsFromResponse(String response) { diff --git a/commcare/src/test/java/org/motechproject/commcare/service/impl/CommcareReportServiceImplTest.java b/commcare/src/test/java/org/motechproject/commcare/service/impl/CommcareReportServiceImplTest.java index 15dddf84c..c94b63320 100644 --- a/commcare/src/test/java/org/motechproject/commcare/service/impl/CommcareReportServiceImplTest.java +++ b/commcare/src/test/java/org/motechproject/commcare/service/impl/CommcareReportServiceImplTest.java @@ -33,9 +33,6 @@ import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; -/** - * Test class for {@link CommcareReportServiceImpl} - */ public class CommcareReportServiceImplTest { private static final String REPORTS_LIST_METADATA_RESPONSE = "json/service/reportsListMetadataResponse.json"; @@ -75,12 +72,12 @@ public void shouldGetReports() { } @Test - public void testReportByReportId() { + public void shouldGetReportById() { ReportDataInfo reportDataInfo = prepareReportDataInfo(); when(commcareHttpClient.singleReportDataRequest(config.getAccountConfig(), REPORT_ID)).thenReturn(getResponseForReportData()); - ReportDataInfo fetched = reportService.getReportByReportId(REPORT_ID); + ReportDataInfo fetched = reportService.getReportById(REPORT_ID); assertEquals(reportDataInfo, fetched); From aee1585f51c8d0bb2f4d85aafad9f3e5ba7566f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Ja=C5=BCd=C5=BCewski?= Date: Mon, 3 Oct 2016 18:07:54 +0200 Subject: [PATCH 078/202] MOTECH-2717 Using XLMNS + APP_ID as an unique identifier, and changed tests accordingly --- .../tasks/builder/FormActionBuilder.java | 2 +- .../tasks/builder/FormTriggerBuilder.java | 2 +- .../it/CommcareTasksIntegrationBundleIT.java | 20 +++++++++---------- .../impl/parser/CommcareEventParsersTest.java | 2 +- .../tasks/builder/FormTriggerBuilderTest.java | 12 ++++++----- .../commcare/util/DummyCommcareSchema.java | 7 +++++++ .../commcare/util/ResponseXML.java | 2 +- .../commcare/web/FullFormControllerTest.java | 3 ++- 8 files changed, 29 insertions(+), 21 deletions(-) diff --git a/commcare/src/main/java/org/motechproject/commcare/tasks/builder/FormActionBuilder.java b/commcare/src/main/java/org/motechproject/commcare/tasks/builder/FormActionBuilder.java index d64c17245..dc9322023 100644 --- a/commcare/src/main/java/org/motechproject/commcare/tasks/builder/FormActionBuilder.java +++ b/commcare/src/main/java/org/motechproject/commcare/tasks/builder/FormActionBuilder.java @@ -63,7 +63,7 @@ private List buildActionsForConfig(Config config) { application.getApplicationName(), config.getName()); ActionEventRequestBuilder actionBuilder = new ActionEventRequestBuilder() .setDisplayName(displayName) - .setSubject(EventSubjects.SUBMIT_FORM + "." + form.getXmlns() + "." + config.getName()) + .setSubject(EventSubjects.SUBMIT_FORM + "." + form.getXmlns() + application.getCommcareAppId() + "." + config.getName()) .setActionParameters(parameters); actions.add(actionBuilder.createActionEventRequest()); } diff --git a/commcare/src/main/java/org/motechproject/commcare/tasks/builder/FormTriggerBuilder.java b/commcare/src/main/java/org/motechproject/commcare/tasks/builder/FormTriggerBuilder.java index f042f791a..6ba6609bd 100644 --- a/commcare/src/main/java/org/motechproject/commcare/tasks/builder/FormTriggerBuilder.java +++ b/commcare/src/main/java/org/motechproject/commcare/tasks/builder/FormTriggerBuilder.java @@ -100,7 +100,7 @@ private TriggerEventRequest buildTriggerForForm(Config config, CommcareApplicati String displayName = DisplayNameHelper.buildDisplayName(RECEIVED_FORM, formName, applicationName, config.getName()); - return new TriggerEventRequest(displayName, FORMS_EVENT + "." + config.getName() + "." + form.getXmlns(), + return new TriggerEventRequest(displayName, FORMS_EVENT + "." + config.getName() + "." + form.getXmlns() + application.getCommcareAppId(), null, buildTriggerParameters(form), FORMS_EVENT); } diff --git a/commcare/src/test/java/org/motechproject/commcare/it/CommcareTasksIntegrationBundleIT.java b/commcare/src/test/java/org/motechproject/commcare/it/CommcareTasksIntegrationBundleIT.java index 541b1f4ae..b6e4ed478 100644 --- a/commcare/src/test/java/org/motechproject/commcare/it/CommcareTasksIntegrationBundleIT.java +++ b/commcare/src/test/java/org/motechproject/commcare/it/CommcareTasksIntegrationBundleIT.java @@ -172,7 +172,7 @@ private void createDummyActionChannel(Channel channel) { private void createTestTask() { TaskTriggerInformation triggerInformation = new TaskTriggerInformation("trigger", COMMCARE_CHANNEL_NAME, COMMCARE_CHANNEL_NAME, VERSION, - "org.motechproject.commcare.api.forms." + config.getName() + "." + DummyCommcareSchema.XMLNS1, "org.motechproject.commcare.api.forms"); + "org.motechproject.commcare.api.forms." + config.getName() + "." + DummyCommcareSchema.XMLNS1 + DummyCommcareSchema.APP_ID1, "org.motechproject.commcare.api.forms"); TaskActionInformation actionInformation = new TaskActionInformation("action", COMMCARE_CHANNEL_NAME, COMMCARE_CHANNEL_NAME, VERSION, TEST_INTERFACE, "execute"); @@ -206,16 +206,16 @@ private void verifyCommcareChannelHasCorrectActionsAndTriggers(Channel channel) TaskTriggerInformation expectedCaseDeath = new TaskTriggerInformation(); TaskTriggerInformation expectedStockTx = new TaskTriggerInformation(); - expectedForm1.setSubject("org.motechproject.commcare.api.forms." + config.getName() + "." + DummyCommcareSchema.XMLNS1); + expectedForm1.setSubject("org.motechproject.commcare.api.forms." + config.getName() + "." + DummyCommcareSchema.XMLNS1 + DummyCommcareSchema.APP_ID1); assertTrue(containsTrigger(channel, expectedForm1)); - expectedForm2.setSubject("org.motechproject.commcare.api.forms." + config.getName() + "." + DummyCommcareSchema.XMLNS2); + expectedForm2.setSubject("org.motechproject.commcare.api.forms." + config.getName() + "." + DummyCommcareSchema.XMLNS2 + DummyCommcareSchema.APP_ID1); assertTrue(containsTrigger(channel, expectedForm2)); - expectedForm3.setSubject("org.motechproject.commcare.api.forms." + config.getName() + "." + DummyCommcareSchema.XMLNS3); + expectedForm3.setSubject("org.motechproject.commcare.api.forms." + config.getName() + "." + DummyCommcareSchema.XMLNS3 + DummyCommcareSchema.APP_ID1); assertTrue(containsTrigger(channel, expectedForm3)); - expectedForm4.setSubject("org.motechproject.commcare.api.forms." + config.getName() + "." + DummyCommcareSchema.XMLNS4); + expectedForm4.setSubject("org.motechproject.commcare.api.forms." + config.getName() + "." + DummyCommcareSchema.XMLNS4 + DummyCommcareSchema.APP_ID2); assertTrue(containsTrigger(channel, expectedForm4)); expectedCaseBirth.setSubject("org.motechproject.commcare.api.case." + config.getName() + ".birth"); @@ -296,13 +296,11 @@ private void assertTriggerParameters(List eventParameters, List< private void createMockCommcareSchema() { CommcareApplicationJson applicationJson1 = DummyCommcareSchema.getApplicationsForConfigOne().get(0); - applicationJson1.setCommcareAppId("123"); applicationJson1.setApplicationName("TestApp1"); applicationJson1.setResourceUri("none"); applicationJson1.setConfigName(config.getName()); CommcareApplicationJson applicationJson2 = DummyCommcareSchema.getApplicationsForConfigOne().get(1); - applicationJson2.setCommcareAppId("124"); applicationJson2.setApplicationName("TestApp2"); applicationJson2.setResourceUri("none"); applicationJson2.setConfigName(config.getName()); @@ -561,7 +559,7 @@ private ActionEvent prepareSubmitForm1Action() { ActionEventBuilder actionBuilder = new ActionEventBuilder() .setDisplayName(displayName) - .setSubject(EventSubjects.SUBMIT_FORM + ".http://openrosa.org/formdesigner/84FA38A2-93C1-4B9E-AA2A-0E082995FF9E." + config.getName()) + .setSubject(EventSubjects.SUBMIT_FORM + "." + DummyCommcareSchema.XMLNS1 + DummyCommcareSchema.APP_ID1 + "." + config.getName()) .setActionParameters(parameters); return actionBuilder.build(); } @@ -583,7 +581,7 @@ private ActionEvent prepareSubmitForm2Action() { ActionEventBuilder actionBuilder = new ActionEventBuilder() .setDisplayName(displayName) - .setSubject(EventSubjects.SUBMIT_FORM + ".http://openrosa.org/formdesigner/12KE58A2-54C5-1Z4B-AR2S-Z0345995RF9E." + config.getName()) + .setSubject(EventSubjects.SUBMIT_FORM + "." + DummyCommcareSchema.XMLNS2 + DummyCommcareSchema.APP_ID1 + "." + config.getName()) .setActionParameters(parameters); return actionBuilder.build(); } @@ -605,7 +603,7 @@ private ActionEvent prepareSubmitForm3Action() { ActionEventBuilder actionBuilder = new ActionEventBuilder() .setDisplayName(displayName) - .setSubject(EventSubjects.SUBMIT_FORM + ".http://openrosa.org/formdesigner/22KE58A2-54C5-1Z4B-AR2S-Z0345995RF9E." + config.getName()) + .setSubject(EventSubjects.SUBMIT_FORM + "." + DummyCommcareSchema.XMLNS3 + DummyCommcareSchema.APP_ID1 + "." + config.getName()) .setActionParameters(parameters); return actionBuilder.build(); } @@ -627,7 +625,7 @@ private ActionEvent prepareSubmitForm4Action() { ActionEventBuilder actionBuilder = new ActionEventBuilder() .setDisplayName(displayName) - .setSubject(EventSubjects.SUBMIT_FORM + ".http://openrosa.org/formdesigner/32KE58A2-54C5-1Z4B-AR2S-Z0345995RF9E." + config.getName()) + .setSubject(EventSubjects.SUBMIT_FORM + "." + DummyCommcareSchema.XMLNS4 + DummyCommcareSchema.APP_ID2 + "." + config.getName()) .setActionParameters(parameters); return actionBuilder.build(); } diff --git a/commcare/src/test/java/org/motechproject/commcare/service/impl/parser/CommcareEventParsersTest.java b/commcare/src/test/java/org/motechproject/commcare/service/impl/parser/CommcareEventParsersTest.java index 4a87cc28e..310fdebe2 100644 --- a/commcare/src/test/java/org/motechproject/commcare/service/impl/parser/CommcareEventParsersTest.java +++ b/commcare/src/test/java/org/motechproject/commcare/service/impl/parser/CommcareEventParsersTest.java @@ -100,7 +100,7 @@ public void shouldParseFormsEventSubjectProperly() { String parsedSubject = formsEventParser.parseEventSubject(eventSubject, eventParameters); assertEquals(EventSubjects.FORMS_EVENT, eventSubject); - assertEquals(EventSubjects.FORMS_EVENT + "." + config.getName() + "." + DummyCommcareSchema.XMLNS1, parsedSubject); + assertEquals(EventSubjects.FORMS_EVENT + "." + config.getName() + "." + DummyCommcareSchema.XMLNS1 + DummyCommcareSchema.APP_ID1, parsedSubject); } @Test diff --git a/commcare/src/test/java/org/motechproject/commcare/tasks/builder/FormTriggerBuilderTest.java b/commcare/src/test/java/org/motechproject/commcare/tasks/builder/FormTriggerBuilderTest.java index 2b71c030c..d8b1e9691 100644 --- a/commcare/src/test/java/org/motechproject/commcare/tasks/builder/FormTriggerBuilderTest.java +++ b/commcare/src/test/java/org/motechproject/commcare/tasks/builder/FormTriggerBuilderTest.java @@ -32,6 +32,8 @@ import static org.motechproject.commcare.util.DummyCommcareSchema.XMLNS3; import static org.motechproject.commcare.util.DummyCommcareSchema.XMLNS4; import static org.motechproject.commcare.util.DummyCommcareSchema.XMLNS5; +import static org.motechproject.commcare.util.DummyCommcareSchema.APP_ID1; +import static org.motechproject.commcare.util.DummyCommcareSchema.APP_ID2; public class FormTriggerBuilderTest { @@ -88,28 +90,28 @@ public void shouldBuildProperTriggerRequestForCases() { String subject = request.getSubject(); switch (subject) { - case BASE_SUBJECT_ONE + "." + XMLNS1: + case BASE_SUBJECT_ONE + "." + XMLNS1 + APP_ID1: assertEquals(2 + FORM_PREDEFINED_FIELDS, request.getEventParameters().size()); assertEquals("Received Form: form1 [app1: ConfigOne]", request.getDisplayName()); assertTrue(hasEventKey(request.getEventParameters(), FORM_QUESTION1)); assertTrue(hasEventKey(request.getEventParameters(), FORM_QUESTION2)); break; - case BASE_SUBJECT_ONE + "." + XMLNS2: + case BASE_SUBJECT_ONE + "." + XMLNS2 + APP_ID1: assertEquals(1 + FORM_PREDEFINED_FIELDS, request.getEventParameters().size()); assertEquals("Received Form: form2 [app1: ConfigOne]", request.getDisplayName()); assertTrue(hasEventKey(request.getEventParameters(), FORM_QUESTION3)); break; - case BASE_SUBJECT_ONE + "." + XMLNS3: + case BASE_SUBJECT_ONE + "." + XMLNS3 + APP_ID1: assertEquals(1 + FORM_PREDEFINED_FIELDS, request.getEventParameters().size()); assertEquals("Received Form: form3 [app1: ConfigOne]", request.getDisplayName()); assertTrue(hasEventKey(request.getEventParameters(), FORM_QUESTION4)); break; - case BASE_SUBJECT_ONE + "." + XMLNS4: + case BASE_SUBJECT_ONE + "." + XMLNS4 + APP_ID2: assertEquals(1 + FORM_PREDEFINED_FIELDS, request.getEventParameters().size()); assertEquals("Received Form: form4 [app2: ConfigOne]", request.getDisplayName()); assertTrue(hasEventKey(request.getEventParameters(), FORM_QUESTION5)); break; - case BASE_SUBJECT_TWO + "." + XMLNS5: + case BASE_SUBJECT_TWO + "." + XMLNS5 + APP_ID1: assertEquals(1 + FORM_PREDEFINED_FIELDS, request.getEventParameters().size()); assertEquals("Received Form: form5 [app1: ConfigTwo]", request.getDisplayName()); assertTrue(hasEventKey(request.getEventParameters(), FORM_QUESTION4)); diff --git a/commcare/src/test/java/org/motechproject/commcare/util/DummyCommcareSchema.java b/commcare/src/test/java/org/motechproject/commcare/util/DummyCommcareSchema.java index 754eed3ba..5e148157a 100644 --- a/commcare/src/test/java/org/motechproject/commcare/util/DummyCommcareSchema.java +++ b/commcare/src/test/java/org/motechproject/commcare/util/DummyCommcareSchema.java @@ -33,6 +33,9 @@ public final class DummyCommcareSchema { public static final String XMLNS4 = "http://openrosa.org/formdesigner/32KE58A2-54C5-1Z4B-AR2S-Z0345995RF9E"; public static final String XMLNS5 = "http://openrosa.org/formdesigner/13KE58A2-54C5-1Z4B-AR2S-Z0345995RF9E"; + public static final String APP_ID1 = "cef11d974db0f4b69b465df85ef8c826"; + public static final String APP_ID2 = "053c85550dc563a682ff610dab71f8d5"; + public static List getApplicationsForConfigOne() { List applicationsInConfig1 = new ArrayList<>(); @@ -116,10 +119,12 @@ public static List getApplicationsForConfigOne() { CommcareApplicationJson commcareApplicationJson1 = new CommcareApplicationJson(); commcareApplicationJson1.setApplicationName("app1"); + commcareApplicationJson1.setCommcareAppId(APP_ID1); commcareApplicationJson1.setModules(Arrays.asList(commcareModuleJson1, commcareModuleJson2)); CommcareApplicationJson commcareApplicationJson2 = new CommcareApplicationJson(); commcareApplicationJson2.setApplicationName("app2"); + commcareApplicationJson2.setCommcareAppId(APP_ID2); commcareApplicationJson2.setModules(Collections.singletonList((commcareModuleJson3))); applicationsInConfig1.add(commcareApplicationJson1); @@ -156,6 +161,7 @@ public static List getApplicationsForConfigTwo() { CommcareApplicationJson commcareApplicationJson3 = new CommcareApplicationJson(); commcareApplicationJson3.setApplicationName("app1"); + commcareApplicationJson3.setCommcareAppId(APP_ID1); commcareApplicationJson3.setModules(Collections.singletonList((commcareModuleJson4))); applicationsInConfig2.add(commcareApplicationJson3); @@ -191,6 +197,7 @@ public static List getApplicationsForConfigThree() { CommcareApplicationJson commcareApplicationJson3 = new CommcareApplicationJson(); commcareApplicationJson3.setApplicationName("app1"); + commcareApplicationJson3.setCommcareAppId(APP_ID1); commcareApplicationJson3.setModules(Collections.singletonList((commcareModuleJson5))); applicationsInConfig3.add(commcareApplicationJson3); diff --git a/commcare/src/test/java/org/motechproject/commcare/util/ResponseXML.java b/commcare/src/test/java/org/motechproject/commcare/util/ResponseXML.java index c7fc4d2fa..7b1070d45 100644 --- a/commcare/src/test/java/org/motechproject/commcare/util/ResponseXML.java +++ b/commcare/src/test/java/org/motechproject/commcare/util/ResponseXML.java @@ -23,7 +23,7 @@ public static String getFormXML() { " version=\"41\"\n" + " name=\"" + FORM_NAME + "\"\n" + " xmlns:jrm=\"http://dev.commcarehq.org/jr/xforms\"\n" + - " xmlns=\"" + DummyCommcareSchema.XMLNS1 + "\">\n" + + " xmlns=\"" + DummyCommcareSchema.XMLNS1 + DummyCommcareSchema.APP_ID1 + "\">\n" + " <" + ATTR1 + ">" + ATTR1_VALUE + "\n" + " <" + ATTR2 + ">" + ATTR2_VALUE + "\n" + " subElements = (Multimap) parameters.get(SUB_ELEMENTS); assertEquals(5, subElements.size()); From b5a1d2e200a5932f52b32382e49237e9c15af240 Mon Sep 17 00:00:00 2001 From: srujan92 Date: Tue, 4 Oct 2016 19:58:12 +0530 Subject: [PATCH 079/202] MOTECH-2955 Event Strategy Should Defaulted to "Full" Event Strategy default value has been set to 'Full'. --- commcare/src/main/resources/webapp/js/controllers.js | 2 +- commcare/src/main/resources/webapp/messages/messages.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/commcare/src/main/resources/webapp/js/controllers.js b/commcare/src/main/resources/webapp/js/controllers.js index a206890b0..3c021d0fb 100644 --- a/commcare/src/main/resources/webapp/js/controllers.js +++ b/commcare/src/main/resources/webapp/js/controllers.js @@ -347,7 +347,7 @@ $scope.$parent.selectedConfig = data; $scope.$parent.newlyCreatedConfig = data; if ($scope.$parent.selectedConfig.eventStrategy === "") { - $scope.$parent.selectedConfig.eventStrategy = $scope.eventStrategyOptions[0]; + $scope.$parent.selectedConfig.eventStrategy = $scope.eventStrategyOptions[2]; } LoadingModal.close(); }, diff --git a/commcare/src/main/resources/webapp/messages/messages.properties b/commcare/src/main/resources/webapp/messages/messages.properties index b77dbd26d..8f6f93826 100644 --- a/commcare/src/main/resources/webapp/messages/messages.properties +++ b/commcare/src/main/resources/webapp/messages/messages.properties @@ -45,7 +45,7 @@ commcare.save.failure=Failure while saving configuration. commcare.sync.success=Synchronization initiated successfully. -commcare.settings.tooltip.eventStrategy=There are three different strategies for case event forwarding\: minimal (default), partial and full. The minimal event includes only the case ID. The partial event passes in all of the basic case data that are not case specific. The full implementation will also include field values, which for some implementations could bloat the event. +commcare.settings.tooltip.eventStrategy=There are three different strategies for case event forwarding\: minimal , partial and full (default). The minimal event includes only the case ID. The partial event passes in all of the basic case data that are not case specific. The full implementation will also include field values, which for some implementations could bloat the event. commcare.settings.tooltip.forwardingRules=The column on the right displays the url's that will be sent to CommcareHQ as forwarding endpoint. If the forwarding API does not work in your instance, use these urls in CommcareHQ. commcare.select=Select From c2609f1292fa28c83859a980735164085602757f Mon Sep 17 00:00:00 2001 From: mkruszynski Date: Wed, 5 Oct 2016 08:35:30 +0200 Subject: [PATCH 080/202] MOTECH-2919: Improved OpenMRS logs for Http exceptions --- .../impl/OpenMRSCohortServiceImpl.java | 2 +- .../impl/OpenMRSEncounterServiceImpl.java | 6 +-- .../service/impl/OpenMRSFormServiceImpl.java | 8 +--- ...OpenMRSGeneratedIdentifierServiceImpl.java | 2 +- .../impl/OpenMRSLocationServiceImpl.java | 4 +- .../impl/OpenMRSPatientServiceImpl.java | 38 +++++++++-------- .../impl/OpenMRSPersonServiceImpl.java | 7 +++- .../OpenMRSProgramEnrollmentServiceImpl.java | 36 ++++++++++++---- .../impl/OpenMRSProviderServiceImpl.java | 4 +- .../impl/OpenMRSRelationshipServiceImpl.java | 41 +++++++++++-------- .../service/impl/OpenMRSVisitServiceImpl.java | 16 +++++--- 11 files changed, 99 insertions(+), 65 deletions(-) diff --git a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSCohortServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSCohortServiceImpl.java index 768937afb..e74ac9096 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSCohortServiceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSCohortServiceImpl.java @@ -31,7 +31,7 @@ public CohortQueryReport getCohortQueryReport(String configName, String cohortQu Config config = configService.getConfigByName(configName); return cohortResource.getCohortQueryReport(config, cohortQueryUuid, parameters); } catch (HttpClientErrorException e) { - throw new OpenMRSException("Could not get cohort query report for uuid" + cohortQueryUuid, e); + throw new OpenMRSException(String.format("Could not get cohort query report for uuid: %s. %s %s" + cohortQueryUuid, e.getMessage(), e.getResponseBodyAsString()), e); } } } diff --git a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSEncounterServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSEncounterServiceImpl.java index 29c58b42d..bc57e1956 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSEncounterServiceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSEncounterServiceImpl.java @@ -22,7 +22,6 @@ import org.springframework.web.client.HttpClientErrorException; import java.util.ArrayList; -import java.util.Collections; import java.util.List; @Service("encounterService") @@ -88,7 +87,7 @@ public Encounter getEncounterByUuid(String configName, String uuid) { Config config = configService.getConfigByName(configName); return encounterResource.getEncounterById(config, uuid); } catch (HttpClientErrorException e) { - return null; + throw new OpenMRSException(String.format("Could not get encounter with uuid: %s. %s %s", uuid, e.getMessage(), e.getResponseBodyAsString()), e); } } @@ -182,8 +181,7 @@ private List getEncountersForPatient(Config config, Patient patient) try { result = encounterResource.queryForAllEncountersByPatientId(config, patient.getUuid()).getResults(); } catch (HttpClientErrorException e) { - LOGGER.error("Error retrieving encounters for patient: " + patient.getUuid()); - return Collections.emptyList(); + throw new OpenMRSException(String.format("Could not get encounters for patient with uuid: %s. %s %s", patient.getUuid(), e.getMessage(), e.getResponseBodyAsString()), e); } return result; diff --git a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSFormServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSFormServiceImpl.java index 08e80a11c..ae8850aa7 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSFormServiceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSFormServiceImpl.java @@ -2,11 +2,10 @@ import org.motechproject.openmrs.config.Config; import org.motechproject.openmrs.domain.Form; +import org.motechproject.openmrs.exception.OpenMRSException; import org.motechproject.openmrs.resource.FormResource; import org.motechproject.openmrs.service.OpenMRSConfigService; import org.motechproject.openmrs.service.OpenMRSFormService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.client.HttpClientErrorException; @@ -14,8 +13,6 @@ @Service("formService") public class OpenMRSFormServiceImpl implements OpenMRSFormService { - private static final Logger LOGGER = LoggerFactory.getLogger(OpenMRSFormServiceImpl.class); - @Autowired private final OpenMRSConfigService configService; private final FormResource formResource; @@ -32,8 +29,7 @@ public Form getFormByUuid(String configName, String uuid) { Config config = configService.getConfigByName(configName); return formResource.getFormByUuid(config, uuid); } catch (HttpClientErrorException e) { - LOGGER.error("Error while fetching form with UUID: " + uuid); - return null; + throw new OpenMRSException(String.format("Could not get Form for uuid %s. %s %s", uuid, e.getMessage(), e.getResponseBodyAsString()), e); } } } diff --git a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSGeneratedIdentifierServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSGeneratedIdentifierServiceImpl.java index 6dac2ac33..9b020bce2 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSGeneratedIdentifierServiceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSGeneratedIdentifierServiceImpl.java @@ -31,7 +31,7 @@ public GeneratedIdentifier getLatestIdentifier(String configName, String sourceN return generatedIdentifierResource.getGeneratedIdentifier(config, sourceName); } catch (HttpServerErrorException | HttpClientErrorException e) { - throw new OpenMRSException("Cannot get latest identifier from Generator with name: " + sourceName, e); + throw new OpenMRSException(String.format("Cannot get latest identifier from Generator with name: %s. %s %s" + sourceName, e.getMessage(), e.getResponseBodyAsString()), e); } } } diff --git a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSLocationServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSLocationServiceImpl.java index 65f892623..080d97bd2 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSLocationServiceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSLocationServiceImpl.java @@ -6,6 +6,7 @@ import org.motechproject.event.listener.EventRelay; import org.motechproject.openmrs.config.Config; import org.motechproject.openmrs.domain.Location; +import org.motechproject.openmrs.exception.OpenMRSException; import org.motechproject.openmrs.helper.EventHelper; import org.motechproject.openmrs.resource.LocationResource; import org.motechproject.openmrs.service.EventKeys; @@ -76,8 +77,7 @@ public List getLocations(String configName, String locationName) { Config config = configService.getConfigByName(configName); locations = locationResource.queryForLocationByName(config, locationName).getResults(); } catch (HttpClientErrorException e) { - LOGGER.error("Failed to retrieve all locations by location name: " + locationName); - return Collections.emptyList(); + throw new OpenMRSException(String.format("Could not get Locations for name %s. %s %s", locationName, e.getMessage(), e.getResponseBodyAsString()), e); } return locations; diff --git a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSPatientServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSPatientServiceImpl.java index d12b66308..265a5e7f0 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSPatientServiceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSPatientServiceImpl.java @@ -64,8 +64,12 @@ public Patient createPatient(String configName, Patient patient) { Config config = configService.getConfigByName(configName); if (patient.getPerson().getUuid() == null) { - personResource.checkPersonAttributeTypes(config, patient.getPerson()); - patient.setPerson(personResource.createPerson(config, patient.getPerson())); + try { + personResource.checkPersonAttributeTypes(config, patient.getPerson()); + patient.setPerson(personResource.createPerson(config, patient.getPerson())); + } catch (HttpClientErrorException e) { + throw new OpenMRSException(String.format("Could not create Person. %s %s", e.getMessage(), e.getResponseBodyAsString()), e); + } } IdentifierType identifierType = new IdentifierType(); @@ -84,8 +88,7 @@ public Patient createPatient(String configName, Patient patient) { return savedPatient; } catch (HttpClientErrorException e) { - LOGGER.error("Failed to create a patient in OpenMRS with MOTECH Id: " + patient.getMotechId()); - return null; + throw new OpenMRSException(String.format("Could not create Patient. %s %s", e.getMessage(), e.getResponseBodyAsString()), e); } } @@ -189,8 +192,7 @@ private Patient getPatientByUuid(Config config, String uuid) { try { patient = patientResource.getPatientById(config, uuid); } catch (HttpClientErrorException e) { - LOGGER.error("Failed to get patient by id: " + uuid); - return null; + throw new OpenMRSException(String.format("Could not get Patient with uuid: %s. %s %s", uuid, e.getMessage(), e.getResponseBodyAsString()), e); } Identifier motechIdentifier = getMotechIdentifier(config, patient); @@ -212,8 +214,7 @@ private Patient getPatientByMotechId(Config config, String motechId) { try { patientList = patientResource.queryForPatient(config, motechId); } catch (HttpClientErrorException e) { - LOGGER.error("Failed search for patient by MOTECH Id: " + motechId); - return null; + throw new OpenMRSException(String.format("Could not get Patient for MOTECH Id: %s. %s %s", motechId, e.getMessage(), e.getResponseBodyAsString()), e); } if (patientList.getResults().size() == 0) { @@ -244,7 +245,8 @@ private Patient updatePatient(Config config, Patient patient) { updatedPatient = getPatientByUuid(config, patient.getUuid()); eventRelay.sendEventMessage(new MotechEvent(EventKeys.UPDATED_PATIENT_SUBJECT, EventHelper.patientParameters(updatedPatient))); } catch (HttpClientErrorException e) { - throw new OpenMRSException("Failed to update OpenMRS patient with id: " + patient.getUuid(), e); + throw new OpenMRSException(String.format("Failed to update OpenMRS patient with uuid: %s. %s %s" + patient.getUuid(), e.getMessage(), + e.getResponseBodyAsString()), e); } return updatedPatient; @@ -262,7 +264,8 @@ private Patient updatePatientIdentifiers(Config config, Patient patient) { updatedPatient = getPatientByUuid(config, patient.getUuid()); eventRelay.sendEventMessage(new MotechEvent(EventKeys.UPDATED_PATIENT_IDENTIFIERS_SUBJECT, EventHelper.patientParameters(updatedPatient))); } catch (HttpClientErrorException e) { - throw new OpenMRSException("Failed to update OpenMRS patient's identifiers for patient with id: " + patient.getUuid(), e); + throw new OpenMRSException(String.format("Failed to update OpenMRS patient's identifiers for patient with uuid: %s. %s %s", patient.getUuid(), + e.getMessage(), e.getResponseBodyAsString()), e); } return updatedPatient; } @@ -322,8 +325,7 @@ private String getMotechPatientIdentifierTypeUuid(Config config) { try { motechPatientIdentifierTypeUuid = patientResource.getMotechPatientIdentifierUuid(config); } catch (HttpClientErrorException e) { - LOGGER.error("There was an exception retrieving the MOTECH Identifier Type UUID"); - return null; + throw new OpenMRSException(String.format("Could not get Patient Identifier Type uuid. %s, %s", e.getMessage(), e.getResponseBodyAsString()), e); } if (motechPatientIdentifierTypeUuid == null) { @@ -365,8 +367,8 @@ private List getSupportedIdentifierTypeList(Config config, List parsePatientIdentifiers(Config config, List parsedIdentifiers.add(identifier); } } catch (HttpClientErrorException e) { - LOGGER.error("There was an exception retrieving the identifier type with name {}", identifierTypeName); + throw new OpenMRSException(String.format("Could not get Patient Identifier Type for name: %s. %s %s", identifierTypeName, + e.getMessage(), e.getResponseBodyAsString()), e); } } @@ -414,7 +417,8 @@ private void deleteAllAttributes(Config config, Person person) { try { personResource.deleteAttribute(config, person.getUuid(), attribute); } catch (HttpClientErrorException e) { - LOGGER.warn("Failed to delete attribute with name: " + attribute.getName()); + throw new OpenMRSException(String.format("Could not delete Person's attribute for Person uuid: %s and Attribute uuid: %s. %s %s", + person.getUuid(), attribute.getUuid(), e.getMessage(), e.getResponseBodyAsString()), e); } } } @@ -439,6 +443,8 @@ private void saveAttributesForPerson(Config config, Person person) { personResource.createPersonAttribute(config, person.getUuid(), attribute); } catch (HttpClientErrorException e) { LOGGER.warn("Unable to add attribute to person with id: " + person.getUuid()); + throw new OpenMRSException(String.format("Could not create Person's attribute for Person uuid: %s and Attribute uuid: %s. %s %s", + person.getUuid(), attribute.getUuid(), e.getMessage(), e.getResponseBodyAsString()), e); } } } diff --git a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSPersonServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSPersonServiceImpl.java index d9e77622e..b536ead5e 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSPersonServiceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSPersonServiceImpl.java @@ -54,7 +54,7 @@ public Person createPerson(String configName, Person person) { return saved; } catch (HttpClientErrorException e) { - throw new OpenMRSException("Failed to create person for: " + person.getDisplay(), e); + throw new OpenMRSException(String.format("Failed to create person for: %s. %s %s", person.getDisplay(), e.getMessage(), e.getResponseBodyAsString()), e); } } @@ -124,7 +124,8 @@ public Person updatePerson(String configName, Person person) { return updated; } catch (HttpClientErrorException e) { - throw new OpenMRSException("Failed to update a person in OpenMRS with id: " + person.getUuid(), e); + throw new OpenMRSException(String.format("Failed to update a person in OpenMRS with uuid: %s. %s %s", person.getUuid(), + e.getMessage(), e.getResponseBodyAsString()), e); } } @@ -145,6 +146,8 @@ private void saveAttributesForPerson(Config config, Person person) { personResource.createPersonAttribute(config, person.getUuid(), attribute); } catch (HttpClientErrorException e) { LOGGER.warn("Unable to add attribute to person with id: " + person.getUuid()); + throw new OpenMRSException(String.format("Could not add an attribute with uuid: %s to Person with uuid: %s. %s %s", attribute.getUuid(), + person.getUuid(), e.getMessage(), e.getResponseBodyAsString()), e); } } } diff --git a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSProgramEnrollmentServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSProgramEnrollmentServiceImpl.java index 40619d65f..dcd0ab69f 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSProgramEnrollmentServiceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSProgramEnrollmentServiceImpl.java @@ -79,32 +79,52 @@ public ProgramEnrollment updateProgramEnrollment(String configName, ProgramEnrol } return updatedProgramEnrollment; } catch (HttpClientErrorException e) { - throw new OpenMRSException("Could not update program enrollment with uuid: " + programEnrollment.getUuid(), e); + throw new OpenMRSException(String.format("Could not update program enrollment with uuid: %s. %s %s", programEnrollment.getUuid(), + e.getMessage(), e.getResponseBodyAsString()), e); } } @Override public List getBahmniProgramEnrollmentByPatientUuid(String configName, String patientUuid) { - return programEnrollmentResource.getBahmniProgramEnrollmentByPatientUuid(configService.getConfigByName(configName), patientUuid); + try { + return programEnrollmentResource.getBahmniProgramEnrollmentByPatientUuid(configService.getConfigByName(configName), patientUuid); + } catch (HttpClientErrorException e) { + throw new OpenMRSException(String.format("Could not get a Bahmni Program Enrollments for Patient uuid: %s. %s %s", patientUuid, + e.getMessage(), e.getResponseBodyAsString()), e); + } } @Override public List getBahmniProgramEnrollmentByPatientMotechId(String configName, String patientMotechId) { - Patient patient = patientService.getPatientByMotechId(configName, patientMotechId); - - return Objects.nonNull(patient) ? getBahmniProgramEnrollmentByPatientUuid(configName, patient.getUuid()) : new ArrayList<>(); + try { + Patient patient = patientService.getPatientByMotechId(configName, patientMotechId); + return Objects.nonNull(patient) ? getBahmniProgramEnrollmentByPatientUuid(configName, patient.getUuid()) : new ArrayList<>(); + } catch (HttpClientErrorException e) { + throw new OpenMRSException(String.format("Could not create a Bahmni Program Enrollment for Patient Motech Id: %s. %s %s", + patientMotechId, e.getMessage(), e.getResponseBodyAsString()), e); + } } @Override public List getProgramEnrollmentByPatientUuid(String configName, String patientUuid) { - return programEnrollmentResource.getProgramEnrollmentByPatientUuid(configService.getConfigByName(configName), patientUuid); + try { + return programEnrollmentResource.getProgramEnrollmentByPatientUuid(configService.getConfigByName(configName), patientUuid); + } catch (HttpClientErrorException e) { + throw new OpenMRSException(String.format("Could not get Program Enrollment for Patient uuid: %s. %s %s", patientUuid, + e.getMessage(), e.getResponseBodyAsString()), e); + } } @Override public List getProgramEnrollmentByPatientMotechId(String configName, String patientMotechId) { - Patient patient = patientService.getPatientByMotechId(configName, patientMotechId); + try { + Patient patient = patientService.getPatientByMotechId(configName, patientMotechId); - return Objects.nonNull(patient) ? getProgramEnrollmentByPatientUuid(configName, patient.getUuid()) : new ArrayList<>(); + return Objects.nonNull(patient) ? getProgramEnrollmentByPatientUuid(configName, patient.getUuid()) : new ArrayList<>(); + } catch (HttpClientErrorException e) { + throw new OpenMRSException(String.format("Could not get a Program Enrollment for Patient Motech Id: %s, %s %s", patientMotechId, + e.getMessage(), e.getResponseBodyAsString()), e); + } } @Override diff --git a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSProviderServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSProviderServiceImpl.java index 01b25a518..cb90febf5 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSProviderServiceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSProviderServiceImpl.java @@ -2,6 +2,7 @@ import org.motechproject.openmrs.config.Config; import org.motechproject.openmrs.domain.Provider; +import org.motechproject.openmrs.exception.OpenMRSException; import org.motechproject.openmrs.resource.ProviderResource; import org.motechproject.openmrs.service.OpenMRSConfigService; import org.motechproject.openmrs.service.OpenMRSProviderService; @@ -43,8 +44,7 @@ public Provider getProviderByUuid(String configName, String uuid) { Config config = configService.getConfigByName(configName); return providerResource.getByUuid(config, uuid); } catch (HttpClientErrorException e) { - LOGGER.error("Error while fetching provider with UUID: " + uuid); - return null; + throw new OpenMRSException(String.format("Could not get Provider for uuid: %s. %s %s", uuid, e.getMessage(), e.getResponseBodyAsString()), e); } } diff --git a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSRelationshipServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSRelationshipServiceImpl.java index 817c19e0c..ad7abc3df 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSRelationshipServiceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSRelationshipServiceImpl.java @@ -6,11 +6,13 @@ import org.motechproject.openmrs.config.Config; import org.motechproject.openmrs.domain.Relationship; import org.motechproject.openmrs.domain.RelationshipListResult; +import org.motechproject.openmrs.exception.OpenMRSException; import org.motechproject.openmrs.resource.RelationshipResource; import org.motechproject.openmrs.service.OpenMRSConfigService; import org.motechproject.openmrs.service.OpenMRSRelationshipService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.web.client.HttpClientErrorException; import java.util.ArrayList; import java.util.List; @@ -28,26 +30,31 @@ public class OpenMRSRelationshipServiceImpl implements OpenMRSRelationshipServic public List getByTypeUuidAndPersonUuid(String configName, String typeUuid, String personUuid) { Config config = configService.getConfigByName(configName); - RelationshipListResult result = relationshipResource.getByPersonUuid(config, personUuid); + try { + RelationshipListResult result = relationshipResource.getByPersonUuid(config, personUuid); - //temporary workaround until OpenMRS server-side filtering for the relationships is fixed - return new ArrayList<>(Collections2.filter(result.getResults(), new Predicate() { - @Override - public boolean apply(Relationship relationship) { - String personBUuid = null; - String relationshipTypeUuid = null; + //temporary workaround until OpenMRS server-side filtering for the relationships is fixed + return new ArrayList<>(Collections2.filter(result.getResults(), new Predicate() { + @Override + public boolean apply(Relationship relationship) { + String personBUuid = null; + String relationshipTypeUuid = null; - if (relationship.getPersonB() != null) { - personBUuid = relationship.getPersonB().getUuid(); - } + if (relationship.getPersonB() != null) { + personBUuid = relationship.getPersonB().getUuid(); + } - if (relationship.getRelationshipType() != null) { - relationshipTypeUuid = relationship.getRelationshipType().getUuid(); - } + if (relationship.getRelationshipType() != null) { + relationshipTypeUuid = relationship.getRelationshipType().getUuid(); + } - return StringUtils.equals(personBUuid, personUuid) - && StringUtils.equals(relationshipTypeUuid, typeUuid); - } - })); + return StringUtils.equals(personBUuid, personUuid) + && StringUtils.equals(relationshipTypeUuid, typeUuid); + } + })); + } catch (HttpClientErrorException e) { + throw new OpenMRSException(String.format("Could not get Relationship for Person uuid: %s. %s %s", personUuid, + e.getMessage(), e.getResponseBodyAsString()), e); + } } } diff --git a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSVisitServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSVisitServiceImpl.java index 7fed91eb2..f3dce16b2 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSVisitServiceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSVisitServiceImpl.java @@ -6,6 +6,7 @@ import org.motechproject.openmrs.config.Config; import org.motechproject.openmrs.domain.Visit; import org.motechproject.openmrs.domain.VisitType; +import org.motechproject.openmrs.exception.OpenMRSException; import org.motechproject.openmrs.helper.EventHelper; import org.motechproject.openmrs.resource.VisitResource; import org.motechproject.openmrs.service.EventKeys; @@ -37,11 +38,15 @@ public OpenMRSVisitServiceImpl(OpenMRSConfigService configService, VisitResource public Visit createVisit(String configName, Visit visit) { validateVisit(visit); - Config config = configService.getConfigByName(configName); - Visit createdVisit = visitResource.createVisit(config, visit); + try { + Config config = configService.getConfigByName(configName); + Visit createdVisit = visitResource.createVisit(config, visit); - eventRelay.sendEventMessage(new MotechEvent(EventKeys.CREATED_NEW_VISIT_SUBJECT, EventHelper.visitParameters(createdVisit))); - return createdVisit; + eventRelay.sendEventMessage(new MotechEvent(EventKeys.CREATED_NEW_VISIT_SUBJECT, EventHelper.visitParameters(createdVisit))); + return createdVisit; + } catch (HttpClientErrorException e) { + throw new OpenMRSException(String.format("Could not create a Visit. %s %s", e.getMessage(), e.getResponseBodyAsString()), e); + } } @Override @@ -50,8 +55,7 @@ public Visit getVisitByUuid(String configName, String uuid) { Config config = configService.getConfigByName(configName); return visitResource.getVisitById(config, uuid); } catch (HttpClientErrorException e) { - LOGGER.error("Error while fetching visit with UUID: " + uuid); - return null; + throw new OpenMRSException(String.format("Could not get a Visit for uuid: %s. %s %s", uuid, e.getMessage(), e.getResponseBodyAsString()), e); } } From 3e2fe0ec97452068110b401bf03db9312b42d4eb Mon Sep 17 00:00:00 2001 From: mkruszynski Date: Fri, 7 Oct 2016 12:30:00 +0200 Subject: [PATCH 081/202] MOTECH-2919: Fixed openMRSintegration tests --- .../openmrs/it/MRSEncounterServiceIT.java | 11 +++++++++- .../openmrs/it/MRSPatientServiceIT.java | 21 +++++++++++++++++-- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/openmrs/src/test/java/org/motechproject/openmrs/it/MRSEncounterServiceIT.java b/openmrs/src/test/java/org/motechproject/openmrs/it/MRSEncounterServiceIT.java index ac8a89535..07a59f43d 100644 --- a/openmrs/src/test/java/org/motechproject/openmrs/it/MRSEncounterServiceIT.java +++ b/openmrs/src/test/java/org/motechproject/openmrs/it/MRSEncounterServiceIT.java @@ -22,6 +22,7 @@ import org.motechproject.openmrs.domain.VisitType; import org.motechproject.openmrs.exception.ConceptNameAlreadyInUseException; import org.motechproject.openmrs.exception.HttpException; +import org.motechproject.openmrs.exception.OpenMRSException; import org.motechproject.openmrs.exception.PatientNotFoundException; import org.motechproject.openmrs.service.EventKeys; import org.motechproject.openmrs.service.OpenMRSConceptService; @@ -149,10 +150,18 @@ public void shouldGetLatestEncounter() { @Test public void shouldDeleteEncounter() throws InterruptedException { + Boolean isopenMRSExceptionThrown = Boolean.FALSE; synchronized (lock) { encounterAdapter.deleteEncounter(DEFAULT_CONFIG_NAME, encounter.getUuid()); - assertNull(encounterAdapter.getEncounterByUuid(DEFAULT_CONFIG_NAME, encounter.getUuid())); + + try { + encounterAdapter.getEncounterByUuid(DEFAULT_CONFIG_NAME, encounter.getUuid()); + } catch (OpenMRSException e) { + isopenMRSExceptionThrown = Boolean.TRUE; + } + + assertTrue(isopenMRSExceptionThrown); lock.wait(60000); } diff --git a/openmrs/src/test/java/org/motechproject/openmrs/it/MRSPatientServiceIT.java b/openmrs/src/test/java/org/motechproject/openmrs/it/MRSPatientServiceIT.java index 7776f92e0..308455a88 100644 --- a/openmrs/src/test/java/org/motechproject/openmrs/it/MRSPatientServiceIT.java +++ b/openmrs/src/test/java/org/motechproject/openmrs/it/MRSPatientServiceIT.java @@ -16,6 +16,7 @@ import org.motechproject.openmrs.domain.Person; import org.motechproject.openmrs.exception.ConceptNameAlreadyInUseException; import org.motechproject.openmrs.exception.HttpException; +import org.motechproject.openmrs.exception.OpenMRSException; import org.motechproject.openmrs.exception.PatientNotFoundException; import org.motechproject.openmrs.service.EventKeys; import org.motechproject.openmrs.service.OpenMRSConceptService; @@ -184,10 +185,18 @@ public void shouldDeceasePerson() throws HttpException, PatientNotFoundException @Test public void shouldDeletePatient() throws PatientNotFoundException, InterruptedException { + Boolean isOpenMRSExceptionThrown = Boolean.FALSE; synchronized (lock) { patientAdapter.deletePatient(DEFAULT_CONFIG_NAME, patient.getUuid()); - assertNull(patientAdapter.getPatientByUuid(DEFAULT_CONFIG_NAME, patient.getUuid())); + + try { + patientAdapter.getPatientByUuid(DEFAULT_CONFIG_NAME, patient.getUuid()); + } catch (OpenMRSException e) { + isOpenMRSExceptionThrown = Boolean.TRUE; + } + + assertTrue(isOpenMRSExceptionThrown); lock.wait(60000); } @@ -255,9 +264,17 @@ private Patient savePatient(Patient patient) throws InterruptedException { private void deletePatient(Patient patient) throws PatientNotFoundException, InterruptedException { String locationId = patient.getLocationForMotechId().getUuid(); + Boolean isOpenMRSExceptionThrown = Boolean.FALSE; patientAdapter.deletePatient(DEFAULT_CONFIG_NAME, patient.getUuid()); - assertNull(patientAdapter.getPatientByUuid(DEFAULT_CONFIG_NAME, patient.getUuid())); + + try { + patientAdapter.getPatientByUuid(DEFAULT_CONFIG_NAME, patient.getUuid()); + } catch (OpenMRSException e) { + isOpenMRSExceptionThrown = Boolean.TRUE; + } + + assertTrue(isOpenMRSExceptionThrown); locationAdapter.deleteLocation(DEFAULT_CONFIG_NAME, locationId); } From 5a6979095f1cebad3c700f6fa06d0a933c667c73 Mon Sep 17 00:00:00 2001 From: mkruszynski Date: Fri, 7 Oct 2016 12:34:28 +0200 Subject: [PATCH 082/202] MOTECH-2919: Removed unused imports --- .../java/org/motechproject/openmrs/it/MRSEncounterServiceIT.java | 1 - 1 file changed, 1 deletion(-) diff --git a/openmrs/src/test/java/org/motechproject/openmrs/it/MRSEncounterServiceIT.java b/openmrs/src/test/java/org/motechproject/openmrs/it/MRSEncounterServiceIT.java index 07a59f43d..c02dd4afd 100644 --- a/openmrs/src/test/java/org/motechproject/openmrs/it/MRSEncounterServiceIT.java +++ b/openmrs/src/test/java/org/motechproject/openmrs/it/MRSEncounterServiceIT.java @@ -47,7 +47,6 @@ import java.util.Collections; import java.util.Map; -import static junit.framework.Assert.assertNull; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; From eea682a44c4471067e10df4fe5a56bf5f2b3a11c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Ja=C5=BCd=C5=BCewski?= Date: Mon, 10 Oct 2016 16:22:49 +0200 Subject: [PATCH 083/202] Added app_id to Commcare Task triggers and handling for null app_id --- .../commcare/domain/CommcareForm.java | 11 ++ .../events/FormActionEventHandler.java | 17 ++- .../pull/CommcareFormImporterImpl.java | 2 + .../impl/CommcareFormsEventParser.java | 7 +- .../tasks/builder/FormActionBuilder.java | 17 ++- .../tasks/builder/FormTriggerBuilder.java | 10 +- .../events/FormActionEventHandlerTest.java | 1 + .../it/CommcareTasksIntegrationBundleIT.java | 103 +++++++++++++++++- .../pull/CommcareFormImporterTest.java | 2 +- .../impl/parser/CommcareEventParsersTest.java | 2 +- .../tasks/builder/CaseTriggerBuilderTest.java | 5 + .../tasks/builder/FormTriggerBuilderTest.java | 5 + .../commcare/util/DummyCommcareSchema.java | 18 +++ .../commcare/util/ResponseXML.java | 2 +- .../commcare/web/FullFormControllerTest.java | 2 +- 15 files changed, 181 insertions(+), 23 deletions(-) diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/CommcareForm.java b/commcare/src/main/java/org/motechproject/commcare/domain/CommcareForm.java index 0f965cd1a..b5c02508b 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/CommcareForm.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/CommcareForm.java @@ -26,6 +26,9 @@ public class CommcareForm { @SerializedName("resource_uri") private String resourceUri; + @SerializedName("app_id") + private String appId; + private String type; private String uiversion; @@ -84,6 +87,14 @@ public void setResourceUri(String resourceUri) { this.resourceUri = resourceUri; } + public String getAppId() { + return appId; + } + + public void setAppId(String appId) { + this.appId = appId; + } + public String getType() { return type; } diff --git a/commcare/src/main/java/org/motechproject/commcare/events/FormActionEventHandler.java b/commcare/src/main/java/org/motechproject/commcare/events/FormActionEventHandler.java index 01b3f30f2..116b242b4 100644 --- a/commcare/src/main/java/org/motechproject/commcare/events/FormActionEventHandler.java +++ b/commcare/src/main/java/org/motechproject/commcare/events/FormActionEventHandler.java @@ -1,6 +1,5 @@ package org.motechproject.commcare.events; -import org.apache.commons.lang.StringUtils; import org.joda.time.DateTime; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; @@ -49,11 +48,9 @@ public class FormActionEventHandler { @MotechListener(subjects = EventSubjects.SUBMIT_FORM + ".*") public void submitForm(MotechEvent event) { String configName = EventSubjects.getConfigName(event.getSubject()); - String xmlns = extractXmlnsFromEventSubject(event.getSubject(), configName); Map parameters = event.getParameters(); FormXml formXml = parseEventParametersToFormXml(parameters); - formXml.setXmlns(xmlns); Map formMetadata = new HashMap<>(); formMetadata.put(INSTANCE_ID_KEY, new MetadataValue(UUID.randomUUID().toString())); @@ -66,18 +63,18 @@ public void submitForm(MotechEvent event) { commcareFormService.uploadForm(formXml, configName); } - private String extractXmlnsFromEventSubject(String subject, String configName) { - return StringUtils.removeEnd(subject.replaceFirst(EventSubjects.SUBMIT_FORM + ".", StringUtils.EMPTY), "." + configName); - } - private FormXml parseEventParametersToFormXml(Map parameters) { FormXml formXml = new FormXml(); for (Map.Entry entry : parameters.entrySet()) { if (entry.getValue() != null) { - List xmlPath = discoverXmlPath(entry.getKey()); - FormValueElement element = formXml.getElementByPath(xmlPath); - element.setValue(entry.getValue().toString()); + if ("xmlns".equals(entry.getKey())) { + formXml.setXmlns(entry.getValue().toString()); + } else { + List xmlPath = discoverXmlPath(entry.getKey()); + FormValueElement element = formXml.getElementByPath(xmlPath); + element.setValue(entry.getValue().toString()); + } } } diff --git a/commcare/src/main/java/org/motechproject/commcare/pull/CommcareFormImporterImpl.java b/commcare/src/main/java/org/motechproject/commcare/pull/CommcareFormImporterImpl.java index 616d03144..b8b84b311 100644 --- a/commcare/src/main/java/org/motechproject/commcare/pull/CommcareFormImporterImpl.java +++ b/commcare/src/main/java/org/motechproject/commcare/pull/CommcareFormImporterImpl.java @@ -11,6 +11,7 @@ import org.motechproject.commcare.request.FormListRequest; import org.motechproject.commcare.service.CommcareFormService; import org.motechproject.commons.api.Range; +import org.motechproject.event.MotechEvent; import org.motechproject.event.listener.EventRelay; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -196,6 +197,7 @@ private void initForImport(Range dateRange, String configName) { private void importFormList(CommcareFormList formList) { // iterate backwards for (CommcareForm form : Lists.reverse(formList.getObjects())) { + form.getForm().addAttribute("app_id", form.getAppId()); FullFormEvent formEvent = new FullFormEvent(form.getForm(), form.getReceivedOn(), form.getConfigName()); lastFormXMLNSToBeImported = formEvent.getAttributes().get("xmlns"); diff --git a/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareFormsEventParser.java b/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareFormsEventParser.java index 0489a9396..a68865096 100644 --- a/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareFormsEventParser.java +++ b/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareFormsEventParser.java @@ -54,7 +54,12 @@ public String parseEventSubject(String eventSubject, Map eventPa if (eventSubject.equals(FORMS_EVENT)) { String xmlns = (String) ((Map) eventParameters.get(ATTRIBUTES)).get("xmlns"); - return eventSubject.concat(".").concat(configName).concat(".").concat(xmlns); + String appId = (String) ((Map) eventParameters.get(ATTRIBUTES)).get("app_id"); + if (appId != null) { + return eventSubject.concat(".").concat(configName).concat(".").concat(xmlns).concat(appId); + } else { + return eventSubject.concat(".").concat(configName).concat(".").concat(xmlns); + } } return eventSubject.concat(".").concat(configName); diff --git a/commcare/src/main/java/org/motechproject/commcare/tasks/builder/FormActionBuilder.java b/commcare/src/main/java/org/motechproject/commcare/tasks/builder/FormActionBuilder.java index dc9322023..92b9bbb33 100644 --- a/commcare/src/main/java/org/motechproject/commcare/tasks/builder/FormActionBuilder.java +++ b/commcare/src/main/java/org/motechproject/commcare/tasks/builder/FormActionBuilder.java @@ -61,9 +61,13 @@ private List buildActionsForConfig(Config config) { String displayName = DisplayNameHelper.buildDisplayName(DisplayNames.SUBMIT_FORM, form.getFormName(), application.getApplicationName(), config.getName()); + String appId = application.getCommcareAppId(); + if (appId == null) { + appId = ""; + } ActionEventRequestBuilder actionBuilder = new ActionEventRequestBuilder() .setDisplayName(displayName) - .setSubject(EventSubjects.SUBMIT_FORM + "." + form.getXmlns() + application.getCommcareAppId() + "." + config.getName()) + .setSubject(EventSubjects.SUBMIT_FORM + "." + form.getXmlns() + appId + "." + config.getName()) .setActionParameters(parameters); actions.add(actionBuilder.createActionEventRequest()); } @@ -76,9 +80,10 @@ private List buildActionsForConfig(Config config) { private SortedSet buildActionParameters(FormSchemaJson form) { SortedSet parameters = new TreeSet<>(); int order = 0; + ActionParameterRequestBuilder builder; for (FormSchemaQuestionJson question : form.getQuestions()) { - ActionParameterRequestBuilder builder = new ActionParameterRequestBuilder(); + builder = new ActionParameterRequestBuilder(); String displayName = StringUtils.isBlank(question.getQuestionLabel()) ? question.getQuestionValue() : question.getQuestionLabel(); @@ -100,6 +105,14 @@ private SortedSet buildActionParameters(FormSchemaJson f parameters.add(builder.createActionParameterRequest()); } + builder = new ActionParameterRequestBuilder(); + builder.setValue(form.getXmlns()) + .setDisplayName("xmlns") + .setKey("xmlns") + .setOrder(order++) + .setType(ParameterType.UNICODE.getValue()) + .setHidden(true); + parameters.add(builder.createActionParameterRequest()); return parameters; } diff --git a/commcare/src/main/java/org/motechproject/commcare/tasks/builder/FormTriggerBuilder.java b/commcare/src/main/java/org/motechproject/commcare/tasks/builder/FormTriggerBuilder.java index 6ba6609bd..3f68acfda 100644 --- a/commcare/src/main/java/org/motechproject/commcare/tasks/builder/FormTriggerBuilder.java +++ b/commcare/src/main/java/org/motechproject/commcare/tasks/builder/FormTriggerBuilder.java @@ -99,9 +99,13 @@ private TriggerEventRequest buildTriggerForForm(Config config, CommcareApplicati String formName = form.getFormName(); String displayName = DisplayNameHelper.buildDisplayName(RECEIVED_FORM, formName, applicationName, config.getName()); - - return new TriggerEventRequest(displayName, FORMS_EVENT + "." + config.getName() + "." + form.getXmlns() + application.getCommcareAppId(), - null, buildTriggerParameters(form), FORMS_EVENT); + if (application.getCommcareAppId() != null) { + return new TriggerEventRequest(displayName, FORMS_EVENT + "." + config.getName() + "." + form.getXmlns() + application.getCommcareAppId(), + null, buildTriggerParameters(form), FORMS_EVENT); + } else { + return new TriggerEventRequest(displayName, FORMS_EVENT + "." + config.getName() + "." + form.getXmlns(), + null, buildTriggerParameters(form), FORMS_EVENT); + } } private List buildTriggerParameters(FormSchemaJson form) { diff --git a/commcare/src/test/java/org/motechproject/commcare/events/FormActionEventHandlerTest.java b/commcare/src/test/java/org/motechproject/commcare/events/FormActionEventHandlerTest.java index 749b2915e..ce3ec88fb 100644 --- a/commcare/src/test/java/org/motechproject/commcare/events/FormActionEventHandlerTest.java +++ b/commcare/src/test/java/org/motechproject/commcare/events/FormActionEventHandlerTest.java @@ -41,6 +41,7 @@ public void setUp() { formFields.put("/data/mother/dob_known", "yes"); formFields.put("/data/mother/dob", "1993-02-29"); formFields.put("/data/mother/child", "Mark"); + formFields.put("xmlns", XMLNS); event = new MotechEvent(EventSubjects.SUBMIT_FORM + "." + XMLNS + "." + CONFIG, formFields); } diff --git a/commcare/src/test/java/org/motechproject/commcare/it/CommcareTasksIntegrationBundleIT.java b/commcare/src/test/java/org/motechproject/commcare/it/CommcareTasksIntegrationBundleIT.java index b6e4ed478..8ab419692 100644 --- a/commcare/src/test/java/org/motechproject/commcare/it/CommcareTasksIntegrationBundleIT.java +++ b/commcare/src/test/java/org/motechproject/commcare/it/CommcareTasksIntegrationBundleIT.java @@ -172,7 +172,7 @@ private void createDummyActionChannel(Channel channel) { private void createTestTask() { TaskTriggerInformation triggerInformation = new TaskTriggerInformation("trigger", COMMCARE_CHANNEL_NAME, COMMCARE_CHANNEL_NAME, VERSION, - "org.motechproject.commcare.api.forms." + config.getName() + "." + DummyCommcareSchema.XMLNS1 + DummyCommcareSchema.APP_ID1, "org.motechproject.commcare.api.forms"); + "org.motechproject.commcare.api.forms." + config.getName() + "." + DummyCommcareSchema.XMLNS1, "org.motechproject.commcare.api.forms"); TaskActionInformation actionInformation = new TaskActionInformation("action", COMMCARE_CHANNEL_NAME, COMMCARE_CHANNEL_NAME, VERSION, TEST_INTERFACE, "execute"); @@ -194,16 +194,18 @@ private void verifyCommcareChannelHasCorrectActionsAndTriggers(Channel channel) List triggerEvents = channel.getTriggerTaskEvents(); List actionEvents = channel.getActionTaskEvents(); - assertEquals(8, actionEvents.size()); - assertEquals(11, triggerEvents.size()); + assertEquals(9, actionEvents.size()); + assertEquals(13, triggerEvents.size()); TaskTriggerInformation expectedForm1 = new TaskTriggerInformation(); TaskTriggerInformation expectedForm2 = new TaskTriggerInformation(); TaskTriggerInformation expectedForm3 = new TaskTriggerInformation(); TaskTriggerInformation expectedForm4 = new TaskTriggerInformation(); + TaskTriggerInformation expectedForm5 = new TaskTriggerInformation(); TaskTriggerInformation expectedCaseBirth = new TaskTriggerInformation(); TaskTriggerInformation expectedCaseAppointment = new TaskTriggerInformation(); TaskTriggerInformation expectedCaseDeath = new TaskTriggerInformation(); + TaskTriggerInformation expectedCaseCheckup = new TaskTriggerInformation(); TaskTriggerInformation expectedStockTx = new TaskTriggerInformation(); expectedForm1.setSubject("org.motechproject.commcare.api.forms." + config.getName() + "." + DummyCommcareSchema.XMLNS1 + DummyCommcareSchema.APP_ID1); @@ -218,6 +220,9 @@ private void verifyCommcareChannelHasCorrectActionsAndTriggers(Channel channel) expectedForm4.setSubject("org.motechproject.commcare.api.forms." + config.getName() + "." + DummyCommcareSchema.XMLNS4 + DummyCommcareSchema.APP_ID2); assertTrue(containsTrigger(channel, expectedForm4)); + expectedForm5.setSubject("org.motechproject.commcare.api.forms." + config.getName() + "." + DummyCommcareSchema.XMLNS1); + assertTrue(containsTrigger(channel, expectedForm5)); + expectedCaseBirth.setSubject("org.motechproject.commcare.api.case." + config.getName() + ".birth"); assertTrue(containsTrigger(channel, expectedCaseBirth)); @@ -227,6 +232,9 @@ private void verifyCommcareChannelHasCorrectActionsAndTriggers(Channel channel) expectedCaseDeath.setSubject("org.motechproject.commcare.api.case." + config.getName() + ".death"); assertTrue(containsTrigger(channel, expectedCaseDeath)); + expectedCaseCheckup.setSubject("org.motechproject.commcare.api.case." + config.getName() + ".checkup"); + assertTrue(containsTrigger(channel, expectedCaseCheckup)); + expectedStockTx.setSubject(EventSubjects.RECEIVED_STOCK_TRANSACTION + '.' + config.getName()); assertTrue(containsTrigger(channel, expectedStockTx)); @@ -250,6 +258,11 @@ private void verifyCommcareChannelHasCorrectActionsAndTriggers(Channel channel) assertTriggerParameters(form4Trigger.getEventParameters(), Arrays.asList("/data/medications", "/data/meta/username", "/data/case/create/case_type")); + TriggerEvent form5Trigger = getTrigger(channel, expectedForm5); + assertEquals("org.motechproject.commcare.api.forms", form5Trigger.getTriggerListenerSubject()); + assertTriggerParameters(form5Trigger.getEventParameters(), + Arrays.asList("/data/medications", "/data/meta/username", "/data/case/create/case_type")); + TriggerEvent caseBirthTrigger = getTrigger(channel, expectedCaseBirth); assertEquals("org.motechproject.commcare.api.case", caseBirthTrigger.getTriggerListenerSubject()); assertTriggerParameters(caseBirthTrigger.getEventParameters(), @@ -265,6 +278,11 @@ private void verifyCommcareChannelHasCorrectActionsAndTriggers(Channel channel) assertTriggerParameters(caseDeathTrigger.getEventParameters(), Arrays.asList("dod", "caseName")); + TriggerEvent caseCheckupTrigger = getTrigger(channel, expectedCaseCheckup); + assertEquals("org.motechproject.commcare.api.case", caseCheckupTrigger.getTriggerListenerSubject()); + assertTriggerParameters(caseCheckupTrigger.getEventParameters(), + Arrays.asList("dod", "caseName")); + verifyTaskAction(channel, prepareStockLedgerAction()); verifyTaskAction(channel, prepareCreateCaseAction()); verifyTaskAction(channel, prepareUpdateCaseAction()); @@ -272,6 +290,7 @@ private void verifyCommcareChannelHasCorrectActionsAndTriggers(Channel channel) verifyTaskAction(channel, prepareSubmitForm2Action()); verifyTaskAction(channel, prepareSubmitForm3Action()); verifyTaskAction(channel, prepareSubmitForm4Action()); + verifyTaskAction(channel, prepareSubmitForm5Action()); } private void verifyTaskAction(Channel channel, ActionEvent expected) { @@ -305,8 +324,14 @@ private void createMockCommcareSchema() { applicationJson2.setResourceUri("none"); applicationJson2.setConfigName(config.getName()); + CommcareApplicationJson applicationJson3 = DummyCommcareSchema.getApplicationsForConfigOne().get(2); + applicationJson3.setApplicationName("TestApp3"); + applicationJson3.setResourceUri("none"); + applicationJson3.setConfigName(config.getName()); + applicationDataService.create(applicationJson1); applicationDataService.create(applicationJson2); + applicationDataService.create(applicationJson3); } private HttpResponse sendMockForm() throws IOException, InterruptedException { @@ -555,6 +580,16 @@ private ActionEvent prepareSubmitForm1Action() { .setOrder(order++); parameters.add(builder.build()); + builder = new ActionParameterBuilder(); + builder.setValue(DummyCommcareSchema.XMLNS1) + .setDisplayName("xmlns") + .setKey("xmlns") + .setOrder(order++) + .setType(ParameterType.UNICODE) + .setHidden(true) + .setRequired(false); + parameters.add(builder.build()); + String displayName = String.format("Submit Form: form1 [TestApp1: %s]", config.getName()); ActionEventBuilder actionBuilder = new ActionEventBuilder() @@ -577,6 +612,16 @@ private ActionEvent prepareSubmitForm2Action() { .setOrder(order++); parameters.add(builder.build()); + builder = new ActionParameterBuilder(); + builder.setValue(DummyCommcareSchema.XMLNS2) + .setDisplayName("xmlns") + .setKey("xmlns") + .setOrder(order++) + .setType(ParameterType.UNICODE) + .setHidden(true) + .setRequired(false); + parameters.add(builder.build()); + String displayName = String.format("Submit Form: form2 [TestApp1: %s]", config.getName()); ActionEventBuilder actionBuilder = new ActionEventBuilder() @@ -599,6 +644,16 @@ private ActionEvent prepareSubmitForm3Action() { .setOrder(order++); parameters.add(builder.build()); + builder = new ActionParameterBuilder(); + builder.setValue(DummyCommcareSchema.XMLNS3) + .setDisplayName("xmlns") + .setKey("xmlns") + .setOrder(order++) + .setType(ParameterType.UNICODE) + .setHidden(true) + .setRequired(false); + parameters.add(builder.build()); + String displayName = String.format("Submit Form: form3 [TestApp1: %s]", config.getName()); ActionEventBuilder actionBuilder = new ActionEventBuilder() @@ -621,6 +676,16 @@ private ActionEvent prepareSubmitForm4Action() { .setOrder(order++); parameters.add(builder.build()); + builder = new ActionParameterBuilder(); + builder.setValue(DummyCommcareSchema.XMLNS4) + .setDisplayName("xmlns") + .setKey("xmlns") + .setOrder(order++) + .setType(ParameterType.UNICODE) + .setHidden(true) + .setRequired(false); + parameters.add(builder.build()); + String displayName = String.format("Submit Form: form4 [TestApp2: %s]", config.getName()); ActionEventBuilder actionBuilder = new ActionEventBuilder() @@ -630,6 +695,38 @@ private ActionEvent prepareSubmitForm4Action() { return actionBuilder.build(); } + private ActionEvent prepareSubmitForm5Action() { + SortedSet parameters = new TreeSet<>(); + ActionParameterBuilder builder; + int order = 0; + + builder = new ActionParameterBuilder() + .setDisplayName("Does patient take any medications?") + .setKey(DummyCommcareSchema.FORM_QUESTION5) + .setRequired(false) + .setType(ParameterType.UNICODE) + .setOrder(order++); + parameters.add(builder.build()); + + builder = new ActionParameterBuilder(); + builder.setValue(DummyCommcareSchema.XMLNS1) + .setDisplayName("xmlns") + .setKey("xmlns") + .setOrder(order++) + .setType(ParameterType.UNICODE) + .setHidden(true) + .setRequired(false); + parameters.add(builder.build()); + + String displayName = String.format("Submit Form: form5 [TestApp3: %s]", config.getName()); + + ActionEventBuilder actionBuilder = new ActionEventBuilder() + .setDisplayName(displayName) + .setSubject(EventSubjects.SUBMIT_FORM + "." + DummyCommcareSchema.XMLNS1 + "." + config.getName()) + .setActionParameters(parameters); + return actionBuilder.build(); + } + private boolean containsTrigger(Channel channel, TaskTriggerInformation info) { return getTrigger(channel, info) != null ; } diff --git a/commcare/src/test/java/org/motechproject/commcare/pull/CommcareFormImporterTest.java b/commcare/src/test/java/org/motechproject/commcare/pull/CommcareFormImporterTest.java index d01d88471..c31aa212b 100644 --- a/commcare/src/test/java/org/motechproject/commcare/pull/CommcareFormImporterTest.java +++ b/commcare/src/test/java/org/motechproject/commcare/pull/CommcareFormImporterTest.java @@ -247,7 +247,7 @@ private void verifyFormEvent(MotechEvent event, String id, DateTime receivedOn) Map attributes = (Map) params.get(EventDataKeys.ATTRIBUTES); assertNotNull(attributes); - assertEquals(2, attributes.size()); + assertEquals(3, attributes.size()); assertEquals(ATTR_KEY1 + " " + id, attributes.get(ATTR_KEY1)); assertEquals(ATTR_KEY2 + " " + id, attributes.get(ATTR_KEY2)); diff --git a/commcare/src/test/java/org/motechproject/commcare/service/impl/parser/CommcareEventParsersTest.java b/commcare/src/test/java/org/motechproject/commcare/service/impl/parser/CommcareEventParsersTest.java index 310fdebe2..4a87cc28e 100644 --- a/commcare/src/test/java/org/motechproject/commcare/service/impl/parser/CommcareEventParsersTest.java +++ b/commcare/src/test/java/org/motechproject/commcare/service/impl/parser/CommcareEventParsersTest.java @@ -100,7 +100,7 @@ public void shouldParseFormsEventSubjectProperly() { String parsedSubject = formsEventParser.parseEventSubject(eventSubject, eventParameters); assertEquals(EventSubjects.FORMS_EVENT, eventSubject); - assertEquals(EventSubjects.FORMS_EVENT + "." + config.getName() + "." + DummyCommcareSchema.XMLNS1 + DummyCommcareSchema.APP_ID1, parsedSubject); + assertEquals(EventSubjects.FORMS_EVENT + "." + config.getName() + "." + DummyCommcareSchema.XMLNS1, parsedSubject); } @Test diff --git a/commcare/src/test/java/org/motechproject/commcare/tasks/builder/CaseTriggerBuilderTest.java b/commcare/src/test/java/org/motechproject/commcare/tasks/builder/CaseTriggerBuilderTest.java index 77f162485..82e5087a5 100644 --- a/commcare/src/test/java/org/motechproject/commcare/tasks/builder/CaseTriggerBuilderTest.java +++ b/commcare/src/test/java/org/motechproject/commcare/tasks/builder/CaseTriggerBuilderTest.java @@ -95,6 +95,11 @@ public void shouldBuildProperTriggerRequestForCases() { assertEquals("Received Case: death [app2: ConfigOne]", request.getDisplayName()); assertTrue(hasEventKey(request.getEventParameters(), CASE_FIELD6)); break; + case "org.motechproject.commcare.api.case.ConfigOne.checkup": + assertEquals(1 + CASE_PREDEFINED_FIELDS, request.getEventParameters().size()); + assertEquals("Received Case: checkup [app3: ConfigOne]", request.getDisplayName()); + assertTrue(hasEventKey(request.getEventParameters(), CASE_FIELD6)); + break; case "org.motechproject.commcare.api.case.ConfigTwo.visit": assertEquals(3 + CASE_PREDEFINED_FIELDS, request.getEventParameters().size()); assertEquals("Received Case: visit [app1: ConfigTwo]", request.getDisplayName()); diff --git a/commcare/src/test/java/org/motechproject/commcare/tasks/builder/FormTriggerBuilderTest.java b/commcare/src/test/java/org/motechproject/commcare/tasks/builder/FormTriggerBuilderTest.java index d8b1e9691..b06678bd2 100644 --- a/commcare/src/test/java/org/motechproject/commcare/tasks/builder/FormTriggerBuilderTest.java +++ b/commcare/src/test/java/org/motechproject/commcare/tasks/builder/FormTriggerBuilderTest.java @@ -111,6 +111,11 @@ public void shouldBuildProperTriggerRequestForCases() { assertEquals("Received Form: form4 [app2: ConfigOne]", request.getDisplayName()); assertTrue(hasEventKey(request.getEventParameters(), FORM_QUESTION5)); break; + case BASE_SUBJECT_ONE + "." + XMLNS1: + assertEquals(1 + FORM_PREDEFINED_FIELDS, request.getEventParameters().size()); + assertEquals("Received Form: form5 [app3: ConfigOne]", request.getDisplayName()); + assertTrue(hasEventKey(request.getEventParameters(), FORM_QUESTION5)); + break; case BASE_SUBJECT_TWO + "." + XMLNS5 + APP_ID1: assertEquals(1 + FORM_PREDEFINED_FIELDS, request.getEventParameters().size()); assertEquals("Received Form: form5 [app1: ConfigTwo]", request.getDisplayName()); diff --git a/commcare/src/test/java/org/motechproject/commcare/util/DummyCommcareSchema.java b/commcare/src/test/java/org/motechproject/commcare/util/DummyCommcareSchema.java index 5e148157a..8363e6900 100644 --- a/commcare/src/test/java/org/motechproject/commcare/util/DummyCommcareSchema.java +++ b/commcare/src/test/java/org/motechproject/commcare/util/DummyCommcareSchema.java @@ -43,11 +43,13 @@ public static List getApplicationsForConfigOne() { Map formNames2 = new HashMap<>(); Map formNames3 = new HashMap<>(); Map formNames4 = new HashMap<>(); + Map formNames5 = new HashMap<>(); formNames1.put("en", "form1"); formNames2.put("en", "form2"); formNames3.put("en", "form3"); formNames4.put("en", "form4"); + formNames5.put("en", "form5"); List fields1 = new ArrayList<>(); List fields2 = new ArrayList<>(); @@ -102,6 +104,11 @@ public static List getApplicationsForConfigOne() { formSchemaJson4.setQuestions(Collections.singletonList(questionJson5)); formSchemaJson4.setXmlns(XMLNS4); + FormSchemaJson formSchemaJson5 = new FormSchemaJson(); + formSchemaJson5.setFormNames(formNames5); + formSchemaJson5.setQuestions(Collections.singletonList(questionJson5)); + formSchemaJson5.setXmlns(XMLNS1); + CommcareModuleJson commcareModuleJson1 = new CommcareModuleJson(); commcareModuleJson1.setFormSchemas(Arrays.asList(formSchemaJson1, formSchemaJson2)); commcareModuleJson1.setCaseType("birth"); @@ -117,6 +124,11 @@ public static List getApplicationsForConfigOne() { commcareModuleJson3.setCaseType("death"); commcareModuleJson3.setCaseProperties(fields3); + CommcareModuleJson commcareModuleJson4 = new CommcareModuleJson(); + commcareModuleJson4.setFormSchemas(Collections.singletonList(formSchemaJson5)); + commcareModuleJson4.setCaseType("checkup"); + commcareModuleJson4.setCaseProperties(fields3); + CommcareApplicationJson commcareApplicationJson1 = new CommcareApplicationJson(); commcareApplicationJson1.setApplicationName("app1"); commcareApplicationJson1.setCommcareAppId(APP_ID1); @@ -127,8 +139,14 @@ public static List getApplicationsForConfigOne() { commcareApplicationJson2.setCommcareAppId(APP_ID2); commcareApplicationJson2.setModules(Collections.singletonList((commcareModuleJson3))); + CommcareApplicationJson commcareApplicationJson3 = new CommcareApplicationJson(); + commcareApplicationJson3.setApplicationName("app3"); + commcareApplicationJson3.setCommcareAppId(null); + commcareApplicationJson3.setModules(Collections.singletonList((commcareModuleJson4))); + applicationsInConfig1.add(commcareApplicationJson1); applicationsInConfig1.add(commcareApplicationJson2); + applicationsInConfig1.add(commcareApplicationJson3); return applicationsInConfig1; } diff --git a/commcare/src/test/java/org/motechproject/commcare/util/ResponseXML.java b/commcare/src/test/java/org/motechproject/commcare/util/ResponseXML.java index 7b1070d45..c7fc4d2fa 100644 --- a/commcare/src/test/java/org/motechproject/commcare/util/ResponseXML.java +++ b/commcare/src/test/java/org/motechproject/commcare/util/ResponseXML.java @@ -23,7 +23,7 @@ public static String getFormXML() { " version=\"41\"\n" + " name=\"" + FORM_NAME + "\"\n" + " xmlns:jrm=\"http://dev.commcarehq.org/jr/xforms\"\n" + - " xmlns=\"" + DummyCommcareSchema.XMLNS1 + DummyCommcareSchema.APP_ID1 + "\">\n" + + " xmlns=\"" + DummyCommcareSchema.XMLNS1 + "\">\n" + " <" + ATTR1 + ">" + ATTR1_VALUE + "\n" + " <" + ATTR2 + ">" + ATTR2_VALUE + "\n" + " subElements = (Multimap) parameters.get(SUB_ELEMENTS); assertEquals(5, subElements.size()); From bfddf67be80cf55d5556384709b6b7bc192bd47e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Ja=C5=BCd=C5=BCewski?= Date: Mon, 10 Oct 2016 16:36:57 +0200 Subject: [PATCH 084/202] Removed needless import --- .../motechproject/commcare/pull/CommcareFormImporterImpl.java | 1 - 1 file changed, 1 deletion(-) diff --git a/commcare/src/main/java/org/motechproject/commcare/pull/CommcareFormImporterImpl.java b/commcare/src/main/java/org/motechproject/commcare/pull/CommcareFormImporterImpl.java index b8b84b311..d44956814 100644 --- a/commcare/src/main/java/org/motechproject/commcare/pull/CommcareFormImporterImpl.java +++ b/commcare/src/main/java/org/motechproject/commcare/pull/CommcareFormImporterImpl.java @@ -11,7 +11,6 @@ import org.motechproject.commcare.request.FormListRequest; import org.motechproject.commcare.service.CommcareFormService; import org.motechproject.commons.api.Range; -import org.motechproject.event.MotechEvent; import org.motechproject.event.listener.EventRelay; import org.slf4j.Logger; import org.slf4j.LoggerFactory; From 9528e33b30380779d0e47844e01ed1e40935532c Mon Sep 17 00:00:00 2001 From: mkruszynski Date: Tue, 11 Oct 2016 15:41:44 +0200 Subject: [PATCH 085/202] MOTECH-2885: Fixes after review --- .../impl/OpenMRSObservationServiceImpl.java | 4 +- .../tasks/OpenMRSTaskDataProvider.java | 23 +++++--- .../impl/ObservationResourceImplTest.java | 1 - .../tasks/OpenMRSTaskDataProviderTest.java | 56 ++++++++++--------- 4 files changed, 48 insertions(+), 36 deletions(-) diff --git a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSObservationServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSObservationServiceImpl.java index f31c5ef11..5e5d2207e 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSObservationServiceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSObservationServiceImpl.java @@ -106,8 +106,8 @@ public ObservationListResult getObservationByPatientUUIDAndConceptUUID(String co Config config = configService.getConfigByName(configName); return obsResource.getObservationByPatientUUIDAndConceptUUID(config, patientUUID, conceptUUID); } catch (HttpClientErrorException e) { - LOGGER.error("Error while fetching observations with Patient uuid: " + patientUUID + " and Concept uuid: " + conceptUUID); - return null; + throw new OpenMRSException(String.format("Could not get Observation for Patient uuid: %s and Concept: %s. %s %s", + patientUUID, conceptUUID, e.getMessage(), e.getResponseBodyAsString()), e); } } diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java index 49de86406..fb9ae72c0 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java @@ -206,18 +206,11 @@ private Observation getObservation(String lookupName, Map lookup case BY_PATIENT_UUID_AND_CONCEPT_UUID: observations = observationService.getObservationByPatientUUIDAndConceptUUID(configName, lookupFields.get(PATIENT_UUID), lookupFields.get(CONCEPT_UUID)); - if (CollectionUtils.isNotEmpty(observations.getResults())) { - latestObservation = observationService.getObservationByUuid(configName, observations.getResults().get(0).getUuid()); - latestObservation.setNumberOfObservations("1"); - } + latestObservation = getLatestObservation(configName, observations); break; default: LOGGER.error("Lookup with name {} doesn't exist for observation object", lookupName); break; } - if (latestObservation == null) { - latestObservation = new Observation(); - latestObservation.setNumberOfObservations("0"); - } return latestObservation; } @@ -311,6 +304,20 @@ private GeneratedIdentifier getIdentifier(Map lookupFields, Stri return generatedIdentifierService.getLatestIdentifier(configName, lookupFields.get(IDENTIFIER_SOURCE_NAME)); } + private Observation getLatestObservation(String configName, ObservationListResult observations) { + Observation latestObservation; + + if (CollectionUtils.isNotEmpty(observations.getResults())) { + latestObservation = observationService.getObservationByUuid(configName, observations.getResults().get(0).getUuid()); + latestObservation.setNumberOfObservations("1"); + } else { + latestObservation = new Observation(); + latestObservation.setNumberOfObservations("0"); + } + + return latestObservation; + } + private List filterPrograms(List programEnrollments, String programName, String activeProgram) { List programEnrollmentsList = filterByProgramName(programEnrollments, programName); List result; diff --git a/openmrs/src/test/java/org/motechproject/openmrs/resource/impl/ObservationResourceImplTest.java b/openmrs/src/test/java/org/motechproject/openmrs/resource/impl/ObservationResourceImplTest.java index 0ce123ce0..15959d68c 100644 --- a/openmrs/src/test/java/org/motechproject/openmrs/resource/impl/ObservationResourceImplTest.java +++ b/openmrs/src/test/java/org/motechproject/openmrs/resource/impl/ObservationResourceImplTest.java @@ -93,7 +93,6 @@ public void shouldQueryForObservationByPatientIdAndConceptId() throws Exception assertThat(result, equalTo(readFromFile(OBSERVATION_QUERY_RESPONSE_JSON, ObservationListResult.class))); assertThat(requestCaptor.getValue().getHeaders(), equalTo(getHeadersForGet(config))); - assertThat(requestCaptor.getValue().getBody(), nullValue()); } public void shouldCreateObservation() throws Exception { diff --git a/openmrs/src/test/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProviderTest.java b/openmrs/src/test/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProviderTest.java index 3b0dc6891..e3ee6185f 100644 --- a/openmrs/src/test/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProviderTest.java +++ b/openmrs/src/test/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProviderTest.java @@ -8,17 +8,7 @@ import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import org.motechproject.openmrs.config.Configs; -import org.motechproject.openmrs.domain.Attribute; -import org.motechproject.openmrs.domain.Encounter; -import org.motechproject.openmrs.domain.EncounterType; -import org.motechproject.openmrs.domain.Patient; -import org.motechproject.openmrs.domain.Person; -import org.motechproject.openmrs.domain.Program; -import org.motechproject.openmrs.domain.ProgramEnrollment; -import org.motechproject.openmrs.domain.ProgramEnrollmentListResult; -import org.motechproject.openmrs.domain.Provider; -import org.motechproject.openmrs.domain.Relationship; -import org.motechproject.openmrs.domain.RelationshipType; +import org.motechproject.openmrs.domain.*; import org.motechproject.openmrs.service.OpenMRSConfigService; import org.motechproject.openmrs.service.OpenMRSEncounterService; import org.motechproject.openmrs.service.OpenMRSGeneratedIdentifierService; @@ -45,20 +35,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; -import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.ACTIVE_PROGRAM; -import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.BAHMNI_PROGRAM_ENROLLMENT; -import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.BY_MOTECH_ID; -import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.BY_MOTECH_ID_AND_PROGRAM_NAME; -import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.BY_PERSON_UUID; -import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.BY_UUID; -import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.BY_UUID_AMD_PROGRAM_NAME; -import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.MOTECH_ID; -import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.PATIENT_MOTECH_ID; -import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.PATIENT_UUID; -import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.PERSON_UUID; -import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.PROGRAM_NAME; -import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.RELATIONSHIP_TYPE_UUID; -import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.UUID; +import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.*; @RunWith(MockitoJUnitRunner.class) public class OpenMRSTaskDataProviderTest { @@ -182,6 +159,35 @@ public void shouldReturnEncounterForLookupGetEncounterByUuid() { verify(encounterService).getEncounterByUuid(CONFIG_NAME, DEFAULT_UUID); } + @Test + public void shouldReturnObservationForPatientUuidAndConceptUuid() { + String className = Observation.class.getSimpleName(); + String conceptUuid = "sampleConceptUuid"; + + List results = new ArrayList<>(); + + Map lookupFields = new HashMap<>(); + lookupFields.put(PATIENT_UUID, DEFAULT_UUID); + lookupFields.put(CONCEPT_UUID, conceptUuid); + + Observation observation = new Observation(); + observation.setUuid("10"); + + results.add(observation); + + ObservationListResult observationListResult = new ObservationListResult(); + observationListResult.setResults(results); + + when(observationService.getObservationByPatientUUIDAndConceptUUID(CONFIG_NAME, DEFAULT_UUID, conceptUuid)).thenReturn(observationListResult); + when(observationService.getObservationByUuid(CONFIG_NAME, "10")).thenReturn(observation); + + Object object = taskDataProvider.lookup(className + '-' + CONFIG_NAME, BY_PATIENT_UUID_AND_CONCEPT_UUID, lookupFields); + + assertEquals(observation, object); + + verify(observationService).getObservationByPatientUUIDAndConceptUUID(CONFIG_NAME, DEFAULT_UUID, conceptUuid); + } + @Test public void shouldReturnNullWhenWrongLookupNameForPatient() { String className = Patient.class.getSimpleName(); From 2194beeb9aaa4593ef7f25504086e916e20e27d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Ja=C5=BCd=C5=BCewski?= Date: Tue, 11 Oct 2016 16:10:49 +0200 Subject: [PATCH 086/202] MOTECH-2868 Added detailed view of errors in backward compatibility check --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 3a2c6b7df..198dc4cc9 100644 --- a/pom.xml +++ b/pom.xml @@ -1271,6 +1271,7 @@ BACKWARD_COMPATIBLE_IMPLEMENTER + true From 53561d7db2e1141b594dfea6273121adcfa06b0f Mon Sep 17 00:00:00 2001 From: mkruszynski Date: Tue, 11 Oct 2016 17:38:22 +0200 Subject: [PATCH 087/202] MOTECH-2919: Fixed logging for Concept --- .../impl/OpenMRSConceptServiceImpl.java | 3 +-- .../openmrs/it/MRSConceptServiceIT.java | 21 ++++++++++++++++--- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSConceptServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSConceptServiceImpl.java index 78f8d806f..d855393c0 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSConceptServiceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSConceptServiceImpl.java @@ -104,8 +104,7 @@ public Concept getConceptByUuid(String configName, String uuid) { Config config = configService.getConfigByName(configName); concept = conceptResource.getConceptById(config, uuid); } catch (HttpClientErrorException e) { - LOGGER.error("Failed to get concept with ID " + uuid); - concept = null; + throw new OpenMRSException(String.format("Could not get Concept for uuid: %s. %s %s", uuid, e.getMessage(), e.getResponseBodyAsString()), e); } return concept; diff --git a/openmrs/src/test/java/org/motechproject/openmrs/it/MRSConceptServiceIT.java b/openmrs/src/test/java/org/motechproject/openmrs/it/MRSConceptServiceIT.java index 747eba7f1..80eb4f35f 100644 --- a/openmrs/src/test/java/org/motechproject/openmrs/it/MRSConceptServiceIT.java +++ b/openmrs/src/test/java/org/motechproject/openmrs/it/MRSConceptServiceIT.java @@ -1,5 +1,6 @@ package org.motechproject.openmrs.it; +import com.sun.org.apache.xpath.internal.operations.Bool; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -10,6 +11,7 @@ import org.motechproject.openmrs.domain.Concept; import org.motechproject.openmrs.domain.ConceptName; import org.motechproject.openmrs.exception.ConceptNameAlreadyInUseException; +import org.motechproject.openmrs.exception.OpenMRSException; import org.motechproject.openmrs.service.EventKeys; import org.motechproject.openmrs.service.OpenMRSConceptService; import org.motechproject.testing.osgi.BasePaxIT; @@ -27,7 +29,6 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.motechproject.openmrs.util.TestConstants.DEFAULT_CONFIG_NAME; @@ -96,10 +97,17 @@ public void shouldUpdateConcept() throws InterruptedException, ConceptNameAlread @Test public void shouldDeleteConcept() throws InterruptedException, ConceptNameAlreadyInUseException { + Boolean isOpenMRSExceptionThrown = Boolean.FALSE; synchronized (lock) { conceptAdapter.deleteConcept(DEFAULT_CONFIG_NAME, conceptOne.getUuid()); - assertNull(conceptAdapter.getConceptByUuid(DEFAULT_CONFIG_NAME, conceptOne.getUuid())); + try { + conceptAdapter.getConceptByUuid(DEFAULT_CONFIG_NAME, conceptOne.getUuid()); + } catch (OpenMRSException e) { + isOpenMRSExceptionThrown = Boolean.TRUE; + } + + assertTrue(isOpenMRSExceptionThrown); lock.wait(60000); } @@ -187,10 +195,17 @@ private Concept createConcept(Concept concept) throws ConceptNameAlreadyInUseExc } private void deleteConcept(Concept concept) throws InterruptedException { + Boolean isOpenMRSExceptionThrown = Boolean.FALSE; conceptAdapter.deleteConcept(DEFAULT_CONFIG_NAME, concept.getUuid()); - assertNull(conceptAdapter.getConceptByUuid(DEFAULT_CONFIG_NAME, concept.getUuid())); + try { + conceptAdapter.getConceptByUuid(DEFAULT_CONFIG_NAME, concept.getUuid()); + } catch (OpenMRSException e) { + isOpenMRSExceptionThrown = Boolean.TRUE; + } + + assertTrue(isOpenMRSExceptionThrown); } public class MrsListener implements EventListener { From 4b1c57074774e802d861ef4668df189a6fe2a065 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Ja=C5=BCd=C5=BCewski?= Date: Thu, 13 Oct 2016 15:53:16 +0200 Subject: [PATCH 088/202] MOTECH-2918 Added response details to debug log and error status handling to Data Values import --- .../rest/service/impl/DhisWebServiceImpl.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/dhis2/src/main/java/org/motechproject/dhis2/rest/service/impl/DhisWebServiceImpl.java b/dhis2/src/main/java/org/motechproject/dhis2/rest/service/impl/DhisWebServiceImpl.java index 548e3ee3d..d2155da97 100644 --- a/dhis2/src/main/java/org/motechproject/dhis2/rest/service/impl/DhisWebServiceImpl.java +++ b/dhis2/src/main/java/org/motechproject/dhis2/rest/service/impl/DhisWebServiceImpl.java @@ -408,12 +408,11 @@ private DhisStatusResponse createEntity(Settings settings, String uri, String js CloseableHttpResponse response = getResponseForRequest(request); - LOGGER.debug(String.format("Received response to create resource: %s, request: %s", json, response)); - DhisStatusResponse status; try (InputStream content = getContentForResponse(response)) { String contentString = IOUtils.toString(content); + LOGGER.debug(String.format("Received response to create resource: %s, request: %s", json, contentString)); status = new ObjectMapper().readValue(contentString, DhisStatusResponse.class); if (status.getStatus() == DhisStatus.ERROR) { String msg = String.format("Error in DHIS2 status response, error details: %s", contentString); @@ -547,10 +546,16 @@ private DhisDataValueStatusResponse importDataValues(Settings settings, String u HttpUriRequest request = generatePostRequest(settings, uri, json); LOGGER.debug(String.format("Initiating request to create resource: %s, request: %s", json, request.toString())); CloseableHttpResponse response = getResponseForRequest(request); - LOGGER.debug(String.format("Received response to create resource: %s, request: %s", json, response)); + DhisDataValueStatusResponse status; try (InputStream content = getContentForResponse(response)) { - return new ObjectMapper().readValue(content, DhisDataValueStatusResponse.class); + String contentString = IOUtils.toString(content); + LOGGER.debug(String.format("Received response to create resource: %s, request: %s", json, contentString)); + status = new ObjectMapper().readValue(contentString, DhisDataValueStatusResponse.class); + if (status.getStatus() == DhisStatus.ERROR) { + String msg = String.format("Error in DHIS2 status response, error details: %s", contentString); + throw new DhisWebException(msg); + } } catch (IOException e) { String msg = String.format("Error parsing response from uri: %s, exception: %s", uri, e.toString()); statusMessageService.warn(msg, MODULE_NAME); @@ -558,6 +563,7 @@ private DhisDataValueStatusResponse importDataValues(Settings settings, String u } finally { closeResponse(response); } + return status; } private void closeResponse(CloseableHttpResponse response) { From c8cf69edcf5b7a217c6160818263c38ec758065c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Ja=C5=BCd=C5=BCewski?= Date: Fri, 14 Oct 2016 11:01:49 +0200 Subject: [PATCH 089/202] MOTECH-2971 Removed Case tab in Commcare module --- commcare/src/main/resources/webapp/index.html | 36 -------------- .../main/resources/webapp/partials/cases.html | 48 ------------------- 2 files changed, 84 deletions(-) delete mode 100644 commcare/src/main/resources/webapp/partials/cases.html diff --git a/commcare/src/main/resources/webapp/index.html b/commcare/src/main/resources/webapp/index.html index 8ffdc019f..a36481218 100644 --- a/commcare/src/main/resources/webapp/index.html +++ b/commcare/src/main/resources/webapp/index.html @@ -7,7 +7,6 @@
  • {{msg('commcare.tab.settings')}}
  • {{msg('commcare.tab.import')}}
  • {{msg('commcare.tab.forms')}}
  • -
  • {{msg('commcare.tab.cases')}}
  • @@ -26,38 +24,4 @@
    - -
    - - -
    {{msg('commcare.filters')}}
    -
    -
    -
    - {{msg('commcare.caseName')}} -
    -
    - - - - -
    -
    -
    -
    - {{msg('commcare.dateModifiedRange')}} -
    - -
    -
    - -
    -
    -
    -
    -
    \ No newline at end of file diff --git a/commcare/src/main/resources/webapp/partials/cases.html b/commcare/src/main/resources/webapp/partials/cases.html deleted file mode 100644 index 1dc9365a4..000000000 --- a/commcare/src/main/resources/webapp/partials/cases.html +++ /dev/null @@ -1,48 +0,0 @@ -
    -
    -

     {{msg('commcare.alert.info.noConfigurationsDefined')}}

    -
    -
    - -
    - -
    - - - -
    - -
    -

    {{msg('commcare.alert.warning')}}

    - {{loadingError}} -
    - -
    -
    -
    -
    - - - -
    From 58ef95832d82ec754b2d128e39c0f241bdd384a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Ja=C5=BCd=C5=BCewski?= Date: Fri, 14 Oct 2016 13:15:53 +0200 Subject: [PATCH 090/202] Moved parsing DHIS2 response to separate method --- .../rest/service/impl/DhisWebServiceImpl.java | 35 +++++-------------- 1 file changed, 8 insertions(+), 27 deletions(-) diff --git a/dhis2/src/main/java/org/motechproject/dhis2/rest/service/impl/DhisWebServiceImpl.java b/dhis2/src/main/java/org/motechproject/dhis2/rest/service/impl/DhisWebServiceImpl.java index d2155da97..3984cf8c7 100644 --- a/dhis2/src/main/java/org/motechproject/dhis2/rest/service/impl/DhisWebServiceImpl.java +++ b/dhis2/src/main/java/org/motechproject/dhis2/rest/service/impl/DhisWebServiceImpl.java @@ -31,7 +31,6 @@ import org.motechproject.dhis2.rest.domain.DhisDataValueStatusResponse; import org.motechproject.dhis2.rest.domain.DhisEventDto; import org.motechproject.dhis2.rest.domain.DhisServerInfo; -import org.motechproject.dhis2.rest.domain.DhisStatus; import org.motechproject.dhis2.rest.domain.DhisStatusResponse; import org.motechproject.dhis2.rest.domain.EnrollmentDto; import org.motechproject.dhis2.rest.domain.OrganisationUnitDto; @@ -403,30 +402,9 @@ private List getResources(String resourceName, Class c /*Attempts to create the an entity in the DHIS2 system. Returns the response from DHIS2*/ private DhisStatusResponse createEntity(Settings settings, String uri, String json) { HttpUriRequest request = generatePostRequest(settings, uri, json); - LOGGER.debug(String.format("Initiating request to create resource: %s, request: %s", json, request.toString())); - CloseableHttpResponse response = getResponseForRequest(request); - - DhisStatusResponse status; - - try (InputStream content = getContentForResponse(response)) { - String contentString = IOUtils.toString(content); - LOGGER.debug(String.format("Received response to create resource: %s, request: %s", json, contentString)); - status = new ObjectMapper().readValue(contentString, DhisStatusResponse.class); - if (status.getStatus() == DhisStatus.ERROR) { - String msg = String.format("Error in DHIS2 status response, error details: %s", contentString); - throw new DhisWebException(msg); - } - } catch (IOException e) { - String msg = String.format("Error parsing response from uri: %s, exception: %s", uri, e.toString()); - statusMessageService.warn(msg, MODULE_NAME); - throw new DhisWebException(msg, e); - } finally { - closeResponse(response); - } - - return status; + return (DhisStatusResponse) getDhisResponseForHttpResponse(json, uri, response, DhisStatusResponse.class); } /*Converts the object to json*/ @@ -546,13 +524,16 @@ private DhisDataValueStatusResponse importDataValues(Settings settings, String u HttpUriRequest request = generatePostRequest(settings, uri, json); LOGGER.debug(String.format("Initiating request to create resource: %s, request: %s", json, request.toString())); CloseableHttpResponse response = getResponseForRequest(request); - DhisDataValueStatusResponse status; + return (DhisDataValueStatusResponse) getDhisResponseForHttpResponse(json, uri, response, DhisDataValueStatusResponse.class); + } + private Object getDhisResponseForHttpResponse(String json, String uri, CloseableHttpResponse response, Class responseType) { + Object status; try (InputStream content = getContentForResponse(response)) { String contentString = IOUtils.toString(content); - LOGGER.debug(String.format("Received response to create resource: %s, request: %s", json, contentString)); - status = new ObjectMapper().readValue(contentString, DhisDataValueStatusResponse.class); - if (status.getStatus() == DhisStatus.ERROR) { + LOGGER.debug(String.format("Received response to create resource: %s, request: %s", contentString, json)); + status = new ObjectMapper().readValue(contentString, responseType); + if (status.toString().contains("ERROR")) { String msg = String.format("Error in DHIS2 status response, error details: %s", contentString); throw new DhisWebException(msg); } From b208b76f6c7a6fcf111fcd41b8006d3a05f2c2e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Ja=C5=BCd=C5=BCewski?= Date: Fri, 14 Oct 2016 15:57:44 +0200 Subject: [PATCH 091/202] Added abstract class for DHIS2 responses --- .../domain/DhisDataValueStatusResponse.java | 20 +------------- .../dhis2/rest/domain/DhisResponse.java | 25 ++++++++++++++++++ .../dhis2/rest/domain/DhisStatusResponse.java | 26 +++++-------------- .../rest/service/impl/DhisWebServiceImpl.java | 14 +++++++--- .../dhis2/event/EventHandlerTest.java | 2 +- 5 files changed, 44 insertions(+), 43 deletions(-) create mode 100644 dhis2/src/main/java/org/motechproject/dhis2/rest/domain/DhisResponse.java diff --git a/dhis2/src/main/java/org/motechproject/dhis2/rest/domain/DhisDataValueStatusResponse.java b/dhis2/src/main/java/org/motechproject/dhis2/rest/domain/DhisDataValueStatusResponse.java index 63e386d32..99014ef11 100644 --- a/dhis2/src/main/java/org/motechproject/dhis2/rest/domain/DhisDataValueStatusResponse.java +++ b/dhis2/src/main/java/org/motechproject/dhis2/rest/domain/DhisDataValueStatusResponse.java @@ -7,11 +7,9 @@ * A class to model DHIS2 responses that result from importing data values and data value sets. */ @JsonIgnoreProperties(ignoreUnknown = true) -public class DhisDataValueStatusResponse { +public class DhisDataValueStatusResponse extends DhisResponse { - private DhisStatus status; private String description; - private ImportCountDto importCountDto; private ImportCountDto dataValueCount; private boolean dataSetComplete; @@ -24,14 +22,6 @@ public void setDataValueCount(ImportCountDto dataValueCount) { this.dataValueCount = dataValueCount; } - public DhisStatus getStatus() { - return status; - } - - public void setStatus(DhisStatus status) { - this.status = status; - } - public String getDescription() { return description; } @@ -40,14 +30,6 @@ public void setDescription(String description) { this.description = description; } - public ImportCountDto getImportCountDto() { - return importCountDto; - } - - public void setImportCountDto(ImportCountDto importCountDto) { - this.importCountDto = importCountDto; - } - public boolean isDataSetComplete() { return dataSetComplete; } diff --git a/dhis2/src/main/java/org/motechproject/dhis2/rest/domain/DhisResponse.java b/dhis2/src/main/java/org/motechproject/dhis2/rest/domain/DhisResponse.java new file mode 100644 index 000000000..b019f0be3 --- /dev/null +++ b/dhis2/src/main/java/org/motechproject/dhis2/rest/domain/DhisResponse.java @@ -0,0 +1,25 @@ +package org.motechproject.dhis2.rest.domain; + +/** + * Base class for DHIS2 action response. + */ +public abstract class DhisResponse { + private DhisStatus status; + private ImportCountDto importCountDto; + + public DhisStatus getStatus() { + return status; + } + + public void setStatus(DhisStatus status) { + this.status = status; + } + + public ImportCountDto getImportCountDto() { + return importCountDto; + } + + public void setImportCountDto(ImportCountDto importCountDto) { + this.importCountDto = importCountDto; + } +} diff --git a/dhis2/src/main/java/org/motechproject/dhis2/rest/domain/DhisStatusResponse.java b/dhis2/src/main/java/org/motechproject/dhis2/rest/domain/DhisStatusResponse.java index 2545c1638..76bfcfa41 100644 --- a/dhis2/src/main/java/org/motechproject/dhis2/rest/domain/DhisStatusResponse.java +++ b/dhis2/src/main/java/org/motechproject/dhis2/rest/domain/DhisStatusResponse.java @@ -9,33 +9,21 @@ * A class to model DHIS2 responses that result from creating entities. */ @JsonIgnoreProperties(ignoreUnknown = true) -public class DhisStatusResponse { +public class DhisStatusResponse extends DhisResponse{ private DhisStatus status; - private ImportCountDto importCount; + private ImportCountDto importCountDto; private String reference; private DhisResponseDetails response; - public DhisStatus getStatus() { - return status; - } - - public void setStatus(DhisStatus status) { - this.status = status; - } - - public ImportCountDto getImportCount() { - if (importCount == null && response == null) { + public ImportCountDto getImportCountDto() { + if (importCountDto == null && response == null) { return null; } else { - return importCount != null ? importCount : response.getImportCount(); + return importCountDto != null ? importCountDto : response.getImportCount(); } } - public void setImportCount(ImportCountDto importCount) { - this.importCount = importCount; - } - public String getReference() { if (reference == null && response == null) { return null; @@ -58,7 +46,7 @@ public void setResponse(DhisResponseDetails response) { @Override public int hashCode() { - return Objects.hash(status, importCount, reference, response); + return Objects.hash(status, importCountDto, reference, response); } @Override @@ -71,7 +59,7 @@ public boolean equals(Object obj) { } final DhisStatusResponse other = (DhisStatusResponse) obj; return Objects.equals(this.status, other.status) - && Objects.equals(this.importCount, other.importCount) + && Objects.equals(this.importCountDto, other.importCountDto) && Objects.equals(this.reference, other.reference) && Objects.equals(this.response, other.response); } diff --git a/dhis2/src/main/java/org/motechproject/dhis2/rest/service/impl/DhisWebServiceImpl.java b/dhis2/src/main/java/org/motechproject/dhis2/rest/service/impl/DhisWebServiceImpl.java index 3984cf8c7..f4a41925c 100644 --- a/dhis2/src/main/java/org/motechproject/dhis2/rest/service/impl/DhisWebServiceImpl.java +++ b/dhis2/src/main/java/org/motechproject/dhis2/rest/service/impl/DhisWebServiceImpl.java @@ -30,7 +30,9 @@ import org.motechproject.dhis2.rest.domain.DataValueSetDto; import org.motechproject.dhis2.rest.domain.DhisDataValueStatusResponse; import org.motechproject.dhis2.rest.domain.DhisEventDto; +import org.motechproject.dhis2.rest.domain.DhisResponse; import org.motechproject.dhis2.rest.domain.DhisServerInfo; +import org.motechproject.dhis2.rest.domain.DhisStatus; import org.motechproject.dhis2.rest.domain.DhisStatusResponse; import org.motechproject.dhis2.rest.domain.EnrollmentDto; import org.motechproject.dhis2.rest.domain.OrganisationUnitDto; @@ -527,13 +529,17 @@ private DhisDataValueStatusResponse importDataValues(Settings settings, String u return (DhisDataValueStatusResponse) getDhisResponseForHttpResponse(json, uri, response, DhisDataValueStatusResponse.class); } - private Object getDhisResponseForHttpResponse(String json, String uri, CloseableHttpResponse response, Class responseType) { - Object status; + private DhisResponse getDhisResponseForHttpResponse(String json, String uri, CloseableHttpResponse response, Class responseType) { + DhisResponse status; try (InputStream content = getContentForResponse(response)) { String contentString = IOUtils.toString(content); LOGGER.debug(String.format("Received response to create resource: %s, request: %s", contentString, json)); - status = new ObjectMapper().readValue(contentString, responseType); - if (status.toString().contains("ERROR")) { + if(responseType == DhisStatusResponse.class) { + status = new ObjectMapper().readValue(contentString, DhisStatusResponse.class); + } else { + status = new ObjectMapper().readValue(contentString, DhisDataValueStatusResponse.class); + } + if (status.getStatus() == DhisStatus.ERROR) { String msg = String.format("Error in DHIS2 status response, error details: %s", contentString); throw new DhisWebException(msg); } diff --git a/dhis2/src/test/java/org/motechproject/dhis2/event/EventHandlerTest.java b/dhis2/src/test/java/org/motechproject/dhis2/event/EventHandlerTest.java index e15a8eaf8..b8378511d 100644 --- a/dhis2/src/test/java/org/motechproject/dhis2/event/EventHandlerTest.java +++ b/dhis2/src/test/java/org/motechproject/dhis2/event/EventHandlerTest.java @@ -77,7 +77,7 @@ public void setup() throws Exception{ response = new DhisStatusResponse(); response.setReference(INSTANCE_DHIS_ID); response.setStatus(DhisStatus.SUCCESS); - response.setImportCount(importCount); + response.setImportCountDto(importCount); } @Test From 49b07df48f9db11225b10e0e5bc1488d78f4a947 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Ja=C5=BCd=C5=BCewski?= Date: Fri, 14 Oct 2016 16:53:41 +0200 Subject: [PATCH 092/202] Added ignoring unknown properties to DhisResponse --- .../java/org/motechproject/dhis2/rest/domain/DhisResponse.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dhis2/src/main/java/org/motechproject/dhis2/rest/domain/DhisResponse.java b/dhis2/src/main/java/org/motechproject/dhis2/rest/domain/DhisResponse.java index b019f0be3..df41c9c73 100644 --- a/dhis2/src/main/java/org/motechproject/dhis2/rest/domain/DhisResponse.java +++ b/dhis2/src/main/java/org/motechproject/dhis2/rest/domain/DhisResponse.java @@ -1,8 +1,11 @@ package org.motechproject.dhis2.rest.domain; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; + /** * Base class for DHIS2 action response. */ +@JsonIgnoreProperties(ignoreUnknown = true) public abstract class DhisResponse { private DhisStatus status; private ImportCountDto importCountDto; From 304086a572affdcb204052c81c36ac78c1b6f249 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Ja=C5=BCd=C5=BCewski?= Date: Mon, 17 Oct 2016 15:17:01 +0200 Subject: [PATCH 093/202] Added warning to logs when recieving form with null app_id --- .../service/impl/CommcareFormsEventParser.java | 10 +++++++--- .../commcare/tasks/builder/FormActionBuilder.java | 15 ++++++++------- .../tasks/builder/FormTriggerBuilder.java | 10 +++------- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareFormsEventParser.java b/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareFormsEventParser.java index a68865096..89e4a34c1 100644 --- a/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareFormsEventParser.java +++ b/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareFormsEventParser.java @@ -4,6 +4,8 @@ import com.google.common.collect.Multimap; import org.apache.commons.lang.StringUtils; import org.motechproject.commons.api.TasksEventParser; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import java.util.HashMap; @@ -32,6 +34,7 @@ public class CommcareFormsEventParser implements TasksEventParser { public static final String PARSER_NAME = "CommcareForms"; private static final String ID = "id"; + private static final Logger LOGGER = LoggerFactory.getLogger(CommcareFormsEventParser.class); @Override public Map parseEventParameters(String subject, Map entryParameters) { @@ -55,11 +58,12 @@ public String parseEventSubject(String eventSubject, Map eventPa if (eventSubject.equals(FORMS_EVENT)) { String xmlns = (String) ((Map) eventParameters.get(ATTRIBUTES)).get("xmlns"); String appId = (String) ((Map) eventParameters.get(ATTRIBUTES)).get("app_id"); + if (appId != null) { - return eventSubject.concat(".").concat(configName).concat(".").concat(xmlns).concat(appId); - } else { - return eventSubject.concat(".").concat(configName).concat(".").concat(xmlns); + appId = ""; + LOGGER.warn("AppId for form is null. XMLNS: {}", xmlns); } + return eventSubject.concat(".").concat(configName).concat(".").concat(xmlns).concat(appId); } return eventSubject.concat(".").concat(configName); diff --git a/commcare/src/main/java/org/motechproject/commcare/tasks/builder/FormActionBuilder.java b/commcare/src/main/java/org/motechproject/commcare/tasks/builder/FormActionBuilder.java index 92b9bbb33..8cf10d415 100644 --- a/commcare/src/main/java/org/motechproject/commcare/tasks/builder/FormActionBuilder.java +++ b/commcare/src/main/java/org/motechproject/commcare/tasks/builder/FormActionBuilder.java @@ -61,10 +61,7 @@ private List buildActionsForConfig(Config config) { String displayName = DisplayNameHelper.buildDisplayName(DisplayNames.SUBMIT_FORM, form.getFormName(), application.getApplicationName(), config.getName()); - String appId = application.getCommcareAppId(); - if (appId == null) { - appId = ""; - } + String appId = (application.getCommcareAppId() == null) ? "" : application.getCommcareAppId(); ActionEventRequestBuilder actionBuilder = new ActionEventRequestBuilder() .setDisplayName(displayName) .setSubject(EventSubjects.SUBMIT_FORM + "." + form.getXmlns() + appId + "." + config.getName()) @@ -105,15 +102,19 @@ private SortedSet buildActionParameters(FormSchemaJson f parameters.add(builder.createActionParameterRequest()); } - builder = new ActionParameterRequestBuilder(); + parameters.add(addXmlnsParameter(form, order)); + return parameters; + } + + private ActionParameterRequest addXmlnsParameter(FormSchemaJson form, int order) { + ActionParameterRequestBuilder builder = new ActionParameterRequestBuilder(); builder.setValue(form.getXmlns()) .setDisplayName("xmlns") .setKey("xmlns") .setOrder(order++) .setType(ParameterType.UNICODE.getValue()) .setHidden(true); - parameters.add(builder.createActionParameterRequest()); - return parameters; + return builder.createActionParameterRequest(); } private SortedSet convertCommcareoptionsToTaskActionOptions(List options) { diff --git a/commcare/src/main/java/org/motechproject/commcare/tasks/builder/FormTriggerBuilder.java b/commcare/src/main/java/org/motechproject/commcare/tasks/builder/FormTriggerBuilder.java index 3f68acfda..6d417cc29 100644 --- a/commcare/src/main/java/org/motechproject/commcare/tasks/builder/FormTriggerBuilder.java +++ b/commcare/src/main/java/org/motechproject/commcare/tasks/builder/FormTriggerBuilder.java @@ -99,13 +99,9 @@ private TriggerEventRequest buildTriggerForForm(Config config, CommcareApplicati String formName = form.getFormName(); String displayName = DisplayNameHelper.buildDisplayName(RECEIVED_FORM, formName, applicationName, config.getName()); - if (application.getCommcareAppId() != null) { - return new TriggerEventRequest(displayName, FORMS_EVENT + "." + config.getName() + "." + form.getXmlns() + application.getCommcareAppId(), - null, buildTriggerParameters(form), FORMS_EVENT); - } else { - return new TriggerEventRequest(displayName, FORMS_EVENT + "." + config.getName() + "." + form.getXmlns(), - null, buildTriggerParameters(form), FORMS_EVENT); - } + String appId = (application.getCommcareAppId() != null) ? application.getCommcareAppId() : ""; + return new TriggerEventRequest(displayName, FORMS_EVENT + "." + config.getName() + "." + form.getXmlns() + appId, + null, buildTriggerParameters(form), FORMS_EVENT); } private List buildTriggerParameters(FormSchemaJson form) { From dd57aecead5b85b2def26273a5bd74ee36c6ac3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Ja=C5=BCd=C5=BCewski?= Date: Mon, 17 Oct 2016 15:27:13 +0200 Subject: [PATCH 094/202] Removed needless incrementation in addXmlnsParameter --- .../motechproject/commcare/tasks/builder/FormActionBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commcare/src/main/java/org/motechproject/commcare/tasks/builder/FormActionBuilder.java b/commcare/src/main/java/org/motechproject/commcare/tasks/builder/FormActionBuilder.java index 8cf10d415..6bef8e020 100644 --- a/commcare/src/main/java/org/motechproject/commcare/tasks/builder/FormActionBuilder.java +++ b/commcare/src/main/java/org/motechproject/commcare/tasks/builder/FormActionBuilder.java @@ -111,7 +111,7 @@ private ActionParameterRequest addXmlnsParameter(FormSchemaJson form, int order) builder.setValue(form.getXmlns()) .setDisplayName("xmlns") .setKey("xmlns") - .setOrder(order++) + .setOrder(order) .setType(ParameterType.UNICODE.getValue()) .setHidden(true); return builder.createActionParameterRequest(); From a0c7343efd2f11edffe46fd0d2fb8d11e5269173 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Ja=C5=BCd=C5=BCewski?= Date: Mon, 17 Oct 2016 15:32:21 +0200 Subject: [PATCH 095/202] Fixed wrong if statement --- .../commcare/service/impl/CommcareFormsEventParser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareFormsEventParser.java b/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareFormsEventParser.java index 89e4a34c1..cb64bcad4 100644 --- a/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareFormsEventParser.java +++ b/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareFormsEventParser.java @@ -59,7 +59,7 @@ public String parseEventSubject(String eventSubject, Map eventPa String xmlns = (String) ((Map) eventParameters.get(ATTRIBUTES)).get("xmlns"); String appId = (String) ((Map) eventParameters.get(ATTRIBUTES)).get("app_id"); - if (appId != null) { + if (appId == null) { appId = ""; LOGGER.warn("AppId for form is null. XMLNS: {}", xmlns); } From 8ff4407a4a680e95144e314fce22c0ce40887482 Mon Sep 17 00:00:00 2001 From: srujan92 Date: Tue, 18 Oct 2016 16:53:57 +0530 Subject: [PATCH 096/202] MOTECH-2972 Rename "Form" tab to "Form Definitions" Changed the name in from Forms to Form Definitions. --- commcare/src/main/resources/webapp/messages/messages.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commcare/src/main/resources/webapp/messages/messages.properties b/commcare/src/main/resources/webapp/messages/messages.properties index 8f6f93826..c7e7d54a7 100644 --- a/commcare/src/main/resources/webapp/messages/messages.properties +++ b/commcare/src/main/resources/webapp/messages/messages.properties @@ -3,7 +3,7 @@ commcare.ok=OK commcare.tab.dataMapping=Data Mapping commcare.tab.import=Import Forms commcare.tab.settings=Settings -commcare.tab.forms=Forms +commcare.tab.forms=Form Definitions commcare.tab.cases=Cases commcare.settings.section.accountSettings=Account Settings From e66daa6e0fda21d2a6a711b21289947118983632 Mon Sep 17 00:00:00 2001 From: mkruszynski Date: Tue, 18 Oct 2016 14:11:41 +0200 Subject: [PATCH 097/202] MOTECH-2890: Changed Entity class --- commcare/pom.xml | 2 +- .../config/manager/ConfigurationManager.java | 24 +++- .../commcare/domain/CommcareMetadataInfo.java | 22 ++- .../domain/report/ReportMetadataColumn.java | 9 +- .../domain/report/ReportMetadataFilter.java | 9 +- .../domain/report/ReportMetadataInfo.java | 35 ++++- .../domain/report/ReportsMetadataInfo.java | 133 +++++++++++++++++- .../domain/report/constants/ColumnType.java | 3 +- .../domain/report/constants/FilterType.java | 3 +- .../service/ReportsMetadataDataService.java | 25 ++++ .../resources/META-INF/spring/blueprint.xml | 3 + 11 files changed, 257 insertions(+), 11 deletions(-) create mode 100644 commcare/src/main/java/org/motechproject/commcare/service/ReportsMetadataDataService.java diff --git a/commcare/pom.xml b/commcare/pom.xml index 001a2b8aa..be6a193ae 100644 --- a/commcare/pom.xml +++ b/commcare/pom.xml @@ -208,7 +208,7 @@ org.motechproject.commcare.builder;version=${project.version}, org.motechproject.commcare.config;version=${project.version}, - org.motechproject.commcare.domain;version=${project.version}, + org.motechproject.commcare.domain.*;version=${project.version}, org.motechproject.commcare.events;version=${project.version}, org.motechproject.commcare.events.constants;version=${project.version}, org.motechproject.commcare.exception;version=${project.version}, diff --git a/commcare/src/main/java/org/motechproject/commcare/config/manager/ConfigurationManager.java b/commcare/src/main/java/org/motechproject/commcare/config/manager/ConfigurationManager.java index b4d752ef6..ba4db685c 100644 --- a/commcare/src/main/java/org/motechproject/commcare/config/manager/ConfigurationManager.java +++ b/commcare/src/main/java/org/motechproject/commcare/config/manager/ConfigurationManager.java @@ -1,8 +1,11 @@ package org.motechproject.commcare.config.manager; import org.motechproject.commcare.domain.CommcareApplicationJson; +import org.motechproject.commcare.domain.report.ReportsMetadataInfo; import org.motechproject.commcare.service.CommcareAppStructureService; import org.motechproject.commcare.service.CommcareApplicationDataService; +import org.motechproject.commcare.service.CommcareReportService; +import org.motechproject.commcare.service.ReportsMetadataDataService; import org.motechproject.commcare.tasks.CommcareTasksNotifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -25,9 +28,15 @@ public class ConfigurationManager { @Autowired private CommcareAppStructureService appStructureService; + @Autowired + private CommcareReportService reportService; + @Autowired private CommcareApplicationDataService commcareApplicationDataService; + @Autowired + private ReportsMetadataDataService reportsMetadataDataService; + @Autowired private CommcareTasksNotifier commcareTasksNotifier; @@ -43,8 +52,8 @@ public void configUpdated(String configName) { } @Transactional - public void configUpdated(String configName, boolean downloadApplications) { - if (downloadApplications) { + public void configUpdated(String configName, boolean downloadApplicationsAndReports) { + if (downloadApplicationsAndReports) { LOGGER.info("Configuration [{}] updated, fetching Commcare schema, {}", configName); reloadConfig(configName); } else { @@ -62,15 +71,20 @@ public synchronized void configDeleted(String configName) { private synchronized void reloadConfig(String configName) { List applications = appStructureService.getAllApplications(configName); + ReportsMetadataInfo reportsMetadata = reportService.getReportsList(configName); // clear the configuration before saving the new one clearApps(configName); + clearReports(configName); for (CommcareApplicationJson app : applications) { app.setConfigName(configName); commcareApplicationDataService.create(app); } + reportsMetadata.setConfigName(configName); + reportsMetadataDataService.create(reportsMetadata); + commcareTasksNotifier.updateTasksInfo(); } @@ -79,4 +93,10 @@ private void clearApps(String configName) { commcareApplicationDataService.delete(application); } } + + private void clearReports(String configName) { + for (ReportsMetadataInfo report : reportsMetadataDataService.bySourceConfiguration(configName)) { + reportsMetadataDataService.delete(report); + } + } } diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/CommcareMetadataInfo.java b/commcare/src/main/java/org/motechproject/commcare/domain/CommcareMetadataInfo.java index ec597c583..1e83513f1 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/CommcareMetadataInfo.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/CommcareMetadataInfo.java @@ -1,16 +1,36 @@ package org.motechproject.commcare.domain; +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; + +import java.io.Serializable; import java.util.Objects; /** * Domain class representing case metadata, retrieved from CommCareHQ server. */ -public class CommcareMetadataInfo { +public class CommcareMetadataInfo implements Serializable { + + private static final long serialVersionUID = -3427706967092034501L; + @Expose + @SerializedName("limit") private int limit; + + @Expose + @SerializedName("next") private String nextPageQueryString; + + @Expose + @SerializedName("offset") private int offset; + + @Expose + @SerializedName("previous") private String previousPageQueryString; + + @Expose + @SerializedName("total_count") private int totalCount; public CommcareMetadataInfo() { } diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataColumn.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataColumn.java index 00b8391e8..833cb6798 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataColumn.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataColumn.java @@ -1,21 +1,28 @@ package org.motechproject.commcare.domain.report; +import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; import org.motechproject.commcare.domain.report.constants.ColumnType; +import java.io.Serializable; import java.util.Objects; /** * Represents a single CommCareHQ {@link ReportMetadataInfo} column. */ -public class ReportMetadataColumn { +public class ReportMetadataColumn implements Serializable { + private static final long serialVersionUID = - 5218432575178076712L; + + @Expose @SerializedName("column_id") private String id; + @Expose @SerializedName("display") private String display; + @Expose @SerializedName("type") private ColumnType type; diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataFilter.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataFilter.java index eeb5c3b24..adb6c8f88 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataFilter.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataFilter.java @@ -1,22 +1,29 @@ package org.motechproject.commcare.domain.report; +import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; import org.motechproject.commcare.domain.report.constants.FilterDataType; import org.motechproject.commcare.domain.report.constants.FilterType; +import java.io.Serializable; import java.util.Objects; /** * Represents a single CommCareHQ {@link ReportMetadataInfo} filter. */ -public class ReportMetadataFilter { +public class ReportMetadataFilter implements Serializable { + private static final long serialVersionUID = 8994777814607875504L; + + @Expose @SerializedName("datatype") private FilterDataType datatype; + @Expose @SerializedName("slug") private String slug; + @Expose @SerializedName("type") private FilterType type; diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataInfo.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataInfo.java index 8ab2977b4..981401bde 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataInfo.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportMetadataInfo.java @@ -1,16 +1,37 @@ package org.motechproject.commcare.domain.report; +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; + +import java.io.Serializable; import java.util.List; import java.util.Objects; /** * Represents a single CommCareHQ report. It's a part of the MOTECH model. */ -public class ReportMetadataInfo { +public class ReportMetadataInfo implements Serializable { + + private static final long serialVersionUID = 1616570156650333507L; + @Expose + @SerializedName("id") private String id; + + @Expose + @SerializedName("title") private String title; + + @Expose + @SerializedName("resource") + private String resource; + + @Expose + @SerializedName("columns") private List columns; + + @Expose + @SerializedName("filters") private List filters; public ReportMetadataInfo() { } @@ -22,6 +43,10 @@ public ReportMetadataInfo(String id, String title, List co this.filters = filters; } + public ReportMetadataInfo (String id, String title, String resource, List columns, List filters) { + this(id, title, columns, filters); + this.resource = resource; + } public String getId() { return id; @@ -39,6 +64,14 @@ public void setTitle(String title) { this.title = title; } + public String getResource () { + return resource; + } + + public void setResource (String resource) { + this.resource = resource; + } + public List getColumns() { return columns; } diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportsMetadataInfo.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportsMetadataInfo.java index 0c061d668..dcb460f79 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportsMetadataInfo.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/ReportsMetadataInfo.java @@ -1,44 +1,126 @@ package org.motechproject.commcare.domain.report; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonParseException; +import com.google.gson.annotations.SerializedName; +import com.google.gson.reflect.TypeToken; +import org.apache.commons.lang.StringEscapeUtils; import org.motechproject.commcare.domain.CommcareMetadataInfo; +import org.motechproject.commons.api.json.MotechJsonReader; +import org.motechproject.mds.annotations.Access; +import org.motechproject.mds.annotations.CrudEvents; +import org.motechproject.mds.annotations.Entity; +import org.motechproject.mds.annotations.Field; +import org.motechproject.mds.annotations.Ignore; +import org.motechproject.mds.event.CrudEventType; +import org.motechproject.mds.util.SecurityMode; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import javax.jdo.annotations.NotPersistent; +import java.lang.reflect.Type; +import java.util.Collections; import java.util.List; import java.util.Objects; /** * Wrapper class for storing list of instances of the {@link ReportMetadataInfo} class. It's a part of the MOTECH model. */ +@Entity(name = "Commcare Reports Metadata") +@CrudEvents(CrudEventType.NONE) +@Access(value = SecurityMode.PERMISSIONS, members = {"manageCommcare"}) public class ReportsMetadataInfo { + private static final Logger LOGGER = LoggerFactory.getLogger(ReportsMetadataInfo.class); + + @Ignore + @NotPersistent + @SerializedName("objects") private List reportMetadataInfoList; + + @Ignore + @NotPersistent + @SerializedName("meta") private CommcareMetadataInfo metadataInfo; + @Field(displayName = "Source configuration") + private String configName; + + @Field(displayName = "Metadata", type = "text") + private String serializedReportMetadataInfoList; + + @Field(displayName = "Reports", type = "text") + private String serializedMetadataInfo; + public ReportsMetadataInfo() { } public ReportsMetadataInfo(List reportMetadataInfoList, CommcareMetadataInfo metadataInfo) { this.reportMetadataInfoList = reportMetadataInfoList; this.metadataInfo = metadataInfo; + serializeMetadataInfo(); + serializeReportMetadataInfoList(); } public List getReportMetadataInfoList() { + if (reportMetadataInfoList == null && serializedReportMetadataInfoList != null) { + deserializeReportMetadataInfoList(); + } return reportMetadataInfoList; } public void setReportMetadataInfoList(List reportMetadataInfoList) { this.reportMetadataInfoList = reportMetadataInfoList; + serializeReportMetadataInfoList(); } public CommcareMetadataInfo getMetadataInfo() { + if (metadataInfo == null && serializedMetadataInfo != null) { + deserializeMetadataInfo(); + } return metadataInfo; } public void setMetadataInfo(CommcareMetadataInfo metadataInfo) { this.metadataInfo = metadataInfo; + serializeMetadataInfo(); + } + + public String getConfigName () { + return configName; + } + + public void setConfigName (String configName) { + this.configName = configName; + } + + public String getSerializedReportMetadataInfoList () { + if (serializedReportMetadataInfoList == null && reportMetadataInfoList != null) { + serializeReportMetadataInfoList(); + } + return serializedReportMetadataInfoList; + } + + public void setSerializedReportMetadataInfoList (String serializedReportMetadataInfoList) { + this.serializedReportMetadataInfoList = serializedReportMetadataInfoList; + deserializeReportMetadataInfoList(); + } + + public String getSerializedMetadataInfo () { + if (serializedMetadataInfo == null && metadataInfo != null) { + serializeMetadataInfo(); + } + return serializedMetadataInfo; + } + + public void setSerializedMetadataInfo (String serializedMetadataInfo) { + this.serializedMetadataInfo = serializedMetadataInfo; + serializeMetadataInfo(); } @Override public int hashCode() { - return Objects.hash(reportMetadataInfoList, metadataInfo); + return Objects.hash(reportMetadataInfoList, metadataInfo, serializedMetadataInfo, serializedReportMetadataInfoList, configName); } @Override @@ -54,6 +136,53 @@ public boolean equals(Object o) { ReportsMetadataInfo other = (ReportsMetadataInfo) o; return Objects.equals(reportMetadataInfoList, other.reportMetadataInfoList) - && Objects.equals(metadataInfo, other.metadataInfo); + && Objects.equals(metadataInfo, other.metadataInfo) + && Objects.equals(serializedMetadataInfo, other.serializedMetadataInfo) + && Objects.equals(serializedReportMetadataInfoList, other.serializedReportMetadataInfoList) + && Objects.equals(configName, other.configName); + } + + private void serializeMetadataInfo () { + if (metadataInfo != null) { + Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); + serializedMetadataInfo = StringEscapeUtils.escapeJava(gson.toJson(metadataInfo)); + } + } + + private void deserializeMetadataInfo () { + if (serializedMetadataInfo != null) { + Type deserializeType = new TypeToken() { } .getType(); + MotechJsonReader motechJsonReader = new MotechJsonReader(); + + try { + metadataInfo = (CommcareMetadataInfo) motechJsonReader.readFromStringOnlyExposeAnnotations( + StringEscapeUtils.unescapeJava(serializedMetadataInfo), deserializeType); + } catch (JsonParseException e) { + LOGGER.error("Failed to deserialize CommCare schema from its JSON representation in the database. Fix the errors in the schema or force Commcare module to download the fresh schema.", e); + metadataInfo = null; + } + } + } + + private void serializeReportMetadataInfoList () { + if (reportMetadataInfoList != null) { + Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); + serializedReportMetadataInfoList = StringEscapeUtils.escapeJava(gson.toJson(reportMetadataInfoList)); + } + } + + private void deserializeReportMetadataInfoList () { + if (serializedReportMetadataInfoList != null) { + Type deserializeType = new TypeToken>() { } .getType(); + MotechJsonReader motechJsonReader = new MotechJsonReader(); + + try { + reportMetadataInfoList = (List) motechJsonReader.readFromStringOnlyExposeAnnotations( + StringEscapeUtils.unescapeJava(serializedReportMetadataInfoList), deserializeType); + } catch (JsonParseException e) { + LOGGER.error("Failed to deserialize CommCare schema from its JSON representation in the database. Fix the errors in the schema or force Commcare module to download the fresh schema.", e); + reportMetadataInfoList = Collections.emptyList(); + } + } } } diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/ColumnType.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/ColumnType.java index df99f15fc..f13356a8a 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/ColumnType.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/ColumnType.java @@ -8,7 +8,8 @@ public enum ColumnType { FIELD("field"), - EXPANDED("expanded"); + EXPANDED("expanded"), + PERCENT("percent"); private final String type; diff --git a/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/FilterType.java b/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/FilterType.java index 10baa7e7a..cf39aed87 100644 --- a/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/FilterType.java +++ b/commcare/src/main/java/org/motechproject/commcare/domain/report/constants/FilterType.java @@ -10,7 +10,8 @@ public enum FilterType { NUMERIC("numeric"), DATE("date"), CHOICE_LIST("choice_list"), - DYNAMIC_CHOICE_LIST("dynamic_choice_list"); + DYNAMIC_CHOICE_LIST("dynamic_choice_list"), + PRE("pre"); private final String type; diff --git a/commcare/src/main/java/org/motechproject/commcare/service/ReportsMetadataDataService.java b/commcare/src/main/java/org/motechproject/commcare/service/ReportsMetadataDataService.java new file mode 100644 index 000000000..2a5125d29 --- /dev/null +++ b/commcare/src/main/java/org/motechproject/commcare/service/ReportsMetadataDataService.java @@ -0,0 +1,25 @@ +package org.motechproject.commcare.service; + +import org.motechproject.commcare.domain.report.ReportsMetadataInfo; +import org.motechproject.mds.annotations.Lookup; +import org.motechproject.mds.annotations.LookupField; +import org.motechproject.mds.service.MotechDataService; + +import java.util.List; + +/** + * Data service for the {@link ReportsMetadataInfo} class. Provides methods for managing instances of said class. + */ +public interface ReportsMetadataDataService extends MotechDataService { + + /** + * Returns a list of the reports that originate from the configuration with the given + * {@code configurationName}. + * + * @param configurationName the name of the configuration + * @return the list of matching reports + */ + @Lookup(name = "By Source configuration") + List bySourceConfiguration(@LookupField(name = "configName") String configurationName); + +} diff --git a/commcare/src/main/resources/META-INF/spring/blueprint.xml b/commcare/src/main/resources/META-INF/spring/blueprint.xml index 933701423..08d9a3ab3 100644 --- a/commcare/src/main/resources/META-INF/spring/blueprint.xml +++ b/commcare/src/main/resources/META-INF/spring/blueprint.xml @@ -76,6 +76,9 @@ + + From dbc2f270f2962ac5d7047c45fe81f2125a6e02ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Ja=C5=BCd=C5=BCewski?= Date: Wed, 19 Oct 2016 16:22:57 +0200 Subject: [PATCH 098/202] MOTECH-2979 Added date types to appropriate parameters in Commcare module --- .../tasks/builder/CaseTriggerBuilder.java | 3 ++- .../tasks/builder/CommonTriggerBuilder.java | 5 +++-- .../tasks/builder/FormTriggerBuilder.java | 5 +++-- .../velocity.templates/task-data-provider.vm | 18 ++++++++++++------ 4 files changed, 20 insertions(+), 11 deletions(-) diff --git a/commcare/src/main/java/org/motechproject/commcare/tasks/builder/CaseTriggerBuilder.java b/commcare/src/main/java/org/motechproject/commcare/tasks/builder/CaseTriggerBuilder.java index fa664530b..5158889c4 100644 --- a/commcare/src/main/java/org/motechproject/commcare/tasks/builder/CaseTriggerBuilder.java +++ b/commcare/src/main/java/org/motechproject/commcare/tasks/builder/CaseTriggerBuilder.java @@ -7,6 +7,7 @@ import org.motechproject.commcare.service.CommcareSchemaService; import org.motechproject.tasks.contract.EventParameterRequest; import org.motechproject.tasks.contract.TriggerEventRequest; +import org.motechproject.tasks.domain.enums.ParameterType; import java.util.ArrayList; import java.util.HashSet; @@ -99,7 +100,7 @@ private void addPartialCaseFields(List parameters) { parameters.add(new EventParameterRequest("commcare.userId", USER_ID)); parameters.add(new EventParameterRequest("commcare.apiKey", API_KEY)); parameters.add(new EventParameterRequest("commcare.caseAction", CASE_ACTION)); - parameters.add(new EventParameterRequest("commcare.dateModified", DATE_MODIFIED)); + parameters.add(new EventParameterRequest("commcare.dateModified", DATE_MODIFIED, ParameterType.DATE.getValue())); parameters.add(new EventParameterRequest("commcare.caseName", CASE_NAME)); parameters.add(new EventParameterRequest("commcare.ownerId", OWNER_ID)); } diff --git a/commcare/src/main/java/org/motechproject/commcare/tasks/builder/CommonTriggerBuilder.java b/commcare/src/main/java/org/motechproject/commcare/tasks/builder/CommonTriggerBuilder.java index 5ae7ff120..83f448911 100644 --- a/commcare/src/main/java/org/motechproject/commcare/tasks/builder/CommonTriggerBuilder.java +++ b/commcare/src/main/java/org/motechproject/commcare/tasks/builder/CommonTriggerBuilder.java @@ -5,6 +5,7 @@ import org.motechproject.commcare.service.CommcareConfigService; import org.motechproject.tasks.contract.EventParameterRequest; import org.motechproject.tasks.contract.TriggerEventRequest; +import org.motechproject.tasks.domain.enums.ParameterType; import java.util.ArrayList; import java.util.List; @@ -73,7 +74,7 @@ private List buildStockTransactionTriggers() { parameterRequests.add(new EventParameterRequest(DisplayNames.QUANTITY, QUANTITY)); parameterRequests.add(new EventParameterRequest(DisplayNames.SECTION_ID, SECTION_ID)); parameterRequests.add(new EventParameterRequest(DisplayNames.STOCK_ON_HAND, STOCK_ON_HAND)); - parameterRequests.add(new EventParameterRequest(DisplayNames.TRANSACTION_DATE, TRANSACTION_DATE)); + parameterRequests.add(new EventParameterRequest(DisplayNames.TRANSACTION_DATE, TRANSACTION_DATE, ParameterType.DATE.getValue())); parameterRequests.add(new EventParameterRequest(DisplayNames.TYPE, TYPE)); String displayName = DisplayNameHelper.buildDisplayName(DisplayNames.RETRIEVED_STOCK_TRANSACTION, @@ -133,7 +134,7 @@ private List buildFormStubTrigger() { for (Config config : configService.getConfigs().getConfigs()) { List parameterRequests = new ArrayList<>(); - parameterRequests.add(new EventParameterRequest("commcare.receivedOn", RECEIVED_ON)); + parameterRequests.add(new EventParameterRequest("commcare.receivedOn", RECEIVED_ON, ParameterType.DATE.getValue())); parameterRequests.add(new EventParameterRequest("commcare.formId", FORM_ID)); parameterRequests.add(new EventParameterRequest("commcare.caseIds", CASE_IDS, "LIST")); parameterRequests.add(new EventParameterRequest(CONFIG_NAME_KEY, CONFIG_NAME)); diff --git a/commcare/src/main/java/org/motechproject/commcare/tasks/builder/FormTriggerBuilder.java b/commcare/src/main/java/org/motechproject/commcare/tasks/builder/FormTriggerBuilder.java index 6d417cc29..00cc71315 100644 --- a/commcare/src/main/java/org/motechproject/commcare/tasks/builder/FormTriggerBuilder.java +++ b/commcare/src/main/java/org/motechproject/commcare/tasks/builder/FormTriggerBuilder.java @@ -9,6 +9,7 @@ import org.motechproject.commcare.service.CommcareSchemaService; import org.motechproject.tasks.contract.EventParameterRequest; import org.motechproject.tasks.contract.TriggerEventRequest; +import org.motechproject.tasks.domain.enums.ParameterType; import java.util.ArrayList; import java.util.List; @@ -128,8 +129,8 @@ private void addMetadataFields(List parameters) { parameters.add(new EventParameterRequest("commcare.form.field.deviceId", META_DEVICE_ID)); parameters.add(new EventParameterRequest("commcare.form.field.username", META_USERNAME)); parameters.add(new EventParameterRequest("commcare.form.field.appVersion", META_APP_VERSION)); - parameters.add(new EventParameterRequest("commcare.form.field.timeStart", META_TIME_START)); - parameters.add(new EventParameterRequest("commcare.form.field.timeEnd", META_TIME_END)); + parameters.add(new EventParameterRequest("commcare.form.field.timeStart", META_TIME_START, ParameterType.DATE.getValue())); + parameters.add(new EventParameterRequest("commcare.form.field.timeEnd", META_TIME_END, ParameterType.DATE.getValue())); parameters.add(new EventParameterRequest("commcare.field.configName", CONFIG_NAME)); } } diff --git a/commcare/src/main/resources/velocity.templates/task-data-provider.vm b/commcare/src/main/resources/velocity.templates/task-data-provider.vm index 14c1d7669..e9553037e 100644 --- a/commcare/src/main/resources/velocity.templates/task-data-provider.vm +++ b/commcare/src/main/resources/velocity.templates/task-data-provider.vm @@ -71,7 +71,8 @@ }, { "displayName" : "commcare.form.field.receivedOn", - "fieldKey" : "receivedOn" + "fieldKey" : "receivedOn", + "type" : "DATE" }, { "displayName" : "commcare.form.field.metadata", @@ -128,7 +129,8 @@ }, { "displayName" : "commcare.case.field.dateClosed", - "fieldKey" : "dateClosed" + "fieldKey" : "dateClosed", + "type" : "DATE" }, { "displayName" : "commcare.case.field.domain", @@ -145,7 +147,8 @@ }, { "displayName" : "commcare.case.field.serverDateOpened", - "fieldKey" : "serverDateOpened" + "fieldKey" : "serverDateOpened", + "type" : "DATE" }, { "displayName" : "commcare.case.field.caseType", @@ -153,7 +156,8 @@ }, { "displayName" : "commcare.case.field.dateOpened", - "fieldKey" : "dateOpened" + "fieldKey" : "dateOpened", + "type" : "DATE" }, { "displayName" : "commcare.case.field.ownerId", @@ -171,7 +175,8 @@ #end { "displayName" : "commcare.case.field.serverDateModified", - "fieldKey" : "serverDateModified" + "fieldKey" : "serverDateModified", + "type" : "DATE" }, { "displayName" : "commcare.case.field.closed", @@ -268,7 +273,8 @@ }, { "displayName": "commcare.location.field.lastModified", - "fieldKey": "lastModified" + "fieldKey": "lastModified", + "type" : "DATE" }, { "displayName": "commcare.location.field.locationData", From 0a0fa40002ddb2ea44e158a51a9b3d86c5506569 Mon Sep 17 00:00:00 2001 From: kmadej Date: Thu, 20 Oct 2016 16:06:23 +0200 Subject: [PATCH 099/202] MOTECH-2959: Added create order action --- .../openmrs/domain/Encounter.java | 13 ++ .../motechproject/openmrs/domain/Order.java | 130 +++++++++++++++++- .../openmrs/domain/Provider.java | 18 +++ .../openmrs/resource/OrderResource.java | 20 +++ .../resource/impl/OrderResourceImpl.java | 53 +++++++ .../openmrs/service/OpenMRSOrderService.java | 19 +++ .../service/impl/OpenMRSOrderServiceImpl.java | 47 +++++++ .../tasks/OpenMRSActionProxyService.java | 15 ++ .../openmrs/tasks/builder/ActionBuilder.java | 39 ++++++ .../openmrs/tasks/constants/DisplayNames.java | 5 + .../openmrs/tasks/constants/Keys.java | 5 + .../impl/OpenMRSActionProxyServiceImpl.java | 27 ++++ .../resources/META-INF/spring/blueprint.xml | 1 + .../velocity.templates/task-data-provider.vm | 10 +- .../webapp/messages/messages.properties | 28 +++- 15 files changed, 414 insertions(+), 16 deletions(-) create mode 100644 openmrs/src/main/java/org/motechproject/openmrs/resource/OrderResource.java create mode 100644 openmrs/src/main/java/org/motechproject/openmrs/resource/impl/OrderResourceImpl.java create mode 100644 openmrs/src/main/java/org/motechproject/openmrs/service/OpenMRSOrderService.java create mode 100644 openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSOrderServiceImpl.java diff --git a/openmrs/src/main/java/org/motechproject/openmrs/domain/Encounter.java b/openmrs/src/main/java/org/motechproject/openmrs/domain/Encounter.java index d1e67de84..6e8295105 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/domain/Encounter.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/domain/Encounter.java @@ -4,6 +4,7 @@ import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import com.google.gson.JsonPrimitive; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; import org.motechproject.openmrs.util.JsonUtils; @@ -213,6 +214,18 @@ public JsonElement serialize(Encounter src, Type typeOfSrc, JsonSerializationCon } } + /** + * Implementation of the {@link JsonSerializer} interface for the {@link Encounter} class. It represents the encounter + * as its ID. + */ + public static class EncounterUuidSerializer implements JsonSerializer { + + @Override + public JsonElement serialize(Encounter encounter, Type type, JsonSerializationContext jsonSerializationContext) { + return new JsonPrimitive(encounter.getUuid()); + } + } + /** * Implementation of the {@link JsonDeserializer} interface for the {@link Encounter} class. */ diff --git a/openmrs/src/main/java/org/motechproject/openmrs/domain/Order.java b/openmrs/src/main/java/org/motechproject/openmrs/domain/Order.java index 7b1b4b307..9a146e7cc 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/domain/Order.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/domain/Order.java @@ -1,26 +1,142 @@ package org.motechproject.openmrs.domain; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.annotations.Expose; + +import java.lang.reflect.Type; import java.util.Objects; +import java.util.SortedSet; +import java.util.TreeSet; /** * Represents a single order. An order represents the instructions for patient in which order and how long * should one take a medications. */ public class Order { + public static final String DEFAULT_TYPE = "order"; private String uuid; + private String display; + + @Expose + private String type; + @Expose + private Encounter encounter; + @Expose + private Provider orderer; + @Expose + private Patient patient; + @Expose + private Concept concept; + @Expose + private CareSetting careSetting; + + public Order(String type, Encounter encounter, Provider orderer, Patient patient, Concept concept, CareSetting careSetting) { + this.type = type; + this.encounter = encounter; + this.orderer = orderer; + this.patient = patient; + this.concept = concept; + this.careSetting = careSetting; + } - public String getUuid () { + public String getUuid() { return uuid; } - public void setUuid (String uuid) { + public void setUuid(String uuid) { this.uuid = uuid; } + public String getDisplay() { + return display; + } + + public void setDisplay(String display) { + this.display = display; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public Encounter getEncounter() { + return encounter; + } + + public void setEncounter(Encounter encounter) { + this.encounter = encounter; + } + + public Provider getOrderer() { + return orderer; + } + + public void setOrderer(Provider orderer) { + this.orderer = orderer; + } + + public Patient getPatient() { + return patient; + } + + public void setPatient(Patient patient) { + this.patient = patient; + } + + public Concept getConcept() { + return concept; + } + + public void setConcept(Concept concept) { + this.concept = concept; + } + + public CareSetting getCareSetting() { + return careSetting; + } + + public void setCareSetting(CareSetting careSetting) { + this.careSetting = careSetting; + } + + public enum CareSetting { + INPATIENT, OUTPATIENT; + + public static SortedSet getValuesAsStringSet() { + SortedSet values = new TreeSet<>(); + + for (CareSetting careSetting : CareSetting.values()) { + values.add(careSetting.toString()); + } + + return values; + } + } + + /** + * Implementation of the {@link JsonDeserializer} interface for the {@link CareSetting} class. + */ + public static class CareSettingDeserializer implements JsonDeserializer { + @Override + public CareSetting deserialize(JsonElement src, Type typeOfT, JsonDeserializationContext context) { + JsonObject jsonCareSetting = src.getAsJsonObject(); + JsonElement display = jsonCareSetting.get("display"); + + return CareSetting.valueOf(display.getAsString().toUpperCase()); + } + } + @Override public int hashCode() { - return Objects.hash(uuid); + return Objects.hash(uuid, display, encounter, orderer, patient, concept, careSetting); } @Override @@ -35,6 +151,12 @@ public boolean equals(Object o) { Order other = (Order) o; - return Objects.equals(uuid, other.uuid); + return Objects.equals(uuid, other.uuid) && + Objects.equals(display, other.display) && + Objects.equals(encounter, other.encounter) && + Objects.equals(orderer, other.orderer) && + Objects.equals(patient, other.patient) && + Objects.equals(concept, other.concept) && + Objects.equals(careSetting, other.careSetting); } } diff --git a/openmrs/src/main/java/org/motechproject/openmrs/domain/Provider.java b/openmrs/src/main/java/org/motechproject/openmrs/domain/Provider.java index 45d38fa27..17ba2b431 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/domain/Provider.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/domain/Provider.java @@ -1,5 +1,11 @@ package org.motechproject.openmrs.domain; +import com.google.gson.JsonElement; +import com.google.gson.JsonPrimitive; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; + +import java.lang.reflect.Type; import java.util.Objects; /** @@ -51,6 +57,18 @@ public void setIdentifier(String identifier) { this.identifier = identifier; } + /** + * Implementation of the {@link JsonSerializer} interface for the {@link Provider} class. It represents the provider + * as its ID. + */ + public static class ProviderSerializer implements JsonSerializer { + + @Override + public JsonElement serialize(Provider provider, Type type, JsonSerializationContext jsonSerializationContext) { + return new JsonPrimitive(provider.getUuid()); + } + } + @Override public int hashCode() { return Objects.hash(uuid, person, identifier); diff --git a/openmrs/src/main/java/org/motechproject/openmrs/resource/OrderResource.java b/openmrs/src/main/java/org/motechproject/openmrs/resource/OrderResource.java new file mode 100644 index 000000000..ae853c198 --- /dev/null +++ b/openmrs/src/main/java/org/motechproject/openmrs/resource/OrderResource.java @@ -0,0 +1,20 @@ +package org.motechproject.openmrs.resource; + +import org.motechproject.openmrs.config.Config; +import org.motechproject.openmrs.domain.Order; + +/** + * Interface for orders management. + */ +public interface OrderResource { + + /** + * Creates the given order on the OpenMRS server. The given {@code config} will be used while performing this + * action. + * + * @param config the configuration to be used while performing this action + * @param order the order to be created + * @return the saved order + */ + Order createOrder(Config config, Order order); +} diff --git a/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/OrderResourceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/OrderResourceImpl.java new file mode 100644 index 000000000..fcca206cb --- /dev/null +++ b/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/OrderResourceImpl.java @@ -0,0 +1,53 @@ +package org.motechproject.openmrs.resource.impl; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import org.apache.commons.httpclient.HttpClient; +import org.motechproject.openmrs.config.Config; +import org.motechproject.openmrs.domain.Concept; +import org.motechproject.openmrs.domain.Encounter; +import org.motechproject.openmrs.domain.Order; +import org.motechproject.openmrs.domain.Patient; +import org.motechproject.openmrs.domain.Provider; +import org.motechproject.openmrs.resource.OrderResource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestOperations; + +@Component +public class OrderResourceImpl extends BaseResource implements OrderResource { + + @Autowired + public OrderResourceImpl(RestOperations restOperations, HttpClient httpClient) { + super(restOperations, httpClient); + } + + @Override + public Order createOrder(Config config, Order order) { + String requestJson = buildGson().toJson(order); + String responseJson = postForJson(config, requestJson, "/order"); + return buildGsonDeserializer().fromJson(responseJson, Order.class); + } + + private Gson buildGson() { + GsonBuilder builder = new GsonBuilder(); + + builder + .excludeFieldsWithoutExposeAnnotation() + .registerTypeAdapter(Encounter.class, new Encounter.EncounterUuidSerializer()) + .registerTypeAdapter(Provider.class, new Provider.ProviderSerializer()) + .registerTypeAdapter(Patient.class, new Patient.PatientSerializer()) + .registerTypeAdapter(Concept.class, new Concept.ConceptSerializer()); + + return builder.create(); + } + + private Gson buildGsonDeserializer() { + GsonBuilder builder = new GsonBuilder(); + + builder + .registerTypeAdapter(Order.CareSetting.class, new Order.CareSettingDeserializer()); + + return builder.create(); + } +} diff --git a/openmrs/src/main/java/org/motechproject/openmrs/service/OpenMRSOrderService.java b/openmrs/src/main/java/org/motechproject/openmrs/service/OpenMRSOrderService.java new file mode 100644 index 000000000..d30aa0a7d --- /dev/null +++ b/openmrs/src/main/java/org/motechproject/openmrs/service/OpenMRSOrderService.java @@ -0,0 +1,19 @@ +package org.motechproject.openmrs.service; + +import org.motechproject.openmrs.domain.Order; + +/** + * Interface for handling orders on the OpenMRS server. + */ +public interface OpenMRSOrderService { + + /** + * Creates the given {@code order} on the OpenMRS server. Configuration with the given {@code configName} will + * be used while performing this action. + * + * @param configName the name of the configuration + * @param order the order to be created + * @return the created order + */ + Order createOrder(String configName, Order order); +} diff --git a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSOrderServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSOrderServiceImpl.java new file mode 100644 index 000000000..c548f3208 --- /dev/null +++ b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSOrderServiceImpl.java @@ -0,0 +1,47 @@ +package org.motechproject.openmrs.service.impl; + +import org.apache.commons.lang.Validate; +import org.motechproject.openmrs.config.Config; +import org.motechproject.openmrs.domain.Order; +import org.motechproject.openmrs.exception.OpenMRSException; +import org.motechproject.openmrs.resource.OrderResource; +import org.motechproject.openmrs.service.OpenMRSConfigService; +import org.motechproject.openmrs.service.OpenMRSOrderService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.client.HttpClientErrorException; + +@Service("orderService") +public class OpenMRSOrderServiceImpl implements OpenMRSOrderService { + + private OrderResource orderResource; + private OpenMRSConfigService configService; + + @Autowired + public OpenMRSOrderServiceImpl(OrderResource orderResource, OpenMRSConfigService configService) { + this.orderResource = orderResource; + this.configService = configService; + } + + @Override + public Order createOrder(String configName, Order order) { + validateOrder(order); + + try { + Config config = configService.getConfigByName(configName); + return orderResource.createOrder(config, order); + } catch (HttpClientErrorException e) { + throw new OpenMRSException("Error while creating order. Response body: " + e.getResponseBodyAsString(), e); + } + } + + private void validateOrder(Order order) { + Validate.notNull(order, "Order cannot be null"); + Validate.notNull(order.getConcept(), "Concept cannot be null"); + Validate.notNull(order.getCareSetting(), "Care setting cannot be null"); + Validate.notNull(order.getEncounter(), "Encounter cannot be null"); + Validate.notNull(order.getOrderer(), "Orderer type cannot be null"); + Validate.notNull(order.getType(), "Type cannot be null"); + Validate.notNull(order.getPatient(), "Patient cannot be null"); + } +} diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSActionProxyService.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSActionProxyService.java index 7b27d3293..e978889dd 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSActionProxyService.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSActionProxyService.java @@ -3,6 +3,7 @@ import org.joda.time.DateTime; import org.motechproject.openmrs.domain.Encounter; import org.motechproject.openmrs.domain.Observation; +import org.motechproject.openmrs.domain.Order; import org.motechproject.openmrs.domain.Patient; import org.motechproject.openmrs.domain.Visit; @@ -207,4 +208,18 @@ void changeStateOfProgramEnrollment(String configName, String programEnrollmentU * @param parameters the additional parameters */ void getCohortQueryReport(String configName, String cohortQueryUuid, Map parameters); + + /** + * Creates an order with the given params. + * + * @param configName the name of the configuration + * @param type the order type + * @param encounterUuid the encounter uuid + * @param patientUuid the patient uuid + * @param conceptUuid the concept uuid + * @param ordererUuid the orderer uuid + * @param careSetting the care setting value + * @return the created Order + */ + Order createOrder(String configName, String type, String encounterUuid, String patientUuid, String conceptUuid, String ordererUuid, String careSetting); } diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/builder/ActionBuilder.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/builder/ActionBuilder.java index 1c108f134..8ab2efd1c 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/builder/ActionBuilder.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/builder/ActionBuilder.java @@ -1,6 +1,7 @@ package org.motechproject.openmrs.tasks.builder; import org.motechproject.openmrs.config.Config; +import org.motechproject.openmrs.domain.Order; import org.motechproject.openmrs.service.OpenMRSConfigService; import org.motechproject.openmrs.tasks.constants.DisplayNames; import org.motechproject.openmrs.tasks.constants.Keys; @@ -34,6 +35,7 @@ public class ActionBuilder { private static final String UPDATE_PROGRAM_ENROLLMENT = "Update Program Enrollment"; private static final String CHANGE_PROGRAM_ENROLLMENT_STATE = "Change Program Enrollment State"; private static final String GET_COHORT_QUERY_REPORT = "Get CohortQuery Report"; + private static final String CREATE_ORDER = "Create Order"; private static final String OPENMRS_ACTION_PROXY_SERVICE = "org.motechproject.openmrs.tasks.OpenMRSActionProxyService"; private static final String OPENMRS_V1_9 = "1.9"; @@ -72,6 +74,7 @@ private void buildActionsForVersionGreaterThan19(Config config, String configNam actions.add(buildCreateProgramEnrollmentAction(configName)); actions.add(buildUpdateProgramEnrollmentAction(configName)); actions.add(buildChangeStateOfProgramEnrollmentAction(configName)); + actions.add(buildCreateOrderAction(configName)); } } @@ -293,6 +296,34 @@ private ActionEventRequest buildGetCohortQueryReport(String configName) { .createActionEventRequest(); } + private ActionEventRequest buildCreateOrderAction(String configName) { + SortedSet parameters = new TreeSet<>(); + SortedSet postActionParameters = new TreeSet<>(); + + int order = 0; + String serviceMethod = "createOrder"; + + parameters.add(prepareParameter(Keys.CONFIG_NAME, DisplayNames.CONFIG_NAME, configName, false, true, order++)); + parameters.add(prepareParameter(Keys.ORDER_TYPE, DisplayNames.ORDER_TYPE, ParameterType.UNICODE, Order.DEFAULT_TYPE, true, order++)); + parameters.add(prepareParameter(Keys.ENCOUNTER_UUID, DisplayNames.ENCOUNTER_UUID, true, order++)); + parameters.add(prepareParameter(Keys.PATIENT_UUID, DisplayNames.PATIENT_UUID, true, order++)); + parameters.add(prepareParameter(Keys.CONCEPT_UUID, DisplayNames.CONCEPT_UUID, true, order++)); + parameters.add(prepareParameter(Keys.ORDERER_UUID, DisplayNames.ORDER_ORDERER_UUID, true, order++)); + parameters.add(prepareParameter(Keys.CARE_SETTING, DisplayNames.ORDER_CARE_SETTING, ParameterType.SELECT, + Order.CareSetting.getValuesAsStringSet(), true, order)); + + postActionParameters.add(prepareParameter(Keys.UUID, DisplayNames.ORDER_UUID, false, 0)); + + return new ActionEventRequestBuilder() + .setDisplayName(getDisplayName(CREATE_ORDER, configName)) + .setServiceInterface(OPENMRS_ACTION_PROXY_SERVICE) + .setServiceMethod(serviceMethod) + .setSubject(getSubject(serviceMethod, configName)) + .setActionParameters(parameters) + .setPostActionParameters(postActionParameters) + .createActionEventRequest(); + } + private SortedSet prepareProgramEnrollmentParameters(int startOrder, boolean addAttributeMap) { SortedSet parameters = new TreeSet<>(); int order = startOrder; @@ -354,6 +385,14 @@ private ActionParameterRequest prepareParameter(String key, String displayName, .createActionParameterRequest(); } + private ActionParameterRequest prepareParameter(String key, String displayName, ParameterType type, + SortedSet options, boolean required, int order) { + return prepareParameterBuilder(key, displayName, required, order) + .setType(type.toString()) + .setOptions(options) + .createActionParameterRequest(); + } + private ActionParameterRequest prepareParameter(String key, String displayName, ParameterType type, String value, boolean required, int order) { return prepareParameterBuilder(key, displayName, required, order) diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/constants/DisplayNames.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/constants/DisplayNames.java index 2fc804a4b..447be3192 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/constants/DisplayNames.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/constants/DisplayNames.java @@ -72,6 +72,11 @@ public final class DisplayNames { public static final String COHORT_QUERY_PARAMETERS = "openMRS.cohortQuery.parameters"; public static final String PATIENT_DISPLAY = "openMRS.patient.display"; public static final String COHORT_QUERY_REPORTMEMBER = "openMRS.cohortQuery.reportMember"; + //Order Action + public static final String ORDER_TYPE = "openMRS.orderType"; + public static final String ORDER_UUID = "openMRS.order.uuid"; + public static final String ORDER_ORDERER_UUID = "openMRS.order.orderer.uuid"; + public static final String ORDER_CARE_SETTING = "openMRS.order.careSetting"; /** * Utility class, should not be initiated. diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/constants/Keys.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/constants/Keys.java index e6a65a484..9daec8032 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/constants/Keys.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/constants/Keys.java @@ -74,6 +74,11 @@ public final class Keys { public static final String COHORT_QUERY_PARAMETERS = "cohortQueryParameters"; public static final String PATIENT_DISPLAY = "patientDisplay"; + //Order action + public static final String ORDER_TYPE = "orderType"; + public static final String ORDERER_UUID = "ordererUuid"; + public static final String CARE_SETTING = "careSetting"; + /** * Utility class, should not be initiated. */ diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java index c7a8138d8..8381d70dc 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java @@ -19,6 +19,7 @@ import org.motechproject.openmrs.domain.IdentifierType; import org.motechproject.openmrs.domain.Location; import org.motechproject.openmrs.domain.Observation; +import org.motechproject.openmrs.domain.Order; import org.motechproject.openmrs.domain.Patient; import org.motechproject.openmrs.domain.Person; import org.motechproject.openmrs.domain.Program; @@ -33,6 +34,7 @@ import org.motechproject.openmrs.service.OpenMRSFormService; import org.motechproject.openmrs.service.OpenMRSLocationService; import org.motechproject.openmrs.service.OpenMRSObservationService; +import org.motechproject.openmrs.service.OpenMRSOrderService; import org.motechproject.openmrs.service.OpenMRSPatientService; import org.motechproject.openmrs.service.OpenMRSPersonService; import org.motechproject.openmrs.service.OpenMRSProgramEnrollmentService; @@ -70,6 +72,7 @@ public class OpenMRSActionProxyServiceImpl implements OpenMRSActionProxyService private OpenMRSPersonService personService; private OpenMRSCohortService cohortService; private OpenMRSFormService formService; + private OpenMRSOrderService orderService; private EventRelay eventRelay; @@ -276,6 +279,25 @@ public void getCohortQueryReport(String configName, String cohortQueryUuid, Map< } } + @Override + public Order createOrder(String configName, String type, String encounterUuid, String patientUuid, String conceptUuid, String ordererUuid, String careSetting) { + Encounter encounter = new Encounter(); + encounter.setUuid(encounterUuid); + + Patient patient = new Patient(); + patient.setUuid(patientUuid); + + Concept concept = new Concept(); + concept.setUuid(conceptUuid); + + Provider orderer = new Provider(); + orderer.setUuid(ordererUuid); + + Order order = new Order(type, encounter, orderer, patient, concept, Order.CareSetting.valueOf(careSetting)); + + return orderService.createOrder(configName, order); + } + private Location getDefaultLocation(String configName) { return getLocationByName(configName, DEFAULT_LOCATION_NAME); } @@ -459,4 +481,9 @@ public void setObservationService(OpenMRSObservationService observationService) public void setFormService(OpenMRSFormService formService) { this.formService = formService; } + + @Autowired + public void setOrderService(OpenMRSOrderService orderService) { + this.orderService = orderService; + } } diff --git a/openmrs/src/main/resources/META-INF/spring/blueprint.xml b/openmrs/src/main/resources/META-INF/spring/blueprint.xml index 13bc3ff8d..25482cf05 100644 --- a/openmrs/src/main/resources/META-INF/spring/blueprint.xml +++ b/openmrs/src/main/resources/META-INF/spring/blueprint.xml @@ -39,6 +39,7 @@ + diff --git a/openmrs/src/main/resources/velocity.templates/task-data-provider.vm b/openmrs/src/main/resources/velocity.templates/task-data-provider.vm index 204da1741..ce80b3b13 100644 --- a/openmrs/src/main/resources/velocity.templates/task-data-provider.vm +++ b/openmrs/src/main/resources/velocity.templates/task-data-provider.vm @@ -102,7 +102,7 @@ "fieldKey": "person.display" }, { - "displayName": "openMRS.person.address", + "displayName": "openMRS.person.fullAddress", "fieldKey": "person.preferredAddress.fullAddressString" }, { @@ -111,12 +111,12 @@ "type": "INTEGER" }, { - "displayName": "openMRS.person.birthdateEstimated", + "displayName": "openMRS.person.birthDateEstimated", "fieldKey": "person.birthdateEstimated", "type": "BOOLEAN" }, { - "displayName": "openMRS.person.birthdate", + "displayName": "openMRS.person.birthDate", "fieldKey": "person.birthdate", "type": "DATE" }, @@ -282,7 +282,7 @@ "fieldKey": "person.uuid" }, { - "displayName": "openMRS.observation.obsDatetime", + "displayName": "openMRS.obsDatetime", "fieldKey": "obsDatetime" }, { @@ -306,7 +306,7 @@ "fieldKey": "location.display" }, { - "displayName": "openMRS.observation.orderUuid", + "displayName": "openMRS.order.uuid", "fieldKey": "order.uuid" }, { diff --git a/openmrs/src/main/resources/webapp/messages/messages.properties b/openmrs/src/main/resources/webapp/messages/messages.properties index ad6731b2f..5ee01bd70 100644 --- a/openmrs/src/main/resources/webapp/messages/messages.properties +++ b/openmrs/src/main/resources/webapp/messages/messages.properties @@ -99,8 +99,16 @@ openMRS.address.endDate=End Date openMRS.address.fullAddress=Full Address #Observation +openMRS.observation.uuid=Observation UUID +openMRS.observation.display=Observation display openMRS.observationJSON=Observation JSON -openMRS.concept.uuid=Concept UUID +openMRS.observation.voided=Observation voided +openMRS.observation.obsGroup=Observation group +openMRS.observation.groupsMembers=Observation group members +openMRS.observation.valueCodedName=Observation value coded name +openMRS.observation.value=Observation value +openMRS.observation.valueModifier=Observation value modifier +openMRS.observation.numberOfObservations=No. observation(s) returned openMRS.obsDatetime=Observation Datetime openMRS.comment=Comment @@ -144,6 +152,17 @@ openMRS.programEnrollment.numberOfPrograms=No. program(s) returned openMRS.identifier.sourceName=Source Name openMRS.identifier.generated=Generated Identifier +#Cohort Query +openMRS.cohortQuery.uuid=CohortQuery UUID +openMRS.cohortQuery.reportMember=CohortQuery Report Member +openMRS.cohortQuery.parameters=Query Parameters + +#Order +openMRS.orderType=Type +openMRS.order.uuid=Order UUID +openMRS.order.orderer.uuid=Orderer UUID +openMRS.order.careSetting= Care Setting + #Configuration openMRS.config.settings=Settings openMRS.config=Account Settings @@ -167,9 +186,4 @@ openMRS.config.error.usernameRequired=Username is required. openMRS.config.error.passwordRequired=Password is required. openMRS.config.error.motechIDRequired=Motech ID is required. openMRS.config.error.patientIdentifierTypeExists=Patient Identifier type already in use. -openMRS.config.info.motechID=The name of the OpenMRS identifier used by MOTECH. This must match the identifier that you will create in OpenMRS. The default is MOTECH Id. - -#Cohort Query -openMRS.cohortQuery.uuid=CohortQuery UUID -openMRS.cohortQuery.reportMember=CohortQuery Report Member -openMRS.cohortQuery.parameters=Query Parameters \ No newline at end of file +openMRS.config.info.motechID=The name of the OpenMRS identifier used by MOTECH. This must match the identifier that you will create in OpenMRS. The default is MOTECH Id. \ No newline at end of file From a322792e546a5efb6f38cc2de1f0007fa48946e2 Mon Sep 17 00:00:00 2001 From: kmadej Date: Thu, 20 Oct 2016 20:51:52 +0200 Subject: [PATCH 100/202] MOTECH-2959: Added optional order uuid to create observation action --- .../main/java/org/motechproject/openmrs/domain/Order.java | 3 +++ .../openmrs/tasks/OpenMRSActionProxyService.java | 5 ++++- .../motechproject/openmrs/tasks/builder/ActionBuilder.java | 1 + .../java/org/motechproject/openmrs/tasks/constants/Keys.java | 1 + .../openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java | 5 ++++- .../openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java | 4 ++-- 6 files changed, 15 insertions(+), 4 deletions(-) diff --git a/openmrs/src/main/java/org/motechproject/openmrs/domain/Order.java b/openmrs/src/main/java/org/motechproject/openmrs/domain/Order.java index 9a146e7cc..e1b67c651 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/domain/Order.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/domain/Order.java @@ -34,6 +34,9 @@ public class Order { @Expose private CareSetting careSetting; + public Order() { + } + public Order(String type, Encounter encounter, Provider orderer, Patient patient, Concept concept, CareSetting careSetting) { this.type = type; this.encounter = encounter; diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSActionProxyService.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSActionProxyService.java index e978889dd..9ca6d1784 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSActionProxyService.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSActionProxyService.java @@ -33,6 +33,7 @@ public interface OpenMRSActionProxyService { * @param visitUuid the visit uuid * @param formUuid the form uuid * @param observations the map of observations where concept Uuid is a key and value from the observation is a value + * @return the created encounter */ Encounter createEncounter(String configName, DateTime encounterDatetime, String encounterType, String locationName, String patientUuid, String providerUuid, String visitUuid, @@ -100,10 +101,12 @@ Patient createPatient(String configName, String givenName, String middleName, St * @param encounterUuid the encounter uuid * @param conceptUuid the concept uuid * @param obsDatetime the observation datetime + * @param orderUuid the order uuid * @param comment the comment + * @return the created observation */ Observation createObservationJSON(String configName, String observationJSON, String encounterUuid, String conceptUuid, - DateTime obsDatetime, String comment); + DateTime obsDatetime, String orderUuid, String comment); /** * Creates a visit with the given {@code patientUuid}, {@code visitStartDatetime}, diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/builder/ActionBuilder.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/builder/ActionBuilder.java index 8ab2efd1c..93f88a7d9 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/builder/ActionBuilder.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/builder/ActionBuilder.java @@ -166,6 +166,7 @@ private ActionEventRequest buildCreateObservationJSON(String configName) { actionParameters.add(prepareParameter(Keys.ENCOUNTER_UUID, DisplayNames.ENCOUNTER_UUID, false, order++)); actionParameters.add(prepareParameter(Keys.CONCEPT_UUID, DisplayNames.CONCEPT_UUID, false, order++)); actionParameters.add(prepareParameter(Keys.OBSERVATION_DATETIME, DisplayNames.OBSERVATION_DATETIME, DATE, false, order++)); + actionParameters.add(prepareParameter(Keys.ORDER_UUID, DisplayNames.ORDER_UUID, false, order++)); actionParameters.add(prepareParameter(Keys.COMMENT, DisplayNames.COMMENT, false, order)); return new ActionEventRequestBuilder() diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/constants/Keys.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/constants/Keys.java index 9daec8032..2e16e61f0 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/constants/Keys.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/constants/Keys.java @@ -75,6 +75,7 @@ public final class Keys { public static final String PATIENT_DISPLAY = "patientDisplay"; //Order action + public static final String ORDER_UUID = "orderUuid"; public static final String ORDER_TYPE = "orderType"; public static final String ORDERER_UUID = "ordererUuid"; public static final String CARE_SETTING = "careSetting"; diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java index 8381d70dc..0decf685c 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java @@ -157,7 +157,7 @@ public void updatePerson(String configName, String personUuid, String givenName, @Override public Observation createObservationJSON(String configName, String observationJSON, String encounterUuid, String conceptUuid, - DateTime obsDatetime, String comment) { + DateTime obsDatetime, String orderUuid, String comment) { JsonParser parser = new JsonParser(); JsonObject obj = parser.parse(observationJSON).getAsJsonObject(); @@ -171,6 +171,9 @@ public Observation createObservationJSON(String configName, String observationJS DateTimeFormatter fullDateTimeFormatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); obj.addProperty("obsDatetime", obsDatetime.toString(fullDateTimeFormatter)); } + if (StringUtils.isNotEmpty(orderUuid)) { + obj.addProperty("order", orderUuid); + } if (StringUtils.isNotEmpty(comment)) { obj.addProperty("comment", comment); } diff --git a/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java b/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java index ccf6d87e5..07d796006 100644 --- a/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java +++ b/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java @@ -451,7 +451,7 @@ public void shouldCreateObservationWithGivenJsonParameter() { doReturn(observation).when(observationService).createObservationFromJson(eq(CONFIG_NAME), eq(observationJSON)); - Observation obsCreated = openMRSActionProxyService.createObservationJSON(CONFIG_NAME, observationJSON, null, null, null, null); + Observation obsCreated = openMRSActionProxyService.createObservationJSON(CONFIG_NAME, observationJSON, null, null, null, null, null); assertEquals(observation, obsCreated); } @@ -494,7 +494,7 @@ public void shouldCreateObservationWithReplacedParameters() { concept.setUuid(conceptUuid); openMRSActionProxyService.createObservationJSON(CONFIG_NAME, observationJSON, - encounterUuidReplace, conceptUuidReplace, new DateTime(obsDatetimeReplace), commentReplace); + encounterUuidReplace, conceptUuidReplace, new DateTime(obsDatetimeReplace), null, commentReplace); verify(observationService).createObservationFromJson(eq(CONFIG_NAME), observationCaptor.capture()); assertEquals(observationJSONReplace, observationCaptor.getValue()); From 549608fabe9e13761efb11ff3c8555cc7c43efce Mon Sep 17 00:00:00 2001 From: mkruszynski Date: Fri, 21 Oct 2016 13:48:22 +0200 Subject: [PATCH 101/202] MOTECH-2891: Created report task actions --- .../client/CommCareAPIHttpClient.java | 10 +- .../events/ReportActionEventHandler.java | 160 +++++++++++++ .../events/constants/DisplayNames.java | 1 + .../events/constants/EventDataKeys.java | 5 + .../events/constants/EventSubjects.java | 2 + .../service/CommcareReportService.java | 12 +- .../service/CommcareSchemaService.java | 8 + .../impl/CommcareReportServiceImpl.java | 9 + .../impl/CommcareSchemaServiceImpl.java | 15 ++ .../tasks/builder/ChannelRequestBuilder.java | 2 + .../tasks/builder/ReportActionBuilder.java | 215 ++++++++++++++++++ 11 files changed, 437 insertions(+), 2 deletions(-) create mode 100644 commcare/src/main/java/org/motechproject/commcare/events/ReportActionEventHandler.java create mode 100644 commcare/src/main/java/org/motechproject/commcare/tasks/builder/ReportActionBuilder.java diff --git a/commcare/src/main/java/org/motechproject/commcare/client/CommCareAPIHttpClient.java b/commcare/src/main/java/org/motechproject/commcare/client/CommCareAPIHttpClient.java index cf671def4..66b4011ab 100644 --- a/commcare/src/main/java/org/motechproject/commcare/client/CommCareAPIHttpClient.java +++ b/commcare/src/main/java/org/motechproject/commcare/client/CommCareAPIHttpClient.java @@ -161,6 +161,10 @@ public String singleReportDataRequest(AccountConfig accountConfig, String report return this.getRequest(accountConfig, commcareReportDataUrl(accountConfig, reportId), null); } + public String singleReportDataRequestWithFilters(AccountConfig accountConfig, String reportId, String filters) { + return this.getRequest(accountConfig, commcareReportDataUrlWithFilters(accountConfig, reportId, filters), null); + } + /** * Executes a HTTP get request to the reports list API endpoint. * @@ -545,11 +549,15 @@ String commcareCaseUrl(AccountConfig accountConfig, String caseId) { accountConfig.getDomain(), API_VERSION, caseId); } - String commcareReportDataUrl(AccountConfig accountConfig, String reportId){ + String commcareReportDataUrl(AccountConfig accountConfig, String reportId) { return String.format("%s/%s/api/v%s/configurablereportdata/%s/?format=json", getCommcareBaseUrl(accountConfig.getBaseUrl()), accountConfig.getDomain(), API_VERSION, reportId); } + String commcareReportDataUrlWithFilters(AccountConfig accountConfig, String reportId, String filter) { + return commcareReportDataUrl(accountConfig, reportId).concat(filter); + } + String commcareReportsMetadataUrl(AccountConfig accountConfig) { return String.format("%s/%s/api/v%s/simplereportconfiguration/?format=json", getCommcareBaseUrl(accountConfig.getBaseUrl()), accountConfig.getDomain(), API_VERSION); diff --git a/commcare/src/main/java/org/motechproject/commcare/events/ReportActionEventHandler.java b/commcare/src/main/java/org/motechproject/commcare/events/ReportActionEventHandler.java new file mode 100644 index 000000000..5da3eedd3 --- /dev/null +++ b/commcare/src/main/java/org/motechproject/commcare/events/ReportActionEventHandler.java @@ -0,0 +1,160 @@ +package org.motechproject.commcare.events; + +import org.joda.time.DateTime; +import org.motechproject.commcare.domain.report.ReportDataInfo; +import org.motechproject.commcare.domain.report.constants.FilterDataType; +import org.motechproject.commcare.domain.report.constants.FilterType; +import org.motechproject.commcare.events.constants.DisplayNames; +import org.motechproject.commcare.events.constants.EventDataKeys; +import org.motechproject.commcare.events.constants.EventSubjects; +import org.motechproject.commcare.service.CommcareFormService; +import org.motechproject.commcare.service.CommcareReportService; +import org.motechproject.event.MotechEvent; +import org.motechproject.event.listener.EventRelay; +import org.motechproject.event.listener.annotations.MotechListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * This class serves as the event handler for the task actions, exposed by the Commcare module. + * Respective methods extract the necessary data from the {@link MotechEvent} instance and + * pass them to the {@link CommcareFormService} that handles all the operations on Commcare forms. + */ +@Component +public class ReportActionEventHandler { + + private static final String TYPE_KEY_IDENTIFIER = ".type"; + private static final String START_DATE_FILTER_SUFFIX = "-start"; + private static final String END_DATE_FILTER_SUFFIX = "-end"; + private static final String NUMERIC_OPERATOR_FILTER_SUFFIX = "-operator"; + private static final String NUMERIC_OPERAND_FILTER_SUFFIX = "-operand"; + private static final String COMMCARE_REPORT_FILTER_DATE_FORMAT = "yyyy-MM-dd"; + + private CommcareReportService commcareReportService; + private EventRelay eventRelay; + + @Autowired + public ReportActionEventHandler (CommcareReportService commcareReportService, EventRelay eventRelay) { + this.commcareReportService = commcareReportService; + this.eventRelay = eventRelay; + } + /** + * Handles events, connected with getting Commcare report. The event subject should have the following syntax: + * {@code EventSubjects.REPORT_EVENT.report_name.config_name} + * + * @param event the event, containing parameters necessary to get the Commcare report + */ + @MotechListener(subjects = EventSubjects.REPORT_EVENT + ".*") + public void receiveReport (MotechEvent event) { + String configName = EventSubjects.getConfigName(event.getSubject()); + Map parameters = event.getParameters(); + + String reportId = (String) parameters.get(EventDataKeys.REPORT_ID); + String reportName = (String) parameters.get(EventDataKeys.REPORT_NAME); + List fields = getFieldNamesFromParameters(parameters); + + String parsedFilters = convertFieldsToRequest(fields, parameters); + + ReportDataInfo report = commcareReportService.getReportByIdWithFilters(reportId, configName, parsedFilters); + + eventRelay.sendEventMessage(new MotechEvent(EventSubjects.RECEIVED_REPORT + "." + reportName + "." + reportId, + prepareReceiveReportParameters(report, reportId, reportName))); + + } + + private List getFieldNamesFromParameters (Map parameters) { + List fieldNames = new ArrayList<>(); + + for (String key : parameters.keySet()) { + if (key.endsWith(TYPE_KEY_IDENTIFIER)) { + fieldNames.add(key.substring(0, key.indexOf(TYPE_KEY_IDENTIFIER))); + } + } + + return fieldNames; + } + + private String convertFieldsToRequest (List fieldNames, Map parameters) { + StringBuilder urlFilterBuilder = new StringBuilder(); + + for (String fieldName : fieldNames) { + String fieldType = (String) parameters.get(fieldName.concat(TYPE_KEY_IDENTIFIER)); + + if (fieldType.equals(FilterType.CHOICE_LIST.toString())) { + String fieldValue = (String) parameters.get(fieldName); + if (fieldValue != null) { + urlFilterBuilder.append("&") + .append(fieldName) + .append("=") + .append(fieldValue); + } + } else if (fieldType.equals(FilterType.DATE.toString())) { + urlFilterBuilder.append(parseDateField(fieldName, parameters)); + } else if (fieldType.equals(FilterDataType.INTEGER.toString())) { + urlFilterBuilder.append(parseNumericField(fieldName, parameters)); + } + } + return urlFilterBuilder.toString(); + } + + private String parseDateField (String fieldName, Map parameters) { + StringBuilder parsedDataFilterBuilder = new StringBuilder(); + + DateTime startDate = (DateTime) parameters.get(fieldName); + DateTime endDate = (DateTime) parameters.get(fieldName + "." + DisplayNames.END_DATE); + + if (startDate != null) { + parsedDataFilterBuilder.append("&") + .append(fieldName) + .append(START_DATE_FILTER_SUFFIX) + .append("=") + .append(startDate.toString(COMMCARE_REPORT_FILTER_DATE_FORMAT)); + } + if (endDate != null) { + parsedDataFilterBuilder.append("&") + .append(fieldName) + .append(END_DATE_FILTER_SUFFIX) + .append("=") + .append(endDate.toString(COMMCARE_REPORT_FILTER_DATE_FORMAT)); + } + + return parsedDataFilterBuilder.toString(); + } + + private String parseNumericField (String fieldName, Map parameters) { + StringBuilder parsedNumericFilterBuilder = new StringBuilder(); + + String operator = (String) parameters.get(fieldName); + String operand = (String) parameters.get(fieldName + "." + EventDataKeys.VALUE); + + if (operator != null && operand != null) { + parsedNumericFilterBuilder.append("&") + .append(fieldName) + .append(NUMERIC_OPERATOR_FILTER_SUFFIX) + .append("=") + .append(operator) + .append("&") + .append(fieldName) + .append(NUMERIC_OPERAND_FILTER_SUFFIX) + .append("=") + .append(operand); + } + + return parsedNumericFilterBuilder.toString(); + } + + private Map prepareReceiveReportParameters (ReportDataInfo report, String reportId, String reportName) { + Map parameters = new HashMap<>(); + + parameters.put(EventDataKeys.REPORT_ID, reportId); + parameters.put(EventDataKeys.REPORT_NAME, reportName); + parameters.put(EventDataKeys.REPORT_DATA, report); + + return parameters; + } +} diff --git a/commcare/src/main/java/org/motechproject/commcare/events/constants/DisplayNames.java b/commcare/src/main/java/org/motechproject/commcare/events/constants/DisplayNames.java index a3a611b91..001cffca1 100644 --- a/commcare/src/main/java/org/motechproject/commcare/events/constants/DisplayNames.java +++ b/commcare/src/main/java/org/motechproject/commcare/events/constants/DisplayNames.java @@ -12,6 +12,7 @@ public final class DisplayNames { public static final String UPDATE_CASE = "Update Case"; public static final String SUBMIT_FORM = "Submit Form"; public static final String IMPORT_FORMS = "Import Forms"; + public static final String CREATE_REPORT = "Create Report"; public static final String CONFIG_NAME = "commcare.configName"; public static final String CASE_ID = "commcare.caseId"; diff --git a/commcare/src/main/java/org/motechproject/commcare/events/constants/EventDataKeys.java b/commcare/src/main/java/org/motechproject/commcare/events/constants/EventDataKeys.java index 77c8bf3c7..217c8fdb6 100644 --- a/commcare/src/main/java/org/motechproject/commcare/events/constants/EventDataKeys.java +++ b/commcare/src/main/java/org/motechproject/commcare/events/constants/EventDataKeys.java @@ -71,6 +71,11 @@ public final class EventDataKeys { //FullFormsExceptionEvent public static final String FAILED_FORM_MESSAGE = "failedMessage"; + //ReportEvent + public static final String REPORT_ID = "report_id"; + public static final String REPORT_NAME = "report_name"; + public static final String REPORT_DATA = "report_data"; + /** * Utility class, should not be initiated. */ diff --git a/commcare/src/main/java/org/motechproject/commcare/events/constants/EventSubjects.java b/commcare/src/main/java/org/motechproject/commcare/events/constants/EventSubjects.java index 82694d47f..c8cf8eb62 100644 --- a/commcare/src/main/java/org/motechproject/commcare/events/constants/EventSubjects.java +++ b/commcare/src/main/java/org/motechproject/commcare/events/constants/EventSubjects.java @@ -8,6 +8,7 @@ public final class EventSubjects { private static final String BASE_SUBJECT = "org.motechproject.commcare.api."; public static final String CASE_EVENT = BASE_SUBJECT + "case"; + public static final String REPORT_EVENT = BASE_SUBJECT + "report"; public static final String MALFORMED_CASE_EXCEPTION = BASE_SUBJECT + "exception"; public static final String FORM_STUB_EVENT = BASE_SUBJECT + "formstub"; public static final String FORM_STUB_FAIL_EVENT = FORM_STUB_EVENT + ".failed"; @@ -24,6 +25,7 @@ public final class EventSubjects { public static final String CREATE_CASE = BASE_SUBJECT + "createCase"; public static final String UPDATE_CASE = BASE_SUBJECT + "updateCase"; public static final String SUBMIT_FORM = BASE_SUBJECT + "submitForm"; + public static final String RECEIVED_REPORT = BASE_SUBJECT + "receivedReport"; public static String getConfigName(String subject) { return subject.substring(subject.lastIndexOf('.') + 1); diff --git a/commcare/src/main/java/org/motechproject/commcare/service/CommcareReportService.java b/commcare/src/main/java/org/motechproject/commcare/service/CommcareReportService.java index 57aa9b2d2..a54ee38d6 100644 --- a/commcare/src/main/java/org/motechproject/commcare/service/CommcareReportService.java +++ b/commcare/src/main/java/org/motechproject/commcare/service/CommcareReportService.java @@ -1,7 +1,7 @@ package org.motechproject.commcare.service; -import org.motechproject.commcare.domain.report.ReportsMetadataInfo; import org.motechproject.commcare.domain.report.ReportDataInfo; +import org.motechproject.commcare.domain.report.ReportsMetadataInfo; /** * Responsible for interacting with CommCareHQ's Report Metadata and Data API. @@ -31,6 +31,16 @@ public interface CommcareReportService { */ ReportDataInfo getReportById(String reportId, String configName); + /** + * Query CommCareHQ for a report by its report id and using filters declared in report. + * + * @param reportId the id of the report on CommCareHQ + * @param configName the name of the configuration used for connecting to CommcareHQ, null means default configuration + * @param filters the list of filters able to use in request + * @return the ReportDataInfo object representing the state of the report data or null if that report does not exist. + */ + ReportDataInfo getReportByIdWithFilters(String reportId, String configName, String filters); + /** * Same as {@link #getReportById(String, String) getReportById} but uses default Commcare configuration. */ diff --git a/commcare/src/main/java/org/motechproject/commcare/service/CommcareSchemaService.java b/commcare/src/main/java/org/motechproject/commcare/service/CommcareSchemaService.java index 0eef006c8..02640d8eb 100644 --- a/commcare/src/main/java/org/motechproject/commcare/service/CommcareSchemaService.java +++ b/commcare/src/main/java/org/motechproject/commcare/service/CommcareSchemaService.java @@ -2,6 +2,7 @@ import org.motechproject.commcare.domain.CommcareApplicationJson; import org.motechproject.commcare.domain.FormSchemaJson; +import org.motechproject.commcare.domain.report.ReportsMetadataInfo; import org.motechproject.commcare.tasks.builder.model.CaseTypeWithApplicationName; import org.motechproject.commcare.tasks.builder.model.FormWithApplicationName; @@ -57,4 +58,11 @@ public interface CommcareSchemaService { * @return Set of Forms with display names. */ Set getFormsWithApplicationName(String configName); + + /** + * Retrieves reports metadata by configuration name + * + * @return the list of matching reports metadata + */ + List getReportsMetadata(String configName); } diff --git a/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportServiceImpl.java b/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportServiceImpl.java index 2ae1b5051..e5002303a 100644 --- a/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportServiceImpl.java +++ b/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareReportServiceImpl.java @@ -67,6 +67,15 @@ public ReportDataInfo getReportById(String reportId, String configName) { return generateReportFromReportResponse(reportResponse); } + @Override + public ReportDataInfo getReportByIdWithFilters (String reportId, String configName, String filters) { + String response = commcareHttpClient.singleReportDataRequestWithFilters(configService.getByName(configName).getAccountConfig(), + reportId, filters); + ReportDataResponseJson reportResponse = parseSingleReportFromResponse(response); + + return generateReportFromReportResponse(reportResponse); + } + @Override public ReportDataInfo getReportById(String reportId) { return getReportById(reportId, null); diff --git a/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareSchemaServiceImpl.java b/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareSchemaServiceImpl.java index 0bd592b81..416077b5e 100644 --- a/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareSchemaServiceImpl.java +++ b/commcare/src/main/java/org/motechproject/commcare/service/impl/CommcareSchemaServiceImpl.java @@ -3,8 +3,10 @@ import org.motechproject.commcare.domain.CommcareApplicationJson; import org.motechproject.commcare.domain.CommcareModuleJson; import org.motechproject.commcare.domain.FormSchemaJson; +import org.motechproject.commcare.domain.report.ReportsMetadataInfo; import org.motechproject.commcare.service.CommcareApplicationDataService; import org.motechproject.commcare.service.CommcareSchemaService; +import org.motechproject.commcare.service.ReportsMetadataDataService; import org.motechproject.commcare.tasks.builder.model.CaseTypeWithApplicationName; import org.motechproject.commcare.tasks.builder.model.FormWithApplicationName; import org.springframework.beans.factory.annotation.Autowired; @@ -27,6 +29,8 @@ public class CommcareSchemaServiceImpl implements CommcareSchemaService { private CommcareApplicationDataService commcareApplicationDataService; + private ReportsMetadataDataService reportsMetadataDataService; + @Override @Transactional public List getAllFormSchemas(String configName) { @@ -106,8 +110,19 @@ public List retrieveApplications(String configName) { return commcareApplicationDataService.bySourceConfiguration(configName); } + @Override + @Transactional + public List getReportsMetadata (String configName) { + return reportsMetadataDataService.bySourceConfiguration(configName); + } + @Autowired public void setCommcareApplicationDataService(CommcareApplicationDataService commcareApplicationDataService) { this.commcareApplicationDataService = commcareApplicationDataService; } + + @Autowired + public void setReportsMetadataDataService (ReportsMetadataDataService reportsMetadataDataService) { + this.reportsMetadataDataService = reportsMetadataDataService; + } } diff --git a/commcare/src/main/java/org/motechproject/commcare/tasks/builder/ChannelRequestBuilder.java b/commcare/src/main/java/org/motechproject/commcare/tasks/builder/ChannelRequestBuilder.java index c63226424..5b7231f67 100644 --- a/commcare/src/main/java/org/motechproject/commcare/tasks/builder/ChannelRequestBuilder.java +++ b/commcare/src/main/java/org/motechproject/commcare/tasks/builder/ChannelRequestBuilder.java @@ -56,6 +56,7 @@ public ChannelRequest buildChannelRequest() { QueryStockLedgerActionBuilder queryStockLedgerActionBuilder = new QueryStockLedgerActionBuilder(configService); CaseActionBuilder caseActionBuilder = new CaseActionBuilder(configService); FormActionBuilder formActionBuilder = new FormActionBuilder(schemaService, configService); + ReportActionBuilder reportActionBuilder = new ReportActionBuilder(schemaService, configService); List triggers = formTriggerBuilder.buildTriggers(); triggers.addAll(caseTriggerBuilder.buildTriggers()); @@ -66,6 +67,7 @@ public ChannelRequest buildChannelRequest() { actions.addAll(queryStockLedgerActionBuilder.buildActions()); actions.addAll(caseActionBuilder.buildActions()); actions.addAll(formActionBuilder.buildActions()); + actions.addAll(reportActionBuilder.buildActions()); return new ChannelRequest(DISPLAY_NAME, bundleContext.getBundle().getSymbolicName(), bundleContext.getBundle().getVersion().toString(), null, triggers, actions); diff --git a/commcare/src/main/java/org/motechproject/commcare/tasks/builder/ReportActionBuilder.java b/commcare/src/main/java/org/motechproject/commcare/tasks/builder/ReportActionBuilder.java new file mode 100644 index 000000000..14c43a5c1 --- /dev/null +++ b/commcare/src/main/java/org/motechproject/commcare/tasks/builder/ReportActionBuilder.java @@ -0,0 +1,215 @@ +package org.motechproject.commcare.tasks.builder; + +import org.motechproject.commcare.config.Config; +import org.motechproject.commcare.domain.report.ReportMetadataFilter; +import org.motechproject.commcare.domain.report.ReportMetadataInfo; +import org.motechproject.commcare.domain.report.ReportsMetadataInfo; +import org.motechproject.commcare.domain.report.constants.FilterDataType; +import org.motechproject.commcare.domain.report.constants.FilterType; +import org.motechproject.commcare.events.constants.DisplayNames; +import org.motechproject.commcare.events.constants.EventDataKeys; +import org.motechproject.commcare.events.constants.EventSubjects; +import org.motechproject.commcare.service.CommcareConfigService; +import org.motechproject.commcare.service.CommcareSchemaService; +import org.motechproject.tasks.contract.ActionEventRequest; +import org.motechproject.tasks.contract.ActionParameterRequest; +import org.motechproject.tasks.contract.builder.ActionEventRequestBuilder; +import org.motechproject.tasks.contract.builder.ActionParameterRequestBuilder; +import org.motechproject.tasks.domain.enums.ParameterType; + +import java.util.ArrayList; +import java.util.List; +import java.util.SortedSet; +import java.util.TreeSet; + +/** + * Class responsible for building the Task module actions, related to sending the + * forms via submission API. The built list of {@link ActionEventRequest}s instances can + * be passed to the Task module to register channel actions. + */ +public class ReportActionBuilder implements ActionBuilder { + + private CommcareSchemaService schemaService; + private CommcareConfigService configService; + + public ReportActionBuilder (CommcareSchemaService schemaService, CommcareConfigService configService) { + this.schemaService = schemaService; + this.configService = configService; + } + + @Override + public List buildActions () { + List actions = new ArrayList<>(); + + for (Config config : configService.getConfigs().getConfigs()) { + List builtActions = buildActionsForConfigs(config); + actions.addAll(builtActions); + } + + return actions; + } + + private List buildActionsForConfigs (Config config) { + List actions = new ArrayList<>(); + + for (ReportsMetadataInfo reportsMetadataInfo : schemaService.getReportsMetadata(config.getName())) { + for (ReportMetadataInfo reportMetadata : reportsMetadataInfo.getReportMetadataInfoList()) { + SortedSet parameters = buildActionParameters(reportMetadata); + + parameters.addAll(prepareCommonParameters(parameters.size(), reportMetadata.getId(), reportMetadata.getTitle())); + + String displayName = DisplayNameHelper.buildDisplayName(DisplayNames.CREATE_REPORT, reportMetadata.getTitle(), + config.getName()); + ActionEventRequestBuilder actionBuilder = new ActionEventRequestBuilder() + .setDisplayName(displayName) + .setSubject(EventSubjects.REPORT_EVENT + "." + reportMetadata.getTitle() + "." + config.getName()) + .setActionParameters(parameters); + + actions.add(actionBuilder.createActionEventRequest()); + } + } + + return actions; + } + + private SortedSet buildActionParameters (ReportMetadataInfo reportMetadata) { + SortedSet parameters = new TreeSet<>(); + int order = 0; + + for (ReportMetadataFilter filter : reportMetadata.getFilters()) { + if (filter.getDatatype().equals(FilterDataType.DECIMAL) || filter.getDatatype().equals(FilterDataType.INTEGER)) { + + parameters.addAll(prepareNumericParameters(filter, order)); + order = parameters.size(); + + } else if (filter.getType().equals(FilterType.DATE)) { + + parameters.addAll(prepareDateParameters(filter, order)); + order = parameters.size(); + + } else { + + parameters.addAll(prepareUnicodeParameters(filter, order)); + order = parameters.size(); + } + } + + return parameters; + } + + private SortedSet prepareNumericParameters (ReportMetadataFilter filter, int startOrder) { + SortedSet parameters = new TreeSet<>(); + int order = startOrder; + + ActionParameterRequestBuilder builder = new ActionParameterRequestBuilder() + .setDisplayName(filter.getSlug()) + .setKey(filter.getSlug()) + .setType(ParameterType.SELECT.getValue()) + .setOptions(createNumericFilterOperators()) + .setOrder(order++); + + parameters.add(builder.createActionParameterRequest()); + + builder = new ActionParameterRequestBuilder() + .setDisplayName(filter.getSlug() + " " + EventDataKeys.VALUE) + .setKey(filter.getSlug() + "." + EventDataKeys.VALUE) + .setType(ParameterType.UNICODE.getValue()) + .setOrder(order++); + + parameters.add(builder.createActionParameterRequest()); + + parameters.add(prepareFilterTypeParameter(filter, FilterDataType.DECIMAL.toString(), order++)); + + return parameters; + } + + private SortedSet prepareDateParameters (ReportMetadataFilter filter, int startOrder) { + SortedSet parameters = new TreeSet<>(); + int order = startOrder; + + ActionParameterRequestBuilder builder = new ActionParameterRequestBuilder() + .setDisplayName(filter.getSlug()) + .setKey(filter.getSlug()) + .setType(ParameterType.DATE.getValue()) + .setOrder(order++); + + parameters.add(builder.createActionParameterRequest()); + + builder = new ActionParameterRequestBuilder() + .setDisplayName(DisplayNames.END_DATE) + .setKey(filter.getSlug() + "." + DisplayNames.END_DATE) + .setType(ParameterType.DATE.getValue()) + .setOrder(order++); + + parameters.add(builder.createActionParameterRequest()); + + parameters.add(prepareFilterTypeParameter(filter, FilterType.DATE.toString(), order++)); + + return parameters; + } + + private SortedSet prepareUnicodeParameters (ReportMetadataFilter filter, int startOrder) { + SortedSet parameters = new TreeSet<>(); + int order = startOrder; + + ActionParameterRequestBuilder builder = new ActionParameterRequestBuilder() + .setDisplayName(filter.getSlug()) + .setKey(filter.getSlug()) + .setType(ParameterType.UNICODE.getValue()) + .setOrder(order++); + + parameters.add(builder.createActionParameterRequest()); + + parameters.add(prepareFilterTypeParameter(filter, FilterType.CHOICE_LIST.toString(), order++)); + + return parameters; + } + + private ActionParameterRequest prepareFilterTypeParameter (ReportMetadataFilter filter, String type, int order) { + return new ActionParameterRequestBuilder() + .setDisplayName(filter.getSlug() + "." + EventDataKeys.TYPE) + .setKey(filter.getSlug() + "." + EventDataKeys.TYPE) + .setValue(type) + .setHidden(true) + .setOrder(order) + .createActionParameterRequest(); + } + + private SortedSet prepareCommonParameters (int startOrder, String reportId, String reportName) { + SortedSet parameters = new TreeSet<>(); + int order = startOrder; + + ActionParameterRequestBuilder builder = new ActionParameterRequestBuilder() + .setDisplayName(EventDataKeys.REPORT_ID) + .setKey(EventDataKeys.REPORT_ID) + .setValue(reportId) + .setHidden(true) + .setOrder(order++); + + parameters.add(builder.createActionParameterRequest()); + + builder = new ActionParameterRequestBuilder() + .setDisplayName(EventDataKeys.REPORT_NAME) + .setKey(EventDataKeys.REPORT_NAME) + .setValue(reportName) + .setHidden(true) + .setOrder(order); + + parameters.add(builder.createActionParameterRequest()); + + return parameters; + } + + private SortedSet createNumericFilterOperators () { + SortedSet availableOperators = new TreeSet<>(); + + availableOperators.add("="); + availableOperators.add("!="); + availableOperators.add("<"); + availableOperators.add("<="); + availableOperators.add(">"); + availableOperators.add(">="); + + return availableOperators; + } +} From cf40e0cc88b10531728af6f611474701ac81b35d Mon Sep 17 00:00:00 2001 From: kmadej Date: Fri, 21 Oct 2016 15:19:52 +0200 Subject: [PATCH 102/202] MOTECH-2994: Added 'Get Observation by Patient Uuid and Value' lookup Additionally I changed a bit 'Get Observation by Patient Uuid and Concept' lookup --- .../impl/ObservationResourceImpl.java | 10 ++--- .../service/OpenMRSObservationService.java | 14 ++++++- .../impl/OpenMRSObservationServiceImpl.java | 31 +++++++++++++- .../tasks/OpenMRSTaskDataProvider.java | 40 ++++++++++--------- .../openmrs/tasks/OpenMRSTasksConstants.java | 2 + .../velocity.templates/task-data-provider.vm | 7 ++++ .../webapp/messages/messages.properties | 1 + .../impl/ObservationResourceImplTest.java | 3 +- .../tasks/OpenMRSTaskDataProviderTest.java | 12 +----- 9 files changed, 81 insertions(+), 39 deletions(-) diff --git a/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/ObservationResourceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/ObservationResourceImpl.java index b507c00ba..b92bf5219 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/ObservationResourceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/resource/impl/ObservationResourceImpl.java @@ -30,7 +30,7 @@ public ObservationResourceImpl(RestOperations restOperations, HttpClient httpCli @Override public ObservationListResult queryForObservationsByPatientId(Config config, String uuid) { String responseJson = getJson(config, "/obs?patient={uuid}&v=full", uuid); - return (ObservationListResult) JsonUtils.readJson(responseJson, ObservationListResult.class); + return (ObservationListResult) JsonUtils.readJsonWithAdapters(responseJson, ObservationListResult.class, createValueAdapter()); } @Override @@ -44,16 +44,14 @@ public void voidObservation(Config config, String id, String reason) { @Override public Observation getObservationById(Config config, String uuid) { - Map adapter = new HashMap<>(); - adapter.put(Observation.ObservationValue.class, new Observation.ObservationValueDeserializer()); String responseJson = getJson(config, "/obs/{uuid}?v=full", uuid); - return (Observation) JsonUtils.readJsonWithAdapters(responseJson, Observation.class, adapter); + return (Observation) JsonUtils.readJsonWithAdapters(responseJson, Observation.class, createValueAdapter()); } @Override public ObservationListResult getObservationByPatientUUIDAndConceptUUID(Config config, String patientUUID, String conceptUUID) { - String responseJson = getJson(config, "/obs?patient={patientUUID}&concept={conceptUUID}&limit=1", patientUUID, conceptUUID); - return (ObservationListResult) JsonUtils.readJson(responseJson, ObservationListResult.class); + String responseJson = getJson(config, "/obs?patient={patientUUID}&concept={conceptUUID}&limit=1&v=full", patientUUID, conceptUUID); + return (ObservationListResult) JsonUtils.readJsonWithAdapters(responseJson, ObservationListResult.class, createValueAdapter()); } @Override diff --git a/openmrs/src/main/java/org/motechproject/openmrs/service/OpenMRSObservationService.java b/openmrs/src/main/java/org/motechproject/openmrs/service/OpenMRSObservationService.java index febc24a25..0660e6ea0 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/service/OpenMRSObservationService.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/service/OpenMRSObservationService.java @@ -1,7 +1,6 @@ package org.motechproject.openmrs.service; import org.motechproject.openmrs.domain.Observation; -import org.motechproject.openmrs.domain.ObservationListResult; import org.motechproject.openmrs.exception.ObservationNotFoundException; import java.util.List; @@ -63,7 +62,18 @@ public interface OpenMRSObservationService { * @param conceptUUID the UUID of the concept * @return the latest observation with the given patientUUID and conceptUUID, null if the observation doesn't exist */ - ObservationListResult getObservationByPatientUUIDAndConceptUUID(String configName, String patientUUID, String conceptUUID); + Observation getLatestObservationByPatientUUIDAndConceptUUID(String configName, String patientUUID, String conceptUUID); + + /** + * Returns the latest observation with given {@code patientUuid} and {@code value}. Configuration with the given {@code configName} will be used + * while performing this action. + * + * @param configName the name of the configuration + * @param patientUuid the UUID of the patient + * @param value the observation value + * @return the latest observation with the given patientUuid and value, null if the observation doesn't exist + */ + Observation getLatestObservationByValueAndPatientUuid(String configName, String patientUuid, String value); /** * Creates the given {@code observation} on the OpenMRS server. Configuration with the given {@code configName} will diff --git a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSObservationServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSObservationServiceImpl.java index 5e5d2207e..9059be710 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSObservationServiceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/service/impl/OpenMRSObservationServiceImpl.java @@ -1,5 +1,6 @@ package org.motechproject.openmrs.service.impl; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.Validate; import org.apache.log4j.Logger; import org.motechproject.event.MotechEvent; @@ -98,19 +99,32 @@ public Observation getObservationByUuid(String configName, String uuid) { } @Override - public ObservationListResult getObservationByPatientUUIDAndConceptUUID(String configName, String patientUUID, String conceptUUID) { + public Observation getLatestObservationByPatientUUIDAndConceptUUID(String configName, String patientUUID, String conceptUUID) { Validate.notEmpty(patientUUID, "Patient uuid cannot be empty"); Validate.notEmpty(conceptUUID, "Concept uuid cannot be empty"); try { Config config = configService.getConfigByName(configName); - return obsResource.getObservationByPatientUUIDAndConceptUUID(config, patientUUID, conceptUUID); + ObservationListResult obs = obsResource.getObservationByPatientUUIDAndConceptUUID(config, patientUUID, conceptUUID); + return CollectionUtils.isEmpty(obs.getResults()) ? null : obs.getResults().get(0); } catch (HttpClientErrorException e) { throw new OpenMRSException(String.format("Could not get Observation for Patient uuid: %s and Concept: %s. %s %s", patientUUID, conceptUUID, e.getMessage(), e.getResponseBodyAsString()), e); } } + @Override + public Observation getLatestObservationByValueAndPatientUuid(String configName, String patientUuid, String value) { + try { + Config config = configService.getConfigByName(configName); + ObservationListResult obs = obsResource.queryForObservationsByPatientId(config, patientUuid); + return getLatestObservationByValue(obs.getResults(), new Observation.ObservationValue(value)); + } catch (HttpClientErrorException e) { + throw new OpenMRSException(String.format("Could not get Observation for Patient uuid: %s. %s %s", + patientUuid, e.getMessage(), e.getResponseBodyAsString()), e); + } + } + @Override public Observation createObservation(String configName, Observation observation) { Validate.notEmpty(observation.getPerson().getUuid(), "Patient uuid cannot be empty"); @@ -189,4 +203,17 @@ private List findObservations(Config config, String motechId, Strin return obs; } + + private Observation getLatestObservationByValue(List obs, Observation.ObservationValue value) { + Observation result = null; + + for (Observation observation : obs) { + if (value.equals(observation.getValue())) { + result = observation; + break; + } + } + + return result; + } } diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java index fb9ae72c0..a790d3fa4 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProvider.java @@ -9,7 +9,6 @@ import org.motechproject.openmrs.domain.Encounter; import org.motechproject.openmrs.domain.GeneratedIdentifier; import org.motechproject.openmrs.domain.Observation; -import org.motechproject.openmrs.domain.ObservationListResult; import org.motechproject.openmrs.domain.Patient; import org.motechproject.openmrs.domain.ProgramEnrollment; import org.motechproject.openmrs.domain.ProgramEnrollmentListResult; @@ -41,6 +40,7 @@ import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.BY_MOTECH_ID; import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.BY_MOTECH_ID_AND_PROGRAM_NAME; import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.BY_PATIENT_UUID_AND_CONCEPT_UUID; +import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.BY_PATIENT_UUID_AND_VALUE; import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.BY_UUID; import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.BY_UUID_AMD_PROGRAM_NAME; import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.CONCEPT_UUID; @@ -50,6 +50,7 @@ import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.MOTECH_ID; import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.NAME; import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.OBSERVATION; +import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.OBSERVATION_VALUE; import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.PACKAGE_ROOT; import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.PATIENT; import static org.motechproject.openmrs.tasks.OpenMRSTasksConstants.PATIENT_MOTECH_ID; @@ -199,19 +200,32 @@ private Patient getPatient(String lookupName, Map lookupFields, } private Observation getObservation(String lookupName, Map lookupFields, String configName) { - ObservationListResult observations; - Observation latestObservation = null; + Observation result = null; + String observationsNumber; switch(lookupName) { case BY_PATIENT_UUID_AND_CONCEPT_UUID: - observations = observationService.getObservationByPatientUUIDAndConceptUUID(configName, + result = observationService.getLatestObservationByPatientUUIDAndConceptUUID(configName, lookupFields.get(PATIENT_UUID), lookupFields.get(CONCEPT_UUID)); - latestObservation = getLatestObservation(configName, observations); + observationsNumber = getObservationsNumber(result); + if (result == null) { + result = new Observation(); + } + result.setNumberOfObservations(observationsNumber); + break; + case BY_PATIENT_UUID_AND_VALUE: + result = observationService.getLatestObservationByValueAndPatientUuid(configName, lookupFields.get(PATIENT_UUID), + lookupFields.get(OBSERVATION_VALUE)); + observationsNumber = getObservationsNumber(result); + if (result == null) { + result = new Observation(); + } + result.setNumberOfObservations(observationsNumber); break; default: LOGGER.error("Lookup with name {} doesn't exist for observation object", lookupName); break; } - return latestObservation; + return result; } private Provider getProvider(String lookupName, Map lookupFields, String configName) { @@ -304,18 +318,8 @@ private GeneratedIdentifier getIdentifier(Map lookupFields, Stri return generatedIdentifierService.getLatestIdentifier(configName, lookupFields.get(IDENTIFIER_SOURCE_NAME)); } - private Observation getLatestObservation(String configName, ObservationListResult observations) { - Observation latestObservation; - - if (CollectionUtils.isNotEmpty(observations.getResults())) { - latestObservation = observationService.getObservationByUuid(configName, observations.getResults().get(0).getUuid()); - latestObservation.setNumberOfObservations("1"); - } else { - latestObservation = new Observation(); - latestObservation.setNumberOfObservations("0"); - } - - return latestObservation; + private String getObservationsNumber(Observation observation) { + return observation == null ? "0" : "1"; } private List filterPrograms(List programEnrollments, String programName, String activeProgram) { diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTasksConstants.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTasksConstants.java index 6baca3d83..2ec138b24 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTasksConstants.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/OpenMRSTasksConstants.java @@ -14,6 +14,7 @@ public final class OpenMRSTasksConstants { public static final String BY_MOTECH_ID_AND_PROGRAM_NAME = "openMRS.lookup.motechIdAndProgramName"; public static final String BY_UUID_AMD_PROGRAM_NAME = "openMRS.lookup.uuidAndProgramName"; public static final String BY_PATIENT_UUID_AND_CONCEPT_UUID = "openMRS.lookup.patientUuidAndConceptUuid"; + public static final String BY_PATIENT_UUID_AND_VALUE = "openMRS.lookup.patientUuidAndValue"; // Lookup objects public static final String ENCOUNTER = "Encounter"; @@ -31,6 +32,7 @@ public final class OpenMRSTasksConstants { public static final String PATIENT_MOTECH_ID = "openMRS.patient.motechId"; public static final String PATIENT_UUID = "openMRS.patient.uuid"; public static final String CONCEPT_UUID = "openMRS.concept.uuid"; + public static final String OBSERVATION_VALUE = "openMRS.observation.value"; public static final String PERSON_UUID = "openMRS.person.uuid"; public static final String RELATIONSHIP_TYPE_UUID = "openMRS.relationshipType.uuid"; public static final String PROGRAM_NAME = "openMRS.programName"; diff --git a/openmrs/src/main/resources/velocity.templates/task-data-provider.vm b/openmrs/src/main/resources/velocity.templates/task-data-provider.vm index ce80b3b13..b40ac91b9 100644 --- a/openmrs/src/main/resources/velocity.templates/task-data-provider.vm +++ b/openmrs/src/main/resources/velocity.templates/task-data-provider.vm @@ -262,6 +262,13 @@ "openMRS.patient.uuid", "openMRS.concept.uuid" ] + }, + { + "displayName": "openMRS.lookup.patientUuidAndValue", + "fields": [ + "openMRS.patient.uuid", + "openMRS.observation.value" + ] } ], "fields": [ diff --git a/openmrs/src/main/resources/webapp/messages/messages.properties b/openmrs/src/main/resources/webapp/messages/messages.properties index 5ee01bd70..f6c88659e 100644 --- a/openmrs/src/main/resources/webapp/messages/messages.properties +++ b/openmrs/src/main/resources/webapp/messages/messages.properties @@ -8,6 +8,7 @@ openMRS.lookup.motechIdAndProgramName=MOTECH ID and Program name openMRS.lookup.uuidAndProgramName=UUID and Program name openMRS.lookup.sourceName=Generator source name openMRS.lookup.patientUuidAndConceptUuid=Patient UUID and Concept UUID +openMRS.lookup.patientUuidAndValue=Patient UUID and Value #Actions openMRS.createEncounter=Create Encounter diff --git a/openmrs/src/test/java/org/motechproject/openmrs/resource/impl/ObservationResourceImplTest.java b/openmrs/src/test/java/org/motechproject/openmrs/resource/impl/ObservationResourceImplTest.java index 15959d68c..5a9e01877 100644 --- a/openmrs/src/test/java/org/motechproject/openmrs/resource/impl/ObservationResourceImplTest.java +++ b/openmrs/src/test/java/org/motechproject/openmrs/resource/impl/ObservationResourceImplTest.java @@ -82,7 +82,7 @@ public void shouldQueryForObservationByPatientId() throws Exception { public void shouldQueryForObservationByPatientIdAndConceptId() throws Exception { String patientId = "OOO"; String conceptId = "CCC"; - URI url = config.toInstancePathWithParams("/obs?patient={patientUUID}&concept={conceptUUID}&limit=1", patientId, conceptId); + URI url = config.toInstancePathWithParams("/obs?patient={patientUUID}&concept={conceptUUID}&limit=1&v=full", patientId, conceptId); when(restOperations.exchange(eq(url), eq(HttpMethod.GET), any(HttpEntity.class), eq(String.class))) .thenReturn(getResponseFromFile(OBSERVATION_QUERY_RESPONSE_JSON)); @@ -95,6 +95,7 @@ public void shouldQueryForObservationByPatientIdAndConceptId() throws Exception assertThat(requestCaptor.getValue().getHeaders(), equalTo(getHeadersForGet(config))); } + @Test public void shouldCreateObservation() throws Exception { String observationJson = prepareObservationJson(); ObservationFromJSON observation = prepareObservation(); diff --git a/openmrs/src/test/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProviderTest.java b/openmrs/src/test/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProviderTest.java index e3ee6185f..05e58a83a 100644 --- a/openmrs/src/test/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProviderTest.java +++ b/openmrs/src/test/java/org/motechproject/openmrs/tasks/OpenMRSTaskDataProviderTest.java @@ -164,8 +164,6 @@ public void shouldReturnObservationForPatientUuidAndConceptUuid() { String className = Observation.class.getSimpleName(); String conceptUuid = "sampleConceptUuid"; - List results = new ArrayList<>(); - Map lookupFields = new HashMap<>(); lookupFields.put(PATIENT_UUID, DEFAULT_UUID); lookupFields.put(CONCEPT_UUID, conceptUuid); @@ -173,19 +171,13 @@ public void shouldReturnObservationForPatientUuidAndConceptUuid() { Observation observation = new Observation(); observation.setUuid("10"); - results.add(observation); - - ObservationListResult observationListResult = new ObservationListResult(); - observationListResult.setResults(results); - - when(observationService.getObservationByPatientUUIDAndConceptUUID(CONFIG_NAME, DEFAULT_UUID, conceptUuid)).thenReturn(observationListResult); - when(observationService.getObservationByUuid(CONFIG_NAME, "10")).thenReturn(observation); + when(observationService.getLatestObservationByPatientUUIDAndConceptUUID(CONFIG_NAME, DEFAULT_UUID, conceptUuid)).thenReturn(observation); Object object = taskDataProvider.lookup(className + '-' + CONFIG_NAME, BY_PATIENT_UUID_AND_CONCEPT_UUID, lookupFields); assertEquals(observation, object); - verify(observationService).getObservationByPatientUUIDAndConceptUUID(CONFIG_NAME, DEFAULT_UUID, conceptUuid); + verify(observationService).getLatestObservationByPatientUUIDAndConceptUUID(CONFIG_NAME, DEFAULT_UUID, conceptUuid); } @Test From 87a65d6c6f02eee949872148b4240a18e4bfc297 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Ja=C5=BCd=C5=BCewski?= Date: Mon, 24 Oct 2016 10:20:30 +0200 Subject: [PATCH 103/202] MOTECH-3015 Added app_id URL parameter handling to FullFormController --- .../commcare/web/FullFormController.java | 12 +++++++----- .../impl/parser/CommcareEventParsersTest.java | 4 ++-- .../commcare/web/FullFormControllerTest.java | 10 +++++----- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/commcare/src/main/java/org/motechproject/commcare/web/FullFormController.java b/commcare/src/main/java/org/motechproject/commcare/web/FullFormController.java index b5ca34963..e0af06397 100644 --- a/commcare/src/main/java/org/motechproject/commcare/web/FullFormController.java +++ b/commcare/src/main/java/org/motechproject/commcare/web/FullFormController.java @@ -17,6 +17,7 @@ import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseStatus; import javax.servlet.http.HttpServletRequest; @@ -42,17 +43,17 @@ public FullFormController(EventRelay eventRelay, CommcareConfigService configSer @RequestMapping @ResponseStatus(HttpStatus.OK) - public void receiveFormForDefaultConfig(@RequestBody String body, HttpServletRequest request) throws EndpointNotSupported { - doReceiveForm(body, request, configService.getDefault()); + public void receiveFormForDefaultConfig(@RequestBody String body, HttpServletRequest request, @RequestParam(value = "app_id", required = false) String appId) throws EndpointNotSupported { + doReceiveForm(body, request, configService.getDefault(), appId); } @RequestMapping(value = "/{configName}") @ResponseStatus(HttpStatus.OK) - public void receiveForm(@RequestBody String body, HttpServletRequest request) throws EndpointNotSupported { - doReceiveForm(body, request, configService.getByName(getConfigName(request))); + public void receiveForm(@RequestBody String body, HttpServletRequest request, @RequestParam(value = "app_id", required = false) String appId) throws EndpointNotSupported { + doReceiveForm(body, request, configService.getByName(getConfigName(request)), appId); } - private void doReceiveForm(String body, HttpServletRequest request, Config config) throws EndpointNotSupported { + private void doReceiveForm(String body, HttpServletRequest request, Config config, String appId) throws EndpointNotSupported { LOGGER.trace("Received request for mapping /forms: {}", body); @@ -64,6 +65,7 @@ private void doReceiveForm(String body, HttpServletRequest request, Config confi try { FormValueElement formValueElement = parser.parse(); + formValueElement.addAttribute("app_id", appId); FullFormEvent fullFormEvent = new FullFormEvent(formValueElement, request.getHeader("received-on"), config.getName()); diff --git a/commcare/src/test/java/org/motechproject/commcare/service/impl/parser/CommcareEventParsersTest.java b/commcare/src/test/java/org/motechproject/commcare/service/impl/parser/CommcareEventParsersTest.java index 4a87cc28e..5bbd0e3c4 100644 --- a/commcare/src/test/java/org/motechproject/commcare/service/impl/parser/CommcareEventParsersTest.java +++ b/commcare/src/test/java/org/motechproject/commcare/service/impl/parser/CommcareEventParsersTest.java @@ -78,8 +78,8 @@ public void setUp() throws EndpointNotSupported { request.setPathInfo("/forms/"+ config.getName()); ArgumentCaptor captor = ArgumentCaptor.forClass(MotechEvent.class); - formsController.receiveForm(ResponseXML.getFormXML(), request); - formsController.receiveForm(ResponseXML.getFormXMLWithRepeatData(), request); + formsController.receiveForm(ResponseXML.getFormXML(), request, null); + formsController.receiveForm(ResponseXML.getFormXMLWithRepeatData(), request, null); request.setContent(ResponseXML.getCaseXML().getBytes()); casesController.receiveCase(request, config.getName()); diff --git a/commcare/src/test/java/org/motechproject/commcare/web/FullFormControllerTest.java b/commcare/src/test/java/org/motechproject/commcare/web/FullFormControllerTest.java index 270b9c14c..a618a4cf9 100644 --- a/commcare/src/test/java/org/motechproject/commcare/web/FullFormControllerTest.java +++ b/commcare/src/test/java/org/motechproject/commcare/web/FullFormControllerTest.java @@ -69,7 +69,7 @@ public void setUp() throws Exception { public void testIncomingFormsFailure() throws EndpointNotSupported { ArgumentCaptor captor = ArgumentCaptor.forClass(MotechEvent.class); - controller.receiveForm("", request); + controller.receiveForm("", request, null); verify(eventRelay, times(2)).sendEventMessage(captor.capture()); } @@ -77,7 +77,7 @@ public void testIncomingFormsFailure() throws EndpointNotSupported { public void testIncomingDeviceReport() throws EndpointNotSupported { ArgumentCaptor captor = ArgumentCaptor.forClass(MotechEvent.class); - controller.receiveForm(ResponseXML.getDeviceReportXML(), request); + controller.receiveForm(ResponseXML.getDeviceReportXML(), request, null); verify(eventRelay).sendEventMessage(captor.capture()); MotechEvent event = captor.getValue(); @@ -94,7 +94,7 @@ public void testIncomingDeviceReport() throws EndpointNotSupported { assertEquals("2012-07-21T15:22:34.046462Z", parameters.get(RECEIVED_ON)); Map attributes = (Map) parameters.get(ATTRIBUTES); - assertEquals(1, attributes.size()); + assertEquals(2, attributes.size()); assertEquals("http://code.javarosa.org/devicereport", attributes.get("xmlns")); Multimap subElements = (Multimap) parameters.get(SUB_ELEMENTS); @@ -107,7 +107,7 @@ public void testIncomingDeviceReport() throws EndpointNotSupported { public void testIncomingFormsSuccess() throws EndpointNotSupported { ArgumentCaptor captor = ArgumentCaptor.forClass(MotechEvent.class); - controller.receiveForm(ResponseXML.getFormXML(), request); + controller.receiveForm(ResponseXML.getFormXML(), request, null); verify(eventRelay).sendEventMessage(captor.capture()); MotechEvent event = captor.getValue(); @@ -126,7 +126,7 @@ public void testIncomingFormsSuccess() throws EndpointNotSupported { assertEquals("2012-07-21T15:22:34.046462Z", parameters.get(RECEIVED_ON)); Map attributes = (Map) parameters.get(ATTRIBUTES); - assertEquals(4, attributes.size()); + assertEquals(5, attributes.size()); assertEquals("1", attributes.get("uiVersion")); assertEquals("41", attributes.get("version")); assertEquals(ResponseXML.FORM_NAME, attributes.get("name")); From 70d12b6d25eb6f7ce95a0787d2ff21bdfc6bc628 Mon Sep 17 00:00:00 2001 From: mkruszynski Date: Mon, 24 Oct 2016 13:19:24 +0200 Subject: [PATCH 104/202] MOTECH-2891: Fixes after review --- .../commcare/events/ReportActionEventHandler.java | 4 +--- .../commcare/tasks/builder/ReportActionBuilder.java | 7 ++----- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/commcare/src/main/java/org/motechproject/commcare/events/ReportActionEventHandler.java b/commcare/src/main/java/org/motechproject/commcare/events/ReportActionEventHandler.java index 5da3eedd3..db338034f 100644 --- a/commcare/src/main/java/org/motechproject/commcare/events/ReportActionEventHandler.java +++ b/commcare/src/main/java/org/motechproject/commcare/events/ReportActionEventHandler.java @@ -7,7 +7,6 @@ import org.motechproject.commcare.events.constants.DisplayNames; import org.motechproject.commcare.events.constants.EventDataKeys; import org.motechproject.commcare.events.constants.EventSubjects; -import org.motechproject.commcare.service.CommcareFormService; import org.motechproject.commcare.service.CommcareReportService; import org.motechproject.event.MotechEvent; import org.motechproject.event.listener.EventRelay; @@ -23,7 +22,7 @@ /** * This class serves as the event handler for the task actions, exposed by the Commcare module. * Respective methods extract the necessary data from the {@link MotechEvent} instance and - * pass them to the {@link CommcareFormService} that handles all the operations on Commcare forms. + * handles all the operations on Commcare reports. */ @Component public class ReportActionEventHandler { @@ -64,7 +63,6 @@ public void receiveReport (MotechEvent event) { eventRelay.sendEventMessage(new MotechEvent(EventSubjects.RECEIVED_REPORT + "." + reportName + "." + reportId, prepareReceiveReportParameters(report, reportId, reportName))); - } private List getFieldNamesFromParameters (Map parameters) { diff --git a/commcare/src/main/java/org/motechproject/commcare/tasks/builder/ReportActionBuilder.java b/commcare/src/main/java/org/motechproject/commcare/tasks/builder/ReportActionBuilder.java index 14c43a5c1..014371e7e 100644 --- a/commcare/src/main/java/org/motechproject/commcare/tasks/builder/ReportActionBuilder.java +++ b/commcare/src/main/java/org/motechproject/commcare/tasks/builder/ReportActionBuilder.java @@ -16,6 +16,7 @@ import org.motechproject.tasks.contract.builder.ActionEventRequestBuilder; import org.motechproject.tasks.contract.builder.ActionParameterRequestBuilder; import org.motechproject.tasks.domain.enums.ParameterType; +import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; @@ -37,6 +38,7 @@ public ReportActionBuilder (CommcareSchemaService schemaService, CommcareConfigS this.configService = configService; } + @Transactional @Override public List buildActions () { List actions = new ArrayList<>(); @@ -78,17 +80,12 @@ private SortedSet buildActionParameters (ReportMetadataI for (ReportMetadataFilter filter : reportMetadata.getFilters()) { if (filter.getDatatype().equals(FilterDataType.DECIMAL) || filter.getDatatype().equals(FilterDataType.INTEGER)) { - parameters.addAll(prepareNumericParameters(filter, order)); order = parameters.size(); - } else if (filter.getType().equals(FilterType.DATE)) { - parameters.addAll(prepareDateParameters(filter, order)); order = parameters.size(); - } else { - parameters.addAll(prepareUnicodeParameters(filter, order)); order = parameters.size(); } From c319630c1e013eabf8a55fc04d172544bd9cd133 Mon Sep 17 00:00:00 2001 From: mkruszynski Date: Mon, 24 Oct 2016 16:47:42 +0200 Subject: [PATCH 105/202] MOTECH-2891: Removed Transactional annotation --- .../commcare/tasks/builder/ReportActionBuilder.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/commcare/src/main/java/org/motechproject/commcare/tasks/builder/ReportActionBuilder.java b/commcare/src/main/java/org/motechproject/commcare/tasks/builder/ReportActionBuilder.java index 014371e7e..12edd3af9 100644 --- a/commcare/src/main/java/org/motechproject/commcare/tasks/builder/ReportActionBuilder.java +++ b/commcare/src/main/java/org/motechproject/commcare/tasks/builder/ReportActionBuilder.java @@ -16,7 +16,6 @@ import org.motechproject.tasks.contract.builder.ActionEventRequestBuilder; import org.motechproject.tasks.contract.builder.ActionParameterRequestBuilder; import org.motechproject.tasks.domain.enums.ParameterType; -import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; @@ -38,7 +37,6 @@ public ReportActionBuilder (CommcareSchemaService schemaService, CommcareConfigS this.configService = configService; } - @Transactional @Override public List buildActions () { List actions = new ArrayList<>(); From c8252f2fa4c447b3d04d03dda469107d371dd566 Mon Sep 17 00:00:00 2001 From: Przemyslaw Kornowski Date: Tue, 25 Oct 2016 08:11:44 +0200 Subject: [PATCH 106/202] MOTECH-2959: Added unit tests for 'create order' action. --- .../resource/impl/OrderResourceImplTest.java | 82 +++++++++++++++++++ .../impl/OpenMRSActionProxyServiceTest.java | 32 +++++++- .../resources/json/order/order-create.json | 8 ++ .../resources/json/order/order-prepare.json | 15 ++++ .../resources/json/order/order-response.json | 15 ++++ 5 files changed, 151 insertions(+), 1 deletion(-) create mode 100644 openmrs/src/test/java/org/motechproject/openmrs/resource/impl/OrderResourceImplTest.java create mode 100644 openmrs/src/test/resources/json/order/order-create.json create mode 100644 openmrs/src/test/resources/json/order/order-prepare.json create mode 100644 openmrs/src/test/resources/json/order/order-response.json diff --git a/openmrs/src/test/java/org/motechproject/openmrs/resource/impl/OrderResourceImplTest.java b/openmrs/src/test/java/org/motechproject/openmrs/resource/impl/OrderResourceImplTest.java new file mode 100644 index 000000000..d24972a19 --- /dev/null +++ b/openmrs/src/test/java/org/motechproject/openmrs/resource/impl/OrderResourceImplTest.java @@ -0,0 +1,82 @@ +package org.motechproject.openmrs.resource.impl; + +import com.google.gson.JsonObject; +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.HttpState; +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.Mock; +import org.motechproject.openmrs.config.Config; +import org.motechproject.openmrs.config.ConfigDummyData; +import org.motechproject.openmrs.domain.Order; +import org.motechproject.openmrs.util.JsonUtils; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpMethod; +import org.springframework.web.client.RestOperations; + +import java.net.URI; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import static org.mockito.MockitoAnnotations.initMocks; + +public class OrderResourceImplTest extends AbstractResourceImplTest { + + private static final String ORDER_RESPONSE = "json/order/order-response.json"; + private static final String PREPARE_ORDER_JSON = "json/order/order-prepare.json"; + private static final String CREATE_ORDER_JSON = "json/order/order-create.json"; + + @Mock + private RestOperations restOperations; + + @Mock + private HttpClient httpClient; + + @Captor + private ArgumentCaptor> requestCaptor; + + private OrderResourceImpl orderResource; + + private Config config; + + @Before + public void setUp() { + initMocks(this); + when(httpClient.getState()).thenReturn(new HttpState()); + + orderResource = new OrderResourceImpl(restOperations, httpClient); + config = ConfigDummyData.prepareConfig("one"); + } + + @Test + public void shouldCreateOrder() throws Exception { + Order order = prepareOrder(); + URI url = config.toInstancePath("/order"); + + when(restOperations.exchange(eq(url), eq(HttpMethod.POST), any(HttpEntity.class), eq(String.class))) + .thenReturn(getResponseFromFile(ORDER_RESPONSE)); + + Order created = orderResource.createOrder(config, order); + + verify(restOperations).exchange(eq(url), eq(HttpMethod.POST), requestCaptor.capture(), eq(String.class)); + + assertEquals(order.getType(), created.getType()); + assertEquals(order.getEncounter(), created.getEncounter()); + assertEquals(order.getOrderer(), created.getOrderer()); + assertEquals(order.getConcept().getUuid(), created.getConcept().getUuid()); + assertEquals(order.getPatient(), created.getPatient()); + + assertEquals(requestCaptor.getValue().getHeaders(), getHeadersForPost(config)); + assertEquals(JsonUtils.readJson(requestCaptor.getValue().getBody(), JsonObject.class), + readFromFile(CREATE_ORDER_JSON, JsonObject.class)); + } + + private Order prepareOrder() throws Exception { + return (Order) readFromFile(PREPARE_ORDER_JSON, Order.class); + } +} \ No newline at end of file diff --git a/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java b/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java index 07d796006..aac3d98c4 100644 --- a/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java +++ b/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java @@ -26,6 +26,7 @@ import org.motechproject.openmrs.domain.IdentifierType; import org.motechproject.openmrs.domain.Location; import org.motechproject.openmrs.domain.Observation; +import org.motechproject.openmrs.domain.Order; import org.motechproject.openmrs.domain.Patient; import org.motechproject.openmrs.domain.Person; import org.motechproject.openmrs.domain.Program; @@ -39,6 +40,7 @@ import org.motechproject.openmrs.service.OpenMRSFormService; import org.motechproject.openmrs.service.OpenMRSLocationService; import org.motechproject.openmrs.service.OpenMRSObservationService; +import org.motechproject.openmrs.service.OpenMRSOrderService; import org.motechproject.openmrs.service.OpenMRSPatientService; import org.motechproject.openmrs.service.OpenMRSPersonService; import org.motechproject.openmrs.service.OpenMRSProgramEnrollmentService; @@ -86,6 +88,9 @@ public class OpenMRSActionProxyServiceTest { @Mock private OpenMRSObservationService observationService; + @Mock + private OpenMRSOrderService orderService; + @Mock private OpenMRSVisitService visitService; @@ -113,6 +118,9 @@ public class OpenMRSActionProxyServiceTest { @Captor private ArgumentCaptor observationCaptor; + @Captor + private ArgumentCaptor orderCaptor; + @Captor private ArgumentCaptor visitCaptor; @@ -697,6 +705,28 @@ public void shouldGetCohortQueryReportWithGivenParameters() { assertEquals(createEventForMember(cohortQueryUuid, prepareCohortQueryReportMember("2")), capturedEvents.get(1)); } + @Test + public void shouldCreateOrderWithGivenParameters() { + + Patient patient = new Patient(); + patient.setUuid("10"); + + Provider provider = new Provider(); + provider.setUuid("20"); + + Encounter encounter = new Encounter(); + encounter.setUuid("50"); + + Concept concept = createTestConcept("60"); + + Order order = new Order("order", encounter, provider, patient, concept, Order.CareSetting.INPATIENT); + + doReturn(order).when(orderService).createOrder(eq(CONFIG_NAME), eq(order)); + Order orderCreated = openMRSActionProxyService.createOrder(CONFIG_NAME, "order", encounter.getUuid(), patient.getUuid(), concept.getUuid(), provider.getUuid(), Order.CareSetting.INPATIENT.toString()); + + assertEquals(order, orderCreated); + } + private Person createTestPerson() { Person person = new Person(); @@ -796,4 +826,4 @@ private MotechEvent createEventForMember(String cohortQueryUuid, CohortQueryRepo return new MotechEvent(EventSubjects.GET_COHORT_QUERY_MEMBER_EVENT.concat(CONFIG_NAME), parameters); } -} +} \ No newline at end of file diff --git a/openmrs/src/test/resources/json/order/order-create.json b/openmrs/src/test/resources/json/order/order-create.json new file mode 100644 index 000000000..ec3a2b635 --- /dev/null +++ b/openmrs/src/test/resources/json/order/order-create.json @@ -0,0 +1,8 @@ +{ + "type": "order", + "patient": "p123456-2821-4334-ab85-eef3cd8fea8c", + "concept": "c123456-2821-4334-ab85-eef3cd8fea8c", + "orderer": "o123456-2821-4334-ab85-eef3cd8fea8c", + "encounter": "e123456-2821-4334-ab85-eef3cd8fea8c" + +} \ No newline at end of file diff --git a/openmrs/src/test/resources/json/order/order-prepare.json b/openmrs/src/test/resources/json/order/order-prepare.json new file mode 100644 index 000000000..d4df589d3 --- /dev/null +++ b/openmrs/src/test/resources/json/order/order-prepare.json @@ -0,0 +1,15 @@ +{ + "type": "order", + "patient": { + "uuid": "p123456-2821-4334-ab85-eef3cd8fea8c" + }, + "concept": { + "uuid": "c123456-2821-4334-ab85-eef3cd8fea8c" + }, + "orderer": { + "uuid": "o123456-2821-4334-ab85-eef3cd8fea8c" + }, + "encounter": { + "uuid": "e123456-2821-4334-ab85-eef3cd8fea8c" + } +} \ No newline at end of file diff --git a/openmrs/src/test/resources/json/order/order-response.json b/openmrs/src/test/resources/json/order/order-response.json new file mode 100644 index 000000000..d4df589d3 --- /dev/null +++ b/openmrs/src/test/resources/json/order/order-response.json @@ -0,0 +1,15 @@ +{ + "type": "order", + "patient": { + "uuid": "p123456-2821-4334-ab85-eef3cd8fea8c" + }, + "concept": { + "uuid": "c123456-2821-4334-ab85-eef3cd8fea8c" + }, + "orderer": { + "uuid": "o123456-2821-4334-ab85-eef3cd8fea8c" + }, + "encounter": { + "uuid": "e123456-2821-4334-ab85-eef3cd8fea8c" + } +} \ No newline at end of file From 2bb9e5023b30d27230b0231cf9efadcf1d2efa9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Ja=C5=BCd=C5=BCewski?= Date: Thu, 27 Oct 2016 13:08:05 +0200 Subject: [PATCH 107/202] Added app_id to FullFormControllerTest --- .../motechproject/commcare/web/FullFormControllerTest.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/commcare/src/test/java/org/motechproject/commcare/web/FullFormControllerTest.java b/commcare/src/test/java/org/motechproject/commcare/web/FullFormControllerTest.java index a618a4cf9..2bfed5794 100644 --- a/commcare/src/test/java/org/motechproject/commcare/web/FullFormControllerTest.java +++ b/commcare/src/test/java/org/motechproject/commcare/web/FullFormControllerTest.java @@ -77,7 +77,7 @@ public void testIncomingFormsFailure() throws EndpointNotSupported { public void testIncomingDeviceReport() throws EndpointNotSupported { ArgumentCaptor captor = ArgumentCaptor.forClass(MotechEvent.class); - controller.receiveForm(ResponseXML.getDeviceReportXML(), request, null); + controller.receiveForm(ResponseXML.getDeviceReportXML(), request, DummyCommcareSchema.APP_ID1); verify(eventRelay).sendEventMessage(captor.capture()); MotechEvent event = captor.getValue(); @@ -96,6 +96,7 @@ public void testIncomingDeviceReport() throws EndpointNotSupported { Map attributes = (Map) parameters.get(ATTRIBUTES); assertEquals(2, attributes.size()); assertEquals("http://code.javarosa.org/devicereport", attributes.get("xmlns")); + assertEquals(DummyCommcareSchema.APP_ID1, attributes.get("app_id")); Multimap subElements = (Multimap) parameters.get(SUB_ELEMENTS); assertEquals(1, subElements.size()); @@ -107,7 +108,7 @@ public void testIncomingDeviceReport() throws EndpointNotSupported { public void testIncomingFormsSuccess() throws EndpointNotSupported { ArgumentCaptor captor = ArgumentCaptor.forClass(MotechEvent.class); - controller.receiveForm(ResponseXML.getFormXML(), request, null); + controller.receiveForm(ResponseXML.getFormXML(), request, DummyCommcareSchema.APP_ID1); verify(eventRelay).sendEventMessage(captor.capture()); MotechEvent event = captor.getValue(); @@ -131,6 +132,7 @@ public void testIncomingFormsSuccess() throws EndpointNotSupported { assertEquals("41", attributes.get("version")); assertEquals(ResponseXML.FORM_NAME, attributes.get("name")); assertEquals(DummyCommcareSchema.XMLNS1, attributes.get("xmlns")); + assertEquals(DummyCommcareSchema.APP_ID1, attributes.get("app_id")); Multimap subElements = (Multimap) parameters.get(SUB_ELEMENTS); assertEquals(5, subElements.size()); From d45fd7309695c638b92e6128b652493438829ab7 Mon Sep 17 00:00:00 2001 From: Michal Date: Thu, 27 Oct 2016 13:32:32 +0200 Subject: [PATCH 108/202] MOTECH-2858: Added action for OpenMRS Feeds Added new action to get and paginate OpenMRS Feeds --- .../atomclient/service/AtomClientService.java | 3 ++ .../atomclient/service/Constants.java | 1 + .../service/impl/AtomClientEventHandler.java | 15 ++++++++++ .../service/impl/AtomClientServiceImpl.java | 30 +++++++++++++++++++ .../src/main/resources/task-channel.json | 14 +++++++++ .../webapp/messages/messages.properties | 3 ++ 6 files changed, 66 insertions(+) diff --git a/atom-client/src/main/java/org/motechproject/atomclient/service/AtomClientService.java b/atom-client/src/main/java/org/motechproject/atomclient/service/AtomClientService.java index 558ea95dc..d04bc9d4f 100644 --- a/atom-client/src/main/java/org/motechproject/atomclient/service/AtomClientService.java +++ b/atom-client/src/main/java/org/motechproject/atomclient/service/AtomClientService.java @@ -15,6 +15,9 @@ public interface AtomClientService { */ void scheduleFetchJob(String cronExpression); + + void read(String currentUrl, String lastUrl); + /** * Fetches the atom feed(s) specified in atom-client-feeds.json setting file. * diff --git a/atom-client/src/main/java/org/motechproject/atomclient/service/Constants.java b/atom-client/src/main/java/org/motechproject/atomclient/service/Constants.java index d2cabb8b4..8a4233838 100644 --- a/atom-client/src/main/java/org/motechproject/atomclient/service/Constants.java +++ b/atom-client/src/main/java/org/motechproject/atomclient/service/Constants.java @@ -7,6 +7,7 @@ public final class Constants { public static final String FETCH_CRON_PROPERTY = "atomclient.feed.cron"; public static final String BASE_ATOMCLIENT_SUBJECT = "org.motechproject.atomclient"; public static final String FETCH_MESSAGE = BASE_ATOMCLIENT_SUBJECT + ".fetch"; + public static final String READ_MESSAGE = BASE_ATOMCLIENT_SUBJECT + ".read"; public static final String FEED_CHANGE_MESSAGE = BASE_ATOMCLIENT_SUBJECT + ".feedchange"; public static final String RESCHEDULE_FETCH_JOB = BASE_ATOMCLIENT_SUBJECT + ".reschedulefetchjob"; } diff --git a/atom-client/src/main/java/org/motechproject/atomclient/service/impl/AtomClientEventHandler.java b/atom-client/src/main/java/org/motechproject/atomclient/service/impl/AtomClientEventHandler.java index 4b248a62b..b21acea2b 100644 --- a/atom-client/src/main/java/org/motechproject/atomclient/service/impl/AtomClientEventHandler.java +++ b/atom-client/src/main/java/org/motechproject/atomclient/service/impl/AtomClientEventHandler.java @@ -12,6 +12,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.util.Map; + /** * Handles: * - (raw or text) config changes by triggering the reload of the appropriate configuration items @@ -25,6 +27,8 @@ public class AtomClientEventHandler { private AtomClientConfigService atomClientConfigService; private AtomClientService atomClientService; + private static final String CURRENT_URL = "currentFeedUrl"; + private static final String LAST_URL = "lastFeedUrl"; @Autowired public void setAtomClientConfigService(AtomClientConfigService atomClientConfigService) { @@ -72,4 +76,15 @@ public void handleFetch(MotechEvent event) { atomClientService.fetch(); } + + @MotechListener(subjects = { Constants.READ_MESSAGE }) + public void handleRead(MotechEvent event) { + LOGGER.trace("handleRead {}", event); + Map params = event.getParameters(); + + String currentUrl = (String) params.get(CURRENT_URL); + String lastUrl = (String) params.get(LAST_URL); + + atomClientService.read(currentUrl, lastUrl); + } } diff --git a/atom-client/src/main/java/org/motechproject/atomclient/service/impl/AtomClientServiceImpl.java b/atom-client/src/main/java/org/motechproject/atomclient/service/impl/AtomClientServiceImpl.java index e7e927218..0893297ee 100644 --- a/atom-client/src/main/java/org/motechproject/atomclient/service/impl/AtomClientServiceImpl.java +++ b/atom-client/src/main/java/org/motechproject/atomclient/service/impl/AtomClientServiceImpl.java @@ -4,11 +4,13 @@ import com.rometools.fetcher.FetcherException; import com.rometools.fetcher.impl.HttpURLFeedFetcher; import com.rometools.rome.io.FeedException; +import org.motechproject.atomclient.domain.FeedRecord; import org.motechproject.atomclient.repository.FeedRecordDataService; import org.motechproject.atomclient.service.AtomClientConfigService; import org.motechproject.atomclient.service.AtomClientService; import org.motechproject.atomclient.service.Constants; import org.motechproject.atomclient.service.FeedConfig; +import org.motechproject.atomclient.service.FeedConfigs; import org.motechproject.event.MotechEvent; import org.motechproject.event.listener.EventRelay; import org.motechproject.scheduler.contract.CronJobId; @@ -24,6 +26,8 @@ import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; +import java.util.Arrays; +import java.util.HashSet; @Service("atomClientService") @@ -34,14 +38,17 @@ public class AtomClientServiceImpl implements AtomClientService { private AtomClientConfigService configService; private MotechSchedulerService motechSchedulerService; private FeedFetcher feedFetcher; + private FeedRecordDataService feedRecordDataService; @Autowired public AtomClientServiceImpl(FeedRecordDataService feedRecordDataService, EventRelay eventRelay, AtomClientConfigService configService, MotechSchedulerService motechSchedulerService) { feedFetcher = new HttpURLFeedFetcher(new FeedCache(feedRecordDataService, eventRelay, configService)); + feedFetcher.setAllowDoctypes(true); this.configService = configService; this.motechSchedulerService = motechSchedulerService; + this.feedRecordDataService = feedRecordDataService; } @@ -64,6 +71,29 @@ public void scheduleFetchJob(String cronExpression) { LOGGER.info("The fetch job cron is {}", cronExpression); } + @Override + @Transactional + public void read(String currentUrl, String lastUrl) { + FeedConfig[] feeds = new FeedConfig[2]; + + feeds[0] = new FeedConfig(currentUrl, "/([0-9a-f-]*)\\?"); + feeds[1] = new FeedConfig(lastUrl, "/([0-9a-f-]*)\\?"); + configService.setFeedConfigs(new FeedConfigs(new HashSet<>(Arrays.asList(feeds)))); + fetch(); + + FeedRecord feedRecord = feedRecordDataService.findByURL(currentUrl); + String currenData = feedRecord.getData(); + int currentPage = feedRecord.getPage(currenData); + + feedRecord = feedRecordDataService.findByURL(currentUrl); + String lastData = feedRecord.getData(); + int lastPage = feedRecord.getPage(lastData); + + configService.readNewFeeds(currentPage, lastPage, currentUrl); + fetch(); + + } + @Override @Transactional diff --git a/atom-client/src/main/resources/task-channel.json b/atom-client/src/main/resources/task-channel.json index f6897444e..c0ebccadb 100644 --- a/atom-client/src/main/resources/task-channel.json +++ b/atom-client/src/main/resources/task-channel.json @@ -35,6 +35,20 @@ "subject" : "org.motechproject.atomclient.fetch", "displayName" : "atomclient.task.feed.fetch", "actionParameters" : [ ] + }, + { + "subject" : "org.motechproject.atomclient.read", + "displayName" : "atomclient.task.feed.read", + "actionParameters" : [ + { + "key" : "currentFeedUrl", + "displayName" : "atomclient.task.feed.read.current_url" + }, + { + "key" : "lastFeedUrl", + "displayName" : "atomclient.task.feed.read.last_url" + } + ] } ] } diff --git a/atom-client/src/main/resources/webapp/messages/messages.properties b/atom-client/src/main/resources/webapp/messages/messages.properties index 1218f015c..a7c6a92a0 100644 --- a/atom-client/src/main/resources/webapp/messages/messages.properties +++ b/atom-client/src/main/resources/webapp/messages/messages.properties @@ -9,4 +9,7 @@ atomclient.task.feed.change.published_date=Published Date atomclient.task.feed.change.updated_date=Updated Date atomclient.task.feed.change.raw_content=Raw Content atomclient.task.feed.change.extracted_content=Extracted Content +atomclient.task.feed.read.current_url= Current OpeMRS Feed Url +atomclient.task.feed.read.last_url= Recent OpeMRS Feed Url atomclient.task.feed.fetch=Fetch! +atomclient.task.feed.read= Read OpenMRS \ No newline at end of file From bee4bd0af2426a849397a0a1fe590ff444a57722 Mon Sep 17 00:00:00 2001 From: Michal Date: Thu, 27 Oct 2016 14:32:57 +0200 Subject: [PATCH 109/202] MOTECH-2858: Added javadoc for new methods --- .../service/AtomClientConfigService.java | 9 ++++++- .../atomclient/service/AtomClientService.java | 8 +++--- .../service/impl/AtomClientEventHandler.java | 5 ++-- .../service/impl/AtomClientServiceImpl.java | 2 +- .../webapp/messages/messages.properties | 2 +- .../it/AtomClientServiceBundleIT.java | 26 ------------------- 6 files changed, 17 insertions(+), 35 deletions(-) diff --git a/atom-client/src/main/java/org/motechproject/atomclient/service/AtomClientConfigService.java b/atom-client/src/main/java/org/motechproject/atomclient/service/AtomClientConfigService.java index e7c6868d8..137bf26f1 100644 --- a/atom-client/src/main/java/org/motechproject/atomclient/service/AtomClientConfigService.java +++ b/atom-client/src/main/java/org/motechproject/atomclient/service/AtomClientConfigService.java @@ -53,5 +53,12 @@ public interface AtomClientConfigService { */ String getRegexForFeedUrl(String url); - void readNewFeeds (int currentPage, int recentPage, String feedUrl); + /** + * Sets the module's feed configurations, based on pages that should be consumed. + * + * @param currentPage last page that is already loaded to module + * @param recentPage recent available page that can be consumed + * @param feedUrl the feed URL + */ + void readNewFeeds(int currentPage, int recentPage, String feedUrl); } diff --git a/atom-client/src/main/java/org/motechproject/atomclient/service/AtomClientService.java b/atom-client/src/main/java/org/motechproject/atomclient/service/AtomClientService.java index d04bc9d4f..767a870fd 100644 --- a/atom-client/src/main/java/org/motechproject/atomclient/service/AtomClientService.java +++ b/atom-client/src/main/java/org/motechproject/atomclient/service/AtomClientService.java @@ -15,9 +15,6 @@ public interface AtomClientService { */ void scheduleFetchJob(String cronExpression); - - void read(String currentUrl, String lastUrl); - /** * Fetches the atom feed(s) specified in atom-client-feeds.json setting file. * @@ -25,4 +22,9 @@ public interface AtomClientService { * changed since the last time the feed was fetched. */ void fetch(); + + /** + * Reads the atom feed(s) specified in task action. + */ + void read(String currentUrl, String lastUrl); } diff --git a/atom-client/src/main/java/org/motechproject/atomclient/service/impl/AtomClientEventHandler.java b/atom-client/src/main/java/org/motechproject/atomclient/service/impl/AtomClientEventHandler.java index b21acea2b..cc8a714ca 100644 --- a/atom-client/src/main/java/org/motechproject/atomclient/service/impl/AtomClientEventHandler.java +++ b/atom-client/src/main/java/org/motechproject/atomclient/service/impl/AtomClientEventHandler.java @@ -24,11 +24,10 @@ public class AtomClientEventHandler { private static final Logger LOGGER = LoggerFactory.getLogger(AtomClientEventHandler.class); - private AtomClientConfigService atomClientConfigService; - private AtomClientService atomClientService; - private static final String CURRENT_URL = "currentFeedUrl"; private static final String LAST_URL = "lastFeedUrl"; + private AtomClientConfigService atomClientConfigService; + private AtomClientService atomClientService; @Autowired public void setAtomClientConfigService(AtomClientConfigService atomClientConfigService) { diff --git a/atom-client/src/main/java/org/motechproject/atomclient/service/impl/AtomClientServiceImpl.java b/atom-client/src/main/java/org/motechproject/atomclient/service/impl/AtomClientServiceImpl.java index 0893297ee..1a93911de 100644 --- a/atom-client/src/main/java/org/motechproject/atomclient/service/impl/AtomClientServiceImpl.java +++ b/atom-client/src/main/java/org/motechproject/atomclient/service/impl/AtomClientServiceImpl.java @@ -71,6 +71,7 @@ public void scheduleFetchJob(String cronExpression) { LOGGER.info("The fetch job cron is {}", cronExpression); } + @Override @Transactional public void read(String currentUrl, String lastUrl) { @@ -91,7 +92,6 @@ public void read(String currentUrl, String lastUrl) { configService.readNewFeeds(currentPage, lastPage, currentUrl); fetch(); - } diff --git a/atom-client/src/main/resources/webapp/messages/messages.properties b/atom-client/src/main/resources/webapp/messages/messages.properties index a7c6a92a0..00c50180d 100644 --- a/atom-client/src/main/resources/webapp/messages/messages.properties +++ b/atom-client/src/main/resources/webapp/messages/messages.properties @@ -12,4 +12,4 @@ atomclient.task.feed.change.extracted_content=Extracted Content atomclient.task.feed.read.current_url= Current OpeMRS Feed Url atomclient.task.feed.read.last_url= Recent OpeMRS Feed Url atomclient.task.feed.fetch=Fetch! -atomclient.task.feed.read= Read OpenMRS \ No newline at end of file +atomclient.task.feed.read= Read OpenMRS Feeds diff --git a/atom-client/src/test/java/org/motechproject/atomclient/it/AtomClientServiceBundleIT.java b/atom-client/src/test/java/org/motechproject/atomclient/it/AtomClientServiceBundleIT.java index 28da603ff..6b4b193d3 100644 --- a/atom-client/src/test/java/org/motechproject/atomclient/it/AtomClientServiceBundleIT.java +++ b/atom-client/src/test/java/org/motechproject/atomclient/it/AtomClientServiceBundleIT.java @@ -172,30 +172,4 @@ public void verifySuccessiveFetches() { String data3 = feedRecord.getData(); assertThat(data3, is(not(data2))); } - - @Test - public void verifyPagination() { - - assertEquals(feedRecordDataService.count(), 0); - - String feedUrl = "https://emrdemo.bahmni.org/openmrs/ws/atomfeed/patient/19"; - configService.setFeedConfigs(new FeedConfigs(new HashSet<>(Arrays.asList(new FeedConfig(feedUrl, "/([0-9a-f-]*)\\?"))))); - atomClientService.fetch(); - - FeedRecord feedRecord = feedRecordDataService.findByURL(feedUrl); - assertNotNull(feedRecord); - String data1 = feedRecord.getData(); - int currentPage = feedRecord.getPage(data1); - - feedUrl = "https://emrdemo.bahmni.org/openmrs/ws/atomfeed/patient/recent"; - configService.setFeedConfigs(new FeedConfigs(new HashSet<>(Arrays.asList(new FeedConfig(feedUrl, "/([0-9a-f-]*)\\?"))))); - atomClientService.fetch(); - - feedRecord = feedRecordDataService.findByURL(feedUrl); - assertNotNull(feedRecord); - String data2 = feedRecord.getData(); - int recentPage = feedRecord.getPage(data2); - configService.readNewFeeds(currentPage,recentPage,feedUrl); - atomClientService.fetch(); - } } \ No newline at end of file From 649dd0f6a02c1638bfe6c22aa256e7bf56143d01 Mon Sep 17 00:00:00 2001 From: mkruszynski Date: Fri, 28 Oct 2016 13:55:35 +0200 Subject: [PATCH 110/202] MOTECH-2892: Created Report Task Trigger for CommCare's UCR API --- .../events/ReportActionEventHandler.java | 36 ++---- .../events/constants/EventDataKeys.java | 1 - .../commcare/service/ReportActionService.java | 19 +++ .../service/impl/ReportActionServiceImpl.java | 44 +++++++ .../tasks/CommcareActionProxyService.java | 5 + .../tasks/builder/ChannelRequestBuilder.java | 2 + .../tasks/builder/ReportTriggerBuilder.java | 80 +++++++++++++ .../impl/CommcareActionProxyServiceImpl.java | 11 +- .../events/ReportActionEventHandlerTest.java | 71 +++++++++++ .../builder/ReportTriggerBuilderTest.java | 104 ++++++++++++++++ .../commcare/util/DummyCommcareSchema.java | 112 ++++++++++++++++++ 11 files changed, 459 insertions(+), 26 deletions(-) create mode 100644 commcare/src/main/java/org/motechproject/commcare/service/ReportActionService.java create mode 100644 commcare/src/main/java/org/motechproject/commcare/service/impl/ReportActionServiceImpl.java create mode 100644 commcare/src/main/java/org/motechproject/commcare/tasks/builder/ReportTriggerBuilder.java create mode 100644 commcare/src/test/java/org/motechproject/commcare/events/ReportActionEventHandlerTest.java create mode 100644 commcare/src/test/java/org/motechproject/commcare/tasks/builder/ReportTriggerBuilderTest.java diff --git a/commcare/src/main/java/org/motechproject/commcare/events/ReportActionEventHandler.java b/commcare/src/main/java/org/motechproject/commcare/events/ReportActionEventHandler.java index db338034f..18fb6c371 100644 --- a/commcare/src/main/java/org/motechproject/commcare/events/ReportActionEventHandler.java +++ b/commcare/src/main/java/org/motechproject/commcare/events/ReportActionEventHandler.java @@ -1,21 +1,18 @@ package org.motechproject.commcare.events; import org.joda.time.DateTime; -import org.motechproject.commcare.domain.report.ReportDataInfo; import org.motechproject.commcare.domain.report.constants.FilterDataType; import org.motechproject.commcare.domain.report.constants.FilterType; import org.motechproject.commcare.events.constants.DisplayNames; import org.motechproject.commcare.events.constants.EventDataKeys; import org.motechproject.commcare.events.constants.EventSubjects; -import org.motechproject.commcare.service.CommcareReportService; +import org.motechproject.commcare.service.ReportActionService; import org.motechproject.event.MotechEvent; -import org.motechproject.event.listener.EventRelay; import org.motechproject.event.listener.annotations.MotechListener; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -24,6 +21,11 @@ * Respective methods extract the necessary data from the {@link MotechEvent} instance and * handles all the operations on Commcare reports. */ +/** + * Class responsible for handling "Report" events. The service will extract the necessary data + * from the {@link MotechEvent} and pass them to the {@link ReportActionService} service that will + * query the CommCare Report UCR API and then send a motech event for selected report. + */ @Component public class ReportActionEventHandler { @@ -34,14 +36,13 @@ public class ReportActionEventHandler { private static final String NUMERIC_OPERAND_FILTER_SUFFIX = "-operand"; private static final String COMMCARE_REPORT_FILTER_DATE_FORMAT = "yyyy-MM-dd"; - private CommcareReportService commcareReportService; - private EventRelay eventRelay; + private ReportActionService reportActionService; @Autowired - public ReportActionEventHandler (CommcareReportService commcareReportService, EventRelay eventRelay) { - this.commcareReportService = commcareReportService; - this.eventRelay = eventRelay; + public ReportActionEventHandler (ReportActionService reportActionService) { + this.reportActionService = reportActionService; } + /** * Handles events, connected with getting Commcare report. The event subject should have the following syntax: * {@code EventSubjects.REPORT_EVENT.report_name.config_name} @@ -59,10 +60,7 @@ public void receiveReport (MotechEvent event) { String parsedFilters = convertFieldsToRequest(fields, parameters); - ReportDataInfo report = commcareReportService.getReportByIdWithFilters(reportId, configName, parsedFilters); - - eventRelay.sendEventMessage(new MotechEvent(EventSubjects.RECEIVED_REPORT + "." + reportName + "." + reportId, - prepareReceiveReportParameters(report, reportId, reportName))); + reportActionService.queryReport(configName, reportId, reportName, parsedFilters); } private List getFieldNamesFromParameters (Map parameters) { @@ -93,7 +91,7 @@ private String convertFieldsToRequest (List fieldNames, Map paramete return parsedNumericFilterBuilder.toString(); } - - private Map prepareReceiveReportParameters (ReportDataInfo report, String reportId, String reportName) { - Map parameters = new HashMap<>(); - - parameters.put(EventDataKeys.REPORT_ID, reportId); - parameters.put(EventDataKeys.REPORT_NAME, reportName); - parameters.put(EventDataKeys.REPORT_DATA, report); - - return parameters; - } } diff --git a/commcare/src/main/java/org/motechproject/commcare/events/constants/EventDataKeys.java b/commcare/src/main/java/org/motechproject/commcare/events/constants/EventDataKeys.java index 217c8fdb6..12edd564e 100644 --- a/commcare/src/main/java/org/motechproject/commcare/events/constants/EventDataKeys.java +++ b/commcare/src/main/java/org/motechproject/commcare/events/constants/EventDataKeys.java @@ -74,7 +74,6 @@ public final class EventDataKeys { //ReportEvent public static final String REPORT_ID = "report_id"; public static final String REPORT_NAME = "report_name"; - public static final String REPORT_DATA = "report_data"; /** * Utility class, should not be initiated. diff --git a/commcare/src/main/java/org/motechproject/commcare/service/ReportActionService.java b/commcare/src/main/java/org/motechproject/commcare/service/ReportActionService.java new file mode 100644 index 000000000..59fad0393 --- /dev/null +++ b/commcare/src/main/java/org/motechproject/commcare/service/ReportActionService.java @@ -0,0 +1,19 @@ +package org.motechproject.commcare.service; + +/** + * This service is responsible for handling Commcare report actions in tasks. + */ +public interface ReportActionService { + + /** + * This task action allows to query the Commcare Report UCR API. + * When the report is queried, is parsed by MOTECH and a Received Report + * event is raised. + * + * @param configName the name of the configuration used for connecting to CommcareHQ + * @param reportId the Id of report + * @param reportName the name of report + * @param urlParsedFilters parsed filter fields used in requests url + */ + void queryReport (String configName, String reportId, String reportName, String urlParsedFilters); +} diff --git a/commcare/src/main/java/org/motechproject/commcare/service/impl/ReportActionServiceImpl.java b/commcare/src/main/java/org/motechproject/commcare/service/impl/ReportActionServiceImpl.java new file mode 100644 index 000000000..6379d4cdf --- /dev/null +++ b/commcare/src/main/java/org/motechproject/commcare/service/impl/ReportActionServiceImpl.java @@ -0,0 +1,44 @@ +package org.motechproject.commcare.service.impl; + +import org.motechproject.commcare.events.constants.EventDataKeys; +import org.motechproject.commcare.events.constants.EventSubjects; +import org.motechproject.commcare.service.CommcareReportService; +import org.motechproject.commcare.service.ReportActionService; +import org.motechproject.event.MotechEvent; +import org.motechproject.event.listener.EventRelay; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.Map; + +@Service("reportActionService") +public class ReportActionServiceImpl implements ReportActionService { + + private CommcareReportService commcareReportService; + private EventRelay eventRelay; + + @Autowired + public ReportActionServiceImpl (CommcareReportService commcareReportService, EventRelay eventRelay) { + this.commcareReportService = commcareReportService; + this.eventRelay = eventRelay; + } + + @Override + public void queryReport (String configName, String reportId, String reportName, String urlParsedFilters) { + + commcareReportService.getReportByIdWithFilters(reportId, configName, urlParsedFilters); + + eventRelay.sendEventMessage(new MotechEvent(EventSubjects.RECEIVED_REPORT + "." + configName + "." + reportId, + prepareReceiveReportParameters(reportId, reportName))); + } + + private Map prepareReceiveReportParameters (String reportId, String reportName) { + Map parameters = new HashMap<>(); + + parameters.put(EventDataKeys.REPORT_ID, reportId); + parameters.put(EventDataKeys.REPORT_NAME, reportName); + + return parameters; + } +} diff --git a/commcare/src/main/java/org/motechproject/commcare/tasks/CommcareActionProxyService.java b/commcare/src/main/java/org/motechproject/commcare/tasks/CommcareActionProxyService.java index a56f8397d..41758ae6c 100644 --- a/commcare/src/main/java/org/motechproject/commcare/tasks/CommcareActionProxyService.java +++ b/commcare/src/main/java/org/motechproject/commcare/tasks/CommcareActionProxyService.java @@ -30,4 +30,9 @@ public interface CommcareActionProxyService { * See {@link org.motechproject.commcare.service.QueryStockLedgerActionService#queryStockLedger(String, String, String, DateTime, DateTime, Map) queryStockLedger} */ void queryStockLedger(String configName, String caseId, String sectionId, DateTime startDate, DateTime endDate, Map extraData); + + /** + * See {@link org.motechproject.commcare.service.ReportActionService#queryReport(String, String, String, String)} + */ + void queryReport (String configName, String reportId, String reportName, String urlParsedFilters); } diff --git a/commcare/src/main/java/org/motechproject/commcare/tasks/builder/ChannelRequestBuilder.java b/commcare/src/main/java/org/motechproject/commcare/tasks/builder/ChannelRequestBuilder.java index 5b7231f67..5386fd4e3 100644 --- a/commcare/src/main/java/org/motechproject/commcare/tasks/builder/ChannelRequestBuilder.java +++ b/commcare/src/main/java/org/motechproject/commcare/tasks/builder/ChannelRequestBuilder.java @@ -49,6 +49,7 @@ public ChannelRequest buildChannelRequest() { FormTriggerBuilder formTriggerBuilder = new FormTriggerBuilder(schemaService, configService); CaseTriggerBuilder caseTriggerBuilder = new CaseTriggerBuilder(schemaService, configService); + ReportTriggerBuilder reportTriggerBuilder = new ReportTriggerBuilder(schemaService, configService); CommonTriggerBuilder commonTriggerBuilder = new CommonTriggerBuilder(configService); // Actions @@ -60,6 +61,7 @@ public ChannelRequest buildChannelRequest() { List triggers = formTriggerBuilder.buildTriggers(); triggers.addAll(caseTriggerBuilder.buildTriggers()); + triggers.addAll(reportTriggerBuilder.buildTriggers()); triggers.addAll(commonTriggerBuilder.buildTriggers()); List actions = new ArrayList<>(); diff --git a/commcare/src/main/java/org/motechproject/commcare/tasks/builder/ReportTriggerBuilder.java b/commcare/src/main/java/org/motechproject/commcare/tasks/builder/ReportTriggerBuilder.java new file mode 100644 index 000000000..0823d7285 --- /dev/null +++ b/commcare/src/main/java/org/motechproject/commcare/tasks/builder/ReportTriggerBuilder.java @@ -0,0 +1,80 @@ +package org.motechproject.commcare.tasks.builder; + +import org.motechproject.commcare.config.Config; +import org.motechproject.commcare.domain.report.ReportMetadataColumn; +import org.motechproject.commcare.domain.report.ReportMetadataInfo; +import org.motechproject.commcare.domain.report.ReportsMetadataInfo; +import org.motechproject.commcare.events.constants.EventSubjects; +import org.motechproject.commcare.service.CommcareConfigService; +import org.motechproject.commcare.service.CommcareSchemaService; +import org.motechproject.tasks.contract.EventParameterRequest; +import org.motechproject.tasks.contract.TriggerEventRequest; + +import java.util.ArrayList; +import java.util.List; + +import static org.motechproject.commcare.events.constants.EventDataKeys.CONFIG_NAME; + +/** + * The ReportTriggerBuilder class builds report triggers for each report + * present in MOTECH database. Each trigger has got its own attributes, depending on + * the case properties of each type. Some fields are common for all reports. + */ +public class ReportTriggerBuilder implements TriggerBuilder { + + private CommcareSchemaService schemaService; + private CommcareConfigService configService; + + private static final String RECEIVED_CASE = "Received Report"; + private static final String COLUMN_NAME_SUFFIX = " Column Name"; + + /** + * Creates an instance of the {@link ReportTriggerBuilder} class. It will use the given {@code schemaService} and + * {@code configService} for creating report triggers. + * + * @param schemaService the schema service + * @param configService the configuration service + */ + public ReportTriggerBuilder (CommcareSchemaService schemaService, CommcareConfigService configService) { + this.schemaService = schemaService; + this.configService = configService; + } + + @Override + public List buildTriggers () { + List triggers = new ArrayList<>(); + + for (Config config : configService.getConfigs().getConfigs()) { + triggers.addAll(buildTriggersForConfig(config)); + } + + return triggers; + } + + private List buildTriggersForConfig (Config config) { + List triggers = new ArrayList<>(); + + for (ReportsMetadataInfo reportMetadataInfo : schemaService.getReportsMetadata(config.getName())) { + for (ReportMetadataInfo reportMetadata : reportMetadataInfo.getReportMetadataInfoList()) { + String displayName = DisplayNameHelper.buildDisplayName(RECEIVED_CASE, reportMetadata.getTitle(), + config.getName()); + triggers.add(new TriggerEventRequest(displayName, EventSubjects.RECEIVED_REPORT + "." + config.getName() + "." + reportMetadata.getId(), + null, createTriggerParameters(reportMetadata))); + } + } + + return triggers; + } + + private List createTriggerParameters (ReportMetadataInfo reportMetadata) { + List parameters = new ArrayList<>(); + + parameters.add(new EventParameterRequest("commcare.field.configName", CONFIG_NAME)); + + for (ReportMetadataColumn column : reportMetadata.getColumns()) { + parameters.add(new EventParameterRequest(column.getDisplay() + COLUMN_NAME_SUFFIX, column.getDisplay())); + } + + return parameters; + } +} diff --git a/commcare/src/main/java/org/motechproject/commcare/tasks/impl/CommcareActionProxyServiceImpl.java b/commcare/src/main/java/org/motechproject/commcare/tasks/impl/CommcareActionProxyServiceImpl.java index ec57fbbf2..523cd8f9e 100644 --- a/commcare/src/main/java/org/motechproject/commcare/tasks/impl/CommcareActionProxyServiceImpl.java +++ b/commcare/src/main/java/org/motechproject/commcare/tasks/impl/CommcareActionProxyServiceImpl.java @@ -4,6 +4,7 @@ import org.motechproject.commcare.domain.CaseTask; import org.motechproject.commcare.service.CaseActionService; import org.motechproject.commcare.service.QueryStockLedgerActionService; +import org.motechproject.commcare.service.ReportActionService; import org.motechproject.commcare.service.imports.ImportFormActionService; import org.motechproject.commcare.tasks.CommcareActionProxyService; import org.springframework.beans.factory.annotation.Autowired; @@ -17,14 +18,17 @@ public class CommcareActionProxyServiceImpl implements CommcareActionProxyServic private CaseActionService caseActionService; private ImportFormActionService importFormActionService; private QueryStockLedgerActionService queryStockLedgerActionService; + private ReportActionService reportActionService; @Autowired public CommcareActionProxyServiceImpl(CaseActionService caseActionService, ImportFormActionService importFormActionService, - QueryStockLedgerActionService queryStockLedgerActionService) { + QueryStockLedgerActionService queryStockLedgerActionService, + ReportActionService reportActionService) { this.caseActionService = caseActionService; this.importFormActionService = importFormActionService; this.queryStockLedgerActionService = queryStockLedgerActionService; + this.reportActionService = reportActionService; } @@ -47,4 +51,9 @@ public void importForms(String configName, DateTime startDate, DateTime endDate) public void queryStockLedger(String configName, String caseId, String sectionId, DateTime startDate, DateTime endDate, Map extraData) { queryStockLedgerActionService.queryStockLedger(configName, caseId, sectionId, startDate, endDate, extraData); } + + @Override + public void queryReport (String configName, String reportId, String reportName, String urlParsedFilters) { + reportActionService.queryReport(configName, reportId, reportName, urlParsedFilters); + } } diff --git a/commcare/src/test/java/org/motechproject/commcare/events/ReportActionEventHandlerTest.java b/commcare/src/test/java/org/motechproject/commcare/events/ReportActionEventHandlerTest.java new file mode 100644 index 000000000..775c56075 --- /dev/null +++ b/commcare/src/test/java/org/motechproject/commcare/events/ReportActionEventHandlerTest.java @@ -0,0 +1,71 @@ +package org.motechproject.commcare.events; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; +import org.motechproject.commcare.events.constants.EventDataKeys; +import org.motechproject.commcare.events.constants.EventSubjects; +import org.motechproject.commcare.service.ReportActionService; +import org.motechproject.commcare.testutil.RequestTestUtils; +import org.motechproject.event.MotechEvent; + +import java.util.LinkedHashMap; +import java.util.Map; + +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.verify; +import static org.mockito.MockitoAnnotations.initMocks; + +public class ReportActionEventHandlerTest { + + private static final String CONFIG_NAME = "FooConfig"; + private static final String REPORT_ID = "Dddddd"; + private static final String REPORT_NAME = "Report Name"; + + @Mock + private ReportActionService reportActionService; + + private ReportActionEventHandler eventHandler; + + @Before + public void setUp() { + initMocks(this); + + eventHandler = new ReportActionEventHandler(reportActionService); + } + + @Test + public void shouldConvertEventParametersAndReceiveReport() { + MotechEvent event = prepareEvent(); + eventHandler.receiveReport(event); + + verify(reportActionService).queryReport( + eq(CONFIG_NAME), + eq(REPORT_ID), + eq(REPORT_NAME), + eq("&unicode_filter=Sample value&date_filter-start=2012-11-01&date_filter-end=2012-12-24&numeric_filter-operator==&numeric_filter-operand=100") + ); + } + + private MotechEvent prepareEvent() { + + String subject = EventSubjects.REPORT_EVENT + "." + REPORT_NAME + "." + CONFIG_NAME; + + Map params = new LinkedHashMap<>(); + params.put("unicode_filter", "Sample value"); + params.put("unicode_filter.type", "CHOICE_LIST"); + + params.put("date_filter", RequestTestUtils.START_DATE); + params.put("date_filter.commcare.endDate", RequestTestUtils.END_DATE); + params.put("date_filter.type", "DATE"); + + params.put("numeric_filter", "="); + params.put("numeric_filter.value", "100"); + params.put("numeric_filter.type", "DECIMAL"); + + params.put(EventDataKeys.REPORT_ID, REPORT_ID); + params.put(EventDataKeys.REPORT_NAME, REPORT_NAME); + + return new MotechEvent(subject, params); + } +} diff --git a/commcare/src/test/java/org/motechproject/commcare/tasks/builder/ReportTriggerBuilderTest.java b/commcare/src/test/java/org/motechproject/commcare/tasks/builder/ReportTriggerBuilderTest.java new file mode 100644 index 000000000..98c8c2450 --- /dev/null +++ b/commcare/src/test/java/org/motechproject/commcare/tasks/builder/ReportTriggerBuilderTest.java @@ -0,0 +1,104 @@ +package org.motechproject.commcare.tasks.builder; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; +import org.motechproject.commcare.config.Configs; +import org.motechproject.commcare.domain.report.ReportsMetadataInfo; +import org.motechproject.commcare.events.constants.EventSubjects; +import org.motechproject.commcare.service.CommcareConfigService; +import org.motechproject.commcare.service.CommcareSchemaService; +import org.motechproject.commcare.util.ConfigsUtils; +import org.motechproject.commcare.util.DummyCommcareSchema; +import org.motechproject.tasks.contract.EventParameterRequest; +import org.motechproject.tasks.contract.TriggerEventRequest; + +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; +import static org.mockito.Mockito.when; +import static org.mockito.MockitoAnnotations.initMocks; +import static org.motechproject.commcare.util.DummyCommcareSchema.REPORT_COLUMN1_VALUE; +import static org.motechproject.commcare.util.DummyCommcareSchema.REPORT_COLUMN4_VALUE; +import static org.motechproject.commcare.util.DummyCommcareSchema.REPORT_COLUMN5_VALUE; + +public class ReportTriggerBuilderTest { + + @Mock + private CommcareSchemaService schemaService; + + @Mock + private CommcareConfigService configService; + + private Configs configs = ConfigsUtils.prepareConfigsWithThreeConfigs(); + + private ReportTriggerBuilder reportTriggerBuilder; + + private static final String FIRST_REPORT_NAME = "reportOne"; + private static final String SECOND_REPORT_NAME = "reportTwo"; + + private static final String BASE_SUBJECT_ONE = EventSubjects.RECEIVED_REPORT + ".ConfigOne."; + private static final String BASE_SUBJECT_TWO = EventSubjects.RECEIVED_REPORT + ".ConfigTwo."; + + @Before + public void setUp() { + initMocks(this); + when(configService.getConfigs()).thenReturn(configs); + when(schemaService.getReportsMetadata("ConfigOne")).thenReturn(DummyCommcareSchema.getReportsMetadataForConfigOne()); + when(schemaService.getReportsMetadata("ConfigTwo")).thenReturn(DummyCommcareSchema.getReportsMetadataForConfigTwo()); + + reportTriggerBuilder = new ReportTriggerBuilder(schemaService, configService); + } + + @Test + public void shouldBuildProperTriggerRequestForReports() { + List triggers = reportTriggerBuilder.buildTriggers(); + + assertFalse(triggers.isEmpty()); + + int counter = 0; + for (ReportsMetadataInfo reports : DummyCommcareSchema.getReportsMetadataForConfigOne()) { + counter += reports.getReportMetadataInfoList().size(); + } + + for (ReportsMetadataInfo reports : DummyCommcareSchema.getReportsMetadataForConfigTwo()) { + counter += reports.getReportMetadataInfoList().size(); + } + + assertEquals(counter, triggers.size()); + + for (TriggerEventRequest request : triggers) { + String subject = request.getSubject(); + + switch (subject) { + case BASE_SUBJECT_ONE + DummyCommcareSchema.REPORT_ID1: + assertEquals("Received Report: Test Report 1 [ConfigOne]", request.getDisplayName()); + assertTrue(hasEventKey(request.getEventParameters(), REPORT_COLUMN1_VALUE)); + break; + case BASE_SUBJECT_ONE + DummyCommcareSchema.REPORT_ID2: + assertEquals("Received Report: Test Report 2 [ConfigOne]", request.getDisplayName()); + assertTrue(hasEventKey(request.getEventParameters(), REPORT_COLUMN4_VALUE)); + break; + case BASE_SUBJECT_TWO + DummyCommcareSchema.REPORT_ID1: + assertEquals("Received Report: Test Report 1 [ConfigTwo]", request.getDisplayName()); + assertTrue(hasEventKey(request.getEventParameters(), REPORT_COLUMN5_VALUE)); + break; + default: + fail("Found trigger with incorrect subject: " + subject); + } + } + } + + private boolean hasEventKey(List eventParameters, String key) { + for (EventParameterRequest parameter : eventParameters) { + if (parameter.getEventKey().equals(key)) { + return true; + } + } + + return false; + } +} diff --git a/commcare/src/test/java/org/motechproject/commcare/util/DummyCommcareSchema.java b/commcare/src/test/java/org/motechproject/commcare/util/DummyCommcareSchema.java index 8363e6900..eb65cad42 100644 --- a/commcare/src/test/java/org/motechproject/commcare/util/DummyCommcareSchema.java +++ b/commcare/src/test/java/org/motechproject/commcare/util/DummyCommcareSchema.java @@ -4,6 +4,13 @@ import org.motechproject.commcare.domain.CommcareModuleJson; import org.motechproject.commcare.domain.FormSchemaJson; import org.motechproject.commcare.domain.FormSchemaQuestionJson; +import org.motechproject.commcare.domain.report.ReportMetadataColumn; +import org.motechproject.commcare.domain.report.ReportMetadataFilter; +import org.motechproject.commcare.domain.report.ReportMetadataInfo; +import org.motechproject.commcare.domain.report.ReportsMetadataInfo; +import org.motechproject.commcare.domain.report.constants.ColumnType; +import org.motechproject.commcare.domain.report.constants.FilterDataType; +import org.motechproject.commcare.domain.report.constants.FilterType; import java.util.ArrayList; import java.util.Arrays; @@ -36,6 +43,31 @@ public final class DummyCommcareSchema { public static final String APP_ID1 = "cef11d974db0f4b69b465df85ef8c826"; public static final String APP_ID2 = "053c85550dc563a682ff610dab71f8d5"; + public static final String REPORT_ID1 = "9aab0eeb88555a7b3bc8676883e7379a"; + public static final String REPORT_ID2 = "9aab0eeb88555a7b4568676883e7379a"; + + public static final String REPORT_TITLE1 = "Test Report 1"; + public static final String REPORT_TITLE2 = "Test Report 2"; + + public static final String REPORT_UNICODE_FILTER_SLUG = "unicode_filter"; + public static final String REPORT_DECIMAL_FILTER_SLUG = "decimal_filter"; + public static final String REPORT_DATE_FILTER_SLUG = "date_filter"; + public static final String REPORT_DYNAMIC_UNICODE_FILTER_SLUG = "dynamic_unicode_filter"; + + public static final String REPORT_COLUMN1 = "district"; + public static final String REPORT_COLUMN2 = "number_of_children_visited"; + public static final String REPORT_COLUMN3 = "owner_name"; + public static final String REPORT_COLUMN4 = "birth_date"; + public static final String REPORT_COLUMN5 = "gender"; + public static final String REPORT_COLUMN6 = "child_age"; + + public static final String REPORT_COLUMN1_VALUE = "District"; + public static final String REPORT_COLUMN2_VALUE = "Number of children visited"; + public static final String REPORT_COLUMN3_VALUE = "Owner name"; + public static final String REPORT_COLUMN4_VALUE = "Birth date"; + public static final String REPORT_COLUMN5_VALUE = "Gender"; + public static final String REPORT_COLUMN6_VALUE = "Child Age"; + public static List getApplicationsForConfigOne() { List applicationsInConfig1 = new ArrayList<>(); @@ -247,4 +279,84 @@ public static List getApplicationsWithCustomQuestionLab return applicationsInConfig; } + + public static List getReportsMetadataForConfigOne() { + List reportsInConfig1 = new ArrayList<>(); + + ReportsMetadataInfo report1 = new ReportsMetadataInfo(); + + List reportsMetadata = new ArrayList<>(); + + ReportMetadataInfo reportOneMetadata = new ReportMetadataInfo(); + List columnsInReportOne = new ArrayList<>(); + List filtersInreportOne = new ArrayList<>(); + + columnsInReportOne.add(new ReportMetadataColumn(REPORT_COLUMN1, REPORT_COLUMN1_VALUE, ColumnType.FIELD)); + columnsInReportOne.add(new ReportMetadataColumn(REPORT_COLUMN2, REPORT_COLUMN2_VALUE, ColumnType.EXPANDED)); + columnsInReportOne.add(new ReportMetadataColumn(REPORT_COLUMN3, REPORT_COLUMN3_VALUE, ColumnType.PERCENT)); + + filtersInreportOne.add(new ReportMetadataFilter(FilterDataType.DECIMAL, REPORT_DECIMAL_FILTER_SLUG, FilterType.NUMERIC)); + filtersInreportOne.add(new ReportMetadataFilter(FilterDataType.STRING, REPORT_UNICODE_FILTER_SLUG, FilterType.CHOICE_LIST)); + filtersInreportOne.add(new ReportMetadataFilter(FilterDataType.STRING, REPORT_DATE_FILTER_SLUG, FilterType.DATE)); + + ReportMetadataInfo reportTwoMetadata = new ReportMetadataInfo(); + List columnsInReportTwo = new ArrayList<>(); + List filtersInreportTwo = new ArrayList<>(); + + columnsInReportTwo.add(new ReportMetadataColumn(REPORT_COLUMN4, REPORT_COLUMN4_VALUE, ColumnType.FIELD)); + columnsInReportTwo.add(new ReportMetadataColumn(REPORT_COLUMN5, REPORT_COLUMN5_VALUE, ColumnType.EXPANDED)); + columnsInReportTwo.add(new ReportMetadataColumn(REPORT_COLUMN6, REPORT_COLUMN6_VALUE, ColumnType.FIELD)); + + filtersInreportTwo.add(new ReportMetadataFilter(FilterDataType.DECIMAL, REPORT_DYNAMIC_UNICODE_FILTER_SLUG, FilterType.DYNAMIC_CHOICE_LIST)); + filtersInreportTwo.add(new ReportMetadataFilter(FilterDataType.STRING, REPORT_UNICODE_FILTER_SLUG, FilterType.CHOICE_LIST)); + filtersInreportTwo.add(new ReportMetadataFilter(FilterDataType.STRING, REPORT_DATE_FILTER_SLUG, FilterType.DATE)); + + reportOneMetadata.setId(REPORT_ID1); + reportOneMetadata.setTitle(REPORT_TITLE1); + reportOneMetadata.setColumns(columnsInReportOne); + reportOneMetadata.setFilters(filtersInreportOne); + reportsMetadata.add(reportOneMetadata); + + reportTwoMetadata.setId(REPORT_ID2); + reportTwoMetadata.setTitle(REPORT_TITLE2); + reportTwoMetadata.setColumns(columnsInReportTwo); + reportTwoMetadata.setFilters(filtersInreportTwo); + reportsMetadata.add(reportTwoMetadata); + + report1.setReportMetadataInfoList(reportsMetadata); + reportsInConfig1.add(report1); + + return reportsInConfig1; + } + + public static List getReportsMetadataForConfigTwo() { + List reportsInConfig2 = new ArrayList<>(); + ReportsMetadataInfo report1 = new ReportsMetadataInfo(); + List reportsMetadata = new ArrayList<>(); + + ReportMetadataInfo reportOneMetadata = new ReportMetadataInfo(); + + List columnsInReportOne = new ArrayList<>(); + List filtersInreportOne = new ArrayList<>(); + + columnsInReportOne.add(new ReportMetadataColumn(REPORT_COLUMN6, REPORT_COLUMN6_VALUE, ColumnType.FIELD)); + columnsInReportOne.add(new ReportMetadataColumn(REPORT_COLUMN5, REPORT_COLUMN5_VALUE, ColumnType.EXPANDED)); + columnsInReportOne.add(new ReportMetadataColumn(REPORT_COLUMN4, REPORT_COLUMN4_VALUE, ColumnType.PERCENT)); + + filtersInreportOne.add(new ReportMetadataFilter(FilterDataType.DECIMAL, REPORT_DECIMAL_FILTER_SLUG, FilterType.NUMERIC)); + filtersInreportOne.add(new ReportMetadataFilter(FilterDataType.STRING, REPORT_UNICODE_FILTER_SLUG, FilterType.CHOICE_LIST)); + filtersInreportOne.add(new ReportMetadataFilter(FilterDataType.STRING, REPORT_DATE_FILTER_SLUG, FilterType.DATE)); + + reportOneMetadata.setId(REPORT_ID1); + reportOneMetadata.setTitle(REPORT_TITLE1); + reportOneMetadata.setColumns(columnsInReportOne); + reportOneMetadata.setFilters(filtersInreportOne); + reportsMetadata.add(reportOneMetadata); + + report1.setReportMetadataInfoList(reportsMetadata); + + reportsInConfig2.add(report1); + + return reportsInConfig2; + } } From a0e57ec2375536ccc0f77b8f7c5f4307a3d28220 Mon Sep 17 00:00:00 2001 From: kmadej Date: Fri, 28 Oct 2016 19:14:49 +0200 Subject: [PATCH 111/202] MOTECH-3020: Added possibility to set blank value for middleName in updatePerson --- .../impl/OpenMRSActionProxyServiceImpl.java | 9 ++++++- .../resource/impl/PersonResourceImplTest.java | 25 ++++++++++++++--- .../impl/OpenMRSActionProxyServiceTest.java | 27 +++++++++++++++++++ .../json/person/person-middleName-update.json | 5 ++++ 4 files changed, 61 insertions(+), 5 deletions(-) create mode 100644 openmrs/src/test/resources/json/person/person-middleName-update.json diff --git a/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java b/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java index 0decf685c..6425405ea 100644 --- a/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java +++ b/openmrs/src/main/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceImpl.java @@ -145,7 +145,14 @@ public void updatePerson(String configName, String personUuid, String givenName, String gender, Boolean dead, String causeOfDeathUUID, Map personAttributes) { Concept causeOfDeath = StringUtils.isNotEmpty(causeOfDeathUUID) ? conceptService.getConceptByUuid(configName, causeOfDeathUUID) : null; - Person person = preparePerson(givenName, middleName, familyName, address1, address2, + String parsedMiddleName; + if ("\"\"".equals(middleName)) { + parsedMiddleName = ""; + } else { + parsedMiddleName = middleName; + } + + Person person = preparePerson(givenName, parsedMiddleName, familyName, address1, address2, address3, address4, address5, address6, cityVillage, stateProvince, country, postalCode, countyDistrict, latitude, longitude, startDate, endDate, birthDate, birthDateEstimated, diff --git a/openmrs/src/test/java/org/motechproject/openmrs/resource/impl/PersonResourceImplTest.java b/openmrs/src/test/java/org/motechproject/openmrs/resource/impl/PersonResourceImplTest.java index a4387f329..9c2ad75c8 100644 --- a/openmrs/src/test/java/org/motechproject/openmrs/resource/impl/PersonResourceImplTest.java +++ b/openmrs/src/test/java/org/motechproject/openmrs/resource/impl/PersonResourceImplTest.java @@ -26,6 +26,7 @@ import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.nullValue; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; @@ -38,6 +39,7 @@ public class PersonResourceImplTest extends AbstractResourceImplTest { private static final String PERSON_ATTRIBUTE_TYPE_RESPONSE_JSON = "json/person/person-attribute-type-response.json"; private static final String CREATE_PERSON_ATTRIBUTE_JSON = "json/person/person-attribute-create.json"; private static final String PERSON_NAME_UPDATE_JSON = "json/person/person-name-update.json"; + private static final String PERSON_MIDDLENAME_UPDATE_JSON = "json/person/person-middleName-update.json"; private static final String PERSON_RESPONSE_JSON = "json/person/person-response.json"; private static final String CREATE_PERSON_JSON = "json/person/person-create.json"; private static final String UPDATE_PERSON_ADDRESS_JSON = "json/person/person-address-update.json"; @@ -195,9 +197,24 @@ public void shouldUpdatePersonName() throws Exception { verify(restOperations).exchange(eq(url), eq(HttpMethod.POST), requestCaptor.capture(), eq(String.class)); - assertThat(requestCaptor.getValue().getHeaders(), equalTo(getHeadersForPostWithoutResponse(config))); - assertThat(JsonUtils.readJson(requestCaptor.getValue().getBody(), JsonObject.class), - equalTo(readFromFile(PERSON_NAME_UPDATE_JSON, JsonObject.class))); + assertEquals(readFromFile(PERSON_NAME_UPDATE_JSON, Person.Name.class), + JsonUtils.readJson(requestCaptor.getValue().getBody(), Person.Name.class)); + } + + @Test + public void shouldOverwritePersonMiddleName() throws Exception { + String personId = "CCC"; + Person.Name name = prepareName(); + name.setMiddleName(""); + + URI url = config.toInstancePathWithParams("/person/{personUuid}/name/{nameUuid}", personId, name.getUuid()); + + personResource.updatePersonName(config, personId, name); + + verify(restOperations).exchange(eq(url), eq(HttpMethod.POST), requestCaptor.capture(), eq(String.class)); + + assertEquals(readFromFile(PERSON_MIDDLENAME_UPDATE_JSON, Person.Name.class), + JsonUtils.readJson(requestCaptor.getValue().getBody(), Person.Name.class)); } @Test @@ -254,7 +271,7 @@ private Person.Name prepareName() { name.setUuid("AAA"); name.setGivenName("Motech"); name.setMiddleName("E"); - name.setGivenName("Test"); + name.setFamilyName("Test"); return name; } private Person.Address prepareAddress() throws Exception { diff --git a/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java b/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java index aac3d98c4..986f6774b 100644 --- a/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java +++ b/openmrs/src/test/java/org/motechproject/openmrs/tasks/impl/OpenMRSActionProxyServiceTest.java @@ -411,6 +411,33 @@ public void shouldUpdatePersonWithGivenParameters() { assertEquals(person, personCaptor.getValue()); } + @Test + public void shouldUpdatePersonWithBlankMiddleName() { + Person person = createTestPerson(); + // the empty value from task action fields + person.getPreferredName().setMiddleName("\"\""); + + Person.Address personAddress = person.getPreferredAddress(); + + Map personAttributes = new HashMap<>(); + personAttributes.put("8d8718c2-c2cc-11de-8d13-0010c6dffd0f", "testValue"); + + openMRSActionProxyService.updatePerson(CONFIG_NAME, person.getUuid(), person.getPreferredName().getGivenName(), + person.getPreferredName().getMiddleName(), person.getPreferredName().getFamilyName(), + personAddress.getAddress1(), personAddress.getAddress2(), personAddress.getAddress3(), + personAddress.getAddress4(), personAddress.getAddress5(), personAddress.getAddress6(), + personAddress.getCityVillage(), personAddress.getStateProvince(), personAddress.getCountry(), + personAddress.getPostalCode(), personAddress.getCountyDistrict(), personAddress.getLatitude(), + personAddress.getLongitude(), new DateTime(personAddress.getStartDate()), + new DateTime(personAddress.getEndDate()), new DateTime(person.getBirthdate()), + person.getBirthdateEstimated(), person.getGender(), person.getDead(), null, personAttributes); + + verify(personService).updatePerson(eq(CONFIG_NAME), personCaptor.capture()); + // middleName should be converted to empty string + person.getPreferredName().setMiddleName(""); + assertEquals(person, personCaptor.getValue()); + } + @Test public void shouldUpdatePatientIdentifiers() { Patient patient = new Patient(); diff --git a/openmrs/src/test/resources/json/person/person-middleName-update.json b/openmrs/src/test/resources/json/person/person-middleName-update.json new file mode 100644 index 000000000..7ad347156 --- /dev/null +++ b/openmrs/src/test/resources/json/person/person-middleName-update.json @@ -0,0 +1,5 @@ +{ + "givenName":"Motech", + "middleName":"", + "familyName":"Test" +} From 1f3888f04ff1bc970037893d93ee3cebff397581 Mon Sep 17 00:00:00 2001 From: Michal Date: Mon, 31 Oct 2016 11:35:59 +0100 Subject: [PATCH 112/202] MOTECH-2858: Fixed after review --- .../motechproject/atomclient/domain/FeedRecord.java | 6 +++--- .../atomclient/service/AtomClientService.java | 2 ++ .../service/impl/AtomClientConfigServiceImpl.java | 13 ++++++------- .../service/impl/AtomClientServiceImpl.java | 13 +++++++------ atom-client/src/main/resources/task-channel.json | 6 +++--- .../resources/webapp/messages/messages.properties | 7 ++++--- 6 files changed, 25 insertions(+), 22 deletions(-) diff --git a/atom-client/src/main/java/org/motechproject/atomclient/domain/FeedRecord.java b/atom-client/src/main/java/org/motechproject/atomclient/domain/FeedRecord.java index bdfa051a0..f45c48059 100644 --- a/atom-client/src/main/java/org/motechproject/atomclient/domain/FeedRecord.java +++ b/atom-client/src/main/java/org/motechproject/atomclient/domain/FeedRecord.java @@ -45,8 +45,8 @@ public String getData() { public Integer getPage(String data) { int beginIndex = data.indexOf("via"); - beginIndex = data.indexOf("patient", beginIndex) + 8; - int endIndex = data.indexOf('/', beginIndex); - return Integer.parseInt(data.substring(beginIndex, endIndex - 2 )); + beginIndex = data.indexOf("patient", beginIndex) + "patient/".length(); + int endIndex = data.indexOf('/', beginIndex) - "\" ".length(); + return Integer.parseInt(data.substring(beginIndex, endIndex)); } } diff --git a/atom-client/src/main/java/org/motechproject/atomclient/service/AtomClientService.java b/atom-client/src/main/java/org/motechproject/atomclient/service/AtomClientService.java index 767a870fd..51af981bd 100644 --- a/atom-client/src/main/java/org/motechproject/atomclient/service/AtomClientService.java +++ b/atom-client/src/main/java/org/motechproject/atomclient/service/AtomClientService.java @@ -25,6 +25,8 @@ public interface AtomClientService { /** * Reads the atom feed(s) specified in task action. + * @param currentUrl last url that is already fetched + * @param lastUrl last known url that can be fetched */ void read(String currentUrl, String lastUrl); } diff --git a/atom-client/src/main/java/org/motechproject/atomclient/service/impl/AtomClientConfigServiceImpl.java b/atom-client/src/main/java/org/motechproject/atomclient/service/impl/AtomClientConfigServiceImpl.java index ba114b5f1..16604a7ea 100644 --- a/atom-client/src/main/java/org/motechproject/atomclient/service/impl/AtomClientConfigServiceImpl.java +++ b/atom-client/src/main/java/org/motechproject/atomclient/service/impl/AtomClientConfigServiceImpl.java @@ -8,9 +8,9 @@ import org.motechproject.atomclient.service.Constants; import org.motechproject.atomclient.service.FeedConfig; import org.motechproject.atomclient.service.FeedConfigs; +import org.motechproject.config.SettingsFacade; import org.motechproject.event.MotechEvent; import org.motechproject.event.listener.EventRelay; -import org.motechproject.config.SettingsFacade; import org.quartz.CronExpression; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -22,8 +22,9 @@ import java.io.IOException; import java.io.InputStream; import java.text.ParseException; -import java.util.Arrays; +import java.util.ArrayList; import java.util.HashSet; +import java.util.List; @Service("atomClientConfigService") @@ -138,13 +139,11 @@ public String getRegexForFeedUrl(String url) { } public void readNewFeeds (int currentPage, int recentPage, String feedUrl) { - int j = 0; - FeedConfig[] newFeeds = new FeedConfig[recentPage - currentPage + 1]; + List newFeeds = new ArrayList<>(); String url = feedUrl.substring(0, feedUrl.lastIndexOf('/') + 1); for (int i = currentPage; i <= recentPage; i++) { - newFeeds[j] = new FeedConfig(url + Integer.toString(i), "/([0-9a-f-]*)\\?"); - j++; + newFeeds.add(new FeedConfig(url + Integer.toString(i), "/([0-9a-f-]*)\\?")); } - this.setFeedConfigs(new FeedConfigs(new HashSet<>(Arrays.asList(newFeeds)))); + this.setFeedConfigs(new FeedConfigs(new HashSet<>(newFeeds))); } } diff --git a/atom-client/src/main/java/org/motechproject/atomclient/service/impl/AtomClientServiceImpl.java b/atom-client/src/main/java/org/motechproject/atomclient/service/impl/AtomClientServiceImpl.java index 1a93911de..4ea5028d3 100644 --- a/atom-client/src/main/java/org/motechproject/atomclient/service/impl/AtomClientServiceImpl.java +++ b/atom-client/src/main/java/org/motechproject/atomclient/service/impl/AtomClientServiceImpl.java @@ -26,8 +26,9 @@ import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; -import java.util.Arrays; +import java.util.ArrayList; import java.util.HashSet; +import java.util.List; @Service("atomClientService") @@ -45,7 +46,6 @@ public class AtomClientServiceImpl implements AtomClientService { public AtomClientServiceImpl(FeedRecordDataService feedRecordDataService, EventRelay eventRelay, AtomClientConfigService configService, MotechSchedulerService motechSchedulerService) { feedFetcher = new HttpURLFeedFetcher(new FeedCache(feedRecordDataService, eventRelay, configService)); - feedFetcher.setAllowDoctypes(true); this.configService = configService; this.motechSchedulerService = motechSchedulerService; this.feedRecordDataService = feedRecordDataService; @@ -75,11 +75,12 @@ public void scheduleFetchJob(String cronExpression) { @Override @Transactional public void read(String currentUrl, String lastUrl) { - FeedConfig[] feeds = new FeedConfig[2]; + List feeds = new ArrayList<>(); + String regex = "/([0-9a-f-]*)\\?"; - feeds[0] = new FeedConfig(currentUrl, "/([0-9a-f-]*)\\?"); - feeds[1] = new FeedConfig(lastUrl, "/([0-9a-f-]*)\\?"); - configService.setFeedConfigs(new FeedConfigs(new HashSet<>(Arrays.asList(feeds)))); + feeds.add(new FeedConfig(currentUrl, regex)); + feeds.add(new FeedConfig(lastUrl, regex)); + configService.setFeedConfigs(new FeedConfigs(new HashSet<>(feeds))); fetch(); FeedRecord feedRecord = feedRecordDataService.findByURL(currentUrl); diff --git a/atom-client/src/main/resources/task-channel.json b/atom-client/src/main/resources/task-channel.json index c0ebccadb..f5bb50911 100644 --- a/atom-client/src/main/resources/task-channel.json +++ b/atom-client/src/main/resources/task-channel.json @@ -38,15 +38,15 @@ }, { "subject" : "org.motechproject.atomclient.read", - "displayName" : "atomclient.task.feed.read", + "displayName" : "atomclient.task.feed.OpenMRS.read", "actionParameters" : [ { "key" : "currentFeedUrl", - "displayName" : "atomclient.task.feed.read.current_url" + "displayName" : "atomclient.task.feed.OpenMRS.currentUrl" }, { "key" : "lastFeedUrl", - "displayName" : "atomclient.task.feed.read.last_url" + "displayName" : "atomclient.task.feed.OpenMRS.lastUrl" } ] } diff --git a/atom-client/src/main/resources/webapp/messages/messages.properties b/atom-client/src/main/resources/webapp/messages/messages.properties index 00c50180d..aeebe44bd 100644 --- a/atom-client/src/main/resources/webapp/messages/messages.properties +++ b/atom-client/src/main/resources/webapp/messages/messages.properties @@ -9,7 +9,8 @@ atomclient.task.feed.change.published_date=Published Date atomclient.task.feed.change.updated_date=Updated Date atomclient.task.feed.change.raw_content=Raw Content atomclient.task.feed.change.extracted_content=Extracted Content -atomclient.task.feed.read.current_url= Current OpeMRS Feed Url -atomclient.task.feed.read.last_url= Recent OpeMRS Feed Url atomclient.task.feed.fetch=Fetch! -atomclient.task.feed.read= Read OpenMRS Feeds + +atomclient.task.feed.OpenMRS.read = Read OpenMRS Feeds +atomclient.task.feed.OpenMRS.currentUrl= Current OpenMRS Feed Url +atomclient.task.feed.OpenMRS.lastUrl= Recent OpenMRS Feed Url From effebff12dccb61730358590b196bb6a704c0733 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Ja=C5=BCd=C5=BCewski?= Date: Wed, 2 Nov 2016 11:18:13 +0100 Subject: [PATCH 113/202] MOTECH-2979 Switched to date manipulation for all Commcare case and form fields --- .../commcare/tasks/builder/CaseTriggerBuilder.java | 2 +- .../commcare/tasks/builder/FormTriggerBuilder.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/commcare/src/main/java/org/motechproject/commcare/tasks/builder/CaseTriggerBuilder.java b/commcare/src/main/java/org/motechproject/commcare/tasks/builder/CaseTriggerBuilder.java index 5158889c4..8de696ada 100644 --- a/commcare/src/main/java/org/motechproject/commcare/tasks/builder/CaseTriggerBuilder.java +++ b/commcare/src/main/java/org/motechproject/commcare/tasks/builder/CaseTriggerBuilder.java @@ -74,7 +74,7 @@ public List buildTriggers() { if (config.isEventStrategyFull()) { for (String caseProperty : module.getCaseProperties()) { - parameterRequests.add(new EventParameterRequest(caseProperty, caseProperty)); + parameterRequests.add(new EventParameterRequest(caseProperty, caseProperty, ParameterType.DATE.getValue())); } } diff --git a/commcare/src/main/java/org/motechproject/commcare/tasks/builder/FormTriggerBuilder.java b/commcare/src/main/java/org/motechproject/commcare/tasks/builder/FormTriggerBuilder.java index 00cc71315..06b140f98 100644 --- a/commcare/src/main/java/org/motechproject/commcare/tasks/builder/FormTriggerBuilder.java +++ b/commcare/src/main/java/org/motechproject/commcare/tasks/builder/FormTriggerBuilder.java @@ -111,7 +111,7 @@ private List buildTriggerParameters(FormSchemaJson form) addCaseFields(parameters); for (FormSchemaQuestionJson question : form.getQuestions()) { - parameters.add(new EventParameterRequest(question.getQuestionValue(), question.getQuestionValue())); + parameters.add(new EventParameterRequest(question.getQuestionValue(), question.getQuestionValue(), ParameterType.DATE.getValue())); } return parameters; From 475d20d8c1fb1580f9b5dd83112f35a38c208c73 Mon Sep 17 00:00:00 2001 From: Michal Date: Wed, 2 Nov 2016 15:57:38 +0100 Subject: [PATCH 114/202] MOTECH-2858: Fixed after review --- .../service/impl/AtomClientServiceImpl.java | 3 +- .../webapp/messages/messages.properties | 1 - .../atomclient/unit/EventTest.java | 37 +++++++++++++++++++ 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/atom-client/src/main/java/org/motechproject/atomclient/service/impl/AtomClientServiceImpl.java b/atom-client/src/main/java/org/motechproject/atomclient/service/impl/AtomClientServiceImpl.java index 4ea5028d3..045c54b9b 100644 --- a/atom-client/src/main/java/org/motechproject/atomclient/service/impl/AtomClientServiceImpl.java +++ b/atom-client/src/main/java/org/motechproject/atomclient/service/impl/AtomClientServiceImpl.java @@ -87,7 +87,7 @@ public void read(String currentUrl, String lastUrl) { String currenData = feedRecord.getData(); int currentPage = feedRecord.getPage(currenData); - feedRecord = feedRecordDataService.findByURL(currentUrl); + feedRecord = feedRecordDataService.findByURL(lastUrl); String lastData = feedRecord.getData(); int lastPage = feedRecord.getPage(lastData); @@ -95,7 +95,6 @@ public void read(String currentUrl, String lastUrl) { fetch(); } - @Override @Transactional public void fetch() { diff --git a/atom-client/src/main/resources/webapp/messages/messages.properties b/atom-client/src/main/resources/webapp/messages/messages.properties index aeebe44bd..c844d7cfe 100644 --- a/atom-client/src/main/resources/webapp/messages/messages.properties +++ b/atom-client/src/main/resources/webapp/messages/messages.properties @@ -10,7 +10,6 @@ atomclient.task.feed.change.updated_date=Updated Date atomclient.task.feed.change.raw_content=Raw Content atomclient.task.feed.change.extracted_content=Extracted Content atomclient.task.feed.fetch=Fetch! - atomclient.task.feed.OpenMRS.read = Read OpenMRS Feeds atomclient.task.feed.OpenMRS.currentUrl= Current OpenMRS Feed Url atomclient.task.feed.OpenMRS.lastUrl= Recent OpenMRS Feed Url diff --git a/atom-client/src/test/java/org/motechproject/atomclient/unit/EventTest.java b/atom-client/src/test/java/org/motechproject/atomclient/unit/EventTest.java index ef5bd8da4..866b8fc7f 100644 --- a/atom-client/src/test/java/org/motechproject/atomclient/unit/EventTest.java +++ b/atom-client/src/test/java/org/motechproject/atomclient/unit/EventTest.java @@ -65,6 +65,28 @@ public class EventTest { " \n" + "\n"; + static final String ATOM_FEED_DATA_2 = "\n" + + "\n" + + " Patient AOP\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " OpenMRS\n" + + " \n" + + " bec795b1-3d17-451d-b43e-a094019f6984+35\n" + + " OpenMRS Feed Publisher\n" + + " 2016-02-23T03:31:13Z\n" + + " \n" + + " Patient\n" + + " \n" + + " tag:atomfeed.ict4h.org:9cc95d86-1b8e-4582-a774-83cf4b73c23e\n" + + " 2016-02-23T03:31:13Z\n" + + " 2016-02-23T03:31:13Z\n" + + " \n" + + " \n" + + "\n"; + @Before public void setup() { @@ -108,4 +130,19 @@ public void verifyEventNotSentForExistingData() { verify(eventRelay, times(0)).sendEventMessage(event.capture()); } + + @Test + public void verifyRead() { + String feedURL2 = SimpleHttpServer.getInstance().start("foo2", HttpStatus.SC_OK, ATOM_FEED_DATA_2); + + when(feedRecordDataService.findByURL(feedURL)).thenReturn(new FeedRecord(feedURL, ATOM_FEED_DATA)); + when(feedRecordDataService.findByURL(feedURL2)).thenReturn(new FeedRecord(feedURL2, ATOM_FEED_DATA_2)); + + ArgumentCaptor event = ArgumentCaptor.forClass(MotechEvent.class); + + atomClientService.read(feedURL, feedURL2); + + verify(eventRelay, times(0)).sendEventMessage(event.capture()); + } + } From 420684a297389d2578c4446e745a76a97cfbbb26 Mon Sep 17 00:00:00 2001 From: Michal Date: Thu, 3 Nov 2016 11:03:28 +0100 Subject: [PATCH 115/202] MOTECH-2858: Fixed after review --- .../java/org/motechproject/atomclient/unit/EventTest.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/atom-client/src/test/java/org/motechproject/atomclient/unit/EventTest.java b/atom-client/src/test/java/org/motechproject/atomclient/unit/EventTest.java index 866b8fc7f..b2b332a85 100644 --- a/atom-client/src/test/java/org/motechproject/atomclient/unit/EventTest.java +++ b/atom-client/src/test/java/org/motechproject/atomclient/unit/EventTest.java @@ -138,11 +138,9 @@ public void verifyRead() { when(feedRecordDataService.findByURL(feedURL)).thenReturn(new FeedRecord(feedURL, ATOM_FEED_DATA)); when(feedRecordDataService.findByURL(feedURL2)).thenReturn(new FeedRecord(feedURL2, ATOM_FEED_DATA_2)); - ArgumentCaptor event = ArgumentCaptor.forClass(MotechEvent.class); - atomClientService.read(feedURL, feedURL2); - verify(eventRelay, times(0)).sendEventMessage(event.capture()); + verify(atomClientConfigService).readNewFeeds(35, 36, feedURL); } } From cd506f0aeb2f9f048696cc2ba9279cedbbfb1b9d Mon Sep 17 00:00:00 2001 From: Michal Date: Thu, 10 Nov 2016 14:42:32 +0100 Subject: [PATCH 116/202] MOTECH-2858: Added IT tests for OpenMRS Atom Feed Added test to check if OpenMRS feeds are paginated and fetched properly to motech. --- .../it/AtomClientServiceBundleIT.java | 192 ++++++++++++++++++ 1 file changed, 192 insertions(+) diff --git a/atom-client/src/test/java/org/motechproject/atomclient/it/AtomClientServiceBundleIT.java b/atom-client/src/test/java/org/motechproject/atomclient/it/AtomClientServiceBundleIT.java index 6b4b193d3..529535e28 100644 --- a/atom-client/src/test/java/org/motechproject/atomclient/it/AtomClientServiceBundleIT.java +++ b/atom-client/src/test/java/org/motechproject/atomclient/it/AtomClientServiceBundleIT.java @@ -1,5 +1,8 @@ package org.motechproject.atomclient.it; +import com.sun.net.httpserver.HttpExchange; +import com.sun.net.httpserver.HttpHandler; +import com.sun.net.httpserver.HttpServer; import org.apache.http.HttpStatus; import org.junit.Before; import org.junit.Test; @@ -19,6 +22,9 @@ import org.ops4j.pax.exam.spi.reactors.PerSuite; import javax.inject.Inject; +import java.io.IOException; +import java.io.OutputStream; +import java.net.InetSocketAddress; import java.util.Arrays; import java.util.HashSet; @@ -172,4 +178,190 @@ public void verifySuccessiveFetches() { String data3 = feedRecord.getData(); assertThat(data3, is(not(data2))); } + + @Test + public void verifyPagination() { + + final String atomResponse = + "\r\n" + + "\r\n" + + " Patient AOP\r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " OpenMRS\r\n" + + " \r\n" + + " bec795b1-3d17-451d-b43e-a094019f6984+37\r\n" + + " 2016-03-03T23:51:45Z\r\n" + + " 2016-03-03T23:51:45Z\r\n" + + " \r\n" + + " Patient\r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " tag:atomfeed.ict4h.org:72deaf8e-039d-49ec-b041-4da9a35c95a2\r\n" + + " 2016-03-03T23:51:45Z\r\n" + + " 2016-03-03T23:51:45Z\r\n" + + " \r\n" + + " 2016-03-03T23:51:45Z\r\n" + + " \r\n" + + "\r\n"; + + try + { + HttpServer server = HttpServer.create(new InetSocketAddress("localhost", 8081), 0); + server.createContext("/openmrs/ws/atomfeed/patient/36", new atom1()); + server.createContext("/openmrs/ws/atomfeed/patient/37", new atom2()); + server.createContext("/openmrs/ws/atomfeed/patient/38", new atom3()); + server.setExecutor(null); // creates a default executor + server.start(); + + String currentUrl = "http:/" + server.getAddress().toString() + "/openmrs/ws/atomfeed/patient/36"; + String recentUrl = "http:/" + server.getAddress().toString() + "/openmrs/ws/atomfeed/patient/38"; + atomClientService.read(currentUrl, recentUrl); + + String fetchedUrl = "http:/" + server.getAddress().toString() + "/openmrs/ws/atomfeed/patient/37"; + FeedRecord feedRecord = feedRecordDataService.findByURL(fetchedUrl); + assertNotNull(feedRecord); + String data = feedRecord.getData(); + assertThat(data, is(atomResponse)); + server.stop(0); + } catch (IOException ex) { + ex.getCause(); + } + } + + static class atom1 implements HttpHandler { + @Override + public void handle(HttpExchange t) throws IOException { + final String atomResponse1 = + "\n" + + "\n" + + " Patient AOP\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " OpenMRS\n" + + " \n" + + " bec795b1-3d17-451d-b43e-a094019f6984+36\n" + + " OpenMRS Feed Publisher\n" + + " 2016-03-03T23:46:14Z\n" + + " \n" + + " Patient\n" + + " \n" + + " tag:atomfeed.ict4h.org:fbd3d76b-a23e-44d7-8df6-c0da95ab34ad\n" + + " 2016-03-03T23:39:59Z\n" + + " 2016-03-03T23:39:59Z\n" + + " \n" + + " \n" + + " \n" + + " Patient\n" + + " \n" + + " tag:atomfeed.ict4h.org:e321ea5d-14d6-41ee-8727-9e5291bbcbb6\n" + + " 2016-03-03T23:41:20Z\n" + + " 2016-03-03T23:41:20Z\n" + + " \n" + + " \n" + + " \n" + + " Patient\n" + + " \n" + + " tag:atomfeed.ict4h.org:91b6e147-39eb-4dd1-a983-ec95fc99a9fb\n" + + " 2016-03-03T23:42:34Z\n" + + " 2016-03-03T23:42:34Z\n" + + " \n" + + " \n" + + " \n" + + " Patient\n" + + " \n" + + " tag:atomfeed.ict4h.org:76843fee-721d-472c-a849-25c292e3d3b5\n" + + " 2016-03-03T23:43:57Z\n" + + " 2016-03-03T23:43:57Z\n" + + " \n" + + " \n" + + " \n" + + " Patient\n" + + " \n" + + " tag:atomfeed.ict4h.org:e12ca14d-7fdb-44cf-9efc-f8298df6ce0b\n" + + " 2016-03-03T23:46:14Z\n" + + " 2016-03-03T23:46:14Z\n" + + " \n" + + " \n" + + "\n"; + + t.sendResponseHeaders(200, atomResponse1.length()); + OutputStream os = t.getResponseBody(); + os.write(atomResponse1.getBytes()); + os.close(); + } + } + + static class atom2 implements HttpHandler { + @Override + public void handle(HttpExchange t) throws IOException { + final String atomResponse2 = + "\n" + + "\n" + + " Patient AOP\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " OpenMRS\n" + + " \n" + + " bec795b1-3d17-451d-b43e-a094019f6984+37\n" + + " OpenMRS Feed Publisher\n" + + " 2016-03-03T23:51:45Z\n" + + " \n" + + " Patient\n" + + " \n" + + " tag:atomfeed.ict4h.org:72deaf8e-039d-49ec-b041-4da9a35c95a2\n" + + " 2016-03-03T23:51:45Z\n" + + " 2016-03-03T23:51:45Z\n" + + " \n" + + " \n" + + "\n"; + + t.sendResponseHeaders(200, atomResponse2.length()); + OutputStream os = t.getResponseBody(); + os.write(atomResponse2.getBytes()); + os.close(); + } + } + + static class atom3 implements HttpHandler { + @Override + public void handle(HttpExchange t) throws IOException { + final String atomResponse3 = + "\n" + + "\n" + + " Patient AOP\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " OpenMRS\n" + + " \n" + + " bec795b1-3d17-451d-b43e-a094019f6984+37\n" + + " OpenMRS Feed Publisher\n" + + " 2016-03-03T23:51:45Z\n" + + " \n" + + " Patient\n" + + " \n" + + " tag:atomfeed.ict4h.org:72deaf8e-039d-49ec-b041-4da9a35c95a2\n" + + " 2016-03-03T23:51:45Z\n" + + " 2016-03-03T23:51:45Z\n" + + " \n" + + " \n" + + "\n"; + + t.sendResponseHeaders(200, atomResponse3.length()); + OutputStream os = t.getResponseBody(); + os.write(atomResponse3.getBytes()); + os.close(); + } + } + } \ No newline at end of file From 4ee9109da8e4e0003188de08d357fae8a6eb0f19 Mon Sep 17 00:00:00 2001 From: srujan92 Date: Mon, 21 Nov 2016 08:17:09 +0530 Subject: [PATCH 117/202] MOTECH-2973 Import Forms By Form ID 1. Created a dropdown option, input field for "By Form Id" and added related js functions. 2. Added function in controller and created new methods for form import through id. 3. New test cases are added for the newly added methods. --- .../commcare/pull/CommcareFormImporter.java | 36 ++++++++-- .../pull/CommcareFormImporterImpl.java | 37 ++++++++++- .../commcare/web/FormImportController.java | 15 ++++- .../web/domain/FormImportRequest.java | 19 ++++++ .../main/resources/webapp/js/controllers.js | 21 ++++-- .../webapp/messages/messages.properties | 6 ++ .../webapp/partials/importForms.html | 19 +++++- .../pull/CommcareFormImporterTest.java | 65 +++++++++++++++++-- .../web/FormImportControllerTest.java | 30 +++++++++ .../json/web/import-request-form-id.json | 6 ++ .../resources/json/web/import-request.json | 3 +- 11 files changed, 237 insertions(+), 20 deletions(-) create mode 100644 commcare/src/test/resources/json/web/import-request-form-id.json diff --git a/commcare/src/main/java/org/motechproject/commcare/pull/CommcareFormImporter.java b/commcare/src/main/java/org/motechproject/commcare/pull/CommcareFormImporter.java index d19ef76a5..7e9b850ce 100644 --- a/commcare/src/main/java/org/motechproject/commcare/pull/CommcareFormImporter.java +++ b/commcare/src/main/java/org/motechproject/commcare/pull/CommcareFormImporter.java @@ -17,28 +17,53 @@ public interface CommcareFormImporter { /** * Counts how many forms match the provided criteria. A single request to the form list * API will be made underneath, and the returned total count will be returned by this method. - * @param dateRange the date range for the import + * + * @param dateRange the date range for the import * @param configName the name of the configuration to use, if null is provided the default configuration * will be used * @return the total number of forms matching the provided criteria * @throws IllegalArgumentException if the date range is null or invalid (start date after end date) - * @throws IllegalStateException if there is an already ongoing import in progress + * @throws IllegalStateException if there is an already ongoing import in progress */ int countForImport(Range dateRange, String configName); + /** + * Checks if a form exists with select id. A single request to the form list + * API will be made underneath, and the returned total count will be returned by this method. + * + * @param formId the id of the form to be checked + * @param configName the name of the configuration to use, if null is provided the default configuration + * will be used + * @return the boolean value if there exists a form with the provided id + * @throws NullPointerException if the form id is null or invalid + */ + boolean checkFormIdForImport(String formId, String configName); + /** * Initiates asynchronous import for the provided criteria. Forms will be fetched from Commcare by doing HTTP * request to the form list API. The default fetch size per request is 100, but that can be controlled using the * {@link #setFetchSize(int)} method. The import will run in a separate thread. An event will be fired for each * successfully imported form. If an error occurs, the import will be stopped. - * @param dateRange the date range for the import + * + * @param dateRange the date range for the import * @param configName the name of the configuration to use, if null is provided the default configuration * will be used * @throws IllegalArgumentException if the date range is null or invalid (start date after end date) - * @throws IllegalStateException if there is an already ongoing import in progress + * @throws IllegalStateException if there is an already ongoing import in progress */ void startImport(final Range dateRange, final String configName); + /** + * Initiates asynchronous import for the provided criteria. Forms will be fetched from Commcare by doing HTTP + * request to the form list API. An event will be fired after a + * successfully imported form. If an error occurs, the import will be stopped. + * + * @param formId the id of form to be imported + * @param configName the name of the configuration to use, if null is provided the default configuration + * will be used. + */ + void startImportById(final String formId, final String configName); + /** * Stops the ongoing import. The effect is not guaranteed to be immediate. */ @@ -46,6 +71,7 @@ public interface CommcareFormImporter { /** * Checks whether there is an ongoing import in progress. + * * @return true if there is an ongoing import, false otherwise */ boolean isImportInProgress(); @@ -55,6 +81,7 @@ public interface CommcareFormImporter { * the last import. {@link FormImportStatus#isImportInProgress()} can be used to check if the import is ongoing, * {@link FormImportStatus#isError()} can be checked to see if the import failed. The received_on date for the * last successfully imported form can be retrieved using {@link FormImportStatus#getLastImportDate()}. + * * @return the status object for the current or last import */ FormImportStatus importStatus(); @@ -63,6 +90,7 @@ public interface CommcareFormImporter { * Sets the fetch size for the queries to the Commcare form list API. In other words, sets how many forms * will be retrieved per request to the API. The default is 100. Setting a too large number might cause memory * issues, setting a too low number might result in a large number of HTTP requests. + * * @param fetchSize the fetch size for requests */ void setFetchSize(int fetchSize); diff --git a/commcare/src/main/java/org/motechproject/commcare/pull/CommcareFormImporterImpl.java b/commcare/src/main/java/org/motechproject/commcare/pull/CommcareFormImporterImpl.java index d44956814..731f8eb88 100644 --- a/commcare/src/main/java/org/motechproject/commcare/pull/CommcareFormImporterImpl.java +++ b/commcare/src/main/java/org/motechproject/commcare/pull/CommcareFormImporterImpl.java @@ -11,6 +11,7 @@ import org.motechproject.commcare.request.FormListRequest; import org.motechproject.commcare.service.CommcareFormService; import org.motechproject.commons.api.Range; +import org.motechproject.event.MotechEvent; import org.motechproject.event.listener.EventRelay; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -31,7 +32,7 @@ public class CommcareFormImporterImpl implements CommcareFormImporter { private int fetchSize = PAGE_SIZE_FOR_FETCH; private Thread importThread; - private boolean importInProgress = false; + private boolean importInProgress; private int importCount; private int totalCount; @@ -63,6 +64,20 @@ public int countForImport(Range dateRange, String configName) { return count; } + @Override + public boolean checkFormIdForImport(String formId, String configName) { + LOGGER.info("Checking form with id {} [config: {}]", formId, configName); + try { + CommcareForm form = formService.retrieveForm(formId, configName); + LOGGER.info("Form with id {} exists", form.getId()); + return true; + } catch (NullPointerException e) { + LOGGER.info("Form with id {} doesnot exist", formId); + return false; + } + } + + @Override public void startImport(final Range dateRange, final String configName) { validateNoImportInProgress(); @@ -129,6 +144,22 @@ public void run() { importThread.start(); } + @Override + public void startImportById(final String formId, final String configName) { + LOGGER.debug("Initiating form import with form id {} [config: {}]", + formId, configName); + CommcareForm form = formService.retrieveForm(formId, configName); + form.getForm().addAttribute("app_id", form.getAppId()); + FullFormEvent formEvent = new FullFormEvent(form.getForm(), form.getReceivedOn(), form.getConfigName()); + eventRelay.sendEventMessage(formEvent.toMotechEvent()); + lastFormXMLNSToBeImported = formEvent.getAttributes().get("xmlns"); + lastImportedDate = form.getReceivedOn(); + lastImportedFormId = form.getId(); + totalCount = 1; + importCount = 1; + LOGGER.info("Imported form with id {}", formId); + } + @Override public void stopImport() { LOGGER.info("Stopping import"); @@ -200,8 +231,8 @@ private void importFormList(CommcareFormList formList) { FullFormEvent formEvent = new FullFormEvent(form.getForm(), form.getReceivedOn(), form.getConfigName()); lastFormXMLNSToBeImported = formEvent.getAttributes().get("xmlns"); - - eventRelay.sendEventMessage(formEvent.toMotechEvent()); + MotechEvent motechEvent = formEvent.toMotechEvent(); + eventRelay.sendEventMessage(motechEvent); lastImportedDate = form.getReceivedOn(); lastImportedFormId = form.getId(); diff --git a/commcare/src/main/java/org/motechproject/commcare/web/FormImportController.java b/commcare/src/main/java/org/motechproject/commcare/web/FormImportController.java index 3cf1cf1e9..82cce41ea 100644 --- a/commcare/src/main/java/org/motechproject/commcare/web/FormImportController.java +++ b/commcare/src/main/java/org/motechproject/commcare/web/FormImportController.java @@ -37,6 +37,7 @@ public class FormImportController extends CommcareController { /** * Checks the status of the ongoing form import. If there is no import in progress currently, * that will be reflected in the returned object. + * * @return the status representation for form import */ @RequestMapping(value = "/status", method = RequestMethod.GET) @@ -50,6 +51,7 @@ public FormImportStatus checkImportStatus(HttpSession session) { /** * Initializes form import, on the UI this will trigger a modal with the number of forms. * Under the covers this just does a form count for the provided request. + * * @param importRequest the request for * @return the number of forms that match this request */ @@ -58,11 +60,16 @@ public FormImportStatus checkImportStatus(HttpSession session) { public int initImport(@RequestBody FormImportRequest importRequest, HttpSession session) { LOGGER.debug("Received import INIT request: {}", importRequest); CommcareFormImporter importer = importerFactory.getImporter(session); - return importer.countForImport(importRequest.getDateRange(), importRequest.getConfig()); + if (importRequest.getFormId() == null) { + return importer.countForImport(importRequest.getDateRange(), importRequest.getConfig()); + } else { + return importer.checkFormIdForImport(importRequest.getFormId(), importRequest.getConfig()) ? 1 : 0; + } } /** * Starts a form import using the provided request. + * * @param importRequest the request for the form import */ @RequestMapping(value = "/start", method = RequestMethod.POST) @@ -70,6 +77,10 @@ public int initImport(@RequestBody FormImportRequest importRequest, HttpSession public void startImport(@RequestBody FormImportRequest importRequest, HttpSession session) { LOGGER.debug("Received import START request: {}", importRequest); CommcareFormImporter importer = importerFactory.getImporter(session); - importer.startImport(importRequest.getDateRange(), importRequest.getConfig()); + if (importRequest.getFormId() == null) { + importer.startImport(importRequest.getDateRange(), importRequest.getConfig()); + } else { + importer.startImportById(importRequest.getFormId(), importRequest.getConfig()); + } } } diff --git a/commcare/src/main/java/org/motechproject/commcare/web/domain/FormImportRequest.java b/commcare/src/main/java/org/motechproject/commcare/web/domain/FormImportRequest.java index 5d3a51aeb..d2da038f1 100644 --- a/commcare/src/main/java/org/motechproject/commcare/web/domain/FormImportRequest.java +++ b/commcare/src/main/java/org/motechproject/commcare/web/domain/FormImportRequest.java @@ -24,6 +24,11 @@ public class FormImportRequest implements Serializable { */ private DateTime receivedOnEnd; + /** + * The id for form import. + */ + private String formId; + /** * The name of the configuration for which to initiate the import. */ @@ -58,6 +63,20 @@ public void setReceivedOnEnd(DateTime receivedOnEnd) { this.receivedOnEnd = receivedOnEnd; } + /** + * @return the form id for form import + */ + public String getFormId() { + return formId; + } + + /** + * @param formId the id for form import + */ + public void setFormId(String formId) { + this.formId = formId; + } + /** * @return the name of the configuration for which to initiate the import */ diff --git a/commcare/src/main/resources/webapp/js/controllers.js b/commcare/src/main/resources/webapp/js/controllers.js index 3c021d0fb..5335cbe9c 100644 --- a/commcare/src/main/resources/webapp/js/controllers.js +++ b/commcare/src/main/resources/webapp/js/controllers.js @@ -47,11 +47,13 @@ $scope.receivedOnStart = null; $scope.receivedOnEnd = null; $scope.lastFormId = null; + $scope.formId = null; $scope.lastReceivedOn = null; $('#importCompleteAlert').fadeOut("slow"); $scope.byDateRange = false; - $scope.importOptions = ['all', 'byDateRange']; + $scope.byFormId = false; + $scope.importOptions = ['all', 'byDateRange', 'byFormId']; $scope.selectedImportOption = $scope.importOptions[0]; $scope.setImportOption = function (index) { $scope.resetImportRequest(); @@ -59,8 +61,13 @@ $scope.selectedImportOption = $scope.importOptions[index]; if ('byDateRange' === $scope.importOptions[index]) { $scope.byDateRange = true; + $scope.byFormId = false; + } else if ('byFormId' === $scope.importOptions[index]) { + $scope.byFormId = true; + $scope.byDateRange = false; } else { $scope.byDateRange = false; + $scope.byFormId = false; } }; @@ -74,6 +81,7 @@ $scope.updateImportRequest(); $('#importCommcareForms').modal('show'); $scope.initImport(); + }; $scope.importFormsContinue = function () { @@ -109,7 +117,8 @@ $scope.importRequest = { "config": $scope.selectedConfig !== undefined? $scope.selectedConfig.name : '', "receivedOnStart": $scope.receivedOnStart, - "receivedOnEnd": $scope.receivedOnEnd + "receivedOnEnd": $scope.receivedOnEnd, + "formId": $scope.formId }; $scope.updateImportRequest = function (nameParameter, valueParameter) { @@ -129,6 +138,9 @@ case 'receivedOnEnd': $scope.importRequest.receivedOnEnd = normalizeDate(valueParameter); break; + case 'formId': + $scope.importRequest.formId = valueParameter; + break; case 'config': $scope.importRequest.config = valueParameter; break; @@ -142,7 +154,8 @@ $scope.importRequest = { "config": $scope.selectedConfig.name = $scope.selectedConfig !== undefined? $scope.selectedConfig.name : '', "receivedOnStart": null, - "receivedOnEnd": null + "receivedOnEnd": null, + "formId": null }; }; @@ -347,7 +360,7 @@ $scope.$parent.selectedConfig = data; $scope.$parent.newlyCreatedConfig = data; if ($scope.$parent.selectedConfig.eventStrategy === "") { - $scope.$parent.selectedConfig.eventStrategy = $scope.eventStrategyOptions[2]; + $scope.$parent.selectedConfig.eventStrategy = $scope.eventStrategyOptions[0]; } LoadingModal.close(); }, diff --git a/commcare/src/main/resources/webapp/messages/messages.properties b/commcare/src/main/resources/webapp/messages/messages.properties index c7e7d54a7..4ef5d9966 100644 --- a/commcare/src/main/resources/webapp/messages/messages.properties +++ b/commcare/src/main/resources/webapp/messages/messages.properties @@ -64,6 +64,7 @@ commcare.startImport=Start Import commcare.cancel=Cancel commcare.all=All commcare.byDateRange=By Date Range +commcare.byFormId=By Form Id commcare.formsToImport=Forms to Import commcare.verifyToSave=Successful verification is required to save configuration @@ -124,6 +125,7 @@ commcare.to=To commcare.startDateTime=Start DateTime commcare.endDateTime=End DateTime commcare.dateModifiedRange= Date Modified Range +commcare.formId = Form Id commcare.user.field.defaultPhoneNumber=Default phone number commcare.user.field.email=E-mail @@ -215,6 +217,7 @@ commcare.alert.info.noConfigurationsDefined=No configurations defined. Please cr commcare.ImportFormsReceivedBetweenPart1=Import Forms Received Between commcare.ImportFormsReceivedBetweenPart2= (Leave blank or import all forms) commcare.formsWillImported=forms will be imported. +commcare.formWillImported=form will be imported. commcare.importComplete=Import complete! commcare.import.error=There was an error while importing the forms: {0} @@ -223,6 +226,9 @@ commcare.import.formId=Form Id: {0} commcare.import.receivedOn=Received on: {0} commcare.import.retry=Please try this import again starting from {0} commcare.formImport.imported=Imported {0} of {1} forms +commcare.import.formById =Checking for existence of form with id {0} commcare.retrievingForms=Retrieving the number of forms to import. commcare.noFormsToImport=No forms were returned, nothing to import. +commcare.noFormToImport=No form was returned, nothing to import. + diff --git a/commcare/src/main/resources/webapp/partials/importForms.html b/commcare/src/main/resources/webapp/partials/importForms.html index ef0f691cb..3e9834bc9 100644 --- a/commcare/src/main/resources/webapp/partials/importForms.html +++ b/commcare/src/main/resources/webapp/partials/importForms.html @@ -53,6 +53,12 @@

    {{msg('commcare.alert.warning')}}

    +
    + +
    + +
    +
    @@ -75,15 +81,24 @@

    {{msg('commcare.alert.warning')}}