Skip to content

Commit

Permalink
ZNTA-2504 use dto as payload to configure MT prefill
Browse files Browse the repository at this point in the history
  • Loading branch information
Patrick Huang authored and seanf committed Jul 6, 2018
1 parent 6d4999b commit de7777c
Show file tree
Hide file tree
Showing 6 changed files with 83 additions and 33 deletions.
Expand Up @@ -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;
Expand All @@ -37,7 +38,10 @@ public class MachineTranslationPrefillTaskHandle extends AsyncTaskHandle<Void>
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() {
Expand All @@ -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();
}
}
@@ -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
* <a href="mailto:pahuang@redhat.com">pahuang@redhat.com</a>
*/
public class MachineTranslationPrefill {
private LocaleId toLocale;
private ContentState saveState;

public LocaleId getToLocale() {
return toLocale;
}

public ContentState getSaveState() {
return saveState;
}
}
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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
Expand Down Expand Up @@ -90,7 +92,7 @@ public MachineTranslationResource() {

@Path("project/{projectSlug}/version/{versionSlug}")
@GET
@CheckRole("machine-translations")
@CheckRole("machine-translation")
public List<String> getMachineTranslationSuggestion(
@PathParam("projectSlug") String projectSlug,
@PathParam("versionSlug") String versionSlug,
Expand All @@ -113,14 +115,16 @@ public List<String> 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> response =
activeProjectVersionAndLocaleValidator
.getResponseIfProjectLocaleAndVersionAreNotActive(projectSlug, versionSlug, new LocaleId(localeId));
public Response prefillVersionByMachineTranslation(
@PathParam("projectSlug") String projectSlug,
@PathParam("versionSlug") String versionSlug,
MachineTranslationPrefill prefillRequest) {
Optional<Response> response = activeProjectVersionAndLocaleValidator
.getResponseIfProjectLocaleAndVersionAreNotActive(projectSlug,
versionSlug, prefillRequest.getToLocale());

if (response.isPresent()) {
return response.get();
Expand All @@ -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<Void> handle = machineTranslationsManager
.prefillVersionWithMachineTranslations(projectSlug, versionSlug,
version, locale.getLocaleId());
version, prefillRequest);

String url = uri.getBaseUri() + "process/key/" + handle.getKeyId();
ProcessStatus processStatus = AsyncProcessService
Expand Down
Expand Up @@ -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;

/**
Expand All @@ -57,23 +55,28 @@ public class MachineTranslationsManager {
@Inject
private MachineTranslationService machineTranslationService;

public AsyncTaskHandle<Void> prefillVersionWithMachineTranslations(String projectSlug, String versionSlug, HProjectIteration projectIteration, LocaleId localeId) {
public AsyncTaskHandle<Void> 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");
Expand Down
Expand Up @@ -28,13 +28,14 @@
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;

List<String> getSuggestion(HTextFlow textFlow, LocaleId fromLocale,
LocaleId toLocale);

Future<Void> prefillWithMachineTranslation(Long versionId, LocaleId targetLocaleId,
Future<Void> prefillWithMachineTranslation(Long versionId, MachineTranslationPrefill prefillRequest,
@Nonnull MachineTranslationPrefillTaskHandle taskHandle);
}
Expand Up @@ -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;
Expand Down Expand Up @@ -175,11 +176,11 @@ private MTDocument getTranslationFromMT(MTDocument request,
@Async
@Override
public Future<Void> 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<String, HDocument> documents = version.getDocuments();
if (documents.isEmpty()) {
log.warn("no document in this version {}", version.userFriendlyToString());
Expand All @@ -201,6 +202,7 @@ public Future<Void> 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<HTextFlow> untranslatedTextFlows=
textFlowDAO
.getAllTextFlowByDocumentIdWithConstraints(
Expand Down Expand Up @@ -235,7 +237,7 @@ public Future<Void> prefillWithMachineTranslation(
MTDocument transDoc = result.get(i);

translateInBatch(docUrlToTextFlows.get(sourceDoc.getUrl()), transDoc,
targetLocale);
targetLocale, prefillRequest.getSaveState());

taskHandle.increaseProgress(1);
}
Expand All @@ -249,7 +251,7 @@ public Future<Void> prefillWithMachineTranslation(

private void translateInBatch(List<HTextFlow> 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());
Expand All @@ -266,12 +268,12 @@ private void translateInBatch(List<HTextFlow> textFlows,
int baseRevision = maybeTarget == null ? 0 : maybeTarget.getVersionNum();
List<String> 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());
Expand All @@ -288,9 +290,4 @@ private void translateInBatch(List<HTextFlow> textFlows,
}
}

private boolean shouldTranslate(ContentState contentState) {
// right now we only target untranslated. We might target more in the future
return contentState.isUntranslated();
}

}

0 comments on commit de7777c

Please sign in to comment.