// Copyright � 2002-2005 Canoo Engineering AG, Switzerland. package com.canoo.webtest.steps.store; import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern; import com.canoo.webtest.engine.StepFailedException; import com.canoo.webtest.util.ConversionUtil; /** * @author Carsten Seibert * @author Marc Guillemot * @author Paul King * @webtest.step category="Core" * name="storeRegEx" * alias="storeregex" * description="This step stores the result of a <key>regex</key> into a property. By specifying a particular group of the <key>regex</key> it is easily to extract only a subset of a given <key>regex</key>." */ public class StoreRegExMatch extends BaseStoreStep { private String fText; private String fGroup; public String getText() { return fText; } /** * @webtest.parameter required="true" * description="The <key>regex</key> that shall be evaluated." */ public void setText(final String text) { fText = text; } /** * @webtest.parameter required="true" * description="The name of the property that shall receive the extracted value." */ public void setProperty(final String property) { super.setProperty(property); } /** * @webtest.parameter required="no" * default="0 (result of the whole expression)" * description="The group within the <key>regex</key> to extract into the specified property." */ public void setGroup(final String group) { fGroup = group; } public void doExecute() throws IOException { nullResponseCheck(); final String text = getContext().getCurrentResponse().getWebResponse().getContentAsString(); // possible IOException // "." should match new lines as well, therefore the dotall flag final Matcher matcher = Pattern.compile(getText(), Pattern.DOTALL).matcher(text); if (!matcher.find()) { throw new StepFailedException("No match for regular expression <" + getText() + ">", this); } final int numberOfGroups = matcher.groupCount(); int groupNumber = ConversionUtil.convertToInt(fGroup, 0); if (groupNumber > numberOfGroups) { throw new StepFailedException("Group not found: " + fGroup + " (#groups: " + numberOfGroups + ")", this); } storeProperty(matcher.group(groupNumber)); } protected void verifyParameters() { super.verifyParameters(); optionalIntegerParamCheck(fGroup, "group", true); emptyParamCheck(getText(), "Regular expression (text attribute)"); emptyParamCheck(getProperty(), "property"); } }