From 08a06ad722683a4698aa9b26741d631373186e82 Mon Sep 17 00:00:00 2001 From: Alex Eng Date: Mon, 23 Sep 2013 09:45:01 +1000 Subject: [PATCH] Squashed commit of the following: commit ffa2b634184573d53500d87d992b654942203788 Author: Alex Eng Date: Mon Sep 23 09:38:45 2013 +1000 Update comments on method commit e6b261bedd545a0bb821ff0ae658586ee73f2d9f Author: Alex Eng Date: Mon Sep 23 09:33:56 2013 +1000 Replace treemap with hashmap commit 3b56302e685e23c60fd90c0b554905baa064bac5 Merge: f597acf b2714d6 Author: Alex Eng Date: Mon Sep 23 09:19:53 2013 +1000 Merge branch 'integration/master' into enforcedValidation commit f597acf0a642b41cae3534e40d06e5ea76d964d6 Author: Alex Eng Date: Mon Sep 23 09:19:34 2013 +1000 Fire validation event when workspace context changes commit 436b9bffa0d45e8dfc2853ab5e880d5d0e800430 Author: Alex Eng Date: Fri Sep 20 17:23:52 2013 +1000 Refactor comments and method name, remove translatWithoutValidation as it only apply for revert translation commit c8cb5fff95a4e787eced5234eee0cb5a64abbfce Merge: 101682d 49b2450 Author: Alex Eng Date: Fri Sep 20 15:48:46 2013 +1000 Merge branch 'integration/master' into enforcedValidation Conflicts: zanata-war/src/main/java/org/zanata/webtrans/client/ui/ShortcutContextAwareDialogBox.java commit 101682d225fbd7ddf353f0e82525b2c042425a63 Author: Alex Eng Date: Fri Sep 20 15:46:42 2013 +1000 Add comments on methos commit d83a16e9f383c46da6b87e6a6f7f1f5f3aa90da8 Author: Alex Eng Date: Fri Sep 20 15:45:13 2013 +1000 Refactor ValidationServiceImpl, to reuse implemented method commit 5ec500233946d15cbd7e0606861c9ea1dec1475a Author: Alex Eng Date: Fri Sep 20 15:31:14 2013 +1000 Rename variables, method name commit fe2d17e781354bf7606e0eb6771f36a1bbeba785 Author: Alex Eng Date: Fri Sep 20 14:42:36 2013 +1000 Refactor names and implementation commit 6c851f52837963639567e9019b3d408edae59b17 Author: Alex Eng Date: Fri Sep 20 09:15:54 2013 +1000 Merge project/version validationOptionsAction, create validation_options template for both project and version create/edit page commit 0ed29a339fa5f0d9a13004bf4c496c7019691b48 Author: Alex Eng Date: Fri Sep 20 07:02:32 2013 +1000 Rename and refactor implementation commit e860f85c74596c796289c8a17ec4433d5572508e Author: Alex Eng Date: Wed Sep 18 08:35:17 2013 +1000 Fix sharing same validation action in different session commit 292b87f3e0f525c7e947cfb50dceca49ec9480f3 Author: Alex Eng Date: Wed Sep 18 08:25:00 2013 +1000 fix sharing of validation action between sessions commit c8f9121150e2c4c91fd090a1f98ef6b8594819c2 Author: Alex Eng Date: Tue Sep 17 15:59:55 2013 +1000 move validation check before Htarget attached to textflow commit e3cbde83fa4308ad3fee480aebcf8fb0f1ce0e5c Author: Alex Eng Date: Tue Sep 17 14:30:35 2013 +1000 disable mutual exclusive validation option in editor commit 4827f738bef73bd6f7bb61df877254f79dea3170 Author: Alex Eng Date: Tue Sep 17 13:30:16 2013 +1000 Implement validation check on copy trans service commit 6e648e44610c7d2ea6b5c74357448c948cc10fd8 Author: Alex Eng Date: Tue Sep 17 11:31:24 2013 +1000 Add validation help in create project/version page commit f3e3709457620e73d72540a2b9ec19f5f46d81a1 Merge: af77b2c 7a06c68 Author: Alex Eng Date: Tue Sep 17 10:31:47 2013 +1000 Merge branch 'integration/master' into enforcedValidation commit af77b2c0acbf731558a94e79f31cedc4b285c1cf Author: Alex Eng Date: Tue Sep 17 10:31:20 2013 +1000 Add validation option help in edit project/version page commit ee5f8f80940ce8ed0c315b1cc6ee057e18d762f0 Merge: 38f0411 c906adc Author: Alex Eng Date: Fri Sep 13 15:28:42 2013 +1000 Merge branch 'integration/master' into enforcedValidation commit 38f041191d575b35a5141d78e5cab005133dbccc Author: Alex Eng Date: Fri Sep 13 15:28:13 2013 +1000 Fix unit test, fix validation warning dialog to disable editor shortcut commit 30cfd189179af0690af4dbf8b472f136c069406c Merge: 1723848 6a43a65 Author: Alex Eng Date: Fri Sep 13 10:48:57 2013 +1000 Merge branch 'integration/master' into enforcedValidation commit 1723848f0a91d6ffa66112fbf6a1b98e28dacfef Author: Alex Eng Date: Thu Sep 12 17:02:06 2013 +1000 Fix validation row shown if changes made in project/version page commit fb16f00cb0cd5f06bc11695aaf97002999db2931 Author: Alex Eng Date: Thu Sep 12 15:06:01 2013 +1000 Add validation list for creating new project/version commit 4c7f7bad0b7ede900757c52ef5cc99183a7188c7 Author: Alex Eng Date: Thu Sep 12 14:22:28 2013 +1000 Fix missing set instantiate commit ecb1ce48169e8a02c55452a462544ec2a0ea9e45 Merge: 6f1eb98 cb251ee Author: Alex Eng Date: Thu Sep 12 13:38:26 2013 +1000 Merge branch 'integration/master' into enforcedValidation commit 6f1eb984fe9d3b3365042c34c704d7999f813b17 Author: Alex Eng Date: Thu Sep 12 13:38:03 2013 +1000 Remove unused fields, refactor validationwarningpanel to use TextContetnsDisplay rather than hightlighting label commit 298cbf6d718359da579ac7b603e6e686da1ed960 Merge: 1a100e8 bf11906 Author: Alex Eng Date: Thu Sep 12 09:39:14 2013 +1000 Merge branch 'integration/master' into enforcedValidation Conflicts: zanata-model/src/main/java/org/zanata/model/SlugEntityBase.java zanata-war/src/main/java/org/zanata/action/ProjectIterationHome.java zanata-war/src/main/java/org/zanata/webtrans/server/rpc/AddReviewCommentHandler.java zanata-war/src/test/java/org/zanata/webtrans/client/presenter/TransMemoryMergePresenterTest.java commit 1a100e8d542011df18e1614e2b55e400423b38be Merge: fda5c2c 8344ad3 Author: Alex Eng Date: Tue Sep 10 12:25:21 2013 +1000 Merge branch 'enforcedValidation' of github.com:zanata/zanata-server into enforcedValidation commit fda5c2cce9890e3f0c3f06d24e35e8e80cd52e0d Author: Alex Eng Date: Tue Sep 10 12:24:49 2013 +1000 fix unit test commit a72aea8c2de07826b2c58ba75fedb45f8711fdeb Merge: 1aba6bc 627dd85 Author: Alex Eng Date: Tue Sep 10 10:38:29 2013 +1000 Merge branch 'integration/master' into enforcedValidation commit 8344ad356b1458fb9d308118609df31e3e78da0c Author: Alex Eng Date: Mon Sep 9 14:21:01 2013 +1000 Disable editor keyshortcut when popup commit 38f17d59d54403d7745c503c2d52e320e2d61022 Merge: bc7c3b6 e5cdc12 Author: Alex Eng Date: Mon Sep 9 14:00:59 2013 +1000 Merge branch 'integration/master' into enforcedValidation commit bc7c3b65324559c6c9ccd417c12d7b738ba86132 Merge: 1aba6bc b3634f3 Author: Alex Eng Date: Mon Sep 9 10:35:06 2013 +1000 Merge branch 'integration/master' into enforcedValidation commit 1aba6bc9560072b7b679418ef14a9ce201c87331 Author: Alex Eng Date: Fri Sep 6 09:40:27 2013 +1000 Refactor validation warning popup commit 6c8a258a0ce5a5cff87d693ce7947da5e59405f7 Author: Alex Eng Date: Thu Sep 5 15:57:10 2013 +1000 Refactor implementation on validation check in translationservice commit 1092756d633ca1dad23d10f8e74ec9f467b0dc1c Author: Alex Eng Date: Thu Sep 5 15:54:14 2013 +1000 Implement validation check on document uploads via zanata client on REST and UI commit 5f69d2fcfdb54a968e6b10481001e8128f28c0b5 Author: Alex Eng Date: Thu Sep 5 11:01:11 2013 +1000 Add unit test for validation warning popup commit 7cd4781687aa9cb49216a81a473ed89bea0ef909 Author: Alex Eng Date: Thu Sep 5 10:39:58 2013 +1000 Fix unit test commit 632ecc9a80c216926e20ee5a171b75de25456724 Merge: e13fcf8 b370025 Author: Alex Eng Date: Thu Sep 5 09:56:45 2013 +1000 Merge branch 'integration/master' into enforcedValidation Conflicts: zanata-war/src/main/java/org/zanata/service/impl/TranslationServiceImpl.java commit e13fcf89734251b72a2ecc77d4e76544e2e412e5 Author: Alex Eng Date: Thu Sep 5 09:41:29 2013 +1000 Implemen TM merge and searchreplace to handle validation error commit b34ef8f811be4d89785c425affaee372e5786b75 Author: Alex Eng Date: Wed Sep 4 07:16:42 2013 +1000 Refactor validation service commit fcfea91a10ef5eee623f769c7b5538e07cfc5155 Author: Alex Eng Date: Tue Sep 3 15:13:01 2013 +1000 Refactor validation service commit 150a92a35666bb0004f67f82e34fd33c95bf1791 Author: Alex Eng Date: Mon Sep 2 14:57:15 2013 +1000 Work in progress: server side validation checking on editor update translation commit 72697eff2791770e094ec289502bbdbdcdcd2371 Author: Alex Eng Date: Mon Sep 2 10:48:25 2013 +1000 Implement validation warning popup when save translation that has error commit 8f9fa9dae2b5ce9f847b56b7db916c5805879357 Merge: 4db56e7 36974bd Author: Alex Eng Date: Mon Sep 2 08:55:26 2013 +1000 Merge branch 'enforcedValidation' of github.com:zanata/zanata-server into enforcedValidation Conflicts: zanata-war/src/main/java/org/zanata/webtrans/client/presenter/TargetContentsPresenter.java commit 4db56e7c3d35b9a33a4bd67447891f85625c2fea Author: Alex Eng Date: Mon Sep 2 08:54:23 2013 +1000 work in progress: validation warning popup commit 36974bd34a503d61b0a1caf17367f520920013ed Author: Alex Eng Date: Fri Aug 30 16:06:13 2013 +1000 Work in progress: implementing popup validation warning when save commit fac276a0edbe66fe4a152d277444a17aec06fda2 Author: Alex Eng Date: Wed Aug 28 13:36:15 2013 +1000 Implement locked, enabled, disabled validation according to server rules in client commit 5743dfc8b24d3fd19b5bab709ee64be45a70ef87 Author: Alex Eng Date: Tue Aug 27 09:59:55 2013 +1000 Work in progress: handling new states for validation commit 1306059a1b56a83b35c490f377031013ec8ae537 Author: Alex Eng Date: Mon Aug 26 15:13:55 2013 +1000 Work in progress: applying new validation action state in editor commit 2d27fffa738e9bff0efde1e9eafe6b710bdec67b Author: Alex Eng Date: Fri Aug 23 15:36:01 2013 +1000 Work in progress: refactoring validationservice for new state commit 8277879375005271a512cabe4375846504210892 Author: Alex Eng Date: Thu Aug 22 16:25:27 2013 +1000 Make validation option visible all the time commit c06e94e501b5bb31bf1b1beb8a036577f6787ec9 Author: Alex Eng Date: Thu Aug 22 16:15:53 2013 +1000 reformat xhtml file commit f38d7b2e62df50f8a47cd57bb094108866b15b05 Author: Alex Eng Date: Thu Aug 22 16:06:23 2013 +1000 Work in progress: new states for validation action in project/version edit page --- .../org/zanata/model/HIterationGroup.java | 68 +-- .../main/java/org/zanata/model/HProject.java | 185 +++---- .../org/zanata/model/HProjectIteration.java | 171 ++----- .../java/org/zanata/model/SlugEntityBase.java | 21 +- .../org/zanata/action/LocaleListAction.java | 2 +- .../java/org/zanata/action/ProfileAction.java | 13 +- .../java/org/zanata/action/ProjectHome.java | 52 +- .../zanata/action/ProjectIterationHome.java | 67 +-- .../action/ProjectIterationLocaleAction.java | 2 +- .../ProjectValidationOptionsAction.java | 131 ----- .../action/ValidationOptionsAction.java | 81 +++ .../VersionValidationOptionsAction.java | 151 ------ .../rest/service/ProjectIterationService.java | 3 +- .../zanata/service/TranslationService.java | 2 +- .../zanata/service/TranslationStateCache.java | 2 +- .../service/ValidationFactoryProvider.java | 28 ++ .../org/zanata/service/ValidationService.java | 33 +- .../service/impl/CopyTransServiceImpl.java | 130 +++-- .../service/impl/LocaleServiceImpl.java | 10 +- .../service/impl/TranslationServiceImpl.java | 476 ++++++++++-------- .../impl/TranslationStateCacheImpl.java | 2 +- .../service/impl/ValidationServiceImpl.java | 214 ++++---- .../zanata/webtrans/client/Application.java | 2 +- .../client/events/FilterViewEvent.java | 18 +- .../client/events/RunValidationEvent.java | 8 +- .../events/WorkspaceContextUpdateEvent.java | 10 +- .../webtrans/client/keys/ShortcutContext.java | 7 +- .../presenter/KeyShortcutPresenter.java | 79 ++- .../presenter/SearchResultsPresenter.java | 5 +- .../presenter/TargetContentsPresenter.java | 153 +++--- .../presenter/TransUnitsTablePresenter.java | 26 +- .../presenter/ValidationOptionsPresenter.java | 31 +- .../client/resources/TableEditorMessages.java | 38 +- .../client/resources/ValidationMessages.java | 21 +- .../client/resources/WebTransMessages.java | 5 + .../service/HistoryEventHandlerService.java | 9 +- .../client/service/TransUnitSaveService.java | 41 +- .../client/service/ValidationService.java | 79 +-- .../org/zanata/webtrans/client/ui/Editor.java | 8 +- .../client/ui/HasUpdateValidationMessage.java | 11 + .../client/ui/HasUpdateValidationWarning.java | 8 - .../ui/SaveAsApprovedConfirmationPanel.java | 2 +- .../ui/ShortcutContextAwareDialogBox.java | 13 +- .../webtrans/client/ui/ToggleEditor.java | 2 +- .../client/ui/TranslationHistoryDisplay.java | 1 - .../client/ui/ValidationMessagePanelView.java | 99 +++- .../ui/ValidationMessagePanelView.ui.xml | 128 +++-- .../client/ui/ValidationWarningDisplay.java | 46 ++ .../client/ui/ValidationWarningPanel.java | 148 ++++++ .../client/ui/ValidationWarningPanel.ui.xml | 23 + .../client/view/TargetContentsDisplay.java | 11 +- .../client/view/TargetContentsView.java | 18 +- .../client/view/ValidationOptionsView.ui.xml | 1 - .../TranslationWorkspaceManagerImpl.java | 11 +- .../server/rpc/ActivateWorkspaceHandler.java | 4 +- .../server/rpc/GetTransUnitListHandler.java | 4 +- .../server/rpc/GetValidationRulesHandler.java | 41 +- .../rpc/RevertTransUnitUpdatesHandler.java | 62 +-- .../server/rpc/TransUnitUpdateHelper.java | 77 +++ .../server/rpc/UpdateTransUnitHandler.java | 82 ++- .../shared/model/TransUnitUpdateInfo.java | 25 +- .../shared/model/ValidationAction.java | 13 +- .../shared/model/ValidationDisplayRules.java | 72 +++ .../webtrans/shared/model/ValidationInfo.java | 45 -- .../shared/rpc/ActivateWorkspaceResult.java | 12 +- .../shared/rpc/GetValidationRulesResult.java | 14 +- .../rpc/HasWorkspaceContextUpdateData.java | 4 +- .../shared/rpc/WorkspaceContextUpdate.java | 12 +- .../validation/AbstractValidationAction.java | 42 +- .../shared/validation/ValidationFactory.java | 102 ++-- .../action/HtmlXmlTagValidation.java | 43 +- .../action/JavaVariablesValidation.java | 39 +- .../action/NewlineLeadTrailValidation.java | 27 +- .../action/PrintfVariablesValidation.java | 46 +- .../action/PrintfXSIExtensionValidation.java | 44 +- .../validation/action/TabValidation.java | 19 +- .../action/XmlEntityValidation.java | 24 +- .../db/changelogs/db.changelog-3.1.xml | 5 + .../db/changelogs/db.changelog-3.1a.xml | 47 ++ .../src/main/resources/db/db.changelog.xml | 1 + .../src/main/resources/messages.properties | 7 +- .../WEB-INF/classes/META-INF/components.xml | 4 - .../WEB-INF/layout/iteration_edit_form.xhtml | 213 ++++---- .../WEB-INF/layout/project_edit_form.xhtml | 375 +++++++------- .../WEB-INF/layout/validation_options.xhtml | 30 ++ .../layout/validation_options_legend.xhtml | 20 + zanata-war/src/main/webapp/WEB-INF/pages.xml | 8 +- .../src/main/webapp/iteration/edit.xhtml | 26 +- .../main/webapp/project/add_iteration.xhtml | 41 +- .../main/webapp/project/create_project.xhtml | 27 +- zanata-war/src/main/webapp/project/edit.xhtml | 26 +- .../service/TranslationResourceRestTest.java | 10 +- .../service/TranslationServiceRestTest.java | 8 +- .../impl/CopyTransServiceImplTest.java | 1 + .../impl/TranslationServiceImplTest.java | 1 + .../impl/TranslationStateCacheImplTest.java | 4 +- .../client/presenter/AppPresenterTest.java | 25 +- .../DocumentListOptionsPresenterTest.java | 4 +- .../presenter/DocumentListPresenterTest.java | 166 ++++-- .../presenter/EditorOptionsPresenterTest.java | 4 +- .../TargetContentsPresenterTest.java | 134 +++-- .../presenter/TransFilterPresenterTest.java | 4 +- .../TransMemoryMergePresenterTest.java | 15 +- .../TransUnitsTablePresenterTest.java | 18 +- .../rpc/DummyActivateWorkspaceCommand.java | 8 +- .../rpc/DummyUpdateTransUnitCommand.java | 2 + .../service/TransUnitSaveServiceTest.java | 22 +- .../client/service/ValidationServiceTest.java | 37 +- .../TranslationWorkspaceManagerImplTest.java | 2 +- .../rpc/ActivateWorkspaceHandlerTest.java | 8 +- .../RevertTransUnitUpdatesHandlerTest.java | 18 +- .../rpc/TransMemoryMergeHandlerTest.java | 49 +- .../validation/HtmlXmlTagValidationTests.java | 2 +- .../JavaVariablesValidationTest.java | 2 +- .../NewlineLeadTrailValidationTests.java | 2 +- .../PrintfVariablesValidationTest.java | 2 +- .../PrintfXSIExtensionValidationTest.java | 2 +- .../shared/validation/TabValidationTest.java | 2 +- .../validation/XMLEntityValidationTests.java | 2 +- zanata-war/src/test/resources/arquillian.xml | 2 +- .../test/model/CopyTransTestData.dbunit.xml | 5 - .../test/model/DocumentsData.dbunit.xml | 1 - .../zanata/test/model/ProjectsData.dbunit.xml | 11 - .../test/model/TextFlowTestData.dbunit.xml | 1 + .../GetTransUnitListTest.dbunit.xml | 4 +- 125 files changed, 2754 insertions(+), 2413 deletions(-) delete mode 100644 zanata-war/src/main/java/org/zanata/action/ProjectValidationOptionsAction.java create mode 100644 zanata-war/src/main/java/org/zanata/action/ValidationOptionsAction.java delete mode 100644 zanata-war/src/main/java/org/zanata/action/VersionValidationOptionsAction.java create mode 100644 zanata-war/src/main/java/org/zanata/webtrans/client/ui/HasUpdateValidationMessage.java delete mode 100644 zanata-war/src/main/java/org/zanata/webtrans/client/ui/HasUpdateValidationWarning.java create mode 100644 zanata-war/src/main/java/org/zanata/webtrans/client/ui/ValidationWarningDisplay.java create mode 100644 zanata-war/src/main/java/org/zanata/webtrans/client/ui/ValidationWarningPanel.java create mode 100644 zanata-war/src/main/java/org/zanata/webtrans/client/ui/ValidationWarningPanel.ui.xml create mode 100644 zanata-war/src/main/java/org/zanata/webtrans/server/rpc/TransUnitUpdateHelper.java create mode 100644 zanata-war/src/main/java/org/zanata/webtrans/shared/model/ValidationDisplayRules.java delete mode 100644 zanata-war/src/main/java/org/zanata/webtrans/shared/model/ValidationInfo.java create mode 100644 zanata-war/src/main/resources/db/changelogs/db.changelog-3.1a.xml create mode 100644 zanata-war/src/main/webapp/WEB-INF/layout/validation_options.xhtml create mode 100644 zanata-war/src/main/webapp/WEB-INF/layout/validation_options_legend.xhtml diff --git a/zanata-model/src/main/java/org/zanata/model/HIterationGroup.java b/zanata-model/src/main/java/org/zanata/model/HIterationGroup.java index db8c9664b6..30384e526e 100644 --- a/zanata-model/src/main/java/org/zanata/model/HIterationGroup.java +++ b/zanata-model/src/main/java/org/zanata/model/HIterationGroup.java @@ -20,9 +20,10 @@ */ package org.zanata.model; -import java.util.HashSet; import java.util.Set; +import javax.persistence.Access; +import javax.persistence.AccessType; import javax.persistence.Entity; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; @@ -30,6 +31,7 @@ import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; +import lombok.Getter; import lombok.Setter; import org.hibernate.annotations.Type; @@ -37,50 +39,40 @@ import org.hibernate.validator.constraints.NotEmpty; import org.zanata.common.EntityStatus; +import com.google.common.collect.Sets; + /** * @author Alex Eng aeng@redhat.com */ @Entity @Setter -// @EqualsAndHashCode(callSuper = true) +@Getter +@Access(AccessType.FIELD) public class HIterationGroup extends SlugEntityBase implements HasEntityStatus { private static final long serialVersionUID = 5682522115222479842L; - private String name; - - private String description; - - private Set maintainers; - - private Set projectIterations; - - private EntityStatus status = EntityStatus.ACTIVE; @Size(max = 80) @NotEmpty @Field() - public String getName() - { - return name; - } + private String name; @Size(max = 100) @Field() - public String getDescription() - { - return description; - } + private String description; @ManyToMany - @JoinTable(name = "HIterationGroup_Maintainer", joinColumns = @JoinColumn(name = "iterationGroupId"), inverseJoinColumns = @JoinColumn(name = "personId")) - public Set getMaintainers() - { - if (maintainers == null) - { - maintainers = new HashSet(); - } - return maintainers; - } + @JoinTable(name = "HIterationGroup_Maintainer", joinColumns = @JoinColumn(name = "iterationGroupId"), + inverseJoinColumns = @JoinColumn(name = "personId")) + private Set maintainers = Sets.newHashSet(); + + @ManyToMany + @JoinTable(name = "HIterationGroup_ProjectIteration", joinColumns = @JoinColumn(name = "iterationGroupId"), inverseJoinColumns = @JoinColumn(name = "projectIterationId")) + private Set projectIterations = Sets.newHashSet(); + + @Type(type = "entityStatus") + @NotNull + private EntityStatus status = EntityStatus.ACTIVE; public void addMaintainer(HPerson maintainer) { @@ -88,28 +80,8 @@ public void addMaintainer(HPerson maintainer) maintainer.getMaintainerVersionGroups().add(this); } - @ManyToMany - @JoinTable(name = "HIterationGroup_ProjectIteration", joinColumns = @JoinColumn(name = "iterationGroupId"), inverseJoinColumns = @JoinColumn(name = "projectIterationId")) - public Set getProjectIterations() - { - if (projectIterations == null) - { - projectIterations = new HashSet(); - } - return projectIterations; - } - public void addProjectIteration(HProjectIteration iteration) { this.getProjectIterations().add(iteration); } - - @Type(type = "entityStatus") - @NotNull - @Override - public EntityStatus getStatus() - { - return status; - } - } diff --git a/zanata-model/src/main/java/org/zanata/model/HProject.java b/zanata-model/src/main/java/org/zanata/model/HProject.java index 0608013dd4..0294dd3067 100644 --- a/zanata-model/src/main/java/org/zanata/model/HProject.java +++ b/zanata-model/src/main/java/org/zanata/model/HProject.java @@ -25,11 +25,12 @@ import static org.jboss.seam.security.EntityAction.UPDATE; import java.io.Serializable; -import java.util.ArrayList; -import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; +import javax.persistence.Access; +import javax.persistence.AccessType; import javax.persistence.Column; import javax.persistence.ElementCollection; import javax.persistence.Entity; @@ -39,11 +40,13 @@ import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; +import javax.persistence.MapKeyColumn; import javax.persistence.OneToMany; import javax.persistence.OneToOne; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; +import lombok.Getter; import lombok.Setter; import lombok.ToString; @@ -52,8 +55,8 @@ import org.hibernate.annotations.Type; import org.hibernate.annotations.TypeDef; import org.hibernate.search.annotations.Field; -import org.hibernate.validator.constraints.NotEmpty; import org.hibernate.search.annotations.Indexed; +import org.hibernate.validator.constraints.NotEmpty; import org.jboss.seam.annotations.security.Restrict; import org.zanata.annotation.EntityRestrict; import org.zanata.common.EntityStatus; @@ -61,173 +64,97 @@ import org.zanata.model.type.EntityStatusType; import org.zanata.rest.dto.Project; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; + /** * @see Project * */ @Entity @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) +@Access(AccessType.FIELD) @TypeDef(name = "entityStatus", typeClass = EntityStatusType.class) @Restrict -@EntityRestrict({INSERT, UPDATE, DELETE}) +@EntityRestrict({ INSERT, UPDATE, DELETE }) @Setter +@Getter @Indexed @ToString(callSuper = true, of = "name") public class HProject extends SlugEntityBase implements Serializable, HasEntityStatus { private static final long serialVersionUID = 1L; - private String name; - private String description; - private String homeContent; - private String sourceViewURL; - private String sourceCheckoutURL; - private boolean overrideLocales = false; - private boolean restrictedByRoles = false; - private boolean overrideValidations = false; - private HCopyTransOptions defaultCopyTransOpts; - private Set customizedLocales; - private ProjectType defaultProjectType; - - private Set maintainers; - private Set allowedRoles; - private Set customizedValidations; - - private List projectIterations = new ArrayList(); - private EntityStatus status = EntityStatus.ACTIVE; - - @OneToMany(mappedBy = "project") - @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) - public List getProjectIterations() - { - return projectIterations; - } - - public void addIteration(HProjectIteration iteration) - { - projectIterations.add(iteration); - iteration.setProject(this); - } @Size(max = 80) @NotEmpty @Field() - public String getName() - { - return name; - } - - public boolean getOverrideLocales() - { - return this.overrideLocales; - } - - public boolean getOverrideValidations() - { - return overrideValidations; - } - - public boolean isRestrictedByRoles() - { - return restrictedByRoles; - } - - @Enumerated(EnumType.STRING) - public ProjectType getDefaultProjectType() - { - return defaultProjectType; - } + private String name; @Size(max = 100) @Field() - public String getDescription() - { - return description; - } + private String description; @Type(type = "text") - public String getHomeContent() - { - return homeContent; - } + private String homeContent; - public String getSourceViewURL() - { - return sourceViewURL; - } + private String sourceViewURL; - public String getSourceCheckoutURL() - { - return sourceCheckoutURL; - } + private String sourceCheckoutURL; + + private boolean overrideLocales = false; + + private boolean restrictedByRoles = false; @OneToOne(fetch = FetchType.LAZY, optional = true) @JoinColumn(name = "default_copy_trans_opts_id") - public HCopyTransOptions getDefaultCopyTransOpts() - { - return defaultCopyTransOpts; - } + private HCopyTransOptions defaultCopyTransOpts; + + @ManyToMany + @JoinTable(name = "HProject_Locale", joinColumns = @JoinColumn(name = "projectId"), + inverseJoinColumns = @JoinColumn(name = "localeId")) + private Set customizedLocales = Sets.newHashSet(); + + @Enumerated(EnumType.STRING) + private ProjectType defaultProjectType; /** * @see {@link #addMaintainer(HPerson)} */ @ManyToMany - @JoinTable(name = "HProject_Maintainer", joinColumns = @JoinColumn(name = "projectId"), inverseJoinColumns = @JoinColumn(name = "personId")) + @JoinTable(name = "HProject_Maintainer", joinColumns = @JoinColumn(name = "projectId"), + inverseJoinColumns = @JoinColumn(name = "personId")) @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) - public Set getMaintainers() - { - if (maintainers == null) - { - maintainers = new HashSet(); - } - return maintainers; - } - - public void addMaintainer( HPerson maintainer ) - { - this.getMaintainers().add(maintainer); - maintainer.getMaintainerProjects().add(this); - } + private Set maintainers = Sets.newHashSet(); @ManyToMany - @JoinTable(name = "HProject_Locale", joinColumns = @JoinColumn(name = "projectId"), inverseJoinColumns = @JoinColumn(name = "localeId")) - public Set getCustomizedLocales() - { - if (customizedLocales == null) - { - customizedLocales = new HashSet(); - } - return customizedLocales; - } + @JoinTable(name = "HProject_AllowedRole", joinColumns = @JoinColumn(name = "projectId"), + inverseJoinColumns = @JoinColumn(name = "roleId")) + private Set allowedRoles = Sets.newHashSet(); - @ManyToMany - @JoinTable(name = "HProject_AllowedRole", joinColumns = @JoinColumn(name = "projectId"), inverseJoinColumns = @JoinColumn(name = "roleId")) - public Set getAllowedRoles() - { - if(allowedRoles == null) - { - allowedRoles = new HashSet(); - } - return allowedRoles; - } + @ElementCollection + @JoinTable(name = "HProject_Validation", joinColumns = { @JoinColumn(name = "projectId") }) + @MapKeyColumn(name = "validation") + @Column(name = "state", nullable = false) + private Map customizedValidations = Maps.newHashMap(); - @JoinTable(name = "HProject_Validation", joinColumns = @JoinColumn(name = "projectId")) - @Type(type = "text") - @ElementCollection(fetch = FetchType.LAZY) - @Column(name = "validation", nullable = false) - public Set getCustomizedValidations() - { - if (customizedValidations == null) - { - customizedValidations = new HashSet(); - } - return customizedValidations; - } + @OneToMany(mappedBy = "project") + @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) + private List projectIterations = Lists.newArrayList(); @Type(type = "entityStatus") @NotNull - @Override - public EntityStatus getStatus() + private EntityStatus status = EntityStatus.ACTIVE; + + public void addIteration(HProjectIteration iteration) { - return status; + projectIterations.add(iteration); + iteration.setProject(this); + } + + public void addMaintainer(HPerson maintainer) + { + this.getMaintainers().add(maintainer); + maintainer.getMaintainerProjects().add(this); } } diff --git a/zanata-model/src/main/java/org/zanata/model/HProjectIteration.java b/zanata-model/src/main/java/org/zanata/model/HProjectIteration.java index cea59e9597..ea1c71d0c1 100644 --- a/zanata-model/src/main/java/org/zanata/model/HProjectIteration.java +++ b/zanata-model/src/main/java/org/zanata/model/HProjectIteration.java @@ -24,29 +24,31 @@ import static org.jboss.seam.security.EntityAction.INSERT; import static org.jboss.seam.security.EntityAction.UPDATE; -import java.util.HashMap; -import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; +import javax.persistence.Access; +import javax.persistence.AccessType; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.ElementCollection; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; -import javax.persistence.FetchType; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; import javax.persistence.MapKey; +import javax.persistence.MapKeyColumn; import javax.persistence.OneToMany; import javax.persistence.OrderBy; import javax.persistence.Transient; +import javax.validation.constraints.NotNull; +import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; @@ -60,9 +62,6 @@ import org.hibernate.search.annotations.Field; import org.hibernate.search.annotations.FieldBridge; import org.hibernate.search.annotations.Indexed; - -import javax.validation.constraints.NotNull; - import org.jboss.seam.annotations.security.Restrict; import org.zanata.annotation.EntityRestrict; import org.zanata.common.EntityStatus; @@ -73,62 +72,24 @@ import org.zanata.rest.dto.ProjectIteration; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; -/** - * - * @see ProjectIteration - * - */ @Entity @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) @TypeDef(name = "entityStatus", typeClass = EntityStatusType.class) @Restrict -@EntityRestrict({INSERT, UPDATE, DELETE}) +@EntityRestrict({ INSERT, UPDATE, DELETE }) @Indexed +@Access(AccessType.FIELD) @Setter +@Getter @NoArgsConstructor -@ToString(callSuper = true, of = {"project"}) -public class HProjectIteration extends SlugEntityBase implements Iterable, HasEntityStatus, IsEntityWithType +@ToString(callSuper = true, of = { "project" }) +public class HProjectIteration extends SlugEntityBase implements Iterable, HasEntityStatus, + IsEntityWithType { - private static final long serialVersionUID = 182037127575991478L; - private HProject project; - - private HProjectIteration parent; - private List children; - - private Map documents; - private Map allDocuments; - - private boolean overrideLocales = false; - private boolean overrideValidations = false; - private Set customizedLocales; - private Set groups; - private Set customizedValidations; - - private ProjectType projectType; - private Boolean requireTranslationReview = false; - private EntityStatus status = EntityStatus.ACTIVE; - - public boolean getOverrideLocales() - { - return this.overrideLocales; - } - - public boolean getOverrideValidations() - { - return overrideValidations; - } - - @Column(nullable = true) - public Boolean getRequireTranslationReview() - { - if (requireTranslationReview == null) - { - return Boolean.FALSE; - } - return requireTranslationReview; - } @ManyToOne @NotNull @@ -136,97 +97,58 @@ public Boolean getRequireTranslationReview() @NaturalId @Field @FieldBridge(impl = GroupSearchBridge.class) - public HProject getProject() - { - return project; - } - - @Enumerated(EnumType.STRING) - public ProjectType getProjectType() - { - return projectType; - } - - @ManyToMany - @JoinTable(name = "HProjectIteration_Locale", joinColumns = @JoinColumn(name = "projectIterationId"), inverseJoinColumns = @JoinColumn(name = "localeId")) - public Set getCustomizedLocales() - { - if (customizedLocales == null) - customizedLocales = new HashSet(); - return customizedLocales; - } - - @OneToMany(mappedBy = "parent") - public List getChildren() - { - return children; - } + private HProject project; @ManyToOne @JoinColumn(name = "parentId") - public HProjectIteration getParent() - { - return parent; - } + private HProjectIteration parent; + + @OneToMany(mappedBy = "parent") + private List children; @OneToMany(mappedBy = "projectIteration", cascade = CascadeType.ALL) @MapKey(name = "docId") @Where(clause = "obsolete=0") // TODO add an index for path, name @OrderBy("path, name") - public Map getDocuments() - { - if (documents == null) - documents = new HashMap(); - return documents; - } + private Map documents = Maps.newHashMap(); @OneToMany(mappedBy = "projectIteration", cascade = CascadeType.ALL) @MapKey(name = "docId") // even obsolete documents - public Map getAllDocuments() - { - if (allDocuments == null) - allDocuments = new HashMap(); - return allDocuments; - } + private Map allDocuments = Maps.newHashMap(); + + private boolean overrideLocales; + + @ManyToMany + @JoinTable(name = "HProjectIteration_Locale", joinColumns = @JoinColumn(name = "projectIterationId"), + inverseJoinColumns = @JoinColumn(name = "localeId")) + private Set customizedLocales = Sets.newHashSet(); @ManyToMany @JoinTable(name = "HIterationGroup_ProjectIteration", joinColumns = @JoinColumn(name = "projectIterationId"), inverseJoinColumns = @JoinColumn(name = "iterationGroupId")) - public Set getGroups() - { - if (groups == null) - { - groups = new HashSet(); - } - return groups; - } + private Set groups = Sets.newHashSet(); - @JoinTable(name = "HProjectIteration_Validation", joinColumns = @JoinColumn(name = "projectIterationId")) - @Type(type = "text") - @ElementCollection(fetch = FetchType.LAZY) - @Column(name = "validation", nullable = false) - public Set getCustomizedValidations() - { - if (customizedValidations == null) - { - customizedValidations = new HashSet(); - } - return customizedValidations; - } + @ElementCollection + @JoinTable(name = "HProjectIteration_Validation", joinColumns = { @JoinColumn(name = "projectIterationId") }) + @MapKeyColumn(name = "validation") + @Column(name = "state", nullable = false) + private Map customizedValidations = Maps.newHashMap(); - @Override - public Iterator iterator() - { - return ImmutableList.copyOf(getDocuments().values()).iterator(); - } + @Enumerated(EnumType.STRING) + private ProjectType projectType; @Type(type = "entityStatus") @NotNull + private EntityStatus status = EntityStatus.ACTIVE; + + @Column(nullable = true) + private Boolean requireTranslationReview = false; + @Override - public EntityStatus getStatus() + public Iterator iterator() { - return status; + return ImmutableList. copyOf(getDocuments().values()).iterator(); } @Override @@ -235,4 +157,13 @@ public EntityType getEntityType() { return EntityType.HProjectIteration; } + + public Boolean getRequireTranslationReview() + { + if (requireTranslationReview == null) + { + return Boolean.FALSE; + } + return requireTranslationReview; + } } diff --git a/zanata-model/src/main/java/org/zanata/model/SlugEntityBase.java b/zanata-model/src/main/java/org/zanata/model/SlugEntityBase.java index 693f6a0728..7d5385f22b 100644 --- a/zanata-model/src/main/java/org/zanata/model/SlugEntityBase.java +++ b/zanata-model/src/main/java/org/zanata/model/SlugEntityBase.java @@ -20,29 +20,33 @@ */ package org.zanata.model; +import javax.persistence.Access; +import javax.persistence.AccessType; import javax.persistence.MappedSuperclass; - -import org.hibernate.annotations.NaturalId; -import org.hibernate.search.annotations.Field; -import javax.validation.constraints.Size; import javax.validation.constraints.NotNull; -import org.zanata.model.validator.Slug; +import javax.validation.constraints.Size; import lombok.AllArgsConstructor; +import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; +import org.hibernate.annotations.NaturalId; +import org.hibernate.search.annotations.Field; +import org.zanata.model.validator.Slug; + @MappedSuperclass @ToString(callSuper = true) +@Access(AccessType.FIELD) @Setter +@Getter @AllArgsConstructor @NoArgsConstructor public abstract class SlugEntityBase extends ModelEntityBase { private static final long serialVersionUID = -1911540675412928681L; - private String slug; // TODO PERF @NaturalId(mutable=false) for better criteria caching @NaturalId @@ -50,8 +54,5 @@ public abstract class SlugEntityBase extends ModelEntityBase @Slug @NotNull @Field - public String getSlug() - { - return slug; - } + private String slug; } diff --git a/zanata-war/src/main/java/org/zanata/action/LocaleListAction.java b/zanata-war/src/main/java/org/zanata/action/LocaleListAction.java index 5a90629453..28528d4b34 100644 --- a/zanata-war/src/main/java/org/zanata/action/LocaleListAction.java +++ b/zanata-war/src/main/java/org/zanata/action/LocaleListAction.java @@ -168,7 +168,7 @@ public boolean getSetting() else { HProject project = projectDAO.getBySlug(slug); - setting = project.getOverrideLocales(); + setting = project.isOverrideLocales(); } overrideLocales = new Boolean(setting); } diff --git a/zanata-war/src/main/java/org/zanata/action/ProfileAction.java b/zanata-war/src/main/java/org/zanata/action/ProfileAction.java index 1788a75cdd..66162f7ca5 100644 --- a/zanata-war/src/main/java/org/zanata/action/ProfileAction.java +++ b/zanata-war/src/main/java/org/zanata/action/ProfileAction.java @@ -103,7 +103,7 @@ private void validateEmail(String email) { HPerson person = personDAO.findByEmail(email); - if( person != null && !person.getAccount().equals( authenticatedAccount ) ) + if (person != null && !person.getAccount().equals(authenticatedAccount)) { valid = false; FacesMessages.instance().addToControl("email", "This email address is already taken"); @@ -114,7 +114,7 @@ private void validateUsername(String username) { HAccount account = accountDAO.getByUsername(username); - if( account != null && !account.equals( authenticatedAccount ) ) + if (account != null && !account.equals(authenticatedAccount)) { valid = false; FacesMessages.instance().addToControl("username", "This username is already taken"); @@ -133,13 +133,13 @@ public void onCreate() if (newUser) { String domain = applicationConfiguration.getDomainName(); - if( domain == null ) + if (domain == null) { email = ""; } else { - if( applicationConfiguration.isOpenIdAuth() ) + if (applicationConfiguration.isOpenIdAuth()) { email = zanataOpenId.getAuthResult().getEmail(); } @@ -214,7 +214,7 @@ public String edit() validateEmail(this.email); validateUsername(username); - if( !this.isValid() ) + if (!this.isValid()) { return null; } @@ -240,7 +240,8 @@ public String edit() { String key; - if (identity.getCredentials().getAuthType() == AuthenticationType.KERBEROS || identity.getCredentials().getAuthType() == AuthenticationType.JAAS) + if (identity.getCredentials().getAuthType() == AuthenticationType.KERBEROS + || identity.getCredentials().getAuthType() == AuthenticationType.JAAS) { key = registerServiceImpl.register(this.username, this.username, this.email); } diff --git a/zanata-war/src/main/java/org/zanata/action/ProjectHome.java b/zanata-war/src/main/java/org/zanata/action/ProjectHome.java index 9c57b3ef1d..630f56681c 100644 --- a/zanata-war/src/main/java/org/zanata/action/ProjectHome.java +++ b/zanata-war/src/main/java/org/zanata/action/ProjectHome.java @@ -21,6 +21,7 @@ package org.zanata.action; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.List; @@ -31,6 +32,9 @@ import javax.persistence.EntityManager; import javax.persistence.EntityNotFoundException; +import lombok.Getter; +import lombok.Setter; + import org.apache.commons.lang.StringUtils; import org.hibernate.Session; import org.hibernate.criterion.NaturalIdentifier; @@ -57,6 +61,7 @@ import org.zanata.service.LocaleService; import org.zanata.service.SlugEntityService; import org.zanata.service.ValidationService; +import org.zanata.webtrans.shared.model.ValidationAction; @Name("projectHome") public class ProjectHome extends SlugHome @@ -65,6 +70,8 @@ public class ProjectHome extends SlugHome public static final String PROJECT_UPDATE = "project.update"; + @Getter + @Setter private String slug; @In @@ -101,13 +108,9 @@ public class ProjectHome extends SlugHome @In(required = false) private Boolean restrictByRoles; - /* Outjected from ProjectValidationOptionsAction */ - @In(required = false) - private Boolean overrideValidations; - - /* Outjected from ProjectValidationOptionsAction */ + /* Outjected from ValidationOptionsAction */ @In(required = false) - private Set customizedValidations; + private Collection customizedValidations; @In private LocaleService localeServiceImpl; @@ -128,7 +131,7 @@ public class ProjectHome extends SlugHome protected HProject loadInstance() { Session session = (Session) getEntityManager().getDelegate(); - return (HProject)session.byNaturalId(HProject.class).using("slug", getSlug()).load(); + return (HProject) session.byNaturalId(HProject.class).using("slug", getSlug()).load(); } public void validateSuppliedId() @@ -270,16 +273,6 @@ public String cancel() return "cancel"; } - public String getSlug() - { - return slug; - } - - public void setSlug(String slug) - { - this.slug = slug; - } - @Override public boolean isIdDefined() { @@ -355,21 +348,10 @@ else if (customizedItems != null) private void updateOverrideValidations() { - if (overrideValidations != null) + getInstance().getCustomizedValidations().clear(); + for (ValidationAction action : customizedValidations) { - getInstance().setOverrideValidations(overrideValidations); - getInstance().getCustomizedValidations().clear(); - - if (overrideValidations) - { - getInstance().getCustomizedValidations().clear(); - getInstance().getCustomizedValidations().addAll(customizedValidations); - } - - if (customizedValidations.isEmpty()) - { - getInstance().setOverrideValidations(false); - } + getInstance().getCustomizedValidations().put(action.getId().name(), action.getState().name()); } } @@ -399,10 +381,10 @@ public boolean checkViewObsolete() public boolean isUserAllowedToTranslateOrReview(String versionSlug, HLocale localeId) { - return !StringUtils.isEmpty(versionSlug) - && localeId != null - && isIterationActive(versionSlug) - && identity != null + return !StringUtils.isEmpty(versionSlug) + && localeId != null + && isIterationActive(versionSlug) + && identity != null && (identity.hasPermission("add-translation", getInstance(), localeId) || identity.hasPermission("translation-review", getInstance(), localeId)); } diff --git a/zanata-war/src/main/java/org/zanata/action/ProjectIterationHome.java b/zanata-war/src/main/java/org/zanata/action/ProjectIterationHome.java index a0ea1988a0..14009e8af0 100644 --- a/zanata-war/src/main/java/org/zanata/action/ProjectIterationHome.java +++ b/zanata-war/src/main/java/org/zanata/action/ProjectIterationHome.java @@ -20,11 +20,15 @@ */ package org.zanata.action; +import java.util.Collection; import java.util.Map; import java.util.Set; import javax.faces.event.ValueChangeEvent; import javax.persistence.EntityNotFoundException; + +import lombok.Getter; +import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.hibernate.criterion.NaturalIdentifier; @@ -41,6 +45,7 @@ import org.zanata.model.HProjectIteration; import org.zanata.service.LocaleService; import org.zanata.service.SlugEntityService; +import org.zanata.webtrans.shared.model.ValidationAction; @Name("projectIterationHome") @Slf4j @@ -51,7 +56,12 @@ public class ProjectIterationHome extends SlugHome public static final String PROJECT_ITERATION_UPDATE = "project.iteration.update"; + @Getter + @Setter private String slug; + + @Getter + @Setter private String projectSlug; @In(required = false) @@ -60,22 +70,18 @@ public class ProjectIterationHome extends SlugHome @In(required = false) private Boolean iterationOverrideLocales; - /* Outjected from VersionValidationOptionsAction */ - @In(required = false) - private Boolean versionOverrideValidations; - - /* Outjected from VersionValidationOptionsAction */ + /* Outjected from ValidationOptionsAction */ @In(required = false) - private Set versionCustomizedValidations; + private Collection customizedValidations; @In - LocaleService localeServiceImpl; + private LocaleService localeServiceImpl; @In - SlugEntityService slugEntityServiceImpl; + private SlugEntityService slugEntityServiceImpl; @In(create = true) - ProjectDAO projectDAO; + private ProjectDAO projectDAO; @Override protected HProjectIteration createInstance() @@ -84,31 +90,10 @@ protected HProjectIteration createInstance() HProject project = (HProject) projectDAO.getBySlug(projectSlug); project.addIteration(iteration); iteration.setProjectType(project.getDefaultProjectType()); - iteration.setOverrideValidations(project.getOverrideValidations()); - iteration.getCustomizedValidations().addAll(project.getCustomizedValidations()); + iteration.getCustomizedValidations().putAll(project.getCustomizedValidations()); return iteration; } - public void setSlug(String slug) - { - this.slug = slug; - } - - public String getSlug() - { - return slug; - } - - public String getProjectSlug() - { - return projectSlug; - } - - public void setProjectSlug(String projectSlug) - { - this.projectSlug = projectSlug; - } - public void validateSuppliedId() { getInstance(); // this will raise an EntityNotFound exception @@ -202,12 +187,12 @@ public String update() Events.instance().raiseEvent(PROJECT_ITERATION_UPDATE, getInstance()); return state; } - + public boolean isProjectActive() { return getInstance().getProject().getStatus() == EntityStatus.ACTIVE; } - + private void updateOverrideLocales() { if (iterationOverrideLocales != null) @@ -228,20 +213,10 @@ else if (iterationCustomizedItems != null) private void updateOverrideValidations() { - if (versionOverrideValidations != null) + getInstance().getCustomizedValidations().clear(); + for (ValidationAction action : customizedValidations) { - getInstance().setOverrideValidations(versionOverrideValidations); - getInstance().getCustomizedValidations().clear(); - - if (versionOverrideValidations) - { - getInstance().getCustomizedValidations().addAll(versionCustomizedValidations); - } - - if (versionCustomizedValidations.isEmpty()) - { - getInstance().setOverrideValidations(false); - } + getInstance().getCustomizedValidations().put(action.getId().name(), action.getState().name()); } } } diff --git a/zanata-war/src/main/java/org/zanata/action/ProjectIterationLocaleAction.java b/zanata-war/src/main/java/org/zanata/action/ProjectIterationLocaleAction.java index 5deabf791a..880896c7ab 100644 --- a/zanata-war/src/main/java/org/zanata/action/ProjectIterationLocaleAction.java +++ b/zanata-war/src/main/java/org/zanata/action/ProjectIterationLocaleAction.java @@ -150,7 +150,7 @@ public boolean getSetting() } else { - setting = projectIterationHome.getInstance().getOverrideLocales(); + setting = projectIterationHome.getInstance().isOverrideLocales(); } iterationOverrideLocales = setting; } diff --git a/zanata-war/src/main/java/org/zanata/action/ProjectValidationOptionsAction.java b/zanata-war/src/main/java/org/zanata/action/ProjectValidationOptionsAction.java deleted file mode 100644 index 828b891105..0000000000 --- a/zanata-war/src/main/java/org/zanata/action/ProjectValidationOptionsAction.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright 2010, 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.action; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.jboss.seam.ScopeType; -import org.jboss.seam.annotations.In; -import org.jboss.seam.annotations.Logger; -import org.jboss.seam.annotations.Name; -import org.jboss.seam.annotations.Out; -import org.jboss.seam.annotations.Scope; -import org.jboss.seam.log.Log; -import org.zanata.service.ValidationService; -import org.zanata.webtrans.shared.model.ValidationAction; - -@Name("projectValidationOptionsAction") -@Scope(ScopeType.PAGE) -public class ProjectValidationOptionsAction implements Serializable -{ - private static final long serialVersionUID = 1L; - - @Out(required = false) - private Boolean overrideValidations; - - @Logger - private Log log; - - @In - private ValidationService validationServiceImpl; - - @In(required = false) - private ProjectHome projectHome; - - private Map selectedValidations; - - private String projectSlug; - - public List getValidationList() - { - Collection result = validationServiceImpl.getValidationAction(projectSlug); - return new ArrayList(result); - } - - public void checkExclusive(ValidationAction valAction) - { - for (ValidationAction exclusiveValAction : valAction.getExclusiveValidations()) - { - if (selectedValidations.containsKey(exclusiveValAction.getId().name())) - { - selectedValidations.put(exclusiveValAction.getId().name(), false); - } - } - } - - @Out(required = false) - public Set getCustomizedValidations() - { - Set customizedValidationSet = new HashSet(); - for (Map.Entry entry : getSelectedValidations().entrySet()) - { - if (entry.getValue() == Boolean.TRUE) - { - customizedValidationSet.add(entry.getKey()); - } - } - return customizedValidationSet; - } - - public boolean getOverrideValidations() - { - if (overrideValidations == null) - { - overrideValidations = projectHome.getInstance().getOverrideValidations(); - } - return overrideValidations; - } - - public void setOverrideValidations(boolean overrideValidations) - { - this.overrideValidations = overrideValidations; - } - - public String getProjectSlug() - { - return projectSlug; - } - - public void setProjectSlug(String projectSlug) - { - this.projectSlug = projectSlug; - } - - public Map getSelectedValidations() - { - if(selectedValidations == null) - { - selectedValidations = new HashMap(); - for (String val : projectHome.getInstance().getCustomizedValidations()) - { - selectedValidations.put(val, true); - } - } - return selectedValidations; - } -} diff --git a/zanata-war/src/main/java/org/zanata/action/ValidationOptionsAction.java b/zanata-war/src/main/java/org/zanata/action/ValidationOptionsAction.java new file mode 100644 index 0000000000..504ba93303 --- /dev/null +++ b/zanata-war/src/main/java/org/zanata/action/ValidationOptionsAction.java @@ -0,0 +1,81 @@ +package org.zanata.action; + +import java.io.*; +import java.util.*; + +import lombok.*; + +import org.jboss.seam.*; +import org.jboss.seam.annotations.*; +import org.zanata.service.*; +import org.zanata.webtrans.shared.model.*; +import org.zanata.webtrans.shared.validation.*; + +import com.google.common.collect.*; + +/** + * @author Alex Eng aeng@redhat.com + */ +@Name("validationOptionsAction") +@Scope(ScopeType.PAGE) +public class ValidationOptionsAction implements Serializable +{ + @In + private ValidationService validationServiceImpl; + + @Setter + @Getter + private String versionSlug; + + @Setter + @Getter + private String projectSlug; + + private Map availableValidations = Maps.newHashMap(); + + public List getValidationList() + { + if (availableValidations.isEmpty()) + { + Collection validationList = validationServiceImpl.getValidationActions(projectSlug, + versionSlug); + + for (ValidationAction validationAction : validationList) + { + availableValidations.put(validationAction.getId(), validationAction); + } + } + List sortedList = new ArrayList(availableValidations.values()); + Collections.sort(sortedList, ValidationFactory.ValidationActionComparator); + return sortedList; + } + + /** + * If this action is enabled(Warning or Error), then it's exclusive validation will be turn off + * @param selectedValidationAction + */ + public void ensureMutualExclusivity(ValidationAction selectedValidationAction) + { + if (selectedValidationAction.getState() != ValidationAction.State.Off) + { + for (ValidationAction exclusiveValAction : selectedValidationAction.getExclusiveValidations()) + { + if (availableValidations.containsKey(exclusiveValAction.getId())) + { + availableValidations.get(exclusiveValAction.getId()).setState(ValidationAction.State.Off); + } + } + } + } + + public List getValidationStates() + { + return Arrays.asList(ValidationAction.State.values()); + } + + @Out(required = false) + public Collection getCustomizedValidations() + { + return availableValidations.values(); + } +} diff --git a/zanata-war/src/main/java/org/zanata/action/VersionValidationOptionsAction.java b/zanata-war/src/main/java/org/zanata/action/VersionValidationOptionsAction.java deleted file mode 100644 index ea87b5e817..0000000000 --- a/zanata-war/src/main/java/org/zanata/action/VersionValidationOptionsAction.java +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Copyright 2010, 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.action; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.jboss.seam.ScopeType; -import org.jboss.seam.annotations.In; -import org.jboss.seam.annotations.Logger; -import org.jboss.seam.annotations.Name; -import org.jboss.seam.annotations.Out; -import org.jboss.seam.annotations.Scope; -import org.jboss.seam.log.Log; -import org.zanata.service.ValidationService; -import org.zanata.webtrans.shared.model.ValidationAction; - -@Name("versionValidationOptionsAction") -@Scope(ScopeType.PAGE) -public class VersionValidationOptionsAction implements Serializable -{ - private static final long serialVersionUID = 1L; - - @Out(required = false) - private Boolean versionOverrideValidations; - - @Logger - private Log log; - - @In - private ValidationService validationServiceImpl; - - @In(required = false) - private ProjectIterationHome projectIterationHome; - - private Map selectedValidations; - - private String versionSlug; - - private String projectSlug; - - public List getValidationList() - { - Collection result = validationServiceImpl.getValidationAction(projectSlug, versionSlug); - return new ArrayList(result); - } - - public void checkExclusive(ValidationAction valAction) - { - for (ValidationAction exclusiveValAction : valAction.getExclusiveValidations()) - { - if (selectedValidations.containsKey(exclusiveValAction.getId().name())) - { - selectedValidations.put(exclusiveValAction.getId().name(), false); - } - } - } - - @Out(required = false) - public Set getVersionCustomizedValidations() - { - Set customizedValidationSet = new HashSet(); - for (Map.Entry entry : getSelectedValidations().entrySet()) - { - if (entry.getValue() == Boolean.TRUE) - { - customizedValidationSet.add(entry.getKey()); - } - } - return customizedValidationSet; - } - - public boolean getVersionOverrideValidations() - { - if (versionOverrideValidations == null) - { - versionOverrideValidations = projectIterationHome.getInstance().getOverrideValidations(); - } - return versionOverrideValidations; - } - - public void setVersionOverrideValidations(boolean versionOverrideValidations) - { - this.versionOverrideValidations = versionOverrideValidations; - } - - public String getVersionSlug() - { - return versionSlug; - } - - public void setVersionSlug(String versionSlug) - { - this.versionSlug = versionSlug; - } - - public String getProjectSlug() - { - return projectSlug; - } - - public void setProjectSlug(String projectSlug) - { - this.projectSlug = projectSlug; - } - - public Map getSelectedValidations() - { - if (selectedValidations == null) - { - selectedValidations = new HashMap(); - if (!projectIterationHome.getInstance().getCustomizedValidations().isEmpty()) - { - for (String val : projectIterationHome.getInstance().getCustomizedValidations()) - { - selectedValidations.put(val, true); - } - } - } - return selectedValidations; - } - - public void setSelectedValidations(Map selectedValidations) - { - this.selectedValidations = selectedValidations; - } -} diff --git a/zanata-war/src/main/java/org/zanata/rest/service/ProjectIterationService.java b/zanata-war/src/main/java/org/zanata/rest/service/ProjectIterationService.java index 83cbcdbfc3..16be28d383 100644 --- a/zanata-war/src/main/java/org/zanata/rest/service/ProjectIterationService.java +++ b/zanata-war/src/main/java/org/zanata/rest/service/ProjectIterationService.java @@ -353,8 +353,7 @@ public static void copyProjectConfiguration(ProjectIteration from, HProjectItera if (hProject != null) { - to.setOverrideValidations(hProject.getOverrideValidations()); - to.getCustomizedValidations().addAll(hProject.getCustomizedValidations()); + to.getCustomizedValidations().putAll(hProject.getCustomizedValidations()); } } diff --git a/zanata-war/src/main/java/org/zanata/service/TranslationService.java b/zanata-war/src/main/java/org/zanata/service/TranslationService.java index 733ab90491..82ea620b81 100644 --- a/zanata-war/src/main/java/org/zanata/service/TranslationService.java +++ b/zanata-war/src/main/java/org/zanata/service/TranslationService.java @@ -48,7 +48,6 @@ public interface TranslationService */ List translate(LocaleId localeId, List translationRequests); - /** * Attempts to revert a list of updates by adding a new translation that is * identical to the previous one. @@ -112,5 +111,6 @@ public interface TranslationResult HTextFlowTarget getTranslatedTextFlowTarget(); int getBaseVersionNum(); ContentState getBaseContentState(); + String getErrorMessage(); } } diff --git a/zanata-war/src/main/java/org/zanata/service/TranslationStateCache.java b/zanata-war/src/main/java/org/zanata/service/TranslationStateCache.java index 7d403fda0f..b779dc7a4d 100644 --- a/zanata-war/src/main/java/org/zanata/service/TranslationStateCache.java +++ b/zanata-war/src/main/java/org/zanata/service/TranslationStateCache.java @@ -62,5 +62,5 @@ public interface TranslationStateCache * @param validationId * @return */ - Boolean textFlowTargetHasError(Long textFlowTargetId, ValidationId validationId); + Boolean textFlowTargetHasWarningOrError(Long textFlowTargetId, ValidationId validationId); } diff --git a/zanata-war/src/main/java/org/zanata/service/ValidationFactoryProvider.java b/zanata-war/src/main/java/org/zanata/service/ValidationFactoryProvider.java index f4552b8036..3f61d68267 100644 --- a/zanata-war/src/main/java/org/zanata/service/ValidationFactoryProvider.java +++ b/zanata-war/src/main/java/org/zanata/service/ValidationFactoryProvider.java @@ -1,3 +1,25 @@ +/* + * + * * Copyright 2013, 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.service; import java.io.IOException; @@ -7,6 +29,12 @@ import org.zanata.webtrans.server.locale.Gwti18nReader; import org.zanata.webtrans.shared.validation.ValidationFactory; +/** + * Provide new instance of ValidationFactory + * Used on server side - + * org.zanata.webtrans.client.resources.ValidationMessages is client side localisation. + * used Gwti18nReader as a basic parser for ValidationMessages. + */ public final class ValidationFactoryProvider { private static ValidationFactory validationFactory; diff --git a/zanata-war/src/main/java/org/zanata/service/ValidationService.java b/zanata-war/src/main/java/org/zanata/service/ValidationService.java index 2cc4471fc4..77dc1d2ff4 100644 --- a/zanata-war/src/main/java/org/zanata/service/ValidationService.java +++ b/zanata-war/src/main/java/org/zanata/service/ValidationService.java @@ -14,7 +14,6 @@ import org.zanata.webtrans.shared.model.ValidationAction; import org.zanata.webtrans.shared.model.ValidationId; - /** * * @author Alex Eng aeng@redhat.com @@ -23,15 +22,14 @@ public interface ValidationService { /** - * Return all ValidationActions with enabled=true on those which are defined + * Return all ValidationActions on those which are customized * to the project * * @param projectSlug * @return * @throws IOException */ - Collection getValidationAction(String projectSlug); - + Collection getValidationActions(String projectSlug); /** * Return all ValidationActions on those which are customized to the version @@ -40,17 +38,7 @@ public interface ValidationService * @param versionSlug * @return */ - Collection getValidationAction(String projectSlug, String versionSlug); - - /** - * Return all ValidationActions with enabled=true on those which are - * customized to the version - * - * @param HProjectIteration - * @return - * @throws IOException - */ - Collection getValidationObject(HProjectIteration version); + Collection getValidationActions(String projectSlug, String versionSlug); /** * Run validation check on HTextFlow and HTextFlowTarget with specific locale @@ -74,8 +62,8 @@ public interface ValidationService * @param maxSize * @throws IOException */ - List filterHasErrorTexFlow(List textFlows, List validationIds, LocaleId localeId, int startIndex, int maxSize); - + List filterHasWarningOrErrorTextFlow(List textFlows, List validationIds, + LocaleId localeId, int startIndex, int maxSize); /** * Run validation check on HTextFlow and HTextFlowTarget with specific locale @@ -88,4 +76,15 @@ public interface ValidationService * @param localeId */ boolean runDocValidationsWithServerRules(HDocument hDoc, LocaleId localeId); + + /** + * Run 'Error' state validations check against sources and translations + * @param projectVersion + * @param sources + * @param translations + * @param actionStates + * @return list of error message + */ + List validateWithServerRules(HProjectIteration projectVersion, List sources, + List translations, ValidationAction.State... actionStates); } diff --git a/zanata-war/src/main/java/org/zanata/service/impl/CopyTransServiceImpl.java b/zanata-war/src/main/java/org/zanata/service/impl/CopyTransServiceImpl.java index ba0fc35c36..52ed48063c 100644 --- a/zanata-war/src/main/java/org/zanata/service/impl/CopyTransServiceImpl.java +++ b/zanata-war/src/main/java/org/zanata/service/impl/CopyTransServiceImpl.java @@ -21,7 +21,10 @@ package org.zanata.service.impl; import static org.zanata.async.tasks.CopyTransTask.CopyTransTaskHandle; -import static org.zanata.common.ContentState.*; +import static org.zanata.common.ContentState.Approved; +import static org.zanata.common.ContentState.NeedReview; +import static org.zanata.common.ContentState.New; +import static org.zanata.common.ContentState.Translated; import static org.zanata.model.HCopyTransOptions.ConditionRuleAction.DOWNGRADE_TO_FUZZY; import static org.zanata.model.HCopyTransOptions.ConditionRuleAction.REJECT; @@ -29,6 +32,9 @@ import javax.persistence.EntityManager; +import lombok.AllArgsConstructor; +import lombok.Getter; + import org.hibernate.HibernateException; import org.hibernate.ScrollableResults; import org.jboss.seam.ScopeType; @@ -55,11 +61,11 @@ import org.zanata.rest.service.TranslatedDocResourceService; import org.zanata.service.CopyTransService; import org.zanata.service.LocaleService; -import com.google.common.collect.ImmutableList; -import com.google.common.base.Optional; +import org.zanata.service.ValidationService; -import lombok.AllArgsConstructor; -import lombok.Getter; +import com.google.common.base.Optional; +import com.google.common.collect.ImmutableList; +import org.zanata.webtrans.shared.model.ValidationAction; //TODO unit test suite for this class @@ -72,7 +78,7 @@ public class CopyTransServiceImpl implements CopyTransService @In private LocaleService localeServiceImpl; - + @In private TextFlowTargetDAO textFlowTargetDAO; @@ -81,7 +87,10 @@ public class CopyTransServiceImpl implements CopyTransService @In private ProjectDAO projectDAO; - + + @In + private ValidationService validationServiceImpl; + @Logger Log log; @@ -130,23 +139,22 @@ public void copyTransForLocale(final HDocument document, final HLocale locale, f { try { - new Work() { + new Work() + { @Override protected Void work() throws Exception { int copyCount = 0; // Determine the state of the copies for each pass - boolean checkContext = true, - checkProject = true, - checkDocument = true; + boolean checkContext = true, checkProject = true, checkDocument = true; // First pass, very conservative // Every result will match context, document, and project copyCount += copyTransPass(document, locale, checkContext, checkProject, checkDocument, options); // Next passes, more relaxed and only needed when the options call for it - if( options.getDocIdMismatchAction() != REJECT ) + if (options.getDocIdMismatchAction() != REJECT) { // Relax doc Id restriction checkDocument = false; @@ -154,7 +162,7 @@ protected Void work() throws Exception // Assuming Phase 1 ran, results will have non-matching doc Ids copyCount += copyTransPass(document, locale, checkContext, checkProject, checkDocument, options); } - if( options.getProjectMismatchAction() != REJECT ) + if (options.getProjectMismatchAction() != REJECT) { // Relax project restriction checkProject = false; @@ -163,7 +171,7 @@ protected Void work() throws Exception // Assuming above phase: either doc Id didn't match, or the user explicitly rejected non-matching documents copyCount += copyTransPass(document, locale, checkContext, checkProject, checkDocument, options); } - if( options.getContextMismatchAction() != REJECT ) + if (options.getContextMismatchAction() != REJECT) { // Relax context restriction checkContext = false; @@ -173,7 +181,7 @@ protected Void work() throws Exception // and either Project didn't match, or the user explicitly rejected non-matching projects copyCount += copyTransPass(document, locale, checkContext, checkProject, checkDocument, options); } - if( options.getContextMismatchAction() != REJECT ) + if (options.getContextMismatchAction() != REJECT) { // Relax context restriction checkContext = false; @@ -192,7 +200,7 @@ protected Void work() throws Exception // Advance the task handler if there is one Optional taskHandle = AsyncUtils.getEventAsyncHandle(CopyTransTaskHandle.class); - if( taskHandle.isPresent() ) + if (taskHandle.isPresent()) { taskHandle.get().increaseProgress(1); } @@ -221,17 +229,23 @@ private int copyTransPass( HDocument document, HLocale locale, boolean checkCont HTextFlowTarget matchingTarget = textFlowTargetDAO.findById((Long) results.get(1), false); HTextFlow originalTf = (HTextFlow) results.get(0); - HTextFlowTarget hTarget = textFlowTargetDAO.getOrCreateTarget(originalTf, locale); HProjectIteration matchingTargetProjectIteration = matchingTarget.getTextFlow().getDocument().getProjectIteration(); ContentState copyState = determineContentState( - originalTf.getResId().equals(matchingTarget.getTextFlow().getResId()), - originalTf.getDocument().getProjectIteration().getProject().getId().equals(matchingTargetProjectIteration.getProject().getId()), - originalTf.getDocument().getDocId().equals( matchingTarget.getTextFlow().getDocument().getDocId() ), - options, requireTranslationReview, matchingTarget.getState()); - - if( shouldOverwrite(hTarget, copyState) ) + originalTf.getResId().equals(matchingTarget.getTextFlow().getResId()), + originalTf.getDocument().getProjectIteration().getProject().getId().equals(matchingTargetProjectIteration.getProject().getId()), + originalTf.getDocument().getDocId().equals( matchingTarget.getTextFlow().getDocument().getDocId() ), + options, requireTranslationReview, matchingTarget.getState()); + + boolean hasValidationError = validationTranslations(copyState, matchingTargetProjectIteration, originalTf.getContents(), matchingTarget.getContents()); + + if(hasValidationError) { + continue; + } + HTextFlowTarget hTarget = textFlowTargetDAO.getOrCreateTarget(originalTf, locale); + if( shouldOverwrite(hTarget, copyState)) + { // NB we don't touch creationDate hTarget.setTextFlowRevision(originalTf.getRevision()); hTarget.setLastChanged(matchingTarget.getLastChanged()); @@ -292,20 +306,19 @@ private int copyTransPass( HDocument document, HLocale locale, boolean checkCont * @return The content state that the copied translation should have. 'New' indicates that the translation * should not copied. */ - private static - ContentState determineContentStateFromMatchRules(List pairs, ContentState initialState) + private static ContentState determineContentStateFromMatchRules(List pairs, ContentState initialState) { - if( pairs.isEmpty() ) + if (pairs.isEmpty()) { return initialState; } MatchRulePair p = pairs.get(0); - if( shouldReject(p.getMatchResult(), p.getRuleAction()) ) + if (shouldReject(p.getMatchResult(), p.getRuleAction())) { return New; } - else if( shouldDowngradeToFuzzy(p.getMatchResult(), p.getRuleAction()) ) + else if (shouldDowngradeToFuzzy(p.getMatchResult(), p.getRuleAction())) { return determineContentStateFromMatchRules(pairs.subList(1, pairs.size()), NeedReview); } @@ -324,9 +337,8 @@ else if( shouldDowngradeToFuzzy(p.getMatchResult(), p.getRuleAction()) ) * @return The content state that the copied translation should have. 'New' indicates that the translation * should not copied. */ - static - ContentState determineContentStateFromRuleList(List pairs, - boolean requireTranslationReview, ContentState matchingTargetState) + static ContentState determineContentStateFromRuleList(List pairs, + boolean requireTranslationReview, ContentState matchingTargetState) { assert matchingTargetState == Translated || matchingTargetState == Approved; return determineContentStateFromMatchRules(pairs, requireTranslationReview ? matchingTargetState : Translated); @@ -344,9 +356,8 @@ ContentState determineContentStateFromRuleList(List pairs, * @return The content state that the copied translation should have. 'New' indicates that the translation * should not copied. */ - static - ContentState determineContentState(boolean contextMatches, boolean projectMatches, boolean docIdMatches, - HCopyTransOptions options, boolean requireTranslationReview, ContentState matchingTargetState) + static ContentState determineContentState(boolean contextMatches, boolean projectMatches, boolean docIdMatches, + HCopyTransOptions options, boolean requireTranslationReview, ContentState matchingTargetState) { List rules = ImmutableList.of(new MatchRulePair(contextMatches, options.getContextMismatchAction()), @@ -363,7 +374,7 @@ ContentState determineContentState(boolean contextMatches, boolean projectMatche * @param action The selected action to take based on the result of the condition evaluation. * @return True, if the translation should be outright rejected based on the evaluated condition. */ - static boolean shouldReject(boolean match, HCopyTransOptions.ConditionRuleAction action ) + static boolean shouldReject(boolean match, HCopyTransOptions.ConditionRuleAction action) { return !match && action == REJECT; } @@ -390,14 +401,14 @@ public void copyTransForDocument(HDocument document) public void copyTransForDocument(HDocument document, HCopyTransOptions copyTransOpts) { // use project level options - if( copyTransOpts == null ) + if (copyTransOpts == null) { // NB: Need to reload the options from the db - copyTransOpts = projectDAO.findById( document.getProjectIteration().getProject().getId(), false ) - .getDefaultCopyTransOpts(); + copyTransOpts = projectDAO.findById(document.getProjectIteration().getProject().getId(), false) + .getDefaultCopyTransOpts(); } // use the global default options - if( copyTransOpts == null ) + if (copyTransOpts == null) { copyTransOpts = new HCopyTransOptions(); } @@ -410,14 +421,14 @@ public void copyTransForDocument(HDocument document, HCopyTransOptions copyTrans for (HLocale locale : localeList) { - if( taskHandleOpt.isPresent() && taskHandleOpt.get().isCancelled() ) + if (taskHandleOpt.isPresent() && taskHandleOpt.get().isCancelled()) { return; } copyTransForLocale(document, locale, copyTransOpts); } - if( taskHandleOpt.isPresent() ) + if (taskHandleOpt.isPresent()) { taskHandleOpt.get().incrementDocumentsProcessed(); } @@ -429,9 +440,9 @@ public void copyTransForIteration(HProjectIteration iteration, HCopyTransOptions { Optional taskHandleOpt = AsyncUtils.getEventAsyncHandle(CopyTransTaskHandle.class); - for( HDocument doc : iteration.getDocuments().values() ) + for (HDocument doc : iteration.getDocuments().values()) { - if( taskHandleOpt.isPresent() && taskHandleOpt.get().isCancelled() ) + if (taskHandleOpt.isPresent() && taskHandleOpt.get().isCancelled()) { return; } @@ -444,13 +455,13 @@ public void copyTransForIteration(HProjectIteration iteration, HCopyTransOptions */ private static boolean shouldOverwrite(HTextFlowTarget currentlyStored, ContentState matchState) { - if( matchState == New ) + if (matchState == New) { return false; } - else if( currentlyStored != null ) + else if (currentlyStored != null) { - if( currentlyStored.getState().isRejectedOrFuzzy() && matchState.isTranslated()) + if (currentlyStored.getState().isRejectedOrFuzzy() && matchState.isTranslated()) { return true; // If it's fuzzy, replace only with approved ones } @@ -458,7 +469,7 @@ else if (currentlyStored.getState() == ContentState.Translated && matchState.isA { return true; // If it's Translated and found an Approved one } - else if( currentlyStored.getState() == New ) + else if (currentlyStored.getState() == New) { return true; // If it's new, replace always } @@ -470,6 +481,31 @@ else if( currentlyStored.getState() == New ) return true; } + /** + * Run enforced validation check(Error) if translation is saving as 'Translated'. + * + * @param newState + * @param projectVersion + * @param sources + * @param translations + * @return if translation has validation error + */ + private boolean validationTranslations(ContentState newState, HProjectIteration projectVersion, List sources, List translations) + { + if (newState.isTranslated()) + { + List validationMessages = validationServiceImpl.validateWithServerRules( + projectVersion, sources, translations, ValidationAction.State.Error); + + if (!validationMessages.isEmpty()) + { + log.warn(validationMessages); + return true; + } + } + return false; + } + /** * Holds the result of a match evaluation in the form of a boolean, and the corresponding action * to be taken for the result. diff --git a/zanata-war/src/main/java/org/zanata/service/impl/LocaleServiceImpl.java b/zanata-war/src/main/java/org/zanata/service/impl/LocaleServiceImpl.java index 76593049fe..df95f275e9 100644 --- a/zanata-war/src/main/java/org/zanata/service/impl/LocaleServiceImpl.java +++ b/zanata-war/src/main/java/org/zanata/service/impl/LocaleServiceImpl.java @@ -258,7 +258,7 @@ public HLocale getByLocaleId(@Nonnull String localeId) public List getSupportedLangugeByProjectIteration(@Nonnull String project, @Nonnull String iterationSlug) { HProjectIteration iteration = projectIterationDAO.getBySlug(project, iterationSlug); - if (iteration.getOverrideLocales()) + if (iteration.isOverrideLocales()) { return new ArrayList(iteration.getCustomizedLocales()); } @@ -269,7 +269,7 @@ public List getSupportedLangugeByProjectIteration(@Nonnull String proje public List getSupportedLanguageByProject(@Nonnull String project) { HProject proj = projectDAO.getBySlug(project); - if (proj.getOverrideLocales()) + if (proj.isOverrideLocales()) { return new ArrayList(proj.getCustomizedLocales()); } @@ -309,7 +309,7 @@ public Map getIterationGlobalLocaleItems(String projectSlug) { log.info("start getIterationGlobalLocaleItems for:" + projectSlug); HProject project = projectDAO.getBySlug(projectSlug); - return project.getOverrideLocales() ? getCustomizedLocalesItems(projectSlug) : getGlobalLocaleItems(); + return project.isOverrideLocales() ? getCustomizedLocalesItems(projectSlug) : getGlobalLocaleItems(); } @Override @@ -317,7 +317,7 @@ public Map getCustomizedLocalesItems(String projectSlug) { Map customizedItems = new TreeMap(); HProject project = projectDAO.getBySlug(projectSlug); - if (project != null && project.getOverrideLocales()) + if (project != null && project.isOverrideLocales()) { Set locales = project.getCustomizedLocales(); for (HLocale op : locales) @@ -351,7 +351,7 @@ public Map getIterationCustomizedLocalesItems(String projectSlug { Map customizedItems = new TreeMap(); HProjectIteration iteration = projectIterationDAO.getBySlug(projectSlug, iterationSlug); - if (iteration != null && iteration.getOverrideLocales()) + if (iteration != null && iteration.isOverrideLocales()) { Set locales = iteration.getCustomizedLocales(); for (HLocale op : locales) diff --git a/zanata-war/src/main/java/org/zanata/service/impl/TranslationServiceImpl.java b/zanata-war/src/main/java/org/zanata/service/impl/TranslationServiceImpl.java index 383a542637..51922a4db3 100644 --- a/zanata-war/src/main/java/org/zanata/service/impl/TranslationServiceImpl.java +++ b/zanata-war/src/main/java/org/zanata/service/impl/TranslationServiceImpl.java @@ -20,67 +20,36 @@ */ package org.zanata.service.impl; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import javax.annotation.Nonnull; -import javax.persistence.EntityManager; - -import lombok.extern.slf4j.Slf4j; - -import org.hibernate.HibernateException; -import org.jboss.seam.ScopeType; -import org.jboss.seam.annotations.In; -import org.jboss.seam.annotations.Name; -import org.jboss.seam.annotations.Scope; -import org.jboss.seam.annotations.TransactionPropagationType; -import org.jboss.seam.annotations.Transactional; -import org.jboss.seam.core.Events; -import org.jboss.seam.security.management.JpaIdentityStore; -import org.jboss.seam.util.Work; -import org.zanata.async.AsyncTaskHandle; -import org.zanata.async.AsyncUtils; -import org.zanata.common.ContentState; -import org.zanata.common.LocaleId; -import org.zanata.common.MergeType; -import org.zanata.common.util.ContentStateUtil; -import org.zanata.dao.DocumentDAO; -import org.zanata.dao.PersonDAO; -import org.zanata.dao.ProjectIterationDAO; -import org.zanata.dao.TextFlowDAO; -import org.zanata.dao.TextFlowTargetDAO; -import org.zanata.events.DocumentUploadedEvent; -import org.zanata.events.TextFlowTargetStateEvent; -import org.zanata.exception.ZanataServiceException; -import org.zanata.lock.Lock; -import org.zanata.model.HAccount; -import org.zanata.model.HDocument; -import org.zanata.model.HLocale; -import org.zanata.model.HPerson; -import org.zanata.model.HProjectIteration; -import org.zanata.model.HSimpleComment; -import org.zanata.model.HTextFlow; -import org.zanata.model.HTextFlowTarget; -import org.zanata.model.HTextFlowTargetHistory; -import org.zanata.rest.dto.resource.TextFlowTarget; -import org.zanata.rest.dto.resource.TranslationsResource; -import org.zanata.rest.service.ResourceUtils; -import org.zanata.security.ZanataIdentity; -import org.zanata.service.LocaleService; -import org.zanata.service.LockManagerService; -import org.zanata.service.TranslationMergeService; -import org.zanata.service.TranslationService; -import org.zanata.webtrans.shared.model.TransUnitId; -import org.zanata.webtrans.shared.model.TransUnitUpdateInfo; -import org.zanata.webtrans.shared.model.TransUnitUpdateRequest; - -import com.google.common.base.Optional; -import com.google.common.base.Predicate; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; +import java.util.*; + +import javax.annotation.*; +import javax.persistence.*; + +import lombok.extern.slf4j.*; + +import org.apache.commons.lang.*; +import org.hibernate.*; +import org.jboss.seam.*; +import org.jboss.seam.annotations.*; +import org.jboss.seam.core.*; +import org.jboss.seam.security.management.*; +import org.jboss.seam.util.*; +import org.zanata.async.*; +import org.zanata.common.*; +import org.zanata.common.util.*; +import org.zanata.dao.*; +import org.zanata.events.*; +import org.zanata.exception.*; +import org.zanata.lock.*; +import org.zanata.model.*; +import org.zanata.rest.dto.resource.*; +import org.zanata.rest.service.*; +import org.zanata.security.*; +import org.zanata.service.*; +import org.zanata.webtrans.shared.model.*; + +import com.google.common.base.*; +import com.google.common.collect.*; @Name("translationServiceImpl") @Scope(ScopeType.STATELESS) @@ -116,6 +85,9 @@ public class TranslationServiceImpl implements TranslationService @In private LockManagerService lockManagerServiceImpl; + @In + private ValidationService validationServiceImpl; + @In(value = JpaIdentityStore.AUTHENTICATED_USER, scope = ScopeType.SESSION, required = false) private HAccount authenticatedAccount; @@ -127,6 +99,23 @@ public class TranslationServiceImpl implements TranslationService @Override public List translate(LocaleId localeId, List translationRequests) + { + return translate(localeId, translationRequests, true); + } + + /** + * This is used when reverting translation + * + * @param localeId + * @param translationRequests + * @return + */ + private List translateWithoutValidating(LocaleId localeId, List translationRequests) + { + return translate(localeId, translationRequests, false); + } + + private List translate(LocaleId localeId, List translationRequests, boolean runValidation) { List results = new ArrayList(); @@ -138,7 +127,8 @@ public List translate(LocaleId localeId, List translate(LocaleId localeId, List translate(LocaleId localeId, List translate(LocaleId localeId, List translate(LocaleId localeId, List translate(LocaleId localeId, List translationRequests, HProjectIteration projectIteration, HLocale hLocale) + private void validateReviewPermissionIfApplicable(List translationRequests, + HProjectIteration projectIteration, + HLocale hLocale) { - Optional hasReviewRequest = Iterables.tryFind(translationRequests, new Predicate() - { - @Override - public boolean apply(TransUnitUpdateRequest input) - { - return isReviewState(input.getNewContentState()); - } - }); + Optional hasReviewRequest = Iterables.tryFind(translationRequests, + new Predicate() + { + @Override + public boolean apply(TransUnitUpdateRequest input) + { + return isReviewState(input.getNewContentState()); + } + }); if (hasReviewRequest.isPresent()) { identity.checkPermission("translation-review", projectIteration.getProject(), hLocale); @@ -230,16 +244,16 @@ private HLocale validateLocale(LocaleId localeId, HProjectIteration projectItera /** * Sends out an event to signal that a Text Flow target has been translated */ - private void signalPostTranslateEvent( HTextFlowTarget hTextFlowTarget ) + private void signalPostTranslateEvent(HTextFlowTarget hTextFlowTarget) { - if( Events.exists() ) + if (Events.exists()) { HTextFlow textFlow = hTextFlowTarget.getTextFlow(); HDocument document = textFlow.getDocument(); // TODO remove hasError from DocumentStatus, so that we can pass everything else directly to cache -// DocumentStatus docStatus = new DocumentStatus( -// new DocumentId(document.getId(), document.getDocId()), hasError, -// hTextFlowTarget.getLastChanged(), hTextFlowTarget.getLastModifiedBy().getAccount().getUsername()); + // DocumentStatus docStatus = new DocumentStatus( + // new DocumentId(document.getId(), document.getDocId()), hasError, + // hTextFlowTarget.getLastChanged(), hTextFlowTarget.getLastModifiedBy().getAccount().getUsername()); Events.instance().raiseTransactionSuccessEvent( TextFlowTargetStateEvent.EVENT_NAME, @@ -249,14 +263,13 @@ private void signalPostTranslateEvent( HTextFlowTarget hTextFlowTarget ) hTextFlowTarget.getLocale().getLocaleId(), hTextFlowTarget.getId(), hTextFlowTarget.getState() -// docStatus - )); + )); } } - private boolean translate(@Nonnull - HTextFlowTarget hTextFlowTarget, @Nonnull - List contentsToSave, ContentState requestedState, int nPlurals, Boolean requireTranslationReview) + private boolean translate(@Nonnull HTextFlowTarget hTextFlowTarget, @Nonnull List contentsToSave, + ContentState requestedState, + int nPlurals, Boolean requireTranslationReview) { boolean targetChanged = false; targetChanged |= setContentIfChanged(hTextFlowTarget, contentsToSave); @@ -273,7 +286,7 @@ private boolean translate(@Nonnull // save the target histories entityManager.flush(); - + //fire event after flush if (targetChanged || hTextFlowTarget.getVersionNum() == 0) { @@ -286,9 +299,7 @@ private boolean translate(@Nonnull /** * @return true if the content was changed, false otherwise */ - private boolean setContentIfChanged(@Nonnull - HTextFlowTarget hTextFlowTarget, @Nonnull - List contentsToSave) + private boolean setContentIfChanged(@Nonnull HTextFlowTarget hTextFlowTarget, @Nonnull List contentsToSave) { if (!contentsToSave.equals(hTextFlowTarget.getContents())) { @@ -310,9 +321,9 @@ private boolean setContentIfChanged(@Nonnull * @see #adjustContentsAndState(org.zanata.model.HTextFlowTarget, int, * java.util.List) */ - private boolean setContentStateIfChanged(@Nonnull - ContentState requestedState, @Nonnull - HTextFlowTarget target, int nPlurals, boolean requireTranslationReview) + private boolean setContentStateIfChanged(@Nonnull ContentState requestedState, @Nonnull HTextFlowTarget target, + int nPlurals, + boolean requireTranslationReview) { boolean changed = false; ContentState previousState = target.getState(); @@ -360,9 +371,8 @@ private boolean setContentStateIfChanged(@Nonnull * @param warnings a warning string will be added if state is adjusted * @return true if and only if some state was changed */ - private static boolean adjustContentsAndState(@Nonnull - HTextFlowTarget target, int nPlurals, @Nonnull - List warnings) + private static boolean adjustContentsAndState(@Nonnull HTextFlowTarget target, int nPlurals, + @Nonnull List warnings) { ContentState oldState = target.getState(); String resId = target.getTextFlow().getResId(); @@ -383,13 +393,14 @@ private static boolean adjustContentsAndState(@Nonnull * @param warnings if elements were added or removed * @return */ - private static boolean ensureContentsSize(HTextFlowTarget target, int legalSize, String resId, @Nonnull - List warnings) + private static boolean ensureContentsSize(HTextFlowTarget target, int legalSize, String resId, + @Nonnull List warnings) { int contentsSize = target.getContents().size(); if (contentsSize < legalSize) { - String warning = "Should have " + legalSize + " contents; adding empty strings: TextFlowTarget "+resId+" with contents: " + target.getContents(); + String warning = "Should have " + legalSize + " contents; adding empty strings: TextFlowTarget " + resId + + " with contents: " + target.getContents(); warnings.add(warning); List newContents = new ArrayList(legalSize); newContents.addAll(target.getContents()); @@ -402,7 +413,8 @@ private static boolean ensureContentsSize(HTextFlowTarget target, int legalSize, } else if (contentsSize > legalSize) { - String warning = "Should have " + legalSize + " contents; discarding extra strings: TextFlowTarget "+resId+" with contents: " + target.getContents(); + String warning = "Should have " + legalSize + " contents; discarding extra strings: TextFlowTarget " + resId + + " with contents: " + target.getContents(); warnings.add(warning); List newContents = new ArrayList(legalSize); for (int i = 0; i < contentsSize; i++) @@ -419,13 +431,13 @@ else if (contentsSize > legalSize) @Override // This will not run in a transaction. Instead, transactions are controlled within the method itself. @Transactional(TransactionPropagationType.NEVER) - public List translateAllInDoc( String projectSlug, String iterationSlug, String docId, LocaleId locale, - TranslationsResource translations, Set extensions, MergeType mergeType, - boolean lock) + public List translateAllInDoc(String projectSlug, String iterationSlug, String docId, LocaleId locale, + TranslationsResource translations, Set extensions, MergeType mergeType, + boolean lock) { // Lock this document for push Lock transLock = null; - if( lock ) + if (lock) { transLock = new Lock(projectSlug, iterationSlug, docId, locale, "push"); lockManagerServiceImpl.attain(transLock); @@ -434,11 +446,12 @@ public List translateAllInDoc( String projectSlug, String iterationSlug, List messages = Lists.newArrayList(); try { - messages = this.translateAllInDoc(projectSlug, iterationSlug, docId, locale, translations, extensions, mergeType); + messages = this.translateAllInDoc(projectSlug, iterationSlug, docId, locale, translations, extensions, + mergeType); } finally { - if(lock) + if (lock) { lockManagerServiceImpl.release(transLock); } @@ -446,11 +459,44 @@ public List translateAllInDoc( String projectSlug, String iterationSlug, return messages; } + /** + * Run enforced validation check(Error) if target has changed and translation saving as 'Translated' or 'Approved' + * @param newState + * @param projectVersion + * @param targetId + * @param sources + * @param translations + * @return error messages + */ + private String validateTranslations(ContentState newState, HProjectIteration projectVersion, String targetId, + List sources, List translations) + { + String message = null; + if (newState.isTranslated()) + { + List validationMessages = validationServiceImpl.validateWithServerRules( + projectVersion, sources, translations, ValidationAction.State.Error); + + 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 translateAllInDoc(final String projectSlug, final String iterationSlug, final String docId, final LocaleId locale, - final TranslationsResource translations, final Set extensions, final MergeType mergeType) + public List translateAllInDoc(final String projectSlug, final String iterationSlug, final String docId, + final LocaleId locale, + final TranslationsResource translations, final Set extensions, final MergeType mergeType) { - HProjectIteration hProjectIteration = projectIterationDAO.getBySlug(projectSlug, iterationSlug); + final HProjectIteration hProjectIteration = projectIterationDAO.getBySlug(projectSlug, iterationSlug); if (hProjectIteration == null) { @@ -478,25 +524,26 @@ public List translateAllInDoc(final String projectSlug, final String ite final HLocale hLocale = localeServiceImpl.validateLocaleByProjectIteration(locale, projectSlug, iterationSlug); final Optional handleOp = AsyncUtils.getEventAsyncHandle(AsyncTaskHandle.class); - if( handleOp.isPresent() ) + if (handleOp.isPresent()) { - handleOp.get().setMaxProgress( translations.getTextFlowTargets().size() ); + handleOp.get().setMaxProgress(translations.getTextFlowTargets().size()); } try { changed |= - new Work() - { - @Override - protected Boolean work() throws Exception - { - // handle extensions - boolean changed = - resourceUtils.transferFromTranslationsResourceExtensions(translations.getExtensions(true), document, extensions, hLocale, mergeType); - return changed; - } - }.workInTransaction(); + new Work() + { + @Override + protected Boolean work() throws Exception + { + // handle extensions + boolean changed = + resourceUtils.transferFromTranslationsResourceExtensions(translations.getExtensions(true), + document, extensions, hLocale, mergeType); + return changed; + } + }.workInTransaction(); } catch (Exception e) { @@ -522,93 +569,107 @@ protected Boolean work() throws Exception // Break the target into batches List> batches = Lists.partition(translations.getTextFlowTargets(), BATCH_SIZE); - for( final List batch : batches ) + for (final List batch : batches) { try { changed |= - new Work() - { - @Override - protected Boolean work() throws Exception - { - boolean changed = false; - - for (TextFlowTarget incomingTarget : batch) + new Work() { - String resId = incomingTarget.getResId(); - HTextFlow textFlow = textFlowDAO.getById(document, resId); - if (textFlow == null) + @Override + protected Boolean work() throws Exception { - // return warning for unknown resId to caller - String warning = "Could not find TextFlow for TextFlowTarget "+resId+" with contents: " + incomingTarget.getContents(); - warnings.add(warning); - log.warn("skipping TextFlowTarget with unknown resId: {}", resId); - } - else - { - int nPlurals = getNumPlurals(hLocale, textFlow); - HTextFlowTarget hTarget = textFlowTargetDAO.getTextFlowTarget(textFlow, hLocale); - - TranslationMergeServiceFactory.MergeContext mergeContext = new TranslationMergeServiceFactory.MergeContext(mergeType, textFlow, hLocale, hTarget, nPlurals); - TranslationMergeService mergeService = translationMergeServiceFactory.getMergeService(mergeContext); + boolean changed = false; - if (mergeType == MergeType.IMPORT) + for (TextFlowTarget incomingTarget : batch) { - removedTargets.remove(hTarget); - } - boolean targetChanged = mergeService.merge(incomingTarget, hTarget, extensions); - if (hTarget == null) - { - // in case hTarget was null, we need to retrieve it after merge - hTarget = textFlow.getTargets().get(hLocale.getId()); - } - targetChanged |= adjustContentsAndState(hTarget, nPlurals, warnings); + String resId = incomingTarget.getResId(); + HTextFlow textFlow = textFlowDAO.getById(document, resId); + if (textFlow == null) + { + // return warning for unknown resId to caller + String warning = "Could not find TextFlow for TextFlowTarget " + resId + + " with contents: " + incomingTarget.getContents(); + warnings.add(warning); + log.warn("skipping TextFlowTarget with unknown resId: {}", resId); + } + else + { + String validationMessage = validateTranslations(incomingTarget.getState(), + hProjectIteration, incomingTarget.getResId(), textFlow.getContents(), + incomingTarget.getContents()); - // update translation information if applicable - if (targetChanged) - { - hTarget.setVersionNum(hTarget.getVersionNum() + 1); + if (!StringUtils.isEmpty(validationMessage)) + { + warnings.add(validationMessage); + log.warn(validationMessage); + continue; + } - changed = true; - if (incomingTarget.getTranslator() != null) - { - String email = incomingTarget.getTranslator().getEmail(); - HPerson hPerson = personDAO.findByEmail(email); - if (hPerson == null) + int nPlurals = getNumPlurals(hLocale, textFlow); + HTextFlowTarget hTarget = textFlowTargetDAO.getTextFlowTarget(textFlow, hLocale); + + if (mergeType == MergeType.IMPORT) { - hPerson = new HPerson(); - hPerson.setEmail(email); - hPerson.setName(incomingTarget.getTranslator().getName()); - personDAO.makePersistent(hPerson); + removedTargets.remove(hTarget); } - hTarget.setTranslator(hPerson); - hTarget.setLastModifiedBy(hPerson); + + TranslationMergeServiceFactory.MergeContext mergeContext = new TranslationMergeServiceFactory.MergeContext( + mergeType, textFlow, hLocale, hTarget, nPlurals); + TranslationMergeService mergeService = translationMergeServiceFactory + .getMergeService(mergeContext); + + boolean targetChanged = mergeService.merge(incomingTarget, hTarget, extensions); + if (hTarget == null) + { + // in case hTarget was null, we need to retrieve it after merge + hTarget = textFlow.getTargets().get(hLocale.getId()); + } + targetChanged |= adjustContentsAndState(hTarget, nPlurals, warnings); + + // update translation information if applicable + if (targetChanged) + { + hTarget.setVersionNum(hTarget.getVersionNum() + 1); + + changed = true; + if (incomingTarget.getTranslator() != null) + { + String email = incomingTarget.getTranslator().getEmail(); + HPerson hPerson = personDAO.findByEmail(email); + if (hPerson == null) + { + hPerson = new HPerson(); + hPerson.setEmail(email); + hPerson.setName(incomingTarget.getTranslator().getName()); + personDAO.makePersistent(hPerson); + } + hTarget.setTranslator(hPerson); + hTarget.setLastModifiedBy(hPerson); + } + else + { + hTarget.setTranslator(null); + hTarget.setLastModifiedBy(null); + } + textFlowTargetDAO.makePersistent(hTarget); + } + signalPostTranslateEvent(hTarget); } - else + + personDAO.flush(); + textFlowTargetDAO.flush(); + personDAO.clear(); + textFlowTargetDAO.clear(); + if (handleOp.isPresent()) { - hTarget.setTranslator(null); - hTarget.setLastModifiedBy(null); + handleOp.get().increaseProgress(1); } - textFlowTargetDAO.makePersistent(hTarget); } - signalPostTranslateEvent(hTarget); - } - - personDAO.flush(); - textFlowTargetDAO.flush(); - personDAO.clear(); - textFlowTargetDAO.clear(); - if( handleOp.isPresent() ) - { - handleOp.get().increaseProgress(1); + return changed; } - } - - return changed; - } - }.workInTransaction(); + }.workInTransaction(); } catch (Exception e) { @@ -637,13 +698,13 @@ protected Void work() throws Exception return null; } }.workInTransaction(); - - if(Events.exists()) + + if (Events.exists()) { Events.instance().raiseEvent( DocumentUploadedEvent.EVENT_NAME, new DocumentUploadedEvent(document.getId(), false, hLocale.getLocaleId() - )); + )); } } catch (Exception e) @@ -676,6 +737,7 @@ public static class TranslationResultImpl implements TranslationResult private boolean targetChanged = false; private int baseVersion; private ContentState baseContentState; + private String errorMessage; @Override public boolean isTranslationSuccessful() @@ -707,6 +769,12 @@ public ContentState getBaseContentState() return baseContentState; } + @Override + public String getErrorMessage() + { + return errorMessage; + } + } @Override @@ -717,7 +785,8 @@ public List revertTranslations(LocaleId localeId, List revertTranslations(LocaleId localeId, List revertTranslations(LocaleId localeId, List emptyContents = Lists.newArrayList(); for (int i = 0; i < hTextFlowTarget.getContents().size(); i++) { emptyContents.add(""); } - TransUnitUpdateRequest request = new TransUnitUpdateRequest(tuId, emptyContents, ContentState.New, versionNum); + TransUnitUpdateRequest request = new TransUnitUpdateRequest(tuId, emptyContents, ContentState.New, + versionNum); updateRequests.add(request); } } else { - log.info("attempt to revert target version {} for tu with id {}, but current version is {}. Not reverting.", new Object[] { info.getTransUnit().getVerNum(), tuId, versionNum }); + log.info( + "attempt to revert target version {} for tu with id {}, but current version is {}. Not reverting.", + new Object[] { + info.getTransUnit().getVerNum(), tuId, versionNum }); results.add(buildFailResult(hTextFlowTarget)); } } } - results.addAll(translate(localeId, updateRequests)); + results.addAll(translateWithoutValidating(localeId, updateRequests)); return results; } @@ -781,6 +858,7 @@ private TranslationResultImpl buildFailResult(HTextFlowTarget hTextFlowTarget) result.baseContentState = hTextFlowTarget.getState(); result.isSuccess = false; result.translatedTextFlowTarget = hTextFlowTarget; + result.errorMessage = null; return result; } } diff --git a/zanata-war/src/main/java/org/zanata/service/impl/TranslationStateCacheImpl.java b/zanata-war/src/main/java/org/zanata/service/impl/TranslationStateCacheImpl.java index c298a7feaf..b99ccfe1ab 100644 --- a/zanata-war/src/main/java/org/zanata/service/impl/TranslationStateCacheImpl.java +++ b/zanata-war/src/main/java/org/zanata/service/impl/TranslationStateCacheImpl.java @@ -150,7 +150,7 @@ private void invalidateDocLastTranslatedCache(Long documentId, LocaleId localeId } @Override - public Boolean textFlowTargetHasError(Long targetId, ValidationId validationId) + public Boolean textFlowTargetHasWarningOrError(Long targetId, ValidationId validationId) { Map cacheEntry = targetValidationCache.getWithLoader(targetId); if (!cacheEntry.containsKey(validationId)) diff --git a/zanata-war/src/main/java/org/zanata/service/impl/ValidationServiceImpl.java b/zanata-war/src/main/java/org/zanata/service/impl/ValidationServiceImpl.java index e1c4681e45..15a2e3889c 100644 --- a/zanata-war/src/main/java/org/zanata/service/impl/ValidationServiceImpl.java +++ b/zanata-war/src/main/java/org/zanata/service/impl/ValidationServiceImpl.java @@ -3,39 +3,22 @@ */ package org.zanata.service.impl; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import org.apache.commons.lang.StringUtils; -import org.jboss.seam.ScopeType; -import org.jboss.seam.annotations.In; -import org.jboss.seam.annotations.Logger; -import org.jboss.seam.annotations.Name; -import org.jboss.seam.annotations.Scope; -import org.jboss.seam.log.Log; -import org.zanata.common.LocaleId; -import org.zanata.dao.DocumentDAO; -import org.zanata.dao.ProjectDAO; -import org.zanata.dao.ProjectIterationDAO; -import org.zanata.dao.TextFlowTargetDAO; -import org.zanata.model.HDocument; -import org.zanata.model.HProject; -import org.zanata.model.HProjectIteration; -import org.zanata.model.HTextFlow; -import org.zanata.model.HTextFlowTarget; -import org.zanata.service.TranslationStateCache; -import org.zanata.service.ValidationFactoryProvider; -import org.zanata.service.ValidationService; -import org.zanata.webtrans.server.rpc.TransUnitTransformer; -import org.zanata.webtrans.shared.model.DocumentStatus; -import org.zanata.webtrans.shared.model.ValidationAction; -import org.zanata.webtrans.shared.model.ValidationId; -import org.zanata.webtrans.shared.validation.ValidationFactory; - -import com.google.common.base.Stopwatch; +import java.util.*; + +import org.apache.commons.lang.*; +import org.jboss.seam.*; +import org.jboss.seam.annotations.*; +import org.jboss.seam.log.*; +import org.zanata.common.*; +import org.zanata.dao.*; +import org.zanata.model.*; +import org.zanata.service.*; +import org.zanata.webtrans.shared.model.*; +import org.zanata.webtrans.shared.model.ValidationAction.*; +import org.zanata.webtrans.shared.validation.*; + +import com.google.common.base.*; +import com.google.common.collect.*; /** * @@ -52,9 +35,6 @@ public class ValidationServiceImpl implements ValidationService @In private ProjectDAO projectDAO; - @In - private TransUnitTransformer transUnitTransformer; - @In private ProjectIterationDAO projectIterationDAO; @@ -79,99 +59,114 @@ private ValidationFactory getValidationFactory() } @Override - public Collection getValidationAction(String projectSlug) + public Collection getValidationActions(String projectSlug) { - Collection validationList = getValidationFactory().getAllValidationActions().values(); - Set enabledValidations = new HashSet(); - if (!StringUtils.isEmpty(projectSlug)) { HProject project = projectDAO.getBySlug(projectSlug); - enabledValidations = project.getCustomizedValidations(); + return getValidationActions(project); } + return getValidationFactory().getAllValidationActions().values(); + } - for (ValidationAction valAction : validationList) - { - if (enabledValidations.contains(valAction.getId().name())) - { - valAction.getValidationInfo().setEnabled(true); - } - } + private Collection getValidationActions(HProject project, State... includeStates) + { + Map customizedValidations = project.getCustomizedValidations(); + Collection mergedList = mergeCustomisedStateToAllValidations(customizedValidations); - return validationList; + return filterList(mergedList, includeStates); } @Override - public Collection getValidationAction(String projectSlug, String versionSlug) + public Collection getValidationActions(String projectSlug, String versionSlug) { - Collection validationList = null; - - if (!StringUtils.isEmpty(projectSlug)) + if (!StringUtils.isEmpty(projectSlug) && !StringUtils.isEmpty(versionSlug)) { HProjectIteration version = projectIterationDAO.getBySlug(projectSlug, versionSlug); + return getValidationActions(version); + } + else if (!StringUtils.isEmpty(projectSlug)) + { + return getValidationActions(projectSlug); + } + return getValidationFactory().getAllValidationActions().values(); + } - validationList = getValidationObject(version); + private Collection getValidationActions(HProjectIteration projectVersion, State... includeStates) + { + Map customizedValidations = projectVersion.getCustomizedValidations(); + + /** + * Inherits validations from project if version has no defined validations + */ + if (customizedValidations.isEmpty()) + { + return getValidationActions(projectVersion.getProject(), includeStates); } - return validationList; + Collection mergedList = mergeCustomisedStateToAllValidations(customizedValidations); + + return filterList(mergedList, includeStates); } - @Override - public Collection getValidationObject(HProjectIteration version) + private Collection filterList(Collection list, State... includeStates) { - Collection validationList = getValidationFactory().getAllValidationActions().values(); + if (includeStates == null || includeStates.length == 0) + { + return list; + } - Set enabledValidations = new HashSet(); + List includeStateList = Arrays.asList(includeStates); - if (version != null) + Collection filteredList = Lists.newArrayList(); + for (ValidationAction action : list) { - enabledValidations = version.getCustomizedValidations(); - - // Inherits validations from project if version has no defined - // validations - if (enabledValidations.isEmpty()) + if (includeStateList.contains(action.getState())) { - enabledValidations = version.getProject().getCustomizedValidations(); + filteredList.add(action); } } + return filteredList; + } + + private Collection mergeCustomisedStateToAllValidations(Map customizedValidations) + { + Collection allValidations = getValidationFactory().getAllValidationActions().values(); - for (ValidationAction valAction : validationList) + for (ValidationAction valAction : allValidations) { - if (enabledValidations.contains(valAction.getId().name())) + String name = valAction.getId().name(); + if (customizedValidations.containsKey(name)) { - valAction.getValidationInfo().setEnabled(true); - valAction.getValidationInfo().setLocked(true); + State persistedState = State.valueOf(customizedValidations.get(name)); + valAction.setState(persistedState); } } - return validationList; + return allValidations; } - private List getEnabledValidationIds(HProjectIteration version) + /** + * Get validation id of the HProjectIteration with includeStates. Leave includeStates empty to get all states + * @param version + * @param includeStates + * @return list of validation ids for that version + */ + private List getValidationIds(HProjectIteration version, State... includeStates) { - Collection validationList = getValidationFactory().getAllValidationActions().values(); - Set enabledValidations = new HashSet(); - List enabledValidationIds = new ArrayList(); + List validationIds = Lists.newArrayList(); + + Collection mergedList = Lists.newArrayList(); if (version != null) { - enabledValidations = version.getCustomizedValidations(); - - // Inherits validations from project if version has no defined - // validations - if (enabledValidations.isEmpty()) - { - enabledValidations = version.getProject().getCustomizedValidations(); - } + mergedList = getValidationActions(version, includeStates); } - for (ValidationAction valAction : validationList) + for (ValidationAction action : mergedList) { - if (enabledValidations.contains(valAction.getId().name())) - { - enabledValidationIds.add(valAction.getId()); - } + validationIds.add(action.getId()); } - return enabledValidationIds; + return validationIds; } /** @@ -198,7 +193,7 @@ public boolean runDocValidations(Long hDocId, List validationIds, else { HDocument hDoc = documentDAO.findById(hDocId, false); - result = documentHasError(hDoc, validationIds, localeId); + result = documentHasWarningOrError(hDoc, validationIds, localeId); } log.debug("Finished runDocValidations in " + stopwatch); @@ -211,19 +206,19 @@ public boolean runDocValidationsWithServerRules(HDocument hDoc, LocaleId localeI log.debug("Start runDocValidationsWithServerRules {0}", hDoc.getId()); Stopwatch stopwatch = new Stopwatch().start(); - List validationIds = getEnabledValidationIds(hDoc.getProjectIteration()); + List validationIds = getValidationIds(hDoc.getProjectIteration(), State.Warning, State.Error); - boolean hasError = documentHasError(hDoc, validationIds, localeId); + boolean hasError = documentHasWarningOrError(hDoc, validationIds, localeId); log.debug("Finished runDocValidationsWithServerRules in " + stopwatch); return hasError; } - private boolean documentHasError(HDocument hDoc, List validationIds, LocaleId localeId) + private boolean documentHasWarningOrError(HDocument hDoc, List validationIds, LocaleId localeId) { for (HTextFlow textFlow : hDoc.getTextFlows()) { - boolean hasError = textFlowTargetHasError(textFlow.getId(), validationIds, localeId); + boolean hasError = textFlowTargetHasWarningOrError(textFlow.getId(), validationIds, localeId); if (hasError) { // return true if error found, else continue @@ -234,7 +229,8 @@ private boolean documentHasError(HDocument hDoc, List validationId } @Override - public List filterHasErrorTexFlow(List textFlows, List validationIds, LocaleId localeId, int startIndex, int maxSize) + public List filterHasWarningOrErrorTextFlow(List textFlows, List validationIds, + LocaleId localeId, int startIndex, int maxSize) { log.debug("Start filter {0} textFlows", textFlows.size()); Stopwatch stopwatch = new Stopwatch().start(); @@ -243,8 +239,8 @@ public List filterHasErrorTexFlow(List textFlows, List filterHasErrorTexFlow(List textFlows, List result.size() ? result.size() : toIndex; startIndex = startIndex > toIndex ? toIndex - maxSize : startIndex; startIndex = startIndex < 0 ? 0 : startIndex; @@ -265,14 +261,14 @@ public List filterHasErrorTexFlow(List textFlows, List validationIds, LocaleId localeId) + private boolean textFlowTargetHasWarningOrError(Long textFlowId, List validationIds, LocaleId localeId) { HTextFlowTarget target = textFlowTargetDAO.getTextFlowTarget(textFlowId, localeId); if (target != null) { for (ValidationId validationId : validationIds) { - Boolean value = translationStateCacheImpl.textFlowTargetHasError(target.getId(), validationId); + Boolean value = translationStateCacheImpl.textFlowTargetHasWarningOrError(target.getId(), validationId); if (value != null && value.booleanValue()) { return value.booleanValue(); @@ -281,4 +277,22 @@ private boolean textFlowTargetHasError(Long textFlowId, List valid } return false; } + + @Override + public List validateWithServerRules(HProjectIteration projectVersion, + List sources, List translations, State... actionStates) + { + Collection validationActions = getValidationActions(projectVersion, actionStates); + List errorList = Lists.newArrayList(); + + String tf_content0 = sources.get(0); + String tft_content0 = translations.get(0); + + for (ValidationAction action : validationActions) + { + errorList.addAll(action.validate(tf_content0, tft_content0)); + } + + return errorList; + } } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/Application.java b/zanata-war/src/main/java/org/zanata/webtrans/client/Application.java index 6176fbf219..d69fbe46a7 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/Application.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/Application.java @@ -96,7 +96,7 @@ public void onSuccess(final ActivateWorkspaceResult result) injector.getDispatcher().setUserWorkspaceContext(userWorkspaceContext); injector.getDispatcher().setEventBus(injector.getEventBus()); injector.getUserConfig().setState( result.getStoredUserConfiguration() ); - injector.getValidationService().setValidationRules(result.getValidations()); + injector.getValidationService().setValidationRules(result.getValidationStates()); startApp(); } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/events/FilterViewEvent.java b/zanata-war/src/main/java/org/zanata/webtrans/client/events/FilterViewEvent.java index 95041d0282..bd1f80a92c 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/events/FilterViewEvent.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/events/FilterViewEvent.java @@ -1,10 +1,7 @@ package org.zanata.webtrans.client.events; -import java.util.List; - import org.zanata.webtrans.client.service.GetTransUnitActionContext; import org.zanata.webtrans.client.service.NavigationService; -import org.zanata.webtrans.shared.model.ValidationId; import com.google.common.base.Objects; import com.google.common.base.Preconditions; @@ -16,7 +13,7 @@ public class FilterViewEvent extends GwtEvent implements * Handler type. */ private static Type TYPE; - public static final FilterViewEvent DEFAULT = new FilterViewEvent(false, false, false, false, false, false, false, null); + public static final FilterViewEvent DEFAULT = new FilterViewEvent(false, false, false, false, false, false, false); /** * Gets the type associated with this event. @@ -34,9 +31,8 @@ public static Type getType() private boolean filterTranslated, filterFuzzy, filterUntranslated, filterApproved, filterRejected, filterHasError; private boolean cancelFilter; - private List enabledValidationIds; - public FilterViewEvent(boolean filterTranslated, boolean filterFuzzy, boolean filterUntranslated, boolean filterApproved, boolean filterRejected, boolean filterHasError, boolean cancelFilter, List enabledValidationIds) + public FilterViewEvent(boolean filterTranslated, boolean filterFuzzy, boolean filterUntranslated, boolean filterApproved, boolean filterRejected, boolean filterHasError, boolean cancelFilter) { this.filterTranslated = filterTranslated; this.filterFuzzy = filterFuzzy; @@ -45,8 +41,6 @@ public FilterViewEvent(boolean filterTranslated, boolean filterFuzzy, boolean fi this.filterRejected = filterRejected; this.filterHasError = filterHasError; this.cancelFilter = cancelFilter; - this.enabledValidationIds = enabledValidationIds; - } @Override @@ -96,11 +90,6 @@ public boolean isFilterHasError() return filterHasError; } - public List getEnabledValidationIds() - { - return enabledValidationIds; - } - @Override public GetTransUnitActionContext updateContext(GetTransUnitActionContext currentContext) { @@ -110,8 +99,7 @@ public GetTransUnitActionContext updateContext(GetTransUnitActionContext current .changeFilterUntranslated(filterUntranslated) .changeFilterApproved(filterApproved) .changeFilterRejected(filterRejected) - .changeFilterHasError(filterHasError) - .changeValidationIds(enabledValidationIds); + .changeFilterHasError(filterHasError); } @Override diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/events/RunValidationEvent.java b/zanata-war/src/main/java/org/zanata/webtrans/client/events/RunValidationEvent.java index d8211734db..4eb775a19c 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/events/RunValidationEvent.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/events/RunValidationEvent.java @@ -22,7 +22,7 @@ import java.util.ArrayList; -import org.zanata.webtrans.client.ui.HasUpdateValidationWarning; +import org.zanata.webtrans.client.ui.HasUpdateValidationMessage; import com.google.gwt.event.shared.GwtEvent; @@ -50,7 +50,7 @@ public static Type getType() private String source, target; private boolean fireNotification = true; - private ArrayList widgetList = new ArrayList(); + private ArrayList widgetList = new ArrayList(); public RunValidationEvent(String source, String target, boolean fireNotification) { @@ -87,12 +87,12 @@ public boolean isFireNotification() return fireNotification; } - public void addWidget(HasUpdateValidationWarning validationMessagePanel) + public void addWidget(HasUpdateValidationMessage validationMessagePanel) { widgetList.add(validationMessagePanel); } - public ArrayList getWidgetList() + public ArrayList getWidgetList() { return widgetList; } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/events/WorkspaceContextUpdateEvent.java b/zanata-war/src/main/java/org/zanata/webtrans/client/events/WorkspaceContextUpdateEvent.java index 28f5631260..b2e45c0de3 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/events/WorkspaceContextUpdateEvent.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/events/WorkspaceContextUpdateEvent.java @@ -3,8 +3,8 @@ import java.util.Map; import org.zanata.common.ProjectType; +import org.zanata.webtrans.shared.model.ValidationAction.State; import org.zanata.webtrans.shared.model.ValidationId; -import org.zanata.webtrans.shared.model.ValidationInfo; import org.zanata.webtrans.shared.rpc.HasWorkspaceContextUpdateData; import com.google.gwt.event.shared.GwtEvent; @@ -13,13 +13,13 @@ public class WorkspaceContextUpdateEvent extends GwtEvent validationInfoList; + private final Map validationStates; public WorkspaceContextUpdateEvent(HasWorkspaceContextUpdateData data) { this.isProjectActive = data.isProjectActive(); this.projectType = data.getProjectType(); - this.validationInfoList = data.getValidationInfoList(); + this.validationStates = data.getValidationStates(); } /** @@ -63,8 +63,8 @@ public ProjectType getProjectType() return projectType; } - public Map getValidationInfoList() + public Map getValidationStates() { - return validationInfoList; + return validationStates; } } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/keys/ShortcutContext.java b/zanata-war/src/main/java/org/zanata/webtrans/client/keys/ShortcutContext.java index d2a0e8ec49..8b346c0d14 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/keys/ShortcutContext.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/keys/ShortcutContext.java @@ -76,6 +76,11 @@ public enum ShortcutContext /** * Used by {@link org.zanata.webtrans.client.presenter.ForceReviewCommentPresenter} */ - RejectConfirmationPopup + RejectConfirmationPopup, + + /** + * Used by {@link org.zanata.webtrans.client.presenter.TargetContentsPresenter} + */ + ValidationWarningPopup } \ No newline at end of file diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/KeyShortcutPresenter.java b/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/KeyShortcutPresenter.java index b63b0e5280..3739f576a6 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/KeyShortcutPresenter.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/KeyShortcutPresenter.java @@ -20,42 +20,26 @@ */ package org.zanata.webtrans.client.presenter; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.zanata.webtrans.client.events.AttentionModeActivationEvent; -import org.zanata.webtrans.client.events.KeyShortcutEvent; -import org.zanata.webtrans.client.events.KeyShortcutEventHandler; -import org.zanata.webtrans.client.keys.EventWrapper; -import org.zanata.webtrans.client.keys.KeyShortcut; +import java.util.*; + +import net.customware.gwt.presenter.client.EventBus; +import net.customware.gwt.presenter.client.widget.*; + +import org.zanata.webtrans.client.events.*; +import org.zanata.webtrans.client.keys.*; import org.zanata.webtrans.client.keys.KeyShortcut.KeyEvent; -import org.zanata.webtrans.client.keys.KeyShortcutManager; -import org.zanata.webtrans.client.keys.Keys; -import org.zanata.webtrans.client.keys.ShortcutContext; -import org.zanata.webtrans.client.keys.SurplusKeyListener; -import org.zanata.webtrans.client.keys.TimedAction; import org.zanata.webtrans.client.keys.Timer; -import org.zanata.webtrans.client.keys.TimerFactory; -import org.zanata.webtrans.client.resources.WebTransMessages; -import org.zanata.webtrans.client.view.KeyShortcutDisplay; -import com.allen_sauer.gwt.log.client.Log; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Iterables; -import com.google.gwt.dom.client.NativeEvent; -import com.google.gwt.event.dom.client.KeyCodes; -import com.google.gwt.event.shared.HandlerRegistration; -import com.google.gwt.user.client.Event.NativePreviewEvent; -import com.google.gwt.user.client.Event.NativePreviewHandler; -import com.google.gwt.view.client.ListDataProvider; -import com.google.inject.Inject; +import org.zanata.webtrans.client.resources.*; +import org.zanata.webtrans.client.view.*; -import net.customware.gwt.presenter.client.EventBus; -import net.customware.gwt.presenter.client.widget.WidgetPresenter; +import com.allen_sauer.gwt.log.client.*; +import com.google.common.collect.*; +import com.google.gwt.dom.client.NativeEvent; +import com.google.gwt.event.dom.client.*; +import com.google.gwt.event.shared.*; +import com.google.gwt.user.client.Event.*; +import com.google.gwt.view.client.*; +import com.google.inject.*; /** * Detects shortcut key combinations such as Alt+KEY and Shift+Alt+KEY and @@ -88,14 +72,14 @@ public class KeyShortcutPresenter extends WidgetPresenter // TODO unregister when user changes attention shortcut private HandlerRegistration attentionShortcutHandle; private transient ShortcutContext modalContext; - private transient Set copyOfCurrentContexts =Collections.emptySet(); + private transient Set copyOfCurrentContexts = Collections.emptySet(); @Inject public KeyShortcutPresenter(KeyShortcutDisplay display, - EventBus eventBus, - final WebTransMessages webTransMessages, - final EventWrapper event, - final TimerFactory timer) + EventBus eventBus, + final WebTransMessages webTransMessages, + final EventWrapper event, + final TimerFactory timer) { super(display, eventBus); this.messages = webTransMessages; @@ -266,7 +250,8 @@ public void onKeyShortcut(KeyShortcutEvent event) // @formatter:on Log.info("creating attention timer"); - attentionTimer = timers.create(new TimedAction() { + attentionTimer = timers.create(new TimedAction() + { @Override public void run() { @@ -301,7 +286,7 @@ private void setAttentionMode(boolean active) { isAttentionMode = active; AttentionModeActivationEvent attentionEvent = new AttentionModeActivationEvent(active); -// attentionEvent.setShortcuts(listAttentionShortcuts()); + // attentionEvent.setShortcuts(listAttentionShortcuts()); eventBus.fireEvent(attentionEvent); } } @@ -479,13 +464,17 @@ public void deactivateModalContext() public void activateModalContext(ShortcutContext modalContext) { - this.modalContext = modalContext; - copyOfCurrentContexts = ImmutableSet.copyOf(ensureActiveContexts()); - for (ShortcutContext context : copyOfCurrentContexts) + //check if modal context is already activate + if (!ensureActiveContexts().contains(modalContext)) { - setContextActive(context, false); + this.modalContext = modalContext; + copyOfCurrentContexts = ImmutableSet.copyOf(ensureActiveContexts()); + for (ShortcutContext context : copyOfCurrentContexts) + { + setContextActive(context, false); + } + setContextActive(modalContext, true); } - setContextActive(modalContext, true); } private class KeyShortcutHandlerRegistration implements HandlerRegistration diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/SearchResultsPresenter.java b/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/SearchResultsPresenter.java index 1f4df0ce07..6f500d05c4 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/SearchResultsPresenter.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/SearchResultsPresenter.java @@ -1057,7 +1057,10 @@ private List processSuccessfulReplacements(final List displayList = Collections.emptyList(); @@ -116,7 +87,8 @@ public TargetContentsPresenter(Provider displayProvider, EditorKeyShortcuts editorKeyShortcuts, TranslationHistoryPresenter historyPresenter, UserOptionsService userOptionsService, - SaveAsApprovedConfirmationDisplay saveAsApprovedConfirmation) + SaveAsApprovedConfirmationDisplay saveAsApprovedConfirmation, + ValidationWarningDisplay validationWarning) // @formatter:on { this.displayProvider = displayProvider; @@ -130,10 +102,12 @@ public TargetContentsPresenter(Provider displayProvider, this.historyPresenter.setCurrentValueHolder(this); this.userOptionsService = userOptionsService; this.saveAsApprovedConfirmation = saveAsApprovedConfirmation; + this.validationWarning = validationWarning; isDisplayButtons = userOptionsService.getConfigHolder().getState().isDisplayButtons(); spellCheckEnabled = userOptionsService.getConfigHolder().getState().isSpellCheckEnabled(); editorKeyShortcuts.registerKeys(this); saveAsApprovedConfirmation.setListener(this); + validationWarning.setListener(this); bindEventHandlers(); } @@ -152,13 +126,31 @@ public void savePendingChangesIfApplicable() { if (currentEditorContentHasChanged()) { - saveCurrent(ContentState.Translated); + saveCurrentIfValid(ContentState.Translated); } } - public void saveCurrent(ContentState status) + /** + * Fire TransUnitSaveEvent if there's no validation error + * + * @param status + * @return if saving is to continue by TransUnitSaveEvent listener + */ + public boolean saveCurrentIfValid(ContentState status) { - eventBus.fireEvent(new TransUnitSaveEvent(getNewTargets(), status, display.getId(), display.getVerNum(), display.getCachedTargets())); + Map> errorMessages = display.getErrorMessages(); + + if (status.isTranslated() && !errorMessages.isEmpty()) + { + validationWarning.center(display.getId(), getNewTargets(), errorMessages); + return false; + } + else + { + eventBus.fireEvent(new TransUnitSaveEvent(getNewTargets(), status, display.getId(), display.getVerNum(), + display.getCachedTargets())); + } + return true; } public boolean currentEditorContentHasChanged() @@ -192,7 +184,7 @@ public void setSelected(final TransUnitId currentTransUnitId) } display.showButtons(isDisplayButtons()); - if(!canEditTranslation()) + if (!canEditTranslation()) { display.setToMode(ViewMode.VIEW); concealDisplay(); @@ -267,9 +259,11 @@ public void saveAsApprovedAndMoveNext(TransUnitId transUnitId) } else { - currentEditorIndex = 0; - saveCurrent(ContentState.Translated); - eventBus.fireEvent(NavTransUnitEvent.NEXT_ENTRY_EVENT); + if (saveCurrentIfValid(ContentState.Translated)) + { + currentEditorIndex = 0; + eventBus.fireEvent(NavTransUnitEvent.NEXT_ENTRY_EVENT); + } } } @@ -295,7 +289,7 @@ public void checkConfirmationBeforeSave() public void saveAsFuzzy(TransUnitId transUnitId) { ensureRowSelection(transUnitId); - saveCurrent(ContentState.NeedReview); + saveCurrentIfValid(ContentState.NeedReview); } protected void moveToPreviousEntry() @@ -332,7 +326,6 @@ protected void moveToNextEntry() } } - public TransUnitId getCurrentTransUnitIdOrNull() { return currentTransUnitId; @@ -341,7 +334,8 @@ public TransUnitId getCurrentTransUnitIdOrNull() @Override public boolean isDisplayButtons() { - return userOptionsService.getConfigHolder().getState().isDisplayButtons() && !userWorkspaceContext.hasReadOnlyAccess(); + return userOptionsService.getConfigHolder().getState().isDisplayButtons() + && !userWorkspaceContext.hasReadOnlyAccess(); } @Override @@ -385,13 +379,13 @@ private void ensureRowSelection(TransUnitId transUnitId) @Override public void copySource(ToggleEditor editor, TransUnitId id) { - if(canEditTranslation()) + if (canEditTranslation()) { currentEditorIndex = editor.getIndex(); ensureRowSelection(id); editor.setTextAndValidate(sourceContentsPresenter.getSelectedSource()); editor.setFocus(); - + eventBus.fireEvent(new NotificationEvent(Severity.Info, messages.notifyCopied())); } } @@ -410,7 +404,7 @@ public List getNewTargets() } @Override - public void onUserConfigChanged(UserConfigChangeEvent event) + public void onUserConfigChanged(UserConfigChangeEvent event) { if (event.getView() != MainView.Editor) { @@ -428,7 +422,8 @@ public void onUserConfigChanged(UserConfigChangeEvent event) } } - saveAsApprovedConfirmation.setShowSaveApprovedWarning(userOptionsService.getConfigHolder().getState().isShowSaveApprovedWarning()); + saveAsApprovedConfirmation.setShowSaveApprovedWarning(userOptionsService.getConfigHolder().getState() + .isShowSaveApprovedWarning()); isDisplayButtons = displayButtons; spellCheckEnabled = isSpellCheckEnabled; } @@ -459,7 +454,7 @@ public void onDataCopy(final CopyDataToEditorEvent event) private void copyTextWhenIsEditing(List contents, boolean isInsertText) { - if(canEditTranslation()) + if (canEditTranslation()) { if (isInsertText) { @@ -503,12 +498,12 @@ public void showData(List transUnits) TargetContentsDisplay display = displayProvider.get(); display.setListener(this); display.setValueAndCreateNewEditors(transUnit); - - if(!canEditTranslation()) + + if (!canEditTranslation()) { display.setToMode(ViewMode.VIEW); } - + display.showButtons(isDisplayButtons()); builder.add(display); } @@ -536,7 +531,8 @@ public void highlightSearch(String message) */ public void updateRow(TransUnit updatedTransUnit) { - Optional contentsDisplayOptional = Finds.findDisplayById(displayList, updatedTransUnit.getId()); + Optional contentsDisplayOptional = Finds.findDisplayById(displayList, + updatedTransUnit.getId()); if (contentsDisplayOptional.isPresent()) { TargetContentsDisplay contentsDisplay = contentsDisplayOptional.get(); @@ -570,7 +566,8 @@ public void confirmSaved(TransUnit updatedTU) else { // editor is in saving state or unsaved state, we don't want to update value in editor, just the cached value. - contentsDisplay.updateCachedTargetsAndVersion(updatedTU.getTargets(), updatedTU.getVerNum(), updatedTU.getStatus()); + contentsDisplay.updateCachedTargetsAndVersion(updatedTU.getTargets(), updatedTU.getVerNum(), + updatedTU.getStatus()); } setEditingState(updatedTU.getId(), TargetContentsDisplay.EditingState.SAVED); } @@ -595,7 +592,8 @@ public void onWorkspaceContextUpdated(WorkspaceContextUpdateEvent event) { // FIXME once setting codemirror editor to readonly it won't be editable again userWorkspaceContext.setProjectActive(event.isProjectActive()); - userWorkspaceContext.getWorkspaceContext().getWorkspaceId().getProjectIterationId().setProjectType(event.getProjectType()); + userWorkspaceContext.getWorkspaceContext().getWorkspaceId().getProjectIterationId() + .setProjectType(event.getProjectType()); for (TargetContentsDisplay targetContentsDisplay : displayList) { @@ -683,7 +681,7 @@ public boolean canEditTranslation() public void acceptTranslation(TransUnitId id) { ensureRowSelection(id); - saveCurrent(ContentState.Approved); + saveCurrentIfValid(ContentState.Approved); } @Override @@ -692,12 +690,12 @@ public void rejectTranslation(TransUnitId id) ensureRowSelection(id); if (display.getCachedState() != ContentState.Rejected) { - TransUnitSaveEvent event = new TransUnitSaveEvent(getNewTargets(), ContentState.Rejected, display.getId(), display.getVerNum(), display.getCachedTargets()); + TransUnitSaveEvent event = new TransUnitSaveEvent(getNewTargets(), ContentState.Rejected, display.getId(), + display.getVerNum(), display.getCachedTargets()); eventBus.fireEvent(new CommentBeforeSaveEvent(event)); } } - public void updateCommentCount(TransUnitId id, int commentsCount) { Optional displayOptional = Finds.findDisplayById(displayList, id); @@ -713,7 +711,8 @@ public void updateCommentCount(TransUnitId id, int commentsCount) * @param currentEditorIndex current editor index * @param display current display */ - protected void setStatesForTesting(TransUnitId currentTransUnitId, int currentEditorIndex, TargetContentsDisplay display) + protected void setStatesForTesting(TransUnitId currentTransUnitId, int currentEditorIndex, + TargetContentsDisplay display) { if (!GWT.isClient()) { diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/TransUnitsTablePresenter.java b/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/TransUnitsTablePresenter.java index 790671920a..faca632e89 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/TransUnitsTablePresenter.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/TransUnitsTablePresenter.java @@ -103,7 +103,6 @@ public class TransUnitsTablePresenter extends WidgetPresenter emptyList(), Collections.emptyList()); + TransHistoryItem latest = new TransHistoryItem(updatedTransUnit.getVerNum().toString(), + updatedTransUnit.getTargets(), updatedTransUnit.getStatus(), updatedTransUnit.getLastModifiedBy(), + updatedTransUnit.getLastModifiedTime()); + translationHistoryPresenter.displayEntries(latest, Collections. emptyList(), + Collections. emptyList()); } } targetContentsPresenter.updateRow(updatedTransUnit); @@ -301,9 +307,11 @@ public void refreshRow(TransUnit updatedTransUnit, EditorClientId editorClientId // update type is web editor save or web editor save fuzzy and coming from // current user - private boolean updateFromCurrentUsersEditorSave(EditorClientId editorClientId, TransUnitUpdated.UpdateType updateType) + private boolean updateFromCurrentUsersEditorSave(EditorClientId editorClientId, + TransUnitUpdated.UpdateType updateType) { - return Objects.equal(editorClientId, translatorService.getCurrentEditorClientId()) && (updateType == TransUnitUpdated.UpdateType.WebEditorSave || updateType == TransUnitUpdated.UpdateType.WebEditorSaveFuzzy); + return Objects.equal(editorClientId, translatorService.getCurrentEditorClientId()) + && (updateType == TransUnitUpdated.UpdateType.WebEditorSave || updateType == TransUnitUpdated.UpdateType.WebEditorSaveFuzzy); } @Override diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/ValidationOptionsPresenter.java b/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/ValidationOptionsPresenter.java index a09c13e15f..9f2e493a49 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/ValidationOptionsPresenter.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/ValidationOptionsPresenter.java @@ -21,12 +21,14 @@ package org.zanata.webtrans.client.presenter; import java.util.ArrayList; +import java.util.Collections; import net.customware.gwt.presenter.client.EventBus; import net.customware.gwt.presenter.client.widget.WidgetPresenter; import org.zanata.webtrans.client.events.DocValidationResultEvent; import org.zanata.webtrans.client.events.DocValidationResultHandler; +import org.zanata.webtrans.client.events.RequestValidationEvent; import org.zanata.webtrans.client.events.RunDocValidationEvent; import org.zanata.webtrans.client.events.WorkspaceContextUpdateEvent; import org.zanata.webtrans.client.events.WorkspaceContextUpdateEventHandler; @@ -34,7 +36,8 @@ import org.zanata.webtrans.client.service.ValidationService; import org.zanata.webtrans.client.view.ValidationOptionsDisplay; import org.zanata.webtrans.shared.model.ValidationAction; -import org.zanata.webtrans.shared.model.ValidationInfo; +import org.zanata.webtrans.shared.model.ValidationDisplayRules; +import org.zanata.webtrans.shared.validation.ValidationFactory; import com.google.gwt.event.logical.shared.HasValueChangeHandlers; import com.google.gwt.event.logical.shared.ValueChangeEvent; @@ -47,18 +50,18 @@ * @author Alex Eng aeng@redhat.com * **/ -public class ValidationOptionsPresenter extends WidgetPresenter implements ValidationOptionsDisplay.Listener, WorkspaceContextUpdateEventHandler, DocValidationResultHandler +public class ValidationOptionsPresenter extends WidgetPresenter implements + ValidationOptionsDisplay.Listener, WorkspaceContextUpdateEventHandler, DocValidationResultHandler { private final ValidationService validationService; - private final WebTransMessages messages; private MainView currentView; @Inject - public ValidationOptionsPresenter(ValidationOptionsDisplay display, EventBus eventBus, final ValidationService validationService, final WebTransMessages messages) + public ValidationOptionsPresenter(ValidationOptionsDisplay display, EventBus eventBus, + final ValidationService validationService, final WebTransMessages messages) { super(display, eventBus); this.validationService = validationService; - this.messages = messages; } @Override @@ -76,12 +79,18 @@ protected void onBind() public void initDisplay() { display.clearValidationSelector(); - ArrayList validationActions = new ArrayList(validationService.getValidationMap().values()); + ArrayList validationActions = new ArrayList(validationService + .getValidationMap().values()); + + Collections.sort(validationActions, ValidationFactory.ValidationActionComparator); + for (final ValidationAction validationAction : validationActions) { - ValidationInfo validationInfo = validationAction.getValidationInfo(); + ValidationDisplayRules validationInfo = validationAction.getRules(); - HasValueChangeHandlers changeHandler = display.addValidationSelector(validationAction.getId().getDisplayName(), validationAction.getDescription(), validationInfo.isEnabled(), validationInfo.isLocked()); + HasValueChangeHandlers changeHandler = display.addValidationSelector(validationAction.getId() + .getDisplayName(), validationAction.getDescription(), validationInfo.isEnabled(), validationInfo + .isLocked()); changeHandler.addValueChangeHandler(new ValidationOptionValueChangeHandler(validationAction)); } } @@ -125,9 +134,13 @@ public void onValueChange(ValueChangeEvent event) @Override public void onWorkspaceContextUpdated(WorkspaceContextUpdateEvent event) { - validationService.setValidationRules(event.getValidationInfoList()); + validationService.setValidationRules(event.getValidationStates()); initDisplay(); + if(currentView == MainView.Editor) + { + eventBus.fireEvent(RequestValidationEvent.EVENT); + } } public void setCurrentView(MainView view) diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/resources/TableEditorMessages.java b/zanata-war/src/main/java/org/zanata/webtrans/client/resources/TableEditorMessages.java index 38d04e1e17..1ebdde7d47 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/resources/TableEditorMessages.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/resources/TableEditorMessages.java @@ -15,8 +15,8 @@ public interface TableEditorMessages extends Messages @DefaultMessage("Failed to load data from server") String notifyLoadFailed(); - @DefaultMessage("Save FAILED: {0}") - String notifyUpdateFailed(String errorMessage); + @DefaultMessage("Save FAILED: {0}, messages: {1}") + String notifyUpdateFailed(String id, String errorMessage); @DefaultMessage("Row {0} (Id {1}) Saved") String notifyUpdateSaved(int rowIndex, String id); @@ -25,11 +25,15 @@ public interface TableEditorMessages extends Messages String notifyValidationError(); // @formatter:off - @DefaultMessage("Validation Warnings: {0}") + @DefaultMessage("Warnings: {0}, Errors: {1}") @AlternateMessage({ - "one", "Validation Warnings: 1", - "=0", "Validation Warnings: none" }) - String validationWarningsHeading(@PluralCount int warningCount); + "one|one", "Warning: 1, Error: 1", + "one|other", "Warning: 1, Errors: {1}", + "other|one", "Warnings: {0}, Error: 1", + "=0|=0", "Warning: none, Error: none", + "=0|other", "Warning: none, Errors: {1}", + "other|=0", "Warnings: {0}, Error: none"}) + String validationNotificationHeading(@PluralCount int warningCount, @PluralCount int errorCount); // @formatter:on @DefaultMessage("Copy from translation memory match result no.{0}") @@ -40,7 +44,7 @@ public interface TableEditorMessages extends Messages @DefaultMessage("Move to previous row") String moveToPreviousRow(); - + @DefaultMessage("Move to next Fuzzy or Rejected") String nextDraft(); @@ -88,12 +92,15 @@ public interface TableEditorMessages extends Messages @DefaultMessage("Cancel changes") String cancelChanges(); + + @DefaultMessage("Return to editor") + String returnToEditor(); @DefaultMessage("Cancel") String cancel(); @DefaultMessage("Don''t show this warning again.") - String saveAsApprovedDialogRememberDecision(); + String dontShowThisAgain(); @DefaultMessage("Warning! Saving a ''Fuzzy'' translation as ''Translated'' without changes.") String saveAsTranslatedDialogWarning1(); @@ -115,13 +122,22 @@ public interface TableEditorMessages extends Messages @DefaultMessage("Comment") String comment(); - + @DefaultMessage("Discard Changes") String discardChanges(); - + @DefaultMessage("Cancel filter") String cancelFilter(); - + @DefaultMessage("Save changes before filtering view?") String saveChangesConfirmationMessage(); + + @DefaultMessage("You''re trying to save translation that contains validation error") + String validationErrorMessage(); + + @DefaultMessage("Translation") + String translation(); + + @DefaultMessage("Error message") + String errorMessage(); } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/resources/ValidationMessages.java b/zanata-war/src/main/java/org/zanata/webtrans/client/resources/ValidationMessages.java index dd1f2ba414..6c3b8d5c7f 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/resources/ValidationMessages.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/resources/ValidationMessages.java @@ -15,10 +15,13 @@ @Generate(format = "com.google.gwt.i18n.rebind.format.PropertiesFormat") public interface ValidationMessages extends Messages { + @DefaultMessage("Validation error - See validation message") + String notifyValidationError(); + // Newline validator @DefaultMessage("Check for consistent leading and trailing newline (\\n)") String newLineValidatorDesc(); - + @DefaultMessage("Leading newline (\\n) is missing") String leadingNewlineMissing(); @@ -31,7 +34,6 @@ public interface ValidationMessages extends Messages @DefaultMessage("Unexpected trailing newline (\\n)") String trailingNewlineAdded(); - // Tab validator @DefaultMessage("Check whether source and target have the same number of tabs") String tabValidatorDesc(); @@ -48,7 +50,6 @@ public interface ValidationMessages extends Messages @DefaultMessage("Not enough lines in translation (expected {0}, found {1})") String linesRemoved(int expected, int actual); - // Printf variables validator @DefaultMessage("Check that printf style (%x) variables are consistent") String printfVariablesValidatorDesc(); @@ -62,11 +63,10 @@ public interface ValidationMessages extends Messages @DefaultMessage("Variables have same position: {0,collection,string}") String varPositionDuplicated(Collection vars); - // Java variables validator @DefaultMessage("Check that java style ('{x}') variables are consistent") String javaVariablesValidatorDesc(); - + @Description("Lists variables that appear a different number of times between source and target strings") @DefaultMessage("Inconsistent count for variables: {0,list,string}") @AlternateMessage({ "one", "Inconsistent count for variable: {0,list,string}" }) @@ -76,15 +76,14 @@ public interface ValidationMessages extends Messages String differentApostropheCount(); @DefaultMessage("Quoted characters found in translation but not in source text. " + - "Apostrophe character ('') must be doubled ('''') to prevent quoting " + - "when it is used in Java MessageFormat strings.") + "Apostrophe character ('') must be doubled ('''') to prevent quoting " + + "when it is used in Java MessageFormat strings.") String quotedCharsAdded(); - // Shared variables validator messages @DefaultMessage("Check that positional printf style (%n$x) variables are consistent") String printfXSIExtensionValidationDesc(); - + @Description("Lists the variables that are in the original string but have not been included in the target") @DefaultMessage("Missing variables: {0,list,string}") @AlternateMessage({ "one", "Missing variable: {0,list,string}" }) @@ -105,11 +104,10 @@ public interface ValidationMessages extends Messages @AlternateMessage({ "one", "Variable not quoted: {0,list,string}" }) String varsAddedQuoted(@PluralCount List vars); - // XHM/HTML tag validator @DefaultMessage("Check that XML/HTML tags are consistent") String xmlHtmlValidatorDesc(); - + @Description("Lists the xml or html tags that are in the target but are not in the original string") @DefaultMessage("Unexpected tags: {0,list,string}") @AlternateMessage({ "one", "Unexpected tag: {0,list,string}" }) @@ -124,7 +122,6 @@ public interface ValidationMessages extends Messages @AlternateMessage({ "one", "Tag in unexpected position: {0,list,string}" }) String tagsWrongOrder(@PluralCount List tags); - //XML Entity validator @DefaultMessage("Check that XML entity are complete") String xmlEntityValidatorDesc(); diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/resources/WebTransMessages.java b/zanata-war/src/main/java/org/zanata/webtrans/client/resources/WebTransMessages.java index dafd7821ca..3dcc93f5fd 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/resources/WebTransMessages.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/resources/WebTransMessages.java @@ -1,5 +1,7 @@ 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; @@ -190,6 +192,9 @@ public interface WebTransMessages extends Messages @DefaultMessage("Successfully replaced text") String replacedTextSuccess(); + @DefaultMessage("Replace text failed in text flow {0}, error message: {1}") + String replaceTextFailureWithMessage(String id, String errorMessage); + @DefaultMessage("Replace text failed") String replaceTextFailure(); diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/service/HistoryEventHandlerService.java b/zanata-war/src/main/java/org/zanata/webtrans/client/service/HistoryEventHandlerService.java index 638bc410c9..b57ab588a0 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/service/HistoryEventHandlerService.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/service/HistoryEventHandlerService.java @@ -1,5 +1,8 @@ package org.zanata.webtrans.client.service; +import static com.google.common.base.Objects.equal; +import net.customware.gwt.presenter.client.EventBus; + import org.zanata.webtrans.client.events.BookmarkedTextFlowEvent; import org.zanata.webtrans.client.events.DocumentSelectionEvent; import org.zanata.webtrans.client.events.FilterViewEvent; @@ -14,15 +17,13 @@ import org.zanata.webtrans.shared.model.DocumentId; import org.zanata.webtrans.shared.model.DocumentInfo; import org.zanata.webtrans.shared.model.TransUnitId; + import com.allen_sauer.gwt.log.client.Log; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.inject.Inject; import com.google.inject.Singleton; -import net.customware.gwt.presenter.client.EventBus; -import static com.google.common.base.Objects.*; - /** * @author Patrick Huang pahuang@redhat.com */ @@ -164,7 +165,7 @@ protected void processMessageFilterOptions(HistoryToken token) Log.info("[gwt-history] message filter option has changed"); eventBus.fireEvent(UserConfigChangeEvent.EDITOR_CONFIG_CHANGE_EVENT); - eventBus.fireEvent(new FilterViewEvent(token.isFilterTranslated(), token.isFilterFuzzy(), token.isFilterUntranslated(), token.isFilterApproved(), token.isFilterRejected(), token.isFilterHasError(), false, configHolder.getState().getEnabledValidationIds())); + eventBus.fireEvent(new FilterViewEvent(token.isFilterTranslated(), token.isFilterFuzzy(), token.isFilterUntranslated(), token.isFilterApproved(), token.isFilterRejected(), token.isFilterHasError(), false)); } } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/service/TransUnitSaveService.java b/zanata-war/src/main/java/org/zanata/webtrans/client/service/TransUnitSaveService.java index 40c2aa13bf..42eb50f981 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/service/TransUnitSaveService.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/service/TransUnitSaveService.java @@ -21,6 +21,8 @@ package org.zanata.webtrans.client.service; +import java.util.List; + import net.customware.gwt.presenter.client.EventBus; import org.zanata.common.ContentState; @@ -47,6 +49,7 @@ import com.allen_sauer.gwt.log.client.Log; import com.google.common.base.Objects; +import com.google.common.collect.Lists; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.inject.Inject; import com.google.inject.Provider; @@ -69,7 +72,10 @@ public class TransUnitSaveService implements TransUnitSaveEventHandler, CheckSta private final SaveEventQueue queue; @Inject - public TransUnitSaveService(EventBus eventBus, CachingDispatchAsync dispatcher, Provider undoLinkProvider, DocumentListPresenter documentListPresenter, TargetContentsPresenter targetContentsPresenter, TableEditorMessages messages, NavigationService navigationService, Provider goToRowLinkProvider, SaveEventQueue queue) + public TransUnitSaveService(EventBus eventBus, CachingDispatchAsync dispatcher, Provider undoLinkProvider, + DocumentListPresenter documentListPresenter, TargetContentsPresenter targetContentsPresenter, + TableEditorMessages messages, NavigationService navigationService, Provider goToRowLinkProvider, + SaveEventQueue queue) { this.messages = messages; this.eventBus = eventBus; @@ -121,9 +127,11 @@ private void performSave(TransUnitId idToSave) targetContentsPresenter.setEditingState(idToSave, TargetContentsDisplay.EditingState.SAVING); TransUnitUpdated.UpdateType updateType = workoutUpdateType(forSaving.getStatus()); - UpdateTransUnit updateTransUnit = new UpdateTransUnit(new TransUnitUpdateRequest(idToSave, forSaving.getTargets(), forSaving.getAdjustedStatus(), forSaving.getVerNum()), updateType); + UpdateTransUnit updateTransUnit = new UpdateTransUnit(new TransUnitUpdateRequest(idToSave, + forSaving.getTargets(), forSaving.getAdjustedStatus(), forSaving.getVerNum()), updateType); Log.info("about to save translation: " + updateTransUnit); - dispatcher.execute(updateTransUnit, new UpdateTransUnitCallback(forSaving, documentListPresenter.getCurrentDocument(), idToSave)); + dispatcher.execute(updateTransUnit, + new UpdateTransUnitCallback(forSaving, documentListPresenter.getCurrentDocument(), idToSave)); } /** @@ -140,7 +148,8 @@ public void onCheckStateHasChanged(CheckStateHasChangedEvent event) } boolean targetChanged = !Objects.equal(transUnit.getTargets(), event.getTargets()); - boolean targetUnchangedButCanSaveAsApproved = (event.getAdjustedState() == ContentState.Translated) && !Objects.equal(transUnit.getStatus(), event.getAdjustedState()); + boolean targetUnchangedButCanSaveAsApproved = (event.getAdjustedState() == ContentState.Translated) + && !Objects.equal(transUnit.getStatus(), event.getAdjustedState()); if (targetChanged) { @@ -155,7 +164,7 @@ else if (targetUnchangedButCanSaveAsApproved) eventBus.fireEvent(NavTransUnitEvent.NEXT_ENTRY_EVENT); } } - + private boolean stateHasNotChanged(TransUnitSaveEvent event) { TransUnit transUnit = navigationService.getByIdOrNull(event.getTransUnitId()); @@ -163,17 +172,19 @@ private boolean stateHasNotChanged(TransUnitSaveEvent event) { return false; } - Log.info("id:" + transUnit.getId() + " old contents: " + transUnit.getTargets() + " state: " + transUnit.getStatus()); - return Objects.equal(transUnit.getStatus(), event.getAdjustedStatus()) && Objects.equal(transUnit.getTargets(), event.getTargets()); + Log.info("id:" + transUnit.getId() + " old contents: " + transUnit.getTargets() + " state: " + + transUnit.getStatus()); + return Objects.equal(transUnit.getStatus(), event.getAdjustedStatus()) + && Objects.equal(transUnit.getTargets(), event.getTargets()); } private TransUnitUpdated.UpdateType workoutUpdateType(ContentState status) { - if(status == ContentState.Approved || status == ContentState.Rejected) + if (status == ContentState.Approved || status == ContentState.Rejected) { return TransUnitUpdated.UpdateType.WebEditorSaveReview; } - else if(status == ContentState.NeedReview) + else if (status == ContentState.NeedReview) { return TransUnitUpdated.UpdateType.WebEditorSaveFuzzy; } @@ -201,7 +212,7 @@ public UpdateTransUnitCallback(TransUnitSaveEvent event, DocumentInfo docInfo, T public void onFailure(Throwable e) { Log.error("UpdateTransUnit failure ", e); - saveFailure(); + saveFailure(e.getMessage()); } @Override @@ -211,7 +222,8 @@ public void onSuccess(UpdateTransUnitResult result) Log.debug("save resulted TU: " + updatedTU.debugString()); if (result.isSingleSuccess()) { - eventBus.fireEvent(new NotificationEvent(NotificationEvent.Severity.Info, messages.notifyUpdateSaved(updatedTU.getRowIndex(), updatedTU.getId().toString()), goToRowLink)); + eventBus.fireEvent(new NotificationEvent(NotificationEvent.Severity.Info, messages.notifyUpdateSaved( + updatedTU.getRowIndex(), updatedTU.getId().toString()), goToRowLink)); int rowIndexOnPage = navigationService.findRowIndexById(updatedTU.getId()); if (rowIndexOnPage != NavigationService.UNDEFINED) { @@ -226,7 +238,7 @@ public void onSuccess(UpdateTransUnitResult result) } else { - saveFailure(); + saveFailure(result.getUpdateInfoList().get(0).getErrorMessage()); } if (queue.hasPending()) { @@ -234,11 +246,12 @@ public void onSuccess(UpdateTransUnitResult result) } } - private void saveFailure() + 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), goToRowLink)); + eventBus.fireEvent(new NotificationEvent(NotificationEvent.Severity.Error, messages.notifyUpdateFailed("id " + + id, errorMessage), goToRowLink)); } } } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/service/ValidationService.java b/zanata-war/src/main/java/org/zanata/webtrans/client/service/ValidationService.java index 08d119a3bc..3adf04061d 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/service/ValidationService.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/service/ValidationService.java @@ -32,14 +32,14 @@ import org.zanata.webtrans.client.events.RunValidationEvent; import org.zanata.webtrans.client.events.RunValidationEventHandler; import org.zanata.webtrans.client.presenter.UserConfigHolder; -import org.zanata.webtrans.client.resources.TableEditorMessages; import org.zanata.webtrans.client.resources.ValidationMessages; -import org.zanata.webtrans.client.ui.HasUpdateValidationWarning; +import org.zanata.webtrans.client.ui.HasUpdateValidationMessage; import org.zanata.webtrans.shared.model.ValidationAction; +import org.zanata.webtrans.shared.model.ValidationAction.State; import org.zanata.webtrans.shared.model.ValidationId; -import org.zanata.webtrans.shared.model.ValidationInfo; import org.zanata.webtrans.shared.validation.ValidationFactory; +import com.google.common.collect.Maps; import com.google.inject.Inject; import com.google.inject.Singleton; @@ -53,19 +53,20 @@ public class ValidationService implements RunValidationEventHandler { private final EventBus eventBus; - private final TableEditorMessages messages; - private Map validationMap; + private final ValidationMessages messages; private final ValidationFactory validationFactory; private final UserConfigHolder configHolder; + private Map validationMap = Maps.newHashMap(); @Inject - public ValidationService(final EventBus eventBus, final TableEditorMessages messages, final ValidationMessages validationMessages, final UserConfigHolder configHolder) + public ValidationService(final EventBus eventBus, final ValidationMessages validationMessages, + final UserConfigHolder configHolder) { this.eventBus = eventBus; - this.messages = messages; + this.messages = validationMessages; this.configHolder = configHolder; - - validationFactory = new ValidationFactory(validationMessages); + + validationFactory = new ValidationFactory(messages); eventBus.addHandler(RunValidationEvent.getType(), this); } @@ -78,21 +79,26 @@ public void onValidate(RunValidationEvent event) /** * Run all enabled validators against the given strings. Generates a - * {@link HasUpdateValidationWarning}, which will be empty if no warnings + * {@link HasUpdateValidationMessage}, which will be empty if no warnings * were generated by the enabled validators. */ - public void execute(String source, String target, boolean fireNotification, ArrayList widgetList) + public void execute(String source, String target, boolean fireNotification, + ArrayList widgetList) { - List errors = new ArrayList(); + Map> errors = Maps.newHashMap(); for (ValidationAction validationAction : validationMap.values()) { - if (validationAction.getValidationInfo().isEnabled()) + if (validationAction.getRules().isEnabled()) { - errors.addAll(validationAction.validate(source, target)); + List errorMessage = validationAction.validate(source, target); + if (!errorMessage.isEmpty()) + { + errors.put(validationAction, errorMessage); + } } } - fireValidationWarningsEvent(errors, fireNotification, widgetList); + updateValidationMessage(errors, fireNotification, widgetList); } /** @@ -101,11 +107,12 @@ public void execute(String source, String target, boolean fireNotification, Arra * * @param key * @param isEnabled + * @param fireRequestValidationEvent */ public void updateStatus(ValidationId key, boolean isEnabled, boolean fireRequestValidationEvent) { ValidationAction action = validationMap.get(key); - action.getValidationInfo().setEnabled(isEnabled); + action.getRules().setEnabled(isEnabled); updateConfigHolder(); @@ -121,7 +128,8 @@ public Map getValidationMap() return validationMap; } - public void fireValidationWarningsEvent(List errors, boolean fireNotification, ArrayList widgetList) + public void updateValidationMessage(Map> errors, boolean fireNotification, + ArrayList widgetList) { if (!errors.isEmpty() && fireNotification) { @@ -130,29 +138,42 @@ public void fireValidationWarningsEvent(List errors, boolean fireNotific if (widgetList != null) { - for (HasUpdateValidationWarning widget : widgetList) + for (HasUpdateValidationMessage widget : widgetList) { - widget.updateValidationWarning(errors); + widget.updateValidationMessages(errors); } } } /** - * Merge ValidationInfo from RPC result ValidationAction to all validation + * Update state of validationAction from RPC result to all validation * actions from ValidationFactory * - * @param validationInfoList + * @param validationStates */ - public void setValidationRules(Map validationInfoMap) + public void setValidationRules(Map validationStates) { - Map validationMap = validationFactory.getAllValidationActions(); - - for (Map.Entry entry : validationInfoMap.entrySet()) + validationMap.clear(); + for (Map.Entry entry : validationStates.entrySet()) { - validationMap.get(entry.getKey()).setValidationInfo(entry.getValue()); + if (!validationMap.containsKey(entry.getKey())) + { + ValidationAction action = validationFactory.getValidationAction(entry.getKey()); + action.setState(entry.getValue()); + validationMap.put(entry.getKey(), action); + + //if this rule is locked, then lock it's mutual exclusive rule as well. + if (action.getRules().isLocked()) + { + for (ValidationAction exclusiveAction : action.getExclusiveValidations()) + { + exclusiveAction.getRules().setEnabled(false); + exclusiveAction.getRules().setLocked(true); + validationMap.put(exclusiveAction.getId(), exclusiveAction); + } + } + } } - - this.validationMap = validationMap; updateConfigHolder(); } @@ -161,7 +182,7 @@ private void updateConfigHolder() ArrayList enabledValidations = new ArrayList(); for (ValidationAction valAction : getValidationMap().values()) { - if (valAction.getValidationInfo().isEnabled()) + if (valAction.getRules().isEnabled()) { enabledValidations.add(valAction.getId()); } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/ui/Editor.java b/zanata-war/src/main/java/org/zanata/webtrans/client/ui/Editor.java index 152acd2a79..21033636e1 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/ui/Editor.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/ui/Editor.java @@ -3,9 +3,11 @@ import static org.zanata.webtrans.client.view.TargetContentsDisplay.EditingState.UNSAVED; import java.util.List; +import java.util.Map; import org.zanata.webtrans.client.view.TargetContentsDisplay; import org.zanata.webtrans.shared.model.TransUnitId; +import org.zanata.webtrans.shared.model.ValidationAction; import com.allen_sauer.gwt.log.client.Log; import com.google.common.base.Objects; @@ -246,15 +248,15 @@ public void showCopySourceButton(boolean displayButtons) } @Override - public void updateValidationWarning(List errors) + public void updateValidationMessages(Map> messages) { - if (errors.isEmpty()) + if (messages.isEmpty()) { targetWrapper.removeStyleName(style.hasValidationError()); } else { - Log.info(id + " id has error: " + errors); + Log.info(id + " id has error: " + messages.values()); targetWrapper.addStyleName(style.hasValidationError()); } } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/ui/HasUpdateValidationMessage.java b/zanata-war/src/main/java/org/zanata/webtrans/client/ui/HasUpdateValidationMessage.java new file mode 100644 index 0000000000..e9cb36fe37 --- /dev/null +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/ui/HasUpdateValidationMessage.java @@ -0,0 +1,11 @@ +package org.zanata.webtrans.client.ui; + +import java.util.List; +import java.util.Map; + +import org.zanata.webtrans.shared.model.ValidationAction; + +public interface HasUpdateValidationMessage +{ + void updateValidationMessages(Map> messages); +} diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/ui/HasUpdateValidationWarning.java b/zanata-war/src/main/java/org/zanata/webtrans/client/ui/HasUpdateValidationWarning.java deleted file mode 100644 index 0b877dc820..0000000000 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/ui/HasUpdateValidationWarning.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.zanata.webtrans.client.ui; - -import java.util.List; - -public interface HasUpdateValidationWarning -{ - void updateValidationWarning(List errors); -} diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/ui/SaveAsApprovedConfirmationPanel.java b/zanata-war/src/main/java/org/zanata/webtrans/client/ui/SaveAsApprovedConfirmationPanel.java index 8cd2c6cd34..7f46a320bd 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/ui/SaveAsApprovedConfirmationPanel.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/ui/SaveAsApprovedConfirmationPanel.java @@ -59,7 +59,7 @@ public SaveAsApprovedConfirmationPanel(TableEditorMessages messages) saveAsApproved = new Button(messages.saveAsTranslated()); cancel = new Button(messages.cancel()); - rememberDecision = new CheckBox(messages.saveAsApprovedDialogRememberDecision()); + rememberDecision = new CheckBox(messages.dontShowThisAgain()); Label message = new Label(messages.saveAsTranslatedDialogWarning1()); message.addStyleName("message"); diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/ui/ShortcutContextAwareDialogBox.java b/zanata-war/src/main/java/org/zanata/webtrans/client/ui/ShortcutContextAwareDialogBox.java index f09897e18b..0b1e0bb184 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/ui/ShortcutContextAwareDialogBox.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/ui/ShortcutContextAwareDialogBox.java @@ -1,10 +1,7 @@ package org.zanata.webtrans.client.ui; -import org.zanata.webtrans.client.events.KeyShortcutEvent; -import org.zanata.webtrans.client.events.KeyShortcutEventHandler; -import org.zanata.webtrans.client.keys.KeyShortcut; -import org.zanata.webtrans.client.keys.Keys; -import org.zanata.webtrans.client.keys.ShortcutContext; +import org.zanata.webtrans.client.events.*; +import org.zanata.webtrans.client.keys.*; import org.zanata.webtrans.client.presenter.KeyShortcutPresenter; import com.google.gwt.event.dom.client.KeyCodes; import com.google.gwt.user.client.ui.DialogBox; @@ -69,7 +66,13 @@ public void hide() { super.hide(); keyShortcutPresenter.deactivateModalContext(); + } + @Override + public void center() + { + super.center(); + keyShortcutPresenter.activateModalContext(modalContext); } @Override diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/ui/ToggleEditor.java b/zanata-war/src/main/java/org/zanata/webtrans/client/ui/ToggleEditor.java index b201b538da..3e47e6e465 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/ui/ToggleEditor.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/ui/ToggleEditor.java @@ -4,7 +4,7 @@ import com.google.gwt.user.client.ui.HasText; import com.google.gwt.user.client.ui.IsWidget; -public interface ToggleEditor extends IsWidget, HasText, HasUpdateValidationWarning +public interface ToggleEditor extends IsWidget, HasText, HasUpdateValidationMessage { ViewMode getViewMode(); diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/ui/TranslationHistoryDisplay.java b/zanata-war/src/main/java/org/zanata/webtrans/client/ui/TranslationHistoryDisplay.java index 62cd30d604..a63c3416a2 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/ui/TranslationHistoryDisplay.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/ui/TranslationHistoryDisplay.java @@ -13,7 +13,6 @@ @ImplementedBy(TranslationHistoryView.class) public interface TranslationHistoryDisplay extends WidgetDisplay { - void center(); void hide(); diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/ui/ValidationMessagePanelView.java b/zanata-war/src/main/java/org/zanata/webtrans/client/ui/ValidationMessagePanelView.java index 104c2c64cd..455a6df03e 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/ui/ValidationMessagePanelView.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/ui/ValidationMessagePanelView.java @@ -17,22 +17,29 @@ package org.zanata.webtrans.client.ui; import java.util.List; +import java.util.Map; +import java.util.Map.Entry; import org.zanata.webtrans.client.resources.TableEditorMessages; +import org.zanata.webtrans.shared.model.ValidationAction; +import org.zanata.webtrans.shared.model.ValidationDisplayRules; +import com.allen_sauer.gwt.log.client.Log; +import com.google.common.collect.Maps; import com.google.gwt.core.client.GWT; import com.google.gwt.resources.client.CssResource; +import com.google.gwt.safehtml.shared.SafeHtmlBuilder; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.DisclosurePanel; +import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.Label; -import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; +import com.google.inject.Inject; -public class ValidationMessagePanelView extends Composite implements HasUpdateValidationWarning +public class ValidationMessagePanelView extends Composite implements HasUpdateValidationMessage { - private static UI uiBinder = GWT.create(UI.class); interface UI extends UiBinder @@ -41,9 +48,9 @@ interface UI extends UiBinder interface Styles extends CssResource { - String label(); + String error(); - String content(); + String warning(); String container(); @@ -54,49 +61,103 @@ interface Styles extends CssResource Label headerLabel; @UiField - VerticalPanel contents; + UnorderedListWidget contents; @UiField Styles style; - @UiField - TableEditorMessages messages; @UiField DisclosurePanel disclosurePanel; - public ValidationMessagePanelView() + private TableEditorMessages messages; + + private Map> displayMessages = Maps.newHashMap(); + + @Inject + public ValidationMessagePanelView(TableEditorMessages messages) { + this.messages = messages; initWidget(uiBinder.createAndBindUi(this)); - // this is to remove the .header class so that it won't get style from menu.css - disclosurePanel.getHeader().getParent().removeStyleName("header"); clear(); } + private boolean isErrorLocked(ValidationDisplayRules info) + { + return info.isEnabled() && info.isLocked(); + } + @Override - public void updateValidationWarning(List errors) + public void updateValidationMessages(Map> messages) { - if (errors == null || errors.isEmpty()) + if (messages == null || messages.isEmpty()) { clear(); return; } + + this.displayMessages = messages; + contents.clear(); + int warningCount = 0; + int errorCount = 0; - for (String error : errors) + for (Entry> entry : messages.entrySet()) { - Label errorLabel = new Label(error); - errorLabel.addStyleName(style.label()); - contents.add(errorLabel); + for (String message : entry.getValue()) + { + SafeHtmlBuilder builder = new SafeHtmlBuilder(); + builder.appendEscaped(message); + + HTMLPanel liElement = new HTMLPanel("li", builder.toSafeHtml().asString()); + liElement.setTitle(entry.getKey().getId().getDisplayName()); + + if (isErrorLocked(entry.getKey().getRules())) + { + liElement.addStyleName(style.error()); + errorCount++; + } + else + { + liElement.addStyleName(style.warning()); + warningCount++; + } + + contents.add(liElement); + } } - headerLabel.setText(messages.validationWarningsHeading(errors.size())); + + headerLabel.setText(this.messages.validationNotificationHeading(warningCount, errorCount)); setVisible(true); } private void clear() { + displayMessages.clear(); contents.clear(); - headerLabel.setText(messages.validationWarningsHeading(0)); + headerLabel.setText(messages.validationNotificationHeading(0, 0)); setVisible(false); } + public Map> getErrorMessages() + { + Map> errorMessages = Maps.newHashMap(); + + for (Entry> entry : displayMessages.entrySet()) + { + if (isErrorLocked(entry.getKey().getRules())) + { + errorMessages.put(entry.getKey(), entry.getValue()); + } + } + return errorMessages; + } + + public void setVisibleIfHasError(boolean visible) + { + if(!displayMessages.isEmpty()) // has error message + { + setVisible(visible); + } + setVisible(false); + } } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/ui/ValidationMessagePanelView.ui.xml b/zanata-war/src/main/java/org/zanata/webtrans/client/ui/ValidationMessagePanelView.ui.xml index 62ba1e8a3b..fbe9932333 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/ui/ValidationMessagePanelView.ui.xml +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/ui/ValidationMessagePanelView.ui.xml @@ -1,71 +1,65 @@ - - - - - .container { - width: 96%; - margin-left: 3%; - table-layout: fixed; - margin-bottom: 3px; - } - - .headerLabel - { - font-size: 11px; - font-weight: bold; - color:#FFFFFF; - } - - .label { - font-size: 11px; - color: #e0575b; - } - - .header { - text-indent: 5px; - cursor: pointer; - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; - background: #e0575b; - } - - .header tr:hover - { - background: #e0575b; - color:#FFFFFF; - text-decoration:underline; - } - - .content { - color: #e0575b; - } - - - - - - - - - - - - - - - - - - - - - - - + xmlns:g="urn:import:com.google.gwt.user.client.ui" + xmlns:z="urn:import:org.zanata.webtrans.client.ui"> + + + .container { + width: 96%; + table-layout: fixed; + margin: 0.1em 0 0.1em 0.1em; + } + + .container td { + padding-top: 0; + padding-bottom: 0; + } + + .error { + color: rgb(224, 87, 91); + } + + .warning { + color: rgb(227, 130, 78); + } + + .header { + cursor: pointer; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + background: #e3824e; + padding: 0.25em; + font-size: 0.9em; + font-weight: bold; + color: #FFFFFF; + } + + .header:hover { + text-decoration: underline; + } + + .contents { + + } + + .contents li { + border-left: 3px solid; + padding: 0.1em 0.5em; + margin: 0.15em 0; + font-size: 0.9em; + } + + + + + + + + + + + diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/ui/ValidationWarningDisplay.java b/zanata-war/src/main/java/org/zanata/webtrans/client/ui/ValidationWarningDisplay.java new file mode 100644 index 0000000000..4f2b58db24 --- /dev/null +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/ui/ValidationWarningDisplay.java @@ -0,0 +1,46 @@ +/* + * Copyright 2012, 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.webtrans.client.ui; + +import java.util.List; +import java.util.Map; + +import org.zanata.webtrans.client.view.TargetContentsDisplay; +import org.zanata.webtrans.shared.model.TransUnitId; +import org.zanata.webtrans.shared.model.ValidationAction; + +import com.google.inject.ImplementedBy; + +/** + * + * @author Alex Eng aeng@redhat.com + * + */ +@ImplementedBy(ValidationWarningPanel.class) +public interface ValidationWarningDisplay +{ + void center(TransUnitId transUnitId, List translations, Map> errorMessages); + + void hide(); + + void setListener(TargetContentsDisplay.Listener listener); +} diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/ui/ValidationWarningPanel.java b/zanata-war/src/main/java/org/zanata/webtrans/client/ui/ValidationWarningPanel.java new file mode 100644 index 0000000000..ccc0b6a608 --- /dev/null +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/ui/ValidationWarningPanel.java @@ -0,0 +1,148 @@ +/* + * Copyright 2011, 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.webtrans.client.ui; + +import java.util.List; +import java.util.Map; + +import org.zanata.webtrans.client.keys.ShortcutContext; +import org.zanata.webtrans.client.presenter.KeyShortcutPresenter; +import org.zanata.webtrans.client.resources.TableEditorMessages; +import org.zanata.webtrans.client.view.TargetContentsDisplay; +import org.zanata.webtrans.shared.model.TransUnitId; +import org.zanata.webtrans.shared.model.ValidationAction; + +import com.google.common.collect.Lists; +import com.google.gwt.core.client.GWT; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.safehtml.shared.SafeHtmlBuilder; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.ui.Button; +import com.google.gwt.user.client.ui.HTMLPanel; +import com.google.inject.Inject; + +/** + * + * @author Alex Eng aeng@redhat.com + * + **/ +public class ValidationWarningPanel extends ShortcutContextAwareDialogBox implements ValidationWarningDisplay +{ + private static ValidationWarningPanelUiBinder uiBinder = GWT.create(ValidationWarningPanelUiBinder.class); + + interface ValidationWarningPanelUiBinder extends UiBinder + { + } + + private TransUnitId transUnitId; + + private TargetContentsDisplay.Listener listener; + + @UiField + UnorderedListWidget translations; + + @UiField + UnorderedListWidget errorList; + + @UiField(provided = true) + Button returnToEditor; + + @UiField(provided = true) + Button saveAsFuzzy; + + @Inject + public ValidationWarningPanel(TableEditorMessages messages, KeyShortcutPresenter keyShortcutPresenter) + { + super(false, true, ShortcutContext.ValidationWarningPopup, keyShortcutPresenter); + + setStyleName("new-zanata"); + + returnToEditor = new Button(messages.returnToEditor()); + saveAsFuzzy = new Button(messages.saveAsFuzzy()); + + HTMLPanel container = uiBinder.createAndBindUi(this); + + setGlassEnabled(true); + setWidget(container); + hide(); + } + + public void setListener(TargetContentsDisplay.Listener listener) + { + this.listener = listener; + addListenerToButtons(); + } + + private void addListenerToButtons() + { + saveAsFuzzy.addClickHandler(new ClickHandler() + { + @Override + public void onClick(ClickEvent event) + { + hide(); + listener.saveAsFuzzy(transUnitId); + } + }); + returnToEditor.addClickHandler(new ClickHandler() + { + @Override + public void onClick(ClickEvent event) + { + hide(); + listener.setFocus(); + } + }); + } + + @Override + public void center(TransUnitId transUnitId, List targets, Map> errorMessages) + { + this.transUnitId = transUnitId; + refreshView(targets, errorMessages); + center(); + } + + private void refreshView(List targets, Map> errorMessages) + { + translations.clear(); + errorList.clear(); + + for (String target : targets) + { + SafeHtmlBuilder builder = new SafeHtmlBuilder(); + builder.append(TextContentsDisplay.asSyntaxHighlight(Lists.newArrayList(target)).toSafeHtml()); + translations.add(new HTMLPanel("li", builder.toSafeHtml().asString())); + } + + for (List messages : errorMessages.values()) + { + for (String message : messages) + { + SafeHtmlBuilder builder = new SafeHtmlBuilder(); + builder.appendEscaped(message); + errorList.add(new HTMLPanel("li", builder.toSafeHtml().asString())); + } + } + } +} diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/ui/ValidationWarningPanel.ui.xml b/zanata-war/src/main/java/org/zanata/webtrans/client/ui/ValidationWarningPanel.ui.xml new file mode 100644 index 0000000000..b1df86b458 --- /dev/null +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/ui/ValidationWarningPanel.ui.xml @@ -0,0 +1,23 @@ + + + + + + +

+ +

+ + +

+ + +
+ + or + +
+
+
diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/view/TargetContentsDisplay.java b/zanata-war/src/main/java/org/zanata/webtrans/client/view/TargetContentsDisplay.java index 440e9e54eb..f9770a3852 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/view/TargetContentsDisplay.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/view/TargetContentsDisplay.java @@ -22,19 +22,21 @@ import java.util.ArrayList; import java.util.List; +import java.util.Map; import net.customware.gwt.presenter.client.widget.WidgetDisplay; import org.zanata.common.ContentState; import org.zanata.webtrans.client.presenter.UserConfigHolder; -import org.zanata.webtrans.client.ui.HasUpdateValidationWarning; +import org.zanata.webtrans.client.ui.HasUpdateValidationMessage; import org.zanata.webtrans.client.ui.ToggleEditor; import org.zanata.webtrans.client.ui.UndoLink; import org.zanata.webtrans.shared.model.HasTransUnitId; import org.zanata.webtrans.shared.model.TransUnit; import org.zanata.webtrans.shared.model.TransUnitId; +import org.zanata.webtrans.shared.model.ValidationAction; -public interface TargetContentsDisplay extends WidgetDisplay, HasTransUnitId, HasUpdateValidationWarning, NeedsRefresh +public interface TargetContentsDisplay extends WidgetDisplay, HasTransUnitId, HasUpdateValidationMessage, NeedsRefresh { void showButtons(boolean displayButtons); @@ -106,10 +108,15 @@ interface Listener void rejectTranslation(TransUnitId id); + void setFocus(); } enum EditingState { SAVING, UNSAVED, SAVED } + + Map> getErrorMessages(); + + } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/view/TargetContentsView.java b/zanata-war/src/main/java/org/zanata/webtrans/client/view/TargetContentsView.java index 0576c4064f..a8e8d67cba 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/view/TargetContentsView.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/view/TargetContentsView.java @@ -22,6 +22,9 @@ import java.util.ArrayList; import java.util.List; +import java.util.Map; + +import net.customware.gwt.presenter.client.EventBus; import org.zanata.common.ContentState; import org.zanata.webtrans.client.events.ReviewCommentEvent; @@ -33,6 +36,7 @@ import org.zanata.webtrans.client.util.ContentStateToStyleUtil; import org.zanata.webtrans.shared.model.TransUnit; import org.zanata.webtrans.shared.model.TransUnitId; +import org.zanata.webtrans.shared.model.ValidationAction; import com.google.common.base.Objects; import com.google.common.collect.Lists; @@ -50,8 +54,6 @@ import com.google.inject.Inject; import com.google.inject.Provider; -import net.customware.gwt.presenter.client.EventBus; - public class TargetContentsView extends Composite implements TargetContentsDisplay { private static final int COLUMNS = 1; @@ -297,13 +299,13 @@ public void setToMode(ToggleEditor.ViewMode viewMode) { editor.setViewMode(viewMode); } - validationPanel.setVisible(viewMode == ToggleEditor.ViewMode.EDIT); + validationPanel.setVisibleIfHasError(viewMode == ToggleEditor.ViewMode.EDIT); } @Override - public void updateValidationWarning(List errors) + public void updateValidationMessages(Map> messages) { - validationPanel.updateValidationWarning(errors); + validationPanel.updateValidationMessages(messages); } @Override @@ -335,4 +337,10 @@ interface Styles extends CssResource interface Binder extends UiBinder { } + + @Override + public Map> getErrorMessages() + { + return validationPanel.getErrorMessages(); + } } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/view/ValidationOptionsView.ui.xml b/zanata-war/src/main/java/org/zanata/webtrans/client/view/ValidationOptionsView.ui.xml index 8be5e34b4a..062612f653 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/view/ValidationOptionsView.ui.xml +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/view/ValidationOptionsView.ui.xml @@ -18,7 +18,6 @@ .runValidationButton { - color:#000000; border-radius: 3px; width:85px; margin-top:10px; diff --git a/zanata-war/src/main/java/org/zanata/webtrans/server/TranslationWorkspaceManagerImpl.java b/zanata-war/src/main/java/org/zanata/webtrans/server/TranslationWorkspaceManagerImpl.java index 355f4ff785..e2b0298590 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/server/TranslationWorkspaceManagerImpl.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/server/TranslationWorkspaceManagerImpl.java @@ -39,8 +39,8 @@ import org.zanata.webtrans.shared.model.PersonId; import org.zanata.webtrans.shared.model.ProjectIterationId; import org.zanata.webtrans.shared.model.ValidationAction; +import org.zanata.webtrans.shared.model.ValidationAction.State; import org.zanata.webtrans.shared.model.ValidationId; -import org.zanata.webtrans.shared.model.ValidationInfo; import org.zanata.webtrans.shared.model.WorkspaceContext; import org.zanata.webtrans.shared.model.WorkspaceId; import org.zanata.webtrans.shared.rpc.ExitWorkspace; @@ -48,6 +48,7 @@ import com.google.common.collect.HashMultimap; import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Maps; import com.google.common.collect.Multimap; import com.google.common.collect.Multimaps; import com.ibm.icu.util.ULocale; @@ -165,11 +166,11 @@ public void projectUpdate(HProject project) @Observer(ProjectIterationHome.PROJECT_ITERATION_UPDATE) public void projectIterationUpdate(HProjectIteration projectIteration) { - HashMap validationInfoList = new HashMap(); + HashMap validationStates = Maps.newHashMap(); - for (ValidationAction validationAction : validationServiceImpl.getValidationObject(projectIteration)) + for (ValidationAction validationAction : validationServiceImpl.getValidationActions(projectIteration.getProject().getSlug(), projectIteration.getSlug())) { - validationInfoList.put(validationAction.getId(), validationAction.getValidationInfo()); + validationStates.put(validationAction.getId(), validationAction.getState()); } String projectSlug = projectIteration.getProject().getSlug(); @@ -182,7 +183,7 @@ public void projectIterationUpdate(HProjectIteration projectIteration) ProjectIterationId iterId = new ProjectIterationId(projectSlug, iterSlug, projectIteration.getProjectType()); for (TranslationWorkspace workspace : projIterWorkspaceMap.get(iterId)) { - WorkspaceContextUpdate event = new WorkspaceContextUpdate(isProjectActive, projectType, validationInfoList); + WorkspaceContextUpdate event = new WorkspaceContextUpdate(isProjectActive, projectType, validationStates); workspace.publish(event); } } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/server/rpc/ActivateWorkspaceHandler.java b/zanata-war/src/main/java/org/zanata/webtrans/server/rpc/ActivateWorkspaceHandler.java index 9048cd4485..2bc95f782f 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/server/rpc/ActivateWorkspaceHandler.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/server/rpc/ActivateWorkspaceHandler.java @@ -129,12 +129,12 @@ public ActivateWorkspaceResult execute(ActivateWorkspaceAction action, Execution LoadOptionsResult loadOptsRes = loadOptionsHandler.execute(new LoadOptionsAction(null), context); - GetValidationRulesResult validationResult = getValidationRulesHandler.execute(new GetValidationRulesAction(workspaceId), context); + GetValidationRulesResult validationRulesResult = getValidationRulesHandler.execute(new GetValidationRulesAction(workspaceId), context); Identity identity = new Identity(editorClientId, person); workspace.getWorkspaceContext().getWorkspaceId().getProjectIterationId().setProjectType(projectIteration.getProjectType()); UserWorkspaceContext userWorkspaceContext = new UserWorkspaceContext(workspace.getWorkspaceContext(), workspaceRestrictions); - return new ActivateWorkspaceResult(userWorkspaceContext, identity, loadOptsRes.getConfiguration(), validationResult.getValidations()); + return new ActivateWorkspaceResult(userWorkspaceContext, identity, loadOptsRes.getConfiguration(), validationRulesResult.getValidationRules()); } protected String getHttpSessionId() diff --git a/zanata-war/src/main/java/org/zanata/webtrans/server/rpc/GetTransUnitListHandler.java b/zanata-war/src/main/java/org/zanata/webtrans/server/rpc/GetTransUnitListHandler.java index 5fe96c5954..e47e34ab2f 100755 --- a/zanata-war/src/main/java/org/zanata/webtrans/server/rpc/GetTransUnitListHandler.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/server/rpc/GetTransUnitListHandler.java @@ -137,7 +137,7 @@ private List getTextFlows(GetTransUnitList action, HLocale hLocale, i // TODO debt: this is not scalable. But we may not have other choice // for validation filter. Maybe use scrollable result will help? textFlows = textFlowDAO.getAllTextFlowsByDocumentId(action.getDocumentId()); - textFlows = validationServiceImpl.filterHasErrorTexFlow(textFlows, action.getValidationIds(), hLocale.getLocaleId(), offset, action.getCount()); + textFlows = validationServiceImpl.filterHasWarningOrErrorTextFlow(textFlows, action.getValidationIds(), hLocale.getLocaleId(), offset, action.getCount()); } } // has status and phrase filter @@ -159,7 +159,7 @@ private List getTextFlows(GetTransUnitList action, HLocale hLocale, i else { textFlows = textFlowDAO.getAllTextFlowByDocumentIdWithConstraints(action.getDocumentId(), hLocale, constraints); - textFlows = validationServiceImpl.filterHasErrorTexFlow(textFlows, action.getValidationIds(), hLocale.getLocaleId(), offset, action.getCount()); + textFlows = validationServiceImpl.filterHasWarningOrErrorTextFlow(textFlows, action.getValidationIds(), hLocale.getLocaleId(), offset, action.getCount()); } } return textFlows; diff --git a/zanata-war/src/main/java/org/zanata/webtrans/server/rpc/GetValidationRulesHandler.java b/zanata-war/src/main/java/org/zanata/webtrans/server/rpc/GetValidationRulesHandler.java index 4671f13387..cad40c576b 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/server/rpc/GetValidationRulesHandler.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/server/rpc/GetValidationRulesHandler.java @@ -20,23 +20,18 @@ */ package org.zanata.webtrans.server.rpc; -import java.util.Collection; -import java.util.HashMap; +import java.util.*; -import net.customware.gwt.dispatch.server.ExecutionContext; -import net.customware.gwt.dispatch.shared.ActionException; +import net.customware.gwt.dispatch.server.*; +import net.customware.gwt.dispatch.shared.*; -import org.jboss.seam.ScopeType; -import org.jboss.seam.annotations.In; -import org.jboss.seam.annotations.Name; -import org.jboss.seam.annotations.Scope; -import org.zanata.service.ValidationService; -import org.zanata.webtrans.server.ActionHandlerFor; -import org.zanata.webtrans.shared.model.ValidationAction; -import org.zanata.webtrans.shared.model.ValidationId; -import org.zanata.webtrans.shared.model.ValidationInfo; -import org.zanata.webtrans.shared.rpc.GetValidationRulesAction; -import org.zanata.webtrans.shared.rpc.GetValidationRulesResult; +import org.jboss.seam.*; +import org.jboss.seam.annotations.*; +import org.zanata.service.*; +import org.zanata.webtrans.server.*; +import org.zanata.webtrans.shared.model.*; +import org.zanata.webtrans.shared.model.ValidationAction.*; +import org.zanata.webtrans.shared.rpc.*; /** * @@ -48,26 +43,30 @@ @Scope(ScopeType.STATELESS) public class GetValidationRulesHandler extends AbstractActionHandler { - @In private ValidationService validationServiceImpl; @Override - public GetValidationRulesResult execute(GetValidationRulesAction action, ExecutionContext context) throws ActionException + public GetValidationRulesResult execute(GetValidationRulesAction action, ExecutionContext context) + throws ActionException { - Collection validationActionList = validationServiceImpl.getValidationAction(action.getWorkspaceId().getProjectIterationId().getProjectSlug(), action.getWorkspaceId().getProjectIterationId().getIterationSlug()); - HashMap result = new HashMap(); + ProjectIterationId version = action.getWorkspaceId().getProjectIterationId(); + Collection validationActionList = validationServiceImpl.getValidationActions(version.getProjectSlug(), + version.getIterationSlug()); + + HashMap result = new HashMap(); for (ValidationAction validationAction : validationActionList) { - result.put(validationAction.getId(), validationAction.getValidationInfo()); + result.put(validationAction.getId(), validationAction.getState()); } return new GetValidationRulesResult(result); } @Override - public void rollback(GetValidationRulesAction action, GetValidationRulesResult result, ExecutionContext context) throws ActionException + public void rollback(GetValidationRulesAction action, GetValidationRulesResult result, ExecutionContext context) + throws ActionException { } } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/server/rpc/RevertTransUnitUpdatesHandler.java b/zanata-war/src/main/java/org/zanata/webtrans/server/rpc/RevertTransUnitUpdatesHandler.java index d4a47ef200..84e546819e 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/server/rpc/RevertTransUnitUpdatesHandler.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/server/rpc/RevertTransUnitUpdatesHandler.java @@ -20,30 +20,19 @@ */ package org.zanata.webtrans.server.rpc; -import java.util.List; +import java.util.*; -import net.customware.gwt.dispatch.server.ExecutionContext; -import net.customware.gwt.dispatch.shared.ActionException; +import org.jboss.seam.*; +import org.jboss.seam.annotations.*; +import org.zanata.model.*; +import org.zanata.service.*; +import org.zanata.service.TranslationService.*; +import org.zanata.webtrans.server.*; +import org.zanata.webtrans.shared.rpc.*; +import org.zanata.webtrans.shared.rpc.TransUnitUpdated.*; -import org.jboss.seam.ScopeType; -import org.jboss.seam.annotations.In; -import org.jboss.seam.annotations.Name; -import org.jboss.seam.annotations.Scope; -import org.zanata.model.HLocale; -import org.zanata.model.HTextFlow; -import org.zanata.model.HTextFlowTarget; -import org.zanata.service.SecurityService; -import org.zanata.service.TranslationService; -import org.zanata.service.TranslationService.TranslationResult; -import org.zanata.webtrans.server.ActionHandlerFor; -import org.zanata.webtrans.server.TranslationWorkspace; -import org.zanata.webtrans.shared.model.DocumentId; -import org.zanata.webtrans.shared.model.TransUnit; -import org.zanata.webtrans.shared.model.TransUnitUpdateInfo; -import org.zanata.webtrans.shared.rpc.RevertTransUnitUpdates; -import org.zanata.webtrans.shared.rpc.TransUnitUpdated; -import org.zanata.webtrans.shared.rpc.TransUnitUpdated.UpdateType; -import org.zanata.webtrans.shared.rpc.UpdateTransUnitResult; +import net.customware.gwt.dispatch.server.*; +import net.customware.gwt.dispatch.shared.*; /** * @author David Mason, damason@redhat.com @@ -58,38 +47,29 @@ public class RevertTransUnitUpdatesHandler extends AbstractActionHandler revertResults = translationServiceImpl.revertTranslations(hLocale.getLocaleId(), action.getUpdatesToRevert()); - - UpdateTransUnitResult results = new UpdateTransUnitResult(); - for (TranslationResult translationResult : revertResults) - { - HTextFlowTarget newTarget = translationResult.getTranslatedTextFlowTarget(); - HTextFlow hTextFlow = newTarget.getTextFlow(); - int wordCount = hTextFlow.getWordCount().intValue(); - TransUnit tu = transUnitTransformer.transform(hTextFlow, newTarget.getLocale()); - TransUnitUpdateInfo updateInfo = new TransUnitUpdateInfo(translationResult.isTranslationSuccessful(), translationResult.isTargetChanged(), new DocumentId(hTextFlow.getDocument().getId(), hTextFlow.getDocument().getDocId()), tu, wordCount, translationResult.getBaseVersionNum(), translationResult.getBaseContentState()); + List revertResults = translationServiceImpl.revertTranslations(hLocale.getLocaleId(), + action.getUpdatesToRevert()); - workspace.publish(new TransUnitUpdated(updateInfo, action.getEditorClientId(), UpdateType.Revert)); - results.addUpdateResult(updateInfo); - } - return results; + return transUnitUpdateHelper.generateUpdateTransUnitResult(revertResults, action.getEditorClientId(), UpdateType.Revert, workspace); } @Override - public void rollback(RevertTransUnitUpdates action, UpdateTransUnitResult result, ExecutionContext context) throws ActionException + public void rollback(RevertTransUnitUpdates action, UpdateTransUnitResult result, ExecutionContext context) + throws ActionException { } } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/server/rpc/TransUnitUpdateHelper.java b/zanata-war/src/main/java/org/zanata/webtrans/server/rpc/TransUnitUpdateHelper.java new file mode 100644 index 0000000000..46d8c48107 --- /dev/null +++ b/zanata-war/src/main/java/org/zanata/webtrans/server/rpc/TransUnitUpdateHelper.java @@ -0,0 +1,77 @@ +/* + * + * * Copyright 2013, 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.webtrans.server.rpc; + +import java.util.*; + +import org.jboss.seam.*; +import org.jboss.seam.annotations.*; +import org.zanata.model.*; +import org.zanata.service.*; +import org.zanata.webtrans.server.*; +import org.zanata.webtrans.shared.auth.*; +import org.zanata.webtrans.shared.model.*; +import org.zanata.webtrans.shared.rpc.*; + +/** + * @author Alex Eng aeng@redhat.com + */ +@Name("webtrans.gwt.TransUnitUpdateHelper") +@Scope(ScopeType.STATELESS) +public class TransUnitUpdateHelper +{ + @In + private TransUnitTransformer transUnitTransformer; + + public UpdateTransUnitResult generateUpdateTransUnitResult(List translationResults, + EditorClientId editorClientId, + TransUnitUpdated.UpdateType updateType, TranslationWorkspace workspace) + { + UpdateTransUnitResult result = new UpdateTransUnitResult(); + + for (TranslationService.TranslationResult translationResult : translationResults) + { + HTextFlowTarget newTarget = translationResult.getTranslatedTextFlowTarget(); + HTextFlow hTextFlow = newTarget.getTextFlow(); + int wordCount = hTextFlow.getWordCount().intValue(); + TransUnit tu = transUnitTransformer.transform(hTextFlow, newTarget.getLocale()); + TransUnitUpdateInfo updateInfo = build(translationResult, new DocumentId(hTextFlow.getDocument().getId(), hTextFlow + .getDocument().getDocId()), tu, wordCount); + + workspace.publish(new TransUnitUpdated(updateInfo, editorClientId, updateType)); + + result.addUpdateResult(updateInfo); + } + return result; + } + + private TransUnitUpdateInfo build(TranslationService.TranslationResult translationResult, DocumentId documentId, + TransUnit transUnit, + int wordCount) + { + return new TransUnitUpdateInfo(translationResult.isTranslationSuccessful(), + translationResult.isTargetChanged(), documentId, transUnit, wordCount, translationResult.getBaseVersionNum(), + translationResult.getBaseContentState(), translationResult.getErrorMessage()); + } +} diff --git a/zanata-war/src/main/java/org/zanata/webtrans/server/rpc/UpdateTransUnitHandler.java b/zanata-war/src/main/java/org/zanata/webtrans/server/rpc/UpdateTransUnitHandler.java index f925d77750..3095067efa 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/server/rpc/UpdateTransUnitHandler.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/server/rpc/UpdateTransUnitHandler.java @@ -20,55 +20,43 @@ */ package org.zanata.webtrans.server.rpc; -import java.util.List; - -import net.customware.gwt.dispatch.server.ExecutionContext; -import net.customware.gwt.dispatch.shared.ActionException; - -import org.jboss.seam.ScopeType; -import org.jboss.seam.annotations.In; -import org.jboss.seam.annotations.Name; -import org.jboss.seam.annotations.Scope; -import org.zanata.common.LocaleId; -import org.zanata.model.HLocale; -import org.zanata.model.HTextFlow; -import org.zanata.model.HTextFlowTarget; -import org.zanata.service.SecurityService; -import org.zanata.service.TranslationService; -import org.zanata.service.TranslationService.TranslationResult; -import org.zanata.webtrans.server.ActionHandlerFor; -import org.zanata.webtrans.server.TranslationWorkspace; -import org.zanata.webtrans.shared.auth.EditorClientId; -import org.zanata.webtrans.shared.model.DocumentId; -import org.zanata.webtrans.shared.model.TransUnit; -import org.zanata.webtrans.shared.model.TransUnitUpdateInfo; -import org.zanata.webtrans.shared.model.TransUnitUpdateRequest; -import org.zanata.webtrans.shared.rpc.TransUnitUpdated; -import org.zanata.webtrans.shared.rpc.TransUnitUpdated.UpdateType; -import org.zanata.webtrans.shared.rpc.UpdateTransUnit; -import org.zanata.webtrans.shared.rpc.UpdateTransUnitResult; - +import java.util.*; + +import org.jboss.seam.*; +import org.jboss.seam.annotations.*; +import org.zanata.common.*; +import org.zanata.model.*; +import org.zanata.service.*; +import org.zanata.service.TranslationService.*; +import org.zanata.webtrans.server.*; +import org.zanata.webtrans.shared.auth.*; +import org.zanata.webtrans.shared.model.*; +import org.zanata.webtrans.shared.rpc.*; +import org.zanata.webtrans.shared.rpc.TransUnitUpdated.*; + +import net.customware.gwt.dispatch.server.*; +import net.customware.gwt.dispatch.shared.*; @Name("webtrans.gwt.UpdateTransUnitHandler") @Scope(ScopeType.STATELESS) @ActionHandlerFor(UpdateTransUnit.class) public class UpdateTransUnitHandler extends AbstractActionHandler { - @In - TransUnitTransformer transUnitTransformer; + @In(value = "webtrans.gwt.TransUnitUpdateHelper", create = true) + private TransUnitUpdateHelper transUnitUpdateHelper; @In - TranslationService translationServiceImpl; + private TranslationService translationServiceImpl; @In - SecurityService securityServiceImpl; + private SecurityService securityServiceImpl; @Override public UpdateTransUnitResult execute(UpdateTransUnit action, ExecutionContext context) throws ActionException { SecurityService.SecurityCheckResult securityCheckResult; - if(action.getUpdateType() == UpdateType.WebEditorSaveReview) + if (action.getUpdateType() == UpdateType.WebEditorSaveReview) { securityCheckResult = securityServiceImpl.checkPermission(action, SecurityService.TranslationAction.REVIEW); } @@ -80,30 +68,21 @@ public UpdateTransUnitResult execute(UpdateTransUnit action, ExecutionContext co HLocale hLocale = securityCheckResult.getLocale(); TranslationWorkspace workspace = securityCheckResult.getWorkspace(); - return doTranslation(hLocale.getLocaleId(), workspace, action.getUpdateRequests(), action.getEditorClientId(), action.getUpdateType()); + return doTranslation(hLocale.getLocaleId(), workspace, action.getUpdateRequests(), action.getEditorClientId(), + action.getUpdateType()); } - protected UpdateTransUnitResult doTranslation(LocaleId localeId, TranslationWorkspace workspace, List updateRequests, EditorClientId editorClientId, TransUnitUpdated.UpdateType updateType) + protected UpdateTransUnitResult doTranslation(LocaleId localeId, TranslationWorkspace workspace, + List updateRequests, EditorClientId editorClientId, + TransUnitUpdated.UpdateType updateType) { - UpdateTransUnitResult result = new UpdateTransUnitResult(); List translationResults = translationServiceImpl.translate(localeId, updateRequests); - for (TranslationResult translationResult : translationResults) - { - HTextFlowTarget newTarget = translationResult.getTranslatedTextFlowTarget(); - HTextFlow hTextFlow = newTarget.getTextFlow(); - int wordCount = hTextFlow.getWordCount().intValue(); - TransUnit tu = transUnitTransformer.transform(hTextFlow, newTarget.getLocale()); - TransUnitUpdateInfo updateInfo = new TransUnitUpdateInfo(translationResult.isTranslationSuccessful(), translationResult.isTargetChanged(), new DocumentId(hTextFlow.getDocument().getId(), hTextFlow.getDocument().getDocId()), tu, wordCount, translationResult.getBaseVersionNum(), translationResult.getBaseContentState()); - workspace.publish(new TransUnitUpdated(updateInfo, editorClientId, updateType)); - - result.addUpdateResult(updateInfo); - } - - return result; + return transUnitUpdateHelper.generateUpdateTransUnitResult(translationResults, editorClientId, updateType, workspace); } @Override - public void rollback(UpdateTransUnit action, UpdateTransUnitResult result, ExecutionContext context) throws ActionException + public void rollback(UpdateTransUnit action, UpdateTransUnitResult result, ExecutionContext context) + throws ActionException { // TODO implement rollback by checking result for success // if success, looking up base revision from action and set values back to that @@ -113,5 +92,4 @@ public void rollback(UpdateTransUnit action, UpdateTransUnitResult result, Execu // this should just use calls to a service to replace with previous version // by version num (fail if previousVersion != latestVersion-1) } - -} \ No newline at end of file +} diff --git a/zanata-war/src/main/java/org/zanata/webtrans/shared/model/TransUnitUpdateInfo.java b/zanata-war/src/main/java/org/zanata/webtrans/shared/model/TransUnitUpdateInfo.java index da5342487f..3a127d7c80 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/shared/model/TransUnitUpdateInfo.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/shared/model/TransUnitUpdateInfo.java @@ -21,10 +21,10 @@ package org.zanata.webtrans.shared.model; -import org.zanata.common.ContentState; +import org.zanata.common.*; -import com.google.common.base.Objects; -import com.google.gwt.user.client.rpc.IsSerializable; +import com.google.common.base.*; +import com.google.gwt.user.client.rpc.*; /** * Represents information about an attempted update of a {@link TransUnit}. @@ -41,6 +41,7 @@ public class TransUnitUpdateInfo implements IsSerializable private int sourceWordCount; private int previousVersionNum; private ContentState previousState; + private String errorMessage; // required for GWT rpc serialization @SuppressWarnings("unused") @@ -48,7 +49,8 @@ private TransUnitUpdateInfo() { } - public TransUnitUpdateInfo(boolean success, boolean targetChanged, DocumentId documentId, TransUnit transUnit, int sourceWordCount, int previousVersionNum, ContentState previousState) + public TransUnitUpdateInfo(boolean success, boolean targetChanged, DocumentId documentId, TransUnit transUnit, + int sourceWordCount, int previousVersionNum, ContentState previousState, String errorMessage) { this.success = success; this.targetChanged = targetChanged; @@ -57,12 +59,19 @@ public TransUnitUpdateInfo(boolean success, boolean targetChanged, DocumentId do this.sourceWordCount = sourceWordCount; this.previousVersionNum = previousVersionNum; this.previousState = previousState; + this.errorMessage = errorMessage; + } + + public TransUnitUpdateInfo(boolean success, boolean targetChanged, DocumentId documentId, TransUnit transUnit, + int sourceWordCount, int previousVersionNum, ContentState previousState) + { + this(success, targetChanged, documentId, transUnit, sourceWordCount, previousVersionNum, previousState, null); } public boolean isSuccess() { // TODO could do this -// return transUnit.getVerNum() > previousVersionNum; + // return transUnit.getVerNum() > previousVersionNum; return success; } @@ -96,6 +105,11 @@ public int getSourceWordCount() return sourceWordCount; } + public String getErrorMessage() + { + return errorMessage; + } + @Override public String toString() { @@ -107,6 +121,7 @@ public String toString() add("sourceWordCount", sourceWordCount). add("previousVersionNum", previousVersionNum). add("previousState", previousState). + add("errorMessage", errorMessage). toString(); // @formatter:on } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/shared/model/ValidationAction.java b/zanata-war/src/main/java/org/zanata/webtrans/shared/model/ValidationAction.java index a5a7a8a612..556074fe36 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/shared/model/ValidationAction.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/shared/model/ValidationAction.java @@ -38,11 +38,18 @@ public interface ValidationAction void mutuallyExclusive(ValidationAction[] exclusiveValidations); - ValidationInfo getValidationInfo(); - - void setValidationInfo(ValidationInfo actionInfo); + ValidationDisplayRules getRules(); ValidationId getId(); String getDescription(); + + State getState(); + + void setState(State state); + + public static enum State + { + Off, Warning, Error; + } } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/shared/model/ValidationDisplayRules.java b/zanata-war/src/main/java/org/zanata/webtrans/shared/model/ValidationDisplayRules.java new file mode 100644 index 0000000000..19f1c7a43b --- /dev/null +++ b/zanata-war/src/main/java/org/zanata/webtrans/shared/model/ValidationDisplayRules.java @@ -0,0 +1,72 @@ +package org.zanata.webtrans.shared.model; + +import org.zanata.webtrans.shared.model.ValidationAction.State; + +import com.google.gwt.user.client.rpc.IsSerializable; + +/** + * Holds display rules of this validation according to the state + * + * @author Alex Eng aeng@redhat.com + * + */ +public class ValidationDisplayRules implements IsSerializable +{ + private boolean enabled; + private boolean locked; + + @SuppressWarnings("unused") + private ValidationDisplayRules() + { + } + + public ValidationDisplayRules(State state) + { + updateRules(state); + } + + public boolean isEnabled() + { + return enabled; + } + + public void setEnabled(boolean enabled) + { + this.enabled = enabled; + } + + public boolean isLocked() + { + return locked; + } + + public void setLocked(boolean locked) + { + this.locked = locked; + } + + /** + * Update validation state + * Off : enabled = false, locked = false; + * Warning : enabled = true, locked = false; + * Error : enabled = true, locked = true; + */ + public void updateRules(State state) + { + if (state == State.Off) + { + enabled = false; + locked = false; + } + else if (state == State.Warning) + { + enabled = true; + locked = false; + } + else if (state == State.Error) + { + enabled = true; + locked = true; + } + } +} diff --git a/zanata-war/src/main/java/org/zanata/webtrans/shared/model/ValidationInfo.java b/zanata-war/src/main/java/org/zanata/webtrans/shared/model/ValidationInfo.java deleted file mode 100644 index 398a621ef4..0000000000 --- a/zanata-war/src/main/java/org/zanata/webtrans/shared/model/ValidationInfo.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.zanata.webtrans.shared.model; - -import com.google.gwt.user.client.rpc.IsSerializable; - -/** - * - * @author Alex Eng aeng@redhat.com - * - */ -public class ValidationInfo implements IsSerializable -{ - private boolean enabled; - private boolean locked; - - @SuppressWarnings("unused") - private ValidationInfo() - { - } - - public ValidationInfo(boolean enabled) - { - this.enabled = enabled; - } - - public boolean isEnabled() - { - return enabled; - } - - public void setEnabled(boolean enabled) - { - this.enabled = enabled; - } - - public boolean isLocked() - { - return locked; - } - - public void setLocked(boolean locked) - { - this.locked = locked; - } - -} diff --git a/zanata-war/src/main/java/org/zanata/webtrans/shared/rpc/ActivateWorkspaceResult.java b/zanata-war/src/main/java/org/zanata/webtrans/shared/rpc/ActivateWorkspaceResult.java index 42c91ee2fd..6ca5431d47 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/shared/rpc/ActivateWorkspaceResult.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/shared/rpc/ActivateWorkspaceResult.java @@ -5,8 +5,8 @@ import org.zanata.webtrans.client.presenter.UserConfigHolder; import org.zanata.webtrans.shared.auth.Identity; import org.zanata.webtrans.shared.model.UserWorkspaceContext; +import org.zanata.webtrans.shared.model.ValidationAction.State; import org.zanata.webtrans.shared.model.ValidationId; -import org.zanata.webtrans.shared.model.ValidationInfo; public class ActivateWorkspaceResult implements DispatchResult @@ -17,7 +17,7 @@ public class ActivateWorkspaceResult implements DispatchResult private UserWorkspaceContext userWorkspaceContext; private Identity identity; private UserConfigHolder.ConfigurationState storedUserConfiguration; - private Map validations; + private Map validationStates; @SuppressWarnings("unused") private ActivateWorkspaceResult() @@ -26,12 +26,12 @@ private ActivateWorkspaceResult() public ActivateWorkspaceResult(UserWorkspaceContext userWorkspaceContext, Identity identity, - UserConfigHolder.ConfigurationState storedUserConfiguration, Map validations) + UserConfigHolder.ConfigurationState storedUserConfiguration, Map validationStates) { this.userWorkspaceContext = userWorkspaceContext; this.identity = identity; this.storedUserConfiguration = storedUserConfiguration; - this.validations = validations; + this.validationStates = validationStates; } public UserWorkspaceContext getUserWorkspaceContext() @@ -49,8 +49,8 @@ public UserConfigHolder.ConfigurationState getStoredUserConfiguration() return storedUserConfiguration; } - public Map getValidations() + public Map getValidationStates() { - return validations; + return validationStates; } } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/shared/rpc/GetValidationRulesResult.java b/zanata-war/src/main/java/org/zanata/webtrans/shared/rpc/GetValidationRulesResult.java index 7b2496a7dc..9123040de6 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/shared/rpc/GetValidationRulesResult.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/shared/rpc/GetValidationRulesResult.java @@ -2,30 +2,28 @@ import java.util.Map; +import org.zanata.webtrans.shared.model.ValidationAction.State; import org.zanata.webtrans.shared.model.ValidationId; -import org.zanata.webtrans.shared.model.ValidationInfo; - - public class GetValidationRulesResult implements DispatchResult { private static final long serialVersionUID = 1L; - private Map validations; + private Map validationRules; @SuppressWarnings("unused") private GetValidationRulesResult() { } - public GetValidationRulesResult(Map validations) + public GetValidationRulesResult(Map validations) { - this.validations = validations; + this.validationRules = validations; } - public Map getValidations() + public Map getValidationRules() { - return validations; + return validationRules; } } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/shared/rpc/HasWorkspaceContextUpdateData.java b/zanata-war/src/main/java/org/zanata/webtrans/shared/rpc/HasWorkspaceContextUpdateData.java index a686ae8d19..a0ca750a59 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/shared/rpc/HasWorkspaceContextUpdateData.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/shared/rpc/HasWorkspaceContextUpdateData.java @@ -3,8 +3,8 @@ import java.util.Map; import org.zanata.common.ProjectType; +import org.zanata.webtrans.shared.model.ValidationAction.State; import org.zanata.webtrans.shared.model.ValidationId; -import org.zanata.webtrans.shared.model.ValidationInfo; public interface HasWorkspaceContextUpdateData { @@ -12,5 +12,5 @@ public interface HasWorkspaceContextUpdateData ProjectType getProjectType(); - Map getValidationInfoList(); + Map getValidationStates(); } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/shared/rpc/WorkspaceContextUpdate.java b/zanata-war/src/main/java/org/zanata/webtrans/shared/rpc/WorkspaceContextUpdate.java index d1b3535920..e0c4382e6d 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/shared/rpc/WorkspaceContextUpdate.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/shared/rpc/WorkspaceContextUpdate.java @@ -3,8 +3,8 @@ import java.util.Map; import org.zanata.common.ProjectType; +import org.zanata.webtrans.shared.model.ValidationAction.State; import org.zanata.webtrans.shared.model.ValidationId; -import org.zanata.webtrans.shared.model.ValidationInfo; public class WorkspaceContextUpdate implements SessionEventData, HasWorkspaceContextUpdateData @@ -14,18 +14,18 @@ public class WorkspaceContextUpdate implements SessionEventData, HasWorkspaceCon private boolean isProjectActive; private ProjectType projectType; - private Map validationInfoList; + private Map validationStates; @SuppressWarnings("unused") private WorkspaceContextUpdate() { } - public WorkspaceContextUpdate(boolean isProjectActive, ProjectType projectType, Map validationInfoList) + public WorkspaceContextUpdate(boolean isProjectActive, ProjectType projectType, Map validationStates) { this.isProjectActive = isProjectActive; this.projectType = projectType; - this.validationInfoList = validationInfoList; + this.validationStates = validationStates; } @Override @@ -41,9 +41,9 @@ public ProjectType getProjectType() } @Override - public Map getValidationInfoList() + public Map getValidationStates() { - return validationInfoList; + return validationStates; } } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/shared/validation/AbstractValidationAction.java b/zanata-war/src/main/java/org/zanata/webtrans/shared/validation/AbstractValidationAction.java index f70d1aaad0..96bcd2fba6 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/shared/validation/AbstractValidationAction.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/shared/validation/AbstractValidationAction.java @@ -26,7 +26,7 @@ import org.zanata.webtrans.client.resources.ValidationMessages; import org.zanata.webtrans.shared.model.ValidationAction; import org.zanata.webtrans.shared.model.ValidationId; -import org.zanata.webtrans.shared.model.ValidationInfo; +import org.zanata.webtrans.shared.model.ValidationDisplayRules; import org.zanata.webtrans.shared.validation.action.HtmlXmlTagValidation; import org.zanata.webtrans.shared.validation.action.JavaVariablesValidation; import org.zanata.webtrans.shared.validation.action.NewlineLeadTrailValidation; @@ -55,32 +55,33 @@ public abstract class AbstractValidationAction implements ValidationAction private ValidationId id; private String description; - private ValidationInfo validationInfo; + private ValidationDisplayRules displayRules; - private ArrayList exclusiveValidations = new ArrayList(); + private ArrayList exclusiveValidations = Lists.newArrayList(); private ValidationMessages validationMessages; + + private State state = State.Warning; - public AbstractValidationAction(ValidationId id, String description, ValidationInfo validationInfo, ValidationMessages validationMessages) + public AbstractValidationAction(ValidationId id, String description, ValidationMessages validationMessages) { this.id = id; this.description = description; - this.validationInfo = validationInfo; + this.displayRules = new ValidationDisplayRules(state); this.validationMessages = validationMessages; } @Override public List validate(String source, String target) { - ArrayList errorList = new ArrayList(); if (!Strings.isNullOrEmpty(target) && !Strings.isNullOrEmpty(source)) { - doValidate(errorList, source, target); + return doValidate(source, target); } - return errorList; + return Lists.newArrayList(); } - protected abstract void doValidate(ArrayList errorList, String source, String target); + protected abstract List doValidate(String source, String target); @Override @@ -101,15 +102,9 @@ protected ValidationMessages getMessages() } @Override - public void setValidationInfo(ValidationInfo validationInfo) + public ValidationDisplayRules getRules() { - this.validationInfo = validationInfo; - } - - @Override - public ValidationInfo getValidationInfo() - { - return validationInfo; + return displayRules; } @Override @@ -123,6 +118,19 @@ public String getDescription() { return description; } + + @Override + public State getState() + { + return state; + } + + @Override + public void setState(State state) + { + this.state = state; + displayRules.updateRules(state); + } } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/shared/validation/ValidationFactory.java b/zanata-war/src/main/java/org/zanata/webtrans/shared/validation/ValidationFactory.java index 5be0f7642a..ffdecd7d09 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/shared/validation/ValidationFactory.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/shared/validation/ValidationFactory.java @@ -3,14 +3,10 @@ */ package org.zanata.webtrans.shared.validation; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; - +import com.google.common.collect.Maps; import org.zanata.webtrans.client.resources.ValidationMessages; import org.zanata.webtrans.shared.model.ValidationAction; +import org.zanata.webtrans.shared.model.ValidationAction.State; import org.zanata.webtrans.shared.model.ValidationId; import org.zanata.webtrans.shared.validation.action.HtmlXmlTagValidation; import org.zanata.webtrans.shared.validation.action.JavaVariablesValidation; @@ -20,106 +16,74 @@ import org.zanata.webtrans.shared.validation.action.TabValidation; import org.zanata.webtrans.shared.validation.action.XmlEntityValidation; +import java.util.Comparator; +import java.util.Map; /** * Validation Factory - provides list of available validation rules to run on server or client. - * IMPORTANT: Run ValidationFactory.init(ValidationMessageResolver) to initialize * * @author Alex Eng aeng@redhat.com - * */ -public class ValidationFactory +public final class ValidationFactory { - private static Map VALIDATION_MAP = new TreeMap(); + private final ValidationMessages validationMessages; + + private final Map referenceMap; - public static Comparator ValidationIdComparator = new Comparator() + public static final Comparator ValidationActionComparator = new Comparator() { @Override - public int compare(ValidationId o1, ValidationId o2) + public int compare(ValidationAction o1, ValidationAction o2) { - return o1.getDisplayName().compareTo(o2.getDisplayName()); + return o1.getId().getDisplayName().compareTo(o2.getId().getDisplayName()); } }; public ValidationFactory(ValidationMessages validationMessages) { - if (validationMessages != null) - { - initValidationMap(validationMessages); - } - else - { - initValidationMap(); - } + this.validationMessages = validationMessages; + referenceMap = generateActions(); } /** - * Generate sorted list of all Validation Actions with enabled = false - * - * Used in client side (ValidationAction) + * Generate all Validation Actions with default states(Warning) * * @return Map */ public Map getAllValidationActions() { - return VALIDATION_MAP; + return generateActions(); } public ValidationAction getValidationAction(ValidationId id) { - return VALIDATION_MAP.get(id); - } - - public List getValidationActions(List validationIds) - { - List actions = new ArrayList(); - for(ValidationId valId: validationIds) - { - actions.add(getValidationAction(valId)); - } - return actions; + return referenceMap.get(id); } - private void initValidationMap(ValidationMessages validationMessages) + private Map generateActions() { - VALIDATION_MAP.clear(); + Map validationMap = Maps.newHashMap(); - VALIDATION_MAP.put(ValidationId.HTML_XML, new HtmlXmlTagValidation(ValidationId.HTML_XML, validationMessages)); - VALIDATION_MAP.put(ValidationId.NEW_LINE, new NewlineLeadTrailValidation(ValidationId.NEW_LINE, validationMessages)); - VALIDATION_MAP.put(ValidationId.TAB, new TabValidation(ValidationId.TAB, validationMessages)); + validationMap.put(ValidationId.HTML_XML, new HtmlXmlTagValidation(ValidationId.HTML_XML, validationMessages)); + validationMap.put(ValidationId.JAVA_VARIABLES, new JavaVariablesValidation(ValidationId.JAVA_VARIABLES, + validationMessages)); + validationMap.put(ValidationId.NEW_LINE, new NewlineLeadTrailValidation(ValidationId.NEW_LINE, + validationMessages)); - VALIDATION_MAP.put(ValidationId.JAVA_VARIABLES, new JavaVariablesValidation(ValidationId.JAVA_VARIABLES, validationMessages)); - VALIDATION_MAP.put(ValidationId.XML_ENTITY, new XmlEntityValidation(ValidationId.XML_ENTITY, validationMessages)); - - PrintfVariablesValidation printfVariablesValidation = new PrintfVariablesValidation(ValidationId.PRINTF_VARIABLES, validationMessages); - PrintfXSIExtensionValidation positionalPrintfValidation = new PrintfXSIExtensionValidation(ValidationId.PRINTF_XSI_EXTENSION, validationMessages); + PrintfVariablesValidation printfVariablesValidation = new PrintfVariablesValidation( + ValidationId.PRINTF_VARIABLES, validationMessages); + PrintfXSIExtensionValidation positionalPrintfValidation = new PrintfXSIExtensionValidation( + ValidationId.PRINTF_XSI_EXTENSION, validationMessages); + positionalPrintfValidation.setState(State.Off); printfVariablesValidation.mutuallyExclusive(positionalPrintfValidation); positionalPrintfValidation.mutuallyExclusive(printfVariablesValidation); - VALIDATION_MAP.put(ValidationId.PRINTF_VARIABLES, printfVariablesValidation); - VALIDATION_MAP.put(ValidationId.PRINTF_XSI_EXTENSION, positionalPrintfValidation); - } - - private void initValidationMap() - { - VALIDATION_MAP.clear(); - - VALIDATION_MAP.put(ValidationId.HTML_XML, new HtmlXmlTagValidation(ValidationId.HTML_XML)); - VALIDATION_MAP.put(ValidationId.NEW_LINE, new NewlineLeadTrailValidation(ValidationId.NEW_LINE)); - VALIDATION_MAP.put(ValidationId.TAB, new TabValidation(ValidationId.TAB)); + validationMap.put(ValidationId.PRINTF_VARIABLES, printfVariablesValidation); + validationMap.put(ValidationId.PRINTF_XSI_EXTENSION, positionalPrintfValidation); + validationMap.put(ValidationId.TAB, new TabValidation(ValidationId.TAB, validationMessages)); + validationMap.put(ValidationId.XML_ENTITY, new XmlEntityValidation(ValidationId.XML_ENTITY, validationMessages)); - VALIDATION_MAP.put(ValidationId.JAVA_VARIABLES, new JavaVariablesValidation(ValidationId.JAVA_VARIABLES)); - VALIDATION_MAP.put(ValidationId.XML_ENTITY, new XmlEntityValidation(ValidationId.XML_ENTITY)); - - PrintfVariablesValidation printfVariablesValidation = new PrintfVariablesValidation(ValidationId.PRINTF_VARIABLES); - PrintfXSIExtensionValidation positionalPrintfValidation = new PrintfXSIExtensionValidation(ValidationId.PRINTF_XSI_EXTENSION); - - printfVariablesValidation.mutuallyExclusive(positionalPrintfValidation); - positionalPrintfValidation.mutuallyExclusive(printfVariablesValidation); - - VALIDATION_MAP.put(ValidationId.PRINTF_VARIABLES, printfVariablesValidation); - VALIDATION_MAP.put(ValidationId.PRINTF_XSI_EXTENSION, positionalPrintfValidation); + return validationMap; } - } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/shared/validation/action/HtmlXmlTagValidation.java b/zanata-war/src/main/java/org/zanata/webtrans/shared/validation/action/HtmlXmlTagValidation.java index 26ef1e5205..ee602bde24 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/shared/validation/action/HtmlXmlTagValidation.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/shared/validation/action/HtmlXmlTagValidation.java @@ -21,10 +21,10 @@ package org.zanata.webtrans.shared.validation.action; import java.util.ArrayList; +import java.util.List; import org.zanata.webtrans.client.resources.ValidationMessages; import org.zanata.webtrans.shared.model.ValidationId; -import org.zanata.webtrans.shared.model.ValidationInfo; import org.zanata.webtrans.shared.validation.AbstractValidationAction; import com.google.gwt.regexp.shared.MatchResult; @@ -39,42 +39,41 @@ public class HtmlXmlTagValidation extends AbstractValidationAction { public HtmlXmlTagValidation(ValidationId id, ValidationMessages messages) { - super(id, messages.xmlHtmlValidatorDesc(), new ValidationInfo(true), messages); - } - - public HtmlXmlTagValidation(ValidationId id) - { - super(id, null, new ValidationInfo(true), null); + super(id, messages.xmlHtmlValidatorDesc(), messages); } private final static String tagRegex = "<[^>]+>"; @Override - public void doValidate(ArrayList errorList, String source, String target) + public List doValidate(String source, String target) { - ArrayList error = listMissing(source, target); - if (!error.isEmpty()) + ArrayList errors = new ArrayList(); + + List foundErrors = listMissing(source, target); + if (!foundErrors.isEmpty()) { - errorList.add(getMessages().tagsMissing(error)); + errors.add(getMessages().tagsMissing(foundErrors)); } - - error = listMissing(target, source); - if (!error.isEmpty()) + foundErrors = listMissing(target, source); + if (!foundErrors.isEmpty()) { - errorList.add(getMessages().tagsAdded(error)); + errors.add(getMessages().tagsAdded(foundErrors)); } - if (errorList.isEmpty()) + if (errors.isEmpty()) { ArrayList sourceTags = getTagList(source); ArrayList targetTags = getTagList(target); - orderValidation(sourceTags, targetTags, errorList); + errors.addAll(orderValidation(sourceTags, targetTags)); } + return errors; } - private void orderValidation(ArrayList srcTags, ArrayList trgTags, ArrayList errorList) + private List orderValidation(ArrayList srcTags, ArrayList trgTags) { + ArrayList errors = new ArrayList(); + ArrayList longestRun = null; ArrayList currentRun; @@ -108,7 +107,7 @@ private void orderValidation(ArrayList srcTags, ArrayList trgTag if (currentRun.size() == srcTags.size()) { // must all match - return; + return errors; } if (longestRun == null || longestRun.size() < currentRun.size()) @@ -131,9 +130,11 @@ private void orderValidation(ArrayList srcTags, ArrayList trgTag } if (!outOfOrder.isEmpty()) { - errorList.add(getMessages().tagsWrongOrder(outOfOrder)); + errors.add(getMessages().tagsWrongOrder(outOfOrder)); } } + + return errors; } private int findInTail(String toFind, String[] findIn, int startIndex) @@ -163,7 +164,7 @@ private ArrayList getTagList(String src) return list; } - private ArrayList listMissing(String compareFrom, String compareTo) + private List listMissing(String compareFrom, String compareTo) { final RegExp regExp = RegExp.compile(tagRegex, "g"); diff --git a/zanata-war/src/main/java/org/zanata/webtrans/shared/validation/action/JavaVariablesValidation.java b/zanata-war/src/main/java/org/zanata/webtrans/shared/validation/action/JavaVariablesValidation.java index 77e1145531..6eccaab362 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/shared/validation/action/JavaVariablesValidation.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/shared/validation/action/JavaVariablesValidation.java @@ -22,11 +22,11 @@ import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map.Entry; import org.zanata.webtrans.client.resources.ValidationMessages; import org.zanata.webtrans.shared.model.ValidationId; -import org.zanata.webtrans.shared.model.ValidationInfo; import org.zanata.webtrans.shared.validation.AbstractValidationAction; /** @@ -43,21 +43,19 @@ public class JavaVariablesValidation extends AbstractValidationAction { public JavaVariablesValidation(ValidationId id, ValidationMessages messages) { - super(id, messages.javaVariablesValidatorDesc(), new ValidationInfo(true), messages); + super(id, messages.javaVariablesValidatorDesc(), messages); } - - public JavaVariablesValidation(ValidationId id) - { - super(id, null, new ValidationInfo(true), null); - } - + @Override - public void doValidate(ArrayList errorList, String source, String target) + public List doValidate(String source, String target) { + ArrayList errors = new ArrayList(); + StringInfo sourceInfo = analyseString(source); StringInfo targetInfo = analyseString(target); //check if any indices are added/missing + ArrayList missing = new ArrayList(); ArrayList missingQuoted = new ArrayList(); ArrayList added = new ArrayList(); @@ -109,39 +107,40 @@ else if (!sourceVar.getValue().equals(targetCount)) if (!missing.isEmpty()) { - errorList.add(getMessages().varsMissing(missing)); + errors.add(getMessages().varsMissing(missing)); } if (looksLikeMessageFormatString && sourceInfo.singleApostrophes != targetInfo.singleApostrophes) { // different number of apos. - errorList.add(getMessages().differentApostropheCount()); + errors.add(getMessages().differentApostropheCount()); } if (looksLikeMessageFormatString && sourceInfo.quotedChars == 0 && targetInfo.quotedChars > 0) { // quoted chars in target but not source - errorList.add(getMessages().quotedCharsAdded()); + errors.add(getMessages().quotedCharsAdded()); } if (!missingQuoted.isEmpty()) { - errorList.add(getMessages().varsMissingQuoted(missingQuoted)); + errors.add(getMessages().varsMissingQuoted(missingQuoted)); } if (!added.isEmpty()) { - errorList.add(getMessages().varsAdded(added)); + errors.add(getMessages().varsAdded(added)); } if (!addedQuoted.isEmpty()) { - errorList.add(getMessages().varsAddedQuoted(addedQuoted)); + errors.add(getMessages().varsAddedQuoted(addedQuoted)); } if (!different.isEmpty()) { - errorList.add(getMessages().differentVarCount(different)); + errors.add(getMessages().differentVarCount(different)); } - //TODO check if indices are used with the same format types //e.g. "You owe me {0, currency}" --> "Du schuldest mir {0, percent}" is not correct + + return errors; } private HashMap countIndices(ArrayList fullVars) @@ -177,7 +176,7 @@ private StringInfo analyseString(String inString) int quotedLength = 0; //scan for opening brace - for (int i = 0; i 0) { - String variable = inString.substring(quotedOpenings.remove(quotedOpenings.size() -1), i + 1); + String variable = inString.substring(quotedOpenings.remove(quotedOpenings.size() - 1), i + 1); descriptor.quotedVars.add(variable); } @@ -245,7 +244,7 @@ else if (c == '}' && quotedOpenings.size() > 0) } else if (c == '}' && openings.size() > 0) { - String variable = inString.substring(openings.remove(openings.size() -1), i + 1); + String variable = inString.substring(openings.remove(openings.size() - 1), i + 1); descriptor.vars.add(variable); } } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/shared/validation/action/NewlineLeadTrailValidation.java b/zanata-war/src/main/java/org/zanata/webtrans/shared/validation/action/NewlineLeadTrailValidation.java index 28e7d6cc64..cab9cdbce8 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/shared/validation/action/NewlineLeadTrailValidation.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/shared/validation/action/NewlineLeadTrailValidation.java @@ -21,10 +21,10 @@ package org.zanata.webtrans.shared.validation.action; import java.util.ArrayList; +import java.util.List; import org.zanata.webtrans.client.resources.ValidationMessages; import org.zanata.webtrans.shared.model.ValidationId; -import org.zanata.webtrans.shared.model.ValidationInfo; import org.zanata.webtrans.shared.validation.AbstractValidationAction; import com.google.gwt.regexp.shared.MatchResult; @@ -39,12 +39,7 @@ public class NewlineLeadTrailValidation extends AbstractValidationAction { public NewlineLeadTrailValidation(ValidationId id, ValidationMessages messages) { - super(id, messages.newLineValidatorDesc(), new ValidationInfo(true), messages); - } - - public NewlineLeadTrailValidation(ValidationId id) - { - super(id, null, new ValidationInfo(true), null); + super(id, messages.newLineValidatorDesc(), messages); } private final static String leadNewlineRegex = "^\n"; @@ -55,39 +50,43 @@ public NewlineLeadTrailValidation(ValidationId id) private final static RegExp endRegExp = RegExp.compile(endNewlineRegex); @Override - public void doValidate(ArrayList errorList, String source, String target) + public List doValidate(String source, String target) { + ArrayList errors = new ArrayList(); + if (notShareLeading(source, target)) { - errorList.add(getMessages().leadingNewlineMissing()); + errors.add(getMessages().leadingNewlineMissing()); } if (notShareLeading(target, source)) { - errorList.add(getMessages().leadingNewlineAdded()); + errors.add(getMessages().leadingNewlineAdded()); } if (notShareTrailing(source, target)) { - errorList.add(getMessages().trailingNewlineMissing()); + errors.add(getMessages().trailingNewlineMissing()); } if (notShareTrailing(target, source)) { - errorList.add(getMessages().trailingNewlineAdded()); + errors.add(getMessages().trailingNewlineAdded()); } int sourceLines = 1 + countNewlines(source); int targetLines = 1 + countNewlines(target); if (sourceLines < targetLines) { - errorList.add(getMessages().linesAdded(sourceLines, targetLines)); + errors.add(getMessages().linesAdded(sourceLines, targetLines)); } if (targetLines < sourceLines) { - errorList.add(getMessages().linesRemoved(sourceLines, targetLines)); + errors.add(getMessages().linesRemoved(sourceLines, targetLines)); } + + return errors; } private boolean notShareTrailing(String source, String target) diff --git a/zanata-war/src/main/java/org/zanata/webtrans/shared/validation/action/PrintfVariablesValidation.java b/zanata-war/src/main/java/org/zanata/webtrans/shared/validation/action/PrintfVariablesValidation.java index de6387d9bc..b8e40a2ef5 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/shared/validation/action/PrintfVariablesValidation.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/shared/validation/action/PrintfVariablesValidation.java @@ -25,9 +25,9 @@ import org.zanata.webtrans.client.resources.ValidationMessages; import org.zanata.webtrans.shared.model.ValidationId; -import org.zanata.webtrans.shared.model.ValidationInfo; import org.zanata.webtrans.shared.validation.AbstractValidationAction; +import com.google.common.base.Strings; import com.google.common.collect.Lists; import com.google.gwt.regexp.shared.MatchResult; import com.google.gwt.regexp.shared.RegExp; @@ -47,46 +47,60 @@ public class PrintfVariablesValidation extends AbstractValidationAction public PrintfVariablesValidation(ValidationId id, ValidationMessages messages) { - super(id, messages.printfVariablesValidatorDesc(), new ValidationInfo(true), messages); - } - - public PrintfVariablesValidation(ValidationId id) - { - super(id, null, new ValidationInfo(true), null); + this(id, messages.printfVariablesValidatorDesc(), messages); } - public PrintfVariablesValidation(ValidationId id, String description, ValidationMessages messages, boolean enabled) + public PrintfVariablesValidation(ValidationId id, String description, ValidationMessages messages) { - super(id, description, new ValidationInfo(enabled), messages); + super(id, description, messages); } @Override - public void doValidate(ArrayList errorList, String source, String target) + public List doValidate(String source, String target) { + ArrayList errors = new ArrayList(); + ArrayList sourceVars = findVars(source); ArrayList targetVars = findVars(target); - findMissingVariables(errorList, sourceVars, targetVars); - findAddedVariables(errorList, sourceVars, targetVars); + String message = findMissingVariables(sourceVars, targetVars); + if (!Strings.isNullOrEmpty(message)) + { + errors.add(message); + } + message = findAddedVariables(sourceVars, targetVars); + if (!Strings.isNullOrEmpty(message)) + { + errors.add(message); + } + + return errors; } - protected void findMissingVariables(ArrayList errorList, ArrayList sourceVars, ArrayList targetVars) + protected String findMissingVariables(ArrayList sourceVars, + ArrayList targetVars) { List missing = listMissing(sourceVars, targetVars); + if (!missing.isEmpty()) { - errorList.add(getMessages().varsMissing(missing)); + return getMessages().varsMissing(missing); } + + return null; } - protected void findAddedVariables(ArrayList errorList, ArrayList sourceVars, ArrayList targetVars) + protected String findAddedVariables(ArrayList sourceVars, + ArrayList targetVars) { // missing from source = added List added = listMissing(targetVars, sourceVars); if (!added.isEmpty()) { - errorList.add(getMessages().varsAdded(added)); + return getMessages().varsAdded(added); } + + return null; } private List listMissing(ArrayList baseVars, ArrayList testVars) diff --git a/zanata-war/src/main/java/org/zanata/webtrans/shared/validation/action/PrintfXSIExtensionValidation.java b/zanata-war/src/main/java/org/zanata/webtrans/shared/validation/action/PrintfXSIExtensionValidation.java index a4b2112e95..77ee761c4d 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/shared/validation/action/PrintfXSIExtensionValidation.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/shared/validation/action/PrintfXSIExtensionValidation.java @@ -2,11 +2,13 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.List; import java.util.Map; import org.zanata.webtrans.client.resources.ValidationMessages; import org.zanata.webtrans.shared.model.ValidationId; +import com.google.common.base.Strings; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Lists; import com.google.common.collect.Multimap; @@ -23,30 +25,35 @@ public class PrintfXSIExtensionValidation extends PrintfVariablesValidation public PrintfXSIExtensionValidation(ValidationId id, ValidationMessages messages) { - super(id, messages.printfXSIExtensionValidationDesc(), messages, false); - } - - public PrintfXSIExtensionValidation(ValidationId id) - { - super(id); + super(id, messages.printfXSIExtensionValidationDesc(), messages); } @Override - public void doValidate(ArrayList errorList, String source, String target) + public List doValidate(String source, String target) { + ArrayList errors = new ArrayList(); + ArrayList sourceVars = findVars(source); ArrayList targetVars = findVars(target); - if (PrintfXSIExtensionValidation.hasPosition(targetVars)) { sourceVars = PrintfXSIExtensionValidation.appendPosition(sourceVars); - checkPosition(errorList, targetVars, sourceVars.size()); + errors.addAll(checkPosition(targetVars, sourceVars.size())); } - - findMissingVariables(errorList, sourceVars, targetVars); - findAddedVariables(errorList, sourceVars, targetVars); + + String message = findMissingVariables(sourceVars, targetVars); + if (!Strings.isNullOrEmpty(message)) + { + errors.add(message); + } + message = findAddedVariables(sourceVars, targetVars); + if (!Strings.isNullOrEmpty(message)) + { + errors.add(message); + } + return errors; } private static boolean hasPosition(ArrayList variables) @@ -74,10 +81,11 @@ private static ArrayList appendPosition(ArrayList sourceVars) return result; } - private void checkPosition(ArrayList errorList, ArrayList variables, int size) + private List checkPosition(ArrayList variables, int size) { - Multimap posToVars = ArrayListMultimap.create(); + ArrayList errors = new ArrayList(); + Multimap posToVars = ArrayListMultimap.create(); for (String testVar : variables) { MatchResult result = PrintfXSIExtensionValidation.POSITIONAL_REG_EXP.exec(testVar); @@ -91,12 +99,12 @@ private void checkPosition(ArrayList errorList, ArrayList variab } else { - errorList.add(getMessages().varPositionOutOfRange(testVar)); + errors.add(getMessages().varPositionOutOfRange(testVar)); } } else { - errorList.add(getMessages().mixVarFormats()); + errors.add(getMessages().mixVarFormats()); } } if (posToVars.keySet().size() != variables.size()) @@ -106,10 +114,12 @@ private void checkPosition(ArrayList errorList, ArrayList variab { if (entry.getValue().size() > 1) { - errorList.add(getMessages().varPositionDuplicated(entry.getValue())); + errors.add(getMessages().varPositionDuplicated(entry.getValue())); } } } + + return errors; } private static int extractPositionIndex(String positionAndDollar) diff --git a/zanata-war/src/main/java/org/zanata/webtrans/shared/validation/action/TabValidation.java b/zanata-war/src/main/java/org/zanata/webtrans/shared/validation/action/TabValidation.java index 7269f956fe..df5e6aac70 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/shared/validation/action/TabValidation.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/shared/validation/action/TabValidation.java @@ -21,10 +21,10 @@ package org.zanata.webtrans.shared.validation.action; import java.util.ArrayList; +import java.util.List; import org.zanata.webtrans.client.resources.ValidationMessages; import org.zanata.webtrans.shared.model.ValidationId; -import org.zanata.webtrans.shared.model.ValidationInfo; import org.zanata.webtrans.shared.validation.AbstractValidationAction; import com.google.common.base.CharMatcher; @@ -33,29 +33,28 @@ public class TabValidation extends AbstractValidationAction { public TabValidation(ValidationId id, ValidationMessages messages) { - super(id, messages.tabValidatorDesc(), new ValidationInfo(true), messages); - } - - public TabValidation(ValidationId id) - { - super(id, null, new ValidationInfo(true), null); + super(id, messages.tabValidatorDesc(), messages); } @Override - public void doValidate(ArrayList errorList, String source, String target) + public List doValidate(String source, String target) { + ArrayList errors = new ArrayList(); + @edu.umd.cs.findbugs.annotations.SuppressWarnings("GBU_GUAVA_BETA_CLASS_USAGE") CharMatcher tabs = CharMatcher.is('\t'); int sourceTabs = tabs.countIn(source); int targetTabs = tabs.countIn(target); if (sourceTabs > targetTabs) { - errorList.add(getMessages().targetHasFewerTabs(sourceTabs, targetTabs)); + errors.add(getMessages().targetHasFewerTabs(sourceTabs, targetTabs)); } else if (targetTabs > sourceTabs) { - errorList.add(getMessages().targetHasMoreTabs(sourceTabs, targetTabs)); + errors.add(getMessages().targetHasMoreTabs(sourceTabs, targetTabs)); } + + return errors; } } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/shared/validation/action/XmlEntityValidation.java b/zanata-war/src/main/java/org/zanata/webtrans/shared/validation/action/XmlEntityValidation.java index 46e65e9e20..75a88658a5 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/shared/validation/action/XmlEntityValidation.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/shared/validation/action/XmlEntityValidation.java @@ -21,10 +21,10 @@ package org.zanata.webtrans.shared.validation.action; import java.util.ArrayList; +import java.util.List; import org.zanata.webtrans.client.resources.ValidationMessages; import org.zanata.webtrans.shared.model.ValidationId; -import org.zanata.webtrans.shared.model.ValidationInfo; import org.zanata.webtrans.shared.validation.AbstractValidationAction; import com.google.common.base.Splitter; @@ -54,22 +54,19 @@ public class XmlEntityValidation extends AbstractValidationAction public XmlEntityValidation(ValidationId id, ValidationMessages messages) { - super(id, messages.xmlEntityValidatorDesc(), new ValidationInfo(true), messages); - } - - public XmlEntityValidation(ValidationId id) - { - super(id, null, new ValidationInfo(true), null); + super(id, messages.xmlEntityValidatorDesc(), messages); } @Override - public void doValidate(ArrayList errorList, String source, String target) + public List doValidate(String source, String target) { - validateIncompleteEntity(errorList, target); + return validateIncompleteEntity(target); } - private void validateIncompleteEntity(ArrayList errorList, String target) + private List validateIncompleteEntity(String target) { + ArrayList errors = new ArrayList(); + Iterable words = Splitter.on(" ").trimResults().omitEmptyStrings().split(target); for (String word : words) @@ -83,11 +80,12 @@ private void validateIncompleteEntity(ArrayList errorList, String target if (word.contains(ENTITY_START_CHAR)) { //remove any string that occurs in front - word = word.substring(word.indexOf(ENTITY_START_CHAR)); - errorList.add(getMessages().invalidXMLEntity(word)); + word = word.substring(word.indexOf(ENTITY_START_CHAR)); + errors.add(getMessages().invalidXMLEntity(word)); } } } + return errors; } /** @@ -103,7 +101,7 @@ private static String replaceEntityWithEmptyString(RegExp regex, String text) while (result != null) { // replace match entity with empty string - text = text.replace(result.getGroup(0), ""); + text = text.replace(result.getGroup(0), ""); result = regex.exec(text); } return text; diff --git a/zanata-war/src/main/resources/db/changelogs/db.changelog-3.1.xml b/zanata-war/src/main/resources/db/changelogs/db.changelog-3.1.xml index fe7068959f..d93764da48 100644 --- a/zanata-war/src/main/resources/db/changelogs/db.changelog-3.1.xml +++ b/zanata-war/src/main/resources/db/changelogs/db.changelog-3.1.xml @@ -6,6 +6,11 @@ xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-2.0.xsd http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd"> + + Create the Translation Memory table. diff --git a/zanata-war/src/main/resources/db/changelogs/db.changelog-3.1a.xml b/zanata-war/src/main/resources/db/changelogs/db.changelog-3.1a.xml new file mode 100644 index 0000000000..17372ad76a --- /dev/null +++ b/zanata-war/src/main/resources/db/changelogs/db.changelog-3.1a.xml @@ -0,0 +1,47 @@ + + + + + + + Remove overrideValidations from HProject + + + + + Remove overrideValidations from HProjectIteration + + + + + Add State to HProject_Validation + + + + + + + update HProject_Validation set state = 'Warning'; + + + + + Add State to HProjectIteration_Validation + + + + + + + update HProjectIteration_Validation set state = 'Warning'; + + + + \ No newline at end of file diff --git a/zanata-war/src/main/resources/db/db.changelog.xml b/zanata-war/src/main/resources/db/db.changelog.xml index 71885d5af8..b2e45e877f 100644 --- a/zanata-war/src/main/resources/db/db.changelog.xml +++ b/zanata-war/src/main/resources/db/db.changelog.xml @@ -14,6 +14,7 @@ + diff --git a/zanata-war/src/main/resources/messages.properties b/zanata-war/src/main/resources/messages.properties index d99ffe51d4..e4f99e9ae7 100644 --- a/zanata-war/src/main/resources/messages.properties +++ b/zanata-war/src/main/resources/messages.properties @@ -167,11 +167,16 @@ jsf.AddLocale=Add > jsf.RemoveLocale=< Remove jsf.RestrictRoleAccessMessage=Would you like to restrict access to this project to certain User roles? jsf.RestrictRoleAccessTooltip=Restrict Project Access -jsf.customizedValidationMessage=Would you like to use a customized list of validations? +jsf.customizedValidationMessage=Validation settings ! used in create/edit version. jsf.ProjectVersionId=Version ID jsf.ExportTMXAll=Export all projects to TMX jsf.ConfirmExportTMXAll=Are you sure you want to export all projects to TMX? +jsf.ValidationHelp=Validation options +jsf.Off=Off +jsf.ValidationStateHelpOff=Validation disabled by default in editor. Translator is able to enable/disable the validation. No restriction on saving translation. +jsf.ValidationStateHelpWarning=Validation enabled by default in editor. Translator is able to enable/disable the validation. No restriction on saving translation. +jsf.ValidationStateHelpError=Validation enabled and locked in editor. Translation with validation error can only be save as fuzzy. #------ [home] > Projects > [project-id] ------ diff --git a/zanata-war/src/main/webapp-jboss/WEB-INF/classes/META-INF/components.xml b/zanata-war/src/main/webapp-jboss/WEB-INF/classes/META-INF/components.xml index 5cd4de0939..67689b1c71 100644 --- a/zanata-war/src/main/webapp-jboss/WEB-INF/classes/META-INF/components.xml +++ b/zanata-war/src/main/webapp-jboss/WEB-INF/classes/META-INF/components.xml @@ -124,10 +124,6 @@ --> - - - - @@ -738,8 +738,8 @@ - - + + diff --git a/zanata-war/src/main/webapp/iteration/edit.xhtml b/zanata-war/src/main/webapp/iteration/edit.xhtml index 9656f75954..1389c6c381 100644 --- a/zanata-war/src/main/webapp/iteration/edit.xhtml +++ b/zanata-war/src/main/webapp/iteration/edit.xhtml @@ -1,18 +1,20 @@ + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + xmlns:s="http://jboss.org/schema/seam/taglib" + xmlns:ui="http://java.sun.com/jsf/facelets" + xmlns:f="http://java.sun.com/jsf/core" + xmlns:h="http://java.sun.com/jsf/html" + xmlns:rich="http://richfaces.org/rich" + template="../WEB-INF/template/template_2x.xhtml"> -#{projectIterationHome.instance.project.slug}:#{projectIterationHome.instance.slug} - Edit - + #{projectIterationHome.instance.project.slug}:#{projectIterationHome.instance.slug} - Edit + + + - - - + + + diff --git a/zanata-war/src/main/webapp/project/add_iteration.xhtml b/zanata-war/src/main/webapp/project/add_iteration.xhtml index 82193bd1f4..267f0c1d4a 100644 --- a/zanata-war/src/main/webapp/project/add_iteration.xhtml +++ b/zanata-war/src/main/webapp/project/add_iteration.xhtml @@ -1,24 +1,27 @@ + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + xmlns:s="http://jboss.org/schema/seam/taglib" + xmlns:ui="http://java.sun.com/jsf/facelets" + xmlns:f="http://java.sun.com/jsf/core" + xmlns:h="http://java.sun.com/jsf/html" + xmlns:rich="http://richfaces.org/rich" + xmlns:richext="http://java.sun.com/jsf/composite/richext" + template="../WEB-INF/template/template_2x.xhtml"> -#{projectIterationHome.instance.project.name} - Add Version - - - - - - - - #{projectIterationHome.instance.project.name} is not active. - - + #{projectIterationHome.instance.project.name} - Add Version + + + + + + + + #{projectIterationHome.instance.project.name} is not active. + + + + + diff --git a/zanata-war/src/main/webapp/project/create_project.xhtml b/zanata-war/src/main/webapp/project/create_project.xhtml index 2daf4e1577..1b0c5db87a 100644 --- a/zanata-war/src/main/webapp/project/create_project.xhtml +++ b/zanata-war/src/main/webapp/project/create_project.xhtml @@ -1,18 +1,19 @@ + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + xmlns:s="http://jboss.org/schema/seam/taglib" + xmlns:ui="http://java.sun.com/jsf/facelets" + xmlns:f="http://java.sun.com/jsf/core" + xmlns:h="http://java.sun.com/jsf/html" + xmlns:rich="http://richfaces.org/rich" + template="../WEB-INF/template/template_2x.xhtml"> -Create Project - - - - - + Create Project + + + + + + diff --git a/zanata-war/src/main/webapp/project/edit.xhtml b/zanata-war/src/main/webapp/project/edit.xhtml index d8509c26fa..646c240c0d 100644 --- a/zanata-war/src/main/webapp/project/edit.xhtml +++ b/zanata-war/src/main/webapp/project/edit.xhtml @@ -1,18 +1,20 @@ + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + xmlns:s="http://jboss.org/schema/seam/taglib" + xmlns:ui="http://java.sun.com/jsf/facelets" + xmlns:f="http://java.sun.com/jsf/core" + xmlns:h="http://java.sun.com/jsf/html" + xmlns:rich="http://richfaces.org/rich" + template="../WEB-INF/template/template_2x.xhtml"> -#{projectHome.instance.name} - Edit - + #{projectHome.instance.name} - Edit + + + - - - + + + diff --git a/zanata-war/src/test/java/org/zanata/rest/service/TranslationResourceRestTest.java b/zanata-war/src/test/java/org/zanata/rest/service/TranslationResourceRestTest.java index 13d84bcca1..66a3dc0e3c 100644 --- a/zanata-war/src/test/java/org/zanata/rest/service/TranslationResourceRestTest.java +++ b/zanata-war/src/test/java/org/zanata/rest/service/TranslationResourceRestTest.java @@ -55,11 +55,7 @@ import org.zanata.rest.dto.resource.TranslationsResource; import org.zanata.seam.SeamAutowire; import org.zanata.security.ZanataIdentity; -import org.zanata.service.impl.CopyTransServiceImpl; -import org.zanata.service.impl.DocumentServiceImpl; -import org.zanata.service.impl.LocaleServiceImpl; -import org.zanata.service.impl.SecurityServiceImpl; -import org.zanata.service.impl.TranslationServiceImpl; +import org.zanata.service.impl.*; import org.zanata.util.HashUtil; import org.zanata.webtrans.server.TranslationWorkspace; import org.zanata.webtrans.server.TranslationWorkspaceManager; @@ -147,7 +143,9 @@ protected void prepareResources() .useImpl(LocaleServiceImpl.class) .useImpl(DocumentServiceImpl.class) .useImpl(ResourceUtils.class) - .useImpl(SecurityServiceImpl.class); + .useImpl(SecurityServiceImpl.class) + .useImpl(ValidationServiceImpl.class); + TranslatedDocResourceService translatedDocResourceService = seamAutowire.autowire(TranslatedDocResourceService.class); SourceDocResourceService sourceDocResourceService = seamAutowire.autowire(SourceDocResourceService.class); diff --git a/zanata-war/src/test/java/org/zanata/rest/service/TranslationServiceRestTest.java b/zanata-war/src/test/java/org/zanata/rest/service/TranslationServiceRestTest.java index 33f3e27980..5363952e68 100644 --- a/zanata-war/src/test/java/org/zanata/rest/service/TranslationServiceRestTest.java +++ b/zanata-war/src/test/java/org/zanata/rest/service/TranslationServiceRestTest.java @@ -15,10 +15,7 @@ import org.zanata.rest.dto.resource.TranslationsResource; import org.zanata.seam.SeamAutowire; import org.zanata.security.ZanataIdentity; -import org.zanata.service.impl.CopyTransServiceImpl; -import org.zanata.service.impl.DocumentServiceImpl; -import org.zanata.service.impl.LocaleServiceImpl; -import org.zanata.service.impl.TranslationServiceImpl; +import org.zanata.service.impl.*; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; @@ -57,7 +54,8 @@ protected void prepareResources() .useImpl(LocaleServiceImpl.class) .useImpl(CopyTransServiceImpl.class) .useImpl(DocumentServiceImpl.class) - .useImpl(TranslationServiceImpl.class); + .useImpl(TranslationServiceImpl.class) + .useImpl(ValidationServiceImpl.class); SourceDocResourceService sourceDocResourceService = seamAutowire.autowire(SourceDocResourceService.class); TranslatedDocResourceService translatedDocResourceService = seamAutowire.autowire(TranslatedDocResourceService.class); diff --git a/zanata-war/src/test/java/org/zanata/service/impl/CopyTransServiceImplTest.java b/zanata-war/src/test/java/org/zanata/service/impl/CopyTransServiceImplTest.java index b902b06acf..40fd229e45 100644 --- a/zanata-war/src/test/java/org/zanata/service/impl/CopyTransServiceImplTest.java +++ b/zanata-war/src/test/java/org/zanata/service/impl/CopyTransServiceImplTest.java @@ -98,6 +98,7 @@ public void initializeSeam() .use("session", getSession()) .use(JpaIdentityStore.AUTHENTICATED_USER, seam.autowire(AccountDAO.class).getByUsername("demo")) .useImpl(LocaleServiceImpl.class) + .useImpl(ValidationServiceImpl.class) .ignoreNonResolvable(); } diff --git a/zanata-war/src/test/java/org/zanata/service/impl/TranslationServiceImplTest.java b/zanata-war/src/test/java/org/zanata/service/impl/TranslationServiceImplTest.java index ae667139d6..0596f42a75 100644 --- a/zanata-war/src/test/java/org/zanata/service/impl/TranslationServiceImplTest.java +++ b/zanata-war/src/test/java/org/zanata/service/impl/TranslationServiceImplTest.java @@ -80,6 +80,7 @@ public void initializeSeam() .use(JpaIdentityStore.AUTHENTICATED_USER, seam.autowire(AccountDAO.class).getByUsername("demo")) .use("identity", identity) .useImpl(LocaleServiceImpl.class) + .useImpl(ValidationServiceImpl.class) .ignoreNonResolvable(); } diff --git a/zanata-war/src/test/java/org/zanata/service/impl/TranslationStateCacheImplTest.java b/zanata-war/src/test/java/org/zanata/service/impl/TranslationStateCacheImplTest.java index edc69f717f..63e11a0de2 100644 --- a/zanata-war/src/test/java/org/zanata/service/impl/TranslationStateCacheImplTest.java +++ b/zanata-war/src/test/java/org/zanata/service/impl/TranslationStateCacheImplTest.java @@ -106,7 +106,7 @@ public void testTextFlowTargetHasError() throws Exception when(targetValidationLoader.load(targetId)).thenReturn(map); // Run: - Boolean result = tsCache.textFlowTargetHasError(targetId, validationId); + Boolean result = tsCache.textFlowTargetHasWarningOrError(targetId, validationId); // Then: verify(targetValidationLoader).load(targetId); // only load the value once @@ -125,7 +125,7 @@ public void testTextFlowTargetHasError2() throws Exception when(targetValidationLoader.load(targetId)).thenReturn(map); // Run: - Boolean result = tsCache.textFlowTargetHasError(targetId, validationId); + Boolean result = tsCache.textFlowTargetHasWarningOrError(targetId, validationId); // Then: verify(targetValidationLoader).load(targetId); // only load the value once diff --git a/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/AppPresenterTest.java b/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/AppPresenterTest.java index a459cb5869..c4e13c40cc 100644 --- a/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/AppPresenterTest.java +++ b/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/AppPresenterTest.java @@ -1,10 +1,24 @@ package org.zanata.webtrans.client.presenter; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.Matchers.eq; +import static org.mockito.Matchers.isA; +import static org.mockito.Mockito.atLeastOnce; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; +import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.when; + import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; +import net.customware.gwt.presenter.client.EventBus; +import net.customware.gwt.presenter.client.PresenterRevealedEvent; + import org.hamcrest.Matchers; import org.mockito.ArgumentCaptor; import org.mockito.Captor; @@ -36,18 +50,11 @@ import org.zanata.webtrans.shared.model.DocumentId; import org.zanata.webtrans.shared.model.DocumentInfo; import org.zanata.webtrans.shared.model.UserWorkspaceContext; +import org.zanata.webtrans.shared.model.ValidationAction.State; import org.zanata.webtrans.shared.model.ValidationId; -import org.zanata.webtrans.shared.model.ValidationInfo; import org.zanata.webtrans.shared.model.WorkspaceId; import org.zanata.webtrans.shared.rpc.HasWorkspaceContextUpdateData; -import net.customware.gwt.presenter.client.EventBus; -import net.customware.gwt.presenter.client.PresenterRevealedEvent; -import static org.hamcrest.MatcherAssert.*; -import static org.mockito.Matchers.eq; -import static org.mockito.Matchers.isA; -import static org.mockito.Mockito.*; - @Test(groups = { "unit-tests" }) public class AppPresenterTest { @@ -530,7 +537,7 @@ public ProjectType getProjectType() } @Override - public Map getValidationInfoList() + public Map getValidationStates() { return null; } diff --git a/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/DocumentListOptionsPresenterTest.java b/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/DocumentListOptionsPresenterTest.java index 46646421c2..efaadd0b6b 100644 --- a/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/DocumentListOptionsPresenterTest.java +++ b/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/DocumentListOptionsPresenterTest.java @@ -27,8 +27,8 @@ import org.zanata.webtrans.client.view.DocumentListOptionsDisplay; import org.zanata.webtrans.shared.model.ProjectIterationId; import org.zanata.webtrans.shared.model.UserWorkspaceContext; +import org.zanata.webtrans.shared.model.ValidationAction.State; import org.zanata.webtrans.shared.model.ValidationId; -import org.zanata.webtrans.shared.model.ValidationInfo; import org.zanata.webtrans.shared.model.WorkspaceContext; import org.zanata.webtrans.shared.model.WorkspaceId; import org.zanata.webtrans.shared.rpc.HasWorkspaceContextUpdateData; @@ -128,7 +128,7 @@ public ProjectType getProjectType() } @Override - public Map getValidationInfoList() + public Map getValidationStates() { return null; } diff --git a/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/DocumentListPresenterTest.java b/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/DocumentListPresenterTest.java index e7bccbc511..f7d95bc81d 100644 --- a/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/DocumentListPresenterTest.java +++ b/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/DocumentListPresenterTest.java @@ -1,10 +1,25 @@ package org.zanata.webtrans.client.presenter; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasItems; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.isIn; +import static org.hamcrest.Matchers.notNullValue; +import static org.mockito.Matchers.isA; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.when; + import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.Map; +import net.customware.gwt.presenter.client.EventBus; + import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; @@ -40,23 +55,18 @@ import org.zanata.webtrans.shared.model.TransUnit; import org.zanata.webtrans.shared.model.TransUnitUpdateInfo; import org.zanata.webtrans.shared.model.UserWorkspaceContext; +import org.zanata.webtrans.shared.model.ValidationAction.State; import org.zanata.webtrans.shared.model.ValidationId; -import org.zanata.webtrans.shared.model.ValidationInfo; import org.zanata.webtrans.shared.model.WorkspaceContext; import org.zanata.webtrans.shared.model.WorkspaceId; import org.zanata.webtrans.shared.rpc.GetDocumentStats; import org.zanata.webtrans.shared.rpc.GetDocumentStatsResult; import org.zanata.webtrans.shared.rpc.HasWorkspaceContextUpdateData; import org.zanata.webtrans.shared.rpc.ThemesOption; + import com.google.gwt.event.shared.GwtEvent; import com.google.gwt.user.client.rpc.AsyncCallback; -import net.customware.gwt.presenter.client.EventBus; -import static org.hamcrest.MatcherAssert.*; -import static org.hamcrest.Matchers.*; -import static org.mockito.Matchers.isA; -import static org.mockito.Mockito.*; - @Test(groups = { "unit-tests" }) public class DocumentListPresenterTest { @@ -107,7 +117,8 @@ public void beforeMethod() configHolder = new UserConfigHolder(); when(mockUserOptionsService.getConfigHolder()).thenReturn(configHolder); - workspaceId = new WorkspaceId(new ProjectIterationId("projectSlug", "iterationSlug", ProjectType.Podir), LocaleId.ES); + workspaceId = new WorkspaceId(new ProjectIterationId("projectSlug", "iterationSlug", ProjectType.Podir), + LocaleId.ES); when(mockUserWorkspaceContext.getWorkspaceContext()).thenReturn(mockWorkspaceContext); when(mockWorkspaceContext.getWorkspaceId()).thenReturn(workspaceId); @@ -116,8 +127,9 @@ public void beforeMethod() when(mockMessages.downloadAllAsZipDescription()).thenReturn("Download all translation file"); when(mockDisplay.getPageNavigation()).thenReturn(mockPager); - - documentListPresenter = new DocumentListPresenter(mockDisplay, mockEventBus, mockDispatcher, mockUserWorkspaceContext, mockMessages, mockHistory, mockUserOptionsService); + + documentListPresenter = new DocumentListPresenter(mockDisplay, mockEventBus, mockDispatcher, + mockUserWorkspaceContext, mockMessages, mockHistory, mockUserOptionsService); } @Test @@ -137,7 +149,8 @@ public void onBind() verify(mockEventBus).addHandler(UserConfigChangeEvent.TYPE, documentListPresenter); verify(mockEventBus).addHandler(WorkspaceContextUpdateEvent.getType(), documentListPresenter); - verify(mockDisplay).setEnableDownloadZip(documentListPresenter.isZipFileDownloadAllowed(workspaceId.getProjectIterationId().getProjectType())); + verify(mockDisplay).setEnableDownloadZip( + documentListPresenter.isZipFileDownloadAllowed(workspaceId.getProjectIterationId().getProjectType())); verify(mockDisplay).setDownloadZipButtonTitle(isA(String.class)); } @@ -148,17 +161,20 @@ public void loadDocsIntoDataProvider() documentListPresenter.setDocuments(buildSampleDocumentArray()); // right amount of docs - assertThat("the data provider should have the same sized document list returned from the server", documentListPresenter.getSortedNodes().size(), is(3)); + assertThat("the data provider should have the same sized document list returned from the server", + documentListPresenter.getSortedNodes().size(), is(3)); ArrayList expectedDocs = buildSampleDocumentArray(); ArrayList actualDocInfos = new ArrayList(); for (DocumentNode node : documentListPresenter.getSortedNodes()) { - assertThat("the data provider should have only documents that were returned from the server", node.getDocInfo(), isIn(expectedDocs)); + assertThat("the data provider should have only documents that were returned from the server", + node.getDocInfo(), isIn(expectedDocs)); actualDocInfos.add(node.getDocInfo()); } - assertThat("the data provider should have all documents returned from the server", actualDocInfos, hasItems(expectedDocs.get(0), expectedDocs.get(1), expectedDocs.get(2))); + assertThat("the data provider should have all documents returned from the server", actualDocInfos, + hasItems(expectedDocs.get(0), expectedDocs.get(1), expectedDocs.get(2))); } @Test @@ -171,8 +187,12 @@ public void generatesDocumentStatsOnTuUpdate() ArrayList targets = new ArrayList(); targets.add("this is the target"); - TransUnit newTransUnit = TransUnit.Builder.newTransUnitBuilder().setId(12345L).setResId("resId").setLocaleId("es").setPlural(plural).setSources(sources).setSourceComment("this is the source comment").setTargets(targets).setStatus(ContentState.Approved).setLastModifiedBy("lastModifiedBy").setLastModifiedTime(new Date()).setMsgContext("msgContext").setRowIndex(1).setVerNum(1).build(); - TransUnitUpdateInfo updateInfo = new TransUnitUpdateInfo(true, true, new DocumentId(2222L, ""), newTransUnit, 3, 0, ContentState.NeedReview); + TransUnit newTransUnit = TransUnit.Builder.newTransUnitBuilder().setId(12345L).setResId("resId") + .setLocaleId("es").setPlural(plural).setSources(sources).setSourceComment("this is the source comment") + .setTargets(targets).setStatus(ContentState.Approved).setLastModifiedBy("lastModifiedBy") + .setLastModifiedTime(new Date()).setMsgContext("msgContext").setRowIndex(1).setVerNum(1).build(); + TransUnitUpdateInfo updateInfo = new TransUnitUpdateInfo(true, true, new DocumentId(2222L, ""), newTransUnit, 3, + 0, ContentState.NeedReview); TransUnitUpdatedEvent mockEvent = mock(TransUnitUpdatedEvent.class); when(mockEvent.getUpdateInfo()).thenReturn(updateInfo); @@ -194,23 +214,35 @@ public void generatesDocumentStatsOnTuUpdate() } } - assertThat("a document stats event should be fired when a TU update event occurs, not found", docStatsEvent, notNullValue()); + assertThat("a document stats event should be fired when a TU update event occurs, not found", docStatsEvent, + notNullValue()); // document stats - assertThat("document id in document stats event shoudl match updated TU document id", docStatsEvent.getDocId(), equalTo(new DocumentId(2222L, ""))); + assertThat("document id in document stats event shoudl match updated TU document id", docStatsEvent.getDocId(), + equalTo(new DocumentId(2222L, ""))); // check actual counts (approved/fuzzy/untranslated) // default TUs: 1/2/3 // approving 1 fuzzy, expect 2/1/3 - assertThat("document Approved TU count should increase by 1 when a TU is updated from NeedsReview to Approved", docStatsEvent.getNewStats().getStats(LocaleId.ES.toString(), StatUnit.MESSAGE).getApproved(), is(new Long(2))); - assertThat("document NeedsReview TU count should decrease by 1 when a TU is updated from NeedsReview to Approved", docStatsEvent.getNewStats().getStats(LocaleId.ES.toString(), StatUnit.MESSAGE).getDraft(), is(new Long(1))); - assertThat("document Untranslated TU count should remain the same when a TU is updated from NeedsReview to Approved", docStatsEvent.getNewStats().getStats(LocaleId.ES.toString(), StatUnit.MESSAGE).getUntranslated(), is(new Long(3))); + assertThat("document Approved TU count should increase by 1 when a TU is updated from NeedsReview to Approved", + docStatsEvent.getNewStats().getStats(LocaleId.ES.toString(), StatUnit.MESSAGE).getApproved(), + is(new Long(2))); + assertThat( + "document NeedsReview TU count should decrease by 1 when a TU is updated from NeedsReview to Approved", + docStatsEvent.getNewStats().getStats(LocaleId.ES.toString(), StatUnit.MESSAGE).getDraft(), is(new Long(1))); + assertThat( + "document Untranslated TU count should remain the same when a TU is updated from NeedsReview to Approved", + docStatsEvent.getNewStats().getStats(LocaleId.ES.toString(), StatUnit.MESSAGE).getUntranslated(), + is(new Long(3))); // default words: 4/5/6 // approving 3 fuzzy so expect 7/2/6 - assertThat("document Approved words should increase when TU changes to Approved", docStatsEvent.getNewStats().getStats(LocaleId.ES.toString(), StatUnit.WORD).getApproved(), is(new Long(7))); - assertThat("document NeedsReview words should decrease when a TU changes from NeedsReview", docStatsEvent.getNewStats().getStats(LocaleId.ES.toString(), StatUnit.WORD).getDraft(), is(new Long(2))); - assertThat("document Untranslated words should not change when TU changes between NeedsReview and Approved", docStatsEvent.getNewStats().getStats(LocaleId.ES.toString(), StatUnit.WORD).getDraft(), is(new Long(2))); + assertThat("document Approved words should increase when TU changes to Approved", docStatsEvent.getNewStats() + .getStats(LocaleId.ES.toString(), StatUnit.WORD).getApproved(), is(new Long(7))); + assertThat("document NeedsReview words should decrease when a TU changes from NeedsReview", docStatsEvent + .getNewStats().getStats(LocaleId.ES.toString(), StatUnit.WORD).getDraft(), is(new Long(2))); + assertThat("document Untranslated words should not change when TU changes between NeedsReview and Approved", + docStatsEvent.getNewStats().getStats(LocaleId.ES.toString(), StatUnit.WORD).getDraft(), is(new Long(2))); } @Test @@ -226,8 +258,10 @@ public void filterTextUpdateGeneratesHistoryToken() verify(mockHistory).newItem(capturedHistoryTokenString.capture()); HistoryToken capturedHistoryToken = HistoryToken.fromTokenString(capturedHistoryTokenString.getValue()); - assertThat("generated history token filter text should match the filter textbox", capturedHistoryToken.getDocFilterText(), is(filterText)); - assertThat("generated history token filter exact flag should match the exact match checkbox", capturedHistoryToken.getDocFilterExact(), is(false)); + assertThat("generated history token filter text should match the filter textbox", + capturedHistoryToken.getDocFilterText(), is(filterText)); + assertThat("generated history token filter exact flag should match the exact match checkbox", + capturedHistoryToken.getDocFilterExact(), is(false)); } @Test @@ -242,7 +276,8 @@ public void checkExactSearchCheckboxGeneratesHistoryToken() HistoryToken exactSearchToken = new HistoryToken(); exactSearchToken.setDocFilterExact(true); - assertThat("checking the 'exact search' checkbox should be reflected in a new history token", capturedHistoryTokenString.getValue(), is(exactSearchToken.toTokenString())); + assertThat("checking the 'exact search' checkbox should be reflected in a new history token", + capturedHistoryTokenString.getValue(), is(exactSearchToken.toTokenString())); } @Test @@ -261,7 +296,8 @@ public void uncheckExactSearchCheckboxGeneratesHistoryToken() HistoryToken inexactSearchToken = new HistoryToken(); inexactSearchToken.setDocFilterExact(false); - assertThat("unchecking the 'exact search' checkbox should be reflected in a new history token", capturedHistoryTokenString.getValue(), is(inexactSearchToken.toTokenString())); + assertThat("unchecking the 'exact search' checkbox should be reflected in a new history token", + capturedHistoryTokenString.getValue(), is(inexactSearchToken.toTokenString())); } // TODO tests for check and uncheck case sensitive check @@ -276,15 +312,19 @@ public void documentSelectUpdatesHistoryToken() documentListPresenter.bind(); // simulate document click on second document - DocumentInfo docInfo = new DocumentInfo(new DocumentId(2222L, ""), "doc122", "second/path/", LocaleId.EN_US, new ContainerTranslationStatistics(), new AuditInfo(new Date(), "Translator"), new HashMap(), new AuditInfo(new Date(), "last translator")); + DocumentInfo docInfo = new DocumentInfo(new DocumentId(2222L, ""), "doc122", "second/path/", LocaleId.EN_US, + new ContainerTranslationStatistics(), new AuditInfo(new Date(), "Translator"), + new HashMap(), new AuditInfo(new Date(), "last translator")); documentListPresenter.fireDocumentSelection(docInfo); verify(mockHistory).newItem(capturedHistoryToken.capture()); verify(mockUserWorkspaceContext).setSelectedDoc(docInfo); HistoryToken newToken = capturedHistoryToken.getValue(); - assertThat("path of selected document should be set in history token", newToken.getDocumentPath(), is("second/path/doc122")); - assertThat("view in history token should change to individual document view when a new document is selected", newToken.getView(), is(MainView.Editor)); + assertThat("path of selected document should be set in history token", newToken.getDocumentPath(), + is("second/path/doc122")); + assertThat("view in history token should change to individual document view when a new document is selected", + newToken.getView(), is(MainView.Editor)); } @Test @@ -310,11 +350,14 @@ public void exactSearchMatchesExactOnly() ArrayList actualDocInfos = new ArrayList(); for (DocumentNode node : documentListPresenter.getSortedNodes()) { - assertThat("the data provider should have only documents that exactly match the current filter", node.getDocInfo(), isIn(expectedDocs)); + assertThat("the data provider should have only documents that exactly match the current filter", + node.getDocInfo(), isIn(expectedDocs)); actualDocInfos.add(node.getDocInfo()); } - assertThat("the data provider should have all documents that exactly match the filter", actualDocInfos, hasItems(expectedDocs.get(0))); - assertThat("the data provider list should contain exactly the number of documents matching the filter", documentListPresenter.getSortedNodes().size(), is(1)); + assertThat("the data provider should have all documents that exactly match the filter", actualDocInfos, + hasItems(expectedDocs.get(0))); + assertThat("the data provider list should contain exactly the number of documents matching the filter", + documentListPresenter.getSortedNodes().size(), is(1)); } // TODO test case sensitivity option @@ -343,11 +386,14 @@ public void commaSeparatedFilter() ArrayList actualDocInfos = new ArrayList(); for (DocumentNode node : documentListPresenter.getSortedNodes()) { - assertThat("the data provider should have only documents that match the current filter", node.getDocInfo(), isIn(expectedDocs)); + assertThat("the data provider should have only documents that match the current filter", node.getDocInfo(), + isIn(expectedDocs)); actualDocInfos.add(node.getDocInfo()); } - assertThat("the data provider should have all documents that match the filter", actualDocInfos, hasItems(expectedDocs.get(0), expectedDocs.get(1))); - assertThat("the data provider list should contain exactly the number of documents matching the filter", documentListPresenter.getSortedNodes().size(), is(2)); + assertThat("the data provider should have all documents that match the filter", actualDocInfos, + hasItems(expectedDocs.get(0), expectedDocs.get(1))); + assertThat("the data provider list should contain exactly the number of documents matching the filter", + documentListPresenter.getSortedNodes().size(), is(2)); } // TODO test case sensitive check updated from history @@ -377,10 +423,14 @@ public void getDocumentInfo() documentListPresenter.setDocuments(buildSampleDocumentArray()); DocumentInfo docInfo = documentListPresenter.getDocumentInfo(new DocumentId(1111L, "")); - assertThat(docInfo, is(equalTo(new DocumentInfo(new DocumentId(1111L, ""), "doc111", "first/path/", LocaleId.EN_US, new ContainerTranslationStatistics(), new AuditInfo(new Date(), "Translator"), new HashMap(), new AuditInfo(new Date(), "last translator"))))); + assertThat(docInfo, is(equalTo(new DocumentInfo(new DocumentId(1111L, ""), "doc111", "first/path/", + LocaleId.EN_US, new ContainerTranslationStatistics(), new AuditInfo(new Date(), "Translator"), + new HashMap(), new AuditInfo(new Date(), "last translator"))))); docInfo = documentListPresenter.getDocumentInfo(new DocumentId(3333L, "")); - assertThat(docInfo, is(equalTo(new DocumentInfo(new DocumentId(3333L, ""), "doc123", "third/path/", LocaleId.EN_US, new ContainerTranslationStatistics(), new AuditInfo(new Date(), "Translator"), new HashMap(), new AuditInfo(new Date(), "last translator"))))); + assertThat(docInfo, is(equalTo(new DocumentInfo(new DocumentId(3333L, ""), "doc123", "third/path/", + LocaleId.EN_US, new ContainerTranslationStatistics(), new AuditInfo(new Date(), "Translator"), + new HashMap(), new AuditInfo(new Date(), "last translator"))))); } @Test @@ -410,13 +460,14 @@ public void onUserConfigChangedEditor() @Test public void onWorkspaceContextUpdated() { - WorkspaceContextUpdateEvent event = new WorkspaceContextUpdateEvent(workplaceContextData(true, ProjectType.Gettext)); + WorkspaceContextUpdateEvent event = new WorkspaceContextUpdateEvent(workplaceContextData(true, + ProjectType.Gettext)); documentListPresenter.onWorkspaceContextUpdated(event); verify(mockDisplay).setEnableDownloadZip(documentListPresenter.isZipFileDownloadAllowed(event.getProjectType())); verify(mockDisplay).setDownloadZipButtonTitle(isA(String.class)); } - + @Test public void queryStats() { @@ -425,8 +476,8 @@ public void queryStats() HashMap nodes = new HashMap(); HashMap statMap = new HashMap(); HashMap lastTranslatedMap = new HashMap(); - - for(DocumentInfo docInfo: documentInfoList) + + for (DocumentInfo docInfo : documentInfoList) { DocumentNode node = new DocumentNode(docInfo); nodes.put(docInfo.getId(), node); @@ -434,24 +485,25 @@ public void queryStats() statMap.put(docInfo.getId(), new ContainerTranslationStatistics()); } documentListPresenter.setStatesForTest(sortedNodes, nodes); - + GetDocumentStatsResult result = new GetDocumentStatsResult(statMap, lastTranslatedMap); - + documentListPresenter.queryStats(); - + ArgumentCaptor actionCaptor = ArgumentCaptor.forClass(GetDocumentStats.class); ArgumentCaptor callbackCaptor = ArgumentCaptor.forClass(AsyncCallback.class); - + verify(mockDispatcher).execute(actionCaptor.capture(), callbackCaptor.capture()); - + AsyncCallback callback = callbackCaptor.getValue(); callback.onSuccess(result); - + verify(mockEventBus, times(3)).fireEvent(isA(DocumentStatsUpdatedEvent.class)); verify(mockEventBus, times(3)).fireEvent(isA(ProjectStatsUpdatedEvent.class)); } - private static HasWorkspaceContextUpdateData workplaceContextData(final boolean projectActive, final ProjectType projectType) + private static HasWorkspaceContextUpdateData workplaceContextData(final boolean projectActive, + final ProjectType projectType) { return new HasWorkspaceContextUpdateData() { @@ -468,7 +520,7 @@ public ProjectType getProjectType() } @Override - public Map getValidationInfoList() + public Map getValidationStates() { return null; } @@ -486,13 +538,19 @@ private ArrayList buildSampleDocumentArray() stats.addStats(new TranslationStatistics(unitCount, LocaleId.ES.toString())); stats.addStats(new TranslationStatistics(wordCount, LocaleId.ES.toString())); - DocumentInfo docInfo = new DocumentInfo(new DocumentId(1111L, ""), "matches", "no/filter", LocaleId.EN_US, stats, new AuditInfo(new Date(), "Translator"), new HashMap(), new AuditInfo(new Date(), "last translator")); + DocumentInfo docInfo = new DocumentInfo(new DocumentId(1111L, ""), "matches", "no/filter", LocaleId.EN_US, stats, + new AuditInfo(new Date(), "Translator"), new HashMap(), new AuditInfo(new Date(), + "last translator")); docList.add(docInfo); - docInfo = new DocumentInfo(new DocumentId(2222L, ""), "filter", "match/exact/", LocaleId.EN_US, stats, new AuditInfo(new Date(), "Translator"), new HashMap(), new AuditInfo(new Date(), "last translator")); + docInfo = new DocumentInfo(new DocumentId(2222L, ""), "filter", "match/exact/", LocaleId.EN_US, stats, + new AuditInfo(new Date(), "Translator"), new HashMap(), new AuditInfo(new Date(), + "last translator")); docList.add(docInfo); - docInfo = new DocumentInfo(new DocumentId(3333L, ""), "filter", "does/not/match/exact/", LocaleId.EN_US, stats, new AuditInfo(new Date(), "Translator"), new HashMap(), new AuditInfo(new Date(), "last translator")); + docInfo = new DocumentInfo(new DocumentId(3333L, ""), "filter", "does/not/match/exact/", LocaleId.EN_US, stats, + new AuditInfo(new Date(), "Translator"), new HashMap(), new AuditInfo(new Date(), + "last translator")); docList.add(docInfo); return docList; diff --git a/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/EditorOptionsPresenterTest.java b/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/EditorOptionsPresenterTest.java index 9fdbeea04a..a085dffec4 100644 --- a/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/EditorOptionsPresenterTest.java +++ b/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/EditorOptionsPresenterTest.java @@ -30,8 +30,8 @@ import org.zanata.webtrans.shared.model.DiffMode; import org.zanata.webtrans.shared.model.ProjectIterationId; import org.zanata.webtrans.shared.model.UserWorkspaceContext; +import org.zanata.webtrans.shared.model.ValidationAction.State; import org.zanata.webtrans.shared.model.ValidationId; -import org.zanata.webtrans.shared.model.ValidationInfo; import org.zanata.webtrans.shared.model.WorkspaceContext; import org.zanata.webtrans.shared.model.WorkspaceId; import org.zanata.webtrans.shared.rpc.HasWorkspaceContextUpdateData; @@ -133,7 +133,7 @@ public ProjectType getProjectType() } @Override - public Map getValidationInfoList() + public Map getValidationStates() { return null; } diff --git a/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/TargetContentsPresenterTest.java b/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/TargetContentsPresenterTest.java index d663d92713..1b89142709 100644 --- a/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/TargetContentsPresenterTest.java +++ b/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/TargetContentsPresenterTest.java @@ -20,9 +20,31 @@ */ package org.zanata.webtrans.client.presenter; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.mockito.Matchers.anyString; +import static org.mockito.Matchers.isA; +import static org.mockito.Mockito.atLeast; +import static org.mockito.Mockito.atLeastOnce; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.inOrder; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; +import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.when; +import static org.zanata.model.TestFixture.extractFromEvents; +import static org.zanata.model.TestFixture.makeTransUnit; + import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Map; + +import net.customware.gwt.presenter.client.EventBus; import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; @@ -49,49 +71,37 @@ import org.zanata.webtrans.client.events.UserConfigChangeEvent; import org.zanata.webtrans.client.events.WorkspaceContextUpdateEvent; import org.zanata.webtrans.client.resources.TableEditorMessages; +import org.zanata.webtrans.client.resources.ValidationMessages; import org.zanata.webtrans.client.service.UserOptionsService; -import org.zanata.webtrans.client.ui.HasUpdateValidationWarning; +import org.zanata.webtrans.client.ui.HasUpdateValidationMessage; import org.zanata.webtrans.client.ui.SaveAsApprovedConfirmationDisplay; import org.zanata.webtrans.client.ui.ToggleEditor; import org.zanata.webtrans.client.ui.UndoLink; +import org.zanata.webtrans.client.ui.ValidationWarningDisplay; import org.zanata.webtrans.client.view.TargetContentsDisplay; +import org.zanata.webtrans.server.locale.Gwti18nReader; +import org.zanata.webtrans.shared.model.DocumentInfo; import org.zanata.webtrans.shared.model.TransUnit; import org.zanata.webtrans.shared.model.TransUnitId; import org.zanata.webtrans.shared.model.UserWorkspaceContext; +import org.zanata.webtrans.shared.model.ValidationAction; +import org.zanata.webtrans.shared.model.ValidationId; +import org.zanata.webtrans.shared.validation.action.HtmlXmlTagValidation; import com.google.common.base.Optional; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.thirdparty.guava.common.collect.Maps; import com.google.inject.Provider; -import net.customware.gwt.presenter.client.EventBus; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.equalTo; -import static org.mockito.Matchers.anyString; -import static org.mockito.Matchers.isA; -import static org.mockito.Mockito.atLeast; -import static org.mockito.Mockito.atLeastOnce; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.inOrder; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoMoreInteractions; -import static org.mockito.Mockito.verifyZeroInteractions; -import static org.mockito.Mockito.when; -import static org.zanata.model.TestFixture.extractFromEvents; -import static org.zanata.model.TestFixture.makeTransUnit; - @Test(groups = { "unit-tests" }) public class TargetContentsPresenterTest { private TargetContentsPresenter presenter; - private static final List NEW_TARGETS = ImmutableList.builder().add("a").build(); - private static final List CACHED_TARGETS = ImmutableList.builder().add("b").build(); + private static final List NEW_TARGETS = ImmutableList. builder().add("a").build(); + private static final List CACHED_TARGETS = ImmutableList. builder().add("b").build(); // @formatter:off List currentPageRows = ImmutableList.builder() .add(makeTransUnit(2)) @@ -100,17 +110,22 @@ public class TargetContentsPresenterTest .build(); // @formatter:on - @Mock private EventBus eventBus; - @Mock private TableEditorMessages tableEditorMessages; - @Mock private SourceContentsPresenter sourceContentPresenter; + @Mock + private EventBus eventBus; + @Mock + private TableEditorMessages tableEditorMessages; + @Mock + private SourceContentsPresenter sourceContentPresenter; private UserWorkspaceContext userWorkspaceContext; - @Mock private TargetContentsDisplay display; + @Mock + private TargetContentsDisplay display; @Mock private ToggleEditor editor, editor2; private TransUnit selectedTU; // all event extends GwtEvent therefore captor will capture them all - @Captor private ArgumentCaptor eventCaptor; + @Captor + private ArgumentCaptor eventCaptor; @Mock private Provider displayProvider; @@ -126,6 +141,8 @@ public class TargetContentsPresenterTest private UserOptionsService userOptionsService; @Mock private SaveAsApprovedConfirmationDisplay saveAsApprovedConfirmation; + @Mock + private ValidationWarningDisplay validationWarning; @BeforeMethod public void beforeMethod() @@ -138,7 +155,7 @@ public void beforeMethod() userWorkspaceContext = TestFixture.userWorkspaceContext(); presenter = new TargetContentsPresenter(displayProvider, editorTranslators, eventBus, tableEditorMessages, sourceContentPresenter, userWorkspaceContext, editorKeyShortcuts, - historyPresenter, userOptionsService, saveAsApprovedConfirmation); + historyPresenter, userOptionsService, saveAsApprovedConfirmation, validationWarning); verify(eventBus).addHandler(UserConfigChangeEvent.TYPE, presenter); verify(eventBus).addHandler(RequestValidationEvent.getType(), presenter); @@ -148,6 +165,7 @@ public void beforeMethod() verify(eventBus).addHandler(TransUnitEditEvent.getType(), presenter); verify(eventBus).addHandler(WorkspaceContextUpdateEvent.getType(), presenter); verify(saveAsApprovedConfirmation).setListener(presenter); + verify(validationWarning).setListener(presenter); when(displayProvider.get()).thenReturn(display); presenter.showData(currentPageRows); @@ -171,7 +189,7 @@ public void canValidate() assertThat(event.getSourceContent(), equalTo("source")); assertThat(event.getTarget(), equalTo("target")); assertThat(event.isFireNotification(), equalTo(false)); - assertThat(event.getWidgetList(), Matchers.containsInAnyOrder(editor, display)); + assertThat(event.getWidgetList(), Matchers. containsInAnyOrder(editor, display)); } @Test @@ -214,7 +232,6 @@ public void canCopySource() verify(eventBus).fireEvent(isA(NotificationEvent.class)); } - @Test public void canGetNewTargets() { @@ -299,10 +316,12 @@ public void testOnInsertString() verify(editor).insertTextInCursorPosition("suggestion"); verify(eventBus, atLeastOnce()).fireEvent(eventCaptor.capture()); - NotificationEvent notificationEvent = TestFixture.extractFromEvents(eventCaptor.getAllValues(), NotificationEvent.class); + NotificationEvent notificationEvent = TestFixture.extractFromEvents(eventCaptor.getAllValues(), + NotificationEvent.class); MatcherAssert.assertThat(notificationEvent.getMessage(), Matchers.equalTo("copied")); - RunValidationEvent runValidationEvent = TestFixture.extractFromEvents(eventCaptor.getAllValues(), RunValidationEvent.class); + RunValidationEvent runValidationEvent = TestFixture.extractFromEvents(eventCaptor.getAllValues(), + RunValidationEvent.class); assertThat(runValidationEvent.getSourceContent(), equalTo("source content")); } @@ -319,10 +338,35 @@ public void testOnTransMemoryCopy() verify(editor).setTextAndValidate("target"); verify(eventBus, atLeastOnce()).fireEvent(eventCaptor.capture()); - NotificationEvent notificationEvent = TestFixture.extractFromEvents(eventCaptor.getAllValues(), NotificationEvent.class); + NotificationEvent notificationEvent = TestFixture.extractFromEvents(eventCaptor.getAllValues(), + NotificationEvent.class); MatcherAssert.assertThat(notificationEvent.getMessage(), Matchers.equalTo("copied")); } + @Test + public void willNotMoveToNextEntryIfTranslationHasError() + { + // Given: selected display and focus on first entry + ValidationMessages messages = mock(ValidationMessages.class); + + Map> errorMessage = Maps.newHashMap(); + errorMessage.put(new HtmlXmlTagValidation(ValidationId.HTML_XML, messages), new ArrayList()); + + selectedTU = currentPageRows.get(0); + when(display.getNewTargets()).thenReturn(NEW_TARGETS); + when(display.getCachedTargets()).thenReturn(CACHED_TARGETS); + when(display.getId()).thenReturn(selectedTU.getId()); + when(display.getEditors()).thenReturn(Lists.newArrayList(editor)); + when(display.getErrorMessages()).thenReturn(errorMessage); + presenter.setStatesForTesting(selectedTU.getId(), 0, display); + + // When: + presenter.saveAsApprovedAndMoveNext(selectedTU.getId()); + + // Then: + verify(validationWarning).center(selectedTU.getId(), NEW_TARGETS, errorMessage); + } + @Test public void willMoveToNextEntryIfItIsPluralAndNotAtLastEntry() { @@ -356,7 +400,8 @@ public void willSaveAndMoveToNextRow() // Then: verify(eventBus, atLeastOnce()).fireEvent(eventCaptor.capture()); - TransUnitSaveEvent saveEvent = TestFixture.extractFromEvents(eventCaptor.getAllValues(), TransUnitSaveEvent.class); + TransUnitSaveEvent saveEvent = TestFixture + .extractFromEvents(eventCaptor.getAllValues(), TransUnitSaveEvent.class); assertThat(saveEvent.getTransUnitId(), equalTo(selectedTU.getId())); assertThat(saveEvent.getTargets(), Matchers.equalTo(NEW_TARGETS)); assertThat(saveEvent.getStatus(), equalTo(ContentState.Translated)); @@ -394,7 +439,8 @@ public void canSavePendingChangesIfContentHasChanged() presenter.savePendingChangesIfApplicable(); // Then: - verify(eventBus).fireEvent(new TransUnitSaveEvent(NEW_TARGETS, ContentState.Approved, selectedTU.getId(), 99, CACHED_TARGETS)); + verify(eventBus).fireEvent( + new TransUnitSaveEvent(NEW_TARGETS, ContentState.Approved, selectedTU.getId(), 99, CACHED_TARGETS)); } @Test @@ -445,7 +491,7 @@ public void testIsDisplayButtons() { userWorkspaceContext.setHasEditTranslationAccess(false); userWorkspaceContext.setHasReviewAccess(false); - + boolean displayButtons = presenter.isDisplayButtons(); assertThat(displayButtons, Matchers.is(false)); @@ -461,7 +507,8 @@ public void testOnFocus() presenter.onEditorClicked(selectedTU.getId(), 1); verify(eventBus).fireEvent(eventCaptor.capture()); - TableRowSelectedEvent tableRowSelectedEvent = TestFixture.extractFromEvents(eventCaptor.getAllValues(), TableRowSelectedEvent.class); + TableRowSelectedEvent tableRowSelectedEvent = TestFixture.extractFromEvents(eventCaptor.getAllValues(), + TableRowSelectedEvent.class); assertThat(tableRowSelectedEvent.getSelectedId(), Matchers.equalTo(selectedTU.getId())); } @@ -488,7 +535,8 @@ public void onUserConfigChangeEvent() // Then: verify(display, times(3)).showButtons(false); - verify(saveAsApprovedConfirmation).setShowSaveApprovedWarning(userOptionsService.getConfigHolder().getState().isShowSaveApprovedWarning()); + verify(saveAsApprovedConfirmation).setShowSaveApprovedWarning( + userOptionsService.getConfigHolder().getState().isShowSaveApprovedWarning()); verify(display, times(3)).setEnableSpellCheck(false); } @@ -574,7 +622,7 @@ public void onWorkspaceContextUpdateEventBecomeReadOnly() WorkspaceContextUpdateEvent event = mock(WorkspaceContextUpdateEvent.class); when(event.isProjectActive()).thenReturn(false); userWorkspaceContext.setHasEditTranslationAccess(false); - + // When: presenter.onWorkspaceContextUpdated(event); @@ -771,7 +819,8 @@ public void canConfirmSavedOnSavingState() presenter.confirmSaved(selectedTU); - verify(display).updateCachedTargetsAndVersion(selectedTU.getTargets(), selectedTU.getVerNum(), selectedTU.getStatus()); + verify(display).updateCachedTargetsAndVersion(selectedTU.getTargets(), selectedTU.getVerNum(), + selectedTU.getStatus()); verify(display).setState(TargetContentsDisplay.EditingState.SAVED); } @@ -840,7 +889,8 @@ public void rejectTranslationWillForceComment() presenter.rejectTranslation(selectedTU.getId()); verify(eventBus).fireEvent(eventCaptor.capture()); - CommentBeforeSaveEvent commentBeforeSaveEvent = extractFromEvents(eventCaptor.getAllValues(), CommentBeforeSaveEvent.class); + CommentBeforeSaveEvent commentBeforeSaveEvent = extractFromEvents(eventCaptor.getAllValues(), + CommentBeforeSaveEvent.class); assertThat(commentBeforeSaveEvent.getSaveEvent().getStatus(), Matchers.equalTo(ContentState.Rejected)); } } diff --git a/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/TransFilterPresenterTest.java b/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/TransFilterPresenterTest.java index 80e7613b08..6d39803d4f 100644 --- a/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/TransFilterPresenterTest.java +++ b/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/TransFilterPresenterTest.java @@ -102,7 +102,7 @@ public void onRevealDisplay() @Test public void willSetOptionsBackOnFilterViewCancelEvent() { - FilterViewEvent event = new FilterViewEvent(true, true, true, true, true, false, true, null); + FilterViewEvent event = new FilterViewEvent(true, true, true, true, true, false, true); HistoryToken historyToken = new HistoryToken(); when(history.getHistoryToken()).thenReturn(historyToken); @@ -125,7 +125,7 @@ public void willSetOptionsBackOnFilterViewCancelEvent() @Test public void willDoNothingIfItsNotCancelEvent() { - FilterViewEvent cancelEvent = new FilterViewEvent(true, true, true, true, true, false, false, null); + FilterViewEvent cancelEvent = new FilterViewEvent(true, true, true, true, true, false, false); presenter.onFilterView(cancelEvent); diff --git a/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/TransMemoryMergePresenterTest.java b/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/TransMemoryMergePresenterTest.java index d177ad3072..0330492366 100644 --- a/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/TransMemoryMergePresenterTest.java +++ b/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/TransMemoryMergePresenterTest.java @@ -32,6 +32,7 @@ import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import org.zanata.common.ContentState; +import org.zanata.model.TestFixture; import org.zanata.webtrans.client.events.NotificationEvent; import org.zanata.webtrans.client.resources.UiMessages; import org.zanata.webtrans.client.resources.WebTransMessages; @@ -40,9 +41,7 @@ import org.zanata.webtrans.client.ui.InlineLink; import org.zanata.webtrans.client.ui.TransMemoryMergePopupPanelDisplay; import org.zanata.webtrans.client.ui.UndoLink; -import org.zanata.webtrans.shared.model.TransUnit; -import org.zanata.webtrans.shared.model.TransUnitUpdateInfo; -import org.zanata.webtrans.shared.model.TransUnitUpdateRequest; +import org.zanata.webtrans.shared.model.*; import org.zanata.webtrans.shared.rpc.MergeRule; import org.zanata.webtrans.shared.rpc.MergeOptions; import org.zanata.webtrans.shared.rpc.TransMemoryMerge; @@ -55,6 +54,7 @@ import net.customware.gwt.presenter.client.EventBus; import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.Matchers.any; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; @@ -223,6 +223,7 @@ public void onRequestTMMergeSuccessWithTranslationWillCreateUndoLinkAndNotify() makeTransUnit(4, ContentState.NeedReview)); mockCurrentPageToReturn(currentPageRows); UndoLink undoLink = mock(UndoLink.class); + DocumentId documentId = new DocumentId(new Long(0), ""); when(undoLinkProvider.get()).thenReturn(undoLink); // When: @@ -235,11 +236,11 @@ public void onRequestTMMergeSuccessWithTranslationWillCreateUndoLinkAndNotify() AsyncCallback callback = callbackCaptor.getValue(); // rpc call success and result has some updated info UpdateTransUnitResult result = new UpdateTransUnitResult(); - result.addUpdateResult(new TransUnitUpdateInfo(true, true, null, currentPageRows.get(0), 0, 0, ContentState.Approved)); + result.addUpdateResult(new TransUnitUpdateInfo(true, true, documentId, currentPageRows.get(0), 0, 0, ContentState.Approved)); // add an unsuccessful result - result.addUpdateResult(new TransUnitUpdateInfo(false, true, null, currentPageRows.get(1), 0, 0, ContentState.Approved)); - result.addUpdateResult(new TransUnitUpdateInfo(true, true, null, currentPageRows.get(2), 0, 0, ContentState.Approved)); - result.addUpdateResult(new TransUnitUpdateInfo(true, true, null, currentPageRows.get(3), 0, 0, ContentState.Approved)); + result.addUpdateResult(new TransUnitUpdateInfo(false, true, documentId, currentPageRows.get(1), 0, 0, ContentState.Approved)); + result.addUpdateResult(new TransUnitUpdateInfo(true, true, documentId, currentPageRows.get(2), 0, 0, ContentState.Approved)); + result.addUpdateResult(new TransUnitUpdateInfo(true, true, documentId, currentPageRows.get(3), 0, 0, ContentState.Approved)); callback.onSuccess(result); // Then: diff --git a/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/TransUnitsTablePresenterTest.java b/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/TransUnitsTablePresenterTest.java index 88c61c5ebf..2998bec294 100644 --- a/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/TransUnitsTablePresenterTest.java +++ b/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/TransUnitsTablePresenterTest.java @@ -129,7 +129,15 @@ public void onGoToPage() @Test public void onFilterViewEventDoNothingIfItsCancel() { - presenter.onFilterView(new FilterViewEvent(true, true, true, true, true, false, true, null)); + boolean viewTranslated = true; + boolean viewFuzzy = true; + boolean viewUntranslated = true; + boolean viewApproved = true; + boolean viewRejected = true; + boolean viewHasError = false; + boolean cancelFilter = true; + + presenter.onFilterView(new FilterViewEvent(viewTranslated, viewFuzzy, viewUntranslated, viewApproved, viewRejected, viewHasError, cancelFilter)); verifyNoMoreInteractions(eventBus, display, targetContentsPresenter); } @@ -141,7 +149,7 @@ public void onFilterViewEventWillShowConfirmationIfHasUnsavedContent() when(targetContentsPresenter.currentEditorContentHasChanged()).thenReturn(true); // When: not a cancel event - presenter.onFilterView(new FilterViewEvent(true, false, true, false, false, false, false, null)); + presenter.onFilterView(new FilterViewEvent(true, false, true, false, false, false, false)); // Then: verify(display).showFilterConfirmation(); @@ -152,7 +160,7 @@ public void onFilterViewEventWillHideConfirmationAndDoFilter() { // Given: current edtior hasn't changed when(targetContentsPresenter.currentEditorContentHasChanged()).thenReturn(false); - FilterViewEvent event = new FilterViewEvent(true, false, true, false, false, false, false, null); + FilterViewEvent event = new FilterViewEvent(true, false, true, false, false, false, false); // When: presenter.onFilterView(event); @@ -169,7 +177,7 @@ public void onSaveChangeAndFilter() presenter.saveAsTranslatedAndFilter(); - verify(targetContentsPresenter).saveCurrent(ContentState.Translated); + verify(targetContentsPresenter).saveCurrentIfValid(ContentState.Translated); verify(display).hideFilterConfirmation(); verify(navigationService).execute(Mockito.isA(FilterViewEvent.class)); } @@ -181,7 +189,7 @@ public void onSaveAsFuzzyAndFilter() presenter.saveAsFuzzyAndFilter(); - verify(targetContentsPresenter).saveCurrent(ContentState.NeedReview); + verify(targetContentsPresenter).saveCurrentIfValid(ContentState.NeedReview); verify(display).hideFilterConfirmation(); verify(navigationService).execute(Mockito.isA(FilterViewEvent.class)); } diff --git a/zanata-war/src/test/java/org/zanata/webtrans/client/rpc/DummyActivateWorkspaceCommand.java b/zanata-war/src/test/java/org/zanata/webtrans/client/rpc/DummyActivateWorkspaceCommand.java index 9fb5c701f0..9a71b64e3d 100644 --- a/zanata-war/src/test/java/org/zanata/webtrans/client/rpc/DummyActivateWorkspaceCommand.java +++ b/zanata-war/src/test/java/org/zanata/webtrans/client/rpc/DummyActivateWorkspaceCommand.java @@ -15,8 +15,8 @@ import org.zanata.webtrans.shared.model.PersonId; import org.zanata.webtrans.shared.model.UserWorkspaceContext; import org.zanata.webtrans.shared.model.ValidationAction; +import org.zanata.webtrans.shared.model.ValidationAction.State; import org.zanata.webtrans.shared.model.ValidationId; -import org.zanata.webtrans.shared.model.ValidationInfo; import org.zanata.webtrans.shared.model.WorkspaceContext; import org.zanata.webtrans.shared.model.WorkspaceRestrictions; import org.zanata.webtrans.shared.rpc.ActivateWorkspaceAction; @@ -52,14 +52,14 @@ public void execute() ValidationFactory validationFactory = new ValidationFactory(null); Map validationMap = validationFactory.getAllValidationActions(); - Map validationInfoList = new HashMap(); + Map validationStates = new HashMap(); for (ValidationAction action : validationMap.values()) { - validationInfoList.put(action.getId(), action.getValidationInfo()); + validationStates.put(action.getId(), action.getState()); } - callback.onSuccess(new ActivateWorkspaceResult(userWorkspaceContext, identity, new UserConfigHolder().getState(), validationInfoList)); + callback.onSuccess(new ActivateWorkspaceResult(userWorkspaceContext, identity, new UserConfigHolder().getState(), validationStates)); Log.info("EXIT DummyActivateWorkspaceCommand.execute()"); } } diff --git a/zanata-war/src/test/java/org/zanata/webtrans/client/rpc/DummyUpdateTransUnitCommand.java b/zanata-war/src/test/java/org/zanata/webtrans/client/rpc/DummyUpdateTransUnitCommand.java index dcb98f11d9..93d1738b7e 100644 --- a/zanata-war/src/test/java/org/zanata/webtrans/client/rpc/DummyUpdateTransUnitCommand.java +++ b/zanata-war/src/test/java/org/zanata/webtrans/client/rpc/DummyUpdateTransUnitCommand.java @@ -3,6 +3,8 @@ */ package org.zanata.webtrans.client.rpc; +import java.util.ArrayList; + import org.zanata.common.ContentState; import org.zanata.common.LocaleId; import org.zanata.webtrans.shared.model.DocumentId; diff --git a/zanata-war/src/test/java/org/zanata/webtrans/client/service/TransUnitSaveServiceTest.java b/zanata-war/src/test/java/org/zanata/webtrans/client/service/TransUnitSaveServiceTest.java index be3c415c62..17b338451a 100644 --- a/zanata-war/src/test/java/org/zanata/webtrans/client/service/TransUnitSaveServiceTest.java +++ b/zanata-war/src/test/java/org/zanata/webtrans/client/service/TransUnitSaveServiceTest.java @@ -9,6 +9,9 @@ import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; + +import java.util.List; + import net.customware.gwt.presenter.client.EventBus; import org.hamcrest.Matchers; @@ -183,7 +186,7 @@ public void onRPCSuccessAndSaveReturnSuccess() AsyncCallback callback = resultCaptor.getValue(); TransUnit updatedTU = TestFixture.makeTransUnit(TRANS_UNIT_ID.getId(), ContentState.NeedReview, "new content"); - UpdateTransUnitResult result = result(true, updatedTU, ContentState.NeedReview); + UpdateTransUnitResult result = result(true, updatedTU, ContentState.NeedReview, null); // When: callback.onSuccess(result); @@ -224,7 +227,7 @@ public void onRPCSuccessAndThereIsPendingSave() AsyncCallback callback = resultCaptor.getValue(); TransUnit updatedTU = TestFixture.makeTransUnit(TRANS_UNIT_ID.getId(), ContentState.NeedReview, "new content"); - UpdateTransUnitResult result = result(true, updatedTU, ContentState.NeedReview); + UpdateTransUnitResult result = result(true, updatedTU, ContentState.NeedReview, null); // When: callback.onSuccess(result); @@ -240,6 +243,7 @@ public void onRPCSuccessAndThereIsPendingSave() public void onPRCSuccessButSaveUnsuccessfulInResult() { // Given: + String errorMessage = "unsuccessful save"; TransUnit old = TestFixture.makeTransUnit(TRANS_UNIT_ID.getId(), ContentState.NeedReview, "old content"); when(navigationService.getByIdOrNull(TRANS_UNIT_ID)).thenReturn(old); @@ -251,11 +255,11 @@ public void onPRCSuccessButSaveUnsuccessfulInResult() // on save success // Given: result comes back but saving operation failed - when(messages.notifyUpdateFailed("id " + TRANS_UNIT_ID)).thenReturn("update failed"); + when(messages.notifyUpdateFailed("id " + TRANS_UNIT_ID, errorMessage)).thenReturn("update failed"); AsyncCallback callback = resultCaptor.getValue(); TransUnit updatedTU = TestFixture.makeTransUnit(TRANS_UNIT_ID.getId(), ContentState.NeedReview, "new content"); - UpdateTransUnitResult result = result(false, updatedTU, ContentState.NeedReview); + UpdateTransUnitResult result = result(false, updatedTU, ContentState.NeedReview, errorMessage); // When: callback.onSuccess(result); @@ -275,8 +279,10 @@ public void onPRCSuccessButSaveUnsuccessfulInResult() public void onPRCFailure() { // Given: + String errorMessage = "doh"; TransUnit old = TestFixture.makeTransUnit(TRANS_UNIT_ID.getId(), ContentState.NeedReview, "old content"); when(navigationService.getByIdOrNull(TRANS_UNIT_ID)).thenReturn(old); + // When: save as fuzzy TransUnitSaveEvent saveEvent = event("new content", ContentState.NeedReview, TRANS_UNIT_ID, VER_NUM, "old content"); @@ -286,8 +292,8 @@ public void onPRCFailure() // Then: will reset value back AsyncCallback callback = resultCaptor.getValue(); - when(messages.notifyUpdateFailed("id " + TRANS_UNIT_ID)).thenReturn("update failed"); - callback.onFailure(new RuntimeException("doh")); + 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 notificationEventCaptor = ArgumentCaptor.forClass(NotificationEvent.class); verify(targetContentsPresenter).setEditingState(TRANS_UNIT_ID, TargetContentsDisplay.EditingState.UNSAVED); @@ -298,8 +304,8 @@ public void onPRCFailure() assertThat(event.getInlineLink(), Matchers.sameInstance(goToLink)); } - private static UpdateTransUnitResult result(boolean success, TransUnit transUnit, ContentState previousState) + 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)); + return new UpdateTransUnitResult(new TransUnitUpdateInfo(success, true, new DocumentId(new Long(1), ""), transUnit, 9, VER_NUM, previousState, errorMessage)); } } diff --git a/zanata-war/src/test/java/org/zanata/webtrans/client/service/ValidationServiceTest.java b/zanata-war/src/test/java/org/zanata/webtrans/client/service/ValidationServiceTest.java index 6ed813c53c..e76f4f49f6 100644 --- a/zanata-war/src/test/java/org/zanata/webtrans/client/service/ValidationServiceTest.java +++ b/zanata-war/src/test/java/org/zanata/webtrans/client/service/ValidationServiceTest.java @@ -22,16 +22,17 @@ import org.zanata.webtrans.client.events.RequestValidationEvent; import org.zanata.webtrans.client.events.RunValidationEvent; import org.zanata.webtrans.client.presenter.UserConfigHolder; -import org.zanata.webtrans.client.resources.TableEditorMessages; import org.zanata.webtrans.client.resources.ValidationMessages; -import org.zanata.webtrans.client.ui.HasUpdateValidationWarning; +import org.zanata.webtrans.client.ui.HasUpdateValidationMessage; import org.zanata.webtrans.server.locale.Gwti18nReader; import org.zanata.webtrans.shared.model.ValidationAction; +import org.zanata.webtrans.shared.model.ValidationAction.State; import org.zanata.webtrans.shared.model.ValidationId; -import org.zanata.webtrans.shared.model.ValidationInfo; +import org.zanata.webtrans.shared.model.ValidationDisplayRules; import org.zanata.webtrans.shared.validation.ValidationFactory; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; /** * @author Patrick Huang pahuang@redhat.com @@ -43,12 +44,11 @@ public class ValidationServiceTest private ValidationService service; @Mock private EventBus eventBus; - @Mock - private TableEditorMessages messages; private ValidationMessages validationMessages; + @Mock - private HasUpdateValidationWarning validationMessagePanel; + private HasUpdateValidationMessage validationMessagePanel; @Mock private UserConfigHolder configHolder; @@ -60,35 +60,22 @@ public void beforeMethod() throws IOException validationMessages = Gwti18nReader.create(ValidationMessages.class); - service = new ValidationService(eventBus, messages, validationMessages, configHolder); + service = new ValidationService(eventBus, validationMessages, configHolder); ValidationFactory validationFactory = new ValidationFactory(validationMessages); Collection validationList = validationFactory.getAllValidationActions().values(); - Map validationInfoList = new HashMap(); + Map validationStatesMap = new HashMap(); for (ValidationAction action : validationList) { - action.getValidationInfo().setEnabled(true); - validationInfoList.put(action.getId(), action.getValidationInfo()); + action.getRules().setEnabled(true); + validationStatesMap.put(action.getId(), action.getState()); } - service.setValidationRules(validationInfoList); + service.setValidationRules(validationStatesMap); - when(messages.notifyValidationError()).thenReturn("validation error"); verify(eventBus).addHandler(RunValidationEvent.getType(), service); } - @Test - public void onValidate() - { - RunValidationEvent event = new RunValidationEvent("source", "target %s", false); - event.addWidget(validationMessagePanel); - ArrayList errors = Lists.newArrayList(validationMessages.varsAdded(Arrays.asList("%s")), validationMessages.varsAdded(Arrays.asList("%s"))); - - service.onValidate(event); - - verify(validationMessagePanel).updateValidationWarning(errors); - } - @Test public void canUpdateValidatorStatus() { @@ -96,7 +83,7 @@ public void canUpdateValidatorStatus() ValidationAction validationAction = service.getValidationMap().get(VAL_KEY); - assertThat(validationAction.getValidationInfo().isEnabled(), Matchers.equalTo(false)); + assertThat(validationAction.getRules().isEnabled(), Matchers.equalTo(false)); verify(eventBus).fireEvent(RequestValidationEvent.EVENT); } diff --git a/zanata-war/src/test/java/org/zanata/webtrans/server/TranslationWorkspaceManagerImplTest.java b/zanata-war/src/test/java/org/zanata/webtrans/server/TranslationWorkspaceManagerImplTest.java index b2447b1f92..b965262e14 100644 --- a/zanata-war/src/test/java/org/zanata/webtrans/server/TranslationWorkspaceManagerImplTest.java +++ b/zanata-war/src/test/java/org/zanata/webtrans/server/TranslationWorkspaceManagerImplTest.java @@ -180,7 +180,7 @@ public void testProjectIterationUpdate() throws Exception hLocale.setActive(true); when(localeServiceImpl.getByLocaleId(workspaceId.getLocaleId())).thenReturn(hLocale); - when(validationServiceImpl.getValidationObject(projectIteration)).thenReturn(new ArrayList()); + when(validationServiceImpl.getValidationActions(projectIteration.getProject().getSlug(), projectIteration.getSlug())).thenReturn(new ArrayList()); TranslationWorkspaceManagerImpl spy = spy(manager); doReturn(mockWorkspace).when(spy).createWorkspace(workspaceId); diff --git a/zanata-war/src/test/java/org/zanata/webtrans/server/rpc/ActivateWorkspaceHandlerTest.java b/zanata-war/src/test/java/org/zanata/webtrans/server/rpc/ActivateWorkspaceHandlerTest.java index 531dc37e40..76bbb94690 100644 --- a/zanata-war/src/test/java/org/zanata/webtrans/server/rpc/ActivateWorkspaceHandlerTest.java +++ b/zanata-war/src/test/java/org/zanata/webtrans/server/rpc/ActivateWorkspaceHandlerTest.java @@ -45,8 +45,8 @@ import org.zanata.webtrans.shared.model.ProjectIterationId; import org.zanata.webtrans.shared.model.UserWorkspaceContext; import org.zanata.webtrans.shared.model.ValidationAction; +import org.zanata.webtrans.shared.model.ValidationAction.State; import org.zanata.webtrans.shared.model.ValidationId; -import org.zanata.webtrans.shared.model.ValidationInfo; import org.zanata.webtrans.shared.model.WorkspaceContext; import org.zanata.webtrans.shared.model.WorkspaceId; import org.zanata.webtrans.shared.rpc.ActivateWorkspaceAction; @@ -146,13 +146,13 @@ public void testExecute() throws Exception when(workspaceContext.getWorkspaceId()).thenReturn(workspaceId); Collection validationList = validationFactory.getAllValidationActions().values(); - Map validationInfoList = new HashMap(); + Map validationStates = new HashMap(); for (ValidationAction valAction : validationList) { - validationInfoList.put(valAction.getId(), valAction.getValidationInfo()); + validationStates.put(valAction.getId(), valAction.getState()); } - GetValidationRulesResult validationResult = new GetValidationRulesResult(validationInfoList); + GetValidationRulesResult validationResult = new GetValidationRulesResult(validationStates); when(getValidationRulesHandler.execute(isA(GetValidationRulesAction.class), any(ExecutionContext.class))).thenReturn(validationResult); ActivateWorkspaceResult result = handler.execute(action, null); diff --git a/zanata-war/src/test/java/org/zanata/webtrans/server/rpc/RevertTransUnitUpdatesHandlerTest.java b/zanata-war/src/test/java/org/zanata/webtrans/server/rpc/RevertTransUnitUpdatesHandlerTest.java index 68d7ca10db..21cde9e849 100644 --- a/zanata-war/src/test/java/org/zanata/webtrans/server/rpc/RevertTransUnitUpdatesHandlerTest.java +++ b/zanata-war/src/test/java/org/zanata/webtrans/server/rpc/RevertTransUnitUpdatesHandlerTest.java @@ -57,7 +57,8 @@ public class RevertTransUnitUpdatesHandlerTest public void setUp() throws Exception { MockitoAnnotations.initMocks(this); - TransUnitTransformer transUnitTransformer = SeamAutowire.instance().use("resourceUtils", new ResourceUtils()).autowire(TransUnitTransformer.class); + TransUnitTransformer transUnitTransformer = SeamAutowire.instance().use("resourceUtils", new ResourceUtils()) + .autowire(TransUnitTransformer.class); // @formatter:off handler = SeamAutowire.instance() .use("translationServiceImpl", translationServiceImpl) @@ -71,13 +72,16 @@ public void setUp() throws Exception @Test public void testExecute() throws Exception { - List updatesToRevert = Lists.newArrayList(new TransUnitUpdateInfo(true, true, new DocumentId(new Long(1), ""), TestFixture.makeTransUnit(1), 0, 0, ContentState.Approved)); + List updatesToRevert = Lists.newArrayList(new TransUnitUpdateInfo(true, true, + new DocumentId(new Long(1), ""), TestFixture.makeTransUnit(1), 0, 0, ContentState.Approved)); RevertTransUnitUpdates action = new RevertTransUnitUpdates(updatesToRevert); - when(securityServiceImpl.checkPermission(action, SecurityService.TranslationAction.MODIFY)).thenReturn(checkResult); + when(securityServiceImpl.checkPermission(action, SecurityService.TranslationAction.MODIFY)).thenReturn( + checkResult); when(checkResult.getLocale()).thenReturn(new HLocale(LocaleId.EN_US)); when(checkResult.getWorkspace()).thenReturn(translationWorkspace); TranslationService.TranslationResult translationResult = mockTranslationResult(ContentState.NeedReview, 0); - when(translationServiceImpl.revertTranslations(LocaleId.EN_US, action.getUpdatesToRevert())).thenReturn(Lists.newArrayList(translationResult)); + when(translationServiceImpl.revertTranslations(LocaleId.EN_US, action.getUpdatesToRevert())).thenReturn( + Lists.newArrayList(translationResult)); UpdateTransUnitResult result = handler.execute(action, null); @@ -91,7 +95,8 @@ public void testExecute() throws Exception assertThat(transUnitUpdated.getUpdateType(), Matchers.equalTo(TransUnitUpdated.UpdateType.Revert)); } - private static TranslationService.TranslationResult mockTranslationResult(ContentState baseContentState, int baseVersionNum) + private static TranslationService.TranslationResult mockTranslationResult(ContentState baseContentState, + int baseVersionNum) { TranslationService.TranslationResult translationResult = mock(TranslationService.TranslationResult.class); when(translationResult.isTargetChanged()).thenReturn(true); @@ -102,7 +107,8 @@ private static TranslationService.TranslationResult mockTranslationResult(Conten HDocument spy = spy(new HDocument()); when(spy.getId()).thenReturn(1L); hTextFlow.setDocument(spy); - when(translationResult.getTranslatedTextFlowTarget()).thenReturn(new HTextFlowTarget(hTextFlow, new HLocale(LocaleId.DE))); + when(translationResult.getTranslatedTextFlowTarget()).thenReturn( + new HTextFlowTarget(hTextFlow, new HLocale(LocaleId.DE))); return translationResult; } diff --git a/zanata-war/src/test/java/org/zanata/webtrans/server/rpc/TransMemoryMergeHandlerTest.java b/zanata-war/src/test/java/org/zanata/webtrans/server/rpc/TransMemoryMergeHandlerTest.java index c86de0947e..c1470cb9a9 100644 --- a/zanata-war/src/test/java/org/zanata/webtrans/server/rpc/TransMemoryMergeHandlerTest.java +++ b/zanata-war/src/test/java/org/zanata/webtrans/server/rpc/TransMemoryMergeHandlerTest.java @@ -21,10 +21,22 @@ package org.zanata.webtrans.server.rpc; +import static com.google.common.collect.Lists.newArrayList; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.Matchers.eq; +import static org.mockito.Matchers.same; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.when; +import static org.zanata.webtrans.shared.model.TransMemoryResultItem.MatchType; +import static org.zanata.webtrans.shared.rpc.HasSearchType.SearchType.FUZZY_PLURAL; + import java.util.ArrayList; import java.util.Date; import java.util.List; +import net.customware.gwt.dispatch.shared.ActionException; + import org.hamcrest.Matchers; import org.mockito.ArgumentCaptor; import org.mockito.Captor; @@ -50,25 +62,14 @@ import org.zanata.webtrans.shared.model.TransUnitId; import org.zanata.webtrans.shared.model.TransUnitUpdateInfo; import org.zanata.webtrans.shared.model.TransUnitUpdateRequest; -import org.zanata.webtrans.shared.rpc.MergeRule; import org.zanata.webtrans.shared.rpc.MergeOptions; +import org.zanata.webtrans.shared.rpc.MergeRule; import org.zanata.webtrans.shared.rpc.TransMemoryMerge; import org.zanata.webtrans.shared.rpc.TransUnitUpdated; import org.zanata.webtrans.shared.rpc.UpdateTransUnitResult; import com.google.common.collect.Lists; -import net.customware.gwt.dispatch.shared.ActionException; -import static com.google.common.collect.Lists.newArrayList; -import static org.hamcrest.MatcherAssert.*; -import static org.mockito.Matchers.eq; -import static org.mockito.Matchers.same; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; -import static org.mockito.Mockito.when; -import static org.zanata.webtrans.shared.model.TransMemoryResultItem.MatchType; -import static org.zanata.webtrans.shared.rpc.HasSearchType.SearchType.FUZZY_PLURAL; - /** * @author Patrick Huang pahuang@redhat.com */ @@ -102,7 +103,7 @@ public class TransMemoryMergeHandlerTest private static ArrayList tmTarget = newArrayList("tm target"); @BeforeMethod - public void beforeMethod() + public void beforeMethod() { MockitoAnnotations.initMocks(this); // @formatter:off @@ -120,7 +121,7 @@ public void beforeMethod() private TransMemoryMerge prepareActionAndMockSecurityService(int threshold, long... tranUnitIds) throws NoSuchWorkspaceException { - return prepareActionAndMockSecurityService(threshold, true, tranUnitIds); + return prepareActionAndMockSecurityService(threshold, true, tranUnitIds); } private TransMemoryMerge prepareActionAndMockSecurityService(int threshold, boolean acceptImportedTMResults, long... tranUnitIds) @@ -166,7 +167,6 @@ private static TransMemoryDetails tmDetail() return new TransMemoryDetails("", "", "project a", "master", "pot/msg.pot", "resId", null, null, null, null); } - @Test public void canAutoTranslateIfHasTMAboveThreshold() throws ActionException { @@ -240,14 +240,14 @@ public void willNotTranslateIfNoTM() throws ActionException // Given: there is no TM results returned for text flow id 1 TransMemoryQuery tmQuery = new TransMemoryQuery(hTextFlow.getContents(), FUZZY_PLURAL); when(getTransMemoryHandler.searchTransMemory(hLocale, tmQuery, sourceLocale.getLocaleId())) - .thenReturn(Lists.newArrayList()); + .thenReturn(Lists. newArrayList()); // When: execute the action UpdateTransUnitResult result = handler.execute(action, null); // Then: we should have EMPTY trans unit update request verifyZeroInteractions(updateTransUnitHandler); - assertThat(result.getUpdateInfoList(), Matchers.empty()); + assertThat(result.getUpdateInfoList(), Matchers. empty()); } @Test @@ -269,13 +269,13 @@ public void willNotTranslateIfTMBelowThreshold() throws ActionException // Then: we should have EMPTY trans unit update request verifyZeroInteractions(updateTransUnitHandler); - assertThat(result.getUpdateInfoList(), Matchers.empty()); + assertThat(result.getUpdateInfoList(), Matchers. empty()); } @Test public void willIgnoreApprovedTextFlows() throws ActionException { - // Given: text flow id 1 is not untranslated + // Given: text flow id 1 is not untranslated final long transUnitId = 1L; TransMemoryMerge action = prepareActionAndMockSecurityService(80, transUnitId); @@ -287,7 +287,7 @@ public void willIgnoreApprovedTextFlows() throws ActionException // Then: we should have EMPTY trans unit update request verifyZeroInteractions(getTransMemoryHandler, getTransMemoryDetailsHandler, updateTransUnitHandler); - assertThat(result.getUpdateInfoList(), Matchers.empty()); + assertThat(result.getUpdateInfoList(), Matchers. empty()); } @Test @@ -319,7 +319,7 @@ public void willNotTranslateIfDifferentMetaDataOptionSetToSkip() throws ActionEx // Then: we should have EMPTY trans unit update request verifyZeroInteractions(updateTransUnitHandler); - assertThat(result.getUpdateInfoList(), Matchers.empty()); + assertThat(result.getUpdateInfoList(), Matchers. empty()); } @Test @@ -348,8 +348,7 @@ public void canHandleMultipleTextFlows() throws ActionException when(getTransMemoryHandler.searchTransMemory(hLocale, new TransMemoryQuery(textFlow100TM.getContents(), FUZZY_PLURAL), sourceLocale.getLocaleId())).thenReturn(newArrayList(tm100)); when(getTransMemoryHandler.searchTransMemory(hLocale, new TransMemoryQuery(textFLow90TM.getContents(), FUZZY_PLURAL), sourceLocale.getLocaleId())).thenReturn(newArrayList(tm90)); when(getTransMemoryHandler.searchTransMemory(hLocale, new TransMemoryQuery(textFlow80TM.getContents(), FUZZY_PLURAL), sourceLocale.getLocaleId())).thenReturn(newArrayList(tm80)); - when(getTransMemoryHandler.searchTransMemory(hLocale, new TransMemoryQuery(textFlowNoTM.getContents(), FUZZY_PLURAL), sourceLocale.getLocaleId())).thenReturn(Lists.newArrayList()); - + when(getTransMemoryHandler.searchTransMemory(hLocale, new TransMemoryQuery(textFlowNoTM.getContents(), FUZZY_PLURAL), sourceLocale.getLocaleId())).thenReturn(Lists. newArrayList()); when(textFlowDAO.findById(tmResultSource.getId(), false)).thenReturn(tmResultSource); // Given: tm detail of text flow id 11 @@ -372,7 +371,7 @@ public void doubleToInt() double oneHundred = 100.00000001D; assertThat(oneHundred <= 100, Matchers.is(false)); - assertThat((int)oneHundred <= 100, Matchers.is(true)); + assertThat((int) oneHundred <= 100, Matchers.is(true)); } @@ -448,6 +447,6 @@ public void willIgnoreImportedTMResults() throws Exception // Then: We should not have anything auto-translated // Then: we should have EMPTY trans unit update request verifyZeroInteractions(updateTransUnitHandler); - assertThat(result.getUpdateInfoList(), Matchers.empty()); + assertThat(result.getUpdateInfoList(), Matchers. empty()); } } diff --git a/zanata-war/src/test/java/org/zanata/webtrans/shared/validation/HtmlXmlTagValidationTests.java b/zanata-war/src/test/java/org/zanata/webtrans/shared/validation/HtmlXmlTagValidationTests.java index 208f55638f..ce3773842d 100644 --- a/zanata-war/src/test/java/org/zanata/webtrans/shared/validation/HtmlXmlTagValidationTests.java +++ b/zanata-war/src/test/java/org/zanata/webtrans/shared/validation/HtmlXmlTagValidationTests.java @@ -56,7 +56,7 @@ public void init() throws IOException messages = Gwti18nReader.create(ValidationMessages.class); htmlXmlTagValidation = new HtmlXmlTagValidation(ValidationId.HTML_XML, messages); - htmlXmlTagValidation.getValidationInfo().setEnabled(true); + htmlXmlTagValidation.getRules().setEnabled(true); } @Test diff --git a/zanata-war/src/test/java/org/zanata/webtrans/shared/validation/JavaVariablesValidationTest.java b/zanata-war/src/test/java/org/zanata/webtrans/shared/validation/JavaVariablesValidationTest.java index 7a46283c9d..9ce0475fe0 100644 --- a/zanata-war/src/test/java/org/zanata/webtrans/shared/validation/JavaVariablesValidationTest.java +++ b/zanata-war/src/test/java/org/zanata/webtrans/shared/validation/JavaVariablesValidationTest.java @@ -56,7 +56,7 @@ public void init() throws IOException messages = Gwti18nReader.create(ValidationMessages.class); javaVariablesValidation = new JavaVariablesValidation(ValidationId.JAVA_VARIABLES, messages); - javaVariablesValidation.getValidationInfo().setEnabled(true); + javaVariablesValidation.getRules().setEnabled(true); } @Test diff --git a/zanata-war/src/test/java/org/zanata/webtrans/shared/validation/NewlineLeadTrailValidationTests.java b/zanata-war/src/test/java/org/zanata/webtrans/shared/validation/NewlineLeadTrailValidationTests.java index 26dd87a292..b0bc58f4bc 100644 --- a/zanata-war/src/test/java/org/zanata/webtrans/shared/validation/NewlineLeadTrailValidationTests.java +++ b/zanata-war/src/test/java/org/zanata/webtrans/shared/validation/NewlineLeadTrailValidationTests.java @@ -53,7 +53,7 @@ public void init() throws IOException messages = Gwti18nReader.create(ValidationMessages.class); newlineLeadTrailValidation = new NewlineLeadTrailValidation(ValidationId.NEW_LINE, messages); - newlineLeadTrailValidation.getValidationInfo().setEnabled(true); + newlineLeadTrailValidation.getRules().setEnabled(true); } @Test diff --git a/zanata-war/src/test/java/org/zanata/webtrans/shared/validation/PrintfVariablesValidationTest.java b/zanata-war/src/test/java/org/zanata/webtrans/shared/validation/PrintfVariablesValidationTest.java index bbc4b6b171..ec9f391dc5 100644 --- a/zanata-war/src/test/java/org/zanata/webtrans/shared/validation/PrintfVariablesValidationTest.java +++ b/zanata-war/src/test/java/org/zanata/webtrans/shared/validation/PrintfVariablesValidationTest.java @@ -57,7 +57,7 @@ public void init() throws IOException messages = Gwti18nReader.create(ValidationMessages.class); printfVariablesValidation = new PrintfVariablesValidation(ValidationId.PRINTF_VARIABLES, messages); - printfVariablesValidation.getValidationInfo().setEnabled(true); + printfVariablesValidation.getRules().setEnabled(true); } @Test diff --git a/zanata-war/src/test/java/org/zanata/webtrans/shared/validation/PrintfXSIExtensionValidationTest.java b/zanata-war/src/test/java/org/zanata/webtrans/shared/validation/PrintfXSIExtensionValidationTest.java index 0a3afacdd8..8fcfb46917 100644 --- a/zanata-war/src/test/java/org/zanata/webtrans/shared/validation/PrintfXSIExtensionValidationTest.java +++ b/zanata-war/src/test/java/org/zanata/webtrans/shared/validation/PrintfXSIExtensionValidationTest.java @@ -35,7 +35,7 @@ public void init() throws IOException messages = Gwti18nReader.create(ValidationMessages.class); printfVariablesValidation = new PrintfXSIExtensionValidation(ValidationId.PRINTF_XSI_EXTENSION, messages); - printfVariablesValidation.getValidationInfo().setEnabled(true); + printfVariablesValidation.getRules().setEnabled(true); } @Test diff --git a/zanata-war/src/test/java/org/zanata/webtrans/shared/validation/TabValidationTest.java b/zanata-war/src/test/java/org/zanata/webtrans/shared/validation/TabValidationTest.java index 7664a1d78e..6e378febbb 100644 --- a/zanata-war/src/test/java/org/zanata/webtrans/shared/validation/TabValidationTest.java +++ b/zanata-war/src/test/java/org/zanata/webtrans/shared/validation/TabValidationTest.java @@ -47,7 +47,7 @@ public void init() throws IOException { messages = Gwti18nReader.create(ValidationMessages.class); validation = new TabValidation(ValidationId.TAB, messages); - validation.getValidationInfo().setEnabled(true); + validation.getRules().setEnabled(true); } @Test diff --git a/zanata-war/src/test/java/org/zanata/webtrans/shared/validation/XMLEntityValidationTests.java b/zanata-war/src/test/java/org/zanata/webtrans/shared/validation/XMLEntityValidationTests.java index 123b61768a..d975c8b523 100644 --- a/zanata-war/src/test/java/org/zanata/webtrans/shared/validation/XMLEntityValidationTests.java +++ b/zanata-war/src/test/java/org/zanata/webtrans/shared/validation/XMLEntityValidationTests.java @@ -55,7 +55,7 @@ public void beforeMethod() throws IOException messages = Gwti18nReader.create(ValidationMessages.class); xmlEntityValidation = new XmlEntityValidation(ValidationId.XML_ENTITY, messages); - xmlEntityValidation.getValidationInfo().setEnabled(true); + xmlEntityValidation.getRules().setEnabled(true); } @Test diff --git a/zanata-war/src/test/resources/arquillian.xml b/zanata-war/src/test/resources/arquillian.xml index dc3822d29b..0873faf709 100644 --- a/zanata-war/src/test/resources/arquillian.xml +++ b/zanata-war/src/test/resources/arquillian.xml @@ -14,7 +14,7 @@ ${arquillian.jboss.home} - /usr/lib/jvm/jre-1.6.0-openjdk.x86_64 + diff --git a/zanata-war/src/test/resources/org/zanata/test/model/CopyTransTestData.dbunit.xml b/zanata-war/src/test/resources/org/zanata/test/model/CopyTransTestData.dbunit.xml index 6ffb24282f..62da785436 100644 --- a/zanata-war/src/test/resources/org/zanata/test/model/CopyTransTestData.dbunit.xml +++ b/zanata-war/src/test/resources/org/zanata/test/model/CopyTransTestData.dbunit.xml @@ -11,7 +11,6 @@ homeContent="" name="Original Project" overrideLocales="FALSE" - overrideValidations="FALSE" restrictedByRoles="FALSE" status="A" /> @@ -22,7 +21,6 @@ slug="same-version" parentId="[NULL]" project_id="100" - overrideValidations="FALSE" overrideLocales="FALSE" status="A" /> @@ -85,7 +83,6 @@ slug="different-version" parentId="[NULL]" project_id="100" - overrideValidations="FALSE" overrideLocales="TRUE" status="A" /> @@ -105,7 +102,6 @@ homeContent="" name="Different Project" overrideLocales="FALSE" - overrideValidations="FALSE" restrictedByRoles="FALSE" status="A" /> @@ -116,7 +112,6 @@ slug="different-version" parentId="[NULL]" project_id="1000" - overrideValidations="FALSE" overrideLocales="TRUE" status="A" /> diff --git a/zanata-war/src/test/resources/org/zanata/test/model/DocumentsData.dbunit.xml b/zanata-war/src/test/resources/org/zanata/test/model/DocumentsData.dbunit.xml index f613a8304c..ad4aead92a 100644 --- a/zanata-war/src/test/resources/org/zanata/test/model/DocumentsData.dbunit.xml +++ b/zanata-war/src/test/resources/org/zanata/test/model/DocumentsData.dbunit.xml @@ -10,7 +10,6 @@ homeContent="" name="Sample Project" overrideLocales="FALSE" - overrideValidations="FALSE" restrictedByRoles="FALSE" status="A" /> diff --git a/zanata-war/src/test/resources/org/zanata/test/model/ProjectsData.dbunit.xml b/zanata-war/src/test/resources/org/zanata/test/model/ProjectsData.dbunit.xml index ba4c98b7ee..301773727e 100644 --- a/zanata-war/src/test/resources/org/zanata/test/model/ProjectsData.dbunit.xml +++ b/zanata-war/src/test/resources/org/zanata/test/model/ProjectsData.dbunit.xml @@ -11,7 +11,6 @@ name="Sample Project" overrideLocales="FALSE" restrictedByRoles="FALSE" - overrideValidations="FALSE" status="A" /> @@ -32,7 +30,6 @@ slug="1.1" parentId="[NULL]" project_id="1" - overrideValidations="FALSE" overrideLocales="FALSE" status="A" /> @@ -51,7 +48,6 @@ homeContent="" name="Sample Retired Project" overrideLocales="FALSE" - overrideValidations="FALSE" restrictedByRoles="FALSE" status="R" /> @@ -62,7 +58,6 @@ slug="retired-current" parentId="[NULL]" project_id="2" - overrideValidations="FALSE" overrideLocales="FALSE" status="A" /> @@ -78,7 +73,6 @@ homeContent="" name="Sample Obsolete Project" overrideLocales="FALSE" - overrideValidations="FALSE" restrictedByRoles="FALSE" status="O" /> @@ -89,7 +83,6 @@ slug="obsolete-current" parentId="[NULL]" project_id="3" - overrideValidations="FALSE" overrideLocales="FALSE" status="A" /> @@ -105,7 +98,6 @@ homeContent="" name="Sample Current Project" overrideLocales="FALSE" - overrideValidations="FALSE" restrictedByRoles="FALSE" status="A" /> @@ -116,7 +108,6 @@ slug="current-obsolete" parentId="[NULL]" project_id="4" - overrideValidations="FALSE" overrideLocales="FALSE" status="O" /> @@ -128,7 +119,6 @@ slug="current-active" parentId="[NULL]" project_id="4" - overrideValidations="FALSE" overrideLocales="FALSE" status="A" /> @@ -140,7 +130,6 @@ slug="current-readonly" parentId="[NULL]" project_id="4" - overrideValidations="FALSE" overrideLocales="FALSE" status="R" /> diff --git a/zanata-war/src/test/resources/org/zanata/test/model/TextFlowTestData.dbunit.xml b/zanata-war/src/test/resources/org/zanata/test/model/TextFlowTestData.dbunit.xml index 5c5a240828..c9e9429e0d 100644 --- a/zanata-war/src/test/resources/org/zanata/test/model/TextFlowTestData.dbunit.xml +++ b/zanata-war/src/test/resources/org/zanata/test/model/TextFlowTestData.dbunit.xml @@ -72,6 +72,7 @@ state="0" tf_id="1" tf_revision="1" + content0="hello" /> diff --git a/zanata-war/src/test/resources/performance/GetTransUnitListTest.dbunit.xml b/zanata-war/src/test/resources/performance/GetTransUnitListTest.dbunit.xml index ae0ba11ad8..c52a9d02b8 100644 --- a/zanata-war/src/test/resources/performance/GetTransUnitListTest.dbunit.xml +++ b/zanata-war/src/test/resources/performance/GetTransUnitListTest.dbunit.xml @@ -10,8 +10,8 @@ MIME-Version=1.0 Content-Type=text/plain; charset\=utf-8 Content-Transfer-Encoding=8bit " comment_id="1"/> - - + +