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 of
006     * 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 under
014     * the License.
015     */
016    package org.springframework.rules.constraint;
017    
018    import org.springframework.rules.constraint.Constraint;
019    import org.springframework.rules.closure.BinaryConstraint;
020    
021    /**
022     * A unary constraint adapting a binary constraint that uses a parameterized
023     * constant value as the second argument when testing.
024     * 
025     * @author Keith Donald
026     */
027    public class ParameterizedBinaryConstraint implements Constraint {
028            private BinaryConstraint constraint;
029    
030            private Object parameter;
031    
032            /**
033             * Creates a ParameterizedBinaryPredicate that binds the provided parameter
034             * constant as the second argument to the constraint during tests.
035             * 
036             * @param constraint
037             *            The binary constraint to adapt as a unary constraint
038             * @param parameter
039             *            The constant parameter value
040             */
041            public ParameterizedBinaryConstraint(BinaryConstraint constraint, Object parameter) {
042                    this.constraint = constraint;
043                    this.parameter = parameter;
044            }
045    
046            /**
047             * Convenience constructor for <code>short</code> parameters.
048             */
049            public ParameterizedBinaryConstraint(BinaryConstraint constraint, short number) {
050                    this(constraint, new Short(number));
051            }
052    
053            /**
054             * Convenience constructor for <code>byte</code> parameters.
055             */
056            public ParameterizedBinaryConstraint(BinaryConstraint constraint, byte b) {
057                    this(constraint, new Byte(b));
058            }
059    
060            /**
061             * Convenience constructor for <code>integer</code> parameters.
062             */
063            public ParameterizedBinaryConstraint(BinaryConstraint constraint, int number) {
064                    this(constraint, new Integer(number));
065            }
066    
067            /**
068             * Convenience constructor for <code>float</code> parameters.
069             */
070            public ParameterizedBinaryConstraint(BinaryConstraint constraint, float number) {
071                    this(constraint, new Float(number));
072            }
073    
074            /**
075             * Convenience constructor for <code>double</code> parameters.
076             */
077            public ParameterizedBinaryConstraint(BinaryConstraint constraint, double number) {
078                    this(constraint, new Double(number));
079            }
080    
081            /**
082             * Convenience constructor for <code>boolean</code> parameters.
083             */
084            public ParameterizedBinaryConstraint(BinaryConstraint constraint, boolean bool) {
085                    this(constraint, (bool ? Boolean.TRUE : Boolean.FALSE));
086            }
087    
088            public Object getParameter() {
089                    return parameter;
090            }
091    
092            public BinaryConstraint getConstraint() {
093                    return constraint;
094            }
095    
096            /**
097             * Tests the wrapped binary constraint with the variable argument value,
098             * passing in the parameter constant as the second argument.
099             * 
100             * @see Constraint#test(java.lang.Object)
101             */
102            public boolean test(Object value) {
103                    return constraint.test(value, this.parameter);
104            }
105    
106            public String toString() {
107                    return constraint.toString() + " " + getParameter();
108            }
109    
110    }