Java tutorial
/* * Asqatasun - Automated webpage assessment * Copyright (C) 2008-2015 Asqatasun.org * * This program 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: asqatasun AT asqatasun DOT org */ package org.asqatasun.rules.rgaa30; import java.util.Collections; import java.util.Iterator; import org.apache.commons.lang3.tuple.ImmutablePair; import org.jsoup.nodes.Element; import static org.asqatasun.entity.audit.TestSolution.FAILED; import static org.asqatasun.entity.audit.TestSolution.NEED_MORE_INFO; import static org.asqatasun.entity.audit.TestSolution.PASSED; import org.asqatasun.processor.SSPHandler; import org.asqatasun.ruleimplementation.AbstractMarkerPageRuleImplementation; import org.asqatasun.rules.elementchecker.CompositeChecker; import org.asqatasun.rules.elementchecker.ElementChecker; import org.asqatasun.rules.elementchecker.pertinence.AttributePertinenceChecker; import org.asqatasun.rules.elementchecker.text.TextNotIdenticalToAttributeChecker; import org.asqatasun.rules.elementselector.ImageElementSelector; import static org.asqatasun.rules.keystore.AttributeStore.ALT_ATTR; import static org.asqatasun.rules.keystore.AttributeStore.LONGDESC_ATTR; import static org.asqatasun.rules.keystore.AttributeStore.SRC_ATTR; import static org.asqatasun.rules.keystore.AttributeStore.TITLE_ATTR; import static org.asqatasun.rules.keystore.CssLikeQueryStore.IMG_WITH_ALT_CSS_LIKE_QUERY; import static org.asqatasun.rules.keystore.MarkerStore.DECORATIVE_IMAGE_MARKER; import static org.asqatasun.rules.keystore.MarkerStore.INFORMATIVE_IMAGE_MARKER; import org.asqatasun.rules.keystore.RemarkMessageStore; import static org.asqatasun.rules.keystore.RemarkMessageStore.CHECK_ALT_PERTINENCE_OF_INFORMATIVE_IMG_MSG; import static org.asqatasun.rules.keystore.RemarkMessageStore.NOT_PERTINENT_ALT_MSG; import static org.asqatasun.rules.keystore.RemarkMessageStore.TITLE_NOT_IDENTICAL_TO_ALT_MSG; import org.asqatasun.rules.textbuilder.TextAttributeOfElementBuilder; /** * Implementation of the rule 1.3.1 of the referential Rgaa 3.0. * <br/> * For more details about the implementation, refer to <a href="http://doc.asqatasun.org/en/90_Rules/rgaa3.0/01.Images/Rule-1-3-1.html">the rule 1.3.1 design page.</a> * @see <a href="http://references.modernisation.gouv.fr/referentiel-technique-0#test-1-2-5"> 1.3.1 rule specification</a> * */ public class Rgaa30Rule010301 extends AbstractMarkerPageRuleImplementation { /** The name of the nomenclature that handles the image file extensions */ private static final String IMAGE_FILE_EXTENSION_NOM = "ImageFileExtensions"; public Rgaa30Rule010301() { super( // the informative images are part of the scope INFORMATIVE_IMAGE_MARKER, // the decorative images are not part of the scope DECORATIVE_IMAGE_MARKER); setElementSelector(new ImageElementSelector(IMG_WITH_ALT_CSS_LIKE_QUERY, true, false)); setMarkerElementChecker(getMarkerElementChecker()); setRegularElementChecker(getLocalRegularElementChecker()); } @Override protected void select(SSPHandler sspHandler) { super.select(sspHandler); Iterator<Element> iter = getSelectionWithoutMarkerHandler().get().iterator(); // The elements with a longdesc attribute are seen as informative. // They are added to the selection with marker while (iter.hasNext()) { Element el = iter.next(); if (el.hasAttr(LONGDESC_ATTR)) { iter.remove(); getSelectionWithMarkerHandler().add(el); } } } /** * * @return the checker user for marked elements */ private ElementChecker getMarkerElementChecker() { CompositeChecker ec = new CompositeChecker( // checker for elements identified by marker new AttributePertinenceChecker(ALT_ATTR, // check emptiness true, // compare with src attribute new TextAttributeOfElementBuilder(SRC_ATTR), // compare attribute value with nomenclature IMAGE_FILE_EXTENSION_NOM, // not pertinent message NOT_PERTINENT_ALT_MSG, // manual check message CHECK_ALT_PERTINENCE_OF_INFORMATIVE_IMG_MSG, // evidence elements ALT_ATTR, TITLE_ATTR, SRC_ATTR), new TextNotIdenticalToAttributeChecker(new TextAttributeOfElementBuilder(TITLE_ATTR), new TextAttributeOfElementBuilder(ALT_ATTR), new ImmutablePair(PASSED, ""), new ImmutablePair(FAILED, TITLE_NOT_IDENTICAL_TO_ALT_MSG), // evidence elements ALT_ATTR, TITLE_ATTR, SRC_ATTR)); ec.setIsOrCombinaison(false); return ec; } /** * * @return the checker user for not marked elements */ private ElementChecker getLocalRegularElementChecker() { CompositeChecker compositeChecker = new CompositeChecker(ALT_ATTR, TITLE_ATTR, SRC_ATTR); compositeChecker.addChecker(new AttributePertinenceChecker(ALT_ATTR, // check emptiness true, // compare with src attribute new TextAttributeOfElementBuilder(SRC_ATTR), // compare attribute value with nomenclature IMAGE_FILE_EXTENSION_NOM, // solution when not pertinent FAILED, // not pertinent message "", // manual check message "")); compositeChecker.addChecker(new TextNotIdenticalToAttributeChecker( new TextAttributeOfElementBuilder(ALT_ATTR), new TextAttributeOfElementBuilder(TITLE_ATTR), new ImmutablePair(FAILED, ""), new ImmutablePair(PASSED, ""))); compositeChecker.setIsOrCombinaison(false); compositeChecker.addCheckMessageFromSolution(NEED_MORE_INFO, Collections.singletonMap(NEED_MORE_INFO, RemarkMessageStore.CHECK_NATURE_OF_IMAGE_AND_ALT_PERTINENCE_MSG)); compositeChecker.addCheckMessageFromSolution(FAILED, Collections.singletonMap(NEED_MORE_INFO, RemarkMessageStore.CHECK_NATURE_OF_IMAGE_WITH_NOT_PERTINENT_ALT_MSG)); return compositeChecker; } }