From a2578a934f07475d1dfd32b800742c623efd8f03 Mon Sep 17 00:00:00 2001 From: David Mason Date: Fri, 14 Jul 2017 13:11:26 +1000 Subject: [PATCH] feat(ZNTA-975): add filter fields to status list endpoint --- .../rest/service/ProjectVersionResource.java | 13 ++++++-- .../rest/service/ProjectVersionService.java | 31 ++++++++++++++++--- .../main/java/org/zanata/util/DateUtil.java | 18 +++++++++++ .../server/rpc/GetTransUnitListHandler.java | 16 ++-------- .../ProjectVersionServiceUnitTest.java | 12 +++++-- 5 files changed, 66 insertions(+), 24 deletions(-) diff --git a/api/zanata-common-api/src/main/java/org/zanata/rest/service/ProjectVersionResource.java b/api/zanata-common-api/src/main/java/org/zanata/rest/service/ProjectVersionResource.java index 9b2e86c7311..3561a90dd73 100644 --- a/api/zanata-common-api/src/main/java/org/zanata/rest/service/ProjectVersionResource.java +++ b/api/zanata-common-api/src/main/java/org/zanata/rest/service/ProjectVersionResource.java @@ -239,7 +239,7 @@ public Response getDocuments(@PathParam("projectSlug") String projectSlug, @PathParam("versionSlug") String versionSlug); /** - * Retrieves a list translation unit with status in a document. + * Retrieves a list of translation unit id with status in a document. * * @param projectSlug * Project identifier @@ -268,6 +268,13 @@ public Response getTransUnitStatus( @PathParam("projectSlug") String projectSlug, @PathParam("versionSlug") String versionSlug, @PathParam("docId") String docId, - @DefaultValue("en-US") @PathParam("localeId") String localeId); - + @DefaultValue("en-US") @PathParam("localeId") String localeId, + @QueryParam("searchString") String searchString, + @QueryParam("resId") String resId, + @QueryParam("changedBefore") String changedBefore, + @QueryParam("changedAfter") String changedAfter, + @QueryParam("lastModifiedByUser") String lastModifiedByUser, + @QueryParam("sourceComment") String sourceComment, + @QueryParam("transComment") String transComment, + @QueryParam("msgContext") String msgContext); } diff --git a/server/services/src/main/java/org/zanata/rest/service/ProjectVersionService.java b/server/services/src/main/java/org/zanata/rest/service/ProjectVersionService.java index e4aef4e41da..846486e6a6f 100644 --- a/server/services/src/main/java/org/zanata/rest/service/ProjectVersionService.java +++ b/server/services/src/main/java/org/zanata/rest/service/ProjectVersionService.java @@ -3,6 +3,7 @@ import static org.zanata.common.EntityStatus.ACTIVE; import static org.zanata.common.EntityStatus.OBSOLETE; import static org.zanata.common.EntityStatus.READONLY; +import static org.zanata.util.DateUtil.parseQueryDate; import static org.zanata.webtrans.server.rpc.GetTransUnitsNavigationService.TextFlowResultTransformer; import java.util.ArrayList; @@ -17,6 +18,7 @@ import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; import javax.ws.rs.core.Context; import javax.ws.rs.core.EntityTag; import javax.ws.rs.core.GenericEntity; @@ -56,6 +58,8 @@ import org.zanata.rest.dto.resource.ResourceMeta; import org.zanata.rest.editor.service.TransMemoryMergeManager; import org.zanata.rest.editor.service.UserService; +import org.zanata.util.StringUtil; +import org.zanata.webtrans.shared.search.FilterConstraints; import org.zanata.security.ZanataIdentity; import org.zanata.service.ConfigurationService; import org.zanata.service.LocaleService; @@ -305,7 +309,15 @@ public Response getTransUnitStatus( @PathParam("projectSlug") String projectSlug, @PathParam("versionSlug") String versionSlug, @PathParam("docId") String noSlashDocId, - @DefaultValue("en-US") @PathParam("localeId") String localeId) { + @DefaultValue("en-US") @PathParam("localeId") String localeId, + @QueryParam("searchString") String searchString, + @QueryParam("resId") String resId, + @QueryParam("changedBefore") String changedBefore, + @QueryParam("changedAfter") String changedAfter, + @QueryParam("lastModifiedByUser") String lastModifiedByUser, + @QueryParam("sourceComment") String sourceComment, + @QueryParam("transComment") String transComment, + @QueryParam("msgContext") String msgContext) { if (StringUtils.isEmpty(noSlashDocId)) { return Response.status(Response.Status.NOT_FOUND).build(); } @@ -321,8 +333,18 @@ public Response getTransUnitStatus( } TextFlowResultTransformer resultTransformer = new TextFlowResultTransformer(hLocale); - FilterConstraints filterConstraints = - FilterConstraints.builder().build(); + + FilterConstraints filterConstraints = FilterConstraints.builder() + .filterBy(searchString) + .resourceIdIs(resId) + .targetChangedBefore(parseQueryDate(changedBefore)) + .targetChangedAfter(parseQueryDate(changedAfter)) + .lastModifiedBy(lastModifiedByUser) + .sourceCommentContains(sourceComment) + .targetCommentContains(transComment) + .msgContext(msgContext) + .build(); + List textFlows = textFlowDAO.getNavigationByDocumentId( new DocumentId(document.getId(), document.getDocId()), hLocale, resultTransformer, filterConstraints); @@ -331,8 +353,7 @@ public Response getTransUnitStatus( for (HTextFlow textFlow : textFlows) { ContentState state = textFlow.getTargets().get(hLocale.getId()).getState(); - statusList.add(new TransUnitStatus(textFlow.getId(), - textFlow.getResId(), state)); + statusList.add(new TransUnitStatus(textFlow.getId(), textFlow.getResId(), state)); } Object entity = new GenericEntity>(statusList){}; return Response.ok(entity).build(); diff --git a/server/services/src/main/java/org/zanata/util/DateUtil.java b/server/services/src/main/java/org/zanata/util/DateUtil.java index a3a722a7e47..bd1febb1388 100644 --- a/server/services/src/main/java/org/zanata/util/DateUtil.java +++ b/server/services/src/main/java/org/zanata/util/DateUtil.java @@ -6,6 +6,8 @@ import java.util.Date; import java.util.Locale; import java.util.concurrent.TimeUnit; + +import com.google.common.base.Strings; import org.joda.time.DateTime; import org.joda.time.Days; import org.joda.time.Period; @@ -22,6 +24,8 @@ public class DateUtil { private static final String DATE_TIME_SHORT_PATTERN = "dd/MM/yy HH:mm"; private static final String TIME_SHORT_PATTERN = "hh:mm:ss"; + // Used for advanced editor search queries + private static final String DATE_SHORT_QUERY_PATTERN = "yyyy-MM-dd"; // Period Formatters are thread safe and immutable according to joda time // docs private static final PeriodFormatter TIME_REMAINING_FORMATTER = @@ -232,4 +236,18 @@ public static boolean isDatesInRange(Date from, Date to, int days) { Days d = Days.daysBetween(fromDate, toDate); return d.getDays() <= days; } + + /** + * Parse a yyyy-mm-dd string to a date. + * + * @param dateString in form "yyyy-mm-dd" or empty string or null + * @return the parsed date or null. + */ + public static DateTime parseQueryDate(String dateString) { + if (Strings.isNullOrEmpty(dateString)) { + return null; + } + return DateTimeFormat.forPattern(DATE_SHORT_QUERY_PATTERN) + .parseDateTime(dateString); + } } diff --git a/server/services/src/main/java/org/zanata/webtrans/server/rpc/GetTransUnitListHandler.java b/server/services/src/main/java/org/zanata/webtrans/server/rpc/GetTransUnitListHandler.java index 45f053235cb..f3fbfc31043 100644 --- a/server/services/src/main/java/org/zanata/webtrans/server/rpc/GetTransUnitListHandler.java +++ b/server/services/src/main/java/org/zanata/webtrans/server/rpc/GetTransUnitListHandler.java @@ -26,9 +26,6 @@ import javax.enterprise.context.RequestScoped; import javax.inject.Inject; import javax.inject.Named; -import org.joda.time.DateTime; -import org.joda.time.format.DateTimeFormat; -import org.joda.time.format.DateTimeFormatter; import org.zanata.dao.TextFlowDAO; import org.zanata.exception.ZanataServiceException; import org.zanata.model.HLocale; @@ -37,6 +34,7 @@ import org.zanata.security.ZanataIdentity; import org.zanata.service.LocaleService; import org.zanata.service.ValidationService; +import static org.zanata.util.DateUtil.parseQueryDate; import org.zanata.webtrans.server.ActionHandlerFor; import org.zanata.webtrans.shared.model.TransUnit; import org.zanata.webtrans.shared.rpc.EditorFilter; @@ -46,7 +44,6 @@ import org.zanata.webtrans.shared.rpc.GetTransUnitsNavigationResult; import org.zanata.webtrans.shared.util.FindByTransUnitIdPredicate; import com.google.common.base.Function; -import com.google.common.base.Strings; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; @@ -70,8 +67,6 @@ public class GetTransUnitListHandler extends private ValidationService validationServiceImpl; @Inject private GetTransUnitsNavigationService getTransUnitsNavigationService; - private DateTimeFormatter dateFormatter = - DateTimeFormat.forPattern("yyyy-MM-dd"); @Override public GetTransUnitListResult execute(GetTransUnitList action, @@ -86,10 +81,10 @@ public GetTransUnitListResult execute(GetTransUnitList action, FilterConstraints constraints = FilterConstraints.builder() .filterBy(editorFilter.getTextInContent()) .lastModifiedBy(editorFilter.getLastModifiedByUser()) - .targetChangedBefore(parseDateIfPresent( + .targetChangedBefore(parseQueryDate( editorFilter.getLastModifiedBefore())) .targetChangedAfter( - parseDateIfPresent(editorFilter.getLastModifiedAfter())) + parseQueryDate(editorFilter.getLastModifiedAfter())) .resourceIdIs(editorFilter.getResId()) .msgContext(editorFilter.getMsgContext()) .sourceCommentContains(editorFilter.getSourceComment()) @@ -127,11 +122,6 @@ public GetTransUnitListResult execute(GetTransUnitList action, return result; } - private DateTime parseDateIfPresent(String dateInString) { - return Strings.isNullOrEmpty(dateInString) ? null - : dateFormatter.parseDateTime(dateInString); - } - private int getTotalPageIndex(int indexListSize, int countPerPage) { int totalPageNumber = (int) Math.ceil((float) indexListSize / countPerPage); diff --git a/server/services/src/test/java/org/zanata/rest/service/ProjectVersionServiceUnitTest.java b/server/services/src/test/java/org/zanata/rest/service/ProjectVersionServiceUnitTest.java index f98b8e00383..4d030c747e4 100644 --- a/server/services/src/test/java/org/zanata/rest/service/ProjectVersionServiceUnitTest.java +++ b/server/services/src/test/java/org/zanata/rest/service/ProjectVersionServiceUnitTest.java @@ -238,7 +238,9 @@ public void getTransUnitStatusWillReturnNotFoundIfDocumentNotFound() { .thenReturn(null); Response response = - service.getTransUnitStatus("a", "1", "authors", "de"); + service.getTransUnitStatus("a", "1", "authors", "de", + "", "", "", "", "", "", + "", ""); assertThat(response.getStatus()).isEqualTo(404); } @@ -249,7 +251,9 @@ public void getTransUnitStatusWillReturnNotFoundIfLocaletNotFound() { when(localeService.getByLocaleId("de")).thenReturn(null); Response response = - service.getTransUnitStatus("a", "1", "authors", "de"); + service.getTransUnitStatus("a", "1", "authors", "de", + "", "", "", "", "", "", + "", ""); assertThat(response.getStatus()).isEqualTo(404); } @@ -261,7 +265,9 @@ public void getTransUnitStatusWillGetResults() { new HLocale(LocaleId.DE)); Response response = - service.getTransUnitStatus("a", "1", "authors", "de"); + service.getTransUnitStatus("a", "1", "authors", "de", + "", "", "", "", "", "", + "", ""); assertThat(response.getStatus()).isEqualTo(200); verify(textFlowDAO).getNavigationByDocumentId(isA(DocumentId.class), isA(HLocale.class), isA( GetTransUnitsNavigationService.TextFlowResultTransformer.class), isA(FilterConstraints.class));