Skip to content
This repository has been archived by the owner on Nov 9, 2017. It is now read-only.

Commit

Permalink
Implement validation check on document uploads via zanata client on R…
Browse files Browse the repository at this point in the history
…EST and UI
  • Loading branch information
Alex Eng committed Sep 5, 2013
1 parent 5f69d2f commit 1092756
Show file tree
Hide file tree
Showing 13 changed files with 80 additions and 53 deletions.
Expand Up @@ -113,6 +113,6 @@ public interface TranslationResult
HTextFlowTarget getTranslatedTextFlowTarget();
int getBaseVersionNum();
ContentState getBaseContentState();
List<String> getErrorMessages();
String getErrorMessage();
}
}
Expand Up @@ -80,11 +80,10 @@ List<HTextFlow> filterHasWarningOrErrorTextFlow(List<HTextFlow> textFlows, List<
/**
* Run 'Error' state validations check against sources and translations
* @param projectVersion
* @param localeId
* @param sources
* @param translations
* @return list of error message
*/
List<String> runUpdateRequestValidationsWithServerRules(HProjectIteration projectVersion, LocaleId localeId,
List<String> sources, List<String> translations);
List<String> runUpdateRequestValidationsWithServerRules(HProjectIteration projectVersion, List<String> sources,
List<String> translations);
}
Expand Up @@ -31,6 +31,7 @@

import lombok.extern.slf4j.Slf4j;

import org.apache.commons.lang.StringUtils;
import org.hibernate.HibernateException;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
Expand Down Expand Up @@ -122,7 +123,7 @@ public class TranslationServiceImpl implements TranslationService

@In(value = JpaIdentityStore.AUTHENTICATED_USER, scope = ScopeType.SESSION, required = false)
private HAccount authenticatedAccount;

@In
private ZanataIdentity identity;

Expand Down Expand Up @@ -167,19 +168,15 @@ public List<TranslationResult> translate(LocaleId localeId, List<TransUnitUpdate
result.baseVersion = hTextFlowTarget.getVersionNum();
result.baseContentState = hTextFlowTarget.getState();

if (runValidationCheck && request.getNewContentState() == ContentState.Translated)
{
List<String> validationMessages = validationServiceImpl.runUpdateRequestValidationsWithServerRules(
projectIteration, localeId, hTextFlow.getContents(), request.getNewContents());
String validationMessage = validationTranslations(request.getNewContentState(), projectIteration, request
.getTransUnitId().toString(), hTextFlow.getContents(), request.getNewContents());

if (!validationMessages.isEmpty())
{
log.warn("Translation contains validation error. Update failed {}. Error message {}",
request.getTransUnitId(), validationMessages);
result.isSuccess = false;
result.errorMessages = validationMessages;
continue;
}
if (runValidationCheck && !StringUtils.isEmpty(validationMessage))
{
log.warn(validationMessage);
result.isSuccess = false;
result.errorMessage = validationMessage;
continue;
}

if (request.getBaseTranslationVersion() == hTextFlowTarget.getVersionNum())
Expand Down Expand Up @@ -207,7 +204,7 @@ public List<TranslationResult> translate(LocaleId localeId, List<TransUnitUpdate

log.warn(errorMessage);

result.errorMessages = Lists.newArrayList(errorMessage);
result.errorMessage = errorMessage;
result.isSuccess = false;
}
result.translatedTextFlowTarget = hTextFlowTarget;
Expand Down Expand Up @@ -476,12 +473,38 @@ public List<String> translateAllInDoc(String projectSlug, String iterationSlug,
return messages;
}

/**
* Run validation check if target has changed and translation saving as 'Translated'
*/
private String validationTranslations(ContentState newState, HProjectIteration projectVersion, String targetId,
List<String> sources, List<String> translations)
{
String message = null;
if (newState == ContentState.Translated)
{
List<String> validationMessages = validationServiceImpl.runUpdateRequestValidationsWithServerRules(
projectVersion, sources, translations);

if (!validationMessages.isEmpty())
{
StringBuilder sb = new StringBuilder();
sb.append("Translation ").append(targetId).append(" contains validation error-\n");
for (String validationMessage : validationMessages)
{
sb.append(validationMessage).append("\n");
}
message = sb.toString();
}
}
return message;
}

@Override
public List<String> translateAllInDoc(final String projectSlug, final String iterationSlug, final String docId,
final LocaleId locale,
final TranslationsResource translations, final Set<String> extensions, final MergeType mergeType)
{
HProjectIteration hProjectIteration = projectIterationDAO.getBySlug(projectSlug, iterationSlug);
final HProjectIteration hProjectIteration = projectIterationDAO.getBySlug(projectSlug, iterationSlug);

if (hProjectIteration == null)
{
Expand Down Expand Up @@ -592,6 +615,18 @@ protected Boolean work() throws Exception
{
removedTargets.remove(hTarget);
}

String validationMessage = validationTranslations(incomingTarget.getState(),
hProjectIteration, incomingTarget.getResId(), textFlow.getContents(),
incomingTarget.getContents());

if (!StringUtils.isEmpty(validationMessage))
{
warnings.add(validationMessage);
log.warn(validationMessage);
continue;
}

boolean targetChanged = mergeService.merge(incomingTarget, hTarget, extensions);
if (hTarget == null)
{
Expand Down Expand Up @@ -627,7 +662,6 @@ protected Boolean work() throws Exception
}
textFlowTargetDAO.makePersistent(hTarget);
}

signalPostTranslateEvent(hTarget);
}

Expand Down Expand Up @@ -711,7 +745,7 @@ public static class TranslationResultImpl implements TranslationResult
private boolean targetChanged = false;
private int baseVersion;
private ContentState baseContentState;
private List<String> errorMessages;
private String errorMessage;

@Override
public boolean isTranslationSuccessful()
Expand Down Expand Up @@ -744,9 +778,9 @@ public ContentState getBaseContentState()
}

@Override
public List<String> getErrorMessages()
public String getErrorMessage()
{
return errorMessages;
return errorMessage;
}

}
Expand Down Expand Up @@ -832,7 +866,7 @@ private TranslationResultImpl buildFailResult(HTextFlowTarget hTextFlowTarget)
result.baseContentState = hTextFlowTarget.getState();
result.isSuccess = false;
result.translatedTextFlowTarget = hTextFlowTarget;
result.errorMessages = Lists.newArrayList();
result.errorMessage = null;
return result;
}
}
Expand Up @@ -317,7 +317,7 @@ private boolean textFlowTargetHasWarningOrError(Long textFlowId, List<Validation
}

@Override
public List<String> runUpdateRequestValidationsWithServerRules(HProjectIteration projectVersion, LocaleId localeId,
public List<String> runUpdateRequestValidationsWithServerRules(HProjectIteration projectVersion,
List<String> sources, List<String> translations)
{
Collection<ValidationAction> validationActions = getValidationAction(projectVersion, State.Error);
Expand Down
Expand Up @@ -1059,7 +1059,7 @@ private List<TransUnitUpdateInfo> processSuccessfulReplacements(final List<Trans
}
else
{
eventBus.fireEvent(new NotificationEvent(Severity.Error, messages.replaceTextFailureWithMessage(updateInfo.getTransUnit().getId().toString(), updateInfo.getErrorMessages())));
eventBus.fireEvent(new NotificationEvent(Severity.Error, messages.replaceTextFailureWithMessage(updateInfo.getTransUnit().getId().toString(), updateInfo.getErrorMessage())));
}
// individual failure behaviour not yet defined
}
Expand Down
@@ -1,7 +1,5 @@
package org.zanata.webtrans.client.resources;

import java.util.List;

import com.google.gwt.i18n.client.LocalizableResource.DefaultLocale;
import com.google.gwt.i18n.client.LocalizableResource.Generate;
import com.google.gwt.i18n.client.Messages;
Expand All @@ -17,8 +15,8 @@ public interface TableEditorMessages extends Messages
@DefaultMessage("Failed to load data from server")
String notifyLoadFailed();

@DefaultMessage("Save FAILED: {0}, messages: {1,list,string}")
String notifyUpdateFailed(String errorMessage, List<String> errorMessages);
@DefaultMessage("Save FAILED: {0}, messages: {1}")
String notifyUpdateFailed(String id, String errorMessage);

@DefaultMessage("Row {0} (Id {1}) Saved")
String notifyUpdateSaved(int rowIndex, String id);
Expand Down
Expand Up @@ -192,8 +192,8 @@ public interface WebTransMessages extends Messages
@DefaultMessage("Successfully replaced text")
String replacedTextSuccess();

@DefaultMessage("Replace text failed in text flow {0}, error message: {1,list,string}")
String replaceTextFailureWithMessage(String id, List<String> errorMessages);
@DefaultMessage("Replace text failed in text flow {0}, error message: {1}")
String replaceTextFailureWithMessage(String id, String errorMessage);

@DefaultMessage("Replace text failed")
String replaceTextFailure();
Expand Down
Expand Up @@ -212,7 +212,7 @@ public UpdateTransUnitCallback(TransUnitSaveEvent event, DocumentInfo docInfo, T
public void onFailure(Throwable e)
{
Log.error("UpdateTransUnit failure ", e);
saveFailure(Lists.newArrayList(e.getMessage()));
saveFailure(e.getMessage());
}

@Override
Expand All @@ -238,20 +238,20 @@ public void onSuccess(UpdateTransUnitResult result)
}
else
{
saveFailure(result.getUpdateInfoList().get(0).getErrorMessages());
saveFailure(result.getUpdateInfoList().get(0).getErrorMessage());
}
if (queue.hasPending())
{
performSave(id);
}
}

private void saveFailure(List<String> errorMessages)
private void saveFailure(String errorMessage)
{
queue.removeAllPending(event.getTransUnitId());
targetContentsPresenter.setEditingState(event.getTransUnitId(), TargetContentsDisplay.EditingState.UNSAVED);
eventBus.fireEvent(new NotificationEvent(NotificationEvent.Severity.Error, messages.notifyUpdateFailed("id "
+ id, errorMessages), goToRowLink));
+ id, errorMessage), goToRowLink));
}
}
}
Expand Up @@ -85,7 +85,7 @@ public UpdateTransUnitResult execute(RevertTransUnitUpdates action, ExecutionCon
TransUnitUpdateInfo updateInfo = new TransUnitUpdateInfo(translationResult.isTranslationSuccessful(),
translationResult.isTargetChanged(), new DocumentId(hTextFlow.getDocument().getId(), hTextFlow
.getDocument().getDocId()), tu, wordCount, translationResult.getBaseVersionNum(),
translationResult.getBaseContentState(), translationResult.getErrorMessages());
translationResult.getBaseContentState(), translationResult.getErrorMessage());

workspace.publish(new TransUnitUpdated(updateInfo, action.getEditorClientId(), UpdateType.Revert));
results.addUpdateResult(updateInfo);
Expand Down
Expand Up @@ -98,7 +98,7 @@ protected UpdateTransUnitResult doTranslation(LocaleId localeId, TranslationWork
TransUnitUpdateInfo updateInfo = new TransUnitUpdateInfo(translationResult.isTranslationSuccessful(),
translationResult.isTargetChanged(), new DocumentId(hTextFlow.getDocument().getId(), hTextFlow
.getDocument().getDocId()), tu, wordCount, translationResult.getBaseVersionNum(),
translationResult.getBaseContentState(), translationResult.getErrorMessages());
translationResult.getBaseContentState(), translationResult.getErrorMessage());
workspace.publish(new TransUnitUpdated(updateInfo, editorClientId, updateType));

result.addUpdateResult(updateInfo);
Expand Down
Expand Up @@ -44,7 +44,7 @@ public class TransUnitUpdateInfo implements IsSerializable
private int sourceWordCount;
private int previousVersionNum;
private ContentState previousState;
private List<String> errorMessages;
private String errorMessage;

// required for GWT rpc serialization
@SuppressWarnings("unused")
Expand All @@ -53,7 +53,7 @@ private TransUnitUpdateInfo()
}

public TransUnitUpdateInfo(boolean success, boolean targetChanged, DocumentId documentId, TransUnit transUnit,
int sourceWordCount, int previousVersionNum, ContentState previousState, List<String> errorMessages)
int sourceWordCount, int previousVersionNum, ContentState previousState, String errorMessage)
{
this.success = success;
this.targetChanged = targetChanged;
Expand All @@ -62,7 +62,7 @@ public TransUnitUpdateInfo(boolean success, boolean targetChanged, DocumentId do
this.sourceWordCount = sourceWordCount;
this.previousVersionNum = previousVersionNum;
this.previousState = previousState;
this.errorMessages = errorMessages;
this.errorMessage = errorMessage;
}

public boolean isSuccess()
Expand Down Expand Up @@ -102,13 +102,9 @@ public int getSourceWordCount()
return sourceWordCount;
}

public List<String> getErrorMessages()
public String getErrorMessage()
{
if (errorMessages == null)
{
errorMessages = Lists.newArrayList();
}
return errorMessages;
return errorMessage;
}

@Override
Expand All @@ -122,7 +118,7 @@ public String toString()
add("sourceWordCount", sourceWordCount).
add("previousVersionNum", previousVersionNum).
add("previousState", previousState).
add("errorMessages", errorMessages).
add("errorMessage", errorMessage).
toString();
// @formatter:on
}
Expand Down
Expand Up @@ -42,7 +42,7 @@ public void execute()
.setLocaleId(LocaleId.EN_US)
.setSources(firstTu.getNewContents())
.build();
TransUnitUpdateInfo updateInfo = new TransUnitUpdateInfo(true, true, new DocumentId(new Long(0), ""), tu, 5, firstTu.getBaseTranslationVersion(), ContentState.NeedReview, new ArrayList<String>());
TransUnitUpdateInfo updateInfo = new TransUnitUpdateInfo(true, true, new DocumentId(new Long(0), ""), tu, 5, firstTu.getBaseTranslationVersion(), ContentState.NeedReview, "");
UpdateTransUnitResult result = new UpdateTransUnitResult(updateInfo);
callback.onSuccess(result);
Log.info("EXIT DummyUpdateTransUnitCommand.execute()");
Expand Down
Expand Up @@ -243,7 +243,7 @@ public void onRPCSuccessAndThereIsPendingSave()
public void onPRCSuccessButSaveUnsuccessfulInResult()
{
// Given:
List<String> errorMessage = Lists.newArrayList("unsuccessful save");
String errorMessage = "unsuccessful save";
TransUnit old = TestFixture.makeTransUnit(TRANS_UNIT_ID.getId(), ContentState.NeedReview, "old content");
when(navigationService.getByIdOrNull(TRANS_UNIT_ID)).thenReturn(old);

Expand Down Expand Up @@ -292,7 +292,7 @@ public void onPRCFailure()

// Then: will reset value back
AsyncCallback<UpdateTransUnitResult> callback = resultCaptor.getValue();
when(messages.notifyUpdateFailed("id " + TRANS_UNIT_ID, Lists.newArrayList(errorMessage))).thenReturn("update failed");
when(messages.notifyUpdateFailed("id " + TRANS_UNIT_ID, errorMessage)).thenReturn("update failed");
callback.onFailure(new RuntimeException(errorMessage));
verify(targetContentsPresenter).setEditingState(saveEvent.getTransUnitId(), TargetContentsDisplay.EditingState.UNSAVED);
ArgumentCaptor<NotificationEvent> notificationEventCaptor = ArgumentCaptor.forClass(NotificationEvent.class);
Expand All @@ -304,8 +304,8 @@ public void onPRCFailure()
assertThat(event.getInlineLink(), Matchers.<InlineLink>sameInstance(goToLink));
}

private static UpdateTransUnitResult result(boolean success, TransUnit transUnit, ContentState previousState, List<String> errorMessages)
private static UpdateTransUnitResult result(boolean success, TransUnit transUnit, ContentState previousState, String errorMessage)
{
return new UpdateTransUnitResult(new TransUnitUpdateInfo(success, true, new DocumentId(new Long(1), ""), transUnit, 9, VER_NUM, previousState, errorMessages));
return new UpdateTransUnitResult(new TransUnitUpdateInfo(success, true, new DocumentId(new Long(1), ""), transUnit, 9, VER_NUM, previousState, errorMessage));
}
}

0 comments on commit 1092756

Please sign in to comment.