// Copyright � 2004-2007 ASERT. Released under the Canoo Webtest license.
package com.canoo.webtest.extension;
import java.util.Iterator;
import org.apache.log4j.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import com.canoo.webtest.steps.AbstractFilter;
import com.gargoylesoftware.htmlunit.Page;
import com.gargoylesoftware.htmlunit.html.DomNode;
import com.gargoylesoftware.htmlunit.html.DomText;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.xml.XmlPage;
/**
* Removes all content leaving only tags. Assumes the content is well-formed.
*
* @author Paul King
* @author Marc Guillemot
* @webtest.step category="Filter"
* name="contentStripper"
* description="Removes all content within well-formed XML/XHTML leaving only tags."
*/
public class ContentStripperFilter extends AbstractFilter
{
private static final Logger LOG = Logger.getLogger(ContentStripperFilter.class);
public void doExecute() throws Exception {
final Page currentResponse = getContext().getCurrentResponse();
final String origType = currentResponse.getWebResponse().getContentType();
LOG.info("Filtering response of type " + origType);
final StringBuffer buf = new StringBuffer();
if (currentResponse instanceof HtmlPage)
{
final HtmlPage page = (HtmlPage) currentResponse;
buf.append("<html>");
processHtml(page.getDocumentElement().getChildren(), buf);
buf.append("</html>");
}
else if (currentResponse instanceof XmlPage)
{
final XmlPage page = (XmlPage) currentResponse;
final Document xmlDocument = page.getXmlDocument();
if (xmlDocument != null) {
processXml(xmlDocument.getChildNodes().item(0), buf);
}
}
else
{
LOG.warn("Unexpected current response: " + origType
+ ", filter result will be empty");
}
defineAsCurrentResponse(buf.toString(), origType);
}
private static void processHtml(final Iterable iter, final StringBuffer buf) {
final Iterator children = iter.iterator();
while (children.hasNext()) {
final DomNode node = (DomNode) children.next();
if (!(node instanceof DomText)) {
buf.append("<").append(node.getNodeName()).append(">");
processHtml(node.getChildren(), buf);
buf.append("</").append(node.getNodeName()).append(">");
}
}
}
private static void processXml(final Node node, final StringBuffer buf) {
buf.append("<").append(node.getNodeName()).append(">");
final NodeList childNodes = node.getChildNodes();
for (int i = 0; i < childNodes.getLength(); i++) {
final Node n = childNodes.item(i);
if (n.hasChildNodes()) {
processXml(n, buf);
}
}
buf.append("</").append(node.getNodeName()).append(">");
}
}