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.web; 017 018 import java.lang.reflect.InvocationTargetException; 019 import java.util.List; 020 import java.util.Map; 021 022 import javax.servlet.jsp.JspException; 023 import javax.servlet.jsp.PageContext; 024 import javax.servlet.jsp.tagext.Tag; 025 026 import org.apache.commons.beanutils.PropertyUtils; 027 import org.apache.commons.lang.StringUtils; 028 import org.kuali.kfs.sys.KFSConstants; 029 import org.kuali.kfs.sys.businessobject.AccountingLine; 030 import org.kuali.kfs.sys.context.SpringContext; 031 import org.kuali.kfs.sys.document.datadictionary.AccountingLineViewMultipleReadOnlyFieldsDefinition; 032 import org.kuali.kfs.sys.document.service.AccountingLineFieldRenderingTransformation; 033 import org.kuali.kfs.sys.document.web.renderers.MultipleReadOnlyFieldsRenderer; 034 import org.kuali.rice.kns.datadictionary.AttributeDefinition; 035 import org.kuali.rice.kns.datadictionary.BusinessObjectEntry; 036 import org.kuali.rice.kns.service.DataDictionaryService; 037 import org.kuali.rice.kns.util.FieldUtils; 038 import org.kuali.rice.kns.util.ObjectUtils; 039 import org.kuali.rice.kns.web.ui.Field; 040 041 /** 042 * Represents multiple fields displaying with their values in a single cell 043 */ 044 public class AccountingLineViewMultipleReadOnlyFields extends FieldTableJoiningWithHeader { 045 private AccountingLineViewMultipleReadOnlyFieldsDefinition definition; 046 private List<Field> fields; 047 private static DataDictionaryService dataDictionaryService; 048 049 /** 050 * Constructs a AccountingLineViewMultipleReadOnlyFields 051 * @param definition data dictionary definition which created this 052 * @param fields the fields to render as read only 053 */ 054 public AccountingLineViewMultipleReadOnlyFields(AccountingLineViewMultipleReadOnlyFieldsDefinition definition, List<Field> fields) { 055 this.definition = definition; 056 this.fields = fields; 057 } 058 059 /** 060 * 061 * @see org.kuali.kfs.sys.document.web.TableJoiningWithHeader#createHeaderLabel() 062 */ 063 public HeaderLabel createHeaderLabel() { 064 return new LiteralHeaderLabel(KFSConstants.BLANK_SPACE); 065 } 066 067 /** 068 * Returns the top field name given in the definition 069 * @see org.kuali.kfs.sys.document.web.ElementNamable#getName() 070 */ 071 public String getName() { 072 return definition.getFieldNames().get(0); 073 } 074 075 /** 076 * None of the read only fields will be associated with quickfinders, so this method does nothing 077 * @see org.kuali.kfs.sys.document.web.RenderableElement#appendFields(java.util.List) 078 */ 079 public void appendFields(List<Field> fields) {} 080 081 /** 082 * There are no input fields here, so no need to set tab indices 083 * @see org.kuali.kfs.sys.document.web.RenderableElement#populateWithTabIndexIfRequested(int) 084 */ 085 public void populateWithTabIndexIfRequested(int reallyHighIndex) {} 086 087 /** 088 * @return the fields associated with this Multiple read only fields 089 */ 090 public List<Field> getFields() { 091 return fields; 092 } 093 094 /** 095 * 096 * @see org.kuali.kfs.sys.document.web.RenderableElement#renderElement(javax.servlet.jsp.PageContext, javax.servlet.jsp.tagext.Tag, org.kuali.kfs.sys.document.web.AccountingLineRenderingContext) 097 */ 098 public void renderElement(PageContext pageContext, Tag parentTag, AccountingLineRenderingContext renderingContext) throws JspException { 099 final BusinessObjectEntry boEntry = getDataDictionaryService().getDataDictionary().getBusinessObjectEntry(renderingContext.getAccountingLine().getClass().getName()); 100 if (fields != null && !fields.isEmpty()) { 101 for (Field field : fields) { 102 setShortLabelsForFields(field, boEntry); 103 setValueForField(field, renderingContext.getAccountingLine()); 104 setInquiryUrlForField(field, renderingContext.getAccountingLine()); 105 } 106 } 107 108 MultipleReadOnlyFieldsRenderer renderer = new MultipleReadOnlyFieldsRenderer(); 109 renderer.setFields(getFields()); 110 renderer.render(pageContext, parentTag); 111 renderer.clear(); 112 } 113 114 /** 115 * For each field, set the short label, or, failing that, set the label 116 * @param boEntry the business object entry for the accounting line 117 */ 118 protected void setShortLabelsForFields(Field field, BusinessObjectEntry boEntry) { 119 final AttributeDefinition propertyDefinition = boEntry.getAttributeDefinition(field.getPropertyName()); 120 final String label = (propertyDefinition == null) ? "" : (!StringUtils.isBlank(propertyDefinition.getShortLabel()) ? propertyDefinition.getShortLabel() : propertyDefinition.getLabel()); 121 field.setFieldLabel(label); 122 } 123 124 /** 125 * Sets the value for the field before rendering 126 * @param field the field to set the value of 127 * @param accountingLine the accounting line the field is associated with, which holds the value 128 */ 129 protected void setValueForField(Field field, AccountingLine accountingLine) { 130 field.setPropertyValue(ObjectUtils.getPropertyValue(accountingLine, field.getPropertyName())); 131 } 132 133 /** 134 * Populates the inquiry url on the field if possible 135 * @param field the field to set the inquiry url on 136 * @param accountingLine the accounting line holding values for the field 137 */ 138 protected void setInquiryUrlForField(Field field, AccountingLine accountingLine) { 139 if (!StringUtils.isBlank(field.getPropertyValue())) { 140 FieldUtils.setInquiryURL(field, accountingLine, field.getPropertyName()); 141 } 142 } 143 144 /** 145 * @return the implementation of the DataDictionaryService 146 */ 147 protected DataDictionaryService getDataDictionaryService() { 148 if (dataDictionaryService == null) { 149 dataDictionaryService = SpringContext.getBean(DataDictionaryService.class); 150 } 151 return dataDictionaryService; 152 } 153 154 }