controllers.SearchApp.java Source code

Java tutorial

Introduction

Here is the source code for controllers.SearchApp.java

Source

/**
 * Yobi, Project Hosting SW
 *
 * Copyright 2014 NAVER Corp.
 * http://yobi.io
 *
 * @Author Keesun Baik
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package controllers;

import controllers.annotation.AnonymousCheck;
import controllers.annotation.IsAllowed;
import models.*;
import models.enumeration.Operation;
import models.enumeration.SearchType;
import org.apache.commons.lang3.StringUtils;
import play.mvc.Controller;
import play.mvc.Result;
import utils.ErrorViews;
import views.html.search.*;

@AnonymousCheck
public class SearchApp extends Controller {

    private static final PageParam DEFAULT_PAGE = new PageParam(0, 20);

    /**
     * Search contents that current user can read in all projects.
     *
     * @return
     */
    public static Result searchInAll() {
        // SearchCondition from param
        String searchTypeValue = request().getQueryString("searchType");
        String keyword = request().getQueryString("keyword");
        PageParam pageParam = getPage();

        if (StringUtils.isEmpty(keyword) || StringUtils.isEmpty(searchTypeValue)) {
            return badRequest(ErrorViews.BadRequest.render());
        }

        User user = UserApp.currentUser();
        SearchType searchType = SearchType.getValue(searchTypeValue);

        if (searchType == SearchType.NA) {
            return badRequest(ErrorViews.BadRequest.render());
        }

        SearchResult searchResult = getSearchResult(keyword, user, searchType);
        switch (searchResult.getSearchType()) {
        case ISSUE:
            searchResult.setIssues(Search.findIssues(keyword, user, pageParam));
            break;
        case USER:
            searchResult.setUsers(Search.findUsers(keyword, pageParam));
            break;
        case PROJECT:
            searchResult.setProjects(Search.findProjects(keyword, user, pageParam));
            break;
        case POST:
            searchResult.setPosts(Search.findPosts(keyword, user, pageParam));
            break;
        case MILESTONE:
            searchResult.setMilestones(Search.findMilestones(keyword, user, pageParam));
            break;
        case ISSUE_COMMENT:
            searchResult.setIssueComments(Search.findIssueComments(keyword, user, pageParam));
            break;
        case POST_COMMENT:
            searchResult.setPostComments(Search.findPostComments(keyword, user, pageParam));
            break;
        case REVIEW:
            searchResult.setReviews(Search.findReviews(keyword, user, pageParam));
            break;
        }
        return ok(result.render("title.search", null, null, searchResult));
    }

    private static SearchResult getSearchResult(String keyword, User user, SearchType searchType) {
        SearchResult searchResult = new SearchResult();
        searchResult.setKeyword(keyword);
        searchResult.setSearchType(searchType);
        searchResult.setProjectsCount(Search.countProjects(keyword, user));
        searchResult.setUsersCount(Search.countUsers(keyword));
        searchResult.setIssuesCount(Search.countIssues(keyword, user));
        searchResult.setPostsCount(Search.countPosts(keyword, user));
        searchResult.setMilestonesCount(Search.countMilestones(keyword, user));
        searchResult.setIssueCommentsCount(Search.countIssueComments(keyword, user));
        searchResult.setPostCommentsCount(Search.countPostComments(keyword, user));
        searchResult.setReviewsCount(Search.countReviews(keyword, user));
        searchResult.updateSearchType();
        return searchResult;
    }

    /**
     * Search contents that current user can read in a group.
     *
     * @param organizationName
     * @return
     */
    public static Result searchInAGroup(String organizationName) {
        String searchTypeValue = request().getQueryString("searchType");
        String keyword = request().getQueryString("keyword");
        PageParam pageParam = getPage();

        if (StringUtils.isEmpty(organizationName) || StringUtils.isEmpty(keyword)
                || StringUtils.isEmpty(searchTypeValue)) {
            return badRequest();
        }

        Organization organization = Organization.findByName(organizationName);
        User user = UserApp.currentUser();
        SearchType searchType = SearchType.getValue(searchTypeValue);

        if (searchType == SearchType.NA || organization == null) {
            return badRequest(ErrorViews.BadRequest.render());
        }

        SearchResult searchResult = getSearchResult(keyword, user, organization, searchType);

        switch (searchResult.getSearchType()) {
        case ISSUE:
            searchResult.setIssues(Search.findIssues(keyword, user, organization, pageParam));
            break;
        case USER:
            searchResult.setUsers(Search.findUsers(keyword, organization, pageParam));
            break;
        case PROJECT:
            searchResult.setProjects(Search.findProjects(keyword, user, organization, pageParam));
            break;
        case POST:
            searchResult.setPosts(Search.findPosts(keyword, user, organization, pageParam));
            break;
        case MILESTONE:
            searchResult.setMilestones(Search.findMilestones(keyword, user, organization, pageParam));
            break;
        case ISSUE_COMMENT:
            searchResult.setIssueComments(Search.findIssueComments(keyword, user, organization, pageParam));
            break;
        case POST_COMMENT:
            searchResult.setPostComments(Search.findPostComments(keyword, user, organization, pageParam));
            break;
        case REVIEW:
            searchResult.setReviews(Search.findReviews(keyword, user, organization, pageParam));
            break;
        }

        return ok(result.render("title.search", organization, null, searchResult));
    }

    private static SearchResult getSearchResult(String keyword, User user, Organization organization,
            SearchType searchType) {
        SearchResult searchResult = new SearchResult();
        searchResult.setSearchType(searchType);
        searchResult.setKeyword(keyword);
        searchResult.setProjectsCount(Search.countProjects(keyword, user, organization));
        searchResult.setUsersCount(Search.countUsers(keyword, organization));
        searchResult.setIssuesCount(Search.countIssues(keyword, user, organization));
        searchResult.setPostsCount(Search.countPosts(keyword, user, organization));
        searchResult.setMilestonesCount(Search.countMilestones(keyword, user, organization));
        searchResult.setIssueCommentsCount(Search.countIssueComments(keyword, user, organization));
        searchResult.setPostCommentsCount(Search.countPostComments(keyword, user, organization));
        searchResult.setReviewsCount(Search.countReviews(keyword, user, organization));
        searchResult.updateSearchType();
        return searchResult;
    }

    /**
     * Search contents that current user can read in a project.
     *
     * @param loginId
     * @param projectName
     * @return
     */
    @IsAllowed(Operation.READ)
    public static Result searchInAProject(String loginId, String projectName) {
        String searchTypeValue = request().getQueryString("searchType");
        String keyword = request().getQueryString("keyword");
        Project project = Project.findByOwnerAndProjectName(loginId, projectName);
        PageParam pageParam = getPage();

        if (StringUtils.isEmpty(keyword) || StringUtils.isEmpty(searchTypeValue) || project == null) {
            return badRequest(ErrorViews.BadRequest.render());
        }

        User user = UserApp.currentUser();
        SearchType searchType = SearchType.getValue(searchTypeValue);

        if (searchType == SearchType.NA || searchType == SearchType.PROJECT) {
            return badRequest(ErrorViews.BadRequest.render());
        }

        SearchResult searchResult = getSearchResult(keyword, user, project, searchType);

        switch (searchResult.getSearchType()) {
        case ISSUE:
            searchResult.setIssues(Search.findIssues(keyword, user, project, pageParam));
            break;
        case USER:
            searchResult.setUsers(Search.findUsers(keyword, project, pageParam));
            break;
        case POST:
            searchResult.setPosts(Search.findPosts(keyword, user, project, pageParam));
            break;
        case MILESTONE:
            searchResult.setMilestones(Search.findMilestones(keyword, user, project, pageParam));
            break;
        case ISSUE_COMMENT:
            searchResult.setIssueComments(Search.findIssueComments(keyword, user, project, pageParam));
            break;
        case POST_COMMENT:
            searchResult.setPostComments(Search.findPostComments(keyword, user, project, pageParam));
            break;
        case REVIEW:
            searchResult.setReviews(Search.findReviews(keyword, user, project, pageParam));
            break;
        }

        return ok(result.render("title.search", null, project, searchResult));
    }

    private static SearchResult getSearchResult(String keyword, User user, Project project, SearchType searchType) {
        SearchResult searchResult = new SearchResult();
        searchResult.setSearchType(searchType);
        searchResult.setKeyword(keyword);
        searchResult.setUsersCount(Search.countUsers(keyword, project));
        searchResult.setIssuesCount(Search.countIssues(keyword, user, project));
        searchResult.setPostsCount(Search.countPosts(keyword, user, project));
        searchResult.setMilestonesCount(Search.countMilestones(keyword, user, project));
        searchResult.setIssueCommentsCount(Search.countIssueComments(keyword, user, project));
        searchResult.setPostCommentsCount(Search.countPostComments(keyword, user, project));
        searchResult.setReviewsCount(Search.countReviews(keyword, user, project));
        searchResult.updateSearchType();
        return searchResult;
    }

    private static PageParam getPage() {
        PageParam pageParam = new PageParam(DEFAULT_PAGE.getPage(), DEFAULT_PAGE.getSize());
        String pageNumString = request().getQueryString("pageNum");
        if (pageNumString != null) {
            int pageNum = Integer.parseInt(pageNumString);
            pageParam.setPage(pageNum - 1);
        }
        return pageParam;
    }

}