001 /*
002 * Copyright 2002-2004 the original author or authors.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005 * use this file except in compliance with the License. You may obtain a copy
006 * 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, WITHOUT
012 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013 * License for the specific language governing permissions and limitations
014 * under the License.
015 */
016 package org.springframework.rules.constraint;
017
018 import org.springframework.rules.closure.Closure;
019 import org.springframework.rules.constraint.Constraint;
020 import org.springframework.util.Assert;
021
022 /**
023 * Tests the result returned from evaluating a closure closure.
024 *
025 * @author Keith Donald
026 */
027 public class ClosureResultConstraint implements Constraint {
028 private Constraint constraint;
029
030 private Closure closure;
031
032 /**
033 * Creates a ClosureResultConstraint that tests the result returned from
034 * evaulating the specified unary closure.
035 *
036 * @param closure
037 * The closure to test.
038 * @param constraint
039 * The predicate that will test the closure return value.
040 */
041 public ClosureResultConstraint(Closure closure, Constraint constraint) {
042 Assert.notNull(closure, "closure is required");
043 Assert.notNull(constraint, "constraint is required");
044 this.constraint = constraint;
045 this.closure = closure;
046 }
047
048 /**
049 * Tests the result returned by evaluating the specified argument against
050 * the configured closure.
051 *
052 * @see Constraint#test(java.lang.Object)
053 */
054 public boolean test(Object argument) {
055 Object returnValue = closure.call(argument);
056 return this.constraint.test(returnValue);
057 }
058
059 public Closure getFunction() {
060 return closure;
061 }
062
063 public Constraint getPredicate() {
064 return constraint;
065 }
066
067 public String toString() {
068 return "[" + closure.toString() + " " + constraint.toString() + "]";
069 }
070 }