001 /*
002 * Copyright 2011 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.kfs.sys.document.datadictionary;
017
018 import org.apache.commons.lang.StringUtils;
019 import org.kuali.kfs.sys.businessobject.AccountingLine;
020 import org.kuali.kfs.sys.context.SpringContext;
021 import org.kuali.kfs.sys.document.service.AccountingLineRenderingService;
022 import org.kuali.kfs.sys.document.web.AccountingLineViewCurrentBaseAmount;
023 import org.kuali.kfs.sys.document.web.TableJoining;
024 import org.kuali.rice.kns.datadictionary.BusinessObjectEntry;
025 import org.kuali.rice.kns.datadictionary.DataDictionary;
026 import org.kuali.rice.kns.datadictionary.MaintainableFieldDefinition;
027 import org.kuali.rice.kns.datadictionary.exception.AttributeValidationException;
028 import org.kuali.rice.kns.service.DataDictionaryService;
029 import org.kuali.rice.kns.util.FieldUtils;
030 import org.kuali.rice.kns.web.ui.Field;
031 import org.kuali.rice.kns.web.ui.FieldBridge;
032
033 /**
034 * The definition for an amount field which reports both current and base amounts
035 */
036 public class AccountingLineViewCurrentBaseAmountFieldDefinition extends MaintainableFieldDefinition implements AccountingLineViewRenderableElementDefinition {
037 private String currentAmountPropertyName;
038 private String baseAmountPropertyName;
039 private boolean useShortLabels = false;
040
041 /**
042 * Creates a property initiated AccountingLineViewCurrentBaseAmount element
043 * @see org.kuali.kfs.sys.document.datadictionary.AccountingLineViewRenderableElementDefinition#createLayoutElement(java.lang.Class)
044 */
045 public TableJoining createLayoutElement(Class<? extends AccountingLine> accountingLineClass) {
046 AccountingLineViewCurrentBaseAmount layoutElement = new AccountingLineViewCurrentBaseAmount();
047
048 layoutElement.setBaseAmountField(createFieldForPropertyName(baseAmountPropertyName, accountingLineClass));
049 layoutElement.setBaseAmountFieldDefinition(createFieldDefinitionForProperty(baseAmountPropertyName));
050
051 layoutElement.setCurrentAmountField(createFieldForPropertyName(currentAmountPropertyName, accountingLineClass));
052 layoutElement.setCurrentAmountFieldDefinition(createFieldDefinitionForProperty(currentAmountPropertyName));
053
054 layoutElement.setDefinition(this);
055
056 return layoutElement;
057 }
058
059 /**
060 * Creates a field for the given AccountingLine class and property name
061 * @param propertyName the name of the property to create a Field for
062 * @param accountingLineClass the Class of the AccountingLine we're planning on rendering
063 * @return an appropriately created Field
064 */
065 protected Field createFieldForPropertyName(String propertyName, Class<? extends AccountingLine> accountingLineClass) {
066 Field realField = FieldUtils.getPropertyField(accountingLineClass, propertyName, false);
067 FieldBridge.setupField(realField, this, null);
068 if (useShortLabels) {
069 BusinessObjectEntry boEntry = SpringContext.getBean(DataDictionaryService.class).getDataDictionary().getBusinessObjectEntry(accountingLineClass.getName());
070 realField.setFieldLabel(boEntry.getAttributeDefinition(propertyName).getShortLabel());
071 }
072 return realField;
073 }
074
075 /**
076 * Creates an AccountingLineViewFieldDefinition for the given property name
077 * @param propertyName the name of the field property that we're creating a definition for
078 * @return an appropriately created AccountingLineViewFieldDefinition
079 */
080 protected AccountingLineViewFieldDefinition createFieldDefinitionForProperty(String propertyName) {
081 AccountingLineViewFieldDefinition fieldDefinition = SpringContext.getBean(AccountingLineRenderingService.class).createGenericAccountingLineViewFieldDefinition(this);
082 fieldDefinition.setName(propertyName);
083 return fieldDefinition;
084 }
085
086 /**
087 * @see org.kuali.rice.kns.datadictionary.MaintainableFieldDefinition#completeValidation(java.lang.Class, java.lang.Class)
088 */
089 @Override
090 public void completeValidation(Class rootBusinessObjectClass, Class otherBusinessObjectClass) {
091 if (StringUtils.isBlank(currentAmountPropertyName)) {
092 throw new AttributeValidationException("The currentAmountPropertyName property must be specified on the AccountingLineView-CurentBaseAmountField definition for "+rootBusinessObjectClass.getName());
093 }
094
095 if (StringUtils.isBlank(baseAmountPropertyName)) {
096 throw new AttributeValidationException("The baseAmountPropertyName property must be specified on the AccountingLineView-CurentBaseAmountField definition for "+rootBusinessObjectClass.getName());
097 }
098
099 if (!StringUtils.isBlank(getName())) {
100 throw new AttributeValidationException("please do not specify name on the AccountingLineView-CurentBaseAmountField definition for "+rootBusinessObjectClass.getName());
101 }
102
103 if (!DataDictionary.isPropertyOf(rootBusinessObjectClass, getCurrentAmountPropertyName())) {
104 throw new AttributeValidationException("unable to find attribute or collection named '" + getCurrentAmountPropertyName() + "' in rootBusinessObjectClass '" + rootBusinessObjectClass.getName() + "' (" + "" + ")");
105 }
106
107 if (!DataDictionary.isPropertyOf(rootBusinessObjectClass, getBaseAmountPropertyName())) {
108 throw new AttributeValidationException("unable to find attribute or collection named '" + getBaseAmountPropertyName() + "' in rootBusinessObjectClass '" + rootBusinessObjectClass.getName() + "' (" + "" + ")");
109 }
110
111 if (defaultValueFinderClass != null && defaultValue != null) {
112 throw new AttributeValidationException("Both defaultValue and defaultValueFinderClass can not be specified on attribute " + getName() + " in rootBusinessObjectClass " + rootBusinessObjectClass.getName());
113 }
114 }
115
116 /**
117 * Gets the baseAmountPropertyName attribute.
118 * @return Returns the baseAmountPropertyName.
119 */
120 public String getBaseAmountPropertyName() {
121 return baseAmountPropertyName;
122 }
123
124 /**
125 * Sets the baseAmountPropertyName attribute value.
126 * @param baseAmountPropertyName The baseAmountPropertyName to set.
127 */
128 public void setBaseAmountPropertyName(String baseAmountPropertyName) {
129 this.baseAmountPropertyName = baseAmountPropertyName;
130 }
131
132 /**
133 * Gets the currentAmountPropertyName attribute.
134 * @return Returns the currentAmountPropertyName.
135 */
136 public String getCurrentAmountPropertyName() {
137 return currentAmountPropertyName;
138 }
139
140 /**
141 * Sets the currentAmountPropertyName attribute value.
142 * @param currentAmountPropertyName The currentAmountPropertyName to set.
143 */
144 public void setCurrentAmountPropertyName(String currentAmountPropertyName) {
145 this.currentAmountPropertyName = currentAmountPropertyName;
146 }
147
148 /**
149 * Gets the useShortLabels attribute.
150 * @return Returns the useShortLabels.
151 */
152 public boolean isUseShortLabels() {
153 return useShortLabels;
154 }
155
156 /**
157 * Sets the useShortLabels attribute value.
158 * @param useShortLabels The useShortLabels to set.
159 */
160 public void setUseShortLabels(boolean useShortLabels) {
161 this.useShortLabels = useShortLabels;
162 }
163
164 }