001/** 002 * Copyright 2005-2016 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 */ 016package org.kuali.rice.kns.datadictionary.validation; 017 018import org.apache.commons.beanutils.PropertyUtils; 019import org.apache.commons.lang.StringUtils; 020import org.apache.log4j.Logger; 021import org.kuali.rice.core.api.util.type.TypeUtils; 022import org.kuali.rice.kns.datadictionary.MaintainableFieldDefinition; 023import org.kuali.rice.kns.datadictionary.MaintainableItemDefinition; 024import org.kuali.rice.kns.datadictionary.MaintainableSectionDefinition; 025import org.kuali.rice.kns.datadictionary.MaintenanceDocumentEntry; 026import org.kuali.rice.krad.datadictionary.AttributeDefinition; 027import org.kuali.rice.krad.datadictionary.exception.AttributeValidationException; 028import org.kuali.rice.krad.datadictionary.validation.DictionaryObjectAttributeValueReader; 029import org.kuali.rice.krad.datadictionary.validation.capability.Constrainable; 030import org.kuali.rice.krad.service.KRADServiceLocatorWeb; 031import org.kuali.rice.krad.service.PersistenceStructureService; 032import org.kuali.rice.krad.util.ObjectUtils; 033 034import java.lang.reflect.InvocationTargetException; 035import java.util.HashMap; 036import java.util.LinkedList; 037import java.util.List; 038import java.util.Map; 039 040/** 041 * This class provides legacy processing for maintenance documents in the dictionary validation service implementation. 042 * 043 * @author Kuali Rice Team (rice.collab@kuali.org) 044 * @deprecated As of release 2.0 045 */ 046@Deprecated 047public class MaintenanceDocumentAttributeValueReader extends DictionaryObjectAttributeValueReader { 048 049 protected Map<String, Class<?>> attributeTypeMap; 050 protected Map<String, Object> attributeValueMap; 051 //protected Map<String, PropertyDescriptor> beanInfo; 052 053 private final static Logger LOG = Logger.getLogger(MaintenanceDocumentAttributeValueReader.class); 054 055 private List<Constrainable> attributeDefinitions; 056 private Map<String, AttributeDefinition> attributeDefinitionMap; 057 058 public MaintenanceDocumentAttributeValueReader(Object object, String entryName, MaintenanceDocumentEntry entry, PersistenceStructureService persistenceStructureService) { 059 super(object, entryName, entry); 060 061 //if (object != null) 062 // this.beanInfo = getBeanInfo(object.getClass()); 063 064 this.attributeTypeMap = new HashMap<String, Class<?>>(); 065 this.attributeValueMap = new HashMap<String, Object>(); 066 067 this.attributeDefinitions = new LinkedList<Constrainable>(); 068 this.attributeDefinitionMap = new HashMap<String, AttributeDefinition>(); 069 for (MaintainableSectionDefinition sectionDefinition : entry.getMaintainableSections()) { 070 List<? extends MaintainableItemDefinition> itemDefinitions = sectionDefinition.getMaintainableItems(); 071 072 for (MaintainableItemDefinition itemDefinition : itemDefinitions) { 073 if (itemDefinition instanceof MaintainableFieldDefinition) { 074 String itemDefinitionName = itemDefinition.getName(); 075 AttributeDefinition attributeDefinition = KRADServiceLocatorWeb.getDataDictionaryService().getAttributeDefinition(object.getClass().getName(), itemDefinitionName); 076 077 //entry.getAttributeDefinition(attributeName); 078 boolean isAttributeDefined = attributeDefinition != null; 079 //getDataDictionaryService().isAttributeDefined(businessObject.getClass(), itemDefinition.getName()); 080 if (isAttributeDefined) { 081 attributeDefinitions.add(attributeDefinition); 082 attributeDefinitionMap.put(itemDefinitionName, attributeDefinition); 083 LOG.info("itemDefName: " + itemDefinitionName); 084 085 try { 086 Object attributeValue = PropertyUtils.getNestedProperty(object, itemDefinitionName); 087 088 if (attributeValue != null && StringUtils.isNotBlank(attributeValue.toString())) { 089 Class<?> propertyType = ObjectUtils.getPropertyType(object, itemDefinitionName, persistenceStructureService); 090 attributeTypeMap.put(itemDefinitionName, propertyType); 091 if (TypeUtils.isStringClass(propertyType) || TypeUtils.isIntegralClass(propertyType) || 092 TypeUtils.isDecimalClass(propertyType) || 093 TypeUtils.isTemporalClass(propertyType) || 094 TypeUtils.isBooleanClass(propertyType)) { 095 // check value format against dictionary 096 if (!TypeUtils.isTemporalClass(propertyType)) { 097 attributeValueMap.put(itemDefinitionName, attributeValue); 098 } 099 } 100 } 101 } catch (IllegalArgumentException e) { 102 LOG.warn("Failed to invoke read method on object when looking for " + itemDefinitionName + " as a field of " + entry.getDocumentTypeName(), e); 103 } catch (IllegalAccessException e) { 104 LOG.warn("Failed to invoke read method on object when looking for " + itemDefinitionName + " as a field of " + entry.getDocumentTypeName(), e); 105 } catch (InvocationTargetException e) { 106 LOG.warn("Failed to invoke read method on object when looking for " + itemDefinitionName + " as a field of " + entry.getDocumentTypeName(), e); 107 } catch (NoSuchMethodException e) { 108 LOG.warn("Failed to find property description on object when looking for " + itemDefinitionName + " as a field of " + entry.getDocumentTypeName(), e); 109 } 110 111 } 112 } 113 } 114 } 115 } 116 117 /** 118 * @see org.kuali.rice.krad.datadictionary.validation.AttributeValueReader#getDefinition(java.lang.String) 119 */ 120 @Override 121 public Constrainable getDefinition(String attributeName) { 122 return attributeDefinitionMap != null ? attributeDefinitionMap.get(attributeName) : null; 123 } 124 125 /** 126 * @see org.kuali.rice.krad.datadictionary.validation.AttributeValueReader#getDefinitions() 127 */ 128 @Override 129 public List<Constrainable> getDefinitions() { 130 return attributeDefinitions; 131 } 132 133 @Override 134 public String getLabel(String attributeName) { 135 AttributeDefinition attributeDefinition = attributeDefinitionMap != null ? attributeDefinitionMap.get(attributeName) : null; 136 return attributeDefinition != null ? attributeDefinition.getLabel() : attributeName; 137 } 138 139 /** 140 * @see org.kuali.rice.krad.datadictionary.validation.AttributeValueReader#getType(java.lang.String) 141 */ 142 @Override 143 public Class<?> getType(String attributeName) { 144 return attributeTypeMap != null ? attributeTypeMap.get(attributeName) : null; 145 } 146 147 /** 148 * @see org.kuali.rice.krad.datadictionary.validation.AttributeValueReader#getValue(java.lang.String) 149 */ 150 @Override 151 public <X> X getValue(String attributeName) throws AttributeValidationException { 152 return (X) attributeValueMap.get(attributeName); 153 } 154 155 //private Map<String, PropertyDescriptor> getBeanInfo(Class<?> clazz) { 156 // final Map<String, PropertyDescriptor> properties = new HashMap<String, PropertyDescriptor>(); 157 // for (PropertyDescriptor propertyDescriptor : PropertyUtils.getPropertyDescriptors(clazz)) { 158 // properties.put(propertyDescriptor.getName(), propertyDescriptor); 159 // } 160 // return properties; 161 //} 162 163}