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.rules.constraint.CompoundConstraint;
019 import org.springframework.rules.constraint.LogicalOperator;
020 import org.springframework.util.Assert;
021 import org.springframework.util.StringUtils;
022
023 /**
024 * @author Keith Donald
025 */
026 public class RequiredIfOthersPresent extends RequiredIfTrue {
027
028 /**
029 * Tests that the property is required if all "other properties" are present. Present
030 * means they are "non null."
031 *
032 * @param otherPropertyNames to test
033 */
034 public RequiredIfOthersPresent( String propertyName, String[] otherPropertyNames ) {
035 this(propertyName, otherPropertyNames, LogicalOperator.AND);
036 }
037
038 /**
039 * Tests that the property is required if "other properties" are present. Present
040 * means they are "non null." The operator parameter determines how the set of other
041 * property names is handled. If AND, then all must be present before the primary
042 * proeprty will be required. If OR, then if any of the other properties are present,
043 * then the primary property will be required. the logical operator, either AND or OR.
044 *
045 * @param otherPropertyNames to test
046 * @param operator Either AND or OR.
047 */
048 public RequiredIfOthersPresent( String propertyName, String[] otherPropertyNames, LogicalOperator operator ) {
049 super(propertyName);
050 Assert.notNull(otherPropertyNames, "otherPropertyNames is required");
051 Assert.notNull(operator, "operator is required");
052 Assert.notEmpty(otherPropertyNames, "otherPropertyNames must consist of at least one name");
053
054 CompoundConstraint compoundConstraint = operator.createConstraint();
055 CompoundPropertyConstraint propertyConstraint = new CompoundPropertyConstraint(compoundConstraint);
056 for( int i = 0; i < otherPropertyNames.length; i++ ) {
057 propertyConstraint.add(new PropertyPresent(otherPropertyNames[i]));
058 }
059 setConstraint(propertyConstraint);
060 }
061
062 /**
063 * Tests that the property is required if all "other properties" are present. Present
064 * means they are "non null."
065 *
066 * @param otherPropertyNames one or more other properties, delimited by commas.
067 */
068 public RequiredIfOthersPresent( String propertyName, String otherPropertyNames ) {
069 this(propertyName, otherPropertyNames, LogicalOperator.AND);
070 }
071
072 /**
073 * Tests that the property is required if all or any of the "other properties" are
074 * present.
075 *
076 * @param otherPropertyNames one or more other properties, delimited by commas.
077 * @param operator the logical operator, either AND or OR.
078 */
079 public RequiredIfOthersPresent( String propertyName, String otherPropertyNames, LogicalOperator operator ) {
080 this(propertyName, StringUtils.commaDelimitedListToStringArray(otherPropertyNames), operator);
081 }
082
083 public boolean isDependentOn( String propertyName ) {
084 return getPropertyName().equals(propertyName)
085 || ((CompoundPropertyConstraint) getConstraint()).isDependentOn(propertyName);
086 }
087
088 public boolean isCompoundRule() {
089 return true;
090 }
091 }