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.property;
017
018 import org.springframework.binding.PropertyAccessStrategy;
019 import org.springframework.rules.constraint.Constraint;
020 import org.springframework.util.Assert;
021
022 /**
023 * A constraint that returns the result of a <code>boolean</code>
024 * expression that tests a variable bean property value against a predicate
025 * (constraint). For example: <code>pet.age is required</code>
026 *
027 * @author Keith Donald
028 */
029 public class PropertyValueConstraint extends AbstractPropertyConstraint implements Constraint {
030
031 private Constraint valueConstraint;
032
033 /**
034 * Creates a BeanPropertyValueConstraint.
035 *
036 * @param propertyName
037 * The constrained property.
038 * @param valueConstraint
039 * The property value constraint (tester).
040 */
041 public PropertyValueConstraint(String propertyName, Constraint valueConstraint) {
042 super(propertyName);
043 Assert.notNull(valueConstraint, "valueConstraint is required");
044 Assert.isTrue(!(valueConstraint instanceof PropertyConstraint),
045 "valueConstraint cannot be a PropertyConstraint - it must be a plain constraint that tests property values!");
046 this.valueConstraint = valueConstraint;
047 }
048
049 protected boolean test(PropertyAccessStrategy domainObjectAccessStrategy) {
050 return valueConstraint.test(domainObjectAccessStrategy.getPropertyValue(getPropertyName()));
051 }
052
053 public Constraint getConstraint() {
054 return valueConstraint;
055 }
056
057 public String toString() {
058 return valueConstraint.toString();
059 }
060 }