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.property;
017
018 import java.util.Iterator;
019
020 import org.springframework.rules.constraint.Constraint;
021 import org.springframework.rules.constraint.CompoundConstraint;
022 import org.springframework.rules.constraint.AbstractConstraint;
023
024 /**
025 * Abstract base class for unary predicates which compose other predicates.
026 *
027 * @author Keith Donald
028 */
029 public class CompoundPropertyConstraint implements PropertyConstraint {
030
031 private CompoundConstraint compoundConstraint;
032
033 public String getPropertyName() {
034 PropertyConstraint e = (PropertyConstraint)compoundConstraint.iterator().next();
035 return e.getPropertyName();
036 }
037
038 public boolean isDependentOn(final String propertyName) {
039 return new AbstractConstraint() {
040 public boolean test(Object o) {
041 return ((PropertyConstraint)o).isDependentOn(propertyName);
042 }
043 }.anyTrue(compoundConstraint.iterator());
044 }
045
046 public boolean isCompoundRule() {
047 return true;
048 }
049
050 public Constraint getPredicate() {
051 return compoundConstraint;
052 }
053
054 /**
055 * Constructs a compound predicate with no initial members. It is expected
056 * the client will call "add" to add individual predicates.
057 */
058 public CompoundPropertyConstraint(CompoundConstraint compoundConstraint) {
059 this.compoundConstraint = compoundConstraint;
060 this.compoundConstraint.validateTypeSafety(PropertyConstraint.class);
061 }
062
063 /**
064 * Add the specified predicate to the set of predicates aggregated by this
065 * compound predicate.
066 *
067 * @param predicate
068 * the predicate to add
069 * @return A reference to this, to support chaining.
070 */
071 public CompoundPropertyConstraint add(PropertyConstraint constraint) {
072 this.compoundConstraint.add(constraint);
073 return this;
074 }
075
076 /**
077 * Return an iterator over the aggregated predicates.
078 *
079 * @return An iterator
080 */
081 public Iterator iterator() {
082 return compoundConstraint.iterator();
083 }
084
085 public boolean test(Object bean) {
086 return compoundConstraint.test(bean);
087 }
088
089 public String toString() {
090 return compoundConstraint.toString();
091 }
092
093 }