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.closure.BinaryConstraint;
020 import org.springframework.util.Assert;
021
022 /**
023 * A constraint that returns the result of a <code>boolean</code>
024 * expression that tests two variable bean property values. For example,
025 * <code>pet.ageAtFirstVisit > pet.currentAge</code>
026 *
027 * @author Keith Donald
028 */
029 public class PropertiesConstraint extends AbstractPropertyConstraint {
030
031 private String otherPropertyName;
032
033 private BinaryConstraint beanPropertyExpression;
034
035 /**
036 * Creates a BeanPropertyExpression
037 *
038 * @param propertyName
039 * The first property participating in the expression.
040 * @param beanPropertyExpression
041 * The expression predicate that will test the two bean property
042 * values.
043 * @param otherPropertyName
044 * The second property participating in the expression.
045 */
046 public PropertiesConstraint(String propertyName, BinaryConstraint beanPropertyExpression, String otherPropertyName) {
047 super(propertyName);
048 Assert.notNull(otherPropertyName, "otherPropertyName is required");
049 Assert.notNull(beanPropertyExpression, "beanPropertyExpression is required");
050 this.otherPropertyName = otherPropertyName;
051 this.beanPropertyExpression = beanPropertyExpression;
052 }
053
054 public boolean isCompoundRule() {
055 return true;
056 }
057
058 public boolean isDependentOn(String propertyName) {
059 return getPropertyName().equals(propertyName) || getOtherPropertyName().equals(propertyName);
060 }
061
062 public String getOtherPropertyName() {
063 return otherPropertyName;
064 }
065
066 public BinaryConstraint getConstraint() {
067 return beanPropertyExpression;
068 }
069
070 protected boolean test(PropertyAccessStrategy domainObjectAccessStrategy) {
071 return beanPropertyExpression.test(domainObjectAccessStrategy.getPropertyValue(getPropertyName()),
072 domainObjectAccessStrategy.getPropertyValue(getOtherPropertyName()));
073 }
074
075 public String toString() {
076 return super.toString() + " " + beanPropertyExpression.toString() + " " + otherPropertyName;
077 }
078
079 }