001 /** 002 * Copyright 2005-2013 The Kuali Foundation 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 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, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package org.kuali.rice.krad.datadictionary; 017 018 import org.apache.commons.lang.StringUtils; 019 import org.kuali.rice.krad.bo.BusinessObject; 020 import org.kuali.rice.krad.datadictionary.exception.AttributeValidationException; 021 import org.kuali.rice.krad.datadictionary.parse.BeanTag; 022 import org.kuali.rice.krad.datadictionary.parse.BeanTagAttribute; 023 024 /** 025 * The reference element specifies the name of a reference 026 * object that is required to exist in order for the primary 027 * business object to be created or modified on a BO. 028 * 029 * DD: See ReferenceDefinition.java 030 * 031 * JSTL: references are Maps with the following keys: 032 * attributeName (String) 033 * activeIndicatorAttributeName (String) 034 * activeIndicatorReversed (boolean String) 035 * attributeToHighlightOnFail (String) 036 * displayFieldName (String) 037 */ 038 @BeanTag(name = "referenceDefinition-bean") 039 public class ReferenceDefinition extends DataDictionaryDefinitionBase { 040 private static final long serialVersionUID = 1737968024207302931L; 041 042 protected String attributeName; 043 protected String attributeToHighlightOnFail; 044 protected String displayFieldName; 045 protected String collection; 046 protected Class<? extends BusinessObject> collectionBusinessObjectClass; 047 protected Class<? extends BusinessObject> businessObjectClass; 048 049 public ReferenceDefinition() {} 050 051 /** 052 * @return attributeName 053 */ 054 @BeanTagAttribute(name = "attributeName") 055 public String getAttributeName() { 056 return attributeName; 057 } 058 059 /** 060 * attributeName is the name of a reference object that 061 * must exist and not be null. In the case of a collection, 062 * then this is the name of a reference object within the 063 * collection element. 064 * 065 * @throws IllegalArgumentException if the given attributeName is blank 066 */ 067 public void setAttributeName(String attributeName) { 068 if (StringUtils.isBlank(attributeName)) { 069 throw new IllegalArgumentException("invalid (blank) attributeName"); 070 } 071 this.attributeName = attributeName; 072 } 073 074 /** 075 * Gets the attributeToHighlightOnFail attribute. 076 * 077 * @return Returns the attributeToHighlightOnFail. 078 */ 079 @BeanTagAttribute(name = "attributeToHighlightOnFail") 080 public String getAttributeToHighlightOnFail() { 081 return attributeToHighlightOnFail; 082 } 083 084 /** 085 * attributeToHighlightOnFail is the name of the busines 086 * object attribute which will be highlighted when 087 * the default existence check fails. 088 */ 089 public void setAttributeToHighlightOnFail(String attributeToHighlightOnFail) { 090 if (StringUtils.isBlank(attributeToHighlightOnFail)) { 091 throw new IllegalArgumentException("invalid (blank) attributeToHighlightOnFail"); 092 } 093 this.attributeToHighlightOnFail = attributeToHighlightOnFail; 094 } 095 096 /** 097 * Gets the displayFieldName attribute. 098 * 099 * @return Returns the displayFieldName. 100 */ 101 @BeanTagAttribute(name = "displayFieldName") 102 public String getDisplayFieldName() { 103 return displayFieldName; 104 } 105 106 /** 107 * displayFieldName is the name of the field to pull the label as it will 108 * appear in an error message. e.g. "chartOfAccountsCode". 109 */ 110 public void setDisplayFieldName(String displayFieldName) { 111 this.displayFieldName = displayFieldName; 112 } 113 114 /** 115 * This method returns true if the displayFieldName is set, otherwise it returns false. Whether the 116 * displayFieldName 117 * is set is 118 * defined by whether it has any non-whitespace content in it. 119 * 120 * @return 121 */ 122 public boolean isDisplayFieldNameSet() { 123 return StringUtils.isNotBlank(displayFieldName); 124 } 125 126 @BeanTagAttribute(name = "collection") 127 public String getCollection() { 128 return collection; 129 } 130 131 /** 132 * collection is the name of a collection that must exist 133 */ 134 public void setCollection(String collection) { 135 this.collection = collection; 136 } 137 138 public boolean isCollectionReference() { 139 return StringUtils.isNotBlank(getCollection()); 140 } 141 142 @BeanTagAttribute(name = "collectionBusinessObjectClass") 143 public Class<? extends BusinessObject> getCollectionBusinessObjectClass() { 144 if (collectionBusinessObjectClass == null && isCollectionReference()) { 145 collectionBusinessObjectClass = DataDictionary.getCollectionElementClass(businessObjectClass, collection); 146 } 147 148 return collectionBusinessObjectClass; 149 } 150 151 /** 152 * Class that the specified collection represents. Does not need to be set. The DD 153 * Will set this attribute through introspection. 154 */ 155 public void setCollectionBusinessObjectClass(Class<? extends BusinessObject> collectionBusinessObjectClass) { 156 this.collectionBusinessObjectClass = collectionBusinessObjectClass; 157 } 158 159 /** 160 * Directly validate simple fields. 161 * 162 * @see org.kuali.rice.krad.datadictionary.DataDictionaryDefinition#completeValidation(java.lang.Class, 163 * java.lang.Object) 164 */ 165 public void completeValidation(Class rootBusinessObjectClass, Class otherBusinessObjectClass) { 166 167 // make sure the attributeName is actually a property of the BO 168 String tmpAttributeName = isCollectionReference() ? collection : attributeName; 169 if (!DataDictionary.isPropertyOf(rootBusinessObjectClass, tmpAttributeName)) { 170 throw new AttributeValidationException("unable to find attribute '" 171 + tmpAttributeName 172 + "' in rootBusinessObjectClass '" 173 + rootBusinessObjectClass.getName() 174 + "' (" 175 + "" 176 + ")"); 177 } 178 // make sure the attributeToHighlightOnFail is actually a property of the BO 179 if (isCollectionReference()) { 180 getCollectionBusinessObjectClass(); // forces loading of the class 181 if (collectionBusinessObjectClass == null) { 182 throw new AttributeValidationException( 183 "Unable to determine collectionBusinessObjectClass for collection '" + businessObjectClass 184 .getName() + "." + collection + "'"); 185 } 186 187 if (!DataDictionary.isPropertyOf(collectionBusinessObjectClass, attributeToHighlightOnFail)) { 188 throw new AttributeValidationException("unable to find attribute '" 189 + attributeToHighlightOnFail 190 + "' in collectionBusinessObjectClass '" 191 + collectionBusinessObjectClass.getName() 192 + "' (" 193 + "" 194 + ")"); 195 } 196 } else { 197 if (!DataDictionary.isPropertyOf(rootBusinessObjectClass, attributeToHighlightOnFail)) { 198 throw new AttributeValidationException("unable to find attribute '" 199 + attributeToHighlightOnFail 200 + "' in rootBusinessObjectClass '" 201 + rootBusinessObjectClass.getName() 202 + "' (" 203 + "" 204 + ")"); 205 } 206 } 207 208 } 209 210 /** 211 * @see java.lang.Object#toString() 212 */ 213 public String toString() { 214 return "ReferenceDefinition for attribute " + getAttributeName(); 215 } 216 217 @BeanTagAttribute(name = "businessObjectClass") 218 public Class<? extends BusinessObject> getBusinessObjectClass() { 219 return businessObjectClass; 220 } 221 222 public void setBusinessObjectClass(Class<? extends BusinessObject> businessObjectClass) { 223 this.businessObjectClass = businessObjectClass; 224 } 225 }