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

Java tutorial

Introduction

Here is the source code for org.alfresco.po.share.search.CopyAndMoveContentFromSearchPage.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 static java.util.concurrent.TimeUnit.MILLISECONDS;
import static java.util.concurrent.TimeUnit.SECONDS;
import static org.alfresco.po.RenderElement.getVisibleRenderElement;

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

import org.alfresco.po.HtmlPage;
import org.alfresco.po.RenderElement;
import org.alfresco.po.RenderTime;
import org.alfresco.po.exception.PageException;
import org.alfresco.po.exception.PageOperationException;
import org.alfresco.po.share.ShareDialogue;
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.*;

@SuppressWarnings("unchecked")
public class CopyAndMoveContentFromSearchPage extends ShareDialogue {

    private static Log logger = LogFactory.getLog(CopyAndMoveContentFromSearchPage.class);

    private final RenderElement FOOTER_ELEMENT = getVisibleRenderElement(By.cssSelector("div[class='footer']"));
    private final RenderElement HEADER_ELEMENT = getVisibleRenderElement(
            By.cssSelector("div[class='dijitDialogTitleBar']"));
    private final RenderElement DOC_LIST_VIEW = getVisibleRenderElement(
            (By.cssSelector("div[id^='alfresco_documentlibrary_views_AlfDocumentListView']")));
    private final By destinationListCss = By.cssSelector(
            "div[class='sub-pickers']>div[class^='alfresco-menus-AlfMenuBar']>div>div[class^='dijitReset dijitInline']>span");
    private final By copyMoveOkOrCancelButtonCss = By.cssSelector(".footer .dijitButtonText");

    private static final By CREATE_LINK_BUTTON = By.cssSelector(
            "#ALF_COPY_MOVE_DIALOG > div.dijitDialogPaneContent > div.footer > span:nth-child(1) > span [aria-disabled]");

    private final By copyMoveDialogCloseButtonCss = By
            .cssSelector("div[class='dijitDialogTitleBar']>span[class^=dijitDialogCloseIcon ]");
    private final By copyMoveDialogTitleCss = By
            .cssSelector("div[class='dijitDialogTitleBar']>span[class='dijitDialogTitle']");
    private String PathFolderCss = "//div[starts-with(@id,'alfresco_documentlibrary_views_AlfDocumentListView')] //tr/td/span/span/span[@class='value'][text()='%s']";
    private String adButton = "//div[starts-with(@id,'alfresco_documentlibrary_views_AlfDocumentListView')] //tr/td/span/span/span[@class='value'][text()='%s']/../../../../td/span[starts-with(@id, 'alfresco_renderers_PublishAction')]";

    private final By nextCss = By.cssSelector(
            "div[class$='dijitReset dijitInline dijitMenuItemLabel dijitMenuItem']>span[id$='PAGE_FORWARD_text']");
    private final By backCss = By.cssSelector(
            "div[class$='dijitReset dijitInline dijitMenuItemLabel dijitMenuItem']>span[id$='PAGE_BACK_text']");
    private final By siteFolderCss = By.cssSelector("span[class='dijitTreeContent']>span[ class='dijitTreeLabel']");
    private final By errorPopUp = By.cssSelector(".alfresco-notifications-AlfNotification__container");

    private final By sitenameSelector = By.cssSelector("div[class='items'] div[role='menuitem']>span");
    private final By folderSelector = By
            .cssSelector(".dijitTree .dijitTreeRow .dijitTreeContent>span[role='treeitem']");

    //FIXME render checking for different elements
    @Override
    public CopyAndMoveContentFromSearchPage render(RenderTime timer) {
        elementRender(timer, HEADER_ELEMENT, FOOTER_ELEMENT);
        return this;
    }

    public CopyAndMoveContentFromSearchPage renderDocumentListView(long timeInMilliSceonds) {
        elementRender(new RenderTime(timeInMilliSceonds), DOC_LIST_VIEW);
        return this;
    }

    /**
     * This method returns the Copy/Move Dialog title.
     * 
     * @return String
     */

    public String getDialogTitle() {
        String title = "";
        try {
            title = findAndWait(copyMoveDialogTitleCss).getText();
        } catch (TimeoutException e) {
            if (logger.isTraceEnabled()) {
                logger.trace("Unable to find the Copy/Move Dialog Css : ", e);
            }
        }
        return title;
    }

    /**
     * This method finds the list of destinations and return those as list of
     * string values.
     * 
     * @return List<String>
     */
    public List<String> getDestinations() {
        List<String> destinations = new ArrayList<String>();
        try {
            for (WebElement destination : findAndWaitForElements(destinationListCss)) {
                destinations.add(destination.getText());
            }
        } catch (TimeoutException e) {
            if (logger.isTraceEnabled()) {
                logger.trace("Unable to get the list of destionations : ", e);
            }
        }
        return destinations;
    }

    /**
     * This method finds then clicks on copy/move/cancel button.
     * 
     * @param buttonName String
     * @return HtmlPage FacetedSearchResultsPage
     */
    private HtmlPage selectButton(String buttonName) {
        if (StringUtils.isEmpty(buttonName)) {
            throw new IllegalArgumentException("button name is required");
        }

        try {
            List<WebElement> buttons = findDisplayedElements(copyMoveOkOrCancelButtonCss);
            for (WebElement button : buttons) {
                if (button.isDisplayed() && button.isEnabled()) {
                    if (button.getText() != null) {
                        if (button.getText().equalsIgnoreCase(buttonName)) {
                            button.click();
                            waitUntilElementDisappears(errorPopUp, 10);
                            return getCurrentPage().render();

                        }
                    }
                }
            }
            throw new PageOperationException("Unable to find the button: " + buttonName);
        } catch (NoSuchElementException ne) {
            if (logger.isTraceEnabled()) {
                logger.trace("Unable to find the inner text of button" + buttonName, ne);
            }
        } catch (TimeoutException e) {
            if (logger.isTraceEnabled()) {
                logger.trace("Unable to find the button" + buttonName, e);
            }
        }

        throw new PageOperationException("Unable to select button." + buttonName);
    }

    /**
     * This method finds the clicks on 'Copy' button in Copy/Move pop up page
     */
    public HtmlPage clickCopy() {
        String copyAction = factoryPage.getValue("search.button.copy");
        return selectButton(copyAction);
    }

    public HtmlPage cancelCopyOrMove() {
        String cancelCopyOrMoveAction = factoryPage.getValue("button.text.cancel");
        return selectButton(cancelCopyOrMoveAction);
    }

    public HtmlPage clickMove() {
        String moveAction = factoryPage.getValue("search.button.move");
        return selectButton(moveAction);
    }

    public HtmlPage clickCreateLink() {
        String createLinkAction = factoryPage.getValue("search.button.createlink");
        return selectButton(createLinkAction);
    }

    /**
     * This method finds the clicks on close button in copy and move dialog page
     * 
     * @return FacetedSearchPage
     */
    public HtmlPage closeCopyMoveDialog() {
        try {
            findAndWait(copyMoveDialogCloseButtonCss).click();
        } catch (TimeoutException e) {
            if (logger.isTraceEnabled()) {
                logger.trace("Unable to find the close button Css : ", e);
            }
            throw new PageException("Unable to find the close button on Copy/Move Dialog.");
        }
        return getCurrentPage();
    }

    /**
     * This method finds and selects the given destination from the
     * displayed list of destinations in CopyAndMoveContentFromSearchPage
     * 
     * @param destinationName String
     * @return CopyOrMoveContentPage
     */
    public CopyAndMoveContentFromSearchPage selectDestination(String destinationName) {
        PageUtils.checkMandatoryParam("destinationName", destinationName);
        try {
            for (WebElement destination : findAndWaitForElements(destinationListCss)) {
                if (destination.getText() != null) {
                    if (destination.getText().equalsIgnoreCase(destinationName)) {
                        destination.click();
                    }

                }

            }

            return this;
        } catch (NoSuchElementException ne) {
            if (logger.isTraceEnabled()) {
                logger.trace("Unable to find the inner text of destionation", ne);
            }
        } catch (TimeoutException e) {
            if (logger.isTraceEnabled()) {
                logger.trace("Unable to get the list of destionations", e);
            }
        }

        throw new PageOperationException("Unable to select Destination : " + destinationName);
    }

    /**
     * This method finds and selects any folder from repository in CopyAndMoveContentFromSearchPage
     * This method is used when Repository is selected as destination
     * 
     * @param repoFolder String
     * @return CopyOrMoveContentPage
     */
    public CopyAndMoveContentFromSearchPage selectFolderInRepo(String repoFolder) {

        PageUtils.checkMandatoryParam("repoFolder", repoFolder);

        try {

            By finalFolderElement = By.xpath(String.format(PathFolderCss, repoFolder));
            WebElement element = findAndWait(finalFolderElement);
            if (!element.isDisplayed()) {
                element.click();
            }
            element.click();

            return this;
        } catch (NoSuchElementException ne) {
            if (logger.isTraceEnabled()) {
                logger.trace("Unable to find the inner text of destionation", ne);
            }
        } catch (TimeoutException e) {
            if (logger.isTraceEnabled()) {
                logger.trace("Unable to get the list of destionations", e);
            }
        }

        throw new PageOperationException("Unable to select sites : ");
    }

    /**
     * This method can be used to select any folder in the site, given destination only from repository/Sites
     * This method is used when Repository/Sites are selected in CopyAndMoveContentFromSearchPage
     * 
     * @param paths String
     * @return CopyOrMoveContentPage
     */
    public CopyAndMoveContentFromSearchPage selectFolder(String... paths) {
        PageUtils.checkMandatoryParam("paths", paths);

        try {
            int pathsLength = paths.length;
            int pathCount = 1;
            String finalPath = "";
            for (String path : paths) {
                finalPath = path;
                if (pathCount >= pathsLength) {
                    break;
                }
                By subpath = By.xpath(String.format(PathFolderCss, path));
                scrollDwon();
                if ((!isNextButtonEnabled()) && (!isBackButtonEnabled())) {
                    waitForElement(subpath, SECONDS.convert(maxPageLoadingTime, MILLISECONDS));
                    findAndWait(subpath).click();
                } else if (!driver.findElement(subpath).isDisplayed()) {
                    while (isNextButtonEnabled() || !(driver.findElement(subpath).isDisplayed())) {
                        scrollDwon();
                        selectNextButton();
                        if (driver.findElement(subpath).isDisplayed()) {
                            break;
                        }
                    }
                } else if (!driver.findElement(subpath).isDisplayed() && (!isNextButtonEnabled())) {
                    throw new PageOperationException("Next button enabled when site is displayed");
                }
                if (driver.findElement(subpath).isDisplayed()) {
                    waitForElement(subpath, SECONDS.convert(maxPageLoadingTime, MILLISECONDS));
                    findAndWait(subpath).click();
                }
                pathCount++;
            }

            if (!finalPath.isEmpty()) {
                By finalFolderElement = By.xpath(String.format(PathFolderCss, finalPath));
                waitForElement(finalFolderElement, SECONDS.convert(maxPageLoadingTime, MILLISECONDS));
                waitForElement(By.xpath(String.format(adButton, finalPath)),
                        SECONDS.convert(maxPageLoadingTime, MILLISECONDS));
                driver.findElement(By.xpath(String.format(adButton, finalPath))).click();
            }

            return this;

        }

        catch (NoSuchElementException ne) {
            System.out.println(ne.getMessage());
            logger.trace("Unable to select the final folder", ne);
        } catch (TimeoutException e) {
            System.out.println(e.getMessage());
            logger.trace("Unable to select the final folder ", e);
        }

        throw new PageOperationException("Unable to select the final folder");
    }

    /**
     * This method finds the clicks on next button in CopyAndMoveContentFromSearchPage
     */
    public CopyAndMoveContentFromSearchPage selectNextButton() {
        selectButton(nextCss, "Unable to find the Next button on Copy/Move Dialog.");
        return this;
    }

    /**
     * This method finds the clicks on back button in CopyAndMoveContentFromSearchPage
     */
    public CopyAndMoveContentFromSearchPage selectBackButton() {
        selectButton(backCss, "Unable to find the close button on Copy/Move Dialog.");
        return this;
    }

    /**
     * This helper method finds the clicks on next/back button in CopyAndMoveContentFromSearchPage
     */
    private void selectButton(By css, String message) {
        try {
            if (findAndWait(css).isEnabled()) {
                findAndWait(css).click();
            }

        } catch (TimeoutException e) {
            if (logger.isTraceEnabled()) {
                logger.trace(message, e);
            }
            throw new PageException(message);
        }
    }

    /**
     * Checks if Create Link Button is displayed
     *
     * @return boolean
     */
    public boolean isCreateLinkButtonDisplayed() {
        try {
            WebElement createLikeButton = driver.findElement(CREATE_LINK_BUTTON);
            return createLikeButton.isDisplayed();
        } catch (NoSuchElementException nse) {
            logger.error("Create Link button is not found ", nse);
        }
        return false;
    }

    /**
     * Checks if Create Link Button is enabled
     *
     * @return boolean
     */
    public boolean isCreateLinkButtonEnabled() {
        try {
            WebElement createLikeButton = driver.findElement(CREATE_LINK_BUTTON);
            return (createLikeButton.getAttribute("aria-disabled").equals("false"));
        } catch (NoSuchElementException nse) {
            logger.error("CreateLink button is not found ", nse);
        }
        return false;
    }

    /**
     * Helper method to return true if Next Button is displayed and enabled
     * 
     * @return boolean <tt>true</tt> is Next Button is displayed and enabled
     */
    public boolean isNextButtonEnabled() {
        try {
            if (findAndWait(nextCss).isDisplayed() && findAndWait(nextCss).isEnabled()) {
                return true;
            }

        } catch (TimeoutException e) {
        }
        return false;
    }

    /**
     * Helper method to return true if Back Button is displayed and enabled
     * 
     * @return boolean <tt>true</tt> is Back Button is displayed and enabled
     */
    public boolean isBackButtonEnabled() {
        try {
            if (findAndWait(backCss).isDisplayed() && findAndWait(backCss).isEnabled()) {
                return true;
            }
        } catch (TimeoutException e) {
        }
        return false;
    }

    /**
     * Helper method to click on the page marker in copy and move dialog page
     * 
     * @return CopyAndMoveContentFromSearchPage
     */
    public CopyAndMoveContentFromSearchPage scrollDwon() {
        By paginatorCss = By
                .cssSelector("div[id^='alfresco_documentlibrary_AlfDocumentListPaginator'] div[id$='PAGE_MARKER']");
        try {
            WebElement paginator = findAndWait(paginatorCss);
            paginator.click();
            return this;
        } catch (TimeoutException e) {
            throw new PageOperationException("Unable to click on paginator", e);
        }
    }

    /**
     * TODO: Add Docs
     * @param folderName
     * @return
     */
    public CopyAndMoveContentFromSearchPage selectSiteInRepo(String folderName) {
        PageUtils.checkMandatoryParam("folderName", folderName);
        try {
            for (WebElement destination : findAndWaitForElements(siteFolderCss)) {
                if (destination.getText() != null) {
                    if (destination.getText().equalsIgnoreCase(folderName)) {
                        destination.click();
                        break;
                    }

                }

            }

            return this;
        } catch (NoSuchElementException | TimeoutException e) {
            if (logger.isTraceEnabled()) {
                logger.trace("Unable to find the required destination: " + folderName, e);
            }
        }

        throw new PageOperationException("Unable to select Destination : " + folderName);
    }

    /**
     * This helper method finds the clicks on specified site in CopyAndMoveContentFromSearchPage     
     * @param siteName
     * @return
     */
    public CopyAndMoveContentFromSearchPage selectSite(String siteName) {
        PageUtils.checkMandatoryParam("siteName", siteName);
        try {
            for (WebElement destination : findAndWaitForElements(sitenameSelector)) {
                if (destination.getText() != null) {
                    if (destination.getText().equalsIgnoreCase(siteName)) {
                        destination.click();
                        break;
                    }

                }

            }

            return this;
        } catch (NoSuchElementException | TimeoutException e) {
            if (logger.isTraceEnabled()) {
                logger.trace("Unable to find the required Site: " + siteName, e);
            }
        }

        throw new PageOperationException("Unable to select Site : " + siteName);
    }

    /**
     * This helper method finds the clicks on specified site folder in CopyAndMoveContentFromSearchPage     
     * @param sitefolderName
     * @return
     */
    public CopyAndMoveContentFromSearchPage selectSiteFolder(String sitefolderName) {
        PageUtils.checkMandatoryParam("sitefolderName", sitefolderName);
        try {
            for (WebElement destination : findAndWaitForElements(folderSelector)) {
                if (destination.getText() != null) {
                    if (destination.getText().equalsIgnoreCase(sitefolderName)) {
                        destination.click();
                        break;
                    }

                }

            }

            return this;
        } catch (NoSuchElementException | TimeoutException e) {
            if (logger.isTraceEnabled()) {
                logger.trace("Unable to find the required Site: " + sitefolderName, e);
            }
        }

        throw new PageOperationException("Unable to select Site : " + sitefolderName);
    }

}