001 /* 002 * Copyright 1999-2001,2004 The Apache Software Foundation. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017 package org.apache.commons.latka.validators; 018 019 import org.apache.commons.latka.ValidationException; 020 import org.apache.commons.latka.http.Response; 021 022 import org.apache.log4j.Category; 023 024 /** 025 * This subclass of BaseValidator largely removes the need of 026 * a validator to know whether a particular test is supposed 027 * to succeed or fail. The validate(Response) method 028 * becomes final, and the logic is moved into two 029 * abstract methods (see Javadocs): assertTrue(Response) 030 * and generateBareExceptionMessage(). 031 * 032 * @author MorganDelagrange 033 * @version 034 * $Id: BaseConditionalValidator.java 155424 2005-02-26 13:09:29Z dirkv $ 035 */ 036 public abstract class BaseConditionalValidator extends BaseValidator { 037 // ------------------------------------------------------ Instance Variables 038 039 /** log4j category for output */ 040 protected final Category _log = Category.getInstance( 041 BaseConditionalValidator.class); 042 /** condition to test against */ 043 protected boolean _condition = true; 044 045 // ----------------------------------------------------------- Constructors 046 047 /** 048 * A test without a label 049 * 050 * @param condition Whether the test should evaluate to true or false 051 */ 052 public BaseConditionalValidator(boolean condition) { 053 this(null, condition); 054 } 055 056 /** 057 * A test with a label 058 * 059 * @param label test label 060 * @param condition whether the test should evaluate to true or false 061 */ 062 public BaseConditionalValidator(String label, boolean condition) { 063 super(label); 064 _condition = condition; 065 } 066 067 // ---------------------------------------------------------------- Methods 068 069 /** 070 * Set whether or not this test is supposed to succeed 071 * 072 * @param condition true if the test should succeed 073 */ 074 public void setCondition(boolean condition) { 075 _condition = condition; 076 } 077 078 /** 079 * Returns whether or not this test is supposed to succeed 080 * 081 * @return true if the test is supposed to succeed 082 */ 083 public boolean getCondition() { 084 return _condition; 085 } 086 087 /** 088 * Final method. Implement the assertion logic for 089 * the test in assertTrue(Response), and the exception generation 090 * in generateBareExceptionMessage() 091 * 092 * @param response Response from the HTTP server 093 * @throws ValidationException when a validation fails 094 */ 095 public final void validate(Response response) throws ValidationException { 096 boolean assertion = assertTrue(response); 097 098 if ((assertion == true) && (_condition == false)) { 099 throwValidationException(); 100 } else if ((assertion == false) && (_condition == true)) { 101 throwValidationException(); 102 } 103 } 104 105 /** 106 * Return true or false, depending on whether or not 107 * the test conditions were met. This 108 * is <i>regardless</i> of the value of getCondition(), 109 * which is handled elsewhere. 110 * 111 * Note: this method 112 * should _only_ throw ValidationExceptions under 113 * exceptional circumstances (e.g. invalid regular 114 * expressions, IOExceptions, etc). A successful test 115 * should only return true or false. 116 * 117 * @param response HTTP response 118 * @return true if the test conditions were met, false otherwise 119 * @throws ValidationException when a validation fails 120 */ 121 public abstract boolean assertTrue(Response response) throws 122 ValidationException; 123 124 /** 125 * The BASE exception message for a subclass of 126 * BaseConditionalValidator. Expect that the String 127 * "EXPECTED" or "DID NOT EXPECT" will be prepended to 128 * this message, depending on the value of getCondition(). 129 * For example, if you are validator attempts to match 130 * regular expression <i>x</i>, this methods should 131 * generate something like " TO MATCH REGULAR EXPRESSION 132 * <i>x</i>.". 133 * 134 * @return bare exception message, to which will be prepended 135 * "EXPECTED" or "DID NOT EXPECT" 136 */ 137 public abstract String generateBareExceptionMessage(); 138 139 /** 140 * Automatically generated exception messages, based 141 * on the value of getCondition() and 142 * generateBareExceptionMessage(). 143 * 144 * @exception ValidationException 145 * generated Exception 146 */ 147 protected void throwValidationException() throws ValidationException { 148 149 if (_condition == true) { 150 fail("EXPECTED" + generateBareExceptionMessage()); 151 } else { 152 fail("DID NOT EXPECT" + generateBareExceptionMessage()); 153 } 154 155 } 156 157 }