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 java.util.ArrayList;
019 import java.util.List;
020 import java.util.Map;
021
022 import org.apache.commons.lang.StringUtils;
023 import org.kuali.kfs.sys.businessobject.AccountingLine;
024 import org.kuali.kfs.sys.context.SpringContext;
025 import org.kuali.kfs.sys.document.service.DynamicNameLabelGenerator;
026 import org.kuali.kfs.sys.document.web.AccountingLineViewField;
027 import org.kuali.kfs.sys.document.web.AccountingLineViewOverrideField;
028 import org.kuali.kfs.sys.document.web.TableJoining;
029 import org.kuali.rice.kns.datadictionary.BusinessObjectEntry;
030 import org.kuali.rice.kns.datadictionary.MaintainableFieldDefinition;
031 import org.kuali.rice.kns.service.DataDictionaryService;
032 import org.kuali.rice.kns.util.FieldUtils;
033 import org.kuali.rice.kns.web.ui.Field;
034 import org.kuali.rice.kns.web.ui.FieldBridge;
035
036 /**
037 * Data dictionary definition of a field to be rendered as part of an accounting line view.
038 */
039 public class AccountingLineViewFieldDefinition extends MaintainableFieldDefinition implements AccountingLineViewRenderableElementDefinition {
040 private String dynamicLabelProperty;
041 private boolean useShortLabel = false;
042 private boolean hidden = false;
043 private List<AccountingLineViewOverrideFieldDefinition> overrideFields;
044 private String dynamicNameLabelGeneratorBeanName;
045 private int overrideColSpan = -1;
046 private Class<? extends AccountingLineViewField> accountingLineViewFieldClass = org.kuali.kfs.sys.document.web.AccountingLineViewField.class;
047 private String overrideLookupParameters;
048
049 private DynamicNameLabelGenerator dynamicNameLabelGenerator;
050
051 /**
052 * Gets the dynamicLabelProperty attribute.
053 * @return Returns the dynamicLabelProperty.
054 */
055 public String getDynamicLabelProperty() {
056 return dynamicLabelProperty;
057 }
058
059 /**
060 * Sets the dynamicLabelProperty attribute value.
061 * @param dynamicLabelProperty The dynamicLabelProperty to set.
062 */
063 public void setDynamicLabelProperty(String dynamicLabelProperty) {
064 this.dynamicLabelProperty = dynamicLabelProperty;
065 }
066
067 /**
068 * Gets the useShortLabel attribute.
069 * @return Returns the useShortLabel.
070 */
071 public boolean shouldUseShortLabel() {
072 return useShortLabel;
073 }
074
075 /**
076 * Sets the useShortLabel attribute value.
077 * @param useShortLabel The useShortLabel to set.
078 */
079 public void setUseShortLabel(boolean useShortLabel) {
080 this.useShortLabel = useShortLabel;
081 }
082
083 /**
084 * Gets the hidden attribute.
085 * @return Returns the hidden.
086 */
087 public boolean isHidden() {
088 return hidden;
089 }
090
091 /**
092 * Sets the hidden attribute value.
093 * @param hidden The hidden to set.
094 */
095 public void setHidden(boolean hidden) {
096 this.hidden = hidden;
097 }
098
099 /**
100 * Gets the overrideFields attribute.
101 * @return Returns the overrideFields.
102 */
103 public List<AccountingLineViewOverrideFieldDefinition> getOverrideFields() {
104 return overrideFields;
105 }
106
107 /**
108 * Sets the overrideFields attribute value.
109 * @param overrideFields The overrideFields to set.
110 */
111 public void setOverrideFields(List<AccountingLineViewOverrideFieldDefinition> overrideFields) {
112 this.overrideFields = overrideFields;
113 }
114
115 /**
116 * Gets the dynamicNameLabelGeneratorBeanName attribute.
117 * @return Returns the dynamicNameLabelGeneratorBeanName.
118 */
119 public String getDynamicNameLabelGeneratorBeanName() {
120 return dynamicNameLabelGeneratorBeanName;
121 }
122
123 /**
124 * Sets the dynamicNameLabelGeneratorBeanName attribute value.
125 * @param dynamicNameLabelGeneratorBeanName The dynamicNameLabelGeneratorBeanName to set.
126 */
127 public void setDynamicNameLabelGeneratorBeanName(String dynamicNameLabelGeneratorBeanName) {
128 this.dynamicNameLabelGeneratorBeanName = dynamicNameLabelGeneratorBeanName;
129 }
130
131 /**
132 * Gets the overrideColSpan attribute.
133 * @return Returns the overrideColSpan.
134 */
135 public int getOverrideColSpan() {
136 return overrideColSpan;
137 }
138
139 /**
140 * Sets the overrideColSpan attribute value.
141 * @param overrideColSpan The overrideColSpan to set.
142 */
143 public void setOverrideColSpan(int overrideColSpan) {
144 this.overrideColSpan = overrideColSpan;
145 }
146
147 /**
148 * Gets the accountingLineViewFieldClass attribute.
149 * @return Returns the accountingLineViewFieldClass.
150 */
151 public Class<? extends AccountingLineViewField> getAccountingLineViewFieldClass() {
152 return accountingLineViewFieldClass;
153 }
154
155 /**
156 * Sets the accountingLineViewFieldClass attribute value.
157 * @param accountingLineViewFieldClass The accountingLineViewFieldClass to set.
158 */
159 public void setAccountingLineViewFieldClass(Class<? extends AccountingLineViewField> accountingLineViewFieldClass) {
160 if (accountingLineViewFieldClass != null) {
161 this.accountingLineViewFieldClass = accountingLineViewFieldClass;
162 }
163 }
164
165 /**
166 * Returns the dynamicNameLabelGenerator for this field definition, if it has one
167 * @return an implementation of DynamicNameLabelGenerator to use for this field
168 */
169 public DynamicNameLabelGenerator getDynamicNameLabelGenerator() {
170 if (!StringUtils.isBlank(dynamicNameLabelGeneratorBeanName) && dynamicNameLabelGenerator == null) {
171 dynamicNameLabelGenerator = SpringContext.getBean(DynamicNameLabelGenerator.class,dynamicNameLabelGeneratorBeanName);
172 }
173 return dynamicNameLabelGenerator;
174 }
175
176 /**
177 * @see org.kuali.kfs.sys.document.datadictionary.AccountingLineViewRenderableElementDefinition#createLayoutElement()
178 */
179 public TableJoining createLayoutElement(Class<? extends AccountingLine> accountingLineClass) {
180 AccountingLineViewField layoutElement = getNewAccountingLineViewField();
181 layoutElement.setDefinition(this);
182 layoutElement.setField(getKNSFieldForDefinition(accountingLineClass));
183 layoutElement.setOverrideFields(getFieldsForOverrideFields(layoutElement, accountingLineClass));
184 return layoutElement;
185 }
186
187 /**
188 * Creates a new instance of the accounting line view field class this definition uses
189 * @return a new AccountingLineViewField instance or child class instance
190 */
191 protected AccountingLineViewField getNewAccountingLineViewField() {
192 AccountingLineViewField layoutElement = null;
193 try {
194 layoutElement = (AccountingLineViewField)getAccountingLineViewFieldClass().newInstance();
195 }
196 catch (InstantiationException ie) {
197 throw new RuntimeException("Could not instantiate instance of class "+getAccountingLineViewFieldClass().getName(), ie);
198 }
199 catch (IllegalAccessException iae) {
200 throw new RuntimeException("IllegalAccessException while attempting to instantiate "+getAccountingLineViewFieldClass().getName(), iae);
201 }
202 return layoutElement;
203 }
204
205 /**
206 * Creates a KNS Field for an AccountingLineViewField definition
207 * @param accountingLineClass the class of the accounting line used by this definition
208 * @return a properly initialized KNS field
209 */
210 public Field getKNSFieldForDefinition(Class<? extends AccountingLine> accountingLineClass) {
211 Field realField = FieldUtils.getPropertyField(accountingLineClass, getName(), false);
212 FieldBridge.setupField(realField, this, null);
213 if (isHidden()) {
214 realField.setFieldType(Field.HIDDEN);
215 }
216 if (shouldUseShortLabel()) {
217 BusinessObjectEntry boEntry = SpringContext.getBean(DataDictionaryService.class).getDataDictionary().getBusinessObjectEntry(accountingLineClass.getName());
218 realField.setFieldLabel(boEntry.getAttributeDefinition(getName()).getShortLabel());
219 }
220 return realField;
221 }
222
223 /**
224 * For each defined override field within this definition, creates a Field and puts them together as a List
225 * @param parentField the AccountingLineViewField which will own all of the override fields
226 * @param accountingLineClass the class of accounting lines which will be rendered
227 * @return a List of override fields, or if no override fields were defined, an empty List
228 */
229 protected List<AccountingLineViewOverrideField> getFieldsForOverrideFields(AccountingLineViewField parentField, Class<? extends AccountingLine> accountingLineClass) {
230 List<AccountingLineViewOverrideField> fields = new ArrayList<AccountingLineViewOverrideField>();
231 if (getOverrideFields() != null && getOverrideFields().size() > 0) {
232 for (AccountingLineViewOverrideFieldDefinition overrideFieldDefinition : getOverrideFields()) {
233 fields.add(overrideFieldDefinition.getOverrideFieldForDefinition(parentField, accountingLineClass));
234 }
235 }
236 return fields;
237 }
238
239 /**
240 * Gets the overrideLookupParameters attribute.
241 * @return Returns the overrideLookupParameters.
242 */
243 public String getOverrideLookupParameters() {
244 return overrideLookupParameters;
245 }
246
247 /**
248 * Sets the overrideLookupParameters attribute value.
249 * @param overrideLookupParameters The overrideLookupParameters to set.
250 */
251 public void setOverrideLookupParameters(String overrideLookupParameters) {
252 this.overrideLookupParameters = overrideLookupParameters;
253 }
254 }