/** * License Agreement. * * Rich Faces - Natural Ajax for Java Server Faces (JSF) * * Copyright (C) 2007 Exadel, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation. * * This library 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 this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ package org.richfaces.renderkit.html; import java.util.Map; import java.util.Map.Entry; import org.custommonkey.xmlunit.Difference; import org.custommonkey.xmlunit.DifferenceConstants; import org.custommonkey.xmlunit.DifferenceListener; import org.w3c.dom.Attr; import org.w3c.dom.Node; import com.google.common.collect.Maps; /** * @author akolonitsky * @since Oct 22, 2010 */ public class IgnoreScriptsContent implements DifferenceListener { private Map<String, String> idMapping = Maps.newLinkedHashMap(); public int differenceFound(Difference difference) { switch (difference.getId()) { case DifferenceConstants.TEXT_VALUE_ID: if (!"script".equalsIgnoreCase(difference.getTestNodeDetail().getNode().getLocalName())) { return RETURN_IGNORE_DIFFERENCE_NODES_SIMILAR; } break; case DifferenceConstants.ELEMENT_NUM_ATTRIBUTES_ID: return ignoreEmptyValueDifference(difference); case DifferenceConstants.ATTR_NAME_NOT_FOUND_ID: return ignoreEmptyValueDifference(difference); case DifferenceConstants.ATTR_VALUE_ID: return ignoreGeneratedIdDifference(difference); } return RETURN_ACCEPT_DIFFERENCE; } private int ignoreGeneratedIdDifference(Difference difference) { Attr attr1 = (Attr) difference.getControlNodeDetail().getNode(); Attr attr2 = (Attr) difference.getTestNodeDetail().getNode(); if ((attr1.getLocalName().equals("id") && attr2.getLocalName().equals("id") || attr1.getLocalName().equals("name") && attr2.getLocalName().equals("name"))) { String id1 = normalizeId(attr1.getValue()); String id2 = normalizeId(attr2.getValue()); String mappedId = lookupIdMapping(id1, id2); if (mappedId.equals(id2)) { return RETURN_IGNORE_DIFFERENCE_NODES_SIMILAR; } } return RETURN_ACCEPT_DIFFERENCE; } private String normalizeId(String id) { return id; // return id.replaceAll("j_idt", "").replaceAll("j_id_", ""); } private String lookupIdMapping(String id, String newId) { // look for most recent mapping match or prefix-match String mapping = null; for (Entry<String, String> entry : idMapping.entrySet()) { final String referenceId = entry.getKey(); final String mappedId = entry.getValue(); if (id.equals(referenceId)) { return entry.getValue(); } final String referenceIdPrefix = referenceId + ":"; final String mappedIdPrefix = mappedId + ":"; if (id.startsWith(referenceIdPrefix)) { mapping = id.replaceFirst("^" + referenceIdPrefix, mappedIdPrefix); } } if (mapping == null) { mapping = newId; } idMapping.put(id, newId); return mapping; } private int ignoreEmptyValueDifference(Difference difference) { Attr value1 = (Attr) difference.getControlNodeDetail().getNode().getAttributes().getNamedItem("value"); Attr value2 = (Attr) difference.getTestNodeDetail().getNode().getAttributes().getNamedItem("value"); if (value1 == null && value2 != null && value2.getValue().equals("")) { return RETURN_IGNORE_DIFFERENCE_NODES_SIMILAR; } if (value2 == null && value1 != null && value1.getValue().equals("")) { return RETURN_IGNORE_DIFFERENCE_NODES_SIMILAR; } return RETURN_ACCEPT_DIFFERENCE; } public void skippedComparison(Node node, Node node1) { } }