From de7777cc2e02f222cf61cf635e61403ce6b46a32 Mon Sep 17 00:00:00 2001 From: Patrick Huang Date: Thu, 28 Jun 2018 11:24:32 +1000 Subject: [PATCH] ZNTA-2504 use dto as payload to configure MT prefill --- .../MachineTranslationPrefillTaskHandle.java | 9 +++- .../rest/dto/MachineTranslationPrefill.java | 41 +++++++++++++++++++ .../service/MachineTranslationResource.java | 25 ++++++----- .../service/MachineTranslationsManager.java | 19 +++++---- .../service/MachineTranslationService.java | 3 +- .../impl/MachineTranslationServiceImpl.java | 19 ++++----- 6 files changed, 83 insertions(+), 33 deletions(-) create mode 100644 server/services/src/main/java/org/zanata/rest/dto/MachineTranslationPrefill.java diff --git a/server/services/src/main/java/org/zanata/async/handle/MachineTranslationPrefillTaskHandle.java b/server/services/src/main/java/org/zanata/async/handle/MachineTranslationPrefillTaskHandle.java index a2953db1fb..b3ae01d87f 100644 --- a/server/services/src/main/java/org/zanata/async/handle/MachineTranslationPrefillTaskHandle.java +++ b/server/services/src/main/java/org/zanata/async/handle/MachineTranslationPrefillTaskHandle.java @@ -21,6 +21,7 @@ package org.zanata.async.handle; import org.zanata.async.AsyncTaskHandle; +import org.zanata.async.AsyncTaskKey; import org.zanata.async.UserTriggeredTaskHandle; import org.zanata.common.LocaleId; import org.zanata.webtrans.shared.model.DocumentId; @@ -37,7 +38,10 @@ public class MachineTranslationPrefillTaskHandle extends AsyncTaskHandle private static final long serialVersionUID = 1704257523049053603L; private String triggeredBy; private String targetVersion; - private long totalTextFlows; + + public MachineTranslationPrefillTaskHandle(AsyncTaskKey key) { + super.setKeyId(key.id()); + } @Override public String getTriggeredBy() { @@ -58,7 +62,8 @@ public String toString() { return MoreObjects.toStringHelper(this).omitNullValues() .add("targetVersion", targetVersion) .add("currentProgress", currentProgress) - .add("maxProgress", maxProgress).add("triggeredBy", triggeredBy) + .add("maxProgress", maxProgress) + .add("triggeredBy", triggeredBy) .toString(); } } diff --git a/server/services/src/main/java/org/zanata/rest/dto/MachineTranslationPrefill.java b/server/services/src/main/java/org/zanata/rest/dto/MachineTranslationPrefill.java new file mode 100644 index 0000000000..db042e8d72 --- /dev/null +++ b/server/services/src/main/java/org/zanata/rest/dto/MachineTranslationPrefill.java @@ -0,0 +1,41 @@ +/* + * Copyright 2018, Red Hat, Inc. and individual contributors + * as indicated by the @author tags. See the copyright.txt file in the + * distribution for a full listing of individual contributors. + * + * This is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this software; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA, or see the FSF site: http://www.fsf.org. + */ +package org.zanata.rest.dto; + +import org.zanata.common.ContentState; +import org.zanata.common.LocaleId; + +/** + * @author Patrick Huang + * pahuang@redhat.com + */ +public class MachineTranslationPrefill { + private LocaleId toLocale; + private ContentState saveState; + + public LocaleId getToLocale() { + return toLocale; + } + + public ContentState getSaveState() { + return saveState; + } +} diff --git a/server/services/src/main/java/org/zanata/rest/service/MachineTranslationResource.java b/server/services/src/main/java/org/zanata/rest/service/MachineTranslationResource.java index dcc81115fa..1e048436b1 100644 --- a/server/services/src/main/java/org/zanata/rest/service/MachineTranslationResource.java +++ b/server/services/src/main/java/org/zanata/rest/service/MachineTranslationResource.java @@ -24,6 +24,7 @@ import java.util.Optional; import javax.inject.Inject; +import javax.ws.rs.DefaultValue; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; @@ -36,6 +37,7 @@ import javax.ws.rs.core.UriInfo; import org.zanata.async.AsyncTaskHandle; +import org.zanata.common.ContentState; import org.zanata.common.LocaleId; import org.zanata.dao.DocumentDAO; import org.zanata.dao.TextFlowDAO; @@ -45,12 +47,12 @@ import org.zanata.model.HProjectIteration; import org.zanata.model.HTextFlow; import org.zanata.rest.NoSuchEntityException; +import org.zanata.rest.dto.MachineTranslationPrefill; import org.zanata.rest.dto.ProcessStatus; import org.zanata.security.ZanataIdentity; import org.zanata.security.annotations.CheckRole; import org.zanata.service.MachineTranslationService; import org.zanata.util.HttpUtil; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; /** * @author Patrick Huang @@ -90,7 +92,7 @@ public MachineTranslationResource() { @Path("project/{projectSlug}/version/{versionSlug}") @GET - @CheckRole("machine-translations") + @CheckRole("machine-translation") public List getMachineTranslationSuggestion( @PathParam("projectSlug") String projectSlug, @PathParam("versionSlug") String versionSlug, @@ -113,14 +115,16 @@ public List getMachineTranslationSuggestion( } - @CheckRole("machine-translations") + @CheckRole("machine-translation") @POST @Path("project/{projectSlug}/version/{versionSlug}") - public Response prefillVersionByMachineTranslation(@PathParam("projectSlug") String projectSlug, - @PathParam("versionSlug") String versionSlug, @QueryParam("toLocale") String localeId) { - Optional response = - activeProjectVersionAndLocaleValidator - .getResponseIfProjectLocaleAndVersionAreNotActive(projectSlug, versionSlug, new LocaleId(localeId)); + public Response prefillVersionByMachineTranslation( + @PathParam("projectSlug") String projectSlug, + @PathParam("versionSlug") String versionSlug, + MachineTranslationPrefill prefillRequest) { + Optional response = activeProjectVersionAndLocaleValidator + .getResponseIfProjectLocaleAndVersionAreNotActive(projectSlug, + versionSlug, prefillRequest.getToLocale()); if (response.isPresent()) { return response.get(); @@ -131,12 +135,11 @@ public Response prefillVersionByMachineTranslation(@PathParam("projectSlug") Str activeProjectVersionAndLocaleValidator.getVersion(); HLocale locale = activeProjectVersionAndLocaleValidator.getLocale(); - identity.checkPermission("modify-translation", - hProject, locale); + identity.checkPermission("modify-translation", hProject, locale); AsyncTaskHandle handle = machineTranslationsManager .prefillVersionWithMachineTranslations(projectSlug, versionSlug, - version, locale.getLocaleId()); + version, prefillRequest); String url = uri.getBaseUri() + "process/key/" + handle.getKeyId(); ProcessStatus processStatus = AsyncProcessService diff --git a/server/services/src/main/java/org/zanata/rest/service/MachineTranslationsManager.java b/server/services/src/main/java/org/zanata/rest/service/MachineTranslationsManager.java index 501a2737ed..a521f60d6e 100644 --- a/server/services/src/main/java/org/zanata/rest/service/MachineTranslationsManager.java +++ b/server/services/src/main/java/org/zanata/rest/service/MachineTranslationsManager.java @@ -30,15 +30,13 @@ import org.zanata.async.AsyncTaskHandleManager; import org.zanata.async.GenericAsyncTaskKey; import org.zanata.async.handle.MachineTranslationPrefillTaskHandle; -import org.zanata.common.LocaleId; import org.zanata.model.HAccount; import org.zanata.model.HProjectIteration; +import org.zanata.rest.dto.MachineTranslationPrefill; import org.zanata.security.annotations.Authenticated; import org.zanata.service.MachineTranslationService; import org.zanata.webtrans.shared.model.ProjectIterationId; -import com.google.common.base.MoreObjects; - import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; /** @@ -57,23 +55,28 @@ public class MachineTranslationsManager { @Inject private MachineTranslationService machineTranslationService; - public AsyncTaskHandle prefillVersionWithMachineTranslations(String projectSlug, String versionSlug, HProjectIteration projectIteration, LocaleId localeId) { + public AsyncTaskHandle prefillVersionWithMachineTranslations(String projectSlug, String versionSlug, HProjectIteration projectIteration, MachineTranslationPrefill prefillRequest) { + ProjectIterationId projectIterationId = + new ProjectIterationId(projectSlug, versionSlug, + projectIteration.getProjectType()); MachineTranslationsForVersionTaskKey taskKey = new MachineTranslationsForVersionTaskKey( - new ProjectIterationId(projectSlug, versionSlug, - projectIteration.getProjectType())); + projectIterationId); MachineTranslationPrefillTaskHandle taskHandle = (MachineTranslationPrefillTaskHandle) asyncTaskHandleManager.getHandleByKey(taskKey); if (AsyncTaskHandle.taskIsNotRunning(taskHandle)) { - taskHandle = new MachineTranslationPrefillTaskHandle(); + taskHandle = new MachineTranslationPrefillTaskHandle(taskKey); taskHandle.setTriggeredBy(authenticatedAccount.getUsername()); + taskHandle.setTargetVersion(projectIterationId.toString()); asyncTaskHandleManager.registerTaskHandle(taskHandle, taskKey); - machineTranslationService.prefillWithMachineTranslation(projectIteration.getId(), localeId, taskHandle); + machineTranslationService.prefillWithMachineTranslation( + projectIteration.getId(), prefillRequest, + taskHandle); } else { log.warn("there is already a task running {}", taskKey); throw new UnsupportedOperationException("task already running"); diff --git a/server/services/src/main/java/org/zanata/service/MachineTranslationService.java b/server/services/src/main/java/org/zanata/service/MachineTranslationService.java index 33ba2ba621..95189a64cd 100644 --- a/server/services/src/main/java/org/zanata/service/MachineTranslationService.java +++ b/server/services/src/main/java/org/zanata/service/MachineTranslationService.java @@ -28,6 +28,7 @@ import org.zanata.async.handle.MachineTranslationPrefillTaskHandle; import org.zanata.common.LocaleId; import org.zanata.model.HTextFlow; +import org.zanata.rest.dto.MachineTranslationPrefill; public interface MachineTranslationService { int BATCH_SIZE = 100; @@ -35,6 +36,6 @@ public interface MachineTranslationService { List getSuggestion(HTextFlow textFlow, LocaleId fromLocale, LocaleId toLocale); - Future prefillWithMachineTranslation(Long versionId, LocaleId targetLocaleId, + Future prefillWithMachineTranslation(Long versionId, MachineTranslationPrefill prefillRequest, @Nonnull MachineTranslationPrefillTaskHandle taskHandle); } diff --git a/server/services/src/main/java/org/zanata/service/impl/MachineTranslationServiceImpl.java b/server/services/src/main/java/org/zanata/service/impl/MachineTranslationServiceImpl.java index 9b86e011a5..4366d173c7 100644 --- a/server/services/src/main/java/org/zanata/service/impl/MachineTranslationServiceImpl.java +++ b/server/services/src/main/java/org/zanata/service/impl/MachineTranslationServiceImpl.java @@ -56,6 +56,7 @@ import org.zanata.model.HTextFlow; import org.zanata.model.HTextFlowTarget; import org.zanata.model.type.TranslationSourceType; +import org.zanata.rest.dto.MachineTranslationPrefill; import org.zanata.service.LocaleService; import org.zanata.service.MachineTranslationService; import org.zanata.service.TranslationService; @@ -175,11 +176,11 @@ private MTDocument getTranslationFromMT(MTDocument request, @Async @Override public Future prefillWithMachineTranslation( - Long versionId, LocaleId targetLocaleId, + Long versionId, MachineTranslationPrefill prefillRequest, @Nonnull MachineTranslationPrefillTaskHandle taskHandle) { // need to reload all entities HProjectIteration version = entityManager.find(HProjectIteration.class, versionId); - HLocale targetLocale = localeService.getByLocaleId(targetLocaleId); + HLocale targetLocale = localeService.getByLocaleId(prefillRequest.getToLocale()); Map documents = version.getDocuments(); if (documents.isEmpty()) { log.warn("no document in this version {}", version.userFriendlyToString()); @@ -201,6 +202,7 @@ public Future prefillWithMachineTranslation( for (HDocument doc : documents.values()) { DocumentId documentId = new DocumentId(doc.getId(), doc.getDocId()); + // right now we only target untranslated. We might target more in the future List untranslatedTextFlows= textFlowDAO .getAllTextFlowByDocumentIdWithConstraints( @@ -235,7 +237,7 @@ public Future prefillWithMachineTranslation( MTDocument transDoc = result.get(i); translateInBatch(docUrlToTextFlows.get(sourceDoc.getUrl()), transDoc, - targetLocale); + targetLocale, prefillRequest.getSaveState()); taskHandle.increaseProgress(1); } @@ -249,7 +251,7 @@ public Future prefillWithMachineTranslation( private void translateInBatch(List textFlows, MTDocument transDoc, - HLocale targetLocale) { + HLocale targetLocale, ContentState saveState) { int index = 0; while (index < textFlows.size()) { int bound = Math.min(index + BATCH_SIZE, textFlows.size()); @@ -266,12 +268,12 @@ private void translateInBatch(List textFlows, int baseRevision = maybeTarget == null ? 0 : maybeTarget.getVersionNum(); List translation = Lists.newArrayList( transContentBatch.get(i).getValue()); - // TODO saved state should be configurable from UI // TODO TranslationSourceType only says MT but without provider name TransUnitUpdateRequest updateRequest = new TransUnitUpdateRequest( new TransUnitId(textFlow.getId()), - translation, ContentState.NeedReview, + translation, + saveState, baseRevision, TranslationSourceType.MACHINE_TRANS .getAbbr()); @@ -288,9 +290,4 @@ private void translateInBatch(List textFlows, } } - private boolean shouldTranslate(ContentState contentState) { - // right now we only target untranslated. We might target more in the future - return contentState.isUntranslated(); - } - }