diff --git a/zanata-war/src/main/java/org/zanata/action/VersionGroupHomeAction.java b/zanata-war/src/main/java/org/zanata/action/VersionGroupHomeAction.java index 97cace0f0d..7861a871de 100644 --- a/zanata-war/src/main/java/org/zanata/action/VersionGroupHomeAction.java +++ b/zanata-war/src/main/java/org/zanata/action/VersionGroupHomeAction.java @@ -43,7 +43,6 @@ import org.zanata.model.HLocale; import org.zanata.model.HPerson; import org.zanata.model.HProjectIteration; -import org.zanata.service.LocaleService; import org.zanata.service.VersionGroupService; import org.zanata.service.VersionLocaleKey; import org.zanata.ui.model.statistic.WordStatistic; @@ -62,9 +61,6 @@ public class VersionGroupHomeAction implements Serializable { private static final long serialVersionUID = 1L; - @In - private LocaleService localeServiceImpl; - @In private VersionGroupService versionGroupServiceImpl; @@ -247,7 +243,7 @@ public void sortProjectList() { public List getActiveLocales() { if (activeLocales == null) { Set groupActiveLocales = - localeServiceImpl.getGroupActiveLocales(getSlug()); + versionGroupServiceImpl.getGroupActiveLocales(getSlug()); activeLocales = Lists.newArrayList(groupActiveLocales); } Collections.sort(activeLocales, languageComparator); @@ -342,7 +338,7 @@ public WordStatistic getSelectedVersionStatistic(LocaleId localeId) { } public List getMaintainers() { - return versionGroupDAO.getMaintainerBySlug(getSlug()); + return versionGroupDAO.getMaintainersBySlug(getSlug()); } private Map> getMissingLocaleVersionMap() { @@ -356,7 +352,7 @@ private Map> getMissingLocaleVersionMap() { /** * Search for locale that is not activated in given version - * + * * @param version * @return */ @@ -382,7 +378,7 @@ public String getMissingLocaleTitle(HProjectIteration version) { /** * Search for version that doesn't activate given locale - * + * * @param localeId * @return */ diff --git a/zanata-war/src/main/java/org/zanata/action/VersionGroupJoinAction.java b/zanata-war/src/main/java/org/zanata/action/VersionGroupJoinAction.java index fa132bdaca..d20ffc88a8 100644 --- a/zanata-war/src/main/java/org/zanata/action/VersionGroupJoinAction.java +++ b/zanata-war/src/main/java/org/zanata/action/VersionGroupJoinAction.java @@ -129,7 +129,7 @@ public String send() { if (isAnyVersionSelected) { List maintainers = new ArrayList(); for (HPerson maintainer : versionGroupServiceImpl - .getMaintainerBySlug(slug)) { + .getMaintainersBySlug(slug)) { maintainers.add(maintainer); } return sendEmail.sendToVersionGroupMaintainer(maintainers); diff --git a/zanata-war/src/main/java/org/zanata/dao/VersionGroupDAO.java b/zanata-war/src/main/java/org/zanata/dao/VersionGroupDAO.java index c0c883cc4e..47dc7177f7 100644 --- a/zanata-war/src/main/java/org/zanata/dao/VersionGroupDAO.java +++ b/zanata-war/src/main/java/org/zanata/dao/VersionGroupDAO.java @@ -81,13 +81,13 @@ public HIterationGroup getBySlug(@Nonnull String slug) { return null; } - public List getMaintainerBySlug(String slug) { + public List getMaintainersBySlug(String slug) { Query q = getSession() .createQuery( "select g.maintainers from HIterationGroup as g where g.slug = :slug"); q.setParameter("slug", slug); - q.setComment("VersionGroupDAO.getMaintainerBySlug"); + q.setComment("VersionGroupDAO.getMaintainersBySlug"); @SuppressWarnings("unchecked") List results = q.list(); return results; @@ -112,7 +112,7 @@ public List searchGroupBySlugAndName(String searchTerm) { Query query = getSession() .createQuery( - "from HIterationGroup g where lower(g.slug) LIKE :searchTerm OR lower(g.name) LIKE :searchTerm AND g.status = :status"); + "from HIterationGroup g where (lower(g.slug) LIKE :searchTerm OR lower(g.name) LIKE :searchTerm) AND g.status = :status"); query.setParameter("searchTerm", "%" + searchTerm.toLowerCase() + "%"); query.setParameter("status", EntityStatus.ACTIVE); query.setComment("VersionGroupDAO.searchGroupBySlugAndName"); diff --git a/zanata-war/src/main/java/org/zanata/service/LocaleService.java b/zanata-war/src/main/java/org/zanata/service/LocaleService.java index f801cbba45..5278429e37 100644 --- a/zanata-war/src/main/java/org/zanata/service/LocaleService.java +++ b/zanata-war/src/main/java/org/zanata/service/LocaleService.java @@ -92,6 +92,4 @@ Map getIterationCustomizedLocalesItems(String projectSlug, HTextFlowTarget getLastTranslated(String projectSlug, String iterationSlug, LocaleId localeId); - - Set getGroupActiveLocales(String slug); } diff --git a/zanata-war/src/main/java/org/zanata/service/VersionGroupService.java b/zanata-war/src/main/java/org/zanata/service/VersionGroupService.java index fe3d715622..47cd04af3c 100644 --- a/zanata-war/src/main/java/org/zanata/service/VersionGroupService.java +++ b/zanata-war/src/main/java/org/zanata/service/VersionGroupService.java @@ -22,6 +22,7 @@ import java.util.List; import java.util.Map; +import java.util.Set; import lombok.AllArgsConstructor; import lombok.Getter; @@ -29,6 +30,7 @@ import org.zanata.common.LocaleId; import org.zanata.model.HIterationGroup; +import org.zanata.model.HLocale; import org.zanata.model.HPerson; import org.zanata.model.HProjectIteration; import org.zanata.ui.model.statistic.WordStatistic; @@ -40,7 +42,7 @@ public interface VersionGroupService { /** * Return all active groups + maintained groups of the person - * + * * @param person * @return */ @@ -50,29 +52,29 @@ public interface VersionGroupService { /** * Search project version by fuzzy matching of version slug or project slug - * + * * @param searchTerm */ List searchLikeSlugOrProjectSlug(String searchTerm); /** * Search group by fuzzy matching of slug or name - * + * * @param searchTerm */ List searchGroupBySlugAndName(String searchTerm); /** * Return maintainers of the group - * + * * @param slug * @return */ - List getMaintainerBySlug(String slug); + List getMaintainersBySlug(String slug); /** * Return if a version had joined a group - * + * * @param groupSlug * @param versionId */ @@ -80,7 +82,7 @@ public interface VersionGroupService { /** * Return map of statistics for all version and active locales in group - * + * * @param groupSlug * @param localeId */ @@ -89,20 +91,27 @@ Map getLocaleStatistic(String groupSlug, /** * Return total message count of the versions in group - * + * * @param groupSlug */ int getTotalMessageCount(String groupSlug); /** * Return versions that doesn't contained all active locales of the group. - * + * * @param groupSlug * @return */ Map> getMissingLocaleVersionMap( String groupSlug); + /** + * Return group's activate locales + * + * @param groupSlug + */ + Set getGroupActiveLocales(String groupSlug); + @AllArgsConstructor public final class SelectableHProject { 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 fa95ea4611..32dcf581ad 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 @@ -43,19 +43,17 @@ import org.zanata.dao.TextFlowTargetDAO; import org.zanata.dao.VersionGroupDAO; import org.zanata.exception.ZanataServiceException; -import org.zanata.model.HIterationGroup; import org.zanata.model.HLocale; import org.zanata.model.HProject; import org.zanata.model.HProjectIteration; import org.zanata.model.HTextFlowTarget; import org.zanata.service.LocaleService; -import com.google.common.collect.Sets; import com.ibm.icu.util.ULocale; /** * This implementation provides all the business logic related to Locale. - * + * */ @Name("localeServiceImpl") @Scope(ScopeType.STATELESS) @@ -368,13 +366,4 @@ public HTextFlowTarget getLastTranslated(String projectSlug, return textFlowTargetDAO.getLastTranslated(projectSlug, iterationSlug, localeId); } - - @Override - public Set getGroupActiveLocales(String slug) { - HIterationGroup group = versionGroupDAO.getBySlug(slug); - if (group != null) { - return group.getActiveLocales(); - } - return Sets.newHashSet(); - } } diff --git a/zanata-war/src/main/java/org/zanata/service/impl/VersionGroupServiceImpl.java b/zanata-war/src/main/java/org/zanata/service/impl/VersionGroupServiceImpl.java index bf6a7429c6..5deb08de10 100644 --- a/zanata-war/src/main/java/org/zanata/service/impl/VersionGroupServiceImpl.java +++ b/zanata-war/src/main/java/org/zanata/service/impl/VersionGroupServiceImpl.java @@ -131,8 +131,8 @@ public List searchGroupBySlugAndName(String searchTerm) { } @Override - public List getMaintainerBySlug(String groupSlug) { - return versionGroupDAO.getMaintainerBySlug(groupSlug); + public List getMaintainersBySlug(String groupSlug) { + return versionGroupDAO.getMaintainersBySlug(groupSlug); } @Override @@ -148,9 +148,18 @@ public boolean isVersionInGroup(String groupSlug, Long versionId) { return false; } + @Override + public Set getGroupActiveLocales(String groupSlug) { + HIterationGroup group = versionGroupDAO.getBySlug(groupSlug); + if (group != null) { + return group.getActiveLocales(); + } + return Sets.newHashSet(); + } + /** * Return versions that doesn't contained all active locales of the group. - * + * * @param groupSlug * @return */ @@ -164,11 +173,7 @@ public Map> getMissingLocaleVersionMap( for (HLocale activeLocale : group.getActiveLocales()) { List versionList = Lists.newArrayList(); for (HProjectIteration version : group.getProjectIterations()) { - Set customisedLocales = - getVersionCustomisedLocales(version); - - if (!customisedLocales.isEmpty() - && !customisedLocales.contains(activeLocale)) { + if (!isLocaleActivateInVersion(version, activeLocale)) { versionList.add(version); } } @@ -179,14 +184,17 @@ public Map> getMissingLocaleVersionMap( } /** - * Return version's customised locales. - * + * Return if the locale is activate in the version. Return true if version + * and project doesn't overrides locale. + * * Fallback to project customised locale if version doesn't overrides * locales - * + * * @param version + * @param locale */ - private Set getVersionCustomisedLocales(HProjectIteration version) { + private boolean isLocaleActivateInVersion(HProjectIteration version, + HLocale locale) { Set customisedLocales = Sets.newHashSet(); if (version.isOverrideLocales()) { @@ -195,6 +203,10 @@ private Set getVersionCustomisedLocales(HProjectIteration version) { customisedLocales = version.getProject().getCustomizedLocales(); } - return customisedLocales; + if (version.isOverrideLocales() + || version.getProject().isOverrideLocales()) { + return customisedLocales.contains(locale); + } + return true; // no overrides of locales from version or it's project } } diff --git a/zanata-war/src/main/java/org/zanata/service/impl/VersionStateCacheImpl.java b/zanata-war/src/main/java/org/zanata/service/impl/VersionStateCacheImpl.java index 00def92c17..d3b2682090 100644 --- a/zanata-war/src/main/java/org/zanata/service/impl/VersionStateCacheImpl.java +++ b/zanata-war/src/main/java/org/zanata/service/impl/VersionStateCacheImpl.java @@ -58,11 +58,17 @@ public class VersionStateCacheImpl implements VersionStateCache { private CacheWrapper versionStatisticCache; private CacheLoader versionStatisticLoader; + // constructor for Seam public VersionStateCacheImpl() { - // constructor for Seam this.versionStatisticLoader = new VersionStatisticLoader(); } + // Constructor for testing + public VersionStateCacheImpl( + CacheLoader versionStatisticLoader) { + this.versionStatisticLoader = versionStatisticLoader; + } + @Create public void create() { cacheManager = CacheManager.create(); diff --git a/zanata-war/src/test/java/org/zanata/service/impl/VersionGroupServiceImplTest.java b/zanata-war/src/test/java/org/zanata/service/impl/VersionGroupServiceImplTest.java new file mode 100644 index 0000000000..b4486f0775 --- /dev/null +++ b/zanata-war/src/test/java/org/zanata/service/impl/VersionGroupServiceImplTest.java @@ -0,0 +1,205 @@ +/* + * 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.impl; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.dbunit.operation.DatabaseOperation; +import org.hamcrest.Matchers; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; +import org.zanata.ZanataDbunitJpaTest; +import org.zanata.common.LocaleId; +import org.zanata.dao.PersonDAO; +import org.zanata.dao.ProjectIterationDAO; +import org.zanata.dao.VersionGroupDAO; +import org.zanata.model.HIterationGroup; +import org.zanata.model.HLocale; +import org.zanata.model.HPerson; +import org.zanata.model.HProjectIteration; +import org.zanata.seam.SeamAutowire; +import org.zanata.service.VersionLocaleKey; +import org.zanata.ui.model.statistic.WordStatistic; + +/** + * @author Alex Eng aeng@redhat.com + */ +public class VersionGroupServiceImplTest extends ZanataDbunitJpaTest { + private SeamAutowire seam = SeamAutowire.instance(); + + private VersionGroupServiceImpl versionGroupServiceImpl; + + private final String GROUP1_SLUG = "group1"; + private final String GROUP2_SLUG = "group2"; + private final String GROUP3_SLUG = "group3"; + + @Override + protected void prepareDBUnitOperations() { + beforeTestOperations.add(new DataSetOperation( + "org/zanata/test/model/ClearAllTables.dbunit.xml", + DatabaseOperation.DELETE_ALL)); + beforeTestOperations.add(new DataSetOperation( + "org/zanata/test/model/AccountData.dbunit.xml", + DatabaseOperation.CLEAN_INSERT)); + beforeTestOperations.add(new DataSetOperation( + "org/zanata/test/model/ProjectsData.dbunit.xml", + DatabaseOperation.CLEAN_INSERT)); + beforeTestOperations.add(new DataSetOperation( + "org/zanata/test/model/LocalesData.dbunit.xml", + DatabaseOperation.CLEAN_INSERT)); + beforeTestOperations.add(new DataSetOperation( + "org/zanata/test/model/TextFlowTestData.dbunit.xml", + DatabaseOperation.CLEAN_INSERT)); + beforeTestOperations.add(new DataSetOperation( + "org/zanata/test/model/GroupsTestData.dbunit.xml", + DatabaseOperation.CLEAN_INSERT)); + } + + @BeforeMethod + public void initializeSeam() { + seam.reset() + .use("versionGroupDAO", new VersionGroupDAO(getSession())) + .use("projectIterationDAO", + new ProjectIterationDAO(getSession())) + .use("session", getSession()) + .useImpl(VersionStateCacheImpl.class).ignoreNonResolvable(); + + versionGroupServiceImpl = seam.autowire(VersionGroupServiceImpl.class); + } + + @Test + public void getLocaleStatisticTest1() { + LocaleId localeId = LocaleId.DE; + + Map result = + versionGroupServiceImpl.getLocaleStatistic(GROUP1_SLUG, + localeId); + + // 3 versions in group1 + assertThat(result.size(), equalTo(3)); + } + + @Test + public void getLocaleStatisticTest2() { + LocaleId localeId = LocaleId.DE; + + Map result = + versionGroupServiceImpl.getLocaleStatistic(GROUP2_SLUG, + localeId); + + // 2 versions in group1 + assertThat(result.size(), equalTo(2)); + } + + @Test + public void getTotalMessageCountTest1() { + int totalMessageCount = + versionGroupServiceImpl.getTotalMessageCount(GROUP1_SLUG); + assertThat(totalMessageCount, equalTo(18)); + } + + @Test + public void getTotalMessageCountTest2() { + int totalMessageCount = + versionGroupServiceImpl.getTotalMessageCount(GROUP2_SLUG); + assertThat(totalMessageCount, equalTo(0)); + } + + @Test + public void getAllActiveAndMaintainedGroupsTest() { + // personId = 1 is maintainers for group1 and group3(obsolote) + PersonDAO personDAO = new PersonDAO(getSession()); + HPerson person = personDAO.findById(new Long(1)); + List result = + versionGroupServiceImpl.getAllActiveAndMaintainedGroups(person); + + assertThat(result.size(), equalTo(3)); + } + + @Test + public void searchGroupBySlugAndNameTest() { + String query = "group"; + List result = + versionGroupServiceImpl.searchGroupBySlugAndName(query); + assertThat(result.size(), equalTo(2)); + + query = "1"; + result = versionGroupServiceImpl.searchGroupBySlugAndName(query); + assertThat(result.size(), equalTo(1)); + } + + @Test + public void getMaintainersBySlugTest() { + List maintainers = + versionGroupServiceImpl.getMaintainersBySlug(GROUP1_SLUG); + assertThat(maintainers.size(), equalTo(2)); + } + + @Test + public void isVersionInGroupTest() { + boolean result = + versionGroupServiceImpl.isVersionInGroup(GROUP1_SLUG, new Long( + 1)); + assertThat(result, equalTo(true)); + + result = + versionGroupServiceImpl.isVersionInGroup(GROUP1_SLUG, new Long( + 3)); + assertThat(result, equalTo(false)); + } + + @Test + public void getGroupActiveLocalesTest() { + Set activeLocales = + versionGroupServiceImpl.getGroupActiveLocales(GROUP1_SLUG); + assertThat(activeLocales.size(), equalTo(3)); + + activeLocales = + versionGroupServiceImpl.getGroupActiveLocales(GROUP3_SLUG); + assertThat(activeLocales.size(), equalTo(0)); + } + + @Test + public void getMissingLocaleVersionMapTest() { + Map> map = + versionGroupServiceImpl.getMissingLocaleVersionMap(GROUP1_SLUG); + + int activateLocaleSize = + versionGroupServiceImpl.getGroupActiveLocales(GROUP1_SLUG) + .size(); + assertThat(map.size(), equalTo(activateLocaleSize)); + + // See ProjectsData.dbunit.xml, HProjectIteration id="900" in group1 + ProjectIterationDAO projectIterationDAO = + new ProjectIterationDAO(getSession()); + HProjectIteration version = projectIterationDAO.findById(new Long(900)); + + for (List versions : map.values()) { + assertThat("", versions, Matchers.contains(version)); + } + } +} diff --git a/zanata-war/src/test/java/org/zanata/service/impl/VersionStateCacheImplTest.java b/zanata-war/src/test/java/org/zanata/service/impl/VersionStateCacheImplTest.java new file mode 100644 index 0000000000..aef2b07ff5 --- /dev/null +++ b/zanata-war/src/test/java/org/zanata/service/impl/VersionStateCacheImplTest.java @@ -0,0 +1,62 @@ +package org.zanata.service.impl; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; +import org.zanata.common.LocaleId; +import org.zanata.service.VersionLocaleKey; +import org.zanata.ui.model.statistic.WordStatistic; + +import com.google.common.cache.CacheLoader; + +/** + * @author Alex Eng aeng@redhat.com + */ +@Test(groups = { "business-tests" }) +public class VersionStateCacheImplTest { + + private VersionStateCacheImpl cache; + + @Mock + private CacheLoader versionStatisticLoader; + + @BeforeMethod + public void beforeMethod() { + MockitoAnnotations.initMocks(this); + cache = new VersionStateCacheImpl(versionStatisticLoader); + + cache.create(); + cache.destroy(); + cache.create(); + } + + @AfterMethod + public void afterMethod() { + cache.destroy(); + } + + public void getStatisticTest() throws Exception { + + Long versionId = 1L; + LocaleId localeId = LocaleId.EN_US; + VersionLocaleKey key = new VersionLocaleKey(versionId, localeId); + + WordStatistic wordStatistic = new WordStatistic(0, 11, 100, 4, 500); + + // When: + when(versionStatisticLoader.load(key)).thenReturn(wordStatistic); + + WordStatistic result = cache.getVersionStatistic(versionId, localeId); + + // Then: + verify(versionStatisticLoader).load(key); // only load the value once + assertThat(result, equalTo(wordStatistic)); + } +} diff --git a/zanata-war/src/test/resources/org/zanata/test/model/ClearAllTables.dbunit.xml b/zanata-war/src/test/resources/org/zanata/test/model/ClearAllTables.dbunit.xml index a4becc3286..fc0e49350e 100644 --- a/zanata-war/src/test/resources/org/zanata/test/model/ClearAllTables.dbunit.xml +++ b/zanata-war/src/test/resources/org/zanata/test/model/ClearAllTables.dbunit.xml @@ -14,6 +14,9 @@ + + + @@ -33,6 +36,7 @@ + diff --git a/zanata-war/src/test/resources/org/zanata/test/model/GroupsTestData.dbunit.xml b/zanata-war/src/test/resources/org/zanata/test/model/GroupsTestData.dbunit.xml new file mode 100644 index 0000000000..7d50ed8d7e --- /dev/null +++ b/zanata-war/src/test/resources/org/zanata/test/model/GroupsTestData.dbunit.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 c0e354198b..1d8628b924 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 @@ -134,6 +134,21 @@ status="R" /> + + + +