// Copyright � 2004-2007 ASERT. Released under the Canoo Webtest license. package com.canoo.webtest.plugins.pdftest; import java.util.Iterator; import java.util.List; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import com.canoo.webtest.engine.EqualsStringVerfier; import com.canoo.webtest.engine.IStringVerifier; import com.canoo.webtest.engine.StepFailedException; import com.canoo.webtest.plugins.pdftest.htmlunit.PDFFont; import com.canoo.webtest.plugins.pdftest.htmlunit.PDFPage; /** * @author Paul King * @author Marc Guillemot * @webtest.step * category="PDF" * name="pdfVerifyFont" * alias="verifyPdfFont" * description="This step verifies the existence of a font within the current <key>pdf</key> document." */ public class PdfVerifyFontStep extends AbstractVerifyPdfStep { private static final Logger LOG = Logger.getLogger(PdfVerifyFontStep.class); private boolean fMatchCase; private String fName; private String fType; private int fPage = ANY_PAGE; /** * @param value * @webtest.parameter * required="yes/no" * description="The name of the font to find, e.g. <em>Times</em>, <em>Courier-Bold</em> * or <em>Helvetica-Oblique</em>. * One of <em>name</em> or <em>type</em> must be set." */ public void setName(final String value) { fName = value; } public String getName() { return fName; } /** * @param value * @webtest.parameter * required="yes/no" * description="The type of the font to find, e.g. <em>Type 1</em> or <em>TrueType</em>. * One of <em>name</em> or <em>type</em> must be set." */ public void setType(final String value) { fType = value; } public String getType() { return fType; } /** * @param value * @webtest.parameter * required="no" * default="all pages" * description="The page on which to search." */ public void setPage(final int value) { fPage = value; } public int getPage() { return fPage; } /** * @param matchCase * @webtest.parameter required="no" * default="'false'" * description="Specifies whether to match case when comparing the expected and actual name * and type values of a font." */ public void setMatchCase(final boolean matchCase) { fMatchCase = matchCase; } public boolean getMatchCase() { return fMatchCase; } protected void verifyParameters() { super.verifyParameters(); paramCheck(getName() == null && getType() == null, "One of 'name' or 'type' is required!"); } protected void verifyPdf(final PDFPage pdfPage) { LOG.debug("Retrieving fonts"); final List fonts = pdfPage.getFonts(); LOG.debug(fonts.size() + " fonts to examine"); final IStringVerifier verifier = getVerifier(); for (final Iterator iter = fonts.iterator(); iter.hasNext();) { final PDFFont font = (PDFFont) iter.next(); if (verifyFont(font, verifier)) { LOG.info("Found font " + font); return; // right font has been found } } LOG.info("No matching font found"); final StringBuffer sb = new StringBuffer("No font found with "); if (getName() != null) sb.append("name >" + getName() + "< "); if (getType() != null) sb.append("type >" + getType() + "< "); sb.append("(matchCase: " + getMatchCase() + ")"); throw new StepFailedException(sb.toString(), this); } private boolean verifyFont(final PDFFont font, final IStringVerifier verifier) { LOG.debug("Testing font: " + font); try { if (getPage() != ANY_PAGE && getPage() != font.getPage()) { LOG.debug("Page doesn't match: " + font.getPage()); return false; } boolean typeMatches = (getType() == null || verifier.verifyStrings(getType(), font.getType())); boolean nameMatches = (getName() == null || verifier.verifyStrings(getName(), font.getName())); LOG.debug("type match: " + typeMatches + ", name match: " + nameMatches); return typeMatches && nameMatches; } catch (RuntimeException e) { LOG.debug("Exception", e); throw e; } } private IStringVerifier getVerifier() { if (getMatchCase()) return EqualsStringVerfier.INSTANCE; else { return new IStringVerifier() { public boolean verifyStrings(final String expectedValue, final String actualValue) { return StringUtils.equalsIgnoreCase(expectedValue, actualValue); } }; } } }