org.alfresco.po.share.search.FacetedSearchPage.java Source code

Java tutorial

Introduction

Here is the source code for org.alfresco.po.share.search.FacetedSearchPage.java

Source

/*
 * #%L
 * share-po
 * %%
 * Copyright (C) 2005 - 2016 Alfresco Software Limited
 * %%
 * This file is part of the Alfresco software.
 * If the software was purchased under a paid Alfresco license, the terms of
 * the paid license agreement will prevail. Otherwise, the software is
 * provided under the following open source license terms:
 * Alfresco 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 3 of the License, or
 * (at your option) any later version.
 * Alfresco 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 Alfresco. If not, see <http://www.gnu.org/licenses/>.
 * #L%
 */
package org.alfresco.po.share.search;

import java.util.ArrayList;
import java.util.List;

import org.alfresco.po.HtmlPage;
import org.alfresco.po.RenderTime;
import org.alfresco.po.exception.PageException;
import org.alfresco.po.exception.PageOperationException;
import org.alfresco.po.share.SharePage;
import org.alfresco.po.share.UnknownSharePage;
import org.alfresco.po.share.search.FacetedSearchScopeMenu.ScopeMenuSelectedItemsMenu;
import org.alfresco.po.share.site.SitePageType;
import org.alfresco.po.share.util.PageUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openqa.selenium.By;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.TimeoutException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;

import ru.yandex.qatools.htmlelements.element.TextInput;

/**
 * The Class FacetedSearchPage.
 * 
 * @author Richard Smith
 */
@SuppressWarnings("unchecked")
public class FacetedSearchPage extends SharePage implements SearchResultPage {

    /** Constants */
    private static final By SEARCH_MENU_BAR = By.id("FCTSRCH_TOP_MENU_BAR");
    private static final By RESULT = By.cssSelector("tr.alfresco-search-AlfSearchResult");
    private static final By CONFIGURE_SEARCH = By.cssSelector("div[id=FCTSRCH_CONFIG_PAGE_LINK]");
    private static final Log logger = LogFactory.getLog(FacetedSearchPage.class);
    private static final String goToAdvancedSearch = "span#HEADER_ADVANCED_SEARCH_text";
    private static final By SEARCH_RESULTS_LIST = By.cssSelector("div[id='FCTSRCH_SEARCH_RESULTS_LIST']");

    /*
     * (non-Javadoc)
     * @see org.alfresco.po.Render#render()
     */
    @Override
    public FacetedSearchPage render() {
        return render(new RenderTime(maxPageLoadingTime));
    }

    /*
     * (non-Javadoc)
     * @see org.alfresco.po.Render#render(org.alfresco.po.RenderTime)
     */
    @Override
    public FacetedSearchPage render(RenderTime timer) {
        while (true) {
            timer.start();
            synchronized (this) {
                try {
                    this.wait(100L);
                } catch (InterruptedException e) {
                }
            }
            try {

                if (driver.findElement(SEARCH_MENU_BAR).isDisplayed()
                        && driver.findElement(SEARCH_RESULTS_LIST).isDisplayed()) {
                    break;
                }
            } catch (Exception e) {
            } finally {
                timer.end();
            }
        }
        return this;
    }

    /**
     * Gets the search form.
     * 
     * @return {@link FacetedSearchForm}
     */
    public FacetedSearchForm getSearchForm() {
        return new FacetedSearchForm(driver, factoryPage);
    }

    /**
     * Gets the sort.
     * 
     * @return {@link FacetedSearchSort}
     */
    public FacetedSearchSort getSort() {
        return new FacetedSearchSort(driver, factoryPage);
    }

    /**
     * Gets the results.
     * 
     * @return List
     */
    public List<SearchResult> getResults() {
        List<SearchResult> results = new ArrayList<SearchResult>();
        List<WebElement> response = driver.findElements(RESULT);
        for (WebElement result : response) {
            results.add(new FacetedSearchResult(driver, result, factoryPage));
        }
        return results;
    }

    /**
     * Gets a result by its title if it exists.
     *
     * @param title String
     * @return the result
     */
    public SearchResult getResultByTitle(String title) {
        try {
            for (SearchResult facetedSearchResult : getResults()) {
                if (facetedSearchResult.getTitle().equals(title)) {
                    return facetedSearchResult;
                }
            }
        } catch (TimeoutException e) {
            logger.error("Unable to get the title : ", e);
        }

        throw new PageOperationException("Unable to get the title  : ");

    }

    /**
     * Gets the view.
     * ^M
     * 
     * @return {@link FacetedSearchView}
     */
    public FacetedSearchView getView() {
        return factoryPage.instantiatePage(driver, FacetedSearchView.class).render();
    }

    /**
     * Gets a result by its name if it exists.
     *
     * @param name String
     * @return the result
     */
    public SearchResult getResultByName(String name) {
        try {
            for (SearchResult facetedSearchResult : getResults()) {
                if (facetedSearchResult.getName().equals(name)) {
                    return facetedSearchResult;
                }
            }
        } catch (TimeoutException e) {
            logger.error("Unable to get the name : ", e);
        }

        throw new PageOperationException("Unable to get the name  : ");

    }

    /**
     * Scroll to page bottom.
     */
    public void scrollSome(int distance) {
        executeJavaScript("window.scrollTo(0," + distance + ");", "");
    }

    /**
     * Scroll to page bottom.
     */
    public void scrollToPageBottom() {
        executeJavaScript(
                "window.scrollTo(0,Math.max(document.documentElement.scrollHeight,document.body.scrollHeight,document.documentElement.clientHeight));",
                "");
    }

    /**
     * Gets the current url hash.
     *
     * @return the url hash
     */
    public String getUrlHash() {
        String url = this.driver.getCurrentUrl();

        // Empty url or no #
        if (StringUtils.isEmpty(url) || !StringUtils.contains(url, "#")) {
            return null;
        }

        return StringUtils.substringAfter(url, "#");
    }

    /**
     * Get the numeric value display on top of search results.
     * The number indicates the total count found for given search.
     * 
     * @return int
     */
    public int getResultCount() {
        String val = driver.findElement(By.cssSelector("#FCTSRCH_RESULTS_COUNT_LABEL")).getText();
        String count = val.split("-")[0].trim();
        if (StringUtils.isEmpty(count)) {
            throw new RuntimeException("Unable to find result count info");
        }
        return Integer.valueOf(count).intValue();
    }

    /**
     * Select the facet that matches the title from the facet grouping.
     * 
     * @param title facet name, eg Microsoft Word
     * @return FacetedSearchPage with filtered results
     */
    public FacetedSearchPage selectFacet(final String title) {
        PageUtils.checkMandatoryParam("Facet title", title);
        WebElement facet = driver
                .findElement(By.xpath(String.format("//span[@class = 'filterLabel'][contains(., '%s')]", title)));
        facet.click();
        return this;
    }

    /**
     * Click on configure search Link. *
     * 
     * @return the FacetedSearchConfigpage
     */
    public FacetedSearchConfigPage clickConfigureSearchLink() {
        try {
            WebElement configure_search = driver.findElement(CONFIGURE_SEARCH);
            if (configure_search.isDisplayed()) {
                configure_search.click();
            }
            return getCurrentPage().render();
        } catch (TimeoutException e) {
            logger.error("Unable to find the link : " + e.getMessage());
        }

        throw new PageException("Unable to find the link : ");
    }

    /**
     * verify configureSearchlink is displayed
     * 
     * @param driver WebDrone
     * @return Boolean
     */
    public Boolean isConfigureSearchDisplayed(WebDriver driver) {
        try {
            WebElement configure_search = driver.findElement(CONFIGURE_SEARCH);
            if (configure_search.isDisplayed()) {
                return true;
            }

        }

        catch (NoSuchElementException te) {
            if (logger.isTraceEnabled()) {
                logger.trace("Unable to find configure search link");
            }
        }
        return false;
    }

    @Override
    public boolean hasResults() {
        return !getResults().isEmpty();
    }

    @Override
    public HtmlPage selectItem(String name) {
        if (name == null || name.isEmpty()) {
            throw new IllegalArgumentException("Search row name is required");
        }
        try {
            String selector = String.format("//span[@class = 'value'][contains(., '%s')]", name);
            driver.findElement(By.xpath(selector)).click();
        } catch (NoSuchElementException e) {
            throw new PageException(String.format("Search result %s item not found", name), e);
        }

        return factoryPage.instantiatePage(driver, UnknownSharePage.class);
    }

    @Override
    public HtmlPage selectItem(int number) {
        if (number < 0) {
            throw new IllegalArgumentException("Value can not be negative");
        }
        number += 1;
        try {
            String selector = String
                    .format("tr.alfresco-search-AlfSearchResult:nth-of-type(%d) div.nameAndTitleCell a", number);
            WebElement row = driver.findElement(By.cssSelector(selector));
            row.click();
        } catch (NoSuchElementException e) {
            throw new PageException(String.format("Search result %d item not found", number), e);
        }

        return getCurrentPage();
    }

    public boolean isItemPresentInResultsList(SitePageType pageType, String itemName) {
        String thumbnailImg;
        boolean isPresent = false;
        List<SearchResult> searchResults = getResults();

        for (SearchResult result : searchResults) {
            if (result.getName().equals(itemName)) {
                switch (pageType) {
                case WIKI:
                    thumbnailImg = "wiki-page.png";
                    break;
                case BLOG:
                    thumbnailImg = "topic-post.png";
                    break;
                case CALENDER:
                    thumbnailImg = "calendar-event.png";
                    break;
                case DATA_LISTS:
                    thumbnailImg = "datalist.png";
                    break;
                case DISCUSSIONS:
                    thumbnailImg = "topic-post.png";
                    break;
                case LINKS:
                    thumbnailImg = "link.png";
                    break;
                default:
                    thumbnailImg = "doclib";
                    break;
                }

                isPresent = result.getThumbnail().contains(thumbnailImg);

                //Check for Folder
                if (thumbnailImg == "doclib") {
                    isPresent = result.getThumbnail().contains(thumbnailImg)
                            || result.getThumbnail().contains("folder");
                }
                if (isPresent)
                    break;
            }
        }
        return isPresent;
    }

    public boolean isPageCorrect() {
        boolean isCorrect;
        isCorrect = driver.findElement(getSearchForm().SEARCH_FIELD).isDisplayed()
                && driver.findElement(getSearchForm().SEARCH_BUTTON).isDisplayed()
                && driver.findElement(RESULT).isDisplayed() && getSort().isSortCorrect();
        return isCorrect;
    }

    public boolean isGoToAdvancedSearchPresent() {
        return driver.findElement(By.cssSelector(goToAdvancedSearch)).isDisplayed();
    }

    public List<FacetedSearchFacetGroup> getFacetGroups() {
        List<WebElement> facetGroups = driver
                .findElements(By.cssSelector("div.alfresco-documentlibrary-AlfDocumentFilters:not(.hidden)"));
        List<FacetedSearchFacetGroup> filters = new ArrayList<FacetedSearchFacetGroup>();
        for (WebElement facetGroup : facetGroups) {
            filters.add(new FacetedSearchFacetGroup(driver, facetGroup));
        }
        return filters;
    }

    public FacetedSearchScopeMenu getScopeMenu() {
        return new FacetedSearchScopeMenu(driver, factoryPage);
    }

    @FindBy(css = "input[name='searchTerm']")
    TextInput search;
    @FindBy(css = "span[role='button']")
    WebElement searchBtn;

    public HtmlPage search(String searchTerm) {
        search.clear();
        search.sendKeys(searchTerm);
        searchBtn.click();
        return this;
    }

    /**
     * Get FacetedSearchPage sub navigation.
     *
     * @return {@link FacetedSearchBulkActions} object.
     */
    // FacetedSearchBulkActions facetedSearchBulkActions;

    public FacetedSearchBulkActions getNavigation() {
        // return facetedSearchBulkActions;
        return new FacetedSearchBulkActions(driver, factoryPage);
    }

    /**
     * Method to select the Search Scope on FacetedSearchResultsPage
     * 
     * @param {@link ScopeMenuSelectedItemsMenu} scope
     * @return HtmlPage
     */
    public HtmlPage selectSearchScope(ScopeMenuSelectedItemsMenu scope) {
        FacetedSearchScopeMenu menu = getScopeMenu();
        return menu.selectScope(scope).render();
    }

}