diff --git a/zanata-war/src/main/java/org/zanata/action/VersionGroupHome.java b/zanata-war/src/main/java/org/zanata/action/VersionGroupHome.java index bd7f73c64a..d8a49956b6 100644 --- a/zanata-war/src/main/java/org/zanata/action/VersionGroupHome.java +++ b/zanata-war/src/main/java/org/zanata/action/VersionGroupHome.java @@ -27,7 +27,6 @@ import javax.annotation.Nullable; import javax.faces.application.FacesMessage; import javax.faces.event.ValueChangeEvent; -import javax.xml.ws.Service; import org.apache.commons.lang.StringUtils; import org.hibernate.Session; @@ -235,7 +234,7 @@ public List getSortedInstanceProjectIterations() { List list = Lists.newArrayList(getInstance().getProjectIterations()); - Collections.sort(list, ComparatorUtil.PROJECT_NAME_COMPARATOR); + Collections.sort(list, ComparatorUtil.VERSION_PROJECT_NAME_COMPARATOR); return list; } 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 e87a277b71..1367456440 100644 --- a/zanata-war/src/main/java/org/zanata/action/VersionGroupHomeAction.java +++ b/zanata-war/src/main/java/org/zanata/action/VersionGroupHomeAction.java @@ -307,8 +307,8 @@ public int compare(HProjectIteration o1, HProjectIteration o2) { wordStatistic2.getUntranslated()); } } else { - return o1.getProject().getName().toLowerCase() - .compareTo(o2.getProject().getName().toLowerCase()); + return ComparatorUtil.compareStringIgnoreCase( + o1.getProject().getName(), o2.getProject().getName()); } return 0; } diff --git a/zanata-war/src/main/java/org/zanata/action/ZanataSearch.java b/zanata-war/src/main/java/org/zanata/action/ZanataSearch.java index 45bca6adc9..7f3207cc75 100644 --- a/zanata-war/src/main/java/org/zanata/action/ZanataSearch.java +++ b/zanata-war/src/main/java/org/zanata/action/ZanataSearch.java @@ -17,8 +17,10 @@ import org.jboss.seam.annotations.In; import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.Scope; +import org.zanata.common.EntityStatus; import org.zanata.dao.AccountDAO; import org.zanata.dao.ProjectDAO; +import org.zanata.dao.ProjectIterationDAO; import org.zanata.model.HAccount; import org.zanata.model.HProject; @@ -26,6 +28,7 @@ import org.zanata.ui.AbstractAutocomplete; import org.zanata.ui.AbstractListFilter; import org.zanata.ui.InMemoryListFilter; +import org.zanata.util.ComparatorUtil; import org.zanata.util.DateUtil; import org.zanata.util.ServiceLocator; @@ -33,7 +36,7 @@ * This will search both projects and people. */ @Name("zanataSearch") -@Scope(ScopeType.CONVERSATION) +@Scope(ScopeType.PAGE) @AutoCreate public class ZanataSearch implements Serializable { @@ -44,6 +47,9 @@ public class ZanataSearch implements Serializable { @In private ProjectDAO projectDAO; + @In + private ProjectIterationDAO projectIterationDAO; + @In private AccountDAO accountDAO; @@ -71,6 +77,10 @@ public class ZanataSearch implements Serializable { private final UserComparator userComparator = new UserComparator(getUserSortingList()); + private List projects; + + private List accounts; + @AllArgsConstructor @NoArgsConstructor public class SearchResult { @@ -103,7 +113,7 @@ private class ProjectUserAutocomplete extends @Override public List suggest() { List result = Lists.newArrayList(); - if (StringUtils.isEmpty(getQuery())) { + if (StringUtils.isBlank(getQuery())) { return result; } try { @@ -126,7 +136,6 @@ public List suggest() { } catch (ParseException pe) { return result; } - } /** @@ -146,9 +155,6 @@ public void setQuery(String query) { @Getter private final AbstractListFilter projectTabProjectFilter = new InMemoryListFilter() { - - private ProjectDAO projectDAO = ServiceLocator.instance() - .getInstance(ProjectDAO.class); /** * Fetches all records. * @@ -156,18 +162,10 @@ public void setQuery(String query) { */ @Override protected List fetchAll() { - if (StringUtils.isEmpty(getAutocomplete().getQuery())) { - return Collections.emptyList(); - } - try { - List projects = - projectDAO.searchProjects(getAutocomplete() - .getQuery(), -1, 0, includeObsolete); - Collections.sort(projects, projectComparator); - return projects; - } catch (ParseException e) { + if (StringUtils.isBlank(getAutocomplete().getQuery())) { return Collections.emptyList(); } + return getProjects(); } /** @@ -186,9 +184,6 @@ protected boolean include(HProject elem, String filter) { @Getter private final AbstractListFilter userTabUserFilter = new InMemoryListFilter() { - private AccountDAO accountDAO = ServiceLocator.instance() - .getInstance(AccountDAO.class); - /** * Fetches all records. * @@ -199,11 +194,7 @@ protected List fetchAll() { if (StringUtils.isEmpty(getAutocomplete().getQuery())) { return Collections.emptyList(); } - List hAccounts = - accountDAO.searchQuery(getAutocomplete().getQuery(), - -1, 0); - Collections.sort(hAccounts, userComparator); - return hAccounts; + return getAccounts(); } /** @@ -219,6 +210,39 @@ protected boolean include(HAccount elem, String filter) { } }; + public List getProjects() { + if (projects == null) { + ProjectDAO projectDAO = + ServiceLocator.instance().getInstance(ProjectDAO.class); + try { + projects = projectDAO.searchProjects(getAutocomplete() + .getQuery(), -1, 0, includeObsolete); + Collections.sort(projects, + ComparatorUtil.PROJECT_NAME_COMPARATOR); + } catch (ParseException e) { + return Collections.emptyList(); + } + } + return projects; + } + + public List getAccounts() { + if (accounts == null) { + AccountDAO accountDAO = + ServiceLocator.instance().getInstance(AccountDAO.class); + + accounts = accountDAO.searchQuery(getAutocomplete().getQuery(), + -1, 0); + Collections.sort(accounts, + ComparatorUtil.ACCOUNT_NAME_COMPARATOR); + } + return accounts; + } + + public int getVersionSize(String projectSlug) { + return projectIterationDAO.getByProjectSlug(projectSlug, + EntityStatus.ACTIVE, EntityStatus.READONLY).size(); + } public int getTotalProjectCount() { if(StringUtils.isEmpty(getAutocomplete().getQuery())) { @@ -252,10 +276,12 @@ public String formatDate(Date date) { * Sort project list */ public void sortProjectList() { + Collections.sort(projects, projectComparator); projectTabProjectFilter.reset(); } public void sortUserList() { + Collections.sort(accounts, userComparator); userTabUserFilter.reset(); } @@ -278,10 +304,11 @@ public int compare(HProject o1, HProject o2) { } if (selectedSortOption.equals(SortingType.SortOption.CREATED_DATE)) { - return o1.getCreationDate().compareTo(o2.getCreationDate()); + return ComparatorUtil.compareDate(o1.getCreationDate(), + o2.getCreationDate()); } else { - return o1.getName().toLowerCase().compareTo( - o2.getName().toLowerCase()); + return ComparatorUtil.compareStringIgnoreCase(o1.getName(), + o2.getName()); } } } @@ -303,8 +330,8 @@ public int compare(HAccount o1, HAccount o2) { o1 = o2; o2 = temp; } - return o1.getPerson().getName().toLowerCase().compareTo( - o2.getPerson().getName().toLowerCase()); + return ComparatorUtil.compareStringIgnoreCase( + o1.getPerson().getName(), o2.getPerson().getName()); } } } diff --git a/zanata-war/src/main/java/org/zanata/util/ComparatorUtil.java b/zanata-war/src/main/java/org/zanata/util/ComparatorUtil.java index 12a4f7e08e..b58a4034af 100644 --- a/zanata-war/src/main/java/org/zanata/util/ComparatorUtil.java +++ b/zanata-war/src/main/java/org/zanata/util/ComparatorUtil.java @@ -23,8 +23,11 @@ package org.zanata.util; import java.util.Comparator; +import java.util.Date; +import org.apache.commons.lang.StringUtils; import org.zanata.common.ProjectType; +import org.zanata.model.HAccount; import org.zanata.model.HAccountRole; import org.zanata.model.HLocale; import org.zanata.model.HPerson; @@ -49,22 +52,19 @@ public int compare(HLocale hLocale, HLocale hLocale2) { new Comparator() { @Override public int compare(HPerson hPerson, HPerson hPerson2) { - return hPerson.getName().compareTo(hPerson2.getName()); - } + return compareStringIgnoreCase(hPerson.getName(), + hPerson2.getName()); + } }; - public static final Comparator PROJECT_NAME_COMPARATOR = + public static final Comparator VERSION_PROJECT_NAME_COMPARATOR = new Comparator() { @Override public int compare(HProjectIteration version1, HProjectIteration version2) { - return version1 - .getProject() - .getName() - .toLowerCase() - .compareTo( - version2.getProject().getName() - .toLowerCase()); + return compareStringIgnoreCase( + version1.getProject().getName(), + version2.getProject().getName()); } }; @@ -73,7 +73,8 @@ public int compare(HProjectIteration version1, new Comparator() { @Override public int compare(HProjectIteration o1, HProjectIteration o2) { - return o2.getCreationDate().compareTo(o1.getCreationDate()); + return compareDate(o2.getCreationDate(), + o1.getCreationDate()); } }; @@ -81,10 +82,19 @@ public int compare(HProjectIteration o1, HProjectIteration o2) { new Comparator() { @Override public int compare(HProject o1, HProject o2) { - return o2.getCreationDate().compareTo(o1.getCreationDate()); + return compareDate(o2.getCreationDate(), + o1.getCreationDate()); } }; + public static final Comparator PROJECT_NAME_COMPARATOR = + new Comparator() { + @Override + public int compare(HProject o1, HProject o2) { + return compareStringIgnoreCase(o1.getName(), o2.getName()); + } + }; + public static final Comparator ACCOUNT_ROLE_COMPARATOR = new Comparator() { @Override @@ -106,4 +116,33 @@ public int compare(ProjectType o1, ProjectType o2) { return o1.toString().compareTo(o2.toString()); } }; + + public static final Comparator ACCOUNT_NAME_COMPARATOR = + new Comparator() { + @Override + public int compare(HAccount o1, HAccount o2) { + return compareStringIgnoreCase(o1.getPerson().getName(), o2 + .getPerson().getName()); + } + }; + + public static int compareDate(Date date1, Date date2) { + if (date1 == null) { + return -1; + } + if (date2 == null) { + return 1; + } + return date1.compareTo(date2); + } + + public static final int compareStringIgnoreCase(String str1, String str2) { + if (StringUtils.isBlank(str1)) { + return -1; + } + if (StringUtils.isBlank(str2)) { + return 1; + } + return str1.toLowerCase().compareTo(str2.toLowerCase()); + } } diff --git a/zanata-war/src/main/webapp/WEB-INF/layout/search/projects-tab.xhtml b/zanata-war/src/main/webapp/WEB-INF/layout/search/projects-tab.xhtml index d7ced1367a..92a8e273f2 100644 --- a/zanata-war/src/main/webapp/WEB-INF/layout/search/projects-tab.xhtml +++ b/zanata-war/src/main/webapp/WEB-INF/layout/search/projects-tab.xhtml @@ -59,7 +59,7 @@
#{project.projectIterations.size} + title="#{msgs['jsf.Versions']}"> #{zanataSearch.getVersionSize(project.slug)}
diff --git a/zanata-war/src/test/java/org/zanata/util/ComparatorUtilTest.java b/zanata-war/src/test/java/org/zanata/util/ComparatorUtilTest.java index 4471975097..8493af3b51 100644 --- a/zanata-war/src/test/java/org/zanata/util/ComparatorUtilTest.java +++ b/zanata-war/src/test/java/org/zanata/util/ComparatorUtilTest.java @@ -97,13 +97,13 @@ public void HProjectIterationProjectNameCompare() throws Exception { HProjectIteration hProjectIteration3 = new HProjectIteration(); hProjectIteration3.setProject(hProject3); - assertThat(ComparatorUtil.PROJECT_NAME_COMPARATOR + assertThat(ComparatorUtil.VERSION_PROJECT_NAME_COMPARATOR .compare(hProjectIteration1, hProjectIteration1)).isEqualTo(0); - assertThat(ComparatorUtil.PROJECT_NAME_COMPARATOR + assertThat(ComparatorUtil.VERSION_PROJECT_NAME_COMPARATOR .compare(hProjectIteration2, hProjectIteration3)).isEqualTo(0); - assertThat(ComparatorUtil.PROJECT_NAME_COMPARATOR + assertThat(ComparatorUtil.VERSION_PROJECT_NAME_COMPARATOR .compare(hProjectIteration1, hProjectIteration3)).isEqualTo(-1); - assertThat(ComparatorUtil.PROJECT_NAME_COMPARATOR + assertThat(ComparatorUtil.VERSION_PROJECT_NAME_COMPARATOR .compare(hProjectIteration3, hProjectIteration1)).isEqualTo(1); }