/*
* Tanaguru - Automated webpage assessment
* Copyright (C) 2008-2015 Tanaguru.org
*
* This file is part of Tanaguru.
*
* Tanaguru is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Contact us by mail: tanaguru AT tanaguru DOT org
*/
package org.tanaguru.ruleimplementation.link;
import org.jsoup.nodes.Element;
import org.tanaguru.entity.audit.TestSolution;
import org.tanaguru.processor.SSPHandler;
import org.tanaguru.ruleimplementation.AbstractPageRuleWithSelectorAndCheckerImplementation;
import org.tanaguru.ruleimplementation.ElementHandler;
import org.tanaguru.ruleimplementation.ElementHandlerImpl;
import org.tanaguru.ruleimplementation.TestSolutionHandler;
import org.tanaguru.rules.elementchecker.ElementChecker;
import org.tanaguru.rules.elementselector.ElementSelector;
import org.tanaguru.rules.elementselector.LinkElementSelector;
import org.tanaguru.rules.elementselector.SimpleElementSelector;
import static org.tanaguru.rules.keystore.CssLikeQueryStore.BUTTON_FORM_CSS_LIKE_QUERY;
/**
* This class deals with the tests related with links. All the link types are
* tested regarding two different checkers : the one that are decidable (with no context)
* and the one that are not decidable (with context).
* We consider here that a link can be
* <ul>
* <li>a simple link </li>
* <li>an image link </li>
* <li>a composite link </li>
* <li>an area </li>
* </ul>
* By addition, some tests may be done on buttons that can be considered as
* elements that lead to any action (as a link).
*/
public abstract class AbstractAllLinkAggregateRuleImplementation
extends AbstractPageRuleWithSelectorAndCheckerImplementation {
/* the link element selector */
LinkElementSelector linkElementSelector;
ElementHandler<Element> linkElementHandler;
/* the composite link element selector */
LinkElementSelector compositeLinkElementSelector;
ElementHandler<Element> compositeLinkElementHandler;
/* the image link element selector */
LinkElementSelector imageLinkElementSelector;
ElementHandler<Element> imageLinkElementHandler;
/* the area link element selector */
LinkElementSelector areaLinkElementSelector;
ElementHandler<Element> areaLinkElementHandler;
/* the form buttons selector*/
ElementSelector formButtonSelector;
ElementHandler<Element> formButtonHandler;
/* the checked used for decidable elements */
ElementChecker decidableElementsChecker;
/* the checked used for not decidable elements */
ElementChecker notDecidableElementsChecker;
/**
* Constructor
*
* @param linkElementSelector
* @param imageLinkElementSelector
* @param areaLinkElementSelector
* @param compositeLinkElementSelector
* @param decidableElementsChecker
* @param notDecidableElementsChecker
*/
public AbstractAllLinkAggregateRuleImplementation (
LinkElementSelector linkElementSelector,
LinkElementSelector imageLinkElementSelector,
LinkElementSelector areaLinkElementSelector,
LinkElementSelector compositeLinkElementSelector,
ElementChecker decidableElementsChecker,
ElementChecker notDecidableElementsChecker) {
super();
this.linkElementSelector = linkElementSelector;
this.linkElementHandler = new ElementHandlerImpl();
this.imageLinkElementSelector = imageLinkElementSelector;
this.imageLinkElementHandler = new ElementHandlerImpl();
this.areaLinkElementSelector = areaLinkElementSelector;
this.areaLinkElementHandler = new ElementHandlerImpl();
this.compositeLinkElementSelector = compositeLinkElementSelector;
this.compositeLinkElementHandler = new ElementHandlerImpl();
formButtonSelector = new SimpleElementSelector(BUTTON_FORM_CSS_LIKE_QUERY);
formButtonHandler = new ElementHandlerImpl();
this.decidableElementsChecker = decidableElementsChecker;
this.notDecidableElementsChecker = notDecidableElementsChecker;
}
@Override
protected void select(SSPHandler sspHandler) {
linkElementSelector.selectElements(sspHandler, linkElementHandler);
imageLinkElementSelector.selectElements(sspHandler, imageLinkElementHandler);
areaLinkElementSelector.selectElements(sspHandler, areaLinkElementHandler);
compositeLinkElementSelector.selectElements(sspHandler, compositeLinkElementHandler);
formButtonSelector.selectElements(sspHandler, formButtonHandler);
}
@Override
protected void check(
SSPHandler sspHandler,
TestSolutionHandler testSolutionHandler) {
if (selectionsEmpty()) {
testSolutionHandler.addTestSolution(TestSolution.NOT_APPLICABLE);
return;
}
testElements(sspHandler, linkElementSelector, testSolutionHandler);
testElements(sspHandler, imageLinkElementSelector, testSolutionHandler);
testElements(sspHandler, areaLinkElementSelector, testSolutionHandler);
testElements(sspHandler, compositeLinkElementSelector, testSolutionHandler);
checkButtonSelection(sspHandler, formButtonHandler, testSolutionHandler);
}
/**
*
* @return
*/
private boolean selectionsEmpty() {
return linkElementHandler.isEmpty() &&
imageLinkElementHandler.isEmpty() &&
compositeLinkElementHandler.isEmpty() &&
areaLinkElementHandler.isEmpty() &&
formButtonHandler.isEmpty();
}
/**
*
* @param sspHandler
* @param linkElementSelector
* @param testSolutionHandler
*/
private void testElements(
SSPHandler sspHandler,
LinkElementSelector linkElementSelector,
TestSolutionHandler testSolutionHandler) {
if (! linkElementSelector.getDecidableElements().isEmpty() &&
decidableElementsChecker != null) {
setServicesToChecker(decidableElementsChecker);
decidableElementsChecker.check(
sspHandler,
linkElementSelector.getDecidableElements(),
testSolutionHandler);
}
if (! linkElementSelector.getNotDecidableElements().isEmpty() &&
notDecidableElementsChecker != null) {
setServicesToChecker(notDecidableElementsChecker);
notDecidableElementsChecker.check(
sspHandler,
linkElementSelector.getNotDecidableElements(),
testSolutionHandler);
}
}
/**
*
* @param sspHandler
* @param formButtonHandler
* @param testSolutionHandler
*/
protected abstract void checkButtonSelection(
SSPHandler sspHandler,
ElementHandler formButtonHandler,
TestSolutionHandler testSolutionHandler);
@Override
public int getSelectionSize() {
return linkElementHandler.size() +
imageLinkElementHandler.size() +
compositeLinkElementHandler.size() +
areaLinkElementHandler.size() +
formButtonHandler.size();
}
}