/* * The Kuali Financial System, a comprehensive financial management system for higher education. * * Copyright 2005-2014 The Kuali Foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.kuali.kfs.sys.document.datadictionary; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.StringUtils; import org.kuali.kfs.sys.businessobject.AccountingLine; import org.kuali.kfs.sys.context.SpringContext; import org.kuali.kfs.sys.document.service.DynamicNameLabelGenerator; import org.kuali.kfs.sys.document.web.AccountingLineViewField; import org.kuali.kfs.sys.document.web.AccountingLineViewOverrideField; import org.kuali.kfs.sys.document.web.TableJoining; import org.kuali.rice.kns.datadictionary.MaintainableFieldDefinition; import org.kuali.rice.kns.service.DataDictionaryService; import org.kuali.rice.kns.util.FieldUtils; import org.kuali.rice.kns.web.ui.Field; import org.kuali.rice.kns.web.ui.FieldBridge; /** * Data dictionary definition of a field to be rendered as part of an accounting line view. */ public class AccountingLineViewFieldDefinition extends MaintainableFieldDefinition implements AccountingLineViewRenderableElementDefinition { private String dynamicLabelProperty; private boolean useShortLabel = false; private boolean hidden = false; private List<AccountingLineViewOverrideFieldDefinition> overrideFields; private String dynamicNameLabelGeneratorBeanName; private int overrideColSpan = -1; private Class<? extends AccountingLineViewField> accountingLineViewFieldClass = org.kuali.kfs.sys.document.web.AccountingLineViewField.class; private String overrideLookupParameters; protected boolean explodable; private DynamicNameLabelGenerator dynamicNameLabelGenerator; public boolean isExplodable() { return this.explodable; } public void setExplodable(boolean explodable) { this.explodable = explodable; } /** * Gets the dynamicLabelProperty attribute. * @return Returns the dynamicLabelProperty. */ public String getDynamicLabelProperty() { return dynamicLabelProperty; } /** * Sets the dynamicLabelProperty attribute value. * @param dynamicLabelProperty The dynamicLabelProperty to set. */ public void setDynamicLabelProperty(String dynamicLabelProperty) { this.dynamicLabelProperty = dynamicLabelProperty; } /** * Gets the useShortLabel attribute. * @return Returns the useShortLabel. */ public boolean shouldUseShortLabel() { return useShortLabel; } /** * Sets the useShortLabel attribute value. * @param useShortLabel The useShortLabel to set. */ public void setUseShortLabel(boolean useShortLabel) { this.useShortLabel = useShortLabel; } /** * Gets the hidden attribute. * @return Returns the hidden. */ public boolean isHidden() { return hidden; } /** * Sets the hidden attribute value. * @param hidden The hidden to set. */ public void setHidden(boolean hidden) { this.hidden = hidden; } /** * Gets the overrideFields attribute. * @return Returns the overrideFields. */ public List<AccountingLineViewOverrideFieldDefinition> getOverrideFields() { return overrideFields; } /** * Sets the overrideFields attribute value. * @param overrideFields The overrideFields to set. */ public void setOverrideFields(List<AccountingLineViewOverrideFieldDefinition> overrideFields) { this.overrideFields = overrideFields; } /** * Gets the dynamicNameLabelGeneratorBeanName attribute. * @return Returns the dynamicNameLabelGeneratorBeanName. */ public String getDynamicNameLabelGeneratorBeanName() { return dynamicNameLabelGeneratorBeanName; } /** * Sets the dynamicNameLabelGeneratorBeanName attribute value. * @param dynamicNameLabelGeneratorBeanName The dynamicNameLabelGeneratorBeanName to set. */ public void setDynamicNameLabelGeneratorBeanName(String dynamicNameLabelGeneratorBeanName) { this.dynamicNameLabelGeneratorBeanName = dynamicNameLabelGeneratorBeanName; } /** * Gets the overrideColSpan attribute. * @return Returns the overrideColSpan. */ public int getOverrideColSpan() { return overrideColSpan; } /** * Sets the overrideColSpan attribute value. * @param overrideColSpan The overrideColSpan to set. */ public void setOverrideColSpan(int overrideColSpan) { this.overrideColSpan = overrideColSpan; } /** * Gets the accountingLineViewFieldClass attribute. * @return Returns the accountingLineViewFieldClass. */ public Class<? extends AccountingLineViewField> getAccountingLineViewFieldClass() { return accountingLineViewFieldClass; } /** * Sets the accountingLineViewFieldClass attribute value. * @param accountingLineViewFieldClass The accountingLineViewFieldClass to set. */ public void setAccountingLineViewFieldClass(Class<? extends AccountingLineViewField> accountingLineViewFieldClass) { if (accountingLineViewFieldClass != null) { this.accountingLineViewFieldClass = accountingLineViewFieldClass; } } /** * Returns the dynamicNameLabelGenerator for this field definition, if it has one * @return an implementation of DynamicNameLabelGenerator to use for this field */ public DynamicNameLabelGenerator getDynamicNameLabelGenerator() { if (!StringUtils.isBlank(dynamicNameLabelGeneratorBeanName) && dynamicNameLabelGenerator == null) { dynamicNameLabelGenerator = SpringContext.getBean(DynamicNameLabelGenerator.class,dynamicNameLabelGeneratorBeanName); } return dynamicNameLabelGenerator; } /** * @see org.kuali.kfs.sys.document.datadictionary.AccountingLineViewRenderableElementDefinition#createLayoutElement() */ @Override public TableJoining createLayoutElement(Class<? extends AccountingLine> accountingLineClass) { AccountingLineViewField layoutElement = getNewAccountingLineViewField(); layoutElement.setDefinition(this); layoutElement.setField(getKNSFieldForDefinition(accountingLineClass)); layoutElement.setOverrideFields(getFieldsForOverrideFields(layoutElement, accountingLineClass)); layoutElement.setExplodable(this.isExplodable()); return layoutElement; } /** * Creates a new instance of the accounting line view field class this definition uses * @return a new AccountingLineViewField instance or child class instance */ protected AccountingLineViewField getNewAccountingLineViewField() { AccountingLineViewField layoutElement = null; try { layoutElement = (AccountingLineViewField)getAccountingLineViewFieldClass().newInstance(); } catch (InstantiationException ie) { throw new RuntimeException("Could not instantiate instance of class "+getAccountingLineViewFieldClass().getName(), ie); } catch (IllegalAccessException iae) { throw new RuntimeException("IllegalAccessException while attempting to instantiate "+getAccountingLineViewFieldClass().getName(), iae); } return layoutElement; } /** * Creates a KNS Field for an AccountingLineViewField definition * @param accountingLineClass the class of the accounting line used by this definition * @return a properly initialized KNS field */ public Field getKNSFieldForDefinition(Class<? extends AccountingLine> accountingLineClass) { Field realField = FieldUtils.getPropertyField(accountingLineClass, getName(), false); FieldBridge.setupField(realField, this, null); if (isHidden()) { realField.setFieldType(Field.HIDDEN); } if (shouldUseShortLabel()) { org.kuali.rice.krad.datadictionary.BusinessObjectEntry boEntry = SpringContext.getBean(DataDictionaryService.class).getDataDictionary().getBusinessObjectEntry(accountingLineClass.getName()); realField.setFieldLabel(boEntry.getAttributeDefinition(getName()).getShortLabel()); } return realField; } /** * For each defined override field within this definition, creates a Field and puts them together as a List * @param parentField the AccountingLineViewField which will own all of the override fields * @param accountingLineClass the class of accounting lines which will be rendered * @return a List of override fields, or if no override fields were defined, an empty List */ protected List<AccountingLineViewOverrideField> getFieldsForOverrideFields(AccountingLineViewField parentField, Class<? extends AccountingLine> accountingLineClass) { List<AccountingLineViewOverrideField> fields = new ArrayList<AccountingLineViewOverrideField>(); if (getOverrideFields() != null && getOverrideFields().size() > 0) { for (AccountingLineViewOverrideFieldDefinition overrideFieldDefinition : getOverrideFields()) { fields.add(overrideFieldDefinition.getOverrideFieldForDefinition(parentField, accountingLineClass)); } } return fields; } /** * Gets the overrideLookupParameters attribute. * @return Returns the overrideLookupParameters. */ public String getOverrideLookupParameters() { return overrideLookupParameters; } /** * Sets the overrideLookupParameters attribute value. * @param overrideLookupParameters The overrideLookupParameters to set. */ public void setOverrideLookupParameters(String overrideLookupParameters) { this.overrideLookupParameters = overrideLookupParameters; } }