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.apache.commons.logging.Log; 020 import org.apache.commons.logging.LogFactory; 021 import org.kuali.rice.krad.datadictionary.control.ControlDefinition; 022 import org.kuali.rice.krad.datadictionary.exception.CompletionException; 023 import org.kuali.rice.krad.datadictionary.parse.BeanTag; 024 import org.kuali.rice.krad.datadictionary.parse.BeanTagAttribute; 025 import org.kuali.rice.krad.datadictionary.validation.ValidationPattern; 026 import org.kuali.rice.krad.service.KRADServiceLocatorWeb; 027 028 /** 029 * A single attribute definition in the DataDictionary, which contains 030 * information relating to the display, validation, and general maintenance of a 031 * specific attribute of an entry. 032 */ 033 @BeanTag(name = "externalizableAttributeDefinitionProxy-bean") 034 public class ExternalizableAttributeDefinitionProxy extends AttributeDefinition { 035 private static final long serialVersionUID = -3204870440281417429L; 036 037 // logger 038 private static Log LOG = LogFactory.getLog(ExternalizableAttributeDefinitionProxy.class); 039 040 private String sourceExternalizableBusinessObjectInterface; 041 private String sourceAttributeName; 042 private AttributeDefinition delegate; 043 044 /** 045 * Constructs an AttributeReferenceDefinition 046 */ 047 public ExternalizableAttributeDefinitionProxy() { 048 LOG.debug("creating new ExternalizableAttributeDefinitionProxy"); 049 } 050 051 public void setSourceExternalizableBusinessObjectInterface(String sourceClassName) { 052 if (StringUtils.isBlank(sourceClassName)) { 053 throw new IllegalArgumentException("invalid (blank) sourceClassName"); 054 } 055 056 this.sourceExternalizableBusinessObjectInterface = sourceClassName; 057 } 058 059 @BeanTagAttribute(name = "sourceExternalizableBusinessObjectInterface") 060 public String getSourceExternalizableBusinessObjectInterface() { 061 return this.sourceExternalizableBusinessObjectInterface; 062 } 063 064 public void setSourceAttributeName(String sourceAttributeName) { 065 if (StringUtils.isBlank(sourceAttributeName)) { 066 throw new IllegalArgumentException("invalid (blank) sourceAttributeName"); 067 } 068 069 this.sourceAttributeName = sourceAttributeName; 070 } 071 072 @BeanTagAttribute(name = "sourceAttributeName") 073 public String getSourceAttributeName() { 074 return this.sourceAttributeName; 075 } 076 077 /** 078 * @return AttributeDefinition acting as delegate for this 079 * AttributeReferenceDefinition 080 */ 081 @BeanTagAttribute(name = "delegate", type = BeanTagAttribute.AttributeType.SINGLEBEAN) 082 AttributeDefinition getDelegate() { 083 BusinessObjectEntry delegateEntry = null; 084 if (delegate == null) { 085 try { 086 delegateEntry = KRADServiceLocatorWeb.getKualiModuleService().getResponsibleModuleService(Class.forName( 087 getSourceExternalizableBusinessObjectInterface())) 088 .getExternalizableBusinessObjectDictionaryEntry(Class.forName( 089 getSourceExternalizableBusinessObjectInterface())); 090 } catch (ClassNotFoundException e) { 091 LOG.error("Unable to get delegate entry for sourceExternalizableBusinessObjectInterface", e); 092 } 093 094 if (delegateEntry == null) { 095 throw new CompletionException("no BusinessObjectEntry exists for sourceClassName '" 096 + getSourceExternalizableBusinessObjectInterface() 097 + "'"); 098 } 099 delegate = delegateEntry.getAttributeDefinition(getSourceAttributeName()); 100 if (delegate == null) { 101 throw new CompletionException("no AttributeDefnintion exists for sourceAttributeName '" 102 + getSourceExternalizableBusinessObjectInterface() 103 + "." 104 + getSourceAttributeName() 105 + "'"); 106 } 107 } 108 109 return delegate; 110 } 111 112 /** 113 * Sets the given AttributeDefinition as the delegate for this instance 114 * 115 * @param delegate 116 */ 117 void setDelegate(AttributeDefinition delegate) { 118 if (delegate == null) { 119 throw new IllegalArgumentException("invalid (null) delegate"); 120 } 121 122 this.delegate = delegate; 123 } 124 125 /** 126 * @see org.kuali.rice.krad.datadictionary.AttributeDefinition#getForceUppercase() 127 */ 128 public Boolean getForceUppercase() { 129 Boolean value = super.getForceUppercase(); 130 if (value == null) { 131 value = getDelegate().getForceUppercase(); 132 } 133 134 return value; 135 } 136 137 /** 138 * @see org.kuali.rice.krad.datadictionary.AttributeDefinition#getName() 139 */ 140 public String getName() { 141 String name = super.getName(); 142 if (name == null) { 143 name = getDelegate().getName(); 144 } 145 146 return name; 147 } 148 149 /** 150 * @see org.kuali.rice.krad.datadictionary.AttributeDefinition#getLabel() 151 */ 152 public String getLabel() { 153 String label = super.getLabel(); 154 155 if (label == null) { 156 label = getDelegate().getLabel(); 157 } 158 159 return label; 160 } 161 162 /** 163 * @see org.kuali.rice.krad.datadictionary.AttributeDefinition#getShortLabel() 164 */ 165 public String getShortLabel() { 166 String shortLabel = super.getDirectShortLabel(); 167 if (shortLabel == null) { 168 shortLabel = getDelegate().getShortLabel(); 169 } 170 171 return shortLabel; 172 } 173 174 /** 175 * @see org.kuali.rice.krad.datadictionary.AttributeDefinition#getMaxLength() 176 */ 177 public Integer getMaxLength() { 178 Integer maxLength = super.getMaxLength(); 179 if (maxLength == null) { 180 maxLength = getDelegate().getMaxLength(); 181 } 182 183 return maxLength; 184 } 185 186 /** 187 * @see org.kuali.rice.krad.datadictionary.AttributeDefinition#hasValidationPattern() 188 */ 189 public boolean hasValidationPattern() { 190 return (getValidationPattern() != null); 191 } 192 193 /** 194 * @see org.kuali.rice.krad.datadictionary.AttributeDefinition#getValidationPattern() 195 */ 196 public ValidationPattern getValidationPattern() { 197 ValidationPattern validationPattern = super.getValidationPattern(); 198 if (validationPattern == null) { 199 validationPattern = getDelegate().getValidationPattern(); 200 } 201 202 return validationPattern; 203 } 204 205 /** 206 * @see org.kuali.rice.krad.datadictionary.AttributeDefinition#isRequired() 207 */ 208 public Boolean isRequired() { 209 Boolean required = super.isRequired(); 210 if (required == null) { 211 required = getDelegate().isRequired(); 212 } 213 214 return required; 215 } 216 217 /** 218 * @see org.kuali.rice.krad.datadictionary.AttributeDefinition#getControl() 219 */ 220 public ControlDefinition getControl() { 221 ControlDefinition control = super.getControl(); 222 if (control == null) { 223 control = getDelegate().getControl(); 224 } 225 226 return control; 227 } 228 229 /** 230 * @see org.kuali.rice.krad.datadictionary.AttributeDefinition#getSummary() 231 */ 232 public String getSummary() { 233 String summary = super.getSummary(); 234 if (summary == null) { 235 summary = getDelegate().getSummary(); 236 } 237 238 return summary; 239 } 240 241 /** 242 * @see org.kuali.rice.krad.datadictionary.AttributeDefinition#getDescription() 243 */ 244 public String getDescription() { 245 String description = super.getDescription(); 246 if (description == null) { 247 description = getDelegate().getDescription(); 248 } 249 250 return description; 251 } 252 253 /** 254 * @see org.kuali.rice.krad.datadictionary.AttributeDefinition#hasFormatterClass() 255 */ 256 public boolean hasFormatterClass() { 257 return (getFormatterClass() != null); 258 } 259 260 /** 261 * @see org.kuali.rice.krad.datadictionary.AttributeDefinition#getFormatterClass() 262 */ 263 public String getFormatterClass() { 264 String formatterClass = super.getFormatterClass(); 265 if (formatterClass == null) { 266 formatterClass = getDelegate().getFormatterClass(); 267 } 268 269 return formatterClass; 270 } 271 272 /** 273 * @see org.kuali.rice.krad.datadictionary.AttributeDefinition#getDisplayLabelAttribute() 274 */ 275 @Override 276 public String getDisplayLabelAttribute() { 277 String displayLabelAttribute = super.getDisplayLabelAttribute(); 278 if (StringUtils.isBlank(displayLabelAttribute)) { 279 displayLabelAttribute = getDelegate().getDisplayLabelAttribute(); 280 } 281 return displayLabelAttribute; 282 } 283 284 /** 285 * @see org.kuali.rice.krad.datadictionary.DataDictionaryEntry#completeValidation() 286 */ 287 @Override 288 public void completeValidation(Class rootObjectClass, Class otherObjectClass) { 289 if (StringUtils.isBlank(sourceExternalizableBusinessObjectInterface)) { 290 throw new IllegalArgumentException("invalid (blank) sourceClassName for attribute '" 291 + rootObjectClass.getName() 292 + "." 293 + getName() 294 + "'"); 295 } 296 if (StringUtils.isBlank(sourceAttributeName)) { 297 throw new IllegalArgumentException("invalid (blank) sourceAttributeName for attribute '" 298 + rootObjectClass.getName() 299 + "." 300 + getName() 301 + "'"); 302 } 303 if (DataDictionary.validateEBOs) { 304 getDelegate(); // forces validation 305 super.completeValidation(rootObjectClass, otherObjectClass); 306 } 307 } 308 309 /** 310 * @see java.lang.Object#toString() 311 */ 312 public String toString() { 313 String name = super.getName(); 314 315 // workaround for the mysterious, 316 // still-unreproducible-on-my-machine, null delegate exception on 317 // Tomcat startup 318 if ((name == null) && (getDelegate() != null)) { 319 name = getDelegate().getName(); 320 } 321 return "AttributeReferenceDefinition for attribute " + name; 322 } 323 }