package com.xceptance.xlt.common.util.action.data; import java.text.MessageFormat; import java.util.HashSet; import java.util.Set; import org.eclipse.jdt.annotation.Nullable; import com.xceptance.xlt.api.util.XltLogger; import com.xceptance.xlt.common.util.bsh.ParameterInterpreter; /** * <p> * Data container which holds all the necessary information to grab and validate information out of a http request. * </p> */ public class URLActionDataValidation { /** * name of the validation. */ private String name; /** * the way you want to take information out of the http response. <br> * See {@link #PERMITTEDSELECTIONMODE supported modes}. */ private String selectionMode; /** * the individual selection specification. */ private String selectionContent; /** * the way you want to validate the response information. <br> * See {@link #PERMITTEDVALIDATIONMODE supported modes}. */ private String validationMode; /** * the individual validation specification. */ private String validationContent; /** * The interpreter for dynamic parameter interpretation. */ private ParameterInterpreter interpreter; /** * Supported selection modes: * <ul> * <li> {@link #XPATH} * <li> {@link #REGEXP} * <li> {@link #HEADER} * <li> {@link #COOKIE} * </ul> */ public final static Set<String> PERMITTEDSELECTIONMODE = new HashSet<String>(); /** * Supported validation modes: * <ul> * <li> {@link #TEXT} * <li> {@link #COUNT} * <li> {@link #MATCHES} * <li> {@link #EXISTS} * </ul> */ public final static Set<String> PERMITTEDVALIDATIONMODE = new HashSet<String>(); public static final String XPATH = "XPath"; public static final String REGEXP = "Regex"; public static final String TEXT = "Text"; public static final String HEADER = "Header"; public static final String COOKIE = "Cookie"; public static final String MATCHES = "Matches"; public static final String COUNT = "Count"; public static final String EXISTS = "Exists"; static { PERMITTEDSELECTIONMODE.add(XPATH); PERMITTEDSELECTIONMODE.add(REGEXP); PERMITTEDSELECTIONMODE.add(HEADER); PERMITTEDSELECTIONMODE.add(COOKIE); PERMITTEDVALIDATIONMODE.add(TEXT); PERMITTEDVALIDATIONMODE.add(MATCHES); PERMITTEDVALIDATIONMODE.add(COUNT); PERMITTEDVALIDATIONMODE.add(EXISTS); } /** * Takes the minimal set of parameters that are necessary to select and v information <br> * from a http response. * * @param name * @param selectionMode * @param selectionContent * @param validationMode * @param validationContent * @param interpreter */ public URLActionDataValidation(final String name, final String selectionMode, final String selectionContent, final String validationMode, final String validationContent, final ParameterInterpreter interpreter) { XltLogger.runTimeLogger.debug("Creating new Validation Item"); setName(name); setSelectionMode(selectionMode); setSelectionContent(selectionContent); setValidationMode(validationMode); setValidationContent(validationContent); setParameterInterpreter(interpreter); } /** * For debugging purpose. <br> * 'err-streams' the attributes of the object without dynamic interpretation of the return values. <br> */ public void outlineRaw() { System.err.println("\t\t" + "Name : " + name); System.err.println("\t\t\t" + "Selection Mode : " + selectionMode); System.err.println("\t\t\t" + "Selection Value : " + selectionContent); System.err.println("\t\t\t" + "Validation Mode : " + validationMode); System.err.println("\t\t\t" + "Validation Value : " + validationContent); } /** * For debugging purpose. <br> * 'err-streams' the attributes of the object. Interprets the values via {@link #interpreter} <br> */ public void outline() { System.err.println("\t\t" + "Name : " + getName()); System.err.println("\t\t\t" + "Selection Mode : " + getSelectionMode()); System.err.println("\t\t\t" + "Selection Content : " + getSelectionContent()); System.err.println("\t\t\t" + "Validation Mode : " + getValidationMode()); System.err.println("\t\t\t" + "Validation Content : " + getValidationContent()); } /** * @param interpreter * : if NULL throws. * @throws IllegalArgumentException */ private void setParameterInterpreter(final ParameterInterpreter interpreter) { this.interpreter = (interpreter != null) ? interpreter : (ParameterInterpreter) throwIllegalArgumentException(getTagCannotBeNullMessage("Parameter Interpreter")); XltLogger.runTimeLogger.debug(getSetNewTagMessage("Interpreter")); } /** * @param selectionMode * :if NULL throws. * @throws IllegalArgumentException */ private void setSelectionMode(final String selectionMode) { this.selectionMode = (selectionMode != null) ? selectionMode : (String) throwIllegalArgumentException(getTagCannotBeNullMessage("Selection Mode")); XltLogger.runTimeLogger.debug(getSetTagToValueMessage("Selection Mode", selectionMode)); } /** * @param validationContent */ private void setValidationContent(final String validationContent) { this.validationContent = validationContent; XltLogger.runTimeLogger.debug(getSetTagToValueMessage("Validation Content", validationContent)); } /** * @param validateionMode * :if NULL throws. * @throws IllegalArgumentException */ private void setValidationMode(final String validationMode) { this.validationMode = (validationMode != null) ? validationMode : (String) throwIllegalArgumentException(getTagCannotBeNullMessage("Validation Mode")); XltLogger.runTimeLogger.debug(getSetTagToValueMessage("Validation Mode", validationMode)); } /** * @param selectionContent */ private void setSelectionContent(final String selectionContent) { this.selectionContent = selectionContent; XltLogger.runTimeLogger.debug(getSetTagToValueMessage("Selection Content", selectionContent)); } /** * @param name * :if NULL throws. * @throws IllegalArgumentException */ private void setName(final String name) { this.name = name != null ? name : (String) throwIllegalArgumentException("Validation name cannot be null"); XltLogger.runTimeLogger.debug(MessageFormat.format("Set Validation 'Name' to \"{0}\"", name)); } /** * @return {@link #name}, after its dynamic interpretation via the {@link #interpreter}. */ public String getName() { return interpreter.processDynamicData(this.name); } /** * @return {@link #selectionMode }, after its dynamic interpretation via the {@link #interpreter}. */ public String getSelectionMode() { final String dynamicSelectionMode = interpreter.processDynamicData(selectionMode); if (!isPermittedSelectionMode(dynamicSelectionMode)) { throw new IllegalArgumentException(getIllegalValueForTagMessage(dynamicSelectionMode, "Selection Mode")); } return dynamicSelectionMode; } /** * @return {@link #selectionContent}, after its dynamic interpretation via the {@link #interpreter}. */ @Nullable public String getSelectionContent() { return interpreter.processDynamicData(selectionContent); } /** * @return {@link #validationMode}, after its dynamic interpretation via the {@link #interpreter}. */ public String getValidationMode() { final String dynamicValidationMode = interpreter.processDynamicData(validationMode); if (!isPermittedValidationMode(dynamicValidationMode)) { throw new IllegalArgumentException(getIllegalValueForTagMessage(dynamicValidationMode, "Validation Mode")); } return dynamicValidationMode; } /** * @return {@link #validationContent}, after its dynamic interpretation via the {@link #interpreter}. */ @Nullable public String getValidationContent() { return interpreter.processDynamicData(validationContent); } /** * @param selectionMode * @return if ({@link #selectionMode} is permitted) ? true : false. */ public boolean isPermittedSelectionMode(final String s) { return PERMITTEDSELECTIONMODE.contains(s); } /** * @param selectionMode * @return if ({@link #validationMode} is permitted) ? true : false. */ public boolean isPermittedValidationMode(final String s) { return PERMITTEDVALIDATIONMODE.contains(s); } /** * Dirty way of throwing a IllegalArgumentException with the passed message. * * @param message * @return nothing. */ private Object throwIllegalArgumentException(final String message) { throw new IllegalArgumentException(message); } /** * @param tag * @param value * @return Formated message. */ private String getSetTagToValueMessage(final String tag, final String value) { final String message = MessageFormat.format("Validation: \"{0}\", Set \"{1}\" to value: \"{2}\"", this.name, tag, value); return message; } /** * @param tag * @return Formated message. */ private String getSetNewTagMessage(final String tag) { final String message = MessageFormat.format("Validation: \"{0}\", Set new \"{1}\"", this.name, tag); return message; } /** * @param value * @param tag * @return Formated message. */ private String getIllegalValueForTagMessage(final String value, final String tag) { final String message = MessageFormat.format("Validation: \"{0}\", Illegal value: \"{1}\" for tag \"{2}\"", this.name, value, tag); return message; } /** * @param tag * @return Formated message. */ private String getTagCannotBeNullMessage(final String tag) { final String message = MessageFormat.format("Validation: \"{0}\", tag \"{1}\" cannot be NULL", this.name, tag); return message; } }